diff --git a/analytics/STRUCTURE.md b/analytics/STRUCTURE.md new file mode 100644 index 0000000..b26a687 --- /dev/null +++ b/analytics/STRUCTURE.md @@ -0,0 +1,178 @@ +# Структура аналитики: 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/analytics/context/00_SYSTEM.md b/analytics/context/00_SYSTEM.md new file mode 100644 index 0000000..b69a854 --- /dev/null +++ b/analytics/context/00_SYSTEM.md @@ -0,0 +1,20 @@ +# 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/analytics/context/01_DATA_RULES.md b/analytics/context/01_DATA_RULES.md new file mode 100644 index 0000000..2af8074 --- /dev/null +++ b/analytics/context/01_DATA_RULES.md @@ -0,0 +1,18 @@ +# 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/analytics/context/02_GLOSSARY.md b/analytics/context/02_GLOSSARY.md new file mode 100644 index 0000000..f5f332f --- /dev/null +++ b/analytics/context/02_GLOSSARY.md @@ -0,0 +1,6 @@ +# 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/analytics/context/03_WORKFLOWS.md b/analytics/context/03_WORKFLOWS.md new file mode 100644 index 0000000..2551afc --- /dev/null +++ b/analytics/context/03_WORKFLOWS.md @@ -0,0 +1,23 @@ +# 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/analytics/context/04_KB_POLICY.md b/analytics/context/04_KB_POLICY.md new file mode 100644 index 0000000..915a76b --- /dev/null +++ b/analytics/context/04_KB_POLICY.md @@ -0,0 +1,6 @@ +# 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/analytics/context/05_OUTPUT_FORMATS.md b/analytics/context/05_OUTPUT_FORMATS.md new file mode 100644 index 0000000..9b8a801 --- /dev/null +++ b/analytics/context/05_OUTPUT_FORMATS.md @@ -0,0 +1,11 @@ +# 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/analytics/context/06_DEFICIT_FORECAST.md b/analytics/context/06_DEFICIT_FORECAST.md new file mode 100644 index 0000000..ff55263 --- /dev/null +++ b/analytics/context/06_DEFICIT_FORECAST.md @@ -0,0 +1,133 @@ +# Механика расчёта дефицита поверх прогноза + +## Общая схема + +``` +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/analytics/mag_pbi/mag_pbi_schema.sql b/analytics/mag_pbi/mag_pbi_schema.sql new file mode 100644 index 0000000..df6f211 Binary files /dev/null and b/analytics/mag_pbi/mag_pbi_schema.sql differ diff --git a/analytics/mag_pbi/procedures/mag_pbi_procedures.sql b/analytics/mag_pbi/procedures/mag_pbi_procedures.sql new file mode 100644 index 0000000..497fda2 Binary files /dev/null and b/analytics/mag_pbi/procedures/mag_pbi_procedures.sql differ diff --git a/analytics/mag_pbi/scripts/add_roic_to_contractor_producer.sql b/analytics/mag_pbi/scripts/add_roic_to_contractor_producer.sql new file mode 100644 index 0000000..15d6a1e --- /dev/null +++ b/analytics/mag_pbi/scripts/add_roic_to_contractor_producer.sql @@ -0,0 +1,48 @@ +-- ============================================================================= +-- Добавить колонку roic_norm в contractor_producer_mapping +-- ============================================================================= + +USE [mag_pbi] +GO + +IF NOT EXISTS ( + SELECT 1 FROM sys.columns + WHERE object_id = OBJECT_ID(N'[analytics].[contractor_producer_mapping]') + AND name = 'roic_norm' +) +BEGIN + ALTER TABLE [analytics].[contractor_producer_mapping] + ADD [roic_norm] DECIMAL(12,4) NULL; + + EXEC sys.sp_addextendedproperty + @name = N'MS_Description', + @value = N'Нормированный ROIC (при торговой надбавке 100%). Рассчитывается по этапам оплаты.', + @level0type = N'SCHEMA', @level0name = N'analytics', + @level1type = N'TABLE', @level1name = N'contractor_producer_mapping', + @level2type = N'COLUMN', @level2name = N'roic_norm'; +END +GO + +-- Обновить представление v_contractor_producer_mapping +IF OBJECT_ID(N'[analytics].[v_contractor_producer_mapping]', N'V') IS NOT NULL + DROP VIEW [analytics].[v_contractor_producer_mapping]; +GO + +CREATE VIEW [analytics].[v_contractor_producer_mapping] AS +SELECT + m.id, + m.contractor_1c_id, + c.contractor_id, + c.contractor_name, + m.producer_1c_id, + p.producer_id, + p.producer_name, + m.days_of_sales, + m.logistics_days, + m.roic_norm, + m.created_at, + m.updated_at +FROM [analytics].[contractor_producer_mapping] m +LEFT JOIN [analytics].[v_contractors] c ON c.contractor_1c_id = m.contractor_1c_id +LEFT JOIN [analytics].[v_producers] p ON p.producer_1c_id = m.producer_1c_id; +GO diff --git a/analytics/mag_pbi/scripts/create_contractor_producer_tables.sql b/analytics/mag_pbi/scripts/create_contractor_producer_tables.sql new file mode 100644 index 0000000..99d1599 --- /dev/null +++ b/analytics/mag_pbi/scripts/create_contractor_producer_tables.sql @@ -0,0 +1,169 @@ +-- ============================================================================= +-- Скрипт: сопоставление Контрагент + Производитель с этапами оплаты +-- Схема: analytics +-- Источники: Контрагенты из _Reference168, Производители из _Reference260 (1С MAG_2019) +-- ============================================================================= + +USE [mag_pbi] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +-- ----------------------------------------------------------------------------- +-- 0. DROP всех сущностей (пересоздание с нуля) +-- ----------------------------------------------------------------------------- + +IF OBJECT_ID(N'[analytics].[v_contractor_producer_mapping]', N'V') IS NOT NULL + DROP VIEW [analytics].[v_contractor_producer_mapping]; +GO + +IF OBJECT_ID(N'[analytics].[tr_contractor_producer_mapping_updated]', N'TR') IS NOT NULL + DROP TRIGGER [analytics].[tr_contractor_producer_mapping_updated]; +GO + +IF OBJECT_ID(N'[analytics].[contractor_producer_payment_stage]', N'U') IS NOT NULL + DROP TABLE [analytics].[contractor_producer_payment_stage]; +GO + +IF OBJECT_ID(N'[analytics].[contractor_producer_mapping]', N'U') IS NOT NULL + DROP TABLE [analytics].[contractor_producer_mapping]; +GO + +IF OBJECT_ID(N'[analytics].[v_contractors]', N'V') IS NOT NULL + DROP VIEW [analytics].[v_contractors]; +GO + +IF OBJECT_ID(N'[analytics].[v_producers]', N'V') IS NOT NULL + DROP VIEW [analytics].[v_producers]; +GO + +-- ----------------------------------------------------------------------------- +-- 1. Представления для списков из 1С +-- ----------------------------------------------------------------------------- + +-- Контрагенты: [pbi].[ПартнерыКонтрагенты] уже существует (из _Reference168) +-- Для удобства создаём представление analytics.v_contractors с search-friendly полями + +CREATE VIEW [analytics].[v_contractors] AS + +SELECT + c._IDRRef AS contractor_1c_id, -- бинарный ключ 1С + LOWER(CONCAT( + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 25, 8), '-', + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 21, 4), '-', + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 17, 4), '-', + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 1, 4), '-', + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 5, 12) + )) AS contractor_id, -- строковый id для API/поиска + c._Description AS contractor_name +FROM [MAG_2019].[dbo].[_Reference168] c +WHERE c._Marked = 0; +GO + +-- Производители из справочника 1С _Reference260 +CREATE VIEW [analytics].[v_producers] AS +SELECT + pr._IDRRef AS producer_1c_id, -- бинарный ключ 1С + LOWER(CONCAT( + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 25, 8), '-', + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 21, 4), '-', + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 17, 4), '-', + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 1, 4), '-', + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 5, 12) + )) AS producer_id, -- строковый id для API/поиска + pr._Description AS producer_name +FROM [MAG_2019].[dbo].[_Reference260] pr +WHERE pr._Marked = 0; +GO + +-- ----------------------------------------------------------------------------- +-- 2. Основная таблица: сопоставление Контрагент + Производитель +-- ----------------------------------------------------------------------------- + +CREATE TABLE [analytics].[contractor_producer_mapping] ( + [id] INT IDENTITY(1,1) NOT NULL, + [contractor_1c_id] BINARY(16) NOT NULL, -- бинарный ключ 1С (_Reference168) + [producer_1c_id] BINARY(16) NOT NULL, -- бинарный ключ 1С (_Reference260) + [days_of_sales] INT NOT NULL DEFAULT 180, -- На сколько дней продажи привезли остатков + [logistics_days] INT NOT NULL DEFAULT 120, -- Срок логистики (дней от дня заказа) + [roic_norm] DECIMAL(12,4) NULL, -- Нормированный ROIC (при TN 100%) + [created_at] DATETIME2(0) NOT NULL DEFAULT GETDATE(), + [updated_at] DATETIME2(0) NOT NULL DEFAULT GETDATE(), + + CONSTRAINT [PK_contractor_producer_mapping] PRIMARY KEY CLUSTERED ([id] ASC), + CONSTRAINT [UQ_contractor_producer] UNIQUE NONCLUSTERED ([contractor_1c_id], [producer_1c_id]) + ); + + EXEC sys.sp_addextendedproperty + @name = N'MS_Description', + @value = N'Сопоставление Контрагент (1С) + Производитель (1С). Параметры для расчёта нормированного ROIC.', + @level0type = N'SCHEMA', @level0name = N'analytics', + @level1type = N'TABLE', @level1name = N'contractor_producer_mapping'; +GO + +-- ----------------------------------------------------------------------------- +-- 3. Таблица этапов оплаты (неограниченное количество) +-- ----------------------------------------------------------------------------- + +CREATE TABLE [analytics].[contractor_producer_payment_stage] ( + [id] INT IDENTITY(1,1) NOT NULL, + [mapping_id] INT NOT NULL, + [name] NVARCHAR(255) NOT NULL, -- Название этапа (Предоплата, Постоплата и т.д.) + [days] INT NOT NULL, -- Дней от дня заказа до оплаты + [percent] DECIMAL(9,4) NOT NULL, -- Процент от суммы (0..100) + [sort_order] INT NOT NULL DEFAULT 0, + + CONSTRAINT [PK_contractor_producer_payment_stage] PRIMARY KEY CLUSTERED ([id] ASC), + CONSTRAINT [FK_payment_stage_mapping] FOREIGN KEY ([mapping_id]) + REFERENCES [analytics].[contractor_producer_mapping]([id]) ON DELETE CASCADE + ); + + CREATE NONCLUSTERED INDEX [IX_payment_stage_mapping_id] + ON [analytics].[contractor_producer_payment_stage]([mapping_id] ASC); + + EXEC sys.sp_addextendedproperty + @name = N'MS_Description', + @value = N'Этапы оплаты для пары Контрагент-Производитель. [{days, percent}, ...]. Сумма percent по паре должна = 100.', + @level0type = N'SCHEMA', @level0name = N'analytics', + @level1type = N'TABLE', @level1name = N'contractor_producer_payment_stage'; +GO + +-- ----------------------------------------------------------------------------- +-- 4. Представление для выборки с именами (для UI и API) +-- ----------------------------------------------------------------------------- + +CREATE VIEW [analytics].[v_contractor_producer_mapping] AS +SELECT + m.id, + m.contractor_1c_id, + c.contractor_id, -- строковый id для API/поиска + c.contractor_name, + m.producer_1c_id, + p.producer_id, -- строковый id для API/поиска + p.producer_name, + m.days_of_sales, + m.logistics_days, + m.roic_norm, + m.created_at, + m.updated_at +FROM [analytics].[contractor_producer_mapping] m +LEFT JOIN [analytics].[v_contractors] c ON c.contractor_1c_id = m.contractor_1c_id +LEFT JOIN [analytics].[v_producers] p ON p.producer_1c_id = m.producer_1c_id; +GO + +-- ----------------------------------------------------------------------------- +-- 5. Триггер обновления updated_at +-- ----------------------------------------------------------------------------- + +CREATE TRIGGER [analytics].[tr_contractor_producer_mapping_updated] +ON [analytics].[contractor_producer_mapping] +AFTER UPDATE +AS + UPDATE [analytics].[contractor_producer_mapping] + SET updated_at = GETDATE() + FROM [analytics].[contractor_producer_mapping] t + INNER JOIN inserted i ON t.id = i.id; +GO diff --git a/analytics/mag_pbi/scripts/import_suppliers_csv.sql b/analytics/mag_pbi/scripts/import_suppliers_csv.sql new file mode 100644 index 0000000..4baaf00 --- /dev/null +++ b/analytics/mag_pbi/scripts/import_suppliers_csv.sql @@ -0,0 +1,232 @@ +-- ============================================================================= +-- Импорт поставщиков из CSV +-- Пропускает: пустые строки, пустой производитель, "не работаем", двойной (партнёр=производитель) +-- ============================================================================= + +USE [mag_pbi] +GO + +SET NOCOUNT ON; + +DECLARE @t TABLE ( + partner NVARCHAR(500), + producer NVARCHAR(500), + contractor NVARCHAR(500), + log_val NVARCHAR(50), + sales_val NVARCHAR(50), + n_pct NVARCHAR(50), + n_days NVARCHAR(50), + m_pct NVARCHAR(50), + m_days NVARCHAR(50) +); + +INSERT INTO @t (partner, producer, contractor, log_val, sales_val, n_pct, n_days, m_pct, m_days) VALUES +(N'TWIST (Коврига)', N'TWIST', N'ИП Коврига Богдан Владиславович', N'14-21', N'', N'', N'', N'100', N'14-21'), +(N'АО "ПНК "Красная нить"', N'АО "ПНК "Красная нить"', N'ПНК КРАСНАЯ НИТЬ АО', N'7', N'', N'', N'', N'100', N'30'), +(N'АОРА ООО', N'Оллтекс', N'АОРА ООО', N'10', N'', N'', N'', N'100', N'14'), +(N'АПИА', N'АПИА', N'АКВИЛОН ТЕКС ООО', N'5', N'', N'0', N'', N'100', N''), +(N'Астра ООО', N'Астра ООО', N'АСТРА ООО(ИНН5027282471)', N'10', N'30', N'100', N'1', N'0', N'0'), +(N'БАЛТИЙСКИЙ ТЕКСТИЛЬ', N'БАЛТИЙСКИЙ ТЕКСТИЛЬ', N'НЕВА-ТЕКСТИЛЬ ООО', N'10', N'30', N'100', N'1', N'0', N'0'), +(N'ДЕНВИС ООО', N'Денвис ООО', N'ДЕНВИС ООО', N'14', N'', N'', N'', N'100', N'14'), +(N'Дилан-Текс ООО', N'Дилан-Текс', N'ДИЛАН-ТЕКСТИЛЬ ООО', N'3', N'30', N'100', N'', N'0', N'0'), +(N'Зарина Садовод', N'Зарина', N'ИП Ашурова Зарина Мирзоевна', N'7', N'30', N'0', N'', N'100', N'10'), +(N'Зарина Садовод', N'Зарина', N'ИП Забиров Умед Махмадиевич', N'7', N'30', N'0', N'', N'100', N'10'), +(N'Интай (ТЕКСТИЛЬ-ПРИНТ ООО)', N'Интай', N'ТЕКСТИЛЬ-ПРИНТ ООО', N'7', N'', N'0', N'', N'100', N''), +(N'ИП Маркович Олег Вячеславович', N'М-тех', N'ИП Маркович Олег Вячеславович', N'20', N'', N'100', N'', N'', N''), +(N'КАПРИЧЧО ООО', N'КАПРИЧЧО', N'КАПРИЗ ООО', N'7', N'30', N'0', N'', N'100', N'30'), +(N'КВИКЕР ООО (АРИМА)', N'Арима', N'КВИКЕР ООО', N'7', N'30', N'100', N'', N'0', N'0'), +(N'КВИНТА', N'КВИНТА ООО', N'КВИНТА ООО', N'14', N'30', N'50', N'', N'50', N'50'), +(N'КВИНТА', N'КВИНТА ООО', N'ТЕКСИНТЕХ ООО', N'14', N'30', N'50', N'', N'50', N'50'), +(N'КИТАЙ', N'ANHUI PHAETON CO.,LTD.', N'ANHUI PHAETON CO., LTD', N'120', N'180', N'30', N'1', N'70', N'50'), +(N'КИТАЙ', N'ANHUI PHAETON CO.,LTD.', N'ANHUI XINGTAI INTERNATIONAL TRADE CO., LTD', N'120', N'180', N'30', N'1', N'70', N'50'), +(N'КИТАЙ', N'Crafoam', N'CHANGSHA HEAPLAKE ENTERPRISES CO., LTD.', N'120', N'180', N'30', N'1', N'70', N'50'), +(N'КИТАЙ', N'DAVID', N'David YIWU SUPPLY AND MARKETING IMPORT AND EXPORT CO.,LTD', N'120', N'180', N'', N'', N'100', N'90'), +(N'КИТАЙ', N'WENDY', N'FUJIAN FOR BOTH TEXTILE CO.,LTD', N'120', N'180', N'', N'', N'100', N'60'), +(N'КИТАЙ', N'WENDY', N'Fujian Original Textile Co., Ltd', N'120', N'180', N'', N'', N'100', N'60'), +(N'КИТАЙ', N'GREAT ART INDUSTRIAL LTD.', N'GREAT ART INDUSTRIAL LTD.', N'120', N'180', N'30', N'1', N'70', N'60'), +(N'КИТАЙ', N'FEELO', N'AURORA SEWING SOLUTIONS - FZCO / MH / Yisun', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'FEELO', N'GUANGDONG YILE TOYS CO., LTD.', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'Evernice', N'GUANGZHOU ARK IMPORT EXPORT CO. LTD', N'120', N'180', N'', N'', N'100', N'60'), +(N'КИТАЙ', N'Evernice', N'Guangzhou Evernice Technology Development Co., Ltd', N'120', N'180', N'', N'', N'100', N'60'), +(N'КИТАЙ', N'ZHEJIANG BEYOND INDUSTRIAL AND TRADING', N'Jessy YIWU SUPPLY AND MARKETING IMPORT AND EXPORT CO.,LTD', N'120', N'180', N'', N'', N'', N''), +(N'КИТАЙ', N'JIANGSU GOLDEN AUTUMN ELASTIC FABRICS CO.,LTD', N'JIANGSU GOLDEN AUTUMN ELASTIC FABRICS CO.,LTD', N'120', N'180', N'30', N'1', N'70', N'60'), +(N'КИТАЙ', N'MH', N'NINGBO MH INDUSTRY CO., LTD.', N'120', N'180', N'50', N'100', N'50', N'160'), +(N'КИТАЙ', N'ZHEJIANG BEYOND INDUSTRIAL AND TRADING', N'NINGBO QUANAO IMP. AND EXP.CO.,LTD', N'120', N'180', N'', N'', N'100', N'120'), +(N'КИТАЙ', N'NINGBO YISUN IMPORT AND EXPORT COMPANY LIMITED', N'NINGBO UNISUN TRADE CO., LTD', N'120', N'180', N'50', N'90', N'50', N'120'), +(N'КИТАЙ', N'XINDEW', N'NINGBO YINZHOU XINDEW TEXTILE CO.,LTD', N'120', N'180', N'30', N'1', N'70', N'60'), +(N'КИТАЙ', N'NINGBO YISUN IMPORT AND EXPORT COMPANY LIMITED', N'SHAAN XI SUCCEED TRADING CO.,LTD', N'120', N'180', N'50', N'90', N'50', N'120'), +(N'КИТАЙ', N'Hebei', N'SHAOXING CITY YEHUA TEXTILE CO.,LTD', N'120', N'180', N'', N'', N'', N''), +(N'КИТАЙ', N'Houwen', N'SHAOXING KEQIAO DISTRICT HOUWEN IMPORT & EXPORT CO., LTD', N'120', N'180', N'30', N'1', N'70', N'60'), +(N'КИТАЙ', N'Mingge', N'SHAOXING KEQIAO MINGGE TEXTILE CO.,LTD', N'120', N'180', N'', N'', N'100', N'60'), +(N'КИТАЙ', N'QX', N'SHAOXING LIUYI TEXTILE IMPORT AND EXPORT CO.,LTD', N'120', N'180', N'', N'', N'', N''), +(N'КИТАЙ', N'Mingge', N'SHAOXING MENGYUE TEXTILE CO., LTD', N'120', N'180', N'', N'', N'100', N'60'), +(N'КИТАЙ', N'Varo', N'SHAOXING VARO TEXTILE CO., LTD', N'120', N'180', N'', N'', N'100', N'80'), +(N'КИТАЙ', N'ZHONGZHE', N'SHAOXING ZHONGZHE TEXTILE IMPORT AND EXPORT CO.,LTD', N'120', N'180', N'50', N'60', N'50', N'80'), +(N'КИТАЙ', N'Joanna', N'SHAOXING ZUHAO TEXTILE CO.,LTD', N'120', N'180', N'', N'', N'100', N'80'), +(N'КИТАЙ', N'SINEM BRODE', N'SINEMBRODE TEKSTIL SANAYI VE TICARET LTD. STI.', N'120', N'180', N'50', N'60', N'50', N'100'), +(N'КИТАЙ', N'RECHSEA', N'TOWARD OCEAN TECHNOLOGY CO., LIMITED', N'120', N'180', N'30', N'1', N'70', N''), +(N'КИТАЙ', N'XINDEW', N'XINDEW GROUP CO LIMITED', N'120', N'180', N'30', N'1', N'70', N'60'), +(N'КИТАЙ', N'Yingfeng Textile', N'Yingfeng Textile (Nanjing) Co., Ltd', N'120', N'180', N'30', N'1', N'70', N'50'), +(N'КИТАЙ', N'Sunshine', N'YIWU JYAO IMPORT AND EXPORT CO.,LTD', N'120', N'180', N'30', N'1', N'70', N'60'), +(N'КИТАЙ', N'ZHEGAO', N'AURORA SEWING SOLUTIONS - FZCO / MH / Yisun', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'CADA', N'AURORA SEWING SOLUTIONS - FZCO / MH / Yisun', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'KAVO', N'Shenzhen Sfun Toys Co., Ltd.', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'Im.master', N'AURORA SEWING SOLUTIONS - FZCO / MH / Yisun', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'LX', N'AURORA SEWING SOLUTIONS - FZCO / MH / Yisun', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'LB+', N'AURORA SEWING SOLUTIONS - FZCO / MH / Yisun', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'CAYI', N'AURORA SEWING SOLUTIONS - FZCO / MH / Yisun', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'JINGXIN', N'YONGJIA JINGXIN GARMENT ACCESSORIES CO.,LTD', N'120', N'180', N'', N'', N'100', N'21'), +(N'КИТАЙ', N'HP', N'SHISHI HONGPENG METAL WEAR ACCESSORIES CO., LTD.', N'120', N'180', N'30', N'1', N'70', N'21'), +(N'КИТАЙ', N'YANG', N'ZHEJIANG KENKING INDUSTRIAL CO., LTD.', N'120', N'180', N'', N'', N'', N''), +(N'КИТАЙ', N'YANG', N'ZHEJIANG KENKING TEXTILE CO., LTD.', N'120', N'180', N'', N'', N'', N''), +(N'КИТАЙ', N'Larbene', N'ZHEJIANG LARBENE TEXTILE TECHNOLOG Y CO.,LTD', N'120', N'180', N'', N'', N'', N''), +(N'КИТАЙ', N'SHUAINING', N'ZHEJIANG SHUAINING INTERLINING TECHNOLOGY CO., LTD', N'120', N'180', N'', N'', N'100', N'160'), +(N'ЛАВИСТА ТЕКСТИЛЬ ООО', N'ЛАВИСТА ТЕКСТИЛЬ ООО', N'ЛАВИСТА ТЕКСТИЛЬ ООО', N'10', N'30', N'100', N'1', N'0', N'0'), +(N'ЛЕНТА АО (Чебоксары)', N'АО "Лента" (Ч)', N'ЛЕНТА АО (Чебоксары)', N'', N'', N'', N'', N'', N''), +(N'ЛЕРТЕКС ГРУПП ООО', N'ЛЕРТЕКС ГРУПП ООО', N'ЛЕРТЕКС ГРУПП ООО', N'10', N'30', N'100', N'1', N'0', N'0'), +(N'МЕБЕЛЬНАЯ ЛИНИЯ ООО', N'МЕБЕЛЬНАЯ ЛИНИЯ ООО', N'МЕБЕЛЬНАЯ ЛИНИЯ ООО', N'7', N'30', N'100', N'1', N'0', N'0'), +(N'МИР МАНУФАКТУРЫ', N'МИР МАНУФАКТУРЫ', N'РАДУГА ООО/МИР МАНУФАКТУРЫ', N'7', N'30', N'100', N'', N'', N''), +(N'Морозкин Иван Васильевич', N'Морозкин Иван Васильевич', N'ИП Морозкин Иван Васильевич', N'7', N'30', N'0', N'', N'100', N'20'), +(N'Морозкин Иван Васильевич', N'Морозкин Иван Васильевич', N'ИП Морозкина Нина Ивановна', N'7', N'30', N'0', N'', N'100', N'20'), +(N'Московское ПО Металлпластизделие ООО', N'ООО "Московское ПО Металлпластизделие"', N'Московское ПО Металлпластизделие ООО', N'5', N'60', N'', N'', N'100', N'20'), +(N'НЬЮСТАР ООО', N'НЬЮСТАР ООО', N'НЬЮСТАР ООО', N'10', N'60', N'', N'', N'100', N'40'), +(N'ОАО "Лента" Беларусь', N'ОАО "Лента"', N'ОАО "Лента"', N'10', N'', N'', N'', N'100', N'90'), +(N'ОАО ХБК "Шуйские ситцы"', N'ОАО ХБК "Шуйские ситцы"', N'ШУЙСКИЕ СИТЦЫ АО ХБК', N'10', N'30', N'100', N'1', N'', N''), +(N'ОЛДОС', N'АнТекс', N'АНТЕКС ООО', N'3', N'', N'0', N'', N'30', N'30'), +(N'ООО "АРГО ДС"', N'Арго ДС', N'АРГО ДС ООО', N'5', N'', N'', N'', N'', N''), +(N'ООО "ЕВРОПЛАСТИК"', N'ЕВРОПЛАСТИК ПЛЮС ООО', N'ЕВРОПЛАСТИК ПЛЮС ООО', N'14', N'', N'', N'', N'100', N'14'), +(N'ООО "ЕвроСнаб" (Казинников ДВ)', N'ЕВРОСНАБ ООО', N'ЕВРОСНАБ ООО', N'14-21', N'', N'', N'', N'100', N'20'), +(N'ООО "ТриЯна" ДАВА Пласт', N'ДАВА Пласт', N'ДАВА Пласт', N'10', N'30', N'0', N'', N'100', N'10'), +(N'ООО "Ф-ЛЕЙБЛ"', N'ООО "Фуртекс"', N'ООО "ФУРТЕКС" ПРОИЗВОДСТВО ЭТИКЕТОК (Ф-ЛЕЙБЛ)', N'14', N'30', N'', N'', N'100', N'10'), +(N'ООО "ЭЛАСТТЕКС2020"', N'ООО "ЭЛАСТТЕКС2020"', N'ЭЛАСТТЕКС2020', N'14-20', N'', N'30', N'1', N'70', N'14'), +(N'ПИН (Булавки)', N'дистр. ПАО "Мосточлегмаш"', N'БУЛАВКИ ООО', N'5', N'', N'', N'', N'100', N'14'), +(N'ПИН (Булавки)', N'дистр. ПАО "Мосточлегмаш"', N'ПИН ООО 9715499112', N'5', N'', N'', N'', N'100', N'14'), +(N'ПНК ИМ. КИРОВА АО', N'ООО "ПНК им. Кирова"', N'ПНК ИМ. КИРОВА АО', N'7', N'', N'', N'', N'100', N'30'), +(N'ПНК ИМ. КИРОВА АО', N'ООО "ПНК им. Кирова"', N'ПНК ИМ. КИРОВА ООО', N'7', N'', N'', N'', N'100', N'30'), +(N'ПНК ИМ. КИРОВА АО', N'ООО "ПНК им. Кирова"', N'Филиал АО "ПНК ИМ. КИРОВА"', N'7', N'', N'', N'', N'100', N'30'), +(N'ПОЛИМЕРНАЯ ИМПЕРИЯ ООО', N'Мегафторполимер', N'ПОЛИМЕРНАЯ ИМПЕРИЯ ООО', N'20', N'', N'', N'', N'100', N'14'), +(N'ПремиумФорм', N'Антинея', N'ПРЕМИУМФОРМ ООО', N'14-20', N'30', N'100', N'1', N'', N''), +(N'Результат-МСК', N'Следопыт', N'РЕЗУЛЬТАТ-МСК ООО', N'7', N'', N'', N'', N'100', N'30'), +(N'РЭДТЕКС ООО', N'Рэдтекс', N'РЭДТЕКС ООО', N'14-20', N'', N'', N'', N'100', N'30'), +(N'СИДЖЕЙ МОДА ООО', N'СИДЖЕЙ МОДА ООО', N'ЕВРОПА ТЕКС ООО', N'7', N'30', N'0', N'', N'100', N'14'), +(N'СПЕКТР ПРО-АКТИВ ООО', N'СПЕКТР ПРО-АКТИВ ООО', N'СПЕКТР ПРО-АКТИВ ООО', N'7', N'30', N'0', N'', N'100', N'21'), +(N'ТДЛ Текстиль', N'ТДЛ Текстиль', N'ТДЛ ТЕКСТИЛЬ ООО', N'7', N'30', N'0', N'', N'100', N'5'), +(N'ТЕКСТРА ТРЭЙД ООО', N'ООО "Текстра трэйд"', N'ТЕКСТРА РУ ООО', N'3', N'14', N'0', N'', N'14', N'14'), +(N'ТК МегаМаркет', N'ООО "ТК МегаМаркет"', N'МАРКЕТ ПЛЮС ООО', N'3', N'30', N'100', N'', N'0', N'0'), +(N'ТОП ПРИНТ (Азхар Аймаль)', N'Топ принт', N'Азхар Аймаль', N'5', N'20', N'0', N'', N'100', N'14'), +(N'ТОП ПРИНТ (Азхар Аймаль)', N'Топ принт', N'ТОП ПРИНТ ООО', N'5', N'20', N'0', N'', N'100', N'14'), +(N'ТРЕНД ООО ( Колибри)', N'Colibri', N'ТРЕНД ООО', N'30', N'90', N'', N'', N'100', N'120'), +(N'ФЕЛИтеКС Беларусь', N'Фелитекс', N'ФЕЛИтеКС Беларусь', N'14', N'30', N'0', N'', N'30', N'30'), +(N'Фи-текс', N'ООО "Фи-текс"', N'Фи-текс ООО', N'14', N'30', N'0', N'', N'30', N'30'), +(N'ЧУП "Максипресс"', N'ЧУП "Максипресс"', N'НЕЙЛОН ООО', N'25', N'', N'100', N'1', N'', N''), +(N'Экстра Текстиль ООО', N'Экстра Текстиль ООО', N'ЭКСТРА ТЕКСТИЛЬ ООО', N'3', N'15', N'100', N'', N'', N''), +(N'Эскар ООО', N'ЭСКАР ООО', N'ЭСКАР ООО', N'10', N'', N'', N'', N'100', N'14'); + +-- Фильтрация: пустой производитель, не работаем, партнёр=производитель +;WITH Filtered AS ( + SELECT producer, contractor, log_val, sales_val, n_pct, n_days, m_pct, m_days, + ROW_NUMBER() OVER (PARTITION BY LTRIM(RTRIM(producer)), LTRIM(RTRIM(contractor)) ORDER BY (SELECT 1)) AS rn + FROM @t + WHERE LTRIM(RTRIM(producer)) <> N'' + AND LOWER(LTRIM(RTRIM(producer))) NOT LIKE N'%не работаем%' + AND LOWER(LTRIM(RTRIM(producer))) NOT LIKE N'%под клиентов%' + AND (LTRIM(RTRIM(partner)) <> LTRIM(RTRIM(producer)) OR LTRIM(RTRIM(partner)) = N'') +) +SELECT producer, contractor, log_val, sales_val, n_pct, n_days, m_pct, m_days +INTO #staging +FROM Filtered +WHERE rn = 1; + +DECLARE @log_days INT, @sales_days INT, @n_pct DECIMAL(9,4), @n_days INT, @m_pct DECIMAL(9,4), @m_days INT; +DECLARE @producer NVARCHAR(500), @contractor NVARCHAR(500); +DECLARE @manufacturer_id INT, @contractor_1c_id BINARY(16); +DECLARE @log_val NVARCHAR(50), @sales_val NVARCHAR(50), @n_pct_val NVARCHAR(50), @n_days_val NVARCHAR(50), @m_pct_val NVARCHAR(50), @m_days_val NVARCHAR(50); + +DECLARE cur CURSOR LOCAL FAST_FORWARD FOR + SELECT producer, contractor, log_val, sales_val, n_pct, n_days, m_pct, m_days FROM #staging; + +OPEN cur; + +WHILE 1=1 +BEGIN + FETCH cur INTO @producer, @contractor, @log_val, @sales_val, @n_pct_val, @n_days_val, @m_pct_val, @m_days_val; + IF @@FETCH_STATUS <> 0 BREAK; + + SET @manufacturer_id = NULL; + SET @contractor_1c_id = NULL; + + -- Парсинг чисел: диапазон 14-21 -> среднее, пустое -> NULL + SET @log_days = CASE + WHEN @log_val = N'' OR @log_val IS NULL THEN NULL + WHEN @log_val LIKE N'%-%' AND CHARINDEX(N'-', @log_val) > 1 + THEN (TRY_CAST(LEFT(@log_val, CHARINDEX(N'-', @log_val)-1) AS INT) + TRY_CAST(LTRIM(SUBSTRING(@log_val, CHARINDEX(N'-', @log_val)+1, 10)) AS INT))/2 + ELSE TRY_CAST(@log_val AS INT) END; + SET @sales_days = CASE + WHEN @sales_val = N'' OR @sales_val IS NULL THEN NULL + WHEN @sales_val LIKE N'%-%' AND CHARINDEX(N'-', @sales_val) > 1 + THEN (TRY_CAST(LEFT(@sales_val, CHARINDEX(N'-', @sales_val)-1) AS INT) + TRY_CAST(LTRIM(SUBSTRING(@sales_val, CHARINDEX(N'-', @sales_val)+1, 10)) AS INT))/2 + ELSE TRY_CAST(@sales_val AS INT) END; + SET @n_pct = TRY_CAST(@n_pct_val AS DECIMAL(9,4)); + SET @n_days = TRY_CAST(@n_days_val AS INT); + SET @m_pct = TRY_CAST(@m_pct_val AS DECIMAL(9,4)); + SET @m_days = TRY_CAST(@m_days_val AS INT); + + IF @log_days IS NULL SET @log_days = 120; + IF @sales_days IS NULL SET @sales_days = 180; + + -- Найти contractor_1c_id в v_contractors (по точному совпадению имени) + SELECT @contractor_1c_id = (SELECT TOP 1 contractor_1c_id + FROM [analytics].[v_contractors] + WHERE LTRIM(RTRIM(contractor_name)) = LTRIM(RTRIM(@contractor))); + + IF @contractor_1c_id IS NULL + CONTINUE; -- контрагент не найден в 1С, пропускаем + + -- Найти или создать manufacturer (подзапрос — при отсутствии строк переменная станет NULL) + SELECT @manufacturer_id = (SELECT id FROM [analytics].[manufacturers] + WHERE LTRIM(RTRIM(manufacturer)) = LTRIM(RTRIM(@producer))); + + IF @manufacturer_id IS NULL + BEGIN + INSERT INTO [analytics].[manufacturers] (manufacturer, days_of_sales, logistics_days, roic_norm) + VALUES (LTRIM(RTRIM(@producer)), @sales_days, @log_days, NULL); + SET @manufacturer_id = SCOPE_IDENTITY(); + END + ELSE + BEGIN + UPDATE [analytics].[manufacturers] + SET days_of_sales = @sales_days, logistics_days = @log_days + WHERE id = @manufacturer_id; + END + + -- Проверить, нет ли уже связи + IF EXISTS (SELECT 1 FROM [analytics].[manufacturer_counterparty_map] + WHERE manufacturer_id = @manufacturer_id AND contractor_1c_id = @contractor_1c_id) + CONTINUE; + + INSERT INTO [analytics].[manufacturer_counterparty_map] (manufacturer_id, contractor_1c_id) + VALUES (@manufacturer_id, @contractor_1c_id); + + -- Этапы оплаты + DELETE FROM [analytics].[manufacturer_payment_stage] WHERE manufacturer_id = @manufacturer_id; + + IF @n_pct IS NOT NULL AND @n_pct > 0 + INSERT INTO [analytics].[manufacturer_payment_stage] (manufacturer_id, name, days, [percent], sort_order) + VALUES (@manufacturer_id, N'Первая оплата', ISNULL(@n_days, 1), @n_pct, 0); + + IF @m_pct IS NOT NULL AND @m_pct > 0 + INSERT INTO [analytics].[manufacturer_payment_stage] (manufacturer_id, name, days, [percent], sort_order) + VALUES (@manufacturer_id, N'Вторая оплата', ISNULL(@m_days, 60), @m_pct, 1); + + IF NOT EXISTS (SELECT 1 FROM [analytics].[manufacturer_payment_stage] WHERE manufacturer_id = @manufacturer_id) + INSERT INTO [analytics].[manufacturer_payment_stage] (manufacturer_id, name, days, [percent], sort_order) + VALUES (@manufacturer_id, N'Предоплата', 14, 100, 0); +END + +CLOSE cur; +DEALLOCATE cur; + +DROP TABLE #staging; + +PRINT 'Импорт завершён.'; +GO diff --git a/analytics/mag_pbi/scripts/migrate_manufacturers_counterparties_to_contractor_producer.sql b/analytics/mag_pbi/scripts/migrate_manufacturers_counterparties_to_contractor_producer.sql new file mode 100644 index 0000000..7ad41d2 --- /dev/null +++ b/analytics/mag_pbi/scripts/migrate_manufacturers_counterparties_to_contractor_producer.sql @@ -0,0 +1,120 @@ +-- ============================================================================= +-- Миграция: manufacturers + manufacturer_counterparty_map + counterparties +-- → contractor_producer_mapping + contractor_producer_payment_stage +-- +-- Источник: analytics.manufacturers, analytics.manufacturer_counterparty_map, +-- analytics.counterparties +-- Назначение: analytics.contractor_producer_mapping, +-- analytics.contractor_producer_payment_stage +-- +-- Сопоставление по именам: counterparty → v_contractors (_Reference168), +-- manufacturer → v_producers (_Reference260) +-- ============================================================================= + +USE [mag_pbi] +GO + +SET NOCOUNT ON; + +-- 1. Проверка: какие строки будут мигрировать, какие найдутся в 1С +PRINT '=== Сопоставление с v_contractors и v_producers ==='; +SELECT + mcm.id AS map_id, + cp.counterparty, + c.contractor_id AS contractor_1c_match, + man.manufacturer, + p.producer_id AS producer_1c_match, + CASE WHEN c.contractor_1c_id IS NULL THEN 'НЕТ' ELSE 'OK' END AS contractor_ok, + CASE WHEN p.producer_1c_id IS NULL THEN 'НЕТ' ELSE 'OK' END AS producer_ok +FROM [analytics].[manufacturer_counterparty_map] mcm +JOIN [analytics].[manufacturers] man ON man.id = mcm.manufacturer_id +JOIN [analytics].[counterparties] cp ON cp.id = mcm.counterparty_id +LEFT JOIN [analytics].[v_contractors] c + ON LTRIM(RTRIM(c.contractor_name)) = LTRIM(RTRIM(cp.counterparty)) +LEFT JOIN [analytics].[v_producers] p + ON LTRIM(RTRIM(p.producer_name)) = LTRIM(RTRIM(man.manufacturer)) +ORDER BY mcm.id; + +-- 2. Вставка в contractor_producer_mapping (только пары, найденные в 1С) +PRINT ''; +PRINT '=== Вставка в contractor_producer_mapping ==='; + +INSERT INTO [analytics].[contractor_producer_mapping] + (contractor_1c_id, producer_1c_id, days_of_sales, logistics_days, roic_norm) +SELECT + c.contractor_1c_id, + p.producer_1c_id, + 180, + 120, + man.ROI_norm +FROM [analytics].[manufacturer_counterparty_map] mcm +JOIN [analytics].[manufacturers] man ON man.id = mcm.manufacturer_id +JOIN [analytics].[counterparties] cp ON cp.id = mcm.counterparty_id +JOIN [analytics].[v_contractors] c + ON LTRIM(RTRIM(c.contractor_name)) = LTRIM(RTRIM(cp.counterparty)) +JOIN [analytics].[v_producers] p + ON LTRIM(RTRIM(p.producer_name)) = LTRIM(RTRIM(man.manufacturer)) +WHERE NOT EXISTS ( + SELECT 1 FROM [analytics].[contractor_producer_mapping] m2 + WHERE m2.contractor_1c_id = c.contractor_1c_id AND m2.producer_1c_id = p.producer_1c_id +); + +PRINT 'Вставлено сопоставлений: ' + CAST(@@ROWCOUNT AS NVARCHAR(10)); + +-- 3. Вставка этапов оплаты для маппингов без этапов +PRINT ''; +PRINT '=== Вставка этапов оплаты ==='; + +DECLARE @mapping_id INT; +DECLARE @n_pct DECIMAL(10,3), @n_d INT, @m_pct DECIMAL(10,3), @m_d INT; + +DECLARE cur CURSOR LOCAL FAST_FORWARD FOR +SELECT + m.id, + man.n_percent, + ISNULL(man.n_days, 1), + man.m_percent, + ISNULL(man.m_days, 120) +FROM [analytics].[contractor_producer_mapping] m +JOIN [analytics].[v_contractors] c ON c.contractor_1c_id = m.contractor_1c_id +JOIN [analytics].[v_producers] p ON p.producer_1c_id = m.producer_1c_id +JOIN [analytics].[counterparties] cp ON LTRIM(RTRIM(cp.counterparty)) = LTRIM(RTRIM(c.contractor_name)) +JOIN [analytics].[manufacturer_counterparty_map] mcm ON mcm.counterparty_id = cp.id +JOIN [analytics].[manufacturers] man ON man.id = mcm.manufacturer_id + AND LTRIM(RTRIM(man.manufacturer)) = LTRIM(RTRIM(p.producer_name)) +WHERE NOT EXISTS (SELECT 1 FROM [analytics].[contractor_producer_payment_stage] s WHERE s.mapping_id = m.id); + +OPEN cur; +FETCH NEXT FROM cur INTO @mapping_id, @n_pct, @n_d, @m_pct, @m_d; + +WHILE @@FETCH_STATUS = 0 +BEGIN + -- Этап 1: Предоплата (n_percent, n_days) + IF @n_pct IS NOT NULL AND @n_pct <> 0 + BEGIN + INSERT INTO [analytics].[contractor_producer_payment_stage] (mapping_id, name, days, [percent], sort_order) + VALUES (@mapping_id, N'Предоплата', @n_d, + CASE WHEN @n_pct > 1 THEN @n_pct ELSE @n_pct * 100 END, 0); + END + -- Этап 2: Постоплата (m_percent, m_days) + IF @m_pct IS NOT NULL AND @m_pct <> 0 + BEGIN + INSERT INTO [analytics].[contractor_producer_payment_stage] (mapping_id, name, days, [percent], sort_order) + VALUES (@mapping_id, N'Постоплата', @m_d, + CASE WHEN @m_pct > 1 THEN @m_pct ELSE @m_pct * 100 END, 1); + END + -- Если оба NULL — дефолт Предоплата 7-50, Постоплата 120-50 + IF (@n_pct IS NULL OR @n_pct = 0) AND (@m_pct IS NULL OR @m_pct = 0) + BEGIN + INSERT INTO [analytics].[contractor_producer_payment_stage] (mapping_id, name, days, [percent], sort_order) + VALUES (@mapping_id, N'Предоплата', 7, 50, 0), + (@mapping_id, N'Постоплата', 120, 50, 1); + END + FETCH NEXT FROM cur INTO @mapping_id, @n_pct, @n_d, @m_pct, @m_d; +END; + +CLOSE cur; +DEALLOCATE cur; + +PRINT 'Миграция завершена.'; +GO diff --git a/analytics/mag_pbi/scripts/migrate_map_to_contractor_1c.sql b/analytics/mag_pbi/scripts/migrate_map_to_contractor_1c.sql new file mode 100644 index 0000000..2111a7a --- /dev/null +++ b/analytics/mag_pbi/scripts/migrate_map_to_contractor_1c.sql @@ -0,0 +1,156 @@ +-- ============================================================================= +-- Переход: counterparties → v_contractors (1С) +-- manufacturer_counterparty_map: counterparty_id → contractor_1c_id +-- Контрагенты и производители из 1С (v_contractors, v_producers) +-- ============================================================================= + +USE [mag_pbi] +GO + +SET NOCOUNT ON; + +-- Удаляем представления, ссылающиеся на map/counterparties +IF OBJECT_ID(N'[analytics].[v_manufacturer_counterparty_mapping]', N'V') IS NOT NULL + DROP VIEW [analytics].[v_manufacturer_counterparty_mapping]; +GO + +-- Удалить FK manufacturer_counterparty_map → counterparties (если есть) +DECLARE @fk NVARCHAR(256); +SELECT @fk = name FROM sys.foreign_keys +WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') + AND referenced_object_id = OBJECT_ID(N'[analytics].[counterparties]'); +IF @fk IS NOT NULL + EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @fk); +GO + +-- Очистить таблицу привязки +TRUNCATE TABLE [analytics].[manufacturer_counterparty_map]; +PRINT 'manufacturer_counterparty_map: очищена'; +GO + +-- Заменить counterparty_id на contractor_1c_id +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'counterparty_id') +BEGIN + ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP COLUMN [counterparty_id]; + PRINT 'Удалена колонка counterparty_id'; +END +IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'contractor_1c_id') +BEGIN + ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD [contractor_1c_id] BINARY(16) NOT NULL; + PRINT 'Добавлена колонка contractor_1c_id'; +END +GO + +-- Удалить старые уникальные ограничения (на counterparty_id), создать новое +DECLARE @uq NVARCHAR(256); +SELECT @uq = name FROM sys.key_constraints +WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') + AND type = 'UQ' AND name = 'UQ_mcm_counterparty'; +IF @uq IS NOT NULL + EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @uq); + +SELECT @uq = name FROM sys.key_constraints +WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') + AND type = 'UQ' AND name = 'UQ_mcm_pair'; +IF @uq IS NOT NULL + EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @uq); + +-- Один контрагент — один производитель +IF NOT EXISTS (SELECT 1 FROM sys.key_constraints + WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'UQ_mcm_contractor') + ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD CONSTRAINT [UQ_mcm_contractor] UNIQUE ([contractor_1c_id]); +-- Уникальная пара +IF NOT EXISTS (SELECT 1 FROM sys.key_constraints + WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'UQ_mcm_pair') + ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD CONSTRAINT [UQ_mcm_pair] UNIQUE ([manufacturer_id], [contractor_1c_id]); +GO + +-- Удалить таблицу counterparties +IF OBJECT_ID(N'[analytics].[counterparties]', N'U') IS NOT NULL +BEGIN + DROP TABLE [analytics].[counterparties]; + PRINT 'Удалена таблица analytics.counterparties'; +END +GO + +-- Создать v_contractors, v_producers если не существуют +IF OBJECT_ID(N'[analytics].[v_contractors]', N'V') IS NULL +BEGIN + EXEC(' + CREATE VIEW [analytics].[v_contractors] AS + SELECT + c._IDRRef AS contractor_1c_id, + LOWER(CONCAT( + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 25, 8), ''-'', + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 21, 4), ''-'', + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 17, 4), ''-'', + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 1, 4), ''-'', + SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 5, 12) + )) AS contractor_id, + c._Description AS contractor_name + FROM [MAG_2019].[dbo].[_Reference168] c + WHERE c._Marked = 0'); + PRINT 'Создано представление v_contractors'; +END + +IF OBJECT_ID(N'[analytics].[v_producers]', N'V') IS NULL +BEGIN + EXEC(' + CREATE VIEW [analytics].[v_producers] AS + SELECT + pr._IDRRef AS producer_1c_id, + LOWER(CONCAT( + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 25, 8), ''-'', + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 21, 4), ''-'', + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 17, 4), ''-'', + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 1, 4), ''-'', + SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 5, 12) + )) AS producer_id, + pr._Description AS producer_name + FROM [MAG_2019].[dbo].[_Reference260] pr + WHERE pr._Marked = 0'); + PRINT 'Создано представление v_producers'; +END +GO + +-- Представление для API: map + manufacturer + contractor/producer (из 1С) +CREATE VIEW [analytics].[v_manufacturer_counterparty_mapping] AS +SELECT + mcm.id, + mcm.manufacturer_id, + p.producer_id, + man.manufacturer AS manufacturer_name, + mcm.contractor_1c_id, + c.contractor_id, + c.contractor_name AS contractor_name, + man.days_of_sales, + man.logistics_days, + man.roic_norm +FROM [analytics].[manufacturer_counterparty_map] mcm +LEFT JOIN [analytics].[manufacturers] man ON man.id = mcm.manufacturer_id +LEFT JOIN [analytics].[v_contractors] c ON c.contractor_1c_id = mcm.contractor_1c_id +LEFT JOIN [analytics].[v_producers] p ON LTRIM(RTRIM(p.producer_name)) = LTRIM(RTRIM(man.manufacturer)); +GO + +-- Исправить [analytics].[get_orders_list]: counterparties удалена, map по contractor_1c_id, +-- manufacturers без ROI_norm/n_percent/n_days/m_percent/m_days — использовать v_manufacturers_roi_compat +IF OBJECT_ID(N'[analytics].[get_orders_list]', N'V') IS NOT NULL +BEGIN + DECLARE @def NVARCHAR(MAX); + SELECT @def = OBJECT_DEFINITION(OBJECT_ID(N'[analytics].[get_orders_list]')); + IF @def LIKE N'%counterparties%' + BEGIN + SET @def = REPLACE(@def, N'LEFT JOIN [analytics].[counterparties] cp ON cp.[counterparty] = r._Description', N''); + SET @def = REPLACE(@def, N'map.[counterparty_id] = cp.id', N'map.[contractor_1c_id] = r._IDRRef'); + -- manufacturers без старых полей — join на v_manufacturers_roi_compat (ROI_norm, n_percent, n_days, m_percent, m_days) + IF @def LIKE N'%ROI_norm%' AND OBJECT_ID(N'[analytics].[v_manufacturers_roi_compat]', N'V') IS NOT NULL + SET @def = REPLACE(@def, N'[analytics].[manufacturers] man', N'[analytics].[v_manufacturers_roi_compat] man'); + DROP VIEW [analytics].[get_orders_list]; + EXEC sp_executesql @def; + PRINT 'Обновлено представление analytics.get_orders_list'; + END +END +GO + +PRINT 'Готово: manufacturer_counterparty_map с contractor_1c_id, counterparties удалена'; +GO diff --git a/analytics/mag_pbi/scripts/migrate_to_manufacturers_structure.sql b/analytics/mag_pbi/scripts/migrate_to_manufacturers_structure.sql new file mode 100644 index 0000000..eb19249 --- /dev/null +++ b/analytics/mag_pbi/scripts/migrate_to_manufacturers_structure.sql @@ -0,0 +1,252 @@ +-- ============================================================================= +-- Миграция: логистика, дни продаж и этапы оплаты — на manufacturers +-- manufacturer_counterparty_map — только связь manufacturer_id + contractor_1c_id (из 1С) +-- +-- ВАЖНО: Перед запуском выполнить migrate_map_to_contractor_1c.sql +-- (удаление counterparties, переход на contractor_1c_id) +-- +-- ИСТОЧНИК: contractor_producer_mapping, contractor_producer_payment_stage +-- (сопоставление по v_contractors, v_producers → counterparties, manufacturers) +-- +-- 1. manufacturers: добавить days_of_sales, logistics_days, roic_norm +-- 2. manufacturer_payment_stage: новая таблица, FK на manufacturers +-- 3. Миграция из contractor_producer_* в manufacturers, map, manufacturer_payment_stage +-- 4. manufacturer_counterparty_map: убрать days_of_sales, logistics_days, roic_norm (если есть) +-- 5. Удалить contractor_producer_*, manufacturer_counterparty_payment_stage +-- ============================================================================= + +USE [mag_pbi] +GO + +SET NOCOUNT ON; + +-- ============================================================================= +-- 1. manufacturers: добавить days_of_sales, logistics_days, roic_norm +-- ============================================================================= +IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'days_of_sales') + ALTER TABLE [analytics].[manufacturers] ADD [days_of_sales] INT NOT NULL DEFAULT 180; +IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'logistics_days') + ALTER TABLE [analytics].[manufacturers] ADD [logistics_days] INT NOT NULL DEFAULT 120; +IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'roic_norm') + ALTER TABLE [analytics].[manufacturers] ADD [roic_norm] DECIMAL(12,4) NULL; + +-- Миграция из manufacturers.ROI_norm (если ещё не удалена, roic_norm уже добавлена) +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'ROI_norm') + AND EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'roic_norm') +BEGIN + UPDATE [analytics].[manufacturers] SET [roic_norm] = [ROI_norm] WHERE [roic_norm] IS NULL AND [ROI_norm] IS NOT NULL; +END + +-- Удалить старые поля manufacturers (n_percent, n_days, m_percent, m_days, ROI_norm) +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'ROI_norm') + ALTER TABLE [analytics].[manufacturers] DROP COLUMN [ROI_norm]; +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'n_percent') + ALTER TABLE [analytics].[manufacturers] DROP COLUMN [n_percent]; +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'n_days') + ALTER TABLE [analytics].[manufacturers] DROP COLUMN [n_days]; +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'm_percent') + ALTER TABLE [analytics].[manufacturers] DROP COLUMN [m_percent]; +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturers]') AND name = 'm_days') + ALTER TABLE [analytics].[manufacturers] DROP COLUMN [m_days]; + +PRINT 'manufacturers: добавлены days_of_sales, logistics_days, roic_norm'; +GO + +-- ============================================================================= +-- 2. manufacturer_payment_stage — этапы оплаты, привязаны к manufacturers +-- ============================================================================= +IF OBJECT_ID(N'[analytics].[manufacturer_payment_stage]', N'U') IS NULL +BEGIN + CREATE TABLE [analytics].[manufacturer_payment_stage] ( + [id] INT IDENTITY(1,1) NOT NULL, + [manufacturer_id] INT NOT NULL, + [name] NVARCHAR(255) NOT NULL, + [days] INT NOT NULL, + [percent] DECIMAL(9,4) NOT NULL, + [sort_order] INT NOT NULL DEFAULT 0, + CONSTRAINT [PK_manufacturer_payment_stage] PRIMARY KEY CLUSTERED ([id]), + CONSTRAINT [FK_manufacturer_payment_stage] FOREIGN KEY ([manufacturer_id]) + REFERENCES [analytics].[manufacturers]([id]) ON DELETE CASCADE + ); + CREATE NONCLUSTERED INDEX [IX_manufacturer_payment_stage_manufacturer_id] + ON [analytics].[manufacturer_payment_stage]([manufacturer_id]); + PRINT 'Создана таблица manufacturer_payment_stage'; +END +GO + +-- ============================================================================= +-- Миграция из contractor_producer_mapping и contractor_producer_payment_stage +-- (требует v_contractors, v_producers; manufacturer_counterparty_map с contractor_1c_id) +-- ============================================================================= +IF OBJECT_ID(N'[analytics].[contractor_producer_mapping]', N'U') IS NOT NULL + AND OBJECT_ID(N'[analytics].[contractor_producer_payment_stage]', N'U') IS NOT NULL + AND OBJECT_ID(N'[analytics].[v_contractors]', N'V') IS NOT NULL + AND OBJECT_ID(N'[analytics].[v_producers]', N'V') IS NOT NULL + AND EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'contractor_1c_id') +BEGIN + -- 3a. Добавить недостающие manufacturers (по именам из 1С) + INSERT INTO [analytics].[manufacturers] (manufacturer, days_of_sales, logistics_days, roic_norm) + SELECT t.producer_name, t.days_of_sales, t.logistics_days, t.roic_norm + FROM ( + SELECT LTRIM(RTRIM(p.producer_name)) AS producer_name, m.days_of_sales, m.logistics_days, m.roic_norm, + ROW_NUMBER() OVER (PARTITION BY LTRIM(RTRIM(p.producer_name)) ORDER BY m.id) AS rn + FROM [analytics].[contractor_producer_mapping] m + JOIN [analytics].[v_producers] p ON p.producer_1c_id = m.producer_1c_id + ) t + WHERE t.rn = 1 + AND NOT EXISTS (SELECT 1 FROM [analytics].[manufacturers] man WHERE LTRIM(RTRIM(man.manufacturer)) = t.producer_name); + + -- 3b. Обновить manufacturers (days, logistics, roic) из contractor_producer_mapping + UPDATE man + SET man.days_of_sales = src.days_of_sales, + man.logistics_days = src.logistics_days, + man.roic_norm = COALESCE(man.roic_norm, src.roic_norm) + FROM [analytics].[manufacturers] man + JOIN ( + SELECT p.producer_name, m.days_of_sales, m.logistics_days, m.roic_norm, + ROW_NUMBER() OVER (PARTITION BY LTRIM(RTRIM(p.producer_name)) ORDER BY m.id) AS rn + FROM [analytics].[contractor_producer_mapping] m + JOIN [analytics].[v_producers] p ON p.producer_1c_id = m.producer_1c_id + ) src ON LTRIM(RTRIM(man.manufacturer)) = LTRIM(RTRIM(src.producer_name)) AND src.rn = 1; + + -- 3c. Вставить связи в manufacturer_counterparty_map (contractor_1c_id из 1С) + INSERT INTO [analytics].[manufacturer_counterparty_map] (manufacturer_id, contractor_1c_id) + SELECT man.id, m.contractor_1c_id + FROM [analytics].[contractor_producer_mapping] m + JOIN [analytics].[v_producers] p ON p.producer_1c_id = m.producer_1c_id + JOIN [analytics].[manufacturers] man ON LTRIM(RTRIM(man.manufacturer)) = LTRIM(RTRIM(p.producer_name)) + WHERE NOT EXISTS ( + SELECT 1 FROM [analytics].[manufacturer_counterparty_map] mcm + WHERE mcm.manufacturer_id = man.id AND mcm.contractor_1c_id = m.contractor_1c_id + ); + PRINT 'Миграция из contractor_producer_mapping: вставлено связей ' + CAST(@@ROWCOUNT AS NVARCHAR(10)); + + -- 3d. Миграция этапов в manufacturer_payment_stage (по одному набору на производителя — из первого mapping) + INSERT INTO [analytics].[manufacturer_payment_stage] (manufacturer_id, name, [days], [percent], sort_order) + SELECT man.id, s.name, s.[days], s.[percent], s.sort_order + FROM [analytics].[contractor_producer_payment_stage] s + JOIN [analytics].[contractor_producer_mapping] m ON m.id = s.mapping_id + JOIN [analytics].[v_producers] p ON p.producer_1c_id = m.producer_1c_id + JOIN [analytics].[manufacturers] man ON LTRIM(RTRIM(man.manufacturer)) = LTRIM(RTRIM(p.producer_name)) + WHERE m.id = ( + SELECT MIN(m2.id) FROM [analytics].[contractor_producer_mapping] m2 + JOIN [analytics].[v_producers] p2 ON p2.producer_1c_id = m2.producer_1c_id + WHERE LTRIM(RTRIM(p2.producer_name)) = LTRIM(RTRIM(p.producer_name)) + ) + AND man.id NOT IN (SELECT manufacturer_id FROM [analytics].[manufacturer_payment_stage]); + PRINT 'Миграция из contractor_producer_payment_stage: вставлено этапов ' + CAST(@@ROWCOUNT AS NVARCHAR(10)); +END +GO + +-- Fallback: миграция из manufacturer_counterparty_payment_stage (если contractor_producer уже удалён) +IF OBJECT_ID(N'[analytics].[manufacturer_counterparty_payment_stage]', N'U') IS NOT NULL +BEGIN + INSERT INTO [analytics].[manufacturer_payment_stage] (manufacturer_id, name, [days], [percent], sort_order) + SELECT mcm.manufacturer_id, s.name, s.[days], s.[percent], s.sort_order + FROM [analytics].[manufacturer_counterparty_payment_stage] s + JOIN [analytics].[manufacturer_counterparty_map] mcm ON mcm.id = s.map_id + WHERE mcm.id = (SELECT MIN(m2.id) FROM [analytics].[manufacturer_counterparty_map] m2 WHERE m2.manufacturer_id = mcm.manufacturer_id) + AND mcm.manufacturer_id NOT IN (SELECT manufacturer_id FROM [analytics].[manufacturer_payment_stage]); + PRINT 'Миграция из manufacturer_counterparty_payment_stage: ' + CAST(@@ROWCOUNT AS NVARCHAR(10)); +END +GO + +-- Дефолтные этапы для manufacturers без этапов (из старых n_/m_ полей, если остались — уже удалены) +-- Берём manufacturers без этапов и добавляем Предоплата+Постоплата +INSERT INTO [analytics].[manufacturer_payment_stage] (manufacturer_id, name, [days], [percent], sort_order) +SELECT man.id, N'Предоплата', 7, 50, 0 +FROM [analytics].[manufacturers] man +WHERE NOT EXISTS (SELECT 1 FROM [analytics].[manufacturer_payment_stage] s WHERE s.manufacturer_id = man.id); + +INSERT INTO [analytics].[manufacturer_payment_stage] (manufacturer_id, name, [days], [percent], sort_order) +SELECT man.id, N'Постоплата', 120, 50, 1 +FROM [analytics].[manufacturers] man +WHERE (SELECT COUNT(*) FROM [analytics].[manufacturer_payment_stage] s WHERE s.manufacturer_id = man.id) = 1; + +PRINT 'Созданы дефолтные этапы оплаты'; +GO + +-- ============================================================================= +-- 3. manufacturer_counterparty_map: убрать days_of_sales, logistics_days, roic_norm +-- ============================================================================= +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'days_of_sales') + ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP COLUMN [days_of_sales]; +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'logistics_days') + ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP COLUMN [logistics_days]; +IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'roic_norm') + ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP COLUMN [roic_norm]; + +PRINT 'manufacturer_counterparty_map: оставлены только manufacturer_id, counterparty_id'; +GO + +-- ============================================================================= +-- 4. Удалить manufacturer_counterparty_payment_stage и contractor_producer_* +-- ============================================================================= +IF OBJECT_ID(N'[analytics].[manufacturer_counterparty_payment_stage]', N'U') IS NOT NULL + DROP TABLE [analytics].[manufacturer_counterparty_payment_stage]; +IF OBJECT_ID(N'[analytics].[v_contractor_producer_mapping]', N'V') IS NOT NULL + DROP VIEW [analytics].[v_contractor_producer_mapping]; +IF OBJECT_ID(N'[analytics].[contractor_producer_payment_stage]', N'U') IS NOT NULL + DROP TABLE [analytics].[contractor_producer_payment_stage]; +IF OBJECT_ID(N'[analytics].[contractor_producer_mapping]', N'U') IS NOT NULL + DROP TABLE [analytics].[contractor_producer_mapping]; + +PRINT 'Удалены manufacturer_counterparty_payment_stage и contractor_producer_*'; +GO + +-- ============================================================================= +-- 5. Представление для API (map + manufacturer + counterparty, roic из manufacturers) +-- ============================================================================= +IF OBJECT_ID(N'[analytics].[v_manufacturer_counterparty_mapping]', N'V') IS NOT NULL + DROP VIEW [analytics].[v_manufacturer_counterparty_mapping]; +GO + +CREATE VIEW [analytics].[v_manufacturer_counterparty_mapping] AS +SELECT + mcm.id, + mcm.manufacturer_id, + p.producer_id, + man.manufacturer AS manufacturer_name, + mcm.contractor_1c_id, + c.contractor_id, + c.contractor_name AS contractor_name, + man.days_of_sales, + man.logistics_days, + man.roic_norm +FROM [analytics].[manufacturer_counterparty_map] mcm +LEFT JOIN [analytics].[manufacturers] man ON man.id = mcm.manufacturer_id +LEFT JOIN [analytics].[v_contractors] c ON c.contractor_1c_id = mcm.contractor_1c_id +LEFT JOIN [analytics].[v_producers] p ON LTRIM(RTRIM(p.producer_name)) = LTRIM(RTRIM(man.manufacturer)); +GO + +PRINT 'Создано представление v_manufacturer_counterparty_mapping'; +GO + +-- ============================================================================= +-- 6. View для обратной совместимости процедур (manufacturer + roic + n_/m_) +-- ============================================================================= +IF OBJECT_ID(N'[analytics].[v_manufacturers_roi_compat]', N'V') IS NOT NULL + DROP VIEW [analytics].[v_manufacturers_roi_compat]; +GO + +CREATE VIEW [analytics].[v_manufacturers_roi_compat] AS +SELECT + man.id, + man.manufacturer, + man.roic_norm AS ROI_norm, + n_stage.[percent] / 100.0 AS n_percent, + n_stage.[days] AS n_days, + m_stage.[percent] / 100.0 AS m_percent, + m_stage.[days] AS m_days +FROM [analytics].[manufacturers] man +LEFT JOIN ( + SELECT manufacturer_id, [percent], [days], + ROW_NUMBER() OVER (PARTITION BY manufacturer_id ORDER BY sort_order, [days]) AS rn + FROM [analytics].[manufacturer_payment_stage] +) n_stage ON n_stage.manufacturer_id = man.id AND n_stage.rn = 1 +LEFT JOIN ( + SELECT manufacturer_id, [percent], [days], + ROW_NUMBER() OVER (PARTITION BY manufacturer_id ORDER BY sort_order, [days]) AS rn + FROM [analytics].[manufacturer_payment_stage] +) m_stage ON m_stage.manufacturer_id = man.id AND m_stage.rn = 2; +GO diff --git a/analytics/mag_pbi/scripts/recalc_roic_contractor_producer.sql b/analytics/mag_pbi/scripts/recalc_roic_contractor_producer.sql new file mode 100644 index 0000000..c67d390 --- /dev/null +++ b/analytics/mag_pbi/scripts/recalc_roic_contractor_producer.sql @@ -0,0 +1,50 @@ +-- ============================================================================= +-- Пересчёт roic_norm по методике (возврат денег по ходу продаж) +-- Таблицы: manufacturers, manufacturer_payment_stage +-- Алгоритм: avgReturnDay = logistics_days + days_of_sales/2 +-- frozenDays = avgReturnDay - effectiveDeferralDays +-- roic_norm = 12 / (frozenDays/30) * 100 +-- ============================================================================= + +USE [mag_pbi] +GO + +;WITH stage_agg AS ( + SELECT + manufacturer_id, + SUM([percent] / 100.0 * [days]) AS effective_deferral_days, + SUM([percent] / 100.0) AS total_percent + FROM [analytics].[manufacturer_payment_stage] + GROUP BY manufacturer_id +), +calc AS ( + SELECT + man.id, + man.days_of_sales, + man.logistics_days, + COALESCE(s.effective_deferral_days, 0) AS effective_deferral_days, + COALESCE(s.total_percent, 0) AS total_percent, + (man.logistics_days + man.days_of_sales / 2.0) AS avg_return_day + FROM [analytics].[manufacturers] man + LEFT JOIN stage_agg s ON s.manufacturer_id = man.id +), +roic_calc AS ( + SELECT + id, + CASE + WHEN total_percent <= 0 THEN NULL + WHEN (avg_return_day - effective_deferral_days) <= 0 THEN NULL + ELSE ROUND(12.0 / ((avg_return_day - effective_deferral_days) / 30.0) * 100.0, 2) + END AS new_roic + FROM calc +) +UPDATE man +SET man.roic_norm = r.new_roic +FROM [analytics].[manufacturers] man +JOIN roic_calc r ON r.id = man.id; + +SELECT + COUNT(*) AS total, + COUNT(roic_norm) AS with_roic, + COUNT(*) - COUNT(roic_norm) AS without_roic +FROM [analytics].[manufacturers]; diff --git a/analytics/mag_pbi/scripts/sp_recalc_roic.sql b/analytics/mag_pbi/scripts/sp_recalc_roic.sql new file mode 100644 index 0000000..f2d9832 --- /dev/null +++ b/analytics/mag_pbi/scripts/sp_recalc_roic.sql @@ -0,0 +1,62 @@ +-- ============================================================================= +-- Процедура пересчёта roic_norm для manufacturers +-- Параметры: @manufacturer_id INT = NULL — id строки в manufacturers; если NULL, пересчёт для всех +-- Формула: avgReturnDay = logistics_days + days_of_sales/2 +-- frozenDays = avgReturnDay - effectiveDeferralDays (из этапов оплаты) +-- roic_norm = 12 / (frozenDays/30) * 100 +-- ============================================================================= + +USE [mag_pbi] +GO + +IF OBJECT_ID(N'[analytics].[sp_recalc_roic]', N'P') IS NOT NULL + DROP PROCEDURE [analytics].[sp_recalc_roic]; +GO + +CREATE PROCEDURE [analytics].[sp_recalc_roic] + @manufacturer_id INT = NULL +AS +SET NOCOUNT ON; + +;WITH stage_agg AS ( + SELECT + manufacturer_id, + SUM([percent] / 100.0 * [days]) AS effective_deferral_days, + SUM([percent] / 100.0) AS total_percent + FROM [analytics].[manufacturer_payment_stage] + WHERE @manufacturer_id IS NULL OR manufacturer_id = @manufacturer_id + GROUP BY manufacturer_id +), +calc AS ( + SELECT + man.id, + man.days_of_sales, + man.logistics_days, + COALESCE(s.effective_deferral_days, 0) AS effective_deferral_days, + COALESCE(s.total_percent, 0) AS total_percent, + (ISNULL(man.logistics_days, 120) + ISNULL(man.days_of_sales, 180) / 2.0) AS avg_return_day + FROM [analytics].[manufacturers] man + LEFT JOIN stage_agg s ON s.manufacturer_id = man.id + WHERE @manufacturer_id IS NULL OR man.id = @manufacturer_id +), +roic_calc AS ( + SELECT + id, + CASE + WHEN total_percent <= 0 THEN NULL + WHEN (avg_return_day - effective_deferral_days) <= 0 THEN NULL + ELSE ROUND(12.0 / ((avg_return_day - effective_deferral_days) / 30.0) * 100.0, 2) + END AS new_roic + FROM calc +) +UPDATE man +SET man.roic_norm = r.new_roic +FROM [analytics].[manufacturers] man +JOIN roic_calc r ON r.id = man.id; + +SELECT @@ROWCOUNT AS updated_count; +GO + +-- Примеры вызова: +-- EXEC [analytics].[sp_recalc_roic]; -- пересчёт для всех +-- EXEC [analytics].[sp_recalc_roic] @manufacturer_id = 5; -- только для id=5 diff --git a/analytics/mag_pbi/tables/mag_pbi_tables.sql b/analytics/mag_pbi/tables/mag_pbi_tables.sql new file mode 100644 index 0000000..aa98e8d Binary files /dev/null and b/analytics/mag_pbi/tables/mag_pbi_tables.sql differ diff --git a/analytics/mag_pbi/views/mag_pbi_views.sql b/analytics/mag_pbi/views/mag_pbi_views.sql new file mode 100644 index 0000000..1df1827 Binary files /dev/null and b/analytics/mag_pbi/views/mag_pbi_views.sql differ diff --git a/analytics/pbi/model/report/.pbixproj.json b/analytics/pbi/model/report/.pbixproj.json new file mode 100644 index 0000000..7e28290 --- /dev/null +++ b/analytics/pbi/model/report/.pbixproj.json @@ -0,0 +1,5 @@ +{ + "version": "1.0", + "created": "2026-02-04T18:19:36.8541938+03:00", + "lastModified": "2026-02-04T18:19:37.3198069+03:00" +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Connections.json b/analytics/pbi/model/report/Connections.json new file mode 100644 index 0000000..2740b2f --- /dev/null +++ b/analytics/pbi/model/report/Connections.json @@ -0,0 +1,10 @@ +{ + "Version": 6, + "RemoteArtifacts": [ + { + "DatasetId": "f4e65e8a-12c8-4f22-864c-59603e40b45e", + "ReportId": "25e09a6e-0b0f-4a8a-a640-4331f9329c40" + } + ], + "OriginalWorkspaceObjectId": "dc155dfb-5cd1-4587-adfd-bde5c5298968" +} \ No newline at end of file diff --git a/analytics/pbi/model/report/DiagramLayout.json b/analytics/pbi/model/report/DiagramLayout.json new file mode 100644 index 0000000..cbf0197 --- /dev/null +++ b/analytics/pbi/model/report/DiagramLayout.json @@ -0,0 +1,1274 @@ +{ + "version": "1.1.0", + "diagrams": [ + { + "ordinal": 0, + "scrollPosition": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "location": { + "x": 856.22444097511425, + "y": 389.55821729990259 + }, + "nodeIndex": "Номенклатура", + "nodeLineageTag": "f50f43b8-653f-4068-88a3-0ada40f333a9", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 12, + "expandedHeight": 300 + }, + { + "location": { + "x": 333.84477886671806, + "y": 261.69057158549634 + }, + "nodeIndex": "Партнер", + "nodeLineageTag": "97e02e8a-24d7-460f-a5d4-380f0994e0c4", + "size": { + "height": 200, + "width": 234 + }, + "zIndex": 13, + "expandedHeight": 300 + }, + { + "location": { + "x": 288.1722637728721, + "y": 943.01405790699573 + }, + "nodeIndex": "Стоимость МП", + "nodeLineageTag": "7582b25e-0a47-4bd4-998d-ad7beb18db6d", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 14, + "expandedHeight": 300 + }, + { + "location": { + "x": 1715.1829989146879, + "y": 226.27094844324148 + }, + "nodeIndex": "crm_company_uf", + "nodeLineageTag": "fd78159b-18fa-40a9-970a-1470a125bad3", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 15, + "expandedHeight": 128 + }, + { + "location": { + "x": 1130.3166562159849, + "y": 0 + }, + "nodeIndex": "Основной отчет", + "nodeLineageTag": "2d43f3dd-0ea9-4290-8d89-3174dc2dc1da", + "size": { + "height": 72, + "width": 234 + }, + "zIndex": 3, + "expandedHeight": 300 + }, + { + "location": { + "x": 1008.4916974160167, + "y": 203.17770862374468 + }, + "nodeIndex": "Группы", + "nodeLineageTag": "085eeae7-b80c-4f6e-b69a-6cb3c636ab1e", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 25, + "expandedHeight": 300 + }, + { + "location": { + "x": 454.31072127633752, + "y": 624.985893116132 + }, + "nodeIndex": "Себестоимость", + "nodeLineageTag": "14d56775-0ee6-4ae1-af81-db38504b0997", + "size": { + "height": 224, + "width": 234 + }, + "zIndex": 19, + "expandedHeight": 300 + }, + { + "location": { + "x": 1289.0151811161079, + "y": 260.4741026736952 + }, + "nodeIndex": "Остатки", + "nodeLineageTag": "8d7e8c56-9dcb-4c28-b191-4737cd281542", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 4, + "expandedHeight": 272 + }, + { + "location": { + "x": 56.340787032174546, + "y": 674.10197715650111 + }, + "nodeIndex": "Заявки на оплату", + "nodeLineageTag": "cf134e75-cc78-416f-a1c4-a3752a52eff1", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 5, + "expandedHeight": 300 + }, + { + "location": { + "x": 1700.2647080298225, + "y": 380.26815647414179 + }, + "nodeIndex": "Параметр цена продажи, %", + "nodeLineageTag": "567240c7-beb9-460f-adb6-dc71a6b3306f", + "size": { + "height": 72, + "width": 234 + }, + "zIndex": 6, + "expandedHeight": 224 + }, + { + "location": { + "x": 406.1462596814074, + "y": 18.695727397596468 + }, + "nodeIndex": "План продаж менеджеров", + "nodeLineageTag": "730b70a2-916d-410b-8ccd-6a28377b1d5f", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 21, + "expandedHeight": 300 + }, + { + "location": { + "x": 1406.1557649795775, + "y": 0 + }, + "nodeIndex": "План продаж по группам", + "nodeLineageTag": "e5099f33-fe37-44c8-8fc3-d31668a2913f", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 7, + "expandedHeight": 300 + }, + { + "location": { + "x": 1264.1750442241512, + "y": 754.45840881409413 + }, + "nodeIndex": "Закупки", + "nodeLineageTag": "3b808b20-2111-4e80-9c03-a234a8b34733", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 26, + "expandedHeight": 300 + }, + { + "location": { + "x": 1393.9196486731632, + "y": 984.37919495128688 + }, + "nodeIndex": "Организация", + "nodeLineageTag": "445da135-b7ce-41de-a01b-f652726fbeda", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 8, + "expandedHeight": 200 + }, + { + "location": { + "x": 861.4335883379548, + "y": 52.230858939218265 + }, + "nodeIndex": "ПРАЙСлист", + "nodeLineageTag": "1c432e4c-6774-47b9-a4e5-46ccccc3084a", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 20, + "expandedHeight": 296 + }, + { + "location": { + "x": 645.2235789234087, + "y": 255.0265573547602 + }, + "nodeIndex": ".Календарь", + "nodeLineageTag": "fa15f6a2-9f96-4009-a5f4-ba8eaed6c41f", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 24, + "expandedHeight": 224 + }, + { + "location": { + "x": 1698.5032190149034, + "y": 0 + }, + "nodeIndex": "Отзывы клиентов", + "nodeLineageTag": "e203fedd-13d1-4354-93b1-a4029329da19", + "size": { + "height": 72, + "width": 234 + }, + "zIndex": 10, + "expandedHeight": 300 + }, + { + "location": { + "x": 1397.2946535990513, + "y": 422.51108795463841 + }, + "nodeIndex": "mp остатки", + "nodeLineageTag": "0d2dd773-f3b9-4998-a61e-4c0ee3b786f7", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 17, + "expandedHeight": 272 + }, + { + "location": { + "x": 879.52645993747183, + "y": 646.08722694057167 + }, + "nodeIndex": "mp аналитика продаж", + "nodeLineageTag": "58250bbb-338e-4a45-893e-194a83401242", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 11, + "expandedHeight": 300 + }, + { + "location": { + "x": 0, + "y": 66.03828416218451 + }, + "nodeIndex": "Менеджеры", + "nodeLineageTag": "def64f4b-cbb7-4474-ac96-3666666a1096", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 23, + "expandedHeight": 152 + }, + { + "location": { + "x": 861.46790242389773, + "y": 875.62787424427336 + }, + "nodeIndex": "Упущенные продажи", + "nodeLineageTag": "3971542f-0c46-485b-9c48-73006d99f2be", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 22, + "expandedHeight": 300 + }, + { + "location": { + "x": 1715.3846898844733, + "y": 118.27935590649554 + }, + "nodeIndex": "Расходы по годам", + "nodeLineageTag": "fd14666a-afa4-4e1e-b839-07b6214ab536", + "size": { + "height": 72, + "width": 234 + }, + "zIndex": 1, + "expandedHeight": 272 + }, + { + "location": { + "x": 1557.5020243171532, + "y": 773.66967180124664 + }, + "nodeIndex": "Заказы все", + "nodeLineageTag": "27466267-3e13-47a0-9e7b-4f6283bee193", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 2, + "expandedHeight": 300 + }, + { + "location": { + "x": 1708.9772899451859, + "y": 485.93002622980629 + }, + "nodeIndex": "mp реклама", + "nodeLineageTag": "6204a654-5807-4a4b-b334-e584c554211f", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 1399.6889244439476, + "y": 127.60354121010988 + }, + "nodeIndex": "План маркеты", + "nodeLineageTag": "0f193589-de81-448a-9dec-947bcb7e02e9", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 176 + }, + { + "location": { + "x": 1125.8010546698013, + "y": 529.186820587779 + }, + "nodeIndex": "Резервы", + "nodeLineageTag": "66ec7641-9058-4f7a-9c9c-83c8bc3e1b61", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 200 + }, + { + "location": { + "x": 1999.3846898844733, + "y": 409.50702895349787 + }, + "nodeIndex": "Я.Директ расходы", + "size": { + "height": 300, + "width": 234 + }, + "zIndex": 0 + }, + { + "location": { + "x": 2283.3846898844731, + "y": 447.50702895349787 + }, + "nodeIndex": "Я.Директ заказы", + "size": { + "height": 224, + "width": 234 + }, + "zIndex": 0 + }, + { + "location": {}, + "nodeIndex": "mp узел", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0 + }, + { + "location": {}, + "nodeIndex": "mp оборот", + "size": { + "height": 200, + "width": 234 + }, + "zIndex": 0 + } + ], + "name": "Все таблицы", + "zoomValue": 44.489226033719291, + "pinKeyFieldsToTop": false, + "showExtraHeaderInfo": false, + "hideKeyFieldsWhenCollapsed": false, + "tablesLocked": false + }, + { + "ordinal": 1, + "scrollPosition": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "location": { + "x": 278.82072939327463, + "y": 0 + }, + "nodeIndex": "Себестоимость", + "nodeLineageTag": "14d56775-0ee6-4ae1-af81-db38504b0997", + "size": { + "height": 224, + "width": 234 + }, + "zIndex": 6, + "expandedHeight": 300 + }, + { + "location": { + "x": 576.85444350025887, + "y": 0 + }, + "nodeIndex": "Номенклатура", + "nodeLineageTag": "f50f43b8-653f-4068-88a3-0ada40f333a9", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 1, + "expandedHeight": 300 + }, + { + "location": { + "x": 579.30497128726233, + "y": 150.23186583948245 + }, + "nodeIndex": "Партнер", + "nodeLineageTag": "97e02e8a-24d7-460f-a5d4-380f0994e0c4", + "size": { + "height": 200, + "width": 234 + }, + "zIndex": 4, + "expandedHeight": 300 + }, + { + "location": { + "x": 0, + "y": 0 + }, + "nodeIndex": "Организация", + "nodeLineageTag": "445da135-b7ce-41de-a01b-f652726fbeda", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 2, + "expandedHeight": 200 + }, + { + "location": { + "x": 273, + "y": 313.79564757385549 + }, + "nodeIndex": ".Календарь", + "nodeLineageTag": "fa15f6a2-9f96-4009-a5f4-ba8eaed6c41f", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 3, + "expandedHeight": 224 + } + ], + "name": "Себестоимость", + "zoomValue": 100, + "pinKeyFieldsToTop": false, + "showExtraHeaderInfo": false, + "hideKeyFieldsWhenCollapsed": false, + "tablesLocked": false + }, + { + "ordinal": 2, + "scrollPosition": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "location": { + "x": 334.17858572069377, + "y": 162.93565687764863 + }, + "nodeIndex": "Закупки", + "nodeLineageTag": "3b808b20-2111-4e80-9c03-a234a8b34733", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 911.45841204098838, + "y": 137.92652400598126 + }, + "nodeIndex": "Заказы все", + "nodeLineageTag": "27466267-3e13-47a0-9e7b-4f6283bee193", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 50.006187814825424, + "y": 429.90011254954914 + }, + "nodeIndex": ".Календарь", + "nodeLineageTag": "fa15f6a2-9f96-4009-a5f4-ba8eaed6c41f", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 224 + }, + { + "location": { + "x": 618.39447550116085, + "y": 6.9547428984280941 + }, + "nodeIndex": "Номенклатура", + "nodeLineageTag": "f50f43b8-653f-4068-88a3-0ada40f333a9", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 50, + "y": -50 + }, + "nodeIndex": "Организация", + "nodeLineageTag": "445da135-b7ce-41de-a01b-f652726fbeda", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 200 + }, + { + "location": { + "x": 598.17799730451543, + "y": 389.07734323365776 + }, + "nodeIndex": "Партнер", + "nodeLineageTag": "97e02e8a-24d7-460f-a5d4-380f0994e0c4", + "size": { + "height": 200, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + } + ], + "name": "Закупки", + "zoomValue": 72.098030420636007, + "pinKeyFieldsToTop": false, + "showExtraHeaderInfo": false, + "hideKeyFieldsWhenCollapsed": false, + "tablesLocked": false + }, + { + "ordinal": 3, + "scrollPosition": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "location": { + "x": 319.85173587601759, + "y": 185.55473625676396 + }, + "nodeIndex": "Номенклатура", + "nodeLineageTag": "f50f43b8-653f-4068-88a3-0ada40f333a9", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 1, + "expandedHeight": 300 + }, + { + "location": { + "x": 0, + "y": 416.14285714285728 + }, + "nodeIndex": "Стоимость МП", + "nodeLineageTag": "7582b25e-0a47-4bd4-998d-ad7beb18db6d", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 2, + "expandedHeight": 300 + }, + { + "location": { + "x": 0, + "y": 0 + }, + "nodeIndex": "Себестоимость", + "nodeLineageTag": "14d56775-0ee6-4ae1-af81-db38504b0997", + "size": { + "height": 224, + "width": 234 + }, + "zIndex": 3, + "expandedHeight": 300 + }, + { + "location": { + "x": 264.49934796494404, + "y": 0 + }, + "nodeIndex": "Группы", + "nodeLineageTag": "085eeae7-b80c-4f6e-b69a-6cb3c636ab1e", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 4, + "expandedHeight": 300 + }, + { + "location": { + "x": 577.89370914977928, + "y": 399.66399436463456 + }, + "nodeIndex": "Остатки", + "nodeLineageTag": "8d7e8c56-9dcb-4c28-b191-4737cd281542", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 5, + "expandedHeight": 272 + }, + { + "location": { + "x": 836.30168327901436, + "y": 370.14285714285711 + }, + "nodeIndex": "mp остатки", + "nodeLineageTag": "0d2dd773-f3b9-4998-a61e-4c0ee3b786f7", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 11, + "expandedHeight": 272 + }, + { + "location": { + "x": 0, + "y": 611.60209175832654 + }, + "nodeIndex": "mp аналитика продаж", + "nodeLineageTag": "58250bbb-338e-4a45-893e-194a83401242", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 6, + "expandedHeight": 300 + }, + { + "location": { + "x": 522, + "y": 0 + }, + "nodeIndex": "ПРАЙСлист", + "nodeLineageTag": "1c432e4c-6774-47b9-a4e5-46ccccc3084a", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 7, + "expandedHeight": 296 + }, + { + "location": { + "x": 0, + "y": 235.91428922895591 + }, + "nodeIndex": "Упущенные продажи", + "nodeLineageTag": "3971542f-0c46-485b-9c48-73006d99f2be", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 8, + "expandedHeight": 300 + }, + { + "location": { + "x": 849.87963136149119, + "y": 1.4285714285714306 + }, + "nodeIndex": "Закупки", + "nodeLineageTag": "3b808b20-2111-4e80-9c03-a234a8b34733", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 10, + "expandedHeight": 300 + }, + { + "location": { + "x": 845.717208859902, + "y": 201.42857142857144 + }, + "nodeIndex": "Заказы все", + "nodeLineageTag": "27466267-3e13-47a0-9e7b-4f6283bee193", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 9, + "expandedHeight": 300 + }, + { + "location": { + "x": 578.28571537562789, + "y": 560.71428571428578 + }, + "nodeIndex": "Резервы", + "nodeLineageTag": "66ec7641-9058-4f7a-9c9c-83c8bc3e1b61", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 248 + } + ], + "name": "Номенклатура", + "zoomValue": 70, + "pinKeyFieldsToTop": false, + "showExtraHeaderInfo": false, + "hideKeyFieldsWhenCollapsed": false, + "tablesLocked": false + }, + { + "ordinal": 4, + "scrollPosition": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "location": { + "x": 463.20931009254724, + "y": 312.10342270120651 + }, + "nodeIndex": "Партнер", + "nodeLineageTag": "97e02e8a-24d7-460f-a5d4-380f0994e0c4", + "size": { + "height": 200, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 0, + "y": 322.867331076958 + }, + "nodeIndex": "Стоимость МП", + "nodeLineageTag": "7582b25e-0a47-4bd4-998d-ad7beb18db6d", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 0, + "y": 17.698512508729767 + }, + "nodeIndex": "Себестоимость", + "nodeLineageTag": "14d56775-0ee6-4ae1-af81-db38504b0997", + "size": { + "height": 224, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 801.27195927338471, + "y": 574.07636918212324 + }, + "nodeIndex": "Заявки на оплату", + "nodeLineageTag": "cf134e75-cc78-416f-a1c4-a3752a52eff1", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 322.6838489227473, + "y": 0 + }, + "nodeIndex": "Менеджеры", + "nodeLineageTag": "def64f4b-cbb7-4474-ac96-3666666a1096", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 152 + }, + { + "location": { + "x": 734.28440040802957, + "y": 0 + }, + "nodeIndex": "Закупки", + "nodeLineageTag": "3b808b20-2111-4e80-9c03-a234a8b34733", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 67.4617591125649, + "y": 587.47302931263562 + }, + "nodeIndex": "Заказы все", + "nodeLineageTag": "27466267-3e13-47a0-9e7b-4f6283bee193", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + } + ], + "name": "Партнер", + "zoomValue": 67.802308211387924, + "pinKeyFieldsToTop": false, + "showExtraHeaderInfo": false, + "hideKeyFieldsWhenCollapsed": false, + "tablesLocked": false + }, + { + "ordinal": 5, + "scrollPosition": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "location": { + "x": 731.79923497418508, + "y": 380.348965964979 + }, + "nodeIndex": ".Календарь", + "nodeLineageTag": "fa15f6a2-9f96-4009-a5f4-ba8eaed6c41f", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 224 + }, + { + "location": { + "x": 624.024563493825, + "y": -50 + }, + "nodeIndex": "Стоимость МП", + "nodeLineageTag": "7582b25e-0a47-4bd4-998d-ad7beb18db6d", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 339.86216137017868, + "y": 46.498922391333508 + }, + "nodeIndex": "Себестоимость", + "nodeLineageTag": "14d56775-0ee6-4ae1-af81-db38504b0997", + "size": { + "height": 224, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 124.75191273584787, + "y": 413.09132409722645 + }, + "nodeIndex": "Заявки на оплату", + "nodeLineageTag": "cf134e75-cc78-416f-a1c4-a3752a52eff1", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 56.122105275656139, + "y": 209.7559982310361 + }, + "nodeIndex": "План продаж менеджеров", + "nodeLineageTag": "730b70a2-916d-410b-8ccd-6a28377b1d5f", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 304.62949194707193, + "y": 667.136404296038 + }, + "nodeIndex": "mp остатки", + "nodeLineageTag": "0d2dd773-f3b9-4998-a61e-4c0ee3b786f7", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 272 + }, + { + "location": { + "x": 658.93291216068769, + "y": 692.63638039081729 + }, + "nodeIndex": "mp аналитика продаж", + "nodeLineageTag": "58250bbb-338e-4a45-893e-194a83401242", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 1239.5219403790009, + "y": 134.64269632352392 + }, + "nodeIndex": "ПРАЙСлист", + "nodeLineageTag": "1c432e4c-6774-47b9-a4e5-46ccccc3084a", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 296 + }, + { + "location": { + "x": 1023.1824883911881, + "y": 624.56680923889 + }, + "nodeIndex": "Упущенные продажи", + "nodeLineageTag": "3971542f-0c46-485b-9c48-73006d99f2be", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 1267.2520811466998, + "y": 374.04138366473012 + }, + "nodeIndex": "Закупки", + "nodeLineageTag": "3b808b20-2111-4e80-9c03-a234a8b34733", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + } + ], + "name": "Календарь", + "zoomValue": 56.563138400491255, + "pinKeyFieldsToTop": false, + "showExtraHeaderInfo": false, + "hideKeyFieldsWhenCollapsed": false, + "tablesLocked": false + }, + { + "ordinal": 6, + "scrollPosition": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "location": { + "x": 901.0635684672518, + "y": 667.77185407253342 + }, + "nodeIndex": "mp аналитика продаж", + "nodeLineageTag": "58250bbb-338e-4a45-893e-194a83401242", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 1, + "expandedHeight": 300 + }, + { + "location": { + "x": 461.11882653339137, + "y": -50 + }, + "nodeIndex": "Номенклатура", + "nodeLineageTag": "f50f43b8-653f-4068-88a3-0ada40f333a9", + "size": { + "height": 128, + "width": 234 + }, + "zIndex": 2, + "expandedHeight": 300 + }, + { + "location": { + "x": 176.98728238226806, + "y": 6.2160781495917945 + }, + "nodeIndex": ".Календарь", + "nodeLineageTag": "fa15f6a2-9f96-4009-a5f4-ba8eaed6c41f", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 3, + "expandedHeight": 224 + }, + { + "location": { + "x": 50, + "y": 252.14321515749793 + }, + "nodeIndex": "mp остатки", + "nodeLineageTag": "0d2dd773-f3b9-4998-a61e-4c0ee3b786f7", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 5, + "expandedHeight": 272 + }, + { + "location": { + "x": 1116.6486804111864, + "y": 7.953611690738569 + }, + "nodeIndex": "Партнер", + "nodeLineageTag": "97e02e8a-24d7-460f-a5d4-380f0994e0c4", + "size": { + "height": 200, + "width": 234 + }, + "zIndex": 6, + "expandedHeight": 300 + }, + { + "location": { + "x": 784.078397523599, + "y": 0 + }, + "nodeIndex": "Организация", + "nodeLineageTag": "445da135-b7ce-41de-a01b-f652726fbeda", + "size": { + "height": 200, + "width": 234 + }, + "zIndex": 8 + }, + { + "location": { + "x": 270.74894072150448, + "y": 541.4919981410452 + }, + "nodeIndex": "mp реклама", + "nodeLineageTag": "6204a654-5807-4a4b-b334-e584c554211f", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 7, + "expandedHeight": 300 + } + ], + "name": "МП", + "zoomValue": 57.987299814218673, + "pinKeyFieldsToTop": false, + "showExtraHeaderInfo": false, + "hideKeyFieldsWhenCollapsed": false, + "tablesLocked": false + }, + { + "ordinal": 7, + "scrollPosition": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "location": { + "x": 336.62869602952946, + "y": 302.97185681962878 + }, + "nodeIndex": "mp узел", + "nodeLineageTag": "5fc1bba4-c923-4dff-9116-09c8bfccfff6", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 152 + }, + { + "location": { + "x": 716.53585436394167, + "y": 183.77251858355436 + }, + "nodeIndex": "Партнер", + "nodeLineageTag": "97e02e8a-24d7-460f-a5d4-380f0994e0c4", + "size": { + "height": 224, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 534.23407008970389, + "y": -50 + }, + "nodeIndex": "mp остатки", + "nodeLineageTag": "0d2dd773-f3b9-4998-a61e-4c0ee3b786f7", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 208.23895162812818, + "y": -49.775485418642916 + }, + "nodeIndex": "mp аналитика продаж", + "nodeLineageTag": "58250bbb-338e-4a45-893e-194a83401242", + "size": { + "height": 152, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 0, + "y": 215.08167563814186 + }, + "nodeIndex": "mp реклама", + "nodeLineageTag": "6204a654-5807-4a4b-b334-e584c554211f", + "size": { + "height": 176, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 300 + }, + { + "location": { + "x": 563.20782384973438, + "y": 508.16068530776022 + }, + "nodeIndex": "Организация", + "nodeLineageTag": "445da135-b7ce-41de-a01b-f652726fbeda", + "size": { + "height": 104, + "width": 234 + }, + "zIndex": 0, + "expandedHeight": 200 + } + ], + "name": "Макет 1", + "zoomValue": 80, + "pinKeyFieldsToTop": false, + "showExtraHeaderInfo": false, + "hideKeyFieldsWhenCollapsed": false, + "tablesLocked": false + } + ], + "selectedDiagram": "Макет 1", + "defaultDiagram": "Все таблицы" +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Model/cultures/ru-RU.tmdl b/analytics/pbi/model/report/Model/cultures/ru-RU.tmdl new file mode 100644 index 0000000..9bd6e7d --- /dev/null +++ b/analytics/pbi/model/report/Model/cultures/ru-RU.tmdl @@ -0,0 +1,3734 @@ +cultureInfo ru-RU + + linguisticMetadata = + { + "Version": "1.2.0", + "Language": "en-US", + "Entities": { + "номенклатура": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Terms": [ + { + "номенклатура": { + "State": "Generated" + } + } + ] + }, + "номенклатура.artic_id": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "_artic_id" + }, + "State": "Generated", + "Hidden": true, + "Terms": [ + { + "artic id": { + "State": "Generated" + } + }, + { + "_artic_id": { + "Type": "Noun", + "State": "Generated", + "Weight": 0.99 + } + }, + { + "artic identification": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "artic identity": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "artic identifier": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "artic credential": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.727 + } + } + ] + }, + "номенклатура.код_УТ": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Код УТ" + }, + "State": "Generated", + "Terms": [ + { + "код УТ": { + "State": "Generated" + } + } + ] + }, + "номенклатура.наименование": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Наименование" + }, + "State": "Generated", + "Terms": [ + { + "наименование": { + "State": "Generated" + } + } + ] + }, + "номенклатура.артикул": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Артикул" + }, + "State": "Generated", + "Terms": [ + { + "артикул": { + "State": "Generated" + } + } + ] + }, + "номенклатура.group_id": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "_group_id" + }, + "State": "Generated", + "Hidden": true, + "Terms": [ + { + "group id": { + "State": "Generated" + } + }, + { + "_group_id": { + "Type": "Noun", + "State": "Generated", + "Weight": 0.99 + } + }, + { + "group identification": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "group identity": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "group identifier": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "group credential": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.727 + } + }, + { + "category id": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.6 + } + }, + { + "organization id": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.6 + } + }, + { + "bracket id": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.582 + } + }, + { + "class id": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.582 + } + }, + { + "crew id": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.582 + } + }, + { + "team id": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.582 + } + } + ] + }, + "номенклатура.ценовая_группа": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Ценовая группа" + }, + "State": "Generated", + "Terms": [ + { + "ценовая группа": { + "State": "Generated" + } + } + ] + }, + "номенклатура.производитель": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Производитель" + }, + "State": "Generated", + "Terms": [ + { + "производитель": { + "State": "Generated" + } + } + ] + }, + "номенклатура.фото": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Фото" + }, + "State": "Generated", + "Terms": [ + { + "фото": { + "State": "Generated" + } + } + ] + }, + "номенклатура.менеджер_по_закупкам_2": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Менеджер по закупкам" + }, + "State": "Generated", + "Terms": [ + { + "менеджер по закупкам 2": { + "State": "Generated" + } + }, + { + "МенеджерПоЗакупкам2": { + "Type": "Noun", + "State": "Generated", + "Weight": 0.99 + } + } + ] + }, + "номенклатура.руководитель_направления": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "РуководительНаправления" + }, + "State": "Generated", + "Terms": [ + { + "руководитель направления": { + "State": "Generated" + } + }, + { + "РуководительНаправления": { + "Type": "Noun", + "State": "Generated", + "Weight": 0.99 + } + } + ] + }, + "номенклатура.базовая_упаковка": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Базовая упаковка" + }, + "State": "Generated", + "Terms": [ + { + "базовая упаковка": { + "State": "Generated" + } + } + ] + }, + "номенклатура.начало_продаж.изменение.иерархия_дат": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "VariationSource": "начало продаж", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат" + }, + "State": "Generated", + "Terms": [ + { + "иерархия дат": { + "State": "Generated" + } + } + ] + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.год": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "VariationSource": "начало продаж", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат", + "HierarchyLevel": "Год" + }, + "State": "Generated", + "Terms": [ + { + "год": { + "State": "Generated" + } + }, + { + "начало продаж год": { + "State": "Generated" + } + } + ] + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.квартал": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "VariationSource": "начало продаж", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат", + "HierarchyLevel": "Квартал" + }, + "State": "Generated", + "Terms": [ + { + "квартал": { + "State": "Generated" + } + }, + { + "начало продаж квартал": { + "State": "Generated" + } + } + ] + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.месяц": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "VariationSource": "начало продаж", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат", + "HierarchyLevel": "Месяц" + }, + "State": "Generated", + "Terms": [ + { + "месяц": { + "State": "Generated" + } + }, + { + "начало продаж месяц": { + "State": "Generated" + } + } + ] + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.день": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "VariationSource": "начало продаж", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат", + "HierarchyLevel": "День" + }, + "State": "Generated", + "Terms": [ + { + "день": { + "State": "Generated" + } + }, + { + "начало продаж день": { + "State": "Generated" + } + } + ] + }, + "номенклатура.АБС_статус": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "ABC статус 12м" + }, + "State": "Generated", + "Terms": [ + { + "АБС статус": { + "State": "Generated" + } + } + ] + }, + "партнер": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Terms": [ + { + "партнер": { + "State": "Generated" + } + } + ] + }, + "партнер.partner_id": { + "Binding": { + "ConceptualEntity": "Партнер", + "ConceptualProperty": "partner_id" + }, + "State": "Generated", + "Hidden": true, + "Terms": [ + { + "partner id": { + "State": "Generated" + } + }, + { + "partner_id": { + "Type": "Noun", + "State": "Generated", + "Weight": 0.99 + } + }, + { + "partner": { + "State": "Generated", + "Weight": 0.97 + } + }, + { + "partner identification": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "partner identity": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "partner identifier": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "partner credential": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.727 + } + }, + { + "wife": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.491 + } + }, + { + "lover": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.491 + } + }, + { + "spouse": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.476 + } + }, + { + "companion": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.476 + } + }, + { + "husband": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.476 + } + }, + { + "mate": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.476 + } + } + ] + }, + "партнер.партнер": { + "Binding": { + "ConceptualEntity": "Партнер", + "ConceptualProperty": "Партнер" + }, + "State": "Generated", + "Terms": [ + { + "партнер": { + "State": "Generated" + } + }, + { + "партнер name": { + "State": "Generated" + } + } + ] + }, + "партнер.регион": { + "Binding": { + "ConceptualEntity": "Партнер", + "ConceptualProperty": "Регион" + }, + "State": "Generated", + "Terms": [ + { + "регион": { + "State": "Generated" + } + } + ] + }, + "партнер.manager_id": { + "Binding": { + "ConceptualEntity": "Партнер", + "ConceptualProperty": "manager_id" + }, + "State": "Generated", + "Hidden": true, + "Terms": [ + { + "manager id": { + "State": "Generated" + } + }, + { + "manager_id": { + "Type": "Noun", + "State": "Generated", + "Weight": 0.99 + } + }, + { + "manager": { + "State": "Generated", + "Weight": 0.97 + } + }, + { + "manager identification": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "manager identity": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "manager identifier": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.75 + } + }, + { + "manager credential": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.727 + } + }, + { + "director": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.491 + } + }, + { + "administrator": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.491 + } + }, + { + "supervisor": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.491 + } + }, + { + "leader": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.491 + } + }, + { + "boss": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.476 + } + }, + { + "executive": { + "Type": "Noun", + "State": "Suggested", + "Weight": 0.476 + } + } + ] + }, + "партнер.да_нет_клиент": { + "Binding": { + "ConceptualEntity": "Партнер", + "ConceptualProperty": "Да/Нет Клиент" + }, + "State": "Generated", + "Terms": [ + { + "да/нет клиент": { + "State": "Generated" + } + }, + { + "да": { + "State": "Generated", + "Weight": 0.97 + } + }, + { + "да нет клиент": { + "State": "Generated", + "Weight": 0.97 + } + }, + { + "нет клиент": { + "State": "Generated", + "Weight": 0.97 + } + } + ] + }, + "партнер.да_нет_поставщик": { + "Binding": { + "ConceptualEntity": "Партнер", + "ConceptualProperty": "Да/Нет Поставщик" + }, + "State": "Generated", + "Terms": [ + { + "да/нет поставщик": { + "State": "Generated" + } + }, + { + "да": { + "State": "Generated", + "Weight": 0.97 + } + }, + { + "да нет поставщик": { + "State": "Generated", + "Weight": 0.97 + } + }, + { + "нет поставщик": { + "State": "Generated", + "Weight": 0.97 + } + } + ] + }, + "партнер.да_нет_конкурент": { + "Binding": { + "ConceptualEntity": "Партнер", + "ConceptualProperty": "Да/Нет Конкурент" + }, + "State": "Generated", + "Terms": [ + { + "да/нет конкурент": { + "State": "Generated" + } + }, + { + "да": { + "State": "Generated", + "Weight": 0.97 + } + }, + { + "да нет конкурент": { + "State": "Generated", + "Weight": 0.97 + } + }, + { + "нет конкурент": { + "State": "Generated", + "Weight": 0.97 + } + } + ] + }, + "номенклатура.статус": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Статус" + }, + "State": "Generated", + "Terms": [ + { + "статус": { + "State": "Generated" + } + } + ] + }, + "номенклатура.коллекция": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Коллекция" + }, + "State": "Generated", + "Terms": [ + { + "коллекция": { + "State": "Generated" + } + } + ] + }, + "номенклатура.бренд": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Бренд" + }, + "State": "Generated", + "Terms": [ + { + "бренд": { + "State": "Generated" + } + } + ] + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат": { + "Binding": { + "ConceptualEntity": "Партнер", + "VariationSource": "Дата первого заказа", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат" + }, + "State": "Generated", + "Terms": [ + { + "иерархия дат": { + "State": "Generated" + } + } + ] + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.год": { + "Binding": { + "ConceptualEntity": "Партнер", + "VariationSource": "Дата первого заказа", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат", + "HierarchyLevel": "Год" + }, + "State": "Generated", + "Terms": [ + { + "год": { + "State": "Generated" + } + }, + { + "дата первого заказа год": { + "State": "Generated" + } + } + ] + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал": { + "Binding": { + "ConceptualEntity": "Партнер", + "VariationSource": "Дата первого заказа", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат", + "HierarchyLevel": "Квартал" + }, + "State": "Generated", + "Terms": [ + { + "квартал": { + "State": "Generated" + } + }, + { + "дата первого заказа квартал": { + "State": "Generated" + } + } + ] + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц": { + "Binding": { + "ConceptualEntity": "Партнер", + "VariationSource": "Дата первого заказа", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат", + "HierarchyLevel": "Месяц" + }, + "State": "Generated", + "Terms": [ + { + "месяц": { + "State": "Generated" + } + }, + { + "дата первого заказа месяц": { + "State": "Generated" + } + } + ] + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.день": { + "Binding": { + "ConceptualEntity": "Партнер", + "VariationSource": "Дата первого заказа", + "VariationSet": "Изменение", + "Hierarchy": "Иерархия дат", + "HierarchyLevel": "День" + }, + "State": "Generated", + "Terms": [ + { + "день": { + "State": "Generated" + } + }, + { + "дата первого заказа день": { + "State": "Generated" + } + } + ] + }, + "номенклатура.знаменатель_веса": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Знаменатель веса" + }, + "State": "Generated", + "Terms": [ + { + "знаменатель веса": { + "State": "Generated" + } + } + ] + }, + "номенклатура.числитель_веса": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Числитель веса" + }, + "State": "Generated", + "Terms": [ + { + "числитель веса": { + "State": "Generated" + } + } + ] + }, + "номенклатура.знаменатель_объема": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Знаменатель объема" + }, + "State": "Generated", + "Terms": [ + { + "знаменатель объема": { + "State": "Generated" + } + } + ] + }, + "номенклатура.числитель_объема": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Числитель объема" + }, + "State": "Generated", + "Terms": [ + { + "числитель объема": { + "State": "Generated" + } + } + ] + }, + "номенклатура.вид_номенклатуры": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Вид номенклатуры" + }, + "State": "Generated", + "Terms": [ + { + "вид номенклатуры": { + "State": "Generated" + } + } + ] + }, + "номенклатура.сквозной_цвет": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Сквозной цвет" + }, + "State": "Generated", + "Terms": [ + { + "сквозной цвет": { + "State": "Generated" + } + } + ] + }, + "номенклатура.объем": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "ConceptualProperty": "Объем" + }, + "State": "Generated", + "Terms": [ + { + "объем": { + "State": "Generated" + } + } + ] + }, + "номенклатура.начало_продаж_иерархия": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "Hierarchy": "начало продаж Иерархия" + }, + "State": "Generated", + "Terms": [ + { + "начало продаж иерархия": { + "State": "Generated" + } + } + ], + "SemanticType": "Time" + }, + "номенклатура.начало_продаж_иерархия.начало_продаж": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "Hierarchy": "начало продаж Иерархия", + "HierarchyLevel": "начало продаж" + }, + "State": "Generated", + "Terms": [ + { + "начало продаж": { + "State": "Generated" + } + } + ], + "SemanticType": "Time" + }, + "номенклатура.начало_продаж_иерархия.знаменатель_объема": { + "Binding": { + "ConceptualEntity": "Номенклатура", + "Hierarchy": "начало продаж Иерархия", + "HierarchyLevel": "Знаменатель объема" + }, + "State": "Generated", + "Terms": [ + { + "знаменатель объема": { + "State": "Generated" + } + } + ], + "SemanticType": "Time" + } + }, + "Relationships": { + "партнер_is_named_партнер": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.партнер": { + "Target": { + "Entity": "партнер.партнер" + } + } + }, + "Phrasings": [ + { + "Name": { + "Subject": { + "Role": "партнер" + }, + "Name": { + "Role": "партнер.партнер" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.партнер" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_код_УТ": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.код_УТ": { + "Target": { + "Entity": "номенклатура.код_УТ" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.код_УТ" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_наименование": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.наименование": { + "Target": { + "Entity": "номенклатура.наименование" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.наименование" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_артикул": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.артикул": { + "Target": { + "Entity": "номенклатура.артикул" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.артикул" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_ценовая_группа": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.ценовая_группа": { + "Target": { + "Entity": "номенклатура.ценовая_группа" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.ценовая_группа" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_производитель": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.производитель": { + "Target": { + "Entity": "номенклатура.производитель" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.производитель" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_ссылка_на_карточку_товара": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.ссылка_на_карточку_товара": { + "Target": { + "Entity": "номенклатура.ссылка_на_карточку_товара" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.ссылка_на_карточку_товара" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_фото": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.фото": { + "Target": { + "Entity": "номенклатура.фото" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.фото" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_товарный_менеджера": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.товарный_менеджера": { + "Target": { + "Entity": "номенклатура.товарный_менеджера" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.товарный_менеджера" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_менеджер_по_закупкам_2": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.менеджер_по_закупкам_2": { + "Target": { + "Entity": "номенклатура.менеджер_по_закупкам_2" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.менеджер_по_закупкам_2" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_руководитель_направления": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.руководитель_направления": { + "Target": { + "Entity": "номенклатура.руководитель_направления" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.руководитель_направления" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_базовая_упаковка": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.базовая_упаковка": { + "Target": { + "Entity": "номенклатура.базовая_упаковка" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.базовая_упаковка" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_недель_в_продаже": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.недель_в_продаже": { + "Target": { + "Entity": "номенклатура.недель_в_продаже" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.недель_в_продаже" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_норма_продаж_шт_в_день": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.норма_продаж_шт_в_день": { + "Target": { + "Entity": "номенклатура.норма_продаж_шт_в_день" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.норма_продаж_шт_в_день" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_норма_продаж_упак_в_день": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.норма_продаж_упак_в_день": { + "Target": { + "Entity": "номенклатура.норма_продаж_упак_в_день" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.норма_продаж_упак_в_день" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_всего_продано_шт": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.всего_продано_шт": { + "Target": { + "Entity": "номенклатура.всего_продано_шт" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.всего_продано_шт" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_всего_продано_упаковок": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.всего_продано_упаковок": { + "Target": { + "Entity": "номенклатура.всего_продано_упаковок" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.всего_продано_упаковок" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_дней_в_продаже": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.дней_в_продаже": { + "Target": { + "Entity": "номенклатура.дней_в_продаже" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.дней_в_продаже" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_начало_продаж": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.начало_продаж": { + "Target": { + "Entity": "номенклатура.начало_продаж" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.начало_продаж" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_остаток_продаж_дн": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.остаток_продаж_дн": { + "Target": { + "Entity": "номенклатура.остаток_продаж_дн" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.остаток_продаж_дн" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_АБС_статус": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.АБС_статус": { + "Target": { + "Entity": "номенклатура.АБС_статус" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.АБС_статус" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_последняя_цена": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.последняя_цена": { + "Target": { + "Entity": "номенклатура.последняя_цена" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.последняя_цена" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_плана_маржи": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.плана_маржи": { + "Target": { + "Entity": "номенклатура.плана_маржи" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.плана_маржи" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_коэф_плана_по_марже": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.коэф_плана_по_марже": { + "Target": { + "Entity": "номенклатура.коэф_плана_по_марже" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.коэф_плана_по_марже" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_зп": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.зп": { + "Target": { + "Entity": "номенклатура.зп" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.зп" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_маржа__коэф": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.маржа__коэф": { + "Target": { + "Entity": "номенклатура.маржа__коэф" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.маржа__коэф" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_регион": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.регион": { + "Target": { + "Entity": "партнер.регион" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.регион" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_направление": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.направление": { + "Target": { + "Entity": "партнер.направление" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.направление" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_да_нет_клиент": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.да_нет_клиент": { + "Target": { + "Entity": "партнер.да_нет_клиент" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.да_нет_клиент" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_да_нет_поставщик": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.да_нет_поставщик": { + "Target": { + "Entity": "партнер.да_нет_поставщик" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.да_нет_поставщик" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_да_нет_конкурент": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.да_нет_конкурент": { + "Target": { + "Entity": "партнер.да_нет_конкурент" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.да_нет_конкурент" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_таблица_продаж_остаток_продаж_дн_": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "таблица_продаж.остаток_продаж_дн_": { + "Target": { + "Entity": "таблица_продаж.остаток_продаж_дн_" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "таблица_продаж.остаток_продаж_дн_" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_статус": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.статус": { + "Target": { + "Entity": "номенклатура.статус" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.статус" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_коллекция": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.коллекция": { + "Target": { + "Entity": "номенклатура.коллекция" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.коллекция" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_продажи_предыдущий_год_единиц_мес": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_продажи_предыдущий_год_единиц_мес": { + "Target": { + "Entity": "номенклатура.KPI_продажи_предыдущий_год_единиц_мес" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_продажи_предыдущий_год_единиц_мес" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_излишек_китай": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_излишек_китай": { + "Target": { + "Entity": "номенклатура.KPI_излишек_китай" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_излишек_китай" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_дней_с_первого_появления": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_дней_с_первого_появления": { + "Target": { + "Entity": "номенклатура.KPI_дней_с_первого_появления" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_дней_с_первого_появления" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_маржа_предыдущий_год": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_маржа_предыдущий_год": { + "Target": { + "Entity": "номенклатура.KPI_маржа_предыдущий_год" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_маржа_предыдущий_год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_план_торг__надбавка": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_план_торг__надбавка": { + "Target": { + "Entity": "номенклатура.KPI_план_торг__надбавка" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_план_торг__надбавка" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_маржа_текущий_год": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_маржа_текущий_год": { + "Target": { + "Entity": "номенклатура.KPI_маржа_текущий_год" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_маржа_текущий_год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_продажи_текущий_год": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_продажи_текущий_год": { + "Target": { + "Entity": "номенклатура.KPI_продажи_текущий_год" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_продажи_текущий_год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_наименование": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.наименование": { + "Target": { + "Entity": "партнер.наименование" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.наименование" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_бренд": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.бренд": { + "Target": { + "Entity": "номенклатура.бренд" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.бренд" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_продажи_предыдущий_год": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_продажи_предыдущий_год": { + "Target": { + "Entity": "номенклатура.KPI_продажи_предыдущий_год" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_продажи_предыдущий_год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI__маржи_прошлый_год": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI__маржи_прошлый_год": { + "Target": { + "Entity": "номенклатура.KPI__маржи_прошлый_год" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI__маржи_прошлый_год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI__маржи_текущий_год": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI__маржи_текущий_год": { + "Target": { + "Entity": "номенклатура.KPI__маржи_текущий_год" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI__маржи_текущий_год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_KPI_план_продаж": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.KPI_план_продаж": { + "Target": { + "Entity": "номенклатура.KPI_план_продаж" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.KPI_план_продаж" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_дата_первого_заказа": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.дата_первого_заказа": { + "Target": { + "Entity": "партнер.дата_первого_заказа" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.дата_первого_заказа" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_знаменатель_веса": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.знаменатель_веса": { + "Target": { + "Entity": "номенклатура.знаменатель_веса" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.знаменатель_веса" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_числитель_веса": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.числитель_веса": { + "Target": { + "Entity": "номенклатура.числитель_веса" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.числитель_веса" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_знаменатель_объема": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.знаменатель_объема": { + "Target": { + "Entity": "номенклатура.знаменатель_объема" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.знаменатель_объема" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_числитель_объема": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.числитель_объема": { + "Target": { + "Entity": "номенклатура.числитель_объема" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.числитель_объема" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_вид_номенклатуры": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.вид_номенклатуры": { + "Target": { + "Entity": "номенклатура.вид_номенклатуры" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.вид_номенклатуры" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_сквозной_цвет": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.сквозной_цвет": { + "Target": { + "Entity": "номенклатура.сквозной_цвет" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.сквозной_цвет" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_объем": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.объем": { + "Target": { + "Entity": "номенклатура.объем" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.объем" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_начало_продаж_иерархия": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "номенклатура.начало_продаж_иерархия": { + "Target": { + "Entity": "номенклатура.начало_продаж_иерархия" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "номенклатура.начало_продаж_иерархия" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_когорта": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "партнер.когорта": { + "Target": { + "Entity": "партнер.когорта" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "партнер.когорта" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_has_группы": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура": { + "Target": { + "Entity": "номенклатура" + } + }, + "группы": { + "Target": { + "Entity": "группы" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура" + }, + "Object": { + "Role": "группы" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "группы" + }, + "Object": { + "Role": "номенклатура" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_has_менеджеры_1С": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер": { + "Target": { + "Entity": "партнер" + } + }, + "менеджеры_1С": { + "Target": { + "Entity": "менеджеры_1С" + }, + "Nouns": [ + { + "manager": {} + } + ] + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер" + }, + "Object": { + "Role": "менеджеры_1С" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "менеджеры_1С" + }, + "Object": { + "Role": "партнер" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_has_изменение_иерархия_дат": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж": { + "Target": { + "Entity": "номенклатура.начало_продаж" + } + }, + "номенклатура.начало_продаж.изменение.иерархия_дат": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_изменение_иерархия_дат_has_год": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж.изменение.иерархия_дат": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат" + } + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.год": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.год" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_изменение_иерархия_дат_has_квартал": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж.изменение.иерархия_дат": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат" + } + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.квартал": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_изменение_иерархия_дат_has_месяц": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж.изменение.иерархия_дат": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат" + } + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.месяц": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_изменение_иерархия_дат_has_день": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж.изменение.иерархия_дат": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат" + } + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.день": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.день" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.день" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_изменение_иерархия_дат_год_has_номенклатура_начало_продаж_изменение_иерархия_дат_квартал": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж.изменение.иерархия_дат.год": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.год" + } + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.квартал": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.год" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.год" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Preposition": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + }, + "Prepositions": [ + { + "in": {} + } + ], + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_изменение_иерархия_дат_квартал_has_номенклатура_начало_продаж_изменение_иерархия_дат_месяц": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж.изменение.иерархия_дат.квартал": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + } + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.месяц": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Preposition": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + }, + "Prepositions": [ + { + "in": {} + } + ], + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.квартал" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_изменение_иерархия_дат_месяц_has_номенклатура_начало_продаж_изменение_иерархия_дат_день": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж.изменение.иерархия_дат.месяц": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + } + }, + "номенклатура.начало_продаж.изменение.иерархия_дат.день": { + "Target": { + "Entity": "номенклатура.начало_продаж.изменение.иерархия_дат.день" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.день" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.день" + }, + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Preposition": { + "Subject": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.день" + }, + "Prepositions": [ + { + "in": {} + } + ], + "Object": { + "Role": "номенклатура.начало_продаж.изменение.иерархия_дат.месяц" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_дата_первого_заказа_has_изменение_иерархия_дат": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер.дата_первого_заказа": { + "Target": { + "Entity": "партнер.дата_первого_заказа" + } + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_дата_первого_заказа_изменение_иерархия_дат_has_год": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер.дата_первого_заказа.изменение.иерархия_дат": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат" + } + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.год": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.год" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_дата_первого_заказа_изменение_иерархия_дат_has_квартал": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер.дата_первого_заказа.изменение.иерархия_дат": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат" + } + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_дата_первого_заказа_изменение_иерархия_дат_has_месяц": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер.дата_первого_заказа.изменение.иерархия_дат": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат" + } + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_дата_первого_заказа_изменение_иерархия_дат_has_день": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер.дата_первого_заказа.изменение.иерархия_дат": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат" + } + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.день": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.день" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.день" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_дата_первого_заказа_изменение_иерархия_дат_год_has_партнер_дата_первого_заказа_изменение_иерархия_дат_квартал": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер.дата_первого_заказа.изменение.иерархия_дат.год": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.год" + } + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.год" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.год" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Preposition": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + }, + "Prepositions": [ + { + "in": {} + } + ], + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.год" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_дата_первого_заказа_изменение_иерархия_дат_квартал_has_партнер_дата_первого_заказа_изменение_иерархия_дат_месяц": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + } + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Preposition": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + }, + "Prepositions": [ + { + "in": {} + } + ], + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.квартал" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "партнер_дата_первого_заказа_изменение_иерархия_дат_месяц_has_партнер_дата_первого_заказа_изменение_иерархия_дат_день": { + "Binding": { + "ConceptualEntity": "Партнер" + }, + "State": "Generated", + "Roles": { + "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + } + }, + "партнер.дата_первого_заказа.изменение.иерархия_дат.день": { + "Target": { + "Entity": "партнер.дата_первого_заказа.изменение.иерархия_дат.день" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.день" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Attribute": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.день" + }, + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + } + }, + "State": "Generated", + "Weight": 0.99 + }, + { + "Preposition": { + "Subject": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.день" + }, + "Prepositions": [ + { + "in": {} + } + ], + "Object": { + "Role": "партнер.дата_первого_заказа.изменение.иерархия_дат.месяц" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_иерархия_has_начало_продаж": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж_иерархия": { + "Target": { + "Entity": "номенклатура.начало_продаж_иерархия" + } + }, + "номенклатура.начало_продаж_иерархия.начало_продаж": { + "Target": { + "Entity": "номенклатура.начало_продаж_иерархия.начало_продаж" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж_иерархия" + }, + "Object": { + "Role": "номенклатура.начало_продаж_иерархия.начало_продаж" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + }, + "номенклатура_начало_продаж_иерархия_has_знаменатель_объема": { + "Binding": { + "ConceptualEntity": "Номенклатура" + }, + "State": "Generated", + "Roles": { + "номенклатура.начало_продаж_иерархия": { + "Target": { + "Entity": "номенклатура.начало_продаж_иерархия" + } + }, + "номенклатура.начало_продаж_иерархия.знаменатель_объема": { + "Target": { + "Entity": "номенклатура.начало_продаж_иерархия.знаменатель_объема" + } + } + }, + "Phrasings": [ + { + "Attribute": { + "Subject": { + "Role": "номенклатура.начало_продаж_иерархия" + }, + "Object": { + "Role": "номенклатура.начало_продаж_иерархия.знаменатель_объема" + } + }, + "State": "Generated", + "Weight": 0.99 + } + ] + } + } + } + contentType: json + diff --git a/analytics/pbi/model/report/Model/database.tmdl b/analytics/pbi/model/report/Model/database.tmdl new file mode 100644 index 0000000..d3ecc5f --- /dev/null +++ b/analytics/pbi/model/report/Model/database.tmdl @@ -0,0 +1,3 @@ +database report + compatibilityLevel: 1600 + diff --git a/analytics/pbi/model/report/Model/expressions.tmdl b/analytics/pbi/model/report/Model/expressions.tmdl new file mode 100644 index 0000000..86503f7 --- /dev/null +++ b/analytics/pbi/model/report/Model/expressions.tmdl @@ -0,0 +1,87 @@ +/// DNS-name of the server with BI-data, e.g. "myhost.bitrix24.com" +expression 'Server address' = "magok.bitrix24.ru" meta [IsParameterQuery=true, Type="Text", IsParameterQueryRequired=true] + + annotation PBI_ResultType = Text + +/// Secret token +expression 'Secret key' = "OLK0Ik9i34J1r3afMOHb5Q16DO821hjMru" meta [IsParameterQuery=true, Type="Text", IsParameterQueryRequired=true] + + annotation PBI_ResultType = Text + +expression bx24_load_entity = + let + //https://helpdesk.bitrix24.com/open/16457718/ + //bx24_entity_name: "crm_company_uf" + //https://docs.microsoft.com/en-us/powerquery-m/web-contents + func = (bx24_entity_name as text) as table => + let + response = Web.Contents( + "https://" & #"Server address", + [ + RelativePath = "bitrix/tools/biconnector/pbi.php", + Query = [ + table = bx24_entity_name + ], + Content = Json.FromValue([dateRange = [ + startDate = Date.AddYears(Date.From(DateTime.LocalNow()),-5), + endDate = Date.From(DateTime.LocalNow())], + key = #"Secret key" + ] + ) + ] + ), + jd = Json.Document(response) + in + Table.FromRows( + List.Skip(jd),//data: >=1 row (index 0 based) + List.First(jd)//header: 0 row (index 0 based) + ) + in + func + + annotation PBI_ResultType = Function + +expression 'Ошибки в Я Директ расходы' = + let + Источник = #"Я.Директ расходы стар", + #"Обнаруженные несоответствия типов" = let + tableWithOnlyPrimitiveTypes = Table.SelectColumns(Источник, Table.ColumnsOfType(Источник, {type nullable number, type nullable text, type nullable logical, type nullable date, type nullable datetime, type nullable datetimezone, type nullable time, type nullable duration})), + recordTypeFields = Type.RecordFields(Type.TableRow(Value.Type(tableWithOnlyPrimitiveTypes))), + fieldNames = Record.FieldNames(recordTypeFields), + fieldTypes = List.Transform(Record.ToList(recordTypeFields), each [Type]), + pairs = List.Transform(List.Positions(fieldNames), (i) => {fieldNames{i}, (v) => if v = null or Value.Is(v, fieldTypes{i}) then v else error [Message = "Тип значения не соответствует типу столбца.", Detail = v], fieldTypes{i}}) + in + Table.TransformColumns(Источник, pairs), + #"Добавлен индекс" = Table.AddIndexColumn(#"Обнаруженные несоответствия типов", "Номер строки" ,1), + #"Сохраненные ошибки" = Table.SelectRowsWithErrors(#"Добавлен индекс", {"Дата", "Кампания", "Группа", "Условие показа", "№ Условия показа", "Показы", "Клики", "CTR (%)", "key_dir", "Ср. цена клика, руб", "Расход, руб"}), + #"Переупорядоченные столбцы" = Table.ReorderColumns(#"Сохраненные ошибки", {"Номер строки", "Дата", "Кампания", "Группа", "Условие показа", "№ Условия показа", "Показы", "Клики", "CTR (%)", "key_dir", "Ср. цена клика, руб", "Расход, руб"}) + in + #"Переупорядоченные столбцы" + queryGroup: 'Ошибки в запросах — 05 01 2025 15:59:08' + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Exception + +expression 'Я.Директ расходы стар' = + let + Источник = GoogleSheets.Contents("https://docs.google.com/spreadsheets/d/12gd2O6tTGPGc2BsRbX_QPKn4VF23jhXoFcrj8ErblAo/edit?usp=sharing"), + #"Мастер отчётов_Table" = Источник{[name="Мастер отчётов",ItemKind="Table"]}[Data], + #"Повышенные заголовки" = Table.PromoteHeaders(#"Мастер отчётов_Table", [PromoteAllScalars=true]), + #"Измененный тип" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"Дата", type date}, {"Кампания", type text}, {"№ Кампании", type text}, {"Группа", type text}, {"№ Группы", type text}, {"Условие показа", type text}, {"№ Условия показа", type text}, {"Показы", Int64.Type}, {"Клики", Int64.Type}, {"CTR (%)", type number}, {"Расход (руб.)", type number}, {"Ср. цена клика (руб.)", type number}}), + #"Вставлено: объединенный столбец" = Table.AddColumn(#"Измененный тип", "key_dir", each Text.Combine({[#"№ Кампании"], [#"№ Группы"]}, "-"), type text), + #"Удаленные столбцы" = Table.RemoveColumns(#"Вставлено: объединенный столбец",{"№ Кампании", "№ Группы"}), + #"Добавлен пользовательский объект" = Table.AddColumn(#"Удаленные столбцы", "Ср. цена клика, руб", each [#"Ср. цена клика (руб.)"]/1000), + #"Удаленные столбцы1" = Table.RemoveColumns(#"Добавлен пользовательский объект",{"Ср. цена клика (руб.)"}), + #"Измененный тип1" = Table.TransformColumnTypes(#"Удаленные столбцы1",{{"Ср. цена клика, руб", type number}}), + #"Добавлен пользовательский объект1" = Table.AddColumn(#"Измененный тип1", "Расход, руб", each [#"Расход (руб.)"]/1000), + #"Измененный тип2" = Table.TransformColumnTypes(#"Добавлен пользовательский объект1",{{"Расход, руб", type number}}), + #"Удаленные столбцы2" = Table.RemoveColumns(#"Измененный тип2",{"Расход (руб.)"}), + #"Строки с примененным фильтром" = Table.SelectRows(#"Удаленные столбцы2", each [Дата] < #date(2024, 6, 1)) + in + #"Строки с примененным фильтром" + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/model.tmdl b/analytics/pbi/model/report/Model/model.tmdl new file mode 100644 index 0000000..4c70987 --- /dev/null +++ b/analytics/pbi/model/report/Model/model.tmdl @@ -0,0 +1,78 @@ +model Model + culture: ru-RU + defaultPowerBIDataSourceVersion: powerBI_V3 + sourceQueryCulture: ru-RU + dataAccessOptions + fastCombine + legacyRedirects + returnErrorValuesAsNull + +/// Ошибки в запросах, загруженных 05.01.2025 15:59:08. +queryGroup 'Ошибки в запросах — 05 01 2025 15:59:08' + + annotation PBI_QueryGroupOrder = 0 + +annotation __PBI_TimeIntelligenceEnabled = 1 + +annotation PBI_QueryOrder = ["Номенклатура","Партнер","Стоимость МП","Server address","Secret key","crm_company_uf","Себестоимость","Основной отчет","Группы","bx24_load_entity","Остатки","Заявки на оплату","План продаж менеджеров","План продаж по группам","Менеджеры","mp остатки","mp аналитика продаж","Я.Директ расходы стар","Ошибки в Я Директ расходы","ПРАЙСлист","Отзывы клиентов","Упущенные продажи","Расходы по годам","Заказы все","mp реклама","План маркеты","Резервы","Я.Директ расходы","Я.Директ заказы","mp узел","mp оборот"] + +annotation PBI_ProTooling = ["DaxQueryView_Desktop"] + +ref table Номенклатура +ref table Партнер +ref table 'Стоимость МП' +ref table DateTableTemplate_716ce6bb-e9bc-46ef-bfd4-865e74deaed5 +ref table LocalDateTable_67da7b50-915b-480b-9e3a-3a60739fb0c6 +ref table crm_company_uf +ref table LocalDateTable_49b06afb-4254-4da6-9109-618106084862 +ref table LocalDateTable_c661d468-0044-4990-b9e8-723cda59cf51 +ref table '.Календарь' +ref table Себестоимость +ref table LocalDateTable_93d80160-0984-4e44-91de-316b6ab26727 +ref table 'Основной отчет' +ref table Группы +ref table Закупки +ref table Остатки +ref table 'Заявки на оплату' +ref table LocalDateTable_729bf6db-04e4-4a26-9dce-b3837667cb92 +ref table 'Параметр цена продажи, %' +ref table 'План продаж менеджеров' +ref table 'План продаж по группам' +ref table LocalDateTable_704570fc-e0c6-4914-97ab-ebb645a2ab6e +ref table LocalDateTable_2b612047-5dcc-402e-b2ed-154636b18544 +ref table Организация +ref table Менеджеры +ref table 'mp остатки' +ref table 'mp аналитика продаж' +ref table ПРАЙСлист +ref table LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab +ref table 'Отзывы клиентов' +ref table 'Упущенные продажи' +ref table LocalDateTable_2f146245-8120-4ed9-87dc-af8699bb0274 +ref table 'Расходы по годам' +ref table 'Заказы все' +ref table 'mp реклама' +ref table LocalDateTable_1c75c57c-6ac4-4a07-ab45-b46636c3847c +ref table 'План маркеты' +ref table LocalDateTable_66d8bbba-35e3-44df-be7f-bb6fc44f271a +ref table Резервы +ref table LocalDateTable_588ed205-7c5f-41f0-9bd7-0d82b2484f09 +ref table 'Я.Директ расходы' +ref table 'Я.Директ заказы' +ref table 'mp узел' +ref table 'mp оборот' + +ref role 'Алова Елена' +ref role 'Гладышева Ольга' +ref role 'Кирилюк Юлия' +ref role 'Ларина Татьяна' +ref role 'Шевченко Антонина' +ref role 'Иншакова Ксения' +ref role 'Менеджер отдела закупок' +ref role 'Ханоян Артем' +ref role 'Менеджер отдела интернет-маркетинга' +ref role 'Менеджер отдела продаж' +ref role 'Эдуард Рахматуллин' + +ref cultureInfo ru-RU + diff --git a/analytics/pbi/model/report/Model/relationships.tmdl b/analytics/pbi/model/report/Model/relationships.tmdl new file mode 100644 index 0000000..e4e5ee1 --- /dev/null +++ b/analytics/pbi/model/report/Model/relationships.tmdl @@ -0,0 +1,247 @@ +relationship 0c9c501a-fa6a-4c94-99ae-b825ee836e89 + fromColumn: 'Стоимость МП'.artic_id + toColumn: Номенклатура._artic_id + +relationship 70d8fb19-ce6e-4331-bdd5-c48b97661c3a + joinOnDateBehavior: datePartOnly + fromColumn: Партнер.ДатаРегистрации + toColumn: LocalDateTable_67da7b50-915b-480b-9e3a-3a60739fb0c6.Date + +relationship 34a39f02-5cb4-4c1b-b8e8-ea3ef9aafb4e + joinOnDateBehavior: datePartOnly + fromColumn: crm_company_uf.'Дата последнего звонка' + toColumn: LocalDateTable_49b06afb-4254-4da6-9109-618106084862.Date + +relationship b7780e24-ae05-4812-ad3f-b6d9dc7f50cc + joinOnDateBehavior: datePartOnly + fromColumn: Партнер.'Дата последнего звонка' + toColumn: LocalDateTable_c661d468-0044-4990-b9e8-723cda59cf51.Date + +relationship 8e2d6fc2-aec0-1ef2-5916-f2e35c465192 + fromColumn: 'Стоимость МП'.ПартнерКод + toColumn: Партнер.'Код УТ' + +relationship d56f34dd-d18a-4511-b10b-85895b67822c + joinOnDateBehavior: datePartOnly + fromColumn: Себестоимость.'Заказ закрыт' + toColumn: LocalDateTable_93d80160-0984-4e44-91de-316b6ab26727.Date + +relationship 355102b6-e291-2095-8fd4-32447366f728 + fromColumn: Себестоимость.artic_id + toColumn: Номенклатура._artic_id + +relationship 7505878b-5508-458a-653e-9360556cef53 + fromColumn: Себестоимость.PartnerId + toColumn: Партнер.partner_id + +relationship 5534460f-9c82-363b-9fe4-45f95118ac89 + crossFilteringBehavior: bothDirections + fromColumn: Номенклатура._group_id + toColumn: Группы.group_id + +relationship AutoDetected_e288bde8-030d-4a1f-8a03-91f31dd9f651 + fromColumn: Остатки.artic_id + toColumn: Номенклатура._artic_id + +relationship 8208f512-c8a9-47d1-b47c-2bce30b6b8f8 + joinOnDateBehavior: datePartOnly + fromColumn: 'Заявки на оплату'.date + toColumn: LocalDateTable_729bf6db-04e4-4a26-9dce-b3837667cb92.Date + +relationship 55297e27-cac1-ef2a-4ee1-6cc80b8a1167 + fromColumn: 'Заявки на оплату'.partner_id + toColumn: Партнер.partner_id + +relationship 6bdd8855-c6d2-4c21-b90f-cb9f0b0bd52e + joinOnDateBehavior: datePartOnly + fromColumn: 'План продаж по группам'.Месяц + toColumn: LocalDateTable_704570fc-e0c6-4914-97ab-ebb645a2ab6e.Date + +relationship 8afa5bd2-9707-4363-96f2-670a305dc4f3 + joinOnDateBehavior: datePartOnly + fromColumn: Остатки.Дата + toColumn: LocalDateTable_2b612047-5dcc-402e-b2ed-154636b18544.Date + +relationship 7fecb2f9-fc49-b4a1-2fd5-41f2e1888950 + fromColumn: Себестоимость.Организация + toColumn: Организация.Организация + +relationship 32985c97-823f-ffbc-00fe-9f92ac1bae11 + fromColumn: 'Стоимость МП'.Организация + toColumn: Организация.Организация + +relationship AutoDetected_e9e769be-3122-4b9c-a4eb-06f97eba8eae + fromColumn: 'План продаж менеджеров'.user_id + toColumn: Менеджеры.user_id + +relationship 02f6fe40-78b9-93d1-f010-564c9b543bfe + fromColumn: Партнер.manager_id + toColumn: Менеджеры.user_id + +relationship f2e0ac1f-b839-4157-6c3e-57b88efa417c + fromColumn: 'mp остатки'.artic_id + toColumn: Номенклатура._artic_id + +relationship 31cf1118-b7c5-7d77-48dd-1b589c984d03 + fromColumn: 'mp аналитика продаж'.artic_id + toColumn: Номенклатура._artic_id + +relationship AutoDetected_34ee49f1-fee2-4e8c-ae63-add84ec273df + fromColumn: ПРАЙСлист.artic_id + toColumn: Номенклатура._artic_id + +relationship 306cff38-7ed9-4281-b26b-fdf3eb9b0316 + joinOnDateBehavior: datePartOnly + fromColumn: '.Календарь'.Дата + toColumn: LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab.Date + +relationship aeabbc3f-c05e-16a8-0814-e1504239b9c6 + fromColumn: 'Стоимость МП'.Период + toColumn: '.Календарь'.Дата + +relationship 8be1b23d-e487-097c-bcee-1a32b231c1dc + fromColumn: Себестоимость.Период + toColumn: '.Календарь'.Дата + +relationship f67b410c-fe68-57c7-552d-861cd0a89a3e + fromColumn: 'Заявки на оплату'.'Дата оплаты план' + toColumn: '.Календарь'.Дата + +relationship 5e52a163-909c-6b8d-25bc-b035e9ac2da8 + fromColumn: 'План продаж менеджеров'.Период + toColumn: '.Календарь'.Дата + +relationship dd599fe4-4d7d-02f0-ff23-c15949d273d6 + fromColumn: 'mp остатки'.'Дата обновления' + toColumn: '.Календарь'.Дата + +relationship a9aa002f-ecc1-626a-3629-1649907a88ac + fromColumn: 'mp аналитика продаж'.Дата + toColumn: '.Календарь'.Дата + +relationship 60f5c804-9c9a-709a-3a69-c4fdd8d95032 + fromColumn: ПРАЙСлист.Дата + toColumn: '.Календарь'.Дата + +relationship AutoDetected_3779c3ac-c497-4083-8eb0-ad86aaa8a771 + fromColumn: 'Упущенные продажи'.artic_id + toColumn: Номенклатура._artic_id + +relationship 4f365827-f1a2-9c34-5415-efb3452f5951 + fromColumn: 'Упущенные продажи'.Дата + toColumn: '.Календарь'.Дата + +relationship 28a764af-4e8a-4c89-8ceb-304403c0d71a + joinOnDateBehavior: datePartOnly + fromColumn: 'Упущенные продажи'.'Дата первого поступления' + toColumn: LocalDateTable_2f146245-8120-4ed9-87dc-af8699bb0274.Date + +relationship 4d693140-48df-ebb1-5b1f-775c66de2412 + fromColumn: 'Заказы все'.artic_id + toColumn: Номенклатура._artic_id + +relationship 9178e59f-fd80-fe45-d854-b1b441024ce8 + isActive: false + fromColumn: 'Заказы все'.partner_id + toColumn: Партнер.partner_id + +relationship 8229a93a-e14d-491e-ac57-cbab91627fdd + joinOnDateBehavior: datePartOnly + fromColumn: 'mp реклама'.'Дата начала' + toColumn: LocalDateTable_1c75c57c-6ac4-4a07-ab45-b46636c3847c.Date + +relationship c3cb1aca-d642-4ed3-d7a7-c54fe18f71d3 + fromColumn: 'mp реклама'.Дата + toColumn: '.Календарь'.Дата + +relationship fae31430-95d8-f385-acf1-a2826f31846c + fromColumn: 'mp реклама'.artic_id + toColumn: Номенклатура._artic_id + +relationship 381b6bd4-06f4-496e-9264-13deb45adbf2 + joinOnDateBehavior: datePartOnly + fromColumn: 'План маркеты'.Месяц + toColumn: LocalDateTable_66d8bbba-35e3-44df-be7f-bb6fc44f271a.Date + +relationship f9bb46c5-d73a-2219-3f8a-07559a96a567 + fromColumn: Закупки.Период + toColumn: '.Календарь'.Дата + +relationship e4537ee3-4045-38dc-b214-cb1c5de0b9e2 + fromColumn: Закупки.artic_id + toColumn: Номенклатура._artic_id + +relationship cf649bbe-1ad9-14ce-b264-dacef01746a7 + fromColumn: Закупки.Организация + toColumn: Организация.Организация + +relationship b3ea723a-e172-b759-0f23-bb851737fb34 + fromColumn: Закупки.partner_id + toColumn: Партнер.partner_id + +relationship AutoDetected_78bdb83b-79d3-4f5e-b7af-54227f9db024 + fromColumn: Резервы.artic_id + toColumn: Номенклатура._artic_id + +relationship e27252e4-5020-94c9-42db-b3a63806f34f + fromColumn: Резервы.'Дата обновления' + toColumn: '.Календарь'.Дата + +relationship 8171e79f-bfe6-4798-bb1a-98146553bada + joinOnDateBehavior: datePartOnly + fromColumn: Партнер.'Дата первого заказа' + toColumn: LocalDateTable_588ed205-7c5f-41f0-9bd7-0d82b2484f09.Date + +relationship 43da0466-6cb4-29cb-0624-f73171c1d064 + toCardinality: many + fromColumn: 'Я.Директ расходы'.key_dir + toColumn: 'Я.Директ заказы'.key_dir + +relationship 634101f5-71e4-2d48-7d90-832b057647a3 + fromColumn: 'Я.Директ расходы'.Дата + toColumn: '.Календарь'.Дата + +relationship e1b1daf7-34c4-f072-2ead-53e97f931563 + fromColumn: Себестоимость.'Номер заказа' + toColumn: 'Я.Директ заказы'.'ID покупки' + +relationship AutoDetected_817d2b4f-98f1-49e0-870f-fdecc60d7626 + fromColumn: 'mp узел'.partner_id + toColumn: Партнер.partner_id + +relationship AutoDetected_42494399-5383-444c-8db6-3ff0012aa9c5 + fromColumn: 'mp остатки'.Узел + toColumn: 'mp узел'.Узел + +relationship AutoDetected_77d661d6-36fd-48d2-b282-4961d4b5d737 + fromColumn: 'mp аналитика продаж'.Узел + toColumn: 'mp узел'.Узел + +relationship AutoDetected_372b4703-5804-44e3-9c83-e56aea6514b2 + fromColumn: 'mp реклама'.Узел + toColumn: 'mp узел'.Узел + +relationship 706a676c-ec4a-005d-17ab-0073194ef5f8 + fromColumn: 'План продаж по группам'.group_id + toColumn: Группы.group_id + +relationship 13260857-b641-cb5b-b3cb-f14771c5cec6 + fromColumn: 'mp узел'.Организация + toColumn: Организация.Организация + +relationship AutoDetected_3bd74343-497b-4516-b07f-1d3c2d6b07b6 + fromColumn: 'mp оборот'.artic_id + toColumn: Номенклатура._artic_id + +relationship AutoDetected_db8d1849-dfff-4593-996d-4891727f496d + fromColumn: 'mp оборот'.partner_id + toColumn: Партнер.partner_id + +relationship a388dedc-5e84-5967-96df-b8bae5c33891 + fromColumn: 'mp оборот'.Организация + toColumn: Организация.Организация + +relationship d0083c1d-7d13-e893-6081-a9eeae7c53f0 + fromColumn: 'mp оборот'.Дата + toColumn: '.Календарь'.Дата + diff --git a/analytics/pbi/model/report/Model/roles/Алова Елена.tmdl b/analytics/pbi/model/report/Model/roles/Алова Елена.tmdl new file mode 100644 index 0000000..52fbdee --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Алова Елена.tmdl @@ -0,0 +1,7 @@ +role 'Алова Елена' + modelPermission: read + + tablePermission Номенклатура = [Менеджер по закупкам] == "Алова Елена" || [РуководительНаправления] == "Алова Елена" || [Товарный менеджер] == "Алова Елена" + + annotation PBI_Id = 232ba4e958694f06a7d05f870c7a2e09 + diff --git a/analytics/pbi/model/report/Model/roles/Гладышева Ольга.tmdl b/analytics/pbi/model/report/Model/roles/Гладышева Ольга.tmdl new file mode 100644 index 0000000..b4951da --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Гладышева Ольга.tmdl @@ -0,0 +1,7 @@ +role 'Гладышева Ольга' + modelPermission: read + + tablePermission Номенклатура = [Менеджер по закупкам] == "Гладышева Ольга" || [РуководительНаправления] == "Гладышева Ольга" || [Товарный менеджер] == "Гладышева Ольга" + + annotation PBI_Id = 7c1c9d1f38744bf4a1bd941e24707af1 + diff --git a/analytics/pbi/model/report/Model/roles/Иншакова Ксения.tmdl b/analytics/pbi/model/report/Model/roles/Иншакова Ксения.tmdl new file mode 100644 index 0000000..24dd224 --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Иншакова Ксения.tmdl @@ -0,0 +1,7 @@ +role 'Иншакова Ксения' + modelPermission: read + + tablePermission Номенклатура = [Менеджер по закупкам] == "Иншакова Ксения" || [РуководительНаправления] == "Иншакова Ксения" || [Товарный менеджер] == "Иншакова Ксения" || [Товарный менеджер] == "Дивеева Ирина" + + annotation PBI_Id = 2b33c12aca5843adae941a60b22de032 + diff --git a/analytics/pbi/model/report/Model/roles/Кирилюк Юлия.tmdl b/analytics/pbi/model/report/Model/roles/Кирилюк Юлия.tmdl new file mode 100644 index 0000000..4132136 --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Кирилюк Юлия.tmdl @@ -0,0 +1,7 @@ +role 'Кирилюк Юлия' + modelPermission: read + + tablePermission Номенклатура = [Менеджер по закупкам] == "Кирилюк Юлия" || [РуководительНаправления] == "Кирилюк Юлия" || [Товарный менеджер] == "Кирилюк Юлия" + + annotation PBI_Id = 229e8df5eeb84976a4877b1f158b9061 + diff --git a/analytics/pbi/model/report/Model/roles/Ларина Татьяна.tmdl b/analytics/pbi/model/report/Model/roles/Ларина Татьяна.tmdl new file mode 100644 index 0000000..d568507 --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Ларина Татьяна.tmdl @@ -0,0 +1,7 @@ +role 'Ларина Татьяна' + modelPermission: read + + tablePermission Номенклатура = [Менеджер по закупкам] == "Ларина Татьяна" || [РуководительНаправления] == "Ларина Татьяна" || [Товарный менеджер] == "Ларина Татьяна" + + annotation PBI_Id = 8e3b251c563a42249202718154a471e4 + diff --git a/analytics/pbi/model/report/Model/roles/Менеджер отдела закупок.tmdl b/analytics/pbi/model/report/Model/roles/Менеджер отдела закупок.tmdl new file mode 100644 index 0000000..cf77a96 --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Менеджер отдела закупок.tmdl @@ -0,0 +1,5 @@ +role 'Менеджер отдела закупок' + modelPermission: read + + annotation PBI_Id = 5c63de3d119c4466a367623e23f8c9e3 + diff --git a/analytics/pbi/model/report/Model/roles/Менеджер отдела интернет-маркетинга.tmdl b/analytics/pbi/model/report/Model/roles/Менеджер отдела интернет-маркетинга.tmdl new file mode 100644 index 0000000..90958b1 --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Менеджер отдела интернет-маркетинга.tmdl @@ -0,0 +1,5 @@ +role 'Менеджер отдела интернет-маркетинга' + modelPermission: read + + annotation PBI_Id = 09735f8d6e7f4139929ac3460ed5829b + diff --git a/analytics/pbi/model/report/Model/roles/Менеджер отдела продаж.tmdl b/analytics/pbi/model/report/Model/roles/Менеджер отдела продаж.tmdl new file mode 100644 index 0000000..cd6b4e1 --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Менеджер отдела продаж.tmdl @@ -0,0 +1,5 @@ +role 'Менеджер отдела продаж' + modelPermission: read + + annotation PBI_Id = 3e05b61dc5134a3f9ef8d14b2a0b742a + diff --git a/analytics/pbi/model/report/Model/roles/Ханоян Артем.tmdl b/analytics/pbi/model/report/Model/roles/Ханоян Артем.tmdl new file mode 100644 index 0000000..e2cc69a --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Ханоян Артем.tmdl @@ -0,0 +1,7 @@ +role 'Ханоян Артем' + modelPermission: read + + tablePermission Номенклатура = [Менеджер по закупкам] == "Ханоян Артем" || [РуководительНаправления] == "Ханоян Артем" || [Товарный менеджер] == "Ханоян Артем" + + annotation PBI_Id = 2ae5566020ac4b96a50a5f1937670aee + diff --git a/analytics/pbi/model/report/Model/roles/Шевченко Антонина.tmdl b/analytics/pbi/model/report/Model/roles/Шевченко Антонина.tmdl new file mode 100644 index 0000000..e8b519a --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Шевченко Антонина.tmdl @@ -0,0 +1,7 @@ +role 'Шевченко Антонина' + modelPermission: read + + tablePermission Номенклатура = [Менеджер по закупкам] == "Шевченко Антонина" || [РуководительНаправления] == "Шевченко Антонина" || [Товарный менеджер] == "Шевченко Антонина" + + annotation PBI_Id = 00514f80ab984abd9f6957c4a3df98ea + diff --git a/analytics/pbi/model/report/Model/roles/Эдуард Рахматуллин.tmdl b/analytics/pbi/model/report/Model/roles/Эдуард Рахматуллин.tmdl new file mode 100644 index 0000000..e8f91d0 --- /dev/null +++ b/analytics/pbi/model/report/Model/roles/Эдуард Рахматуллин.tmdl @@ -0,0 +1,5 @@ +role 'Эдуард Рахматуллин' + modelPermission: read + + annotation PBI_Id = ffed27e83fa442788546be7bc067a933 + diff --git a/analytics/pbi/model/report/Model/tables/.Календарь.tmdl b/analytics/pbi/model/report/Model/tables/.Календарь.tmdl new file mode 100644 index 0000000..a77fedd --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/.Календарь.tmdl @@ -0,0 +1,36 @@ +table '.Календарь' + + measure 'Курс TODAY-1, usd2' = CALCULATE(MAX('Себестоимость'[Курс usd2]), '.Календарь'[Дата] = TODAY() - 1) + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Дата + formatString: m/d/yyyy + summarizeBy: none + sourceColumn: [Date] + + variation Изменение + isDefault + relationship: 306cff38-7ed9-4281-b26b-fdf3eb9b0316 + defaultHierarchy: LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab.'Иерархия дат' + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDateTimeCustom":true} + + annotation UnderlyingDateTimeDataType = Date + + column 'Год неделя' = YEAR('.Календарь'[Дата]) & "-" & FORMAT(WEEKNUM('.Календарь'[Дата], 2), "00") + summarizeBy: none + + annotation SummarizationSetBy = Automatic + + partition '.Календарь' = calculated + mode: import + source = ``` + CALENDAR(DATE(2018,01,01), TODAY()) + + ``` + + annotation PBI_Id = 96f54ceb7af44a4682e4399eeac84d37 + diff --git a/analytics/pbi/model/report/Model/tables/DateTableTemplate_716ce6bb-e9bc-46ef-bfd4-865e74deaed5.tmdl b/analytics/pbi/model/report/Model/tables/DateTableTemplate_716ce6bb-e9bc-46ef-bfd4-865e74deaed5.tmdl new file mode 100644 index 0000000..0070a2f --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/DateTableTemplate_716ce6bb-e9bc-46ef-bfd4-865e74deaed5.tmdl @@ -0,0 +1,93 @@ +table DateTableTemplate_716ce6bb-e9bc-46ef-bfd4-865e74deaed5 + isHidden + isPrivate + + column Date + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition DateTableTemplate_716ce6bb-e9bc-46ef-bfd4-865e74deaed5-a50c2945-fdf8-4e06-908a-c3e9748445a8 = calculated + mode: import + source = Calendar(Date(2015,1,1), Date(2015,1,1)) + + annotation __PBI_TemplateDateTable = true + + annotation DefaultItem = DateHierarchy + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_1c75c57c-6ac4-4a07-ab45-b46636c3847c.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_1c75c57c-6ac4-4a07-ab45-b46636c3847c.tmdl new file mode 100644 index 0000000..1ba9769 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_1c75c57c-6ac4-4a07-ab45-b46636c3847c.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_1c75c57c-6ac4-4a07-ab45-b46636c3847c + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_1c75c57c-6ac4-4a07-ab45-b46636c3847c = calculated + mode: import + source = Calendar(Date(Year(MIN('mp реклама'[Дата начала])), 1, 1), Date(Year(MAX('mp реклама'[Дата начала])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_2b612047-5dcc-402e-b2ed-154636b18544.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_2b612047-5dcc-402e-b2ed-154636b18544.tmdl new file mode 100644 index 0000000..ba66587 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_2b612047-5dcc-402e-b2ed-154636b18544.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_2b612047-5dcc-402e-b2ed-154636b18544 + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_2b612047-5dcc-402e-b2ed-154636b18544 = calculated + mode: import + source = Calendar(Date(Year(MIN('Остатки'[Дата])), 1, 1), Date(Year(MAX('Остатки'[Дата])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_2f146245-8120-4ed9-87dc-af8699bb0274.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_2f146245-8120-4ed9-87dc-af8699bb0274.tmdl new file mode 100644 index 0000000..6966646 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_2f146245-8120-4ed9-87dc-af8699bb0274.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_2f146245-8120-4ed9-87dc-af8699bb0274 + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_2f146245-8120-4ed9-87dc-af8699bb0274 = calculated + mode: import + source = Calendar(Date(Year(MIN('Упущенные продажи'[Дата первого поступления])), 1, 1), Date(Year(MAX('Упущенные продажи'[Дата первого поступления])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_49b06afb-4254-4da6-9109-618106084862.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_49b06afb-4254-4da6-9109-618106084862.tmdl new file mode 100644 index 0000000..7ab0a8e --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_49b06afb-4254-4da6-9109-618106084862.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_49b06afb-4254-4da6-9109-618106084862 + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_49b06afb-4254-4da6-9109-618106084862 = calculated + mode: import + source = Calendar(Date(Year(MIN('crm_company_uf'[Дата последнего звонка])), 1, 1), Date(Year(MAX('crm_company_uf'[Дата последнего звонка])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_588ed205-7c5f-41f0-9bd7-0d82b2484f09.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_588ed205-7c5f-41f0-9bd7-0d82b2484f09.tmdl new file mode 100644 index 0000000..47b16a2 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_588ed205-7c5f-41f0-9bd7-0d82b2484f09.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_588ed205-7c5f-41f0-9bd7-0d82b2484f09 + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_588ed205-7c5f-41f0-9bd7-0d82b2484f09 = calculated + mode: import + source = Calendar(Date(Year(MIN('Партнер'[Дата первого заказа])), 1, 1), Date(Year(MAX('Партнер'[Дата первого заказа])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_66d8bbba-35e3-44df-be7f-bb6fc44f271a.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_66d8bbba-35e3-44df-be7f-bb6fc44f271a.tmdl new file mode 100644 index 0000000..75f03fe --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_66d8bbba-35e3-44df-be7f-bb6fc44f271a.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_66d8bbba-35e3-44df-be7f-bb6fc44f271a + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_66d8bbba-35e3-44df-be7f-bb6fc44f271a = calculated + mode: import + source = Calendar(Date(Year(MIN('План маркеты'[Месяц])), 1, 1), Date(Year(MAX('План маркеты'[Месяц])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_67da7b50-915b-480b-9e3a-3a60739fb0c6.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_67da7b50-915b-480b-9e3a-3a60739fb0c6.tmdl new file mode 100644 index 0000000..6690024 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_67da7b50-915b-480b-9e3a-3a60739fb0c6.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_67da7b50-915b-480b-9e3a-3a60739fb0c6 + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_67da7b50-915b-480b-9e3a-3a60739fb0c6 = calculated + mode: import + source = Calendar(Date(Year(MIN('Партнер'[ДатаРегистрации])), 1, 1), Date(Year(MAX('Партнер'[ДатаРегистрации])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_704570fc-e0c6-4914-97ab-ebb645a2ab6e.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_704570fc-e0c6-4914-97ab-ebb645a2ab6e.tmdl new file mode 100644 index 0000000..7cff9ef --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_704570fc-e0c6-4914-97ab-ebb645a2ab6e.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_704570fc-e0c6-4914-97ab-ebb645a2ab6e + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_704570fc-e0c6-4914-97ab-ebb645a2ab6e = calculated + mode: import + source = Calendar(Date(Year(MIN('План продаж по группам'[Месяц])), 1, 1), Date(Year(MAX('План продаж по группам'[Месяц])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_729bf6db-04e4-4a26-9dce-b3837667cb92.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_729bf6db-04e4-4a26-9dce-b3837667cb92.tmdl new file mode 100644 index 0000000..dc5966d --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_729bf6db-04e4-4a26-9dce-b3837667cb92.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_729bf6db-04e4-4a26-9dce-b3837667cb92 + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_729bf6db-04e4-4a26-9dce-b3837667cb92 = calculated + mode: import + source = Calendar(Date(Year(MIN('Заявки на оплату'[date])), 1, 1), Date(Year(MAX('Заявки на оплату'[date])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_93d80160-0984-4e44-91de-316b6ab26727.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_93d80160-0984-4e44-91de-316b6ab26727.tmdl new file mode 100644 index 0000000..cfb224a --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_93d80160-0984-4e44-91de-316b6ab26727.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_93d80160-0984-4e44-91de-316b6ab26727 + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_93d80160-0984-4e44-91de-316b6ab26727 = calculated + mode: import + source = Calendar(Date(Year(MIN('Себестоимость'[Заказ закрыт])), 1, 1), Date(Year(MAX('Себестоимость'[Заказ закрыт])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_c661d468-0044-4990-b9e8-723cda59cf51.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_c661d468-0044-4990-b9e8-723cda59cf51.tmdl new file mode 100644 index 0000000..acbf486 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_c661d468-0044-4990-b9e8-723cda59cf51.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_c661d468-0044-4990-b9e8-723cda59cf51 + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_c661d468-0044-4990-b9e8-723cda59cf51 = calculated + mode: import + source = Calendar(Date(Year(MIN('Партнер'[Дата последнего звонка])), 1, 1), Date(Year(MAX('Партнер'[Дата последнего звонка])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab.tmdl b/analytics/pbi/model/report/Model/tables/LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab.tmdl new file mode 100644 index 0000000..17ddd5b --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab.tmdl @@ -0,0 +1,98 @@ +table LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab + isHidden + showAsVariationsOnly + + column Date + dataType: dateTime + isHidden + dataCategory: PaddedDateTableDates + summarizeBy: none + isNameInferred + sourceColumn: [Date] + + annotation SummarizationSetBy = User + + column Год = YEAR([Date]) + dataType: int64 + isHidden + dataCategory: Years + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Year + + column №Месяца = MONTH([Date]) + dataType: int64 + isHidden + dataCategory: MonthOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = MonthNumber + + column Месяц = FORMAT([Date], "MMMM") + dataType: string + isHidden + dataCategory: Months + summarizeBy: none + sortByColumn: №Месяца + + annotation SummarizationSetBy = User + + annotation TemplateId = Month + + column №Квартала = INT(([№Месяца] + 2) / 3) + dataType: int64 + isHidden + dataCategory: QuarterOfYear + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = QuarterNumber + + column Квартал = "Кв. " & [№Квартала] + dataType: string + isHidden + dataCategory: Quarters + summarizeBy: none + sortByColumn: №Квартала + + annotation SummarizationSetBy = User + + annotation TemplateId = Quarter + + column День = DAY([Date]) + dataType: int64 + isHidden + dataCategory: DayOfMonth + summarizeBy: none + + annotation SummarizationSetBy = User + + annotation TemplateId = Day + + hierarchy 'Иерархия дат' + + level Год + column: Год + + level Квартал + column: Квартал + + level Месяц + column: Месяц + + level День + column: День + + annotation TemplateId = DateHierarchy + + partition LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab = calculated + mode: import + source = Calendar(Date(Year(MIN('.Календарь'[Дата])), 1, 1), Date(Year(MAX('.Календарь'[Дата])), 12, 31)) + + annotation __PBI_LocalDateTable = true + diff --git a/analytics/pbi/model/report/Model/tables/crm_company_uf.tmdl b/analytics/pbi/model/report/Model/tables/crm_company_uf.tmdl new file mode 100644 index 0000000..b300d53 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/crm_company_uf.tmdl @@ -0,0 +1,60 @@ +table crm_company_uf + isHidden + + column bitrix_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: bitrix_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Дата последнего звонка' + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата последнего звонка + + variation Изменение + isDefault + relationship: 34a39f02-5cb4-4c1b-b8e8-ea3ef9aafb4e + defaultHierarchy: LocalDateTable_49b06afb-4254-4da6-9109-618106084862.'Иерархия дат' + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + partition crm_company_uf = m + mode: import + source = + let + raw_t = bx24_load_entity("crm_company_uf"), + fixed_t = Table.TransformColumnTypes(raw_t, + { + {"COMPANY_ID", Int64.Type}, + + {"DATE_CREATE", type datetime} + + //{"UF_CRM_12345", type text} + + }, + "en-US" + ), + #"Другие удаленные столбцы" = Table.SelectColumns(fixed_t,{"COMPANY_ID", "UF_CRM_LAST_CALL_DATE"}), + #"Разделить столбец по разделителю" = Table.SplitColumn(#"Другие удаленные столбцы", "UF_CRM_LAST_CALL_DATE", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), {"UF_CRM_LAST_CALL_DATE.1", "UF_CRM_LAST_CALL_DATE.2"}), + #"Измененный тип" = Table.TransformColumnTypes(#"Разделить столбец по разделителю",{{"UF_CRM_LAST_CALL_DATE.1", type date}, {"UF_CRM_LAST_CALL_DATE.2", type time}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Измененный тип",{"UF_CRM_LAST_CALL_DATE.2"}), + #"Переименованные столбцы" = Table.RenameColumns(#"Удаленные столбцы",{{"COMPANY_ID", "bitrix_id"}, {"UF_CRM_LAST_CALL_DATE.1", "Дата последнего звонка"}}), + #"Измененный тип1" = Table.TransformColumnTypes(#"Переименованные столбцы",{{"bitrix_id", type text}}) + in + #"Измененный тип1" + + changedProperty = IsHidden + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/mp аналитика продаж.tmdl b/analytics/pbi/model/report/Model/tables/mp аналитика продаж.tmdl new file mode 100644 index 0000000..d8dab6d --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/mp аналитика продаж.tmdl @@ -0,0 +1,105 @@ +table 'mp аналитика продаж' + + column Узел + dataType: string + isHidden + summarizeBy: none + sourceColumn: Узел + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Вид загрузки' + dataType: string + summarizeBy: none + sourceColumn: Вид загрузки + + annotation SummarizationSetBy = Automatic + + column Склад + dataType: string + summarizeBy: none + sourceColumn: Склад + + annotation SummarizationSetBy = Automatic + + column Дата + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column artic_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Область + dataType: string + summarizeBy: none + sourceColumn: Область + + annotation SummarizationSetBy = Automatic + + column Страна + dataType: string + summarizeBy: none + sourceColumn: Страна + + annotation SummarizationSetBy = Automatic + + column Регион + dataType: string + summarizeBy: none + sourceColumn: Регион + + annotation SummarizationSetBy = Automatic + + column 'Продано, упак' + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: Продано, упак + + annotation SummarizationSetBy = Automatic + + column 'Продано, руб' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Продано, руб + + annotation SummarizationSetBy = Automatic + + partition 'mp аналитика продаж' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + #"pbi_Внешние продажи" = Источник{[Schema="pbi",Item="Внешние продажи"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(#"pbi_Внешние продажи",{{"Дата", type date}, {"Количество", Int64.Type}}), + #"Переименованные столбцы" = Table.RenameColumns(#"Измененный тип",{{"Количество", "Продано, шт"}, {"Сумма", "Продано, руб"}}), + #"Обрезанный текст" = Table.TransformColumns(#"Переименованные столбцы",{{"id_внешний", Text.Trim, type text}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Обрезанный текст",{"id_внешний"}), + #"Строки с примененным фильтром" = Table.SelectRows(#"Удаленные столбцы", each [Дата] >= #date(2024, 1, 1)), + #"Переименованные столбцы1" = Table.RenameColumns(#"Строки с примененным фильтром",{{"Продано, шт", "Продано, упак"}}) + in + #"Переименованные столбцы1" + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/mp оборот.tmdl b/analytics/pbi/model/report/Model/tables/mp оборот.tmdl new file mode 100644 index 0000000..a4c1a13 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/mp оборот.tmdl @@ -0,0 +1,147 @@ +table 'mp оборот' + + measure 'Расходы к обороту, %' = ``` + + VAR _MinDate = DATE(2025, 1, 1) + RETURN + CALCULATE( + VAR _Turnover = + SUM('mp оборот'[Сумма оборот МП, руб]) + VAR _Sales = + [Сумма продаж, руб] + RETURN + DIVIDE( + _Turnover - _Sales, + _Turnover, + 0 + ), + KEEPFILTERS( + FILTER( + '.Календарь', + '.Календарь'[Дата] >= _MinDate + ) + ) + ) + + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Расходы МП + РК + СПП, руб' = ``` + + VAR _MinDate = DATE(2025, 1, 1) + RETURN + CALCULATE( + VAR _Turnover = + SUM('mp оборот'[Сумма оборот МП, руб]) + VAR _Sales = + [Сумма продаж, руб] + RETURN + + _Turnover - _Sales, + + KEEPFILTERS( + FILTER( + '.Календарь', + '.Календарь'[Дата] >= _MinDate + ) + ) + ) + ``` + formatString: #,0 + + measure 'НДС_20 по расходам, руб' = [Расходы МП + РК + СПП, руб] - [Расходы МП + РК + СПП, руб] / 1.2 + formatString: #,0 + + measure 'Расходы к учетной сумме, %' = + + VAR _MinDate = DATE(2025, 1, 1) + RETURN + CALCULATE( + VAR _Turnover = + SUM('mp оборот'[Сумма оборот МП, руб]) + VAR _Sales = + [Сумма учетная, руб] + RETURN + DIVIDE( + _Turnover - _Sales, + _Turnover, + 0 + ), + KEEPFILTERS( + FILTER( + '.Календарь', + '.Календарь'[Дата] >= _MinDate + ) + ) + ) + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Дата + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column artic_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Организация + dataType: string + isHidden + summarizeBy: none + sourceColumn: Организация + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column partner_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: partner_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Сумма оборот МП, руб' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Сумма оборот МП, руб + + annotation SummarizationSetBy = Automatic + + partition 'mp оборот' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + #"pbi_Внешний оборот" = Источник{[Schema="pbi",Item="Внешний оборот"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(#"pbi_Внешний оборот",{{"Дата", type date}}) + in + #"Измененный тип" + + changedProperty = Name + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/mp остатки.tmdl b/analytics/pbi/model/report/Model/tables/mp остатки.tmdl new file mode 100644 index 0000000..7b51770 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/mp остатки.tmdl @@ -0,0 +1,103 @@ +table 'mp остатки' + + column Узел + dataType: string + isHidden + summarizeBy: none + sourceColumn: Узел + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Тип + dataType: string + summarizeBy: none + sourceColumn: Тип + + annotation SummarizationSetBy = Automatic + + column Склад + dataType: string + summarizeBy: none + sourceColumn: Склад + + annotation SummarizationSetBy = Automatic + + column 'Дата обновления' + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата обновления + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column artic_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column id_внешний + dataType: string + summarizeBy: none + sourceColumn: id_внешний + + annotation SummarizationSetBy = Automatic + + column 'Остаток МП, упак' + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: Остаток МП, упак + + annotation SummarizationSetBy = Automatic + + column 'Доступно, упак' + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: Доступно, упак + + annotation SummarizationSetBy = Automatic + + column 'Остаток МП, шт' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Остаток МП, шт + + annotation SummarizationSetBy = Automatic + + column 'Остаток МП, руб' = 'mp остатки'[Остаток МП, шт] * RELATED('Номенклатура'[Цена учетная, руб]) + formatString: #,0 + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + partition 'mp остатки' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + #"pbi_Внешние остатки" = Источник{[Schema="pbi",Item="Внешние остатки"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(#"pbi_Внешние остатки",{{"Дата обновления", type date}, {"Количество", Int64.Type}, {"Доступное кол-во", Int64.Type}}), + #"Переименованные столбцы" = Table.RenameColumns(#"Измененный тип",{{"Количество", "Остаток, упак"}, {"Доступное кол-во", "Доступно, упак"}}), + #"Обрезанный текст" = Table.TransformColumns(#"Переименованные столбцы",{{"id_внешний", Text.Trim, type text}}), + #"Переименованные столбцы1" = Table.RenameColumns(#"Обрезанный текст",{{"Остаток, упак", "Остаток МП, упак"}}) + in + #"Переименованные столбцы1" + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/mp реклама.tmdl b/analytics/pbi/model/report/Model/tables/mp реклама.tmdl new file mode 100644 index 0000000..787dd0f --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/mp реклама.tmdl @@ -0,0 +1,209 @@ +table 'mp реклама' + + measure 'ДРР заказы по рекламе, %' = ``` + DIVIDE( + SUM('mp реклама'[Затраты РК, руб]), + SUM('mp реклама'[Сумма заказов]), 1) + ``` + formatString: #,0%;-#,0%;#,0% + + measure 'ДРР заказы все, %' = + + DIVIDE( + SUM('mp реклама'[Затраты РК, руб]), + CALCULATE( + SUM('mp аналитика продаж'[Продано, руб]), + 'mp аналитика продаж'[Вид загрузки] = "ЗаказыВС" + ), + 1 + ) + formatString: #,0%;-#,0%;#,0% + + column Дата + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column Узел + dataType: string + isHidden + summarizeBy: none + sourceColumn: Узел + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column artic_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Номер кампании' + dataType: string + summarizeBy: none + sourceColumn: Номер кампании + + annotation SummarizationSetBy = Automatic + + column 'Тип кампании' + dataType: string + summarizeBy: none + sourceColumn: Тип кампании + + annotation SummarizationSetBy = Automatic + + column Просмотры + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: Просмотры + + annotation SummarizationSetBy = Automatic + + column Клики + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: Клики + + annotation SummarizationSetBy = Automatic + + column 'atbs кол-во добавлений в корзину' + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: atbs кол-во добавлений в корзину + + annotation SummarizationSetBy = Automatic + + column 'Затраты РК, руб' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Затраты РК, руб + + annotation SummarizationSetBy = Automatic + + column 'Стоимость клика, руб' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Стоимость клика, руб + + annotation SummarizationSetBy = Automatic + + column 'Количество заказов' + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: Количество заказов + + annotation SummarizationSetBy = Automatic + + column 'Сумма заказов' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Сумма заказов + + annotation SummarizationSetBy = Automatic + + column 'Ставка поиск, %' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Ставка поиск, % + + annotation SummarizationSetBy = Automatic + + column 'Ставка поиск, руб' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Ставка поиск, руб + + annotation SummarizationSetBy = Automatic + + column 'Охват, %' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Охват, % + + annotation SummarizationSetBy = Automatic + + column 'cr кол-во заказов / кол-во посещений' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: cr кол-во заказов / кол-во посещений + + annotation SummarizationSetBy = Automatic + + column 'Дата начала' + dataType: dateTime + formatString: Long Date + summarizeBy: none + sourceColumn: Дата начала + + variation Изменение + isDefault + relationship: 8229a93a-e14d-491e-ac57-cbab91627fdd + defaultHierarchy: LocalDateTable_1c75c57c-6ac4-4a07-ab45-b46636c3847c.'Иерархия дат' + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column id_product + dataType: string + summarizeBy: none + sourceColumn: id_product + + annotation SummarizationSetBy = Automatic + + column 'Заказано товаров, упак' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Заказано товаров, упак + + annotation SummarizationSetBy = Automatic + + column 'Затраты РК, usd' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Затраты РК, usd + + annotation SummarizationSetBy = Automatic + + partition 'mp реклама' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_РекламаМаркетплейсы = Источник{[Schema="pbi",Item="РекламаМаркетплейсы"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(pbi_РекламаМаркетплейсы,{{"Дата", type date}, {"Просмотры", Int64.Type}, {"Клики", Int64.Type}, {"atbs кол-во добавлений в корзину", Int64.Type}, {"Количество заказов", Int64.Type}, {"Дата начала", type date}}), + #"Переименованные столбцы" = Table.RenameColumns(#"Измененный тип",{{"Затраты, руб", "Затраты РК, руб"}, {"Затраты, usd", "Затраты РК, usd"}}) + in + #"Переименованные столбцы" + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/mp узел.tmdl b/analytics/pbi/model/report/Model/tables/mp узел.tmdl new file mode 100644 index 0000000..d057ced --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/mp узел.tmdl @@ -0,0 +1,40 @@ +table 'mp узел' + + column Узел + dataType: string + summarizeBy: none + sourceColumn: Узел + + annotation SummarizationSetBy = Automatic + + column Организация + dataType: string + isHidden + summarizeBy: none + sourceColumn: Организация + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column partner_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: partner_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + partition 'mp узел' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_node_mp = Источник{[Schema="pbi",Item="node_mp"]}[Data] + in + pbi_node_mp + + changedProperty = Name + diff --git a/analytics/pbi/model/report/Model/tables/Группы.tmdl b/analytics/pbi/model/report/Model/tables/Группы.tmdl new file mode 100644 index 0000000..5c633d7 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Группы.tmdl @@ -0,0 +1,138 @@ +table Группы + + column _Description + dataType: string + isHidden + summarizeBy: none + sourceColumn: _Description + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Группа + dataType: string + summarizeBy: none + sourceColumn: Группа + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Подгруппа 1' + dataType: string + summarizeBy: none + sourceColumn: Подгруппа 1 + + annotation SummarizationSetBy = Automatic + + column 'Подгруппа 2' + dataType: string + summarizeBy: none + sourceColumn: Подгруппа 2 + + annotation SummarizationSetBy = Automatic + + column 'Подгруппа 3' + dataType: string + summarizeBy: none + sourceColumn: Подгруппа 3 + + annotation SummarizationSetBy = Automatic + + column group_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: group_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column _ParentIDRRef + dataType: string + isHidden + summarizeBy: none + sourceColumn: _ParentIDRRef + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Уровень вложенности' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Уровень вложенности + + annotation SummarizationSetBy = Automatic + + column 'Полный путь' + dataType: string + summarizeBy: none + sourceColumn: Полный путь + + annotation SummarizationSetBy = Automatic + + column code + dataType: string + isHidden + summarizeBy: none + sourceColumn: code + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column план + dataType: double + isHidden + summarizeBy: sum + sourceColumn: план + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'first group' + dataType: string + isHidden + summarizeBy: none + sourceColumn: first group + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + hierarchy 'Группа Иерархия' + + level Группа + column: Группа + + level 'Подгруппа 1' + column: 'Подгруппа 1' + + level 'Подгруппа 2' + column: 'Подгруппа 2' + + level 'Подгруппа 3' + column: 'Подгруппа 3' + + partition Группы = m + mode: import + source = + let + Источник = Sql.Databases("prdsql"), + mag_pbi = Источник{[Name="mag_pbi"]}[Data], + pbi_groups = mag_pbi{[Schema="pbi",Item="groups"]}[Data], + #"Переименованные столбцы" = Table.RenameColumns(pbi_groups,{{"g", "Группа"}, {"g1", "Подгруппа 1"}, {"g2", "Подгруппа 2"}, {"g3", "Подгруппа 3"}, {"path", "Полный путь"}, {"lvl", "Уровень вложенности"}}) + in + #"Переименованные столбцы" + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/Заказы все.tmdl b/analytics/pbi/model/report/Model/tables/Заказы все.tmdl new file mode 100644 index 0000000..642a1ed --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Заказы все.tmdl @@ -0,0 +1,595 @@ +table 'Заказы все' + + measure 'В производстве кол.' = + + CALCULATE( + SUM('Заказы все'[Количество]), + 'Заказы все'[Статус] = "В производстве" + ) + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'В производстве объем, м3' = + + CALCULATE( + SUM('Заказы все'[Объем, м3]), + 'Заказы все'[Статус] = "В производстве" + ) + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'В производстве сумма всего в usd2' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в usd2]), + 'Заказы все'[Статус] = "В производстве" + ) + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'В производстве сумма всего в руб' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в руб]), + 'Заказы все'[Статус] = "В производстве" + ) + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'В производстве упак.' = + + CALCULATE( + SUM('Заказы все'[Кол. упаковок]), + 'Заказы все'[Статус] = "В производстве" + ) + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'Сумма в производстве, руб' = ``` + + CALCULATE( + [В производстве сумма всего в usd2], + 'Заказы все'[Валюта] = "руб." + ) + ``` + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'Сумма в производстве, cny' = ``` + + CALCULATE( + [В производстве сумма всего в usd2], + 'Заказы все'[Валюта] = "CNY" + ) + ``` + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'Сумма в производстве, try' = ``` + + CALCULATE( + [В производстве сумма всего в usd2], + 'Заказы все'[Валюта] = "TRY" + ) + ``` + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'Сумма в производстве, usd2' = ``` + + CALCULATE( + [В производстве сумма всего в usd2], + 'Заказы все'[Валюта] = "USD2" + ) + ``` + formatString: #,0 + displayFolder: Заказы в производстве + + measure 'В пути кол.' = + + CALCULATE( + SUM('Заказы все'[Количество]), + 'Заказы все'[Статус] = "В пути" + ) + formatString: #,0 + displayFolder: Заказы в пути + + measure 'В пути объем, м3' = + + CALCULATE( + SUM('Заказы все'[Объем, м3]), + 'Заказы все'[Статус] = "В пути" + ) + formatString: #,0 + displayFolder: Заказы в пути + + measure 'В пути сумма всего в usd2' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в usd2]), + 'Заказы все'[Статус] = "В пути" + ) + formatString: #,0 + displayFolder: Заказы в пути + + measure 'В пути сумма всего в руб' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в руб]), + 'Заказы все'[Статус] = "В пути" + ) + formatString: #,0 + displayFolder: Заказы в пути + + measure 'В пути упак.' = + + CALCULATE( + SUM('Заказы все'[Кол. упаковок]), + 'Заказы все'[Статус] = "В пути" + ) + formatString: #,0 + displayFolder: Заказы в пути + + measure 'Сумма в пути, руб' = ``` + + CALCULATE( + [В пути сумма всего в usd2], + 'Заказы все'[Валюта] = "руб." + ) + ``` + formatString: #,0 + displayFolder: Заказы в пути + + measure 'Сумма в пути, cny' = ``` + + CALCULATE( + [В пути сумма всего в usd2], + 'Заказы все'[Валюта] = "CNY" + ) + ``` + formatString: #,0 + displayFolder: Заказы в пути + + measure 'Сумма в пути, try' = ``` + + CALCULATE( + [В пути сумма всего в usd2], + 'Заказы все'[Валюта] = "TRY" + ) + ``` + formatString: #,0 + displayFolder: Заказы в пути + + measure 'Сумма в пути, usd2' = ``` + + CALCULATE( + [В пути сумма всего в usd2], + 'Заказы все'[Валюта] = "USD2" + ) + ``` + formatString: #,0 + displayFolder: Заказы в пути + + measure 'Тех заказ кол.' = + + CALCULATE( + SUM('Заказы все'[Количество]), + 'Заказы все'[Статус] = "Тех. заказ" + ) + formatString: #,0 + displayFolder: Заказы тех + + measure 'Тех заказ объем, м3' = + + CALCULATE( + SUM('Заказы все'[Объем, м3]), + 'Заказы все'[Статус] = "Тех. заказ" + ) + formatString: #,0 + displayFolder: Заказы тех + + measure 'Тех заказ сумма всего в usd2' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в usd2]), + 'Заказы все'[Статус] = "Тех. заказ" + ) + formatString: #,0 + displayFolder: Заказы тех + + measure 'Тех заказ сумма всего в руб' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в руб]), + 'Заказы все'[Статус] = "Тех. заказ" + ) + formatString: #,0 + displayFolder: Заказы тех + + measure 'Тех заказ упак.' = + + CALCULATE( + SUM('Заказы все'[Кол. упаковок]), + 'Заказы все'[Статус] = "Тех. заказ" + ) + formatString: #,0 + displayFolder: Заказы тех + + measure 'Сумма тех заказ, руб' = ``` + + CALCULATE( + [Тех заказ сумма всего в usd2], + 'Заказы все'[Валюта] = "руб." + ) + ``` + formatString: #,0 + displayFolder: Заказы тех + + measure 'Сумма тех заказ, cny' = ``` + + CALCULATE( + [Тех заказ сумма всего в usd2], + 'Заказы все'[Валюта] = "CNY" + ) + ``` + formatString: #,0 + displayFolder: Заказы тех + + measure 'Сумма тех заказ, try' = ``` + + CALCULATE( + [Тех заказ сумма всего в usd2], + 'Заказы все'[Валюта] = "TRY" + ) + ``` + formatString: #,0 + displayFolder: Заказы тех + + measure 'Сумма тех заказ, usd2' = ``` + + CALCULATE( + [Тех заказ сумма всего в usd2], + 'Заказы все'[Валюта] = "USD2" + ) + ``` + formatString: #,0 + displayFolder: Заказы тех + + measure 'Согласование упак.' = + + CALCULATE( + SUM('Заказы все'[Кол. упаковок]), + FILTER('Заказы все', [Статус] IN {"На согласовании", "Согласован" }) + ) + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Согласование кол.' = + + CALCULATE( + SUM('Заказы все'[Количество]), + FILTER('Заказы все', [Статус] IN {"На согласовании", "Согласован" }) + ) + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Согласование объем, м3' = + + CALCULATE( + SUM('Заказы все'[Объем, м3]), + FILTER('Заказы все', [Статус] IN {"На согласовании", "Согласован" }) + ) + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Согласование сумма всего в руб' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в руб]), + FILTER('Заказы все', [Статус] IN {"На согласовании", "Согласован" }) + ) + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Согласование сумма всего в usd2' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в usd2]), + FILTER('Заказы все', [Статус] IN {"На согласовании", "Согласован" }) + ) + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Сумма согласование, руб' = ``` + + CALCULATE( + [Согласование сумма всего в usd2], + 'Заказы все'[Валюта] = "руб." + ) + ``` + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Сумма согласование, cny' = ``` + + CALCULATE( + [Согласование сумма всего в usd2], + 'Заказы все'[Валюта] = "CNY" + ) + ``` + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Сумма согласование, try' = ``` + + CALCULATE( + [Согласование сумма всего в usd2], + 'Заказы все'[Валюта] = "TRY" + ) + ``` + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Сумма согласование, usd2' = ``` + + CALCULATE( + [Согласование сумма всего в usd2], + 'Заказы все'[Валюта] = "USD2" + ) + ``` + formatString: #,0 + displayFolder: Заказы согласование + + measure 'Выгружен на складе кол.' = + + CALCULATE( + SUM('Заказы все'[Количество]), + FILTER('Заказы все', [Статус] = "Выгружен на складе") + ) + formatString: #,0 + displayFolder: Заказы выгружены на складе + + measure 'Выгружен на складе упак.' = + + CALCULATE( + SUM('Заказы все'[Кол. упаковок]), + FILTER('Заказы все', [Статус] = "Выгружен на складе") + ) + formatString: #,0 + displayFolder: Заказы выгружены на складе + + measure 'Выгружен на складе объем, м3' = + + CALCULATE( + SUM('Заказы все'[Объем, м3]), + FILTER('Заказы все', [Статус] = "Выгружен на складе") + ) + formatString: #,0 + displayFolder: Заказы выгружены на складе + + measure 'Выгружен на складе сумма всего в руб' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в руб]), + FILTER('Заказы все', [Статус] = "Выгружен на складе") + ) + formatString: #,0 + displayFolder: Заказы выгружены на складе + + measure 'Выгружен на складе сумма всего в usd2' = + + CALCULATE( + SUM('Заказы все'[Сумма всего в usd2]), + FILTER('Заказы все', [Статус] = "Выгружен на складе") + ) + formatString: #,0 + displayFolder: Заказы выгружены на складе + + measure 'Сумма выгружен на складе, руб' = ``` + + CALCULATE( + [Выгружен на складе сумма всего в usd2], + 'Заказы все'[Валюта] = "руб." + ) + ``` + formatString: #,0 + displayFolder: Заказы выгружены на складе + + measure 'Сумма выгружен на складе, cny' = ``` + + CALCULATE( + [Выгружен на складе сумма всего в usd2], + 'Заказы все'[Валюта] = "CNY" + ) + ``` + formatString: #,0 + displayFolder: Заказы выгружены на складе + + measure 'Сумма выгружен на складе, try' = ``` + + CALCULATE( + [Выгружен на складе сумма всего в usd2], + 'Заказы все'[Валюта] = "TRY" + ) + ``` + formatString: #,0 + displayFolder: Заказы выгружены на складе + + measure 'Сумма выгружен на складе, usd2' = ``` + + CALCULATE( + [Выгружен на складе сумма всего в usd2], + 'Заказы все'[Валюта] = "USD2" + ) + ``` + formatString: #,0 + displayFolder: Заказы выгружены на складе + + column 'Дата заказа поставщику' + dataType: dateTime + formatString: Long Date + sourceProviderType: date + summarizeBy: none + sourceColumn: Дата заказа поставщику + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column 'Номер заказа поставщику' + dataType: string + isNullable: false + sourceProviderType: nchar + summarizeBy: none + sourceColumn: Номер заказа поставщику + + annotation SummarizationSetBy = Automatic + + column partner_id + dataType: string + isHidden + sourceProviderType: nvarchar(36) + summarizeBy: none + sourceColumn: partner_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Контрагент + dataType: string + sourceProviderType: nvarchar(100) + summarizeBy: none + sourceColumn: Контрагент + + annotation SummarizationSetBy = Automatic + + column Статус + dataType: string + isNullable: false + sourceProviderType: varchar(15) + summarizeBy: none + sourceColumn: Статус + + annotation SummarizationSetBy = Automatic + + column artic_id + dataType: string + isHidden + sourceProviderType: nvarchar(36) + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Количество + dataType: double + isNullable: false + sourceProviderType: decimal(15, 3) + summarizeBy: sum + sourceColumn: Количество + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Кол. упаковок' + dataType: double + formatString: #,0 + sourceProviderType: decimal(10, 2) + summarizeBy: sum + sourceColumn: Кол. упаковок + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDecimal":true} + + column 'Объем, м3' + dataType: double + sourceProviderType: decimal(38, 13) + summarizeBy: sum + sourceColumn: Объем, м3 + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Цена + dataType: double + sourceProviderType: decimal(20, 12) + summarizeBy: sum + sourceColumn: Цена + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Сумма + dataType: double + isHidden + sourceProviderType: decimal(20, 7) + summarizeBy: sum + sourceColumn: Сумма + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Валюта + dataType: string + sourceProviderType: nvarchar(10) + summarizeBy: none + sourceColumn: Валюта + + annotation SummarizationSetBy = Automatic + + column 'Сумма всего в руб' + dataType: double + formatString: #,0 + sourceProviderType: decimal(31, 11) + summarizeBy: sum + sourceColumn: Сумма всего в руб + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDecimal":true} + + column Партнер + dataType: string + sourceProviderType: nvarchar(100) + summarizeBy: none + sourceColumn: Партнер + + annotation SummarizationSetBy = Automatic + + column 'Сумма всего в usd2' + dataType: double + formatString: #,0.00 + sourceProviderType: decimal(38, 14) + summarizeBy: sum + sourceColumn: Сумма всего в usd2 + + annotation SummarizationSetBy = Automatic + + partition 'Заказы все' = m + mode: directQuery + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_Заказы = Источник{[Schema="pbi",Item="Заказы"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(pbi_Заказы,{{"Дата заказа поставщику", type date}}), + #"Строки с примененным фильтром" = Table.SelectRows(#"Измененный тип", each ([Статус] <> "Закрыт" and [Статус] <> "Неизвестно" and [Статус] <> "Подтвержден")), + #"Строки с примененным фильтром1" = Table.SelectRows(#"Строки с примененным фильтром", each [Дата заказа поставщику] >= #date(2024, 1, 1)), + Округлено = Table.TransformColumns(#"Строки с примененным фильтром1",{{"Сумма всего, usd2", each Number.Round(_, 7), type number}}), + #"Переименованные столбцы" = Table.RenameColumns(Округлено,{{"Сумма в руб.", "Сумма всего в руб"}, {"Сумма всего, usd2", "Сумма всего в usd2"}}) + in + #"Переименованные столбцы" + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/Закупки.tmdl b/analytics/pbi/model/report/Model/tables/Закупки.tmdl new file mode 100644 index 0000000..f6507bf --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Закупки.tmdl @@ -0,0 +1,261 @@ +table Закупки + + measure 'Сумма закупки, руб' = ``` + + SUM('Закупки'[Закуп.Закупка, руб]) + + SUM('Закупки'[Закуп.Таможня, руб]) + + SUM('Закупки'[Закуп.Доставка, руб]) + + SUM('Закупки'[Закуп.НДС, руб]) + + SUM('Закупки'[Закуп.Производство, руб]) - + SUM('Закупки'[Закуп.Доп расходы, руб]) + ``` + formatString: #,0 + + measure 'Сумма закупки, usd' = ``` + + SUM('Закупки'[Закуп.Закупка, usd]) + + SUM('Закупки'[Закуп.Таможня, usd]) + + SUM('Закупки'[Закуп.Доставка, usd]) + + SUM('Закупки'[Закуп.НДС, usd]) + + SUM('Закупки'[Закуп.Производство, usd]) - + SUM('Закупки'[Закуп.Доп расходы, usd]) + ``` + formatString: #,0 + + measure 'Цена учетная по закупкам, руб' = ``` + + + SUMX('Номенклатура', + DIVIDE( + [Сумма закупки, руб], + SUM('Закупки'[Кол-во закупка, шт]), 0 + + ) + ) + + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Период + isHidden + formatString: General Date + summarizeBy: none + isNameInferred + sourceColumn: [Период] + + annotation SummarizationSetBy = Automatic + + column artic_id + isHidden + summarizeBy: none + isNameInferred + sourceColumn: [artic_id] + + annotation SummarizationSetBy = Automatic + + column Организация + isHidden + summarizeBy: none + isNameInferred + sourceColumn: [Организация] + + annotation SummarizationSetBy = Automatic + + column Контрагент + summarizeBy: none + isNameInferred + sourceColumn: [Контрагент] + + annotation SummarizationSetBy = Automatic + + column Менеджер + summarizeBy: none + isNameInferred + sourceColumn: [Менеджер] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Закупка, руб' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Закупка, руб] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Закупка, usd' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Закупка, usd] + + annotation SummarizationSetBy = Automatic + + column 'Валюта документа' + summarizeBy: none + isNameInferred + sourceColumn: [Валюта документа] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Доставка, руб' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Доставка, руб] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Доставка, usd' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Доставка, usd] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Таможня, руб' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Таможня, руб] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Таможня, usd' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Таможня, usd] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.НДС, руб' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.НДС, руб] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.НДС, usd' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.НДС, usd] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Производство, руб' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Производство, руб] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Производство, usd' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Производство, usd] + + annotation SummarizationSetBy = Automatic + + column Статья + summarizeBy: none + isNameInferred + sourceColumn: [Статья] + + annotation SummarizationSetBy = Automatic + + column partner_id + summarizeBy: none + isNameInferred + sourceColumn: [partner_id] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Доп расходы, руб' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Доп расходы, руб] + + annotation SummarizationSetBy = Automatic + + column 'Закуп.Доп расходы, usd' + formatString: #,0 + displayFolder: Учет закупка + summarizeBy: sum + isNameInferred + sourceColumn: [Закуп.Доп расходы, usd] + + annotation SummarizationSetBy = Automatic + + column 'Кол-во закупка, шт' + formatString: #,0 + summarizeBy: sum + isNameInferred + sourceColumn: [Кол-во закупка, шт] + + annotation SummarizationSetBy = Automatic + + column 'Кол-во закупка, упак' + formatString: #,0 + summarizeBy: sum + isNameInferred + sourceColumn: [Кол-во закупка, упак] + + annotation SummarizationSetBy = Automatic + + partition Закупки = calculated + mode: import + source = ``` + + var tbl = FILTER( + 'Себестоимость', + 'Себестоимость'[Вид операции]="Приход" && ('Себестоимость'[Статья] = "Закупка" + || 'Себестоимость'[Статья] = "Ввод начальных остатков" || 'Себестоимость'[Статья] = "Производство товара" + || 'Себестоимость'[Статья] = "Доставка контейнера ВЭД" || 'Себестоимость'[Статья] = "НДС" || 'Себестоимость'[Статья] = "Доп расходы" || 'Себестоимость'[Статья] = "Оприходование излишков товара" + )) + return SELECTCOLUMNS(tbl + , "Период", 'Себестоимость'[Период] + , "artic_id", 'Себестоимость'[artic_id] + , "Кол-во закупка, шт", 'Себестоимость'[Количество] + , "Кол-во закупка, упак", 'Себестоимость'[КоличествоУпаковок] + , "Организация", 'Себестоимость'[Организация] + , "Контрагент", 'Себестоимость'[Контрагент] + , "Менеджер", 'Себестоимость'[Менеджер] + , "partner_id", 'Себестоимость'[PartnerId] + , "Валюта документа", 'Себестоимость'[Валюта документа] + , "Статья", 'Себестоимость'[Статья] + , "Закуп.Закупка, руб", 'Себестоимость'[Закупка] + , "Закуп.Закупка, usd", 'Себестоимость'[Закупка, usd2] + , "Закуп.Доставка, руб", 'Себестоимость'[Доставка] + , "Закуп.Доставка, usd", 'Себестоимость'[Доставка, usd] + , "Закуп.Таможня, руб", 'Себестоимость'[Таможня] + , "Закуп.Таможня, usd", 'Себестоимость'[Таможня, usd] + , "Закуп.НДС, руб", 'Себестоимость'[НДС] + , "Закуп.НДС, usd", 'Себестоимость'[НДС, usd] + , "Закуп.Производство, руб", 'Себестоимость'[Производство] + , "Закуп.Производство, usd", 'Себестоимость'[Производство, usd] + , "Закуп.Доп расходы, руб", 'Себестоимость'[Доп расходы] + , "Закуп.Доп расходы, usd", 'Себестоимость'[Доп расходы USD2+2] + ) + ``` + + annotation PBI_Id = ebfb73925d604adf81607d1026029df9 + diff --git a/analytics/pbi/model/report/Model/tables/Заявки на оплату.tmdl b/analytics/pbi/model/report/Model/tables/Заявки на оплату.tmdl new file mode 100644 index 0000000..906d7f5 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Заявки на оплату.tmdl @@ -0,0 +1,110 @@ +table 'Заявки на оплату' + + column date + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: date + + variation Изменение + isDefault + relationship: 8208f512-c8a9-47d1-b47c-2bce30b6b8f8 + defaultHierarchy: LocalDateTable_729bf6db-04e4-4a26-9dce-b3837667cb92.'Иерархия дат' + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column 'Номер заявки' + dataType: string + summarizeBy: none + sourceColumn: Номер заявки + + annotation SummarizationSetBy = Automatic + + column Статус + dataType: string + summarizeBy: none + sourceColumn: Статус + + annotation SummarizationSetBy = Automatic + + column Сумма + dataType: double + summarizeBy: sum + sourceColumn: Сумма + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Валюта документа' + dataType: string + summarizeBy: none + sourceColumn: Валюта документа + + annotation SummarizationSetBy = Automatic + + column partner_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: partner_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Партнер + dataType: string + summarizeBy: none + sourceColumn: Партнер + + annotation SummarizationSetBy = Automatic + + column Получатель + dataType: string + summarizeBy: none + sourceColumn: Получатель + + annotation SummarizationSetBy = Automatic + + column Комментарий + dataType: string + summarizeBy: none + sourceColumn: Комментарий + + annotation SummarizationSetBy = Automatic + + column 'Дата оплаты план' + dataType: dateTime + formatString: Long Date + summarizeBy: none + sourceColumn: Дата оплаты план + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column 'Статья ДДС' + dataType: string + summarizeBy: none + sourceColumn: Статья ДДС + + annotation SummarizationSetBy = Automatic + + partition 'Заявки на оплату' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_Заявки_на_оплату = Источник{[Schema="pbi",Item="Заявки_на_оплату"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(pbi_Заявки_на_оплату,{{"date", type date}, {"Дата оплаты план", type date}}) + in + #"Измененный тип" + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/Менеджеры.tmdl b/analytics/pbi/model/report/Model/tables/Менеджеры.tmdl new file mode 100644 index 0000000..e329d7d --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Менеджеры.tmdl @@ -0,0 +1,49 @@ +table Менеджеры + + column user_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: user_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Менеджер + dataType: string + summarizeBy: none + sourceColumn: Менеджер + + annotation SummarizationSetBy = Automatic + + column Подразделение + dataType: string + summarizeBy: none + sourceColumn: Подразделение + + annotation SummarizationSetBy = Automatic + + column 'Вышестоящее подразделение' + dataType: string + summarizeBy: none + sourceColumn: Вышестоящее подразделение + + annotation SummarizationSetBy = Automatic + + partition Менеджеры = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_users_1C = Источник{[Schema="pbi",Item="users_1C"]}[Data], + #"Переименованные столбцы" = Table.RenameColumns(pbi_users_1C,{{"podr", "Подразделение"}, {"user", "Менеджер"}}), + #"Строки с примененным фильтром" = Table.SelectRows(#"Переименованные столбцы", each ([Подразделение] = "<Подразделение по умолчанию>" or [Подразделение] = "Cash&Carry" or [Подразделение] = "Бухгалтерия" or [Подразделение] = "Дедовск2" or [Подразделение] = "Маркетплейс" or [Подразделение] = "МРК" or [Подразделение] = "Операторы" or [Подразделение] = "Оптовый отдел" or [Подразделение] = "Отдел закупок" or [Подразделение] = "Отдел продаж" or [Подразделение] = "Региональный отдел" or [Подразделение] = "Сельскохозяйственная")), + #"Переименованные столбцы1" = Table.RenameColumns(#"Строки с примененным фильтром",{{"higher_podr", "Вышестоящее подразделение"}}) + in + #"Переименованные столбцы1" + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/Номенклатура.tmdl b/analytics/pbi/model/report/Model/tables/Номенклатура.tmdl new file mode 100644 index 0000000..84b0d65 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Номенклатура.tmdl @@ -0,0 +1,1174 @@ +table Номенклатура + + measure Объем = ``` + sumx('Номенклатура', DIVIDE( 'Основной отчет'[Остаток - МП конец, шт],'Номенклатура'[Знаменатель объема],0)*'Номенклатура'[Числитель объема]) + ``` + displayFolder: Измерения + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Ср. цена учетная, руб' = + + CALCULATE( + DIVIDE( + 'Основной отчет'[Сумма учетная, руб], + 'Основной отчет'[Количество продаж, шт] + ), + FILTER('.Календарь', '.Календарь'[Дата] > TODAY()-365) + ) + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Дней с первой продажи' = ``` + + DATEDIFF( + CALCULATE( + MIN('Себестоимость'[Период]), + FILTER( + 'Себестоимость', + 'Себестоимость'[Вид операции] = "Расход" && + 'Себестоимость'[Статья] = "Реализация" + ) + ), + TODAY(), + DAY + ) + + ``` + formatString: 0 + displayFolder: Аналитика + + measure 'Упущ. сумма продаж, руб' = + + CALCULATE( + SUMX('Номенклатура', [_Упущ. продажи, руб]) + ) + formatString: #,0 + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Упущ. сумма продаж, USD' = SUMX('Номенклатура', [_Упущ. продажи, USD]) + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Отчет продажи упак/день' = ``` + CALCULATE( + DIVIDE( + 'Основной отчет'[Количество продаж, упак], + SUM('Упущенные продажи'[Дней в продаже]), 0 + ), + FILTER('.Календарь', '.Календарь'[Дата] > TODAY() - 365 + )) + ``` + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Отчет ТН руб/день за 365 дней' = ``` + + CALCULATE( + DIVIDE('Основной отчет'[Торг. надбавка, руб], SUM('Упущенные продажи'[Дней в продаже]), 0), + FILTER('.Календарь', '.Календарь'[Дата] > /* DATE(2023,01,01)*/ TODAY() - 365 ) + ) + ``` + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Дней в продаже' = + + CALCULATE( + SUM('Упущенные продажи'[Дней в продаже]) + ) + formatString: #,0 + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Дней отсутствия в продаже' = SUM('Упущенные продажи'[Дней отсутствия в продаже]) + formatString: #,0 + displayFolder: Аналитика + + measure 'Рентабельность -70р за упак за год' = ``` + + CALCULATE( + DIVIDE( + 'Основной отчет'[Торг. надбавка - 70р за упак, руб], + SUM([Остаток МАКС год, руб]) + ) + , + FILTER( + ALL('.Календарь'), + '.Календарь'[Дата]>TODAY() - 365 + ) + ) + ``` + isHidden + displayFolder: Аналитика + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure Рекомендация = + + VAR logistic = 120 + VAR ostatokP = SUM('Номенклатура'[Остаток дней продаж потенциальный + согласование]) + RETURN + SWITCH( + TRUE(), + ostatokP < logistic, "1. Меньше 120 дней", + ostatokP < 2 * logistic, "2. Продаем", + ostatokP < 3 * logistic, "3. Больше 240 дней", + "4. Больше 360 дней" + ) + displayFolder: Аналитика + + measure 'Вес заказов' = ``` + + SUMX( + FILTER( + 'Себестоимость', + 'Себестоимость'[Вид операции] = "Расход" && + 'Себестоимость'[Статья] = "Реализация" + ), + 'Себестоимость'[Количество] * + DIVIDE( + COALESCE(RELATED('Номенклатура'[Числитель веса]), 0), + COALESCE(RELATED('Номенклатура'[Знаменатель веса]), 1) + ) + ) + + ``` + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Объем заказов' = ``` + + SUMX( + FILTER( + 'Себестоимость', + 'Себестоимость'[Вид операции] = "Расход" && + 'Себестоимость'[Статья] = "Реализация" + ), + 'Себестоимость'[Количество] * + DIVIDE( + COALESCE(RELATED('Номенклатура'[Числитель объема]), 0), + COALESCE(RELATED('Номенклатура'[Знаменатель объема]), 1) + ) + ) + + ``` + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Остаток дней продаж потенциальный' = ``` + + CALCULATE( + DIVIDE( + 'Основной отчет'[Остаток потенциальный, упак], + 'Номенклатура'[Отчет продажи упак/день] + ), ALL('.Календарь'[Дата]) + ) + ``` + formatString: #,0 + isHidden + displayFolder: Аналитика + + changedProperty = IsHidden + + measure 'ТН за квартал' = + + CALCULATE( + 'Основной отчет'[Торг. надбавка, руб] + , + FILTER( + ALL('.Календарь'), + '.Календарь'[Дата]>TODAY() - 90 + ) + ) + formatString: #,0 + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'ТН за год' = + + CALCULATE( + 'Основной отчет'[Торг. надбавка, руб] + , + FILTER( + ALL('.Календарь'), + '.Календарь'[Дата]>TODAY() - 365 + ) + ) + formatString: #,0 + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Коэффициент вариации' = DIVIDE(SUM('Номенклатура'[СКО месячных продаж, упак]), SUM('Номенклатура'[Средние месячные продажи, упак])) + displayFolder: Статистика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Ср. цена продажи упак, руб x 1000' = + + CALCULATE( + DIVIDE( + 'Основной отчет'[Сумма продаж + МП + РК, руб] * 1000, + 'Основной отчет'[Количество продаж, упак] + ), + FILTER('.Календарь', '.Календарь'[Дата] > TODAY()-365) + ) + formatString: #,0 + displayFolder: Аналитика + + measure 'Ср. цена учетная упак, руб x 1000' = + + CALCULATE( + DIVIDE( + 'Основной отчет'[Сумма учетная, руб] * 1000, + 'Основной отчет'[Количество продаж, упак] + ), + FILTER('.Календарь', '.Календарь'[Дата] > TODAY()-365) + ) + formatString: #,0 + displayFolder: Аналитика + + column _artic_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: _artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Код УТ' + dataType: string + displayFolder: Описание + summarizeBy: none + sourceColumn: Код УТ + + annotation SummarizationSetBy = Automatic + + column Наименование + dataType: string + displayFolder: Описание + summarizeBy: none + sourceColumn: Наименование + + annotation SummarizationSetBy = Automatic + + column Артикул + dataType: string + displayFolder: Описание + summarizeBy: none + sourceColumn: Артикул + + annotation SummarizationSetBy = Automatic + + column _group_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: _group_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Ценовая группа' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Ценовая группа + + annotation SummarizationSetBy = Automatic + + column Производитель + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Производитель + + annotation SummarizationSetBy = Automatic + + column Фото + dataType: string + displayFolder: Описание + dataCategory: ImageUrl + summarizeBy: none + sourceColumn: Фото + + annotation SummarizationSetBy = Automatic + + column 'Менеджер по закупкам' + dataType: string + displayFolder: Менеджеры + summarizeBy: none + sourceColumn: Менеджер по закупкам + + annotation SummarizationSetBy = Automatic + + column РуководительНаправления + dataType: string + displayFolder: Менеджеры + summarizeBy: none + sourceColumn: РуководительНаправления + + annotation SummarizationSetBy = Automatic + + column 'Базовая упаковка' + dataType: double + formatString: #,0 + displayFolder: Описание + summarizeBy: sum + sourceColumn: Базовая упаковка + + annotation SummarizationSetBy = Automatic + + column 'ABC статус 12м' + dataType: string + displayFolder: Статусы + summarizeBy: none + sourceColumn: ABC статус 12м + + annotation SummarizationSetBy = Automatic + + column Статус + dataType: string + displayFolder: Статусы + summarizeBy: none + sourceColumn: Статус + + annotation SummarizationSetBy = Automatic + + column Коллекция + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Коллекция + + annotation SummarizationSetBy = Automatic + + column Бренд + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Бренд + + annotation SummarizationSetBy = Automatic + + column 'Знаменатель веса' + dataType: double + displayFolder: Измерения + summarizeBy: sum + sourceColumn: Знаменатель веса + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Числитель веса' + dataType: double + displayFolder: Измерения + summarizeBy: sum + sourceColumn: Числитель веса + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Знаменатель объема' + dataType: double + displayFolder: Измерения + summarizeBy: sum + sourceColumn: Знаменатель объема + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Числитель объема' + dataType: double + displayFolder: Измерения + summarizeBy: sum + sourceColumn: Числитель объема + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Вид номенклатуры' + dataType: string + displayFolder: Описание + summarizeBy: none + sourceColumn: Вид номенклатуры + + annotation SummarizationSetBy = Automatic + + column 'Сквозной цвет' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Сквозной цвет + + annotation SummarizationSetBy = Automatic + + column Метка + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Метка + + annotation SummarizationSetBy = Automatic + + column 'Ширина, мм' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Ширина, мм + + annotation SummarizationSetBy = Automatic + + column Цвет + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Цвет + + annotation SummarizationSetBy = Automatic + + column Ширина + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Ширина + + annotation SummarizationSetBy = Automatic + + column 'Формат упаковки' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Формат упаковки + + annotation SummarizationSetBy = Automatic + + column 'маркеты.WB' + dataType: string + displayFolder: Маркеты + summarizeBy: none + sourceColumn: маркеты.WB + + annotation SummarizationSetBy = Automatic + + column 'маркеты.СТМ' + dataType: string + displayFolder: Маркеты + summarizeBy: none + sourceColumn: маркеты.СТМ + + annotation SummarizationSetBy = Automatic + + column 'маркеты.Выгружать на я.маркет' + dataType: string + displayFolder: Маркеты + summarizeBy: none + sourceColumn: маркеты.Выгружать на я.маркет + + annotation SummarizationSetBy = Automatic + + column 'маркеты.Выгружать в Google Merchant' + dataType: string + displayFolder: Маркеты + summarizeBy: none + sourceColumn: маркеты.Выгружать в Google Merchant + + annotation SummarizationSetBy = Automatic + + column 'Товарный менеджер' + dataType: string + displayFolder: Менеджеры + summarizeBy: none + sourceColumn: Товарный менеджер + + annotation SummarizationSetBy = Automatic + + column 'Номер цвета' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Номер цвета + + annotation SummarizationSetBy = Automatic + + column 'Да/Нет Собственное пр-во' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Да/Нет Собственное пр-во + + annotation SummarizationSetBy = Automatic + + column 'Менеджер OZON' + dataType: string + displayFolder: Менеджеры + summarizeBy: none + sourceColumn: Менеджер OZON + + annotation SummarizationSetBy = Automatic + + column 'Менеджер WB' + dataType: string + displayFolder: Менеджеры + summarizeBy: none + sourceColumn: Менеджер WB + + annotation SummarizationSetBy = Automatic + + column 'Макс. запас' + dataType: int64 + formatString: #,0 + displayFolder: Измерения + summarizeBy: sum + sourceColumn: Макс. запас + + annotation SummarizationSetBy = Automatic + + column 'Мин. запас' + dataType: int64 + formatString: #,0 + displayFolder: Измерения + summarizeBy: sum + sourceColumn: Мин. запас + + annotation SummarizationSetBy = Automatic + + column 'Товар МП' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Товар МП + + annotation SummarizationSetBy = Automatic + + column 'Цена учетная последняя известная, руб' = ``` + + + VAR LastKnowDate = MAX('.Календарь'[Дата]) + + RETURN + CALCULATE( + [Цена учетная по закупкам, руб], + TOPN( + 1, + FILTER( + ALL('Закупки'), + 'Закупки'[Период] <= LastKnowDate && + 'Закупки'[artic_id] = 'Номенклатура'[_artic_id] + ), + 'Закупки'[Период], + DESC + ) + ) + ``` + isHidden + displayFolder: Свойства + summarizeBy: sum + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'ABC статус 3м' + dataType: string + displayFolder: Статусы + summarizeBy: none + sourceColumn: ABC статус 3м + + annotation SummarizationSetBy = Automatic + + column 'Ценовой сегмент Магок' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Ценовой сегмент Магок + + annotation SummarizationSetBy = Automatic + + column 'Ценовой сегмент МП' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Ценовой сегмент МП + + annotation SummarizationSetBy = Automatic + + column 'Кол-во упак в заказе Магок' + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Кол-во упак в заказе Магок + + annotation SummarizationSetBy = Automatic + + column 'Цена учетная последняя, руб' = ``` + + + VAR LastKnowDate = MAX('.Календарь'[Дата]) + + RETURN + CALCULATE( + DIVIDE([Сумма закупки, руб], + SUM('Закупки'[Кол-во закупка, шт]), 0 + ), + TOPN( + 1, + FILTER( + ALL('Закупки'), + 'Закупки'[Период] <= LastKnowDate && + 'Закупки'[artic_id] = 'Номенклатура'[_artic_id] + ), + 'Закупки'[Период], + DESC + ) + ) + ``` + isHidden + displayFolder: Свойства + summarizeBy: sum + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Цена учетная последняя, usd' = ``` + + + VAR LastKnowDate = MAX('.Календарь'[Дата]) + + RETURN + CALCULATE( + DIVIDE([Сумма закупки, usd], + SUM('Закупки'[Кол-во закупка, шт]), 0 + ), + TOPN( + 1, + FILTER( + ALL('Закупки'), + 'Закупки'[Период] <= LastKnowDate && + 'Закупки'[artic_id] = 'Номенклатура'[_artic_id] + ), + 'Закупки'[Период], + DESC + ) + ) + ``` + isHidden + displayFolder: Свойства + summarizeBy: sum + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Цена учетная, руб' + dataType: double + formatString: #,0.0000 + displayFolder: Свойства + summarizeBy: sum + sourceColumn: Цена учетная, руб + + annotation SummarizationSetBy = Automatic + + column 'Цена учетная, usd' + dataType: double + displayFolder: Свойства + summarizeBy: sum + sourceColumn: Цена учетная, usd + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column max_year_quantity + dataType: double + formatString: #,0 + displayFolder: Статистика + summarizeBy: sum + sourceColumn: max_year_quantity + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDecimal":true} + + column max_quarter_quantity + dataType: double + formatString: #,0 + displayFolder: Статистика + summarizeBy: sum + sourceColumn: max_quarter_quantity + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDecimal":true} + + column 'Остаток дней продаж потенциальный, дн' = ``` + + CALCULATE( + DIVIDE( + 'Основной отчет'[Остаток потенциальный, упак], + 'Номенклатура'[Отчет продажи упак/день] + ), ALL('.Календарь'[Дата]) + ) + ``` + formatString: #,0 + displayFolder: Аналитика + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + column 'Остаток дней продаж потенциальный + согласование' = ``` + + CALCULATE( + DIVIDE( + 'Основной отчет'[Остаток потенциальный + согласование, упак], + 'Номенклатура'[Отчет продажи упак/день] + ), ALL('.Календарь'[Дата]) + ) + ``` + formatString: #,0 + displayFolder: Аналитика + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + column 'Остаток дней продаж без остатка МП' = ``` + + CALCULATE( + DIVIDE( + 'Основной отчет'[Остаток потенциальный - МП, шт], + SUM('Номенклатура'[Продажи шт / день]) + ), + ALL('.Календарь'[Дата]) + ) + ``` + displayFolder: Аналитика + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'ID OZON' + dataType: string + displayFolder: Описание + summarizeBy: none + sourceColumn: ID OZON + + annotation SummarizationSetBy = Automatic + + column 'ID WB' + dataType: string + displayFolder: Описание + summarizeBy: none + sourceColumn: ID WB + + annotation SummarizationSetBy = Automatic + + column 'Средние месячные продажи, упак' + dataType: double + formatString: #,0 + displayFolder: Статистика + summarizeBy: sum + sourceColumn: Средние месячные продажи, упак + + annotation SummarizationSetBy = Automatic + + column 'СКО месячных продаж, упак' + dataType: double + formatString: #,0 + displayFolder: Статистика + summarizeBy: sum + sourceColumn: СКО месячных продаж, упак + + annotation SummarizationSetBy = Automatic + + column minAvailableQty + dataType: int64 + displayFolder: Статистика + summarizeBy: sum + sourceColumn: minAvailableQty + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'XYZ статус 12м' + dataType: string + displayFolder: Статусы + summarizeBy: none + sourceColumn: XYZ статус 12м + + annotation SummarizationSetBy = Automatic + + column 'Качество контента Ozon' + dataType: int64 + formatString: 0 + displayFolder: Описание + summarizeBy: sum + sourceColumn: Качество контента Ozon + + annotation SummarizationSetBy = Automatic + + column 'Качество контента WB' + dataType: int64 + formatString: 0 + displayFolder: Описание + summarizeBy: sum + sourceColumn: Качество контента WB + + annotation SummarizationSetBy = Automatic + + column 'Качество контента WB by Ozon' + dataType: int64 + formatString: 0 + displayFolder: Описание + summarizeBy: sum + sourceColumn: Качество контента WB by Ozon + + annotation SummarizationSetBy = Automatic + + column 'Качество контента Magok' + dataType: int64 + formatString: 0 + displayFolder: Описание + summarizeBy: sum + sourceColumn: Качество контента Magok + + annotation SummarizationSetBy = Automatic + + column Неликвид + dataType: string + displayFolder: Статусы + summarizeBy: none + sourceColumn: Неликвид + + annotation SummarizationSetBy = Automatic + + column 'маркеты.Ozon' + dataType: string + displayFolder: Маркеты + summarizeBy: none + sourceColumn: маркеты.Ozon + + annotation SummarizationSetBy = Automatic + + column Размер + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Размер + + annotation SummarizationSetBy = Automatic + + column Особенность + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Особенность + + annotation SummarizationSetBy = Automatic + + column Форма + dataType: string + displayFolder: Свойства + summarizeBy: none + sourceColumn: Форма + + annotation SummarizationSetBy = Automatic + + column 'ABC Парето' + dataType: string + displayFolder: Статусы + summarizeBy: none + sourceColumn: ABC Парето + + annotation SummarizationSetBy = Automatic + + column 'Тип товара' + dataType: string + displayFolder: Описание + summarizeBy: none + sourceColumn: Тип товара + + annotation SummarizationSetBy = Automatic + + column 'QTY PACKS' + dataType: string + displayFolder: Измерения + summarizeBy: none + sourceColumn: QTY PACKS + + annotation SummarizationSetBy = Automatic + + column 'Количество упак в коробе' + dataType: double + displayFolder: Измерения + summarizeBy: sum + sourceColumn: Количество упак в коробе + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Количество упак в кванте' + dataType: double + displayFolder: Измерения + summarizeBy: sum + sourceColumn: Количество упак в кванте + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Продано шт' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Продано шт + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Продажи шт / день' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Продажи шт / день + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Остаток дней продаж' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Остаток дней продаж + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Продажи / год, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Продажи / год, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'учетная сумма / год, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: учетная сумма / год, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'ТН / год, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: ТН / год, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Стоимость МП год, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Стоимость МП год, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column '%ТН год, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: %ТН год, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Дней в продаже / год' + dataType: int64 + formatString: 0 + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Дней в продаже / год + + annotation SummarizationSetBy = Automatic + + column 'Дней в продаже / квартал' + dataType: int64 + formatString: 0 + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Дней в продаже / квартал + + annotation SummarizationSetBy = Automatic + + column 'Продажи / квартал, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Продажи / квартал, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'учетная сумма / квартал, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: учетная сумма / квартал, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'ТН / квартал, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: ТН / квартал, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'ТН / месяц, руб.' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: ТН / месяц, руб. + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Оплаченный остаток' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Оплаченный остаток + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Рентабельность / год' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Рентабельность / год + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Рентабельность / квартал' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Рентабельность / квартал + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Рентабельность / будущий год' + dataType: double + displayFolder: Аналитика + summarizeBy: sum + sourceColumn: Рентабельность / будущий год + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + partition Номенклатура-6a1affcd-7af8-46ea-9676-cf8ac08c58c1 = m + mode: import + source = ``` + let + Источник = Sql.Databases("prdsql"), + mag_pbi = Источник{[Name="mag_pbi"]}[Data], + pbi_nomenclature = mag_pbi{[Schema="pbi",Item="nomeclature_for_pbi"]}[Data], + + + //sales_w_nomenclature = Источник{[Schema="sales",Item="w_nomenclature"]}[Data], + #"Переименованные столбцы" = Table.RenameColumns(pbi_nomenclature,{{"description", "Наименование"}, {"artic", "Артикул"}, {"artic_id", "_artic_id"}, {"group_id", "_group_id"}, {"cenovaya_gruppa", "Ценовая группа"}, {"photo", "Фото"}, {"card", "Ссылка на карточку товара"}/*, {"продажи упаковки в день", "скорость упак в день"}, {"продажи штуки в день", "норма продаж шт в день"}*/}), + //#"Измененный тип" = Table.TransformColumnTypes(#"Переименованные столбцы",{{"норма продаж шт в день", type number}}), + #"Переименованные столбцы1" = Table.RenameColumns(#"Переименованные столбцы",{{"Ozon", "маркеты.Ozon"}, {"WB", "маркеты.WB"}, {"Выгружать на я.маркет", "маркеты.Выгружать на я.маркет"}, {"СТМ", "маркеты.СТМ"}, {"Выгружать в Google Merchant", "маркеты.Выгружать в Google Merchant"}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Переименованные столбцы1",{"base"}), + #"Замененное значение" = Table.ReplaceValue(#"Удаленные столбцы","1","Да",Replacer.ReplaceText,{"Да/Нет Собственное пр-во"}), + #"Замененное значение1" = Table.ReplaceValue(#"Замененное значение","0","Нет",Replacer.ReplaceText,{"Да/Нет Собственное пр-во"}), + #"Замененное значение2" = Table.ReplaceValue(#"Замененное значение1",null,"Нет",Replacer.ReplaceValue,{"Да/Нет Собственное пр-во"}), + //*#"Переименованные столбцы2" = Table.RenameColumns(#"Замененное значение2",{{"Наполнитель", "XYZ статус"}}), + #"Замененное значение3" = Table.ReplaceValue(#"Замененное значение2","",null,Replacer.ReplaceValue,{"Менеджер OZON"}), + #"Замененное значение4" = Table.ReplaceValue(#"Замененное значение3","",null,Replacer.ReplaceValue,{"Менеджер WB"}), + #"Замененное значение5" = Table.ReplaceValue(#"Замененное значение4",".",",",Replacer.ReplaceText,{"Мин. запас"}), + #"Измененный тип" = Table.TransformColumnTypes(#"Замененное значение5",{{"Мин. запас", Int64.Type}}), + #"Замененное значение6" = Table.ReplaceValue(#"Измененный тип",".",",",Replacer.ReplaceText,{"Макс. запас"}), + #"Измененный тип1" = Table.TransformColumnTypes(#"Замененное значение6",{{"Макс. запас", Int64.Type}}), + #"Замененное значение7" = Table.ReplaceValue(#"Измененный тип1","0",null,Replacer.ReplaceValue,{"Товар МП"}), + #"Замененное значение8" = Table.ReplaceValue(#"Замененное значение7","1","Да",Replacer.ReplaceText,{"Товар МП"}), + #"Переименованные столбцы3" = Table.RenameColumns(#"Замененное значение8",{{"МенеджерПоЗакупкам2", "Менеджер по закупкам"}, {"Товарныйменеджера", "Товарный менеджер"}}), + #"Удаленные столбцы1" = Table.RemoveColumns(#"Переименованные столбцы3",{"Тип плетения", "Тип шнура"}), + #"Переименованные столбцы4" = Table.RenameColumns(#"Удаленные столбцы1",{{"АБС статус", "ABC статус 12м"}, {"АБС план", "ABC статус 3м"}}), + #"Удаленные столбцы2" = Table.RemoveColumns(#"Переименованные столбцы4",{"Ссылка на карточку товара", "id magok"}), + #"Переименованные столбцы5" = Table.RenameColumns(#"Удаленные столбцы2",{{"СКО_МесячныхПродаж", "СКО месячных продаж, упак"}, {"СредниеМесячныеПродажи", "Средние месячные продажи, упак"}}), + #"Измененный тип2" = Table.TransformColumnTypes(#"Переименованные столбцы5",{{"minAvailableQty", Int64.Type}}), + #"Замененное значение9" = Table.ReplaceValue(#"Измененный тип2","0",null,Replacer.ReplaceValue,{"Неликвид"}), + #"Переименованные столбцы2" = Table.RenameColumns(#"Замененное значение9",{{"code", "Код УТ"}}), + #"Удаленные столбцы3" = Table.RemoveColumns(#"Переименованные столбцы2",{"Комментарий для матрицы"}) + + + in + #"Удаленные столбцы3" + ``` + + annotation PBI_QueryRelationships = {"columnCount":29,"keyColumnNames":[],"queryRelationships":[],"columnIdentities":["Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{artic_id,0}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{1c_id,1}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{code,2}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{cenovaya_gruppa,3}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{description,4}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{artic,5}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{vid_nomen,6}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{Производитель,7}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{group_id,8}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{1c_group,9}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{manager,10}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{ТоварныйМенеджера,11}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{МенеджерПоЗакупкам2,12}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{РуководительНаправления,13}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{АБС статус,14}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{Базовая упаковка,15}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{card,16}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{photo,17}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{base,18}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{недель в продаже,19}","Section1/Номенклатура/Измененный тип.{норма продаж шт в день,20}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{продажи упаковки в день,21}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{всего продано шт,22}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{всего продано упаковок,23}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{начало продаж,24}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{ср. кв. откл.,25}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{остаток продаж дн,26}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{норм. кв. откл.75,27}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{норм. кв. откл.90,28}"],"ColumnCount":29,"KeyColumnNames":[],"ColumnIdentities":["Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{artic_id,0}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{1c_id,1}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{code,2}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{cenovaya_gruppa,3}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{description,4}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{artic,5}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{vid_nomen,6}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{Производитель,7}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{group_id,8}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{1c_group,9}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{manager,10}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{ТоварныйМенеджера,11}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{МенеджерПоЗакупкам2,12}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{РуководительНаправления,13}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{АБС статус,14}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{Базовая упаковка,15}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{card,16}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{photo,17}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{base,18}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{недель в продаже,19}","Section1/Номенклатура/Измененный тип.{норма продаж шт в день,20}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{продажи упаковки в день,21}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{всего продано шт,22}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{всего продано упаковок,23}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{начало продаж,24}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{ср. кв. откл.,25}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{остаток продаж дн,26}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{норм. кв. откл.75,27}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_nomenclature.{норм. кв. откл.90,28}"],"RelationshipInfo":[]} + + annotation PBI_ResultType = Exception + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/Организация.tmdl b/analytics/pbi/model/report/Model/tables/Организация.tmdl new file mode 100644 index 0000000..b9d8760 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Организация.tmdl @@ -0,0 +1,15 @@ +table Организация + + column Организация + summarizeBy: none + isNameInferred + sourceColumn: Себестоимость[Организация] + + annotation SummarizationSetBy = Automatic + + partition Организация = calculated + mode: import + source = VALUES('Себестоимость'[Организация]) + + annotation PBI_Id = edae5abbb56b4e8dba63758043b0a407 + diff --git a/analytics/pbi/model/report/Model/tables/Основной отчет.tmdl b/analytics/pbi/model/report/Model/tables/Основной отчет.tmdl new file mode 100644 index 0000000..fe6556c --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Основной отчет.tmdl @@ -0,0 +1,1436 @@ +table 'Основной отчет' + + measure 'Сумма продаж + РК, руб' = ``` + + CALCULATE( + SUMX( + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация"), + 'Себестоимость'[Сумма plus МП, руб]) - SUM('Стоимость МП'[Расходы МП, руб] + ) * (1 + 'Параметр цена продажи, %'[Значение Параметр цена продажи, %] / 100) + ) + ``` + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Сумма учетная, руб' = + CALCULATE( + SUM('Себестоимость'[Учетная сумма, руб]) - SUM('Себестоимость'[Доп расходы]) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + [Учет.Списание товара, руб] + formatString: #,0 + + measure 'Учет.Закупка, руб' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Закупка] ) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Учет.НДС, руб' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[НДС]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Учет.Таможня, руб' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Таможня]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Учет.Доставка, руб' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Доставка]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Сборка в другие товары, руб' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Закупка]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Производство товара" ) + ) + ``` + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Сумма продаж + РК, usd' = ``` + + CALCULATE( + SUMX( + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация"), + 'Себестоимость'[Сумма plus МП, usd]) - SUM('Стоимость МП'[Расходы МП, usd] + ) * (1 + 'Параметр цена продажи, %'[Значение Параметр цена продажи, %] / 100) + ) + ``` + formatString: #,0 + + measure 'Сумма учетная, usd' = + CALCULATE( + SUM('Себестоимость'[Учетная сумма, usd]) - SUM('Себестоимость'[Доп расходы USD2+2]) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + [Учет.Списание товара, usd] + formatString: #,0 + + measure 'Учет.Закупка, usd' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Закупка, usd2] ) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Учет.Доставка, usd' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Доставка, usd] ) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Учет.НДС, usd' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[НДС, usd] ) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Учет.Таможня, usd' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Таможня, usd] ) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Сборка в другие товары, usd' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Закупка, usd2] ) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Производство товара" ) + ) + ``` + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Сборка из других товаров, руб' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Закупка]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Приход" && 'Себестоимость'[Статья]="Производство товара" ) + ) + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Сборка из других товаров, usd' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Закупка, usd2]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Приход" && 'Себестоимость'[Статья]="Производство товара" ) + ) + ``` + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Сумма продаж + МП + РК, руб' = + CALCULATE( + SUM('Себестоимость'[Сумма plus МП, руб]), + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + formatString: #,0 + + measure 'Сумма продаж + МП + РК, usd' = + CALCULATE( + SUM('Себестоимость'[Сумма plus МП, usd]), + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + formatString: #,0 + + measure 'MAT скользящая годовая, руб' = ``` + + CALCULATE( + [Сумма продаж + РК, руб], + DATESINPERIOD( + '.Календарь'[Дата], + MAX('.Календарь'[Дата]), -1, YEAR + ) + ) + + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'Торг. надбавка, руб' = ``` + + [Сумма продаж, руб] - [Сумма учетная, руб] + + ``` + formatString: #,0 + + measure 'Торг. надбавка, usd' = [Сумма продаж, usd] - [Сумма учетная, usd] + formatString: #,0 + + measure 'Торг. надбавка, руб, %' = + + DIVIDE( + [Торг. надбавка, руб], + [Сумма учетная, руб] + ) * 100 + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Торг. надбавка, usd, %' = + + DIVIDE( + [Торг. надбавка, usd], + [Сумма учетная, usd] + ) * 100 + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'MAT скользящая годовая сегодня, руб' = ``` + + CALCULATE( + [Сумма продаж + РК, руб], + DATESINPERIOD( + '.Календарь'[Дата], + TODAY() - 1, -1, YEAR + ) + ) + + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'MTD Сумма продаж с начала месяца, руб' = ``` + + IF ( + NOT ISBLANK([Сумма продаж + РК, руб]), + CALCULATE( + [Сумма продаж + РК, руб], + DATESMTD('.Календарь'[Дата]) + ) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'MTD Сумма продаж с начала месяца, usd' = ``` + + IF ( + NOT ISBLANK([Сумма продаж + РК, usd]), + CALCULATE( + [Сумма продаж + РК, usd], + DATESMTD('.Календарь'[Дата]) + ) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'MAA скользящая среднегодовая' = ``` + + CALCULATE ( + DIVIDE ( + [Сумма продаж + РК, руб], + DISTINCTCOUNT ( '.Календарь'[Дата].[Месяц] ) + ), + DATESINPERIOD ( + '.Календарь'[Дата], + MAX ('.Календарь'[Дата]), -1, YEAR) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PY Сумма продаж прошлый год, руб' = ``` + + CALCULATE( + [Сумма продаж + РК, руб], + SAMEPERIODLASTYEAR('.Календарь'[Дата]) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'YTD Сумма продаж с начала года, руб' = ``` + + IF ( + NOT ISBLANK([Сумма продаж + РК, руб]), + CALCULATE( + [Сумма продаж + РК, руб], + DATESYTD('.Календарь'[Дата]) + ) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'YTD Сумма продаж с начала года, usd' = ``` + + IF ( + NOT ISBLANK ([Сумма продаж + РК, usd]), + CALCULATE( + [Сумма продаж + РК, usd], + DATESYTD('.Календарь'[Дата]) + ) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'Средний чек' = DIVIDE('Основной отчет'[Сумма продаж + РК, руб], DISTINCTCOUNTNOBLANK('Себестоимость'[Номер заказа]), 0) + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Средний чек, usd' = DIVIDE('Основной отчет'[Сумма продаж + РК, usd], DISTINCTCOUNTNOBLANK('Себестоимость'[Номер заказа]), 0) + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Остаток - МП начало, упак' = ``` + + CALCULATE( + SUM('Остатки'[upakovok]) + , REMOVEFILTERS('Остатки'[Дата]) + , REMOVEFILTERS('.Календарь'[Дата]) + , FILTER( + 'Остатки' + ,'Остатки'[Дата] "Виртуальный" + )) + + + /*CALCULATE( + SUM('Остатки'[upakovok]), + + FILTER(ALL('Остатки'[Дата]),'Остатки'[Дата] "Виртуальный" + ))*/ + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП конец, упак' = ``` + + CALCULATE( + SUM('Остатки'[upakovok]) + , REMOVEFILTERS('Остатки'[Дата]) + , REMOVEFILTERS('.Календарь'[Дата]) + , FILTER( + 'Остатки' + ,'Остатки'[Дата]<=SELECTEDVALUE('.Календарь'[Дата],MAX('.Календарь'[Дата])) + ) + , FILTER('Остатки', [Категория склада] <> "Виртуальный" + )) + + + + /*CALCULATE( + SUM('Остатки'[upakovok]), + FILTER('Остатки','Остатки'[Дата]<=SELECTEDVALUE('.Календарь'[Дата],MAX('.Календарь'[Дата]))) + , FILTER('Остатки', [Категория склада] <> "Виртуальный" + ))*/ + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП начало, шт' = ``` + + CALCULATE( + SUM('Остатки'[quantity]) + , REMOVEFILTERS('Остатки'[Дата]) + , REMOVEFILTERS('.Календарь'[Дата]) + , FILTER( + 'Остатки' + ,'Остатки'[Дата] "Виртуальный" + )) + + /*CALCULATE( + SUM('Остатки'[Quantity]), + + FILTER(ALL('Остатки'[Дата]),'Остатки'[Дата] "Виртуальный" + ))*/ + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП конец, шт' = ``` + + CALCULATE( + SUM('Остатки'[quantity]) + , REMOVEFILTERS('Остатки'[Дата]) + , REMOVEFILTERS('.Календарь'[Дата]) + , FILTER( + 'Остатки' + ,'Остатки'[Дата]<=SELECTEDVALUE('.Календарь'[Дата],MAX('.Календарь'[Дата])) + ) + , FILTER('Остатки', [Категория склада] <> "Виртуальный" + )) + + + + /*CALCULATE( + SUM('Остатки'[Quantity]), + FILTER('Остатки','Остатки'[Дата]<=SELECTEDVALUE('.Календарь'[Дата],MAX('.Календарь'[Дата]))) + , FILTER('Остатки', [Категория склада] <> "Виртуальный" + ))*/ + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Продажи за все время, руб' = + CALCULATE( + [Сумма продаж + РК, руб], + ALL('.Календарь'[Дата]) + ) + formatString: #,0 + + measure 'Продажи за все время, шт' = + CALCULATE( + [Количество продаж, шт], + ALL('.Календарь'[Дата]) + ) + formatString: #,0 + displayFolder: Количество + + measure 'Количество продаж, шт' = + CALCULATE( + SUM('Себестоимость'[Количество]), + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + formatString: #,0 + displayFolder: Количество + + measure 'Остаток - МП начало, руб' = ``` + + CALCULATE( + SUM('Остатки'[quantity в руб]) + , REMOVEFILTERS('Остатки'[Дата]) + , REMOVEFILTERS('.Календарь'[Дата]) + , FILTER( + 'Остатки' + ,'Остатки'[Дата] "Виртуальный" + )) + + + + /*CALCULATE( + SUM('Остатки'[quantity в руб]), + FILTER(ALL('Остатки'[Дата]),'Остатки'[Дата] "Виртуальный" + ))*/ + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП начало, usd' = ``` + + + CALCULATE( + SUM('Остатки'[quantity в usd]) + , REMOVEFILTERS('Остатки'[Дата]) + , REMOVEFILTERS('.Календарь'[Дата]) + , FILTER( + 'Остатки' + ,'Остатки'[Дата] "Виртуальный" + )) + + + /*CALCULATE( + SUM('Остатки'[quantity в usd]), + FILTER(ALL('Остатки'[Дата]),'Остатки'[Дата] "Виртуальный" + ))*/ + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП конец, руб' = ``` + + CALCULATE( + SUM('Остатки'[quantity в руб]) + , REMOVEFILTERS('Остатки'[Дата]) + , REMOVEFILTERS('.Календарь'[Дата]) + , FILTER( + 'Остатки' + ,'Остатки'[Дата]<=SELECTEDVALUE('.Календарь'[Дата],MAX('.Календарь'[Дата])) + ) + , FILTER('Остатки', [Категория склада] <> "Виртуальный" + )) + + + + /*CALCULATE( + SUM('Остатки'[quantity в руб]), + FILTER('Остатки','Остатки'[Дата]<=SELECTEDVALUE('.Календарь'[Дата],MAX('.Календарь'[Дата]))) + , FILTER('Остатки', [Категория склада] <> "Виртуальный" + ))*/ + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП конец, usd' = ``` + + CALCULATE( + SUM('Остатки'[quantity в usd]) + , REMOVEFILTERS('Остатки'[Дата]) + , REMOVEFILTERS('.Календарь'[Дата]) + , FILTER( + 'Остатки' + ,'Остатки'[Дата]<=SELECTEDVALUE('.Календарь'[Дата],MAX('.Календарь'[Дата])) + ) + , FILTER('Остатки', [Категория склада] <> "Виртуальный" + )) + + + + + /*CALCULATE( + SUM('Остатки'[quantity в usd]), + FILTER('Остатки','Остатки'[Дата]<=SELECTEDVALUE('.Календарь'[Дата],MAX('.Календарь'[Дата]))) + , FILTER('Остатки', [Категория склада] <> "Виртуальный" + ))*/ + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure Оборачиваемость = ``` + DIVIDE( + [Сумма учетная, руб], + (('Основной отчет'[Остаток - МП конец, руб] + 'Основной отчет'[Остаток - МП начало, руб])/2 ) + ) + ``` + displayFolder: Показатели эффективности + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Оборачиваемость, usd' = ``` + DIVIDE( + [Сумма учетная, usd], + (('Основной отчет'[Остаток - МП конец, usd] + 'Основной отчет'[Остаток - МП начало, usd])/2 ) + ) + ``` + displayFolder: Показатели эффективности + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Рентаб. активов' = 'Основной отчет'[Оборачиваемость] * 'Основной отчет'[Торг. надбавка, руб, %] + formatString: #,0 + displayFolder: Показатели эффективности + + measure 'Рентаб. активов, usd' = 'Основной отчет'[Оборачиваемость, usd] * 'Основной отчет'[Торг. надбавка, usd, %] + formatString: #,0 + displayFolder: Показатели эффективности + + measure КоэфВозвратаUsd = DIVIDE([Сумма продаж + РК, usd], [Сумма закупки, usd], 0) + displayFolder: Показатели эффективности + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure КоэфВозвратаРуб = DIVIDE([Сумма продаж + РК, руб], [Сумма закупки, руб], 0) + displayFolder: Показатели эффективности + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Сальдо, руб' = [Сумма продаж + РК, руб] - [Сумма закупки, руб] + formatString: #,0 + displayFolder: Показатели эффективности + + measure 'Сальдо, usd' = [Сумма продаж + РК, usd] - [Сумма закупки, usd] + formatString: #,0 + displayFolder: Показатели эффективности + + measure 'Сальдо накопит. руб' = + + CALCULATE( + [Сальдо, руб], + FILTER( + ALLSELECTED('.Календарь'[Дата]), + ISONORAFTER('.Календарь'[Дата], MAX('.Календарь'[Дата]), DESC) + ) + ) + formatString: #,0 + displayFolder: Показатели эффективности + + measure 'Сальдо накопит. usd' = + + CALCULATE( + [Сальдо, usd], + FILTER( + ALLSELECTED('.Календарь'[Дата]), + ISONORAFTER('.Календарь'[Дата], MAX('.Календарь'[Дата]), DESC) + ) + ) + formatString: #,0 + displayFolder: Показатели эффективности + + measure 'Хранение.Продажа, руб' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[ЗатратыСкладХранение] ) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + displayFolder: Учет + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Хранение.Закупка, руб' = ``` + + CALCULATE( + ( + SUM('Себестоимость'[ЗатратыСкладХранение] ) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Приход" && 'Себестоимость'[Статья]="Склад хранение") + ) + ``` + displayFolder: Учет + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Количество заказов' = + CALCULATE( + DISTINCTCOUNTNOBLANK('Себестоимость'[Номер заказа]), + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + formatString: #,0 + displayFolder: Количество + + measure 'Артикулы продающие' = + CALCULATE( + DISTINCTCOUNTNOBLANK('Себестоимость'[artic_id]), + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + formatString: #,0 + displayFolder: Количество + + measure 'PY Прирост к прошлому году, руб' = ``` + + VAR CySales = [Сумма продаж + РК, руб] + VAR PySales = [PY Сумма продаж прошлый год, руб] + VAR YoySales = + IF ( + NOT ISBLANK ( CySales ) && NOT ISBLANK ( PySales ), + CySales - PySales + ) + RETURN + YoySales + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PY Прирост к прошлому году, %' = ``` + + DIVIDE( + [PY Прирост к прошлому году, руб], + [PY Сумма продаж прошлый год, руб] + ) + ``` + formatString: #,0%;-#,0%;#,0% + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'Сборка в другие товары, шт' = ``` + + CALCULATE( + SUM('Себестоимость'[Количество]) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Производство товара" ) + ) + ``` + formatString: #,0 + displayFolder: Количество + + measure 'Сборка из других товаров, шт' = ``` + + CALCULATE( + SUM('Себестоимость'[Количество]) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Приход" && 'Себестоимость'[Статья]="Производство товара" ) + ) + ``` + formatString: #,0 + displayFolder: Количество + + measure 'Количество продаж, упак' = + CALCULATE( + SUM('Себестоимость'[КоличествоУпаковок]), + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + formatString: #,0 + displayFolder: Количество + + measure 'PP Продажи прошлый период, руб' = ``` + + VAR StartDate = MIN( '.Календарь'[Дата] ) + VAR EndDate = MAX( '.Календарь'[Дата] ) + VAR PeriodLength = DATEDIFF( StartDate, EndDate, DAY ) + + RETURN + CALCULATE( + [Сумма продаж + РК, руб], + DATESBETWEEN( + '.Календарь'[Дата], + StartDate - PeriodLength - 1, + StartDate - 1 + ) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PP Прирост к прошлому периоду, руб' = ``` + + VAR CySales = [Сумма продаж + РК, руб] + VAR PySales = [PP Продажи прошлый период, руб] + VAR YoySales = + IF ( + NOT ISBLANK ( CySales ) && NOT ISBLANK ( PySales ), + CySales - PySales + ) + RETURN + YoySales + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PP Прирост к прошлому периоду, руб, %' = ``` + + DIVIDE( + [PP Прирост к прошлому периоду, руб], + [PP Продажи прошлый период, руб] + ) + ``` + formatString: 0%;-0%;0% + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PP Продажи прошлый период, шт' = ``` + + VAR StartDate = MIN( '.Календарь'[Дата] ) + VAR EndDate = MAX( '.Календарь'[Дата] ) + VAR PeriodLength = DATEDIFF( StartDate, EndDate, DAY ) + + RETURN + CALCULATE( + [Количество продаж, шт], + DATESBETWEEN( + '.Календарь'[Дата], + StartDate - PeriodLength - 1, + StartDate - 1 + ) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PP Прирост к прошлому периоду, шт' = ``` + + VAR CySales = [Количество продаж, шт] + VAR PySales = [PP Продажи прошлый период, шт] + VAR YoySales = + IF ( + NOT ISBLANK ( CySales ) && NOT ISBLANK ( PySales ), + CySales - PySales + ) + RETURN + YoySales + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PP Прирост к прошлому периоду, шт, %' = ``` + + DIVIDE( + [PP Прирост к прошлому периоду, шт], + [PP Продажи прошлый период, шт] + ) + ``` + formatString: 0%;-0%;0% + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PP Продажи прошлый период, упак' = ``` + + VAR StartDate = MIN( '.Календарь'[Дата] ) + VAR EndDate = MAX( '.Календарь'[Дата] ) + VAR PeriodLength = DATEDIFF( StartDate, EndDate, DAY ) + + RETURN + CALCULATE( + [Количество продаж, упак], + DATESBETWEEN( + '.Календарь'[Дата], + StartDate - PeriodLength - 1, + StartDate - 1 + ) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PP Прирост к прошлому периоду, упак' = ``` + + VAR CySales = [Количество продаж, упак] + VAR PySales = [PP Продажи прошлый период, упак] + VAR YoySales = + IF ( + NOT ISBLANK ( CySales ) && NOT ISBLANK ( PySales ), + CySales - PySales + ) + RETURN + YoySales + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'PP Прирост к прошлому периоду, упак, %' = ``` + + DIVIDE( + [PP Прирост к прошлому периоду, упак], + [PP Продажи прошлый период, упак] + ) + ``` + formatString: 0%;-0%;0% + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'YTD Сумма продаж с начала года, шт' = ``` + + IF ( + NOT ISBLANK([Количество продаж, шт]), + CALCULATE( + [Количество продаж, шт], + DATESYTD('.Календарь'[Дата]) + ) + ) + ``` + formatString: #,0 + displayFolder: MAA, MAT, MTD, PY, YTD + + measure 'Оборачиваемость, шт' = ``` + DIVIDE( + [Количество продаж, шт], + (('Основной отчет'[Остаток - МП конец, шт] + 'Основной отчет'[Остаток - МП начало, шт])/2 ) + ) + ``` + displayFolder: Показатели эффективности + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Остаток - МП средний, шт' = DIVIDE(([Остаток - МП начало, шт] + [Остаток - МП конец, шт]), 2, 0) + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток конец по последней закупке, руб' = + + SUMX('Номенклатура', 'Номенклатура'[Цена учетная последняя известная, руб] * [Остаток - МП конец, шт]) + formatString: #,0 + isHidden + displayFolder: Остаток склад + + changedProperty = IsHidden + + measure 'Остаток конец по средней закупке, руб' = + + VAR EndDate = MAX('.Календарь'[Дата].[Date]) + + RETURN + CALCULATE( + SUMX('Номенклатура', [Остаток - МП конец, шт] * [Цена учетная по закупкам, руб]), + FILTER( + ALL('.Календарь'), -- Убираем фильтр по дате + '.Календарь'[Дата] <= EndDate + ) + ) + formatString: #,0 + isHidden + displayFolder: Остаток склад + + changedProperty = IsHidden + + measure 'Остаток, упак' = [Остаток - МП конец, упак] + sum('mp остатки'[Остаток МП, упак]) + displayFolder: Остаток склад + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Остаток потенциальный + согласование, упак' = ``` + + + [Остаток - МП конец, упак] + + sum('mp остатки'[Остаток МП, упак]) + + [В производстве упак.] + + [В пути упак.] + + [Согласование упак.] + ``` + formatString: #,0 + displayFolder: Остаток склад + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Торг. надбавка - 70р за упак, руб' = [Торг. надбавка, руб] - 70 /1000 * [Количество продаж, упак] + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Количество строк' = + + COUNTROWS( + FILTER( + 'Себестоимость', + 'Себестоимость'[Статья] = "Реализация" + ) + ) + formatString: 0 + displayFolder: Количество + + measure 'Потенциальный остаток, руб' = [Остаток - МП конец, руб] + 'Заказы все'[В производстве сумма всего в руб] + 'Заказы все'[В пути сумма всего в руб] + 'Заказы все'[Тех заказ сумма всего в руб] + formatString: #,0 + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Потенциальная ТН' = [Потенциальный остаток, руб] * [Торг. надбавка, руб, %] / 100 + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Оборачиваемость + 20%' = [Оборачиваемость] * 1.2 + displayFolder: Аналитика + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Сумма скидки, руб' = SUM('Себестоимость'[Сумма скидки]) + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Остаток - МП конец, кг' = ``` + + SUMX('Номенклатура', + DIVIDE( + [Остаток - МП конец, шт] * COALESCE('Номенклатура'[Числитель веса], 0), + COALESCE('Номенклатура'[Знаменатель веса], 1))) + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП конец, м3' = ``` + + SUMX('Номенклатура', + DIVIDE( + [Остаток - МП конец, шт] * COALESCE('Номенклатура'[Числитель объема], 0), + COALESCE('Номенклатура'[Знаменатель объема], 1))) + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Учет.Доп расходы, руб' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Доп расходы]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + measure 'Учет.Доп расходы, usd' = ``` + + CALCULATE( + -1 * ( + SUM('Себестоимость'[Доп расходы USD2+2]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + ``` + formatString: #,0 + displayFolder: Учет + + measure 'Остаток потенциальный - МП, шт' = ``` + + + [Остаток - МП конец, шт] + + [В производстве кол.] + + [В пути кол.] + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Количество партнеров' = + CALCULATE( + DISTINCTCOUNTNOBLANK('Себестоимость'[PartnerId]), + FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Реализация") + ) + formatString: #,0 + displayFolder: Количество + + measure 'Остаток потенциальный, упак' = ``` + + + [Остаток - МП конец, упак] + + sum('mp остатки'[Остаток МП, упак]) + + [В производстве упак.] + + [В пути упак.] + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток потенциальный - МП, руб' = ``` + + [Остаток - МП конец, руб] + + [В пути сумма всего в руб] + + [В производстве сумма всего в руб] + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток, шт' = [Остаток - МП конец, шт] + sum('mp остатки'[Остаток МП, шт]) + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток, руб' = [Остаток - МП конец, руб] + sum('mp остатки'[Остаток МП, руб]) + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток потенциальный, шт' = ``` + + + [Остаток - МП конец, шт] + + sum('mp остатки'[Остаток МП, шт]) + + [В производстве кол.] + + [В пути кол.] + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток потенциальный, руб' = ``` + + + [Остаток - МП конец, руб] + + sum('mp остатки'[Остаток МП, руб]) + + [В производстве сумма всего в руб] + + [В пути сумма всего в руб] + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП средний, руб' = ``` + + ('Основной отчет'[Остаток - МП конец, руб] + 'Основной отчет'[Остаток - МП начало, руб])/2 + + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП средний, usd' = ``` + + ('Основной отчет'[Остаток - МП конец, usd] + 'Основной отчет'[Остаток - МП начало, usd])/2 + + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП средний, упак' = ``` + + ('Основной отчет'[Остаток - МП конец, упак] + 'Основной отчет'[Остаток - МП начало, упак])/2 + + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Сумма продаж, руб' = + + [Сумма продаж + РК, руб] - SUM('mp реклама'[Затраты РК, руб]) + formatString: #,0 + + measure 'Торг. надбавка + РК, руб' = ``` + + [Сумма продаж + РК, руб] - [Сумма учетная, руб] + ``` + formatString: #,0 + + measure 'Учет.Списание товара, руб' = ``` + + CALCULATE( + 1 * ( + SUM('Себестоимость'[Сумма учетная]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Списание товара") + ) + ``` + formatString: #,0 + displayFolder: Учет + + measure 'Учет.Списание товара, usd' = ``` + + CALCULATE( + 1 * ( + SUM('Себестоимость'[Сумма учетная, usd]) + ) + , FILTER('Себестоимость','Себестоимость'[Вид операции]="Расход" && 'Себестоимость'[Статья]="Списание товара") + ) + ``` + formatString: #,0 + displayFolder: Учет + + measure 'Сумма продаж Маркеты, руб' = ``` + + CALCULATE( + [Сумма продаж, руб], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Сумма продаж Маркеты, usd' = ``` + + CALCULATE( + [Сумма продаж, usd], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Сумма продаж Магок, руб' = ``` + + CALCULATE( + [Сумма продаж, руб], + FILTER('Партнер', NOT 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Сумма продаж Магок, usd' = ``` + + CALCULATE( + [Сумма продаж, usd], + FILTER('Партнер', NOT 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Торг. надбавка Маркеты, руб' = ``` + + CALCULATE( + [Торг. надбавка, руб], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Торг. надбавка Маркеты, usd' = ``` + + CALCULATE( + [Торг. надбавка, usd], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Торг. надбавка Магок, руб' = ``` + + CALCULATE( + [Торг. надбавка, руб], + FILTER('Партнер', NOT 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Торг. надбавка Магок, usd' = ``` + + CALCULATE( + [Торг. надбавка, usd], + FILTER('Партнер', NOT 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Торг. надбавка Маркеты, руб, %' = ``` + + CALCULATE( + [Торг. надбавка, руб, %], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Торг. надбавка Маркеты, usd, %' = ``` + + CALCULATE( + [Торг. надбавка, usd, %], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Торг. надбавка Магок, руб, %' = ``` + + CALCULATE( + [Торг. надбавка, руб, %], + FILTER('Партнер', NOT 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Торг. надбавка Магок, usd, %' = ``` + + CALCULATE( + [Торг. надбавка, usd, %], + FILTER('Партнер', NOT 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Продажи Маркеты, шт' = ``` + + CALCULATE( + [Количество продаж, шт], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Продажи Маркеты, упак' = ``` + + CALCULATE( + [Количество продаж, упак], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Продажи Магок, шт' = ``` + + CALCULATE( + [Количество продаж, шт], + FILTER('Партнер', NOT 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Продажи Магок, упак' = ``` + + CALCULATE( + [Количество продаж, упак], + FILTER('Партнер', NOT 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Остаток - МП - резерв, руб' = ``` + + [Остаток - МП конец, руб] - SUM('Резервы'[В резерве всего, руб]) + ``` + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП - резерв, шт' = [Остаток - МП конец, шт] - SUM('Резервы'[В резерве всего, шт]) + formatString: #,0 + displayFolder: Остаток склад + + measure 'Остаток - МП - резерв, упак' = [Остаток - МП конец, упак] - SUM('Резервы'[В резерве всего, упак]) + formatString: #,0 + displayFolder: Остаток склад + + measure 'Торг. надбавка + РК, руб, %' = + + DIVIDE( + [Торг. надбавка + РК, руб], + [Сумма учетная, руб] + ) * 100 + formatString: #,0 + + measure 'ДРР реальный от продаж, %' = ``` + DIVIDE( + SUM('mp реклама'[Затраты РК, руб]), + 'Основной отчет'[Сумма продаж + МП + РК, руб], 1) + ``` + formatString: #,0%;-#,0%;#,0% + displayFolder: Показатели эффективности + + measure 'Сумма продаж, usd' = + + [Сумма продаж + РК, usd] - SUM('mp реклама'[Затраты РК, usd]) + formatString: #,0 + + measure 'Торг. надбавка + РК, usd' = ``` + + [Сумма продаж + РК, usd] - [Сумма учетная, usd] + ``` + formatString: #,0 + + measure 'Торг. надбавка + РК, usd, %' = + + DIVIDE( + [Торг. надбавка + РК, usd], + [Сумма учетная, usd] + ) * 100 + formatString: #,0 + + measure 'Сумма продаж + РК Маркеты, usd' = ``` + + CALCULATE( + [Сумма продаж + РК, usd], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Сумма продаж + РК Маркеты, руб' = ``` + + CALCULATE( + [Сумма продаж + РК, руб], + FILTER('Партнер', 'Партнер'[Партнер] IN {"ВАЙЛДБЕРРИЗ ООО", "ИНТЕРНЕТ РЕШЕНИЯ ООО", + "ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица", "ЯНДЕКС.МАРКЕТ ООО", "ЯНДЕКС.МАРКЕТ ООО юр.лица"}) + ) + ``` + formatString: #,0 + displayFolder: Магок и маркеты + + measure 'Продажи за год, руб' = ``` + + CALCULATE( + [Сумма продаж + РК, руб], + ALLEXCEPT('.Календарь', '.Календарь'[Дата].[Год]) + ) + ``` + formatString: #,0 + + measure 'Торг. надбавка + МП + РК, руб' = ``` + + [Сумма продаж + МП + РК, руб] - [Сумма учетная, руб] + ``` + formatString: #,0 + + partition 'Основной отчет' = m + mode: import + source = + let + Источник = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlSKjQUA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Столбец1 = _t]), + #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Столбец1", Int64.Type}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Измененный тип",{"Столбец1"}) + in + #"Удаленные столбцы" + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/Остатки.tmdl b/analytics/pbi/model/report/Model/tables/Остатки.tmdl new file mode 100644 index 0000000..79eb7b0 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Остатки.tmdl @@ -0,0 +1,100 @@ +table Остатки + + column artic_id + dataType: string + summarizeBy: none + sourceColumn: artic_id + + annotation SummarizationSetBy = Automatic + + column Code + dataType: string + summarizeBy: none + sourceColumn: Code + + annotation SummarizationSetBy = Automatic + + column sklad + dataType: string + summarizeBy: none + sourceColumn: sklad + + annotation SummarizationSetBy = Automatic + + column 'Категория склада' + dataType: string + summarizeBy: none + sourceColumn: Категория склада + + annotation SummarizationSetBy = Automatic + + column upakovok + dataType: double + summarizeBy: sum + sourceColumn: upakovok + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column quantity + dataType: double + summarizeBy: sum + sourceColumn: quantity + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column upakovka + dataType: double + summarizeBy: sum + sourceColumn: upakovka + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Дата + dataType: dateTime + formatString: Long Date + summarizeBy: none + sourceColumn: Дата + + variation Изменение + isDefault + relationship: 8afa5bd2-9707-4363-96f2-670a305dc4f3 + defaultHierarchy: LocalDateTable_2b612047-5dcc-402e-b2ed-154636b18544.'Иерархия дат' + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column 'quantity в руб' = [quantity] * RELATED('Номенклатура'[Цена учетная, руб]) + formatString: #,0.00000 + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + column 'quantity в usd' = [quantity] * RELATED('Номенклатура'[Цена учетная, usd]) + formatString: #,0.0000000 + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + partition Остатки = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_ostatki_short = Источник{[Schema="pbi",Item="ostatki_short"]}[Data], + #"Переименованные столбцы" = Table.RenameColumns(pbi_ostatki_short,{{"date", "Дата"}}), + #"Измененный тип" = Table.TransformColumnTypes(#"Переименованные столбцы",{{"Дата", type date}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Измененный тип",{"Учетная цена, старое"}) + in + #"Удаленные столбцы" + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/Отзывы клиентов.tmdl b/analytics/pbi/model/report/Model/tables/Отзывы клиентов.tmdl new file mode 100644 index 0000000..464b7bd --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Отзывы клиентов.tmdl @@ -0,0 +1,132 @@ +table 'Отзывы клиентов' + + column feedback_id + dataType: string + summarizeBy: none + sourceColumn: feedback_id + + annotation SummarizationSetBy = Automatic + + column order_id + dataType: string + summarizeBy: none + sourceColumn: order_id + + annotation SummarizationSetBy = Automatic + + column 'Номер заказа' + dataType: string + summarizeBy: none + sourceColumn: Номер заказа + + annotation SummarizationSetBy = Automatic + + column user_id + dataType: string + summarizeBy: none + sourceColumn: user_id + + annotation SummarizationSetBy = Automatic + + column 'Имя пользователя' + dataType: string + summarizeBy: none + sourceColumn: Имя пользователя + + annotation SummarizationSetBy = Automatic + + column Телефон + dataType: string + summarizeBy: none + sourceColumn: Телефон + + annotation SummarizationSetBy = Automatic + + column email + dataType: string + summarizeBy: none + sourceColumn: email + + annotation SummarizationSetBy = Automatic + + column 'Работа менеджера' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Работа менеджера + + annotation SummarizationSetBy = Automatic + + column 'Скорость сборки' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Скорость сборки + + annotation SummarizationSetBy = Automatic + + column 'Качество сборки' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Качество сборки + + annotation SummarizationSetBy = Automatic + + column 'Качество упаковки' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Качество упаковки + + annotation SummarizationSetBy = Automatic + + column 'Скорость доставки' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Скорость доставки + + annotation SummarizationSetBy = Automatic + + column 'Готов рекомендовать' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Готов рекомендовать + + annotation SummarizationSetBy = Automatic + + column 'Другие замечания' + dataType: string + summarizeBy: none + sourceColumn: Другие замечания + + annotation SummarizationSetBy = Automatic + + partition 'Отзывы клиентов' = m + mode: import + source = + let + Источник = Json.Document(Web.Contents("https://magok.ru/api/v2/ApiControllerSurveys/get_order_reports/")), + #"Преобразовано в таблицу" = Table.FromRecords({Источник}), + #"Развернутый элемент data" = Table.ExpandListColumn(#"Преобразовано в таблицу", "data"), + #"Развернутый элемент data1" = Table.ExpandRecordColumn(#"Развернутый элемент data", "data", {"ID", "UF_ORDER_ID", "UF_ORDER_CODE", "UF_USER_ID", "UF_TIME", "UF_ORDER_DATE", "UF_USER_NAME", "UF_USER_PHONE", "UF_USER_EMAIL", "UF_Q1_MNG", "UF_Q2_SKSB", "UF_Q3_QTSB", "UF_Q4_QTUP", "UF_Q5_SKDS", "UF_Q6_RECM", "UF_Q7_OTHER", "UF_DATE_SEND"}, {"data.ID", "data.UF_ORDER_ID", "data.UF_ORDER_CODE", "data.UF_USER_ID", "data.UF_TIME", "data.UF_ORDER_DATE", "data.UF_USER_NAME", "data.UF_USER_PHONE", "data.UF_USER_EMAIL", "data.UF_Q1_MNG", "data.UF_Q2_SKSB", "data.UF_Q3_QTSB", "data.UF_Q4_QTUP", "data.UF_Q5_SKDS", "data.UF_Q6_RECM", "data.UF_Q7_OTHER", "data.UF_DATE_SEND"}), + #"Измененный тип" = Table.TransformColumnTypes(#"Развернутый элемент data1",{{"status", type text}, {"message", type any}, {"data.ID", Int64.Type}, {"data.UF_ORDER_ID", Int64.Type}, {"data.UF_ORDER_CODE", type text}, {"data.UF_USER_ID", Int64.Type}, {"data.UF_TIME", type any}, {"data.UF_ORDER_DATE", type any}, {"data.UF_USER_NAME", type text}, {"data.UF_USER_PHONE", type text}, {"data.UF_USER_EMAIL", type text}, {"data.UF_Q1_MNG", Int64.Type}, {"data.UF_Q2_SKSB", Int64.Type}, {"data.UF_Q3_QTSB", Int64.Type}, {"data.UF_Q4_QTUP", Int64.Type}, {"data.UF_Q5_SKDS", Int64.Type}, {"data.UF_Q6_RECM", Int64.Type}, {"data.UF_Q7_OTHER", type text}, {"data.UF_DATE_SEND", type any}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Измененный тип",{"status", "message"}), + #"Измененный тип1" = Table.TransformColumnTypes(#"Удаленные столбцы",{{"data.ID", type text}}), + #"Переименованные столбцы" = Table.RenameColumns(#"Измененный тип1",{{"data.ID", "feedback_id"}, {"data.UF_ORDER_ID", "order_id"}}), + #"Измененный тип2" = Table.TransformColumnTypes(#"Переименованные столбцы",{{"order_id", type text}}), + #"Переименованные столбцы1" = Table.RenameColumns(#"Измененный тип2",{{"data.UF_ORDER_CODE", "Номер заказа"}, {"data.UF_USER_ID", "user_id"}}), + #"Измененный тип3" = Table.TransformColumnTypes(#"Переименованные столбцы1",{{"user_id", type text}}), + #"Удаленные столбцы1" = Table.RemoveColumns(#"Измененный тип3",{"data.UF_TIME", "data.UF_ORDER_DATE"}), + #"Переименованные столбцы2" = Table.RenameColumns(#"Удаленные столбцы1",{{"data.UF_USER_NAME", "Имя пользователя"}, {"data.UF_USER_PHONE", "Телефон"}, {"data.UF_USER_EMAIL", "email"}}), + #"Удаленные столбцы2" = Table.RemoveColumns(#"Переименованные столбцы2",{"data.UF_DATE_SEND"}), + #"Переименованные столбцы3" = Table.RenameColumns(#"Удаленные столбцы2",{{"data.UF_Q1_MNG", "Работа менеджера"}, {"data.UF_Q2_SKSB", "Скорость сборки"}, {"data.UF_Q3_QTSB", "Качество сборки"}, {"data.UF_Q4_QTUP", "Качество упаковки"}, {"data.UF_Q5_SKDS", "Скорость доставки"}, {"data.UF_Q6_RECM", "Готов рекомендовать"}, {"data.UF_Q7_OTHER", "Другие замечания"}}) + in + #"Переименованные столбцы3" + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/ПРАЙСлист.tmdl b/analytics/pbi/model/report/Model/tables/ПРАЙСлист.tmdl new file mode 100644 index 0000000..36b1abd --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/ПРАЙСлист.tmdl @@ -0,0 +1,187 @@ +table ПРАЙСлист + + measure 'Цена инвойс (вал)' = ``` + + VAR MaxDate = MAX('.Календарь'[Дата]) // Находим последнюю дату, где есть цена + + VAR LastKnowDate = + CALCULATE( + MAX('Прайслист'[Дата]), // Находим последнюю дату, где есть цена + 'Прайслист'[Дата] <= MaxDate, + 'Прайслист'[Вид цены] = "Цена Инвойс (вал)", + REMOVEFILTERS('.Календарь') // Убираем влияние фильтра на даты + ) + + RETURN + CALCULATE( + SELECTEDVALUE('Прайслист'[Цена]), // Берем цену для найденной последней даты + 'Прайслист'[Дата] = LastKnowDate, + 'Прайслист'[Вид цены] = "Цена Инвойс (вал)", + REMOVEFILTERS('.Календарь') + ) + + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Цена отпускная (руб)' = ``` + + VAR MaxDate = MAX('.Календарь'[Дата]) // Находим последнюю дату, где есть цена + + VAR LastKnowDate = + CALCULATE( + MAX('Прайслист'[Дата]), // Находим последнюю дату, где есть цена + 'Прайслист'[Дата] <= MaxDate, + 'Прайслист'[Вид цены] = "Цена отпускная (руб)", + REMOVEFILTERS('.Календарь') // Убираем влияние фильтра на даты + ) + + RETURN + CALCULATE( + SELECTEDVALUE('Прайслист'[Цена]), // Берем цену для найденной последней даты + 'Прайслист'[Дата] = LastKnowDate, + 'Прайслист'[Вид цены] = "Цена отпускная (руб)", + REMOVEFILTERS('.Календарь') + ) + + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Цена отпускная вал в руб' = ``` + + VAR MaxDate = MAX('.Календарь'[Дата]) // Находим последнюю дату, где есть цена + + VAR LastKnowDate = + CALCULATE( + MAX('Прайслист'[Дата]), // Находим последнюю дату, где есть цена + 'Прайслист'[Дата] <= MaxDate, + 'Прайслист'[Вид цены] = "Цена отпускная вал в руб", + REMOVEFILTERS('.Календарь') // Убираем влияние фильтра на даты + ) + + RETURN + CALCULATE( + SELECTEDVALUE('Прайслист'[Цена]), // Берем цену для найденной последней даты + 'Прайслист'[Дата] = LastKnowDate, + 'Прайслист'[Вид цены] = "Цена отпускная вал в руб", + REMOVEFILTERS('.Календарь') + ) + + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Учетная цена (руб)' = ``` + + VAR nowdate = MAX('.Календарь'[Дата]) + VAR MaxDate = MAX('.Календарь'[Дата]) // Находим последнюю дату, где есть цена + + VAR LastKnowDate = + CALCULATE( + MAX('Прайслист'[Дата]), // Находим последнюю дату, где есть цена + 'Прайслист'[Дата] <= MaxDate, + 'Прайслист'[Вид цены] = "Учетная цена (руб)", + REMOVEFILTERS('.Календарь') // Убираем влияние фильтра на даты + ) + + RETURN + CALCULATE( + SELECTEDVALUE('Прайслист'[Цена]), // Берем цену для найденной последней даты + 'Прайслист'[Дата] = LastKnowDate, + 'Прайслист'[Вид цены] = "Учетная цена (руб)", + REMOVEFILTERS('.Календарь') + ) + + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Учетная цена (вал)' = ``` + + VAR MaxDate = MAX('.Календарь'[Дата]) // Находим последнюю дату, где есть цена + + VAR LastKnowDate = + CALCULATE( + MAX('Прайслист'[Дата]), // Находим последнюю дату, где есть цена + 'Прайслист'[Дата] <= MaxDate, + 'Прайслист'[Вид цены] = "Учетная цена (вал)", + REMOVEFILTERS('.Календарь') // Убираем влияние фильтра на даты + ) + + RETURN + CALCULATE( + SELECTEDVALUE('Прайслист'[Цена]), // Берем цену для найденной последней даты + 'Прайслист'[Дата] = LastKnowDate, + 'Прайслист'[Вид цены] = "Учетная цена (вал)", + REMOVEFILTERS('.Календарь') + ) + + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Цена отпускная упак все в руб' = IF(MAX('Номенклатура'[Ценовая группа]) = "Валютная", [Цена отпускная вал в руб], [Цена отпускная (руб)]) * MAX('Номенклатура'[Базовая упаковка]) + formatString: #,0 + + column Цена + dataType: double + isHidden + summarizeBy: sum + sourceColumn: Цена + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Вид цены' + dataType: string + isHidden + summarizeBy: none + sourceColumn: Вид цены + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column artic_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Дата + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + partition ПРАЙСлист = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_pricelist = Источник{[Schema="pbi",Item="pricelist"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(pbi_pricelist,{{"Дата", type date}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Измененный тип",{"1c_id", "_Period"}), + #"Строки с примененным фильтром" = Table.SelectRows(#"Удаленные столбцы", each [Вид цены] = "Учетная цена (руб)" or [Вид цены] = "Цена отпускная (руб)" or [Вид цены] = "Учетная цена (вал)" or [Вид цены] = "Цена отпускная вал в руб" or [Вид цены] = "Цена Инвойс (вал)") + in + #"Строки с примененным фильтром" + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/Параметр цена продажи, %.tmdl b/analytics/pbi/model/report/Model/tables/Параметр цена продажи, %.tmdl new file mode 100644 index 0000000..d73f3de --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Параметр цена продажи, %.tmdl @@ -0,0 +1,25 @@ +table 'Параметр цена продажи, %' + + measure 'Значение Параметр цена продажи, %' = SELECTEDVALUE('Параметр цена продажи, %'[Параметр цена продажи, %], 0) + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Параметр цена продажи, %' + summarizeBy: none + sourceColumn: [Value] + + extendedProperty ParameterMetadata = + { + "version": 0 + } + + annotation SummarizationSetBy = User + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + partition 'Параметр цена продажи, %' = calculated + mode: import + source = GENERATESERIES(-20, 20, 0.5) + + annotation PBI_Id = b90d31cda7104f04bc1706ba6701fc53 + diff --git a/analytics/pbi/model/report/Model/tables/Партнер.tmdl b/analytics/pbi/model/report/Model/tables/Партнер.tmdl new file mode 100644 index 0000000..b0174e4 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Партнер.tmdl @@ -0,0 +1,275 @@ +table Партнер + + measure 'ABC Class dynamic' = + + IF ( + HASONEVALUE ( 'Партнер'[partner_id] ), + VAR SalesByPartner = + CALCULATETABLE ( + ADDCOLUMNS ( + SUMMARIZE ( 'Партнер', 'Партнер'[partner_id] ), + "@PartnerSales", [Сумма продаж + РК, руб] + ), + ALLSELECTED ( 'Партнер' ) + ) + VAR AllSales = + CALCULATE ( + [Сумма продаж + РК, руб], + ALLSELECTED ( 'Партнер' ) + ) + VAR CurrentSalesAmt = [Сумма продаж + РК, руб] + VAR CumulatedSales = + FILTER ( + SalesByPartner, + [@PartnerSales] >= CurrentSalesAmt + ) + VAR CumulatedSalesAmount = + SUMX ( + CumulatedSales, + [@PartnerSales] + ) + VAR CurrentCumulatedPct = + DIVIDE ( + CumulatedSalesAmount, + AllSales + ) + VAR Result = + SWITCH ( + TRUE, + ISBLANK ( CurrentCumulatedPct ), BLANK (), + CurrentCumulatedPct <= 0.8, "A", + CurrentCumulatedPct <= 0.95, "B", + "C" + ) + RETURN + Result + ) + + column partner_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: partner_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Партнер + dataType: string + summarizeBy: none + sourceColumn: Партнер + + changedProperty = SortByColumn + + annotation SummarizationSetBy = Automatic + + column Регион + dataType: string + summarizeBy: none + sourceColumn: Регион + + annotation SummarizationSetBy = Automatic + + column manager_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: manager_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Да/Нет Клиент' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Да/Нет Клиент + + annotation SummarizationSetBy = Automatic + + column 'Да/Нет Поставщик' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Да/Нет Поставщик + + annotation SummarizationSetBy = Automatic + + column 'Да/Нет Конкурент' + dataType: int64 + formatString: 0 + summarizeBy: sum + sourceColumn: Да/Нет Конкурент + + annotation SummarizationSetBy = Automatic + + column 'Код УТ' + dataType: string + summarizeBy: none + sourceColumn: Код УТ + + annotation SummarizationSetBy = Automatic + + column 'Основной менеджер' + dataType: string + isHidden + summarizeBy: none + sourceColumn: Основной менеджер + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Направление деятельности' + dataType: string + summarizeBy: none + sourceColumn: Направление деятельности + + annotation SummarizationSetBy = Automatic + + column bitrix_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: bitrix_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column ДатаРегистрации + dataType: dateTime + formatString: General Date + summarizeBy: none + sourceColumn: ДатаРегистрации + + variation Изменение + isDefault + relationship: 70d8fb19-ce6e-4331-bdd5-c48b97661c3a + defaultHierarchy: LocalDateTable_67da7b50-915b-480b-9e3a-3a60739fb0c6.'Иерархия дат' + + annotation SummarizationSetBy = Automatic + + column Сегмент + dataType: string + summarizeBy: none + sourceColumn: Сегмент + + annotation SummarizationSetBy = Automatic + + column 'Дата последнего звонка' + dataType: dateTime + formatString: Long Date + summarizeBy: none + sourceColumn: Дата последнего звонка + + variation Изменение + isDefault + relationship: b7780e24-ae05-4812-ad3f-b6d9dc7f50cc + defaultHierarchy: LocalDateTable_c661d468-0044-4990-b9e8-723cda59cf51.'Иерархия дат' + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column partner_link + dataType: string + dataCategory: WebUrl + summarizeBy: none + sourceColumn: partner_link + + annotation SummarizationSetBy = Automatic + + column Область + dataType: string + summarizeBy: none + sourceColumn: Область + + annotation SummarizationSetBy = Automatic + + column Округ + dataType: string + summarizeBy: none + sourceColumn: Округ + + annotation SummarizationSetBy = Automatic + + column 'Что шьют?' + dataType: string + summarizeBy: none + sourceColumn: Что шьют? + + annotation SummarizationSetBy = Automatic + + column Категория + dataType: string + summarizeBy: none + sourceColumn: Категория + + annotation SummarizationSetBy = Automatic + + column 'Статус партнера' + dataType: string + summarizeBy: none + sourceColumn: Статус партнера + + annotation SummarizationSetBy = Automatic + + column 'Дата первого заказа' + dataType: dateTime + formatString: Long Date + summarizeBy: none + sourceColumn: Дата первого заказа + + variation Изменение + isDefault + relationship: 8171e79f-bfe6-4798-bb1a-98146553bada + defaultHierarchy: LocalDateTable_588ed205-7c5f-41f0-9bd7-0d82b2484f09.'Иерархия дат' + + changedProperty = DataType + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column Когорта = FORMAT('Партнер'[Дата первого заказа], "YYYY-MM") + summarizeBy: none + + annotation SummarizationSetBy = Automatic + + column 'Статус по динамике 2025/2024' + dataType: string + summarizeBy: none + sourceColumn: Статус по динамике 2025/2024 + + annotation SummarizationSetBy = Automatic + + column 'Статус по обороту 2025' + dataType: string + summarizeBy: none + sourceColumn: Статус по обороту 2025 + + annotation SummarizationSetBy = Automatic + + partition Партнер-974763bd-dd7f-47ca-b4b6-800173f04370 = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + sales_w_partners = Источник{[Schema="pbi",Item="Партнеры"]}[Data], + #"Переименованные столбцы" = Table.RenameColumns(sales_w_partners,{{"partner", "Партнер"}, {"region", "Регион"}, {"konkurent", "Да/Нет Конкурент"}, {"client", "Да/Нет Клиент"}, {"supplier", "Да/Нет Поставщик"}, {"_Code", "Код УТ"}}), + #"Объединенные запросы" = Table.NestedJoin(#"Переименованные столбцы", {"bitrix_id"}, crm_company_uf, {"bitrix_id"}, "crm_company_uf", JoinKind.LeftOuter), + #"Развернутый элемент crm_company_uf" = Table.ExpandTableColumn(#"Объединенные запросы", "crm_company_uf", {"Дата последнего звонка"}, {"Дата последнего звонка"}), + #"Вставлено: объединенный столбец" = Table.AddColumn(#"Развернутый элемент crm_company_uf", "Сведено", each Text.Combine({"https://magok.bitrix24.ru/crm/company/details/", [bitrix_id], "/"}), type text), + #"Переименованные столбцы1" = Table.RenameColumns(#"Вставлено: объединенный столбец",{{"Сведено", "partner_link"}, {"oblast", "Область"}, {"okrug", "Округ"}, {"Category", "Категория"}}) + in + #"Переименованные столбцы1" + + annotation PBI_QueryRelationships = {"columnCount":10,"keyColumnNames":[],"queryRelationships":[],"columnIdentities":["Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{1c_id,0}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{partner_id,1}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{partner,2}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{region,3}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{1c_manager_id,4}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{manager_id,5}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{napravlenie,6}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{client,7}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{supplier,8}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{konkurent,9}"],"ColumnCount":10,"KeyColumnNames":[],"ColumnIdentities":["Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{1c_id,0}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{partner_id,1}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{partner,2}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{region,3}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{1c_manager_id,4}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{manager_id,5}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{napravlenie,6}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{client,7}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{supplier,8}","Server.Database\\/2/SQL/1cnew;mag_reports/sales/sales.w_partners.{konkurent,9}"],"RelationshipInfo":[]} + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/План маркеты.tmdl b/analytics/pbi/model/report/Model/tables/План маркеты.tmdl new file mode 100644 index 0000000..df99a44 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/План маркеты.tmdl @@ -0,0 +1,159 @@ +table 'План маркеты' + + measure 'План Ozon, руб' = ``` + + + VAR PlanGroups = + SUMMARIZE( + 'Номенклатура', + 'Номенклатура'[Менеджер OZON] + ) + + VAR FilterPlanGroups = + TREATAS( + PlanGroups, + 'План маркеты'[Менеджер] + ) + + VAR Result = + CALCULATE( + SUM('План маркеты'[План]), KEEPFILTERS(FilterPlanGroups), + FILTER('План маркеты',MONTH('План маркеты'[Месяц]) = MONTH(MAX('.Календарь'[Дата]))), + FILTER('План маркеты',YEAR('План маркеты'[Месяц]) = YEAR(MAX('.Календарь'[Дата]))), + FILTER('План маркеты', 'План маркеты'[Маркетплейс] = "OZON") + + ) + + RETURN Result + ``` + formatString: #,0 + + measure 'План WB, руб' = ``` + + + VAR PlanGroups = + SUMMARIZE( + 'Номенклатура', + 'Номенклатура'[Менеджер WB] + ) + + VAR FilterPlanGroups = + TREATAS( + PlanGroups, + 'План маркеты'[Менеджер] + ) + + VAR Result = + CALCULATE( + SUM('План маркеты'[План]), KEEPFILTERS(FilterPlanGroups), + FILTER('План маркеты',MONTH('План маркеты'[Месяц]) = MONTH(MAX('.Календарь'[Дата]))), + FILTER('План маркеты',YEAR('План маркеты'[Месяц]) = YEAR(MAX('.Календарь'[Дата]))), + FILTER('План маркеты', 'План маркеты'[Маркетплейс] = "WB") + ) + + RETURN Result + ``` + formatString: #,0 + + measure 'Осталось до плана Ozon' = + IF( + [План Ozon, руб] > [Сумма продаж + РК, руб], + [План Ozon, руб] - [Сумма продаж + РК, руб], 0 + ) + formatString: #,0 + + measure 'Осталось до плана WB' = + IF( + [План WB, руб] > [Сумма продаж + РК, руб], + [План WB, руб] - [Сумма продаж + РК, руб], 0 + ) + formatString: #,0 + + measure '% плана Ozon' = ``` + DIVIDE( + [Сумма продаж + РК, руб], [План Ozon, руб]) + ``` + formatString: 0%;-0%;0% + + measure '% плана WB' = ``` + DIVIDE( + [Сумма продаж + РК, руб], [План WB, руб]) + ``` + formatString: 0%;-0%;0% + + measure 'Аппроксим. Ozon, %' = ``` + + DIVIDE( + [Аппроксимация месяц, руб], [План Ozon, руб] + ) + ``` + formatString: 0%;-0%;0% + + measure 'Аппроксим. WB, %' = ``` + + DIVIDE( + [Аппроксимация месяц, руб], [План WB, руб] + ) + ``` + formatString: 0%;-0%;0% + + column Маркетплейс + dataType: string + summarizeBy: none + sourceColumn: Маркетплейс + + annotation SummarizationSetBy = Automatic + + column Менеджер + dataType: string + isHidden + summarizeBy: none + sourceColumn: Менеджер + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Месяц + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Месяц + + variation Изменение + isDefault + relationship: 381b6bd4-06f4-496e-9264-13deb45adbf2 + defaultHierarchy: LocalDateTable_66d8bbba-35e3-44df-be7f-bb6fc44f271a.'Иерархия дат' + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column План + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: План + + annotation SummarizationSetBy = Automatic + + partition 'План маркеты' = m + mode: import + source = + let + Источник = GoogleSheets.Contents("https://docs.google.com/spreadsheets/d/1bf0nQKoZaTlIlj86tRrAarHdg5dSsXH4xwgOdJc2lqQ/edit?usp=sharing"), + Маркеты_Table = Источник{[name="Маркеты",ItemKind="Table"]}[Data], + #"Повышенные заголовки" = Table.PromoteHeaders(Маркеты_Table, [PromoteAllScalars=true]), + #"Измененный тип" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"Маркетплейс", type text}, {"Менеджер", type text}, {"Месяц", type date}, {"План", Int64.Type}}) + in + #"Измененный тип" + + changedProperty = Name + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/План продаж менеджеров.tmdl b/analytics/pbi/model/report/Model/tables/План продаж менеджеров.tmdl new file mode 100644 index 0000000..5eb9348 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/План продаж менеджеров.tmdl @@ -0,0 +1,168 @@ +table 'План продаж менеджеров' + + measure 'Актуальный план, руб' = + CALCULATE( + SUM('План продаж менеджеров'[план продаж]), + STARTOFMONTH('.Календарь'[Дата]) + ) + formatString: #,0 + + measure '% плана' = + DIVIDE( + [Сумма продаж + РК, руб], + 'План продаж менеджеров'[Актуальный план, руб] + ) + formatString: 0%;-0%;0% + + measure '% премии' = + IF( + [% плана]< 0.8, + 1.8, + IF( + [% плана]<0.9, + 2.2, + IF ( + [% плана]<=1.01, + 2.6, + 3 + ) + ) + ) + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Аппроксимация месяц, руб' = ``` + + VAR CySales = [Сумма продаж + РК, руб] + VAR LastSalesDay = DAY(LASTNONBLANK('.Календарь'[Дата], [Сумма продаж + РК, руб] > 0)) + VAR MonthDays = DAY(EOMONTH(MAX('.Календарь'[Дата]), 0)) + VAR Approx = + IF( + NOT ISBLANK ( CySales ), + DIVIDE( + 'Основной отчет'[MTD Сумма продаж с начала месяца, руб] * MonthDays , + LastSalesDay + ) + ) + RETURN Approx + ``` + formatString: #,0 + + measure 'Аппроксимация год, руб' = ``` + + VAR CySales = [Сумма продаж + РК, руб] + + VAR LastSalesDay = + INT( + LASTNONBLANK('.Календарь'[Дата], [Сумма продаж + РК, руб] > 0) - + STARTOFYEAR('.Календарь'[Дата].[Date]) + ) + 1 + + + VAR YearDays = + INT( + ENDOFYEAR('.Календарь'[Дата].[Date]) - STARTOFYEAR('.Календарь'[Дата].[Date]) + ) + 1 + + VAR Approx = + IF( + NOT ISBLANK ( CySales ), + DIVIDE( + 'Основной отчет'[YTD Сумма продаж с начала года, руб] * YearDays , + LastSalesDay + ) + ) + RETURN Approx + ``` + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Аппроксим. месяц руб, %' = ``` + + DIVIDE( + [Аппроксимация месяц, руб], SUM('План продаж менеджеров'[план продаж]) + ) + ``` + formatString: 0%;-0%;0% + + measure 'Осталось до плана, руб' = [Актуальный план, руб] - [Сумма продаж + РК, руб] + formatString: #,0 + + measure 'План продаж в день, руб' = DIVIDE('План продаж менеджеров'[Актуальный план, руб],21.5) + formatString: #,0 + + measure 'План продаж менеджеров год, руб' = ``` + + CALCULATE( + SUM('План продаж менеджеров'[план продаж]), + ALLEXCEPT('.Календарь', '.Календарь'[Дата].[Год]) + ) + ``` + formatString: #,0 + + measure '% годового плана' = + DIVIDE( + [Сумма продаж + РК, руб], + 'План продаж менеджеров'[План продаж менеджеров год, руб] + ) + formatString: 0%;-0%;0% + + column Период + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Период + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column user_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: user_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'план продаж' + dataType: double + isHidden + summarizeBy: sum + sourceColumn: план продаж + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Менеджер + dataType: string + isHidden + summarizeBy: none + sourceColumn: Менеджер + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + partition 'План продаж менеджеров' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_ПланПродажМенеджеров = Источник{[Schema="pbi",Item="ПланПродажМенеджеров"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(pbi_ПланПродажМенеджеров,{{"_Fld27878", type date}}), + #"Переименованные столбцы" = Table.RenameColumns(#"Измененный тип",{{"_Fld27878", "Период"}}) + in + #"Переименованные столбцы" + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/План продаж по группам.tmdl b/analytics/pbi/model/report/Model/tables/План продаж по группам.tmdl new file mode 100644 index 0000000..4849e07 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/План продаж по группам.tmdl @@ -0,0 +1,436 @@ +table 'План продаж по группам' + + measure 'План продаж месяц, usd' = ``` + + + VAR PlanGroups = + SUMMARIZE( + 'Номенклатура', + 'Группы'[first group], + 'Номенклатура'[Менеджер по закупкам], + 'Номенклатура'[Товарный менеджер] + ) + + VAR FilterPlanGroups = + TREATAS( + PlanGroups, + 'План продаж по группам'[group_id], + 'План продаж по группам'[Менеджер по закупкам], + 'План продаж по группам'[Товарный менеджер] + ) + + VAR Result = + CALCULATE( + SUM('План продаж по группам'[План продаж, usd]), KEEPFILTERS(FilterPlanGroups), + FILTER('План продаж по группам',MONTH('План продаж по группам'[Месяц]) = MONTH(MAX('.Календарь'[Дата]))), + FILTER('План продаж по группам',YEAR('План продаж по группам'[Месяц]) = YEAR(MAX('.Календарь'[Дата]))) + ) + + RETURN Result + ``` + formatString: #,0 + displayFolder: План по группам usd + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'План год, usd' = ``` + + + VAR PlanGroups = + SUMMARIZE( + 'Номенклатура', + 'Группы'[first group], + 'Номенклатура'[Менеджер по закупкам], + 'Номенклатура'[Товарный менеджер] + ) + + VAR FilterPlanGroups = + TREATAS( + PlanGroups, + 'План продаж по группам'[group_id], + 'План продаж по группам'[Менеджер по закупкам], + 'План продаж по группам'[Товарный менеджер] + ) + + VAR Result = + CALCULATE( + SUM('План продаж по группам'[План продаж, usd]), KEEPFILTERS(FilterPlanGroups), + FILTER('План продаж по группам',YEAR('План продаж по группам'[Месяц]) = YEAR(MAX('.Календарь'[Дата]))) + ) + + RETURN Result + ``` + formatString: #,0 + displayFolder: План по группам usd + + annotation PBI_FormatHint = {"isDecimal":true} + + measure '% план год' = ``` + + DIVIDE ( + [Сумма продаж + РК, usd], [План год, usd], BLANK() + ) + ``` + formatString: 0.00%;-0.00%;0.00% + displayFolder: План по группам usd + + measure '% план месяц' = ``` + + DIVIDE ( + [Сумма продаж + РК, usd], [План продаж месяц, usd], BLANK() + ) + ``` + formatString: 0.00%;-0.00%;0.00% + displayFolder: План по группам usd + + measure 'Аппроксимация год, usd' = ``` + + VAR CySales = [Сумма продаж + РК, usd] + + VAR LastSalesDay = + INT( + LASTNONBLANK('.Календарь'[Дата], [Сумма продаж + РК, usd] > 0) - + STARTOFYEAR('.Календарь'[Дата].[Date]) + ) + 1 + + + VAR YearDays = + INT( + ENDOFYEAR('.Календарь'[Дата].[Date]) - STARTOFYEAR('.Календарь'[Дата].[Date]) + ) + 1 + + VAR Approx = + IF( + NOT ISBLANK ( CySales ), + DIVIDE( + 'Основной отчет'[YTD Сумма продаж с начала года, usd] * YearDays , + LastSalesDay + ) + ) + RETURN Approx + ``` + formatString: #,0 + displayFolder: План по группам usd + + measure 'Аппроксимация месяц, usd' = ``` + + VAR CySales = [Сумма продаж + РК, usd] + VAR LastSalesDay = DAY(LASTNONBLANK('.Календарь'[Дата], [Сумма продаж + РК, usd] > 0)) + VAR MonthDays = DAY(EOMONTH(MAX('.Календарь'[Дата]), 0)) + VAR Approx = + IF( + NOT ISBLANK ( CySales ), + DIVIDE( + 'Основной отчет'[MTD Сумма продаж с начала месяца, usd] * MonthDays , + LastSalesDay + ) + ) + RETURN Approx + ``` + formatString: #,0 + displayFolder: План по группам usd + + measure 'Аппроксим. год usd, %' = ``` + + DIVIDE( + [Аппроксимация год, usd], [План год, usd] + ) + ``` + formatString: 0.00%;-0.00%;0.00% + displayFolder: План по группам usd + + measure 'Аппроксим. месяц usd, %' = ``` + + DIVIDE( + [Аппроксимация месяц, usd], [План продаж месяц, usd] + ) + ``` + formatString: 0.00%;-0.00%;0.00% + displayFolder: План по группам usd + + measure 'Аппроксимация год, шт' = ``` + + VAR CySales = [Количество продаж, шт] + + VAR LastSalesDay = + INT( + LASTNONBLANK('.Календарь'[Дата], [Количество продаж, шт] > 0) - + STARTOFYEAR('.Календарь'[Дата].[Date]) + ) + 1 + + + VAR YearDays = + INT( + ENDOFYEAR('.Календарь'[Дата].[Date]) - STARTOFYEAR('.Календарь'[Дата].[Date]) + ) + 1 + + VAR Approx = + IF( + NOT ISBLANK ( CySales ), + DIVIDE( + 'Основной отчет'[YTD Сумма продаж с начала года, шт] * YearDays , + LastSalesDay + ) + ) + RETURN Approx + ``` + formatString: #,0 + + measure 'План закупки ост. период, шт' = ``` + + [Аппроксимация год, шт] + - [YTD Сумма продаж с начала года, шт] + - 'Заказы все'[В производстве кол.] + - 'Заказы все'[В пути кол.] + - [Остаток - МП конец, шт] + + [Остаток - МП средний, шт] + ``` + formatString: #,0 + displayFolder: План закупки + + measure 'План закупки ост. период, руб' = + + SUMX('Номенклатура', + [Учетная цена (руб)] * [План закупки ост. период, шт] / 1000) + formatString: #,0 + displayFolder: План закупки + + measure 'План закупки ост. период, usd' = + + DIVIDE([План закупки ост. период, руб], [Курс TODAY-1, usd2], 0) + formatString: #,0 + displayFolder: План закупки + + measure 'План год, руб' = ``` + + + VAR PlanGroups = + SUMMARIZE( + 'Номенклатура', + 'Группы'[first group], + 'Номенклатура'[Менеджер по закупкам], + 'Номенклатура'[Товарный менеджер] + ) + + VAR FilterPlanGroups = + TREATAS( + PlanGroups, + 'План продаж по группам'[group_id], + 'План продаж по группам'[Менеджер по закупкам], + 'План продаж по группам'[Товарный менеджер] + ) + + VAR Result = + CALCULATE( + SUM('План продаж по группам'[План продаж, руб]), KEEPFILTERS(FilterPlanGroups), + FILTER('План продаж по группам',YEAR('План продаж по группам'[Месяц]) = YEAR(MAX('.Календарь'[Дата]))) + ) + + RETURN Result + ``` + formatString: #,0 + displayFolder: План по группам руб + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'План продаж месяц, руб' = ``` + + + VAR PlanGroups = + SUMMARIZE( + 'Номенклатура', + 'Группы'[first group], + 'Номенклатура'[Менеджер по закупкам], + 'Номенклатура'[Товарный менеджер] + ) + + VAR FilterPlanGroups = + TREATAS( + PlanGroups, + 'План продаж по группам'[group_id], + 'План продаж по группам'[Менеджер по закупкам], + 'План продаж по группам'[Товарный менеджер] + ) + + VAR Result = + CALCULATE( + SUM('План продаж по группам'[План продаж, руб]), KEEPFILTERS(FilterPlanGroups), + FILTER('План продаж по группам',MONTH('План продаж по группам'[Месяц]) = MONTH(MAX('.Календарь'[Дата]))), + FILTER('План продаж по группам',YEAR('План продаж по группам'[Месяц]) = YEAR(MAX('.Календарь'[Дата]))) + ) + + RETURN Result + ``` + formatString: #,0 + displayFolder: План по группам руб + + annotation PBI_FormatHint = {"isDecimal":true} + + measure '% план год (р)' = ``` + + DIVIDE ( + [Сумма продаж + РК, руб], [План год, руб], BLANK() + ) + ``` + formatString: 0.00%;-0.00%;0.00% + displayFolder: План по группам руб + + measure '% план месяц (р)' = ``` + + DIVIDE ( + [Сумма продаж + РК, руб], [План продаж месяц, руб], BLANK() + ) + ``` + formatString: 0.00%;-0.00%;0.00% + displayFolder: План по группам руб + + measure 'Аппроксимация год по группам, руб' = ``` + + VAR CySales = [Сумма продаж + РК, руб] + + VAR LastSalesDay = + INT( + LASTNONBLANK('.Календарь'[Дата], [Сумма продаж + РК, руб] > 0) - + STARTOFYEAR('.Календарь'[Дата].[Date]) + ) + 1 + + + VAR YearDays = + INT( + ENDOFYEAR('.Календарь'[Дата].[Date]) - STARTOFYEAR('.Календарь'[Дата].[Date]) + ) + 1 + + VAR Approx = + IF( + NOT ISBLANK ( CySales ), + DIVIDE( + 'Основной отчет'[YTD Сумма продаж с начала года, руб] * YearDays , + LastSalesDay + ) + ) + RETURN Approx + ``` + formatString: #,0 + displayFolder: План по группам руб + + measure 'Аппроксимация месяц по группам, руб' = ``` + + VAR CySales = [Сумма продаж + РК, руб] + VAR LastSalesDay = DAY(LASTNONBLANK('.Календарь'[Дата], [Сумма продаж + РК, руб] > 0)) + VAR MonthDays = DAY(EOMONTH(MAX('.Календарь'[Дата]), 0)) + VAR Approx = + IF( + NOT ISBLANK ( CySales ), + DIVIDE( + 'Основной отчет'[MTD Сумма продаж с начала месяца, руб] * MonthDays , + LastSalesDay + ) + ) + RETURN Approx + ``` + formatString: #,0 + displayFolder: План по группам руб + + measure 'Аппроксим. год по группам руб, %' = ``` + + DIVIDE( + [Аппроксимация год по группам, руб], [План год, руб] + ) + ``` + formatString: 0.00%;-0.00%;0.00% + displayFolder: План по группам руб + + measure 'Аппроксим. месяц по группам руб, %' = ``` + + DIVIDE( + [Аппроксимация месяц по группам, руб], [План продаж месяц, руб] + ) + ``` + formatString: 0.00%;-0.00%;0.00% + displayFolder: План по группам руб + + column Месяц + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Месяц + + variation Изменение + isDefault + relationship: 6bdd8855-c6d2-4c21-b90f-cb9f0b0bd52e + defaultHierarchy: LocalDateTable_704570fc-e0c6-4914-97ab-ebb645a2ab6e.'Иерархия дат' + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column 'План продаж, usd' + dataType: double + isHidden + formatString: #,0 + summarizeBy: sum + sourceColumn: План продаж, usd + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDecimal":true} + + column group_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: group_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Товарный менеджер' + dataType: string + isHidden + summarizeBy: none + sourceColumn: Товарный менеджер + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Менеджер по закупкам' + dataType: string + isHidden + summarizeBy: none + sourceColumn: Менеджер по закупкам + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'План продаж, руб' = 'План продаж по группам'[План продаж, usd] * 102 + isHidden + formatString: #,0 + summarizeBy: sum + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDecimal":true} + + partition 'План продаж по группам' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_ПланыПродажПоГруппам = Источник{[Schema="pbi",Item="ПланыПродажПоГруппам"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(pbi_ПланыПродажПоГруппам,{{"Месяц", type date}}), + #"Переименованные столбцы" = Table.RenameColumns(#"Измененный тип",{{"План продаж", "План продаж, usd"}}) + in + #"Переименованные столбцы" + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/Расходы по годам.tmdl b/analytics/pbi/model/report/Model/tables/Расходы по годам.tmdl new file mode 100644 index 0000000..0825a46 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Расходы по годам.tmdl @@ -0,0 +1,220 @@ +table 'Расходы по годам' + isHidden + + measure '% от выручки 2024' = ``` + + VAR summa = + CALCULATE( + SUM('Расходы по годам'[Сумма]), + 'Расходы по годам'[Категория] IN { "Реклама", "Платежи в бюджет", "Расходы", "Ведение р/счета", "Прочие выплаты", "Канцелярия", "Питание", "Хозяйственные расходы", "Оргтехника и IT" + } && 'Расходы по годам'[Год] = 2024 + ) + RETURN + DIVIDE( + //[Платежи в бюджет 2024] + [Аренда 2024] + [Прочие расходы 2024], + summa, + CALCULATE( + 'Основной отчет'[Сумма продаж + РК, руб], + FILTER( ALL('.Календарь'), '.Календарь'[Дата].[Год] = 2024 ), + ALL('Себестоимость') + ) + ) * + CALCULATE( + 'Основной отчет'[Сумма продаж + РК, руб], + FILTER('.Календарь', '.Календарь'[Дата].[Год]=2024) + ) + + ``` + formatString: #,0 + isHidden + displayFolder: расчеты 2024 + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Расходы на строку 2024' = ``` + + VAR summa = + 5/8 * CALCULATE( + SUM('Расходы по годам'[Сумма]), + 'Расходы по годам'[Категория] = "Зарплата" + && 'Расходы по годам'[Год] = 2024 + ) + + 1/2 * CALCULATE( + SUM('Расходы по годам'[Сумма]), + 'Расходы по годам'[Категория] IN { "Транспортные расходы", "Аренда"} + && 'Расходы по годам'[Год] = 2024 + ) + + RETURN + DIVIDE( + summa, + CALCULATE( + 'Основной отчет'[Количество строк], + FILTER( ALL('.Календарь'), '.Календарь'[Дата].[Год] = 2024 ), + ALL('Себестоимость') + ) + ) * + CALCULATE( + 'Основной отчет'[Количество строк], + FILTER('.Календарь', '.Календарь'[Дата].[Год]=2024) + ) + ``` + formatString: #,0 + isHidden + displayFolder: расчеты 2024 + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Расходы на упаковку 2024' = ``` + + VAR summa = + 3/8 * CALCULATE( + SUM('Расходы по годам'[Сумма]), + 'Расходы по годам'[Категория] = "Зарплата" + && 'Расходы по годам'[Год] = 2024 + ) + + CALCULATE( + SUM('Расходы по годам'[Сумма]), + 'Расходы по годам'[Категория] = "Содержание офиса и складов" + && 'Расходы по годам'[Год] = 2024 + ) + + 1/2 * CALCULATE( + SUM('Расходы по годам'[Сумма]), + 'Расходы по годам'[Категория] IN { "Транспортные расходы", "Аренда"} + && 'Расходы по годам'[Год] = 2024 + ) + + RETURN + DIVIDE( + summa, + CALCULATE( + 'Основной отчет'[Количество продаж, упак], + FILTER( ALL('.Календарь'), '.Календарь'[Дата].[Год] = 2024 ), + ALL('Себестоимость') + ) + ) * + CALCULATE( + 'Основной отчет'[Количество продаж, упак], + FILTER('.Календарь', '.Календарь'[Дата].[Год]=2024) + ) + ``` + formatString: #,0 + isHidden + displayFolder: расчеты 2024 + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Чистая прибыль 2024' = ``` + + CALCULATE( + 'Основной отчет'[Сумма продаж + РК, руб] - 'Основной отчет'[Сумма учетная, руб] + - ( [% от выручки 2024] + [Расходы на строку 2024] + [Расходы на упаковку 2024] ), + FILTER('.Календарь', '.Календарь'[Дата].[Год] = 2024) + ) + /*CALCULATE( + 'Основной отчет'[Сумма продаж, руб] - 'Основной отчет'[Сумма учетная, руб] - + ([Расходы на упаковку 2024] * 'Основной отчет'[Количество продаж, упак]) - + ([Расходы на строку 2024] * 'Основной отчет'[Количество строк]) - + [Расходы через выручку 2024], + FILTER('.Календарь', '.Календарь'[Дата].[Год] = 2024) + ) + */ + + + ``` + formatString: #,0 + isHidden + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Расходы на заказы 2024' = ``` + + VAR summa = + 5/12 * CALCULATE( + SUM('Расходы по годам'[Сумма]), + 'Расходы по годам'[Категория] = "Зарплата" + && 'Расходы по годам'[Год] = 2024 + ) + + CALCULATE( + SUM('Расходы по годам'[Сумма]), + 'Расходы по годам'[Категория] IN { "Транспортные расходы", "Аренда" } + && 'Расходы по годам'[Год] = 2024 + ) + + RETURN + DIVIDE( + summa, + CALCULATE( + 'Основной отчет'[Количество заказов], + FILTER( ALL('.Календарь'), '.Календарь'[Дата].[Год] = 2024 ), + ALL('Себестоимость') + ) + ) * + CALCULATE( + 'Основной отчет'[Количество заказов], + FILTER('.Календарь', '.Календарь'[Дата].[Год]=2024) + ) + ``` + formatString: #,0 + isHidden + displayFolder: расчеты 2024 + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isDecimal":true} + + column Категория + dataType: string + isHidden + summarizeBy: none + sourceColumn: Категория + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Сумма + dataType: double + isHidden + summarizeBy: sum + sourceColumn: Сумма + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Год + dataType: int64 + isHidden + formatString: 0 + summarizeBy: sum + sourceColumn: Год + + changedProperty = DataType + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + partition 'Расходы по годам' = m + mode: import + source = + let + Источник = Sql.Databases("prdsql"), + mag_pbi = Источник{[Name="mag_pbi"]}[Data], + #"pbi_Расходы по годам" = mag_pbi{[Schema="pbi",Item="Расходы по годам"]}[Data] + in + #"pbi_Расходы по годам" + + changedProperty = IsHidden + diff --git a/analytics/pbi/model/report/Model/tables/Резервы.tmdl b/analytics/pbi/model/report/Model/tables/Резервы.tmdl new file mode 100644 index 0000000..0ed007c --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Резервы.tmdl @@ -0,0 +1,68 @@ +table Резервы + + column artic_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'В резерве всего, шт' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: В резерве всего, шт + + annotation SummarizationSetBy = Automatic + + column 'В резерве всего, упак' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: В резерве всего, упак + + annotation SummarizationSetBy = Automatic + + column Склад + dataType: string + summarizeBy: none + sourceColumn: Склад + + annotation SummarizationSetBy = Automatic + + column 'В резерве всего, руб' = 'Резервы'[В резерве всего, шт] * RELATED('Номенклатура'[Цена учетная, руб]) + formatString: #,0 + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + column 'Дата обновления' + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата обновления + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + partition Резервы = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_Резервы = Источник{[Schema="pbi",Item="Резервы"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(pbi_Резервы,{{"Склад", type text}}) + in + #"Измененный тип" + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/Себестоимость.tmdl b/analytics/pbi/model/report/Model/tables/Себестоимость.tmdl new file mode 100644 index 0000000..89b1b74 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Себестоимость.tmdl @@ -0,0 +1,463 @@ +table Себестоимость + + column Период + dataType: dateTime + formatString: General Date + summarizeBy: none + sourceColumn: Период + + changedProperty = DataType + + annotation SummarizationSetBy = Automatic + + column Статья + dataType: string + summarizeBy: none + sourceColumn: Статья + + annotation SummarizationSetBy = Automatic + + column 'Вид операции' + dataType: string + summarizeBy: none + sourceColumn: Вид операции + + annotation SummarizationSetBy = Automatic + + column Организация + dataType: string + isHidden + summarizeBy: none + sourceColumn: Организация + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Контрагент + dataType: string + summarizeBy: none + sourceColumn: Контрагент + + annotation SummarizationSetBy = Automatic + + column Менеджер + dataType: string + summarizeBy: none + sourceColumn: Менеджер + + annotation SummarizationSetBy = Automatic + + column 'Номер документа' + dataType: string + summarizeBy: none + sourceColumn: Номер документа + + annotation SummarizationSetBy = Automatic + + column 'Валюта документа' + dataType: string + summarizeBy: none + sourceColumn: Валюта документа + + annotation SummarizationSetBy = Automatic + + column artic_id + dataType: string + summarizeBy: none + sourceColumn: artic_id + + annotation SummarizationSetBy = Automatic + + column Количество + dataType: double + summarizeBy: sum + sourceColumn: Количество + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Сумма plus МП, руб' + dataType: double + formatString: #,0.00 + summarizeBy: sum + sourceColumn: Сумма plus МП, руб + + annotation SummarizationSetBy = Automatic + + column Закупка + dataType: double + formatString: #,0.00000 + summarizeBy: sum + sourceColumn: Закупка + + annotation SummarizationSetBy = Automatic + + column 'Закупка, usd2' + dataType: double + formatString: 0.0000000 + summarizeBy: sum + sourceColumn: Закупка, usd2 + + annotation SummarizationSetBy = Automatic + + column 'Курс usd2' + dataType: double + summarizeBy: sum + sourceColumn: Курс usd2 + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Курс usd' + dataType: double + summarizeBy: sum + sourceColumn: Курс usd + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Таможня + dataType: double + formatString: 0.00000 + summarizeBy: sum + sourceColumn: Таможня + + annotation SummarizationSetBy = Automatic + + column ЕАЭС + dataType: double + formatString: 0.00000 + summarizeBy: sum + sourceColumn: ЕАЭС + + annotation SummarizationSetBy = Automatic + + column 'Учетная цена' + dataType: double + formatString: 0.00000 + summarizeBy: sum + sourceColumn: Учетная цена + + annotation SummarizationSetBy = Automatic + + column 'Учетная цена USD2+2' + dataType: double + formatString: 0.0000000 + summarizeBy: sum + sourceColumn: Учетная цена USD2+2 + + annotation SummarizationSetBy = Automatic + + column 'Заказ закрыт' + dataType: dateTime + formatString: Long Date + summarizeBy: none + sourceColumn: Заказ закрыт + + variation Variation + isDefault + relationship: d56f34dd-d18a-4511-b10b-85895b67822c + defaultHierarchy: LocalDateTable_93d80160-0984-4e44-91de-316b6ab26727.'Иерархия дат' + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column Маркетинг + dataType: double + formatString: 0.00000 + summarizeBy: sum + sourceColumn: Маркетинг + + annotation SummarizationSetBy = Automatic + + column Доставка + dataType: double + formatString: 0.00000 + summarizeBy: sum + sourceColumn: Доставка + + annotation SummarizationSetBy = Automatic + + column НДС + dataType: double + formatString: 0.00000 + summarizeBy: sum + sourceColumn: НДС + + annotation SummarizationSetBy = Automatic + + column ЗатратыМП + dataType: double + formatString: 0.00000 + summarizeBy: sum + sourceColumn: ЗатратыМП + + annotation SummarizationSetBy = Automatic + + column PartnerId + dataType: string + summarizeBy: none + sourceColumn: PartnerId + + annotation SummarizationSetBy = Automatic + + column 'Доставка, usd' = ``` + + DIVIDE('Себестоимость'[Доставка], 'Себестоимость'[Курс usd2], 0) + + ``` + formatString: 0.0000000 + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + column 'НДС, usd' = ``` + + DIVIDE('Себестоимость'[НДС], 'Себестоимость'[Курс usd2], 0) + + ``` + formatString: 0.0000000 + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + column 'Таможня, usd' = ``` + + DIVIDE('Себестоимость'[Таможня], 'Себестоимость'[Курс usd2], 0) + + ``` + formatString: 0.0000000 + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + column 'Производство, usd' = ``` + + DIVIDE('Себестоимость'[Производство], 'Себестоимость'[Курс usd2], 0) + + ``` + formatString: 0.0000000 + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + column ЗатратыСкладХранение + dataType: double + summarizeBy: sum + sourceColumn: ЗатратыСкладХранение + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'ЗатратыСкладХранение, usd' = ``` + + DIVIDE('Себестоимость'[ЗатратыСкладХранение], 'Себестоимость'[Курс usd2], 0) + + ``` + summarizeBy: sum + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Сумма учетная' = ``` + -1 * ( + 'Себестоимость'[Закупка] + 'Себестоимость'[Доставка] + + 'Себестоимость'[НДС] + 'Себестоимость'[Таможня] + + 'Себестоимость'[Производство] - 'Себестоимость'[Доп расходы]) + ``` + isHidden + formatString: #,0.00000 + summarizeBy: sum + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Сумма учетная, usd' = ``` + -1 * ( + 'Себестоимость'[Закупка, usd2] + 'Себестоимость'[Доставка, usd] + + 'Себестоимость'[НДС, usd] + 'Себестоимость'[Таможня, usd] + + 'Себестоимость'[Производство, usd] - 'Себестоимость'[Доп расходы USD2+2]) + ``` + isHidden + summarizeBy: sum + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Номер заказа' + dataType: string + summarizeBy: none + sourceColumn: Номер заказа + + annotation SummarizationSetBy = Automatic + + column 'Хоз операция' + dataType: string + summarizeBy: none + sourceColumn: Хоз операция + + annotation SummarizationSetBy = Automatic + + column Приемка + dataType: double + summarizeBy: sum + sourceColumn: Приемка + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column АтсМаркировка + dataType: double + summarizeBy: sum + sourceColumn: АтсМаркировка + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column ВремяВыполненияМинут + dataType: double + summarizeBy: sum + sourceColumn: ВремяВыполненияМинут + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column СборкаЗаказа + dataType: double + summarizeBy: sum + sourceColumn: СборкаЗаказа + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Производство + dataType: double + summarizeBy: sum + sourceColumn: Производство + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column КоличествоУпаковок + dataType: double + summarizeBy: sum + sourceColumn: КоличествоУпаковок + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Учетная сумма, руб' + dataType: double + formatString: 0.00000 + summarizeBy: sum + sourceColumn: Учетная сумма, руб + + annotation SummarizationSetBy = Automatic + + column 'Учетная сумма, usd' + dataType: double + formatString: 0.0000000 + summarizeBy: sum + sourceColumn: Учетная сумма, usd + + annotation SummarizationSetBy = Automatic + + column 'Сумма скидки' + dataType: double + formatString: #,0 + summarizeBy: sum + sourceColumn: Сумма скидки + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDecimal":true} + + column 'Доп расходы' + dataType: double + summarizeBy: sum + sourceColumn: Доп расходы + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Доп расходы USD2+2' + dataType: double + summarizeBy: sum + sourceColumn: Доп расходы USD2+2 + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Сумма plus МП, usd' + dataType: double + formatString: #,0.00 + summarizeBy: sum + sourceColumn: Сумма plus МП, usd + + annotation SummarizationSetBy = Automatic + + partition Себестоимость = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbiProd_СебестоимостьСводныйОт2022 = Источник{[Schema="pbiProd",Item="СводныйСебестоимость Для PBI"]}[Data], + #"Changed Type" = Table.TransformColumnTypes(pbiProd_СебестоимостьСводныйОт2022,{{"Период", type date}}), + #"Переименованные столбцы" = Table.RenameColumns(#"Changed Type",{{"Сумма", "Сумма, руб"}}), + Округлено = Table.TransformColumns(#"Переименованные столбцы",{{"Сумма, руб", each Number.Round(_, 5), type number}}), + Округлено1 = Table.TransformColumns(Округлено,{{"СуммаБезНДС", each Number.Round(_, 5), type number}}), + Округлено2 = Table.TransformColumns(Округлено1,{{"Закупка", each Number.Round(_, 5), type number}}), + Округлено3 = Table.TransformColumns(Округлено2,{{"СуммаРучнойСкидки", each Number.Round(_, 5), type number}}), + Округлено4 = Table.TransformColumns(Округлено3,{{"СуммаАвтоСкидки", each Number.Round(_, 5), type number}}), + Округлено5 = Table.TransformColumns(Округлено4,{{"Закупка, usd2", each Number.Round(_, 7), type number}}), + Округлено6 = Table.TransformColumns(Округлено5,{{"Таможня", each Number.Round(_, 5), type number}}), + Округлено7 = Table.TransformColumns(Округлено6,{{"ЕАЭС", each Number.Round(_, 5), type number}}), + Округлено8 = Table.TransformColumns(Округлено7,{{"Учетная цена", each Number.Round(_, 5), type number}}), + Округлено9 = Table.TransformColumns(Округлено8,{{"Учетная цена USD2+2", each Number.Round(_, 7), type number}}), + Округлено10 = Table.TransformColumns(Округлено9,{{"Маркетинг", each Number.Round(_, 5), type number}}), + Округлено11 = Table.TransformColumns(Округлено10,{{"Доставка", each Number.Round(_, 5), type number}}), + Округлено12 = Table.TransformColumns(Округлено11,{{"НДС", each Number.Round(_, 5), type number}}), + Округлено13 = Table.TransformColumns(Округлено12,{{"Производство", each Number.Round(_, 5), type number}}), + Округлено14 = Table.TransformColumns(Округлено13,{{"ЗатратыМП", each Number.Round(_, 5), type number}}), + Округлено15 = Table.TransformColumns(Округлено14,{{"Учетная стоимость", each Number.Round(_, 5), type number}}), + Округлено16 = Table.TransformColumns(Округлено15,{{"Учетная стоимость USD2+2", each Number.Round(_, 7), type number}}), + #"Переименованные столбцы1" = Table.RenameColumns(Округлено16,{{"Сумма, руб", "Сумма plus МП, руб"}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Переименованные столбцы1",{"id", "Code", "Ценовая группа", "Учетная стоимость", "Учетная стоимость USD2+2", "СуммаАвтоСкидки", "СуммаБезНДС", "СуммаРучнойСкидки", "Тип документа", "Номер регистратора"}), + #"Замененное значение" = Table.ReplaceValue(#"Удаленные столбцы","-","",Replacer.ReplaceText,{"Номер заказа"}), + #"Замененное значение1" = Table.ReplaceValue(#"Замененное значение"," ","",Replacer.ReplaceText,{"Номер заказа"}), + #"Замененное значение2" = Table.ReplaceValue(#"Замененное значение1",null,"-",Replacer.ReplaceValue,{"Организация"}), + #"Удаленные столбцы1" = Table.RemoveColumns(#"Замененное значение2",{"Партнер", "Сумма скидки USD2+2"}), + Округлено17 = Table.TransformColumns(#"Удаленные столбцы1",{{"АтсМаркировка", each Number.Round(_, 5), type number}}), + Округлено18 = Table.TransformColumns(Округлено17,{{"Приемка", each Number.Round(_, 5), type number}}), + Округлено19 = Table.TransformColumns(Округлено18,{{"СборкаЗаказа", each Number.Round(_, 5), type number}}), + #"Измененный тип" = Table.TransformColumnTypes(Округлено19,{{"Заказ закрыт", type date}}), + #"Замененное значение3" = Table.ReplaceValue(#"Измененный тип","Супер пупер","АНТУРАЖ ЛТД ООО",Replacer.ReplaceText,{"Организация"}), + #"Добавлен пользовательский объект" = Table.AddColumn(#"Замененное значение3", "Пользовательский", each [#"Сумма plus МП, руб"]/[Курс usd2]), + #"Измененный тип1" = Table.TransformColumnTypes(#"Добавлен пользовательский объект",{{"Пользовательский", type number}}), + #"Переименованные столбцы2" = Table.RenameColumns(#"Измененный тип1",{{"Пользовательский", "Сумма plus МП, usd"}}) + in + #"Переименованные столбцы2" + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/Стоимость МП.tmdl b/analytics/pbi/model/report/Model/tables/Стоимость МП.tmdl new file mode 100644 index 0000000..ff035cb --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Стоимость МП.tmdl @@ -0,0 +1,114 @@ +table 'Стоимость МП' + + column Период + dataType: dateTime + formatString: m/d/yyyy + summarizeBy: none + sourceColumn: Период + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + annotation PBI_FormatHint = {"isDateTimeCustom":true} + + column 'Номер отчета комиссионера' + dataType: string + summarizeBy: none + sourceColumn: Номер отчета комиссионера + + annotation SummarizationSetBy = Automatic + + column artic_id + dataType: string + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Статья себестоимости' + dataType: string + summarizeBy: none + sourceColumn: Статья себестоимости + + annotation SummarizationSetBy = Automatic + + column 'Расходы МП, руб' + dataType: double + summarizeBy: sum + sourceColumn: Расходы МП, руб + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Организация + dataType: string + isHidden + summarizeBy: none + sourceColumn: Организация + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Партнер + dataType: string + isHidden + summarizeBy: none + sourceColumn: Партнер + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Курс + dataType: double + isHidden + summarizeBy: sum + sourceColumn: Курс + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column ПартнерКод + dataType: string + summarizeBy: none + sourceColumn: ПартнерКод + + annotation SummarizationSetBy = Automatic + + column 'Расходы МП, usd' + dataType: double + summarizeBy: sum + sourceColumn: Расходы МП, usd + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + partition 'Стоимость МП-9505004b-b265-4a48-bb15-0e21468f67fc' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + #"sales_Стоимость обработки заказа" = Источник{[Schema="pbi",Item="Стоимость обработки заказа"]}[Data], + #"Переименованные столбцы" = Table.RenameColumns(#"sales_Стоимость обработки заказа",{{"date", "Период"}}), + #"Измененный тип" = Table.TransformColumnTypes(#"Переименованные столбцы",{{"Период", type date}}), + #"Переименованные столбцы1" = Table.RenameColumns(#"Измененный тип",{{"Сумма", "Расходы МП, руб"}}), + Округлено = Table.TransformColumns(#"Переименованные столбцы1",{{"Расходы МП, руб", each Number.Round(_, 5), type number}}), + Округлено1 = Table.TransformColumns(Округлено,{{"Расходы МП, usd", each Number.Round(_, 7), type number}}) + in + Округлено1 + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/Упущенные продажи.tmdl b/analytics/pbi/model/report/Model/tables/Упущенные продажи.tmdl new file mode 100644 index 0000000..813a37f --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Упущенные продажи.tmdl @@ -0,0 +1,171 @@ +table 'Упущенные продажи' + + measure '_Упущ. продажи, руб' = ``` + DIVIDE( + CALCULATE( + 'Основной отчет'[Сумма продаж + РК, руб], FILTER('.Календарь', '.Календарь'[Дата] > DATE(2023,01,01)) + ), + SUM('Упущенные продажи'[Дней в продаже]), 0) * SUM('Упущенные продажи'[Дней отсутствия в продаже] + ) + ``` + isHidden + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure '_Упущ. продажи, usd' = ``` + DIVIDE( + CALCULATE( + 'Основной отчет'[Сумма продаж + РК, usd], FILTER('.Календарь', '.Календарь'[Дата] > DATE(2023,01,01)) + ), + SUM('Упущенные продажи'[Дней в продаже]), 0) * SUM('Упущенные продажи'[Дней отсутствия в продаже] + ) + ``` + isHidden + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure '_Упущ. учетная, руб' = ``` + DIVIDE( + CALCULATE( + 'Основной отчет'[Сумма учетная, руб], FILTER('.Календарь', '.Календарь'[Дата] > DATE(2023,01,01)) + ), + SUM('Упущенные продажи'[Дней в продаже]), 0) * SUM('Упущенные продажи'[Дней отсутствия в продаже] + ) + ``` + isHidden + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure '_Упущ. учетная, usd' = ``` + DIVIDE( + CALCULATE( + 'Основной отчет'[Сумма учетная, usd], FILTER('.Календарь', '.Календарь'[Дата] > DATE(2023,01,01)) + ), + SUM('Упущенные продажи'[Дней в продаже]), 0) * SUM('Упущенные продажи'[Дней отсутствия в продаже] + ) + ``` + isHidden + + changedProperty = IsHidden + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Упущ. сумма учетная, руб' = SUMX('Номенклатура', [_Упущ. учетная, руб]) + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Упущ. сумма учетная, USD' = SUMX('Номенклатура', [_Упущ. учетная, USD]) + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + measure 'Упущ. торг. надбавка, руб' = ``` + [Упущ. сумма продаж, руб] - [Упущ. сумма учетная, руб] + ``` + formatString: #,0 + + annotation PBI_FormatHint = {"isDecimal":true} + + measure 'Упущ. торг. надбавка, USD' = ``` + [Упущ. сумма продаж, USD] - [Упущ. сумма учетная, USD] + ``` + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column Дата + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column artic_id + dataType: string + isHidden + summarizeBy: none + sourceColumn: artic_id + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Дней в продаже' + dataType: int64 + formatString: #,0 + summarizeBy: sum + sourceColumn: Дней в продаже + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isDecimal":true} + + column 'Дата первого поступления' = FIRSTDATE('Остатки'[Дата]) + formatString: Long Date + summarizeBy: none + + variation Изменение + isDefault + relationship: 28a764af-4e8a-4c89-8ceb-304403c0d71a + defaultHierarchy: LocalDateTable_2f146245-8120-4ed9-87dc-af8699bb0274.'Иерархия дат' + + changedProperty = DataType + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column 'Дней отсутствия в продаже' = IF( AND ([Дней в продаже] = 0, 'Упущенные продажи'[Дата] > [Дата первого поступления]), 1, 0) + isHidden + formatString: 0 + summarizeBy: sum + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column minAvailableQty + dataType: double + summarizeBy: sum + sourceColumn: minAvailableQty + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column sellable_stock + dataType: double + summarizeBy: sum + sourceColumn: sellable_stock + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + partition 'Упущенные продажи' = m + mode: import + source = + let + Источник = Sql.Databases("prdsql"), + mag_pbi = Источник{[Name="mag_pbi"]}[Data], + sales_w_ostatok_da_net = mag_pbi{[Schema="pbi",Item="w_ostatok_da_net"]}[Data], + #"Переименованные столбцы" = Table.RenameColumns(sales_w_ostatok_da_net,{{"dt", "Дата"}, {"ostatok", "Дней в продаже"}}) + in + #"Переименованные столбцы" + + annotation PBI_ResultType = Table + + annotation PBI_NavigationStepName = Навигация + diff --git a/analytics/pbi/model/report/Model/tables/Я.Директ заказы.tmdl b/analytics/pbi/model/report/Model/tables/Я.Директ заказы.tmdl new file mode 100644 index 0000000..54cc9d3 --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Я.Директ заказы.tmdl @@ -0,0 +1,112 @@ +table 'Я.Директ заказы' + + measure 'Торг. надбавка - расходы директ, руб' = CALCULATE([Торг. надбавка, руб] - SUM('Я.Директ расходы'[Расходы, руб])) + formatString: #,0 + + measure 'Торг. надбавка директ - расходы директ, руб' = + CALCULATE( + [Сумма продаж + МП + РК, руб] - [Сумма учетная, руб] - SUM('Я.Директ расходы'[Расходы, руб]), + FILTER( + ALL('Я.Директ заказы'), + NOT ISBLANK('Я.Директ заказы'[ID покупки]) + ) + ) + formatString: #,0 + + measure 'Торг. надбавка директ, руб' = + CALCULATE( + [Сумма продаж + МП + РК, руб] - [Сумма учетная, руб], + FILTER( + ALL('Я.Директ заказы'), + NOT ISBLANK('Я.Директ заказы'[ID покупки]) + ) + ) + formatString: #,0 + + measure 'Сумма продаж директ, руб' = + CALCULATE( + [Сумма продаж + МП + РК, руб], + FILTER( + ALL('Я.Директ заказы'), + NOT ISBLANK('Я.Директ заказы'[ID покупки]) + ) + ) + formatString: #,0 + + column 'Условия показа' + dataType: string + summarizeBy: none + sourceColumn: Условия показа + + annotation SummarizationSetBy = Automatic + + column 'ID покупки' + dataType: string + summarizeBy: none + sourceColumn: ID покупки + + annotation SummarizationSetBy = Automatic + + column 'Количество покупок' + dataType: int64 + isHidden + formatString: 0 + summarizeBy: sum + sourceColumn: Количество покупок + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column key_dir + dataType: string + summarizeBy: none + sourceColumn: key_dir + + annotation SummarizationSetBy = Automatic + + column 'Сумма заказов директ, руб' + dataType: double + isHidden + summarizeBy: sum + sourceColumn: Сумма заказов директ, руб + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Группа директ' = FIRSTNONBLANK('Я.Директ расходы'[Группа], 'Я.Директ расходы'[Группа]) + summarizeBy: none + + annotation SummarizationSetBy = Automatic + + partition 'Я.Директ заказы' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_direct_orders = Источник{[Schema="pbi",Item="direct_orders"]}[Data], + #"Разделить столбец по разделителю" = Table.SplitColumn(pbi_direct_orders, "Кампания", Splitter.SplitTextByDelimiter("N-", QuoteStyle.Csv), {"Кампания.1", "Кампания.2"}), + #"Измененный тип" = Table.TransformColumnTypes(#"Разделить столбец по разделителю",{{"Кампания.1", type text}, {"Кампания.2", type text}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Измененный тип",{"Кампания.1"}), + #"Замененное значение" = Table.ReplaceValue(#"Удаленные столбцы",")","",Replacer.ReplaceText,{"Кампания.2"}), + #"Разделить столбец по разделителю1" = Table.SplitColumn(#"Замененное значение", "Группа", Splitter.SplitTextByEachDelimiter({"("}, QuoteStyle.Csv, true), {"Группа.1", "Группа.2"}), + #"Измененный тип1" = Table.TransformColumnTypes(#"Разделить столбец по разделителю1",{{"Группа.1", type text}, {"Группа.2", type text}}), + #"Удаленные столбцы1" = Table.RemoveColumns(#"Измененный тип1",{"Группа.1"}), + #"Замененное значение1" = Table.ReplaceValue(#"Удаленные столбцы1",")","",Replacer.ReplaceText,{"Группа.2"}), + #"Вставлено: объединенный столбец" = Table.AddColumn(#"Замененное значение1", "key_dir", each Text.Combine({Text.Trim([Кампания.2]), "-", Text.Trim([Группа.2])}), type text), + #"Добавлен пользовательский объект" = Table.AddColumn(#"Вставлено: объединенный столбец", "Доход директ, руб", each [#"Доход, руб"]/1000), + #"Удаленные столбцы2" = Table.RemoveColumns(#"Добавлен пользовательский объект",{"Доход, руб"}), + #"Измененный тип2" = Table.TransformColumnTypes(#"Удаленные столбцы2",{{"Доход директ, руб", type number}}), + #"Удаленные столбцы3" = Table.RemoveColumns(#"Измененный тип2",{"Группа.2", "Кампания.2"}), + #"Замененное значение2" = Table.ReplaceValue(#"Удаленные столбцы3","-","",Replacer.ReplaceText,{"ID покупки"}), + #"Переименованные столбцы" = Table.RenameColumns(#"Замененное значение2",{{"Доход директ, руб", "Сумма заказов директ, руб"}}) + in + #"Переименованные столбцы" + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Model/tables/Я.Директ расходы.tmdl b/analytics/pbi/model/report/Model/tables/Я.Директ расходы.tmdl new file mode 100644 index 0000000..feac4fe --- /dev/null +++ b/analytics/pbi/model/report/Model/tables/Я.Директ расходы.tmdl @@ -0,0 +1,133 @@ +table 'Я.Директ расходы' + + measure 'Клики директ' = CALCULATE(SUM('Я.Директ расходы'[Клики]), ALL('Я.Директ заказы'[ID покупки])) + formatString: #,0 + + measure 'Показы директ' = CALCULATE(SUM('Я.Директ расходы'[Показы]), ALL('Я.Директ заказы'[ID покупки])) + formatString: #,0 + + measure 'Расходы директ, руб' = CALCULATE(SUM('Я.Директ расходы'[Расходы, руб]), ALL('Я.Директ заказы'[ID покупки])) + formatString: #,0 + + column Дата + dataType: dateTime + isHidden + formatString: Long Date + summarizeBy: none + sourceColumn: Дата + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + annotation UnderlyingDateTimeDataType = Date + + column Кампания + dataType: string + summarizeBy: none + sourceColumn: Кампания + + annotation SummarizationSetBy = Automatic + + column Группа + dataType: string + summarizeBy: none + sourceColumn: Группа + + annotation SummarizationSetBy = Automatic + + column 'Условия показа' + dataType: string + summarizeBy: none + sourceColumn: Условия показа + + annotation SummarizationSetBy = Automatic + + column 'N условия показа' + dataType: string + summarizeBy: none + sourceColumn: N условия показа + + annotation SummarizationSetBy = Automatic + + column Показы + dataType: int64 + isHidden + formatString: 0 + summarizeBy: sum + sourceColumn: Показы + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column Клики + dataType: int64 + isHidden + formatString: 0 + summarizeBy: sum + sourceColumn: Клики + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'CTR, %' + dataType: double + summarizeBy: sum + sourceColumn: CTR, % + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + column 'Расходы, руб' + dataType: double + isHidden + formatString: #,0 + summarizeBy: sum + sourceColumn: Расходы, руб + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column key_dir + dataType: string + isHidden + summarizeBy: none + sourceColumn: key_dir + + changedProperty = IsHidden + + annotation SummarizationSetBy = Automatic + + column 'Ср. цена клика, руб' + dataType: double + summarizeBy: sum + sourceColumn: Ср. цена клика, руб + + annotation SummarizationSetBy = Automatic + + annotation PBI_FormatHint = {"isGeneralNumber":true} + + partition 'Я.Директ расходы' = m + mode: import + source = + let + Источник = Sql.Database("prdsql", "mag_pbi"), + pbi_direct_adv_costs = Источник{[Schema="pbi",Item="direct_adv_costs"]}[Data], + #"Измененный тип" = Table.TransformColumnTypes(pbi_direct_adv_costs,{{"Дата", type date}}), + #"Добавлен пользовательский объект" = Table.AddColumn(#"Измененный тип", "Пользовательский", each [#"Расход, руб"]/1000), + #"Переименованные столбцы" = Table.RenameColumns(#"Добавлен пользовательский объект",{{"Пользовательский", "Расходы, руб"}}), + #"Удаленные столбцы" = Table.RemoveColumns(#"Переименованные столбцы",{"Расход, руб"}), + #"Вставлено: объединенный столбец" = Table.AddColumn(#"Удаленные столбцы", "key_dir", each Text.Combine({[N кампании], "-", [N группы]}), type text), + #"Удаленные столбцы2" = Table.RemoveColumns(#"Вставлено: объединенный столбец",{"N кампании", "N группы"}), + #"Измененный тип1" = Table.TransformColumnTypes(#"Удаленные столбцы2",{{"Расходы, руб", type number}}) + in + #"Измененный тип1" + + annotation PBI_NavigationStepName = Навигация + + annotation PBI_ResultType = Table + diff --git a/analytics/pbi/model/report/Report/config.json b/analytics/pbi/model/report/Report/config.json new file mode 100644 index 0000000..177bbdd --- /dev/null +++ b/analytics/pbi/model/report/Report/config.json @@ -0,0 +1,66 @@ +{ + "version": "5.66", + "themeCollection": { + "baseTheme": { + "name": "CY20SU09", + "type": 2, + "version": { + "visual": "1.8.53", + "report": "2.0.53", + "page": "1.3.53" + } + } + }, + "activeSectionIndex": 9, + "defaultDrillFilterOtherVisuals": true, + "slowDataSourceSettings": { + "isCrossHighlightingDisabled": false, + "isSlicerSelectionsButtonEnabled": false, + "isFilterSelectionsButtonEnabled": false, + "isFieldWellButtonEnabled": false, + "isApplyAllButtonEnabled": false + }, + "linguisticSchemaSyncVersion": 2, + "settings": { + "useNewFilterPaneExperience": true, + "allowChangeFilterTypes": true, + "useStylableVisualContainerHeader": true, + "exportDataMode": 1, + "useEnhancedTooltips": true + }, + "objects": { + "section": [ + { + "properties": { + "verticalAlignment": { + "expr": { + "Literal": { + "Value": "'Top'" + } + } + } + } + } + ], + "outspacePane": [ + { + "properties": { + "expanded": { + "expr": { + "Literal": { + "Value": "false" + } + } + }, + "visible": { + "expr": { + "Literal": { + "Value": "true" + } + } + } + } + } + ] + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/filters.json b/analytics/pbi/model/report/Report/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/report.json b/analytics/pbi/model/report/Report/report.json new file mode 100644 index 0000000..56e4231 --- /dev/null +++ b/analytics/pbi/model/report/Report/report.json @@ -0,0 +1,35 @@ +{ + "id": 22443069, + "layoutOptimization": 0, + "pods": [ + { + "boundSection": "ReportSection1ae8f92a5273f14462dd", + "config": "{}", + "id": 112399774, + "name": "Pod", + "objectId": "1cd74b08-f926-4a57-b91a-4be5e0bb83ac" + } + ], + "publicCustomVisuals": [], + "reportId": 2058200, + "resourcePackages": [ + { + "resourcePackage": { + "disabled": false, + "id": 23531593, + "items": [ + { + "id": 139019140, + "name": "CY20SU09", + "path": "BaseThemes/CY20SU09.json", + "resourcePackageId": 23531593, + "type": 202 + } + ], + "name": "SharedResources", + "reportId": 2058200, + "type": 2 + } + } + ] +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/config.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/config.json new file mode 100644 index 0000000..f5ec59f --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/config.json @@ -0,0 +1,17 @@ +{ + "objects": { + "outspacePane": [ + { + "properties": { + "width": { + "expr": { + "Literal": { + "Value": "191L" + } + } + } + } + } + ] + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/filters.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/section.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/section.json new file mode 100644 index 0000000..e635ee1 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "Себестоимость для сверки", + "displayOption": 1, + "height": 720, + "name": "ReportSection1ae8f92a5273f14462dd", + "ordinal": 1, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/config.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/config.json new file mode 100644 index 0000000..aeaa3a7 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/config.json @@ -0,0 +1,551 @@ +{ + "name": "942443c8a4be384462a8", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 292.24327018943171, + "z": 1000, + "width": 1280, + "height": 292.24327018943171, + "tabOrder": 1000 + } + } + ], + "singleVisual": { + "visualType": "pivotTable", + "projections": { + "Rows": [ + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "active": true + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Квартал" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.День" + } + ], + "Values": [ + { + "queryRef": "Основной отчет.Сумма плюс МП, usd" + }, + { + "queryRef": "Основной отчет.Сумма minus Расходы МП, usd" + }, + { + "queryRef": "Основной отчет.Торг. надбавка, usd" + }, + { + "queryRef": "Основной отчет.Сумма учетная, usd" + }, + { + "queryRef": "Основной отчет.Закупка, usd" + }, + { + "queryRef": "Основной отчет.Доставка, usd" + }, + { + "queryRef": "Основной отчет.НДС, usd" + }, + { + "queryRef": "Основной отчет.Таможня, usd" + }, + { + "queryRef": "Основной отчет.Учет.Доп расходы, usd" + }, + { + "queryRef": "Основной отчет.Сборка, usd" + }, + { + "queryRef": "Основной отчет.Сборка из других товаров, usd" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "к", + "Entity": ".Календарь", + "Type": 0 + } + ], + "Select": [ + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж + РК, usd" + }, + "Name": "Основной отчет.Сумма minus Расходы МП, usd", + "NativeReferenceName": "Сумма, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма учетная, usd" + }, + "Name": "Основной отчет.Сумма учетная, usd", + "NativeReferenceName": "Сумма учетная, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.Закупка, usd" + }, + "Name": "Основной отчет.Закупка, usd", + "NativeReferenceName": "Закупка, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.Доставка, usd" + }, + "Name": "Основной отчет.Доставка, usd", + "NativeReferenceName": "Доставка, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.НДС, usd" + }, + "Name": "Основной отчет.НДС, usd", + "NativeReferenceName": "НДС, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.Таможня, usd" + }, + "Name": "Основной отчет.Таможня, usd", + "NativeReferenceName": "Таможня, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сборка в другие товары, usd" + }, + "Name": "Основной отчет.Сборка, usd", + "NativeReferenceName": "Сборка, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сборка из других товаров, usd" + }, + "Name": "Основной отчет.Сборка из других товаров, usd", + "NativeReferenceName": "Сборка из других товаров, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж + МП + РК, usd" + }, + "Name": "Основной отчет.Сумма плюс МП, usd", + "NativeReferenceName": "Сумма плюс МП, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, usd" + }, + "Name": "Основной отчет.Торг. надбавка, usd", + "NativeReferenceName": "Торг. надбавка, usd" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "NativeReferenceName": "Дата Год" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Квартал" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Квартал", + "NativeReferenceName": "Дата Квартал" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "NativeReferenceName": "Дата Месяц" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "День" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.День", + "NativeReferenceName": "Дата День" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.Доп расходы, usd" + }, + "Name": "Основной отчет.Учет.Доп расходы, usd", + "NativeReferenceName": "Учет.Доп расходы, usd" + } + ] + }, + "expansionStates": [ + { + "roles": [ + "Rows" + ], + "levels": [ + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Год" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Квартал" + ], + "isCollapsed": true, + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + ], + "isCollapsed": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.День" + ], + "isCollapsed": true + } + ], + "root": { + "identityValues": null + } + } + ], + "drillFilterOtherVisuals": true, + "objects": { + "columnWidth": [ + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "135.78525513679273D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сумма minus Расходы МП, usd" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "115.96065779167289D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сборка, usd" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "140.8768874231215D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сборка из других товаров, usd" + } + } + ], + "columnFormatting": [ + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Торг. надбавка, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сумма minus Расходы МП, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сумма плюс МП, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сумма учетная, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Закупка, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Доставка, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.НДС, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Таможня, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сборка, usd" + } + }, + { + "properties": { + "labelPrecision": { + "expr": { + "Literal": { + "Value": "2L" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сборка из других товаров, usd" + } + } + ] + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/filters.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/filters.json new file mode 100644 index 0000000..968b169 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/filters.json @@ -0,0 +1,18 @@ +[ + { + "name": "Filter064e79cb305a69cb0d82", + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Себестоимость" + } + }, + "Property": "Вид операции" + } + }, + "type": "Categorical", + "howCreated": 1, + "objects": {} + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/visualContainer.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/visualContainer.json new file mode 100644 index 0000000..2ce080d --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (94244)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 292.24, + "id": 5853011910, + "width": 1280, + "x": 0, + "y": 292.24, + "z": 1000 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/config.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/config.json new file mode 100644 index 0000000..1b7789c --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/config.json @@ -0,0 +1,476 @@ +{ + "name": "a77c8acaaa486ec307d9", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 0, + "z": 0, + "width": 1280, + "height": 292.64169068203654, + "tabOrder": 0 + } + } + ], + "singleVisual": { + "visualType": "pivotTable", + "projections": { + "Rows": [ + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "active": true + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Квартал" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.День" + } + ], + "Values": [ + { + "queryRef": "Основной отчет.Сумма плюс МП, руб" + }, + { + "queryRef": "pbi СебестоимостьСводныйОт2022.Сумма minus Расходы МП, руб" + }, + { + "queryRef": "Основной отчет.Торг. надбавка, руб" + }, + { + "queryRef": "Основной отчет.Сумма учетная, руб" + }, + { + "queryRef": "Основной отчет.Закупка, руб" + }, + { + "queryRef": "Основной отчет.Доставка, руб" + }, + { + "queryRef": "Основной отчет.НДС, руб" + }, + { + "queryRef": "Основной отчет.Таможня, руб" + }, + { + "queryRef": "Основной отчет.Учет.Доп расходы, руб" + }, + { + "queryRef": "Основной отчет.Сборка, руб" + }, + { + "queryRef": "Основной отчет.Сборка из других товаров, руб" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "к", + "Entity": ".Календарь", + "Type": 0 + } + ], + "Select": [ + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж + РК, руб" + }, + "Name": "pbi СебестоимостьСводныйОт2022.Сумма minus Расходы МП, руб", + "NativeReferenceName": "Сумма, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма учетная, руб" + }, + "Name": "Основной отчет.Сумма учетная, руб", + "NativeReferenceName": "Сумма учетная, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.Закупка, руб" + }, + "Name": "Основной отчет.Закупка, руб", + "NativeReferenceName": "Закупка, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.НДС, руб" + }, + "Name": "Основной отчет.НДС, руб", + "NativeReferenceName": "НДС, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.Таможня, руб" + }, + "Name": "Основной отчет.Таможня, руб", + "NativeReferenceName": "Таможня, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.Доставка, руб" + }, + "Name": "Основной отчет.Доставка, руб", + "NativeReferenceName": "Доставка, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сборка в другие товары, руб" + }, + "Name": "Основной отчет.Сборка, руб", + "NativeReferenceName": "Сборка, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сборка из других товаров, руб" + }, + "Name": "Основной отчет.Сборка из других товаров, руб", + "NativeReferenceName": "Сборка из других товаров, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж + МП + РК, руб" + }, + "Name": "Основной отчет.Сумма плюс МП, руб", + "NativeReferenceName": "Сумма плюс МП, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб" + }, + "Name": "Основной отчет.Торг. надбавка, руб", + "NativeReferenceName": "Торг. надбавка, руб" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "NativeReferenceName": "Дата Год" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Квартал" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Квартал", + "NativeReferenceName": "Дата Квартал" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "NativeReferenceName": "Дата Месяц" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "День" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.День", + "NativeReferenceName": "Дата День" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Учет.Доп расходы, руб" + }, + "Name": "Основной отчет.Учет.Доп расходы, руб", + "NativeReferenceName": "Учет.Доп расходы, руб" + } + ], + "OrderBy": [ + { + "Direction": 1, + "Expression": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + } + } + } + ] + }, + "expansionStates": [ + { + "roles": [ + "Rows" + ], + "levels": [ + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Год" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Квартал" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Квартал" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + ], + "isCollapsed": true, + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.День" + ], + "isCollapsed": true + } + ], + "root": { + "identityValues": null + } + } + ], + "drillFilterOtherVisuals": true, + "objects": { + "columnWidth": [ + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "124.16443540679295D" + } + } + } + }, + "selector": { + "metadata": "pbi СебестоимостьСводныйОт2022.Сумма minus Расходы МП, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "121.30268199233717D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сборка, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "124.47509578544062D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Сборка из других товаров, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "127.2452097095206D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Доставка, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "100.68875966533231D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.НДС, руб" + } + } + ] + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/filters.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/filters.json new file mode 100644 index 0000000..968b169 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/filters.json @@ -0,0 +1,18 @@ +[ + { + "name": "Filter064e79cb305a69cb0d82", + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Себестоимость" + } + }, + "Property": "Вид операции" + } + }, + "type": "Categorical", + "howCreated": 1, + "objects": {} + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/visualContainer.json b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/visualContainer.json new file mode 100644 index 0000000..244a226 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/001_Себестоимость для сверки/visualContainers/00000_pivotTable (a77c8)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 292.64, + "id": 5853011911, + "width": 1280, + "x": 0, + "y": 0, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/config.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/filters.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/section.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/section.json new file mode 100644 index 0000000..a603450 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "Закупка для сверки", + "displayOption": 1, + "height": 720, + "name": "754c9d1730b0f20a23b9", + "ordinal": 2, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/config.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/config.json new file mode 100644 index 0000000..0b4b014 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/config.json @@ -0,0 +1,333 @@ +{ + "name": "721f5f03ab0fa208a447", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 360.35668789808915, + "z": 1000, + "width": 1200.1019108280254, + "height": 256, + "tabOrder": 1000 + } + } + ], + "singleVisual": { + "visualType": "pivotTable", + "projections": { + "Values": [ + { + "queryRef": "Закупки.Сумма закупки, usd" + }, + { + "queryRef": "Sum(Закупки.Закуп.Закупка, usd)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Доставка, usd)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Таможня, usd)" + }, + { + "queryRef": "Sum(Закупки.Закуп.НДС, usd)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Производство, usd)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Доп расходы, usd)" + } + ], + "Rows": [ + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "active": true + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Квартал" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.День" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "з", + "Entity": "Закупки", + "Type": 0 + }, + { + "Name": "к", + "Entity": ".Календарь", + "Type": 0 + } + ], + "Select": [ + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Закупка, usd" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Закупка, usd)", + "NativeReferenceName": "Закуп.Закупка, usd" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "NativeReferenceName": "Дата Год" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Квартал" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Квартал", + "NativeReferenceName": "Дата Квартал" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "NativeReferenceName": "Дата Месяц" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "День" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.День", + "NativeReferenceName": "Дата День" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Доставка, usd" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Доставка, usd)", + "NativeReferenceName": "Закуп.Доставка, usd" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Таможня, usd" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Таможня, usd)", + "NativeReferenceName": "Закуп.Таможня, usd" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.НДС, usd" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.НДС, usd)", + "NativeReferenceName": "Закуп.НДС, usd" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Производство, usd" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Производство, usd)", + "NativeReferenceName": "Закуп.Производство, usd" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Сумма закупки, usd" + }, + "Name": "Закупки.Сумма закупки, usd", + "NativeReferenceName": "Сумма закупки, usd" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Доп расходы, usd" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Доп расходы, usd)", + "NativeReferenceName": "Закуп.Доп расходы, usd" + } + ] + }, + "expansionStates": [ + { + "roles": [ + "Rows" + ], + "levels": [ + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Год" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Квартал" + ], + "isCollapsed": true, + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + ], + "isCollapsed": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.День" + ], + "isCollapsed": true + } + ], + "root": { + "identityValues": null + } + } + ], + "drillFilterOtherVisuals": true + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/filters.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/visualContainer.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/visualContainer.json new file mode 100644 index 0000000..da943a1 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (721f5)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 256, + "id": 5853011909, + "width": 1200.1, + "x": 0, + "y": 360.36, + "z": 1000 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/config.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/config.json new file mode 100644 index 0000000..6bbfbf0 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/config.json @@ -0,0 +1,446 @@ +{ + "name": "ef9b132ce1bf6dcb0fba", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 0, + "z": 0, + "width": 1280, + "height": 256, + "tabOrder": 0 + } + } + ], + "singleVisual": { + "visualType": "pivotTable", + "projections": { + "Values": [ + { + "queryRef": "Закупки.Сумма закупки, руб" + }, + { + "queryRef": "Sum(Закупки.Закуп.Закупка, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Доставка, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Таможня, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.НДС, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Производство, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Доп расходы, руб)" + }, + { + "queryRef": "Sum(Себестоимость.АтсМаркировка)" + }, + { + "queryRef": "Sum(Себестоимость.ВремяВыполненияМинут)" + }, + { + "queryRef": "Sum(Себестоимость.СборкаЗаказа)" + }, + { + "queryRef": "Sum(Себестоимость.Приемка)" + } + ], + "Rows": [ + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "active": true + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Квартал" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.День" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "з", + "Entity": "Закупки", + "Type": 0 + }, + { + "Name": "с", + "Entity": "Себестоимость", + "Type": 0 + }, + { + "Name": "к", + "Entity": ".Календарь", + "Type": 0 + } + ], + "Select": [ + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Закупка, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Закупка, руб)", + "NativeReferenceName": "Закуп.Закупка, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "с" + } + }, + "Property": "Приемка" + } + }, + "Function": 0 + }, + "Name": "Sum(Себестоимость.Приемка)", + "NativeReferenceName": "Приемка" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "с" + } + }, + "Property": "АтсМаркировка" + } + }, + "Function": 0 + }, + "Name": "Sum(Себестоимость.АтсМаркировка)", + "NativeReferenceName": "АтсМаркировка" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "с" + } + }, + "Property": "ВремяВыполненияМинут" + } + }, + "Function": 0 + }, + "Name": "Sum(Себестоимость.ВремяВыполненияМинут)", + "NativeReferenceName": "ВремяВыполненияМинут" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "с" + } + }, + "Property": "СборкаЗаказа" + } + }, + "Function": 0 + }, + "Name": "Sum(Себестоимость.СборкаЗаказа)", + "NativeReferenceName": "СборкаЗаказа" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "NativeReferenceName": "Дата Год" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Квартал" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Квартал", + "NativeReferenceName": "Дата Квартал" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "NativeReferenceName": "Дата Месяц" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "День" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.День", + "NativeReferenceName": "Дата День" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Доставка, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Доставка, руб)", + "NativeReferenceName": "Закуп.Доставка, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.НДС, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.НДС, руб)", + "NativeReferenceName": "Закуп.НДС, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Производство, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Производство, руб)", + "NativeReferenceName": "Закуп.Производство, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Таможня, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Таможня, руб)", + "NativeReferenceName": "Закуп.Таможня, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Сумма закупки, руб" + }, + "Name": "Закупки.Сумма закупки, руб", + "NativeReferenceName": "Сумма закупки, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Доп расходы, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Доп расходы, руб)", + "NativeReferenceName": "Закуп.Доп расходы, руб" + } + ], + "OrderBy": [ + { + "Direction": 1, + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Property": "Дата" + } + } + } + ] + }, + "expansionStates": [ + { + "roles": [ + "Rows" + ], + "levels": [ + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Год" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Квартал" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Квартал" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + ], + "isCollapsed": true, + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.День" + ], + "isCollapsed": true + } + ], + "root": { + "identityValues": null + } + } + ], + "drillFilterOtherVisuals": true + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/filters.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/visualContainer.json b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/visualContainer.json new file mode 100644 index 0000000..943d805 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/002_Закупка для сверки/visualContainers/00000_pivotTable (ef9b1)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 256, + "id": 5853011908, + "width": 1280, + "x": 0, + "y": 0, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/003_Проверка заказа/config.json b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/config.json new file mode 100644 index 0000000..555bbbf --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/config.json @@ -0,0 +1,3 @@ +{ + "visibility": 1 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/003_Проверка заказа/filters.json b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/filters.json new file mode 100644 index 0000000..d28ab5e --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/filters.json @@ -0,0 +1,24 @@ +[ + { + "name": "d7b101032c2fbd2a522e", + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Группы" + } + }, + "Property": "Группа" + } + }, + "type": "Categorical", + "howCreated": 1, + "objects": { + "general": [ + { + "properties": {} + } + ] + } + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/003_Проверка заказа/section.json b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/section.json new file mode 100644 index 0000000..993dfa6 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "Проверка заказа", + "displayOption": 1, + "height": 720, + "name": "093cb2f2f430784c9aa2", + "ordinal": 3, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/config.json b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/config.json new file mode 100644 index 0000000..ca6f645 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/config.json @@ -0,0 +1,584 @@ +{ + "name": "947fadddc992e56fc1dc", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 3.5965316650203052, + "z": 1000, + "width": 1280.3652727472286, + "height": 715.70980133904072 + } + } + ], + "singleVisual": { + "visualType": "tableEx", + "projections": { + "Values": [ + { + "queryRef": "Номенклатура.Наименование" + }, + { + "queryRef": "Номенклатура.Фото" + }, + { + "queryRef": "Номенклатура.ABC статус 12м" + }, + { + "queryRef": "Номенклатура.ABC статус 3м" + }, + { + "queryRef": "Заказы все.Согласование упак." + }, + { + "queryRef": "Номенклатура.Дней с первой продажи" + }, + { + "queryRef": "Sum(Заказы все.Сумма в руб.)" + }, + { + "queryRef": "Номенклатура.Отчет продажи упак/день" + }, + { + "queryRef": "Номенклатура.Отчет ТН руб/день за 365 дней" + }, + { + "queryRef": "Номенклатура.Остаток дней продаж" + }, + { + "queryRef": "Номенклатура.Остаток дней продаж потенциальный" + }, + { + "queryRef": "Номенклатура.Остаток дней продаж потенциальный1" + }, + { + "queryRef": "Номенклатура.Рентабельность за год" + }, + { + "queryRef": "Основной отчет.Остаток конец, руб" + }, + { + "queryRef": "Основной отчет.Остаток конец, упак" + }, + { + "queryRef": "Sum(mp остатки.Остаток МП, упак)" + }, + { + "queryRef": "Номенклатура.Код УТ" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "н", + "Entity": "Номенклатура", + "Type": 0 + }, + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "з", + "Entity": "Заказы все", + "Type": 0 + }, + { + "Name": "m", + "Entity": "mp остатки", + "Type": 0 + } + ], + "Select": [ + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Отчет ТН руб/день за 365 дней" + }, + "Name": "Номенклатура.Отчет ТН руб/день за 365 дней", + "NativeReferenceName": "Отчет ТН руб/день за 365 дней" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Остаток - МП конец, руб" + }, + "Name": "Основной отчет.Остаток конец, руб", + "NativeReferenceName": "Остаток - МП конец, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Остаток - МП конец, упак" + }, + "Name": "Основной отчет.Остаток конец, упак", + "NativeReferenceName": "Остаток - МП конец, упак" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Остаток дней продаж потенциальный + согласование" + }, + "Name": "Номенклатура.Остаток дней продаж потенциальный", + "NativeReferenceName": "Остаток дней продаж потенциальный + согласование" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Остаток дней продаж -" + }, + "Name": "Номенклатура.Остаток дней продаж", + "NativeReferenceName": "Остаток дней продаж" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Согласование упак." + }, + "Name": "Заказы все.Согласование упак.", + "NativeReferenceName": "Согласование упак." + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Остаток дней продаж потенциальный" + }, + "Name": "Номенклатура.Остаток дней продаж потенциальный1", + "NativeReferenceName": "Остаток дней продаж потенциальный" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Сумма всего в руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Заказы все.Сумма в руб.)", + "NativeReferenceName": "Сумма в руб." + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Отчет продажи упак/день" + }, + "Name": "Номенклатура.Отчет продажи упак/день", + "NativeReferenceName": "Отчет продажи упак/день" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Дней с первой продажи" + }, + "Name": "Номенклатура.Дней с первой продажи", + "NativeReferenceName": "Дней с первой продажи" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Фото" + }, + "Name": "Номенклатура.Фото", + "NativeReferenceName": "Фото" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Рентабельность % за год" + }, + "Name": "Номенклатура.Рентабельность за год", + "NativeReferenceName": "Рентабельность за год" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Наименование" + }, + "Name": "Номенклатура.Наименование", + "NativeReferenceName": "Наименование" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "ABC статус 3м" + }, + "Name": "Номенклатура.ABC статус 3м", + "NativeReferenceName": "ABC статус 3м" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Код УТ" + }, + "Name": "Номенклатура.Код УТ", + "NativeReferenceName": "Код УТ" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Остаток МП, упак" + } + }, + "Function": 0 + }, + "Name": "Sum(mp остатки.Остаток МП, упак)", + "NativeReferenceName": "Остаток МП, упак" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "ABC статус 12м" + }, + "Name": "Номенклатура.ABC статус 12м", + "NativeReferenceName": "ABC статус 12м" + } + ], + "OrderBy": [ + { + "Direction": 1, + "Expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Остаток дней продаж потенциальный + согласование" + } + } + } + ] + }, + "drillFilterOtherVisuals": true, + "objects": { + "columnWidth": [ + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "106.06392603583824D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Отчет ТН руб/день за 365 дней" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "104.99317244380974D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Остаток конец, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "119.81415456800187D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Остаток конец, упак" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "113.17945012099631D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Остаток дней продаж потенциальный" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "104.74347067134175D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Остаток дней продаж" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "92.74594956322099D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Остаток дней продаж потенциальный1" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "75.33762057877814D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Отчет продажи упак/день" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "58.741960765990065D" + } + } + } + }, + "selector": { + "metadata": "Заказы все.Согласование упак." + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "70.45016077170418D" + } + } + } + }, + "selector": { + "metadata": "Sum(Заказы все.Сумма в руб.)" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "45.78778135048232D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Дней с первой продажи" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "89.8591887003569D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Рентабельность за год" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "227.08767172501183D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Наименование" + } + } + ], + "values": [ + { + "properties": { + "backColor": { + "solid": { + "color": { + "expr": { + "Conditional": { + "Cases": [ + { + "Condition": { + "Comparison": { + "ComparisonKind": 3, + "Left": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Номенклатура" + } + }, + "Property": "Остаток дней продаж потенциальный + согласование" + } + }, + "Right": { + "Literal": { + "Value": "120D" + } + } + } + }, + "Value": { + "Literal": { + "Value": "'#c7b8e7'" + } + } + }, + { + "Condition": { + "Comparison": { + "ComparisonKind": 2, + "Left": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Номенклатура" + } + }, + "Property": "Остаток дней продаж потенциальный + согласование" + } + }, + "Right": { + "Literal": { + "Value": "365D" + } + } + } + }, + "Value": { + "Literal": { + "Value": "'#efb5b9'" + } + } + } + ] + } + } + } + } + } + }, + "selector": { + "data": [ + { + "dataViewWildcard": { + "matchingOption": 1 + } + } + ], + "metadata": "Номенклатура.Остаток дней продаж потенциальный" + } + } + ] + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/filters.json b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/filters.json new file mode 100644 index 0000000..7fa99df --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/filters.json @@ -0,0 +1,24 @@ +[ + { + "name": "fae48656203ee0874d3e", + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Группы" + } + }, + "Property": "Группа" + } + }, + "type": "Categorical", + "howCreated": 1, + "objects": { + "general": [ + { + "properties": {} + } + ] + } + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/visualContainer.json b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/visualContainer.json new file mode 100644 index 0000000..8445de7 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/003_Проверка заказа/visualContainers/00000_tableEx (947fa)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 715.71, + "id": 5853011904, + "width": 1280.37, + "x": 0, + "y": 3.6, + "z": 1000 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/004_Расходы по группам/config.json b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/004_Расходы по группам/filters.json b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/filters.json new file mode 100644 index 0000000..990f753 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/filters.json @@ -0,0 +1,95 @@ +[ + { + "name": "fb75ada5c622021a796e", + "expression": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Entity": ".Календарь" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + } + }, + "filter": { + "Version": 2, + "From": [ + { + "Name": "l", + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab", + "Type": 0 + } + ], + "Where": [ + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "l" + } + }, + "Property": "Год" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "2024L" + } + } + ] + ] + } + } + } + ] + }, + "type": "Categorical", + "cachedDisplayNames": [ + { + "id": { + "scopeId": { + "Comparison": { + "ComparisonKind": 0, + "Left": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + }, + "Right": { + "Literal": { + "Value": "2024L" + } + } + } + } + }, + "displayName": "2024" + } + ], + "howCreated": 1, + "objects": {} + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/004_Расходы по группам/section.json b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/section.json new file mode 100644 index 0000000..8a62d25 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "Расходы по группам", + "displayOption": 1, + "height": 720, + "name": "26b06b855e040a3da6cd", + "ordinal": 4, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/config.json b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/config.json new file mode 100644 index 0000000..07572bb --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/config.json @@ -0,0 +1,316 @@ +{ + "name": "6555486b30c025a90968", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 0, + "z": 0, + "width": 1280, + "height": 701.85873605947961 + } + } + ], + "singleVisual": { + "visualType": "pivotTable", + "projections": { + "Rows": [ + { + "queryRef": "Группы.Группа", + "active": true + }, + { + "queryRef": "Группы.Подгруппа 1" + } + ], + "Values": [ + { + "queryRef": "Основной отчет.Торг. надбавка, руб" + }, + { + "queryRef": "Основной отчет.Сумма скидки, руб" + }, + { + "queryRef": "Расходы по годам.Чистая прибыль 2024" + }, + { + "queryRef": "Расходы по годам.% от выручки 2024" + }, + { + "queryRef": "Расходы по годам.Расходы на строку 2024" + }, + { + "queryRef": "Расходы по годам.Расходы на упаковку 2024" + }, + { + "queryRef": "Основной отчет.Торг. надбавка - 70р за упак, руб" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "г", + "Entity": "Группы", + "Type": 0 + }, + { + "Name": "р1", + "Entity": "Расходы по годам", + "Type": 0 + } + ], + "Select": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "г" + } + }, + "Property": "Группа" + }, + "Name": "Группы.Группа", + "NativeReferenceName": "Группа" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб" + }, + "Name": "Основной отчет.Торг. надбавка, руб", + "NativeReferenceName": "Торг. надбавка, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "Чистая прибыль 2024" + }, + "Name": "Расходы по годам.Чистая прибыль 2024", + "NativeReferenceName": "Чистая прибыль 2024" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка - 70р за упак, руб" + }, + "Name": "Основной отчет.Торг. надбавка - 70р за упак, руб", + "NativeReferenceName": "Торг. надбавка - 70р за упак, руб" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "г" + } + }, + "Property": "Подгруппа 1" + }, + "Name": "Группы.Подгруппа 1", + "NativeReferenceName": "Подгруппа 1" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "% от выручки 2024" + }, + "Name": "Расходы по годам.% от выручки 2024", + "NativeReferenceName": "% от выручки 2024" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "Расходы на строку 2024" + }, + "Name": "Расходы по годам.Расходы на строку 2024", + "NativeReferenceName": "Расходы на строку 2024" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "Расходы на упаковку 2024" + }, + "Name": "Расходы по годам.Расходы на упаковку 2024", + "NativeReferenceName": "Расходы на упаковку 2024" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма скидки, руб" + }, + "Name": "Основной отчет.Сумма скидки, руб", + "NativeReferenceName": "Сумма скидки, руб" + } + ], + "OrderBy": [ + { + "Direction": 2, + "Expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб" + } + } + } + ] + }, + "expansionStates": [ + { + "roles": [ + "Rows" + ], + "levels": [ + { + "queryRefs": [ + "Группы.Группа" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Группы" + } + }, + "Property": "Группа" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + "Группы.Подгруппа 1" + ], + "isCollapsed": true, + "isPinned": true + } + ], + "root": { + "identityValues": null + } + } + ], + "drillFilterOtherVisuals": true, + "objects": { + "columnWidth": [ + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "218.94376371840957D" + } + } + } + }, + "selector": { + "metadata": "Группы.Группа" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "91.7927927927928D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Торг. надбавка, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "86.20819112627987D" + } + } + } + }, + "selector": { + "metadata": "Расходы по годам.Чистая прибыль 2024" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "119.51194539249147D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Торг. надбавка - 70р за упак, руб" + } + } + ], + "subTotals": [ + { + "properties": { + "columnSubtotals": { + "expr": { + "Literal": { + "Value": "true" + } + } + }, + "rowSubtotals": { + "expr": { + "Literal": { + "Value": "true" + } + } + } + } + } + ] + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/filters.json b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/visualContainer.json b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/visualContainer.json new file mode 100644 index 0000000..6224553 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/004_Расходы по группам/visualContainers/00000_pivotTable (65554)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 701.86, + "id": 5853011906, + "width": 1280, + "x": 0, + "y": 0, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/config.json b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/filters.json b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/filters.json new file mode 100644 index 0000000..6b7b0e0 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/filters.json @@ -0,0 +1,95 @@ +[ + { + "name": "353705c00c3625430515", + "expression": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Entity": ".Календарь" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + } + }, + "filter": { + "Version": 2, + "From": [ + { + "Name": "l", + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab", + "Type": 0 + } + ], + "Where": [ + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "l" + } + }, + "Property": "Год" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "2024L" + } + } + ] + ] + } + } + } + ] + }, + "type": "Categorical", + "cachedDisplayNames": [ + { + "id": { + "scopeId": { + "Comparison": { + "ComparisonKind": 0, + "Left": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + }, + "Right": { + "Literal": { + "Value": "2024L" + } + } + } + } + }, + "displayName": "2024" + } + ], + "howCreated": 1, + "objects": {} + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/section.json b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/section.json new file mode 100644 index 0000000..74201a6 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "Расходы по партнерам", + "displayOption": 1, + "height": 720, + "name": "5c3b66599c2024e88c47", + "ordinal": 5, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/config.json b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/config.json new file mode 100644 index 0000000..71f8ca5 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/config.json @@ -0,0 +1,263 @@ +{ + "name": "3c6856dee85223b3d705", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 0, + "z": 0, + "width": 1280.3855421686746, + "height": 719.42168674698792 + } + } + ], + "singleVisual": { + "visualType": "tableEx", + "projections": { + "Values": [ + { + "queryRef": "Партнер.Партнер" + }, + { + "queryRef": "Основной отчет.Сумма продаж, руб" + }, + { + "queryRef": "Основной отчет.Торг. надбавка, руб" + }, + { + "queryRef": "Sum(Себестоимость.Сумма скидки)" + }, + { + "queryRef": "Распределение расходов.Чистая прибыль 2024" + }, + { + "queryRef": "Расходы по годам.% от выручки 2024" + }, + { + "queryRef": "Расходы по годам.Расходы на строку 2024" + }, + { + "queryRef": "Расходы по годам.Расходы на упаковку 2024" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "п", + "Entity": "Партнер", + "Type": 0 + }, + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "р1", + "Entity": "Расходы по годам", + "Type": 0 + }, + { + "Name": "с", + "Entity": "Себестоимость", + "Type": 0 + } + ], + "Select": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "п" + } + }, + "Property": "Партнер" + }, + "Name": "Партнер.Партнер", + "NativeReferenceName": "Партнер" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж + РК, руб" + }, + "Name": "Основной отчет.Сумма продаж, руб", + "NativeReferenceName": "Сумма продаж, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб" + }, + "Name": "Основной отчет.Торг. надбавка, руб", + "NativeReferenceName": "Торг. надбавка, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "Чистая прибыль 2024" + }, + "Name": "Распределение расходов.Чистая прибыль 2024", + "NativeReferenceName": "Чистая прибыль 2024" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "% от выручки 2024" + }, + "Name": "Расходы по годам.% от выручки 2024", + "NativeReferenceName": "% от выручки 2024" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "Расходы на строку 2024" + }, + "Name": "Расходы по годам.Расходы на строку 2024", + "NativeReferenceName": "Расходы на строку 2024" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "Расходы на упаковку 2024" + }, + "Name": "Расходы по годам.Расходы на упаковку 2024", + "NativeReferenceName": "Расходы на упаковку 2024" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "с" + } + }, + "Property": "Сумма скидки" + } + }, + "Function": 0 + }, + "Name": "Sum(Себестоимость.Сумма скидки)", + "NativeReferenceName": "Сумма скидки" + } + ], + "OrderBy": [ + { + "Direction": 1, + "Expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "р1" + } + }, + "Property": "Чистая прибыль 2024" + } + } + } + ] + }, + "drillFilterOtherVisuals": true, + "objects": { + "columnWidth": [ + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "365.2072072072072D" + } + } + } + }, + "selector": { + "metadata": "Партнер.Партнер" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "98.26023317010026D" + } + } + } + }, + "selector": { + "metadata": "Расходы по годам.% от выручки 2024" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "104.65797804126939D" + } + } + } + }, + "selector": { + "metadata": "Расходы по годам.Расходы на строку 2024" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "101.81410861738318D" + } + } + } + }, + "selector": { + "metadata": "Расходы по годам.Расходы на упаковку 2024" + } + } + ], + "total": [ + { + "properties": { + "totals": { + "expr": { + "Literal": { + "Value": "false" + } + } + } + } + } + ] + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/filters.json b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/visualContainer.json b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/visualContainer.json new file mode 100644 index 0000000..cb3f9ec --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/005_Расходы по партнерам/visualContainers/00000_tableEx (3c685)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 719.42, + "id": 5853011907, + "width": 1280.39, + "x": 0, + "y": 0, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/config.json b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/filters.json b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/filters.json new file mode 100644 index 0000000..a42097c --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/filters.json @@ -0,0 +1,95 @@ +[ + { + "name": "9f55bace5e906010cd81", + "expression": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Entity": ".Календарь" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + } + }, + "filter": { + "Version": 2, + "From": [ + { + "Name": "l", + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab", + "Type": 0 + } + ], + "Where": [ + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "l" + } + }, + "Property": "Год" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "2024L" + } + } + ] + ] + } + } + } + ] + }, + "type": "Categorical", + "cachedDisplayNames": [ + { + "id": { + "scopeId": { + "Comparison": { + "ComparisonKind": 0, + "Left": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + }, + "Right": { + "Literal": { + "Value": "2024L" + } + } + } + } + }, + "displayName": "2024" + } + ], + "howCreated": 1, + "objects": {} + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/section.json b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/section.json new file mode 100644 index 0000000..d6bf127 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "Потенциальный рост", + "displayOption": 1, + "height": 720, + "name": "a07f5b013d6bb8da3e20", + "ordinal": 6, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/config.json b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/config.json new file mode 100644 index 0000000..0d0d5e2 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/config.json @@ -0,0 +1,180 @@ +{ + "name": "2bf35ef151b0e0a76547", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 0, + "z": 0, + "width": 1280, + "height": 720.20743301642176 + } + } + ], + "singleVisual": { + "visualType": "tableEx", + "projections": { + "Values": [ + { + "queryRef": "Группы.Группа" + }, + { + "queryRef": "Основной отчет.Остаток конец, руб" + }, + { + "queryRef": "Упущенные продажи.Упущ. торг. надбавка, руб" + }, + { + "queryRef": "Основной отчет.Потенциальный остаток, руб" + }, + { + "queryRef": "Основной отчет.Торг. надбавка, руб, %" + }, + { + "queryRef": "Основной отчет.Потенциальная ТН" + }, + { + "queryRef": "Основной отчет.Оборачиваемость" + }, + { + "queryRef": "Основной отчет.Рентаб. активов" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "г", + "Entity": "Группы", + "Type": 0 + }, + { + "Name": "у", + "Entity": "Упущенные продажи", + "Type": 0 + } + ], + "Select": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "г" + } + }, + "Property": "Группа" + }, + "Name": "Группы.Группа", + "NativeReferenceName": "Группа" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб, %" + }, + "Name": "Основной отчет.Торг. надбавка, руб, %", + "NativeReferenceName": "Торг. надбавка, руб, %" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Потенциальный остаток, руб" + }, + "Name": "Основной отчет.Потенциальный остаток, руб", + "NativeReferenceName": "Потенциальный остаток, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Потенциальная ТН" + }, + "Name": "Основной отчет.Потенциальная ТН", + "NativeReferenceName": "Потенциальная ТН" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Оборачиваемость" + }, + "Name": "Основной отчет.Оборачиваемость", + "NativeReferenceName": "Оборачиваемость" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Рентаб. активов" + }, + "Name": "Основной отчет.Рентаб. активов", + "NativeReferenceName": "Рентаб. активов" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Остаток - МП конец, руб" + }, + "Name": "Основной отчет.Остаток конец, руб", + "NativeReferenceName": "Остаток конец, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "у" + } + }, + "Property": "Упущ. торг. надбавка, руб" + }, + "Name": "Упущенные продажи.Упущ. торг. надбавка, руб", + "NativeReferenceName": "Упущ. торг. надбавка, руб" + } + ], + "OrderBy": [ + { + "Direction": 2, + "Expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Потенциальная ТН" + } + } + } + ] + }, + "drillFilterOtherVisuals": true + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/filters.json b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/visualContainer.json b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/visualContainer.json new file mode 100644 index 0000000..c622036 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/006_Потенциальный рост/visualContainers/00000_tableEx (2bf35)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 720.21, + "id": 5853011905, + "width": 1280, + "x": 0, + "y": 0, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/007_Страница 1/config.json b/analytics/pbi/model/report/Report/sections/007_Страница 1/config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/007_Страница 1/config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/007_Страница 1/filters.json b/analytics/pbi/model/report/Report/sections/007_Страница 1/filters.json new file mode 100644 index 0000000..03f2aaa --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/007_Страница 1/filters.json @@ -0,0 +1,57 @@ +[ + { + "name": "ccbf6ee4bd4d8afd81a9", + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Группы" + } + }, + "Property": "Группа" + } + }, + "filter": { + "Version": 2, + "From": [ + { + "Name": "г", + "Entity": "Группы", + "Type": 0 + } + ], + "Where": [ + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "г" + } + }, + "Property": "Группа" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "'Игрушки'" + } + } + ] + ] + } + } + } + ] + }, + "type": "Categorical", + "howCreated": 1, + "objects": {} + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/007_Страница 1/section.json b/analytics/pbi/model/report/Report/sections/007_Страница 1/section.json new file mode 100644 index 0000000..ab838be --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/007_Страница 1/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "Страница 1", + "displayOption": 1, + "height": 720, + "name": "ffe36beceba1857dfa1f", + "ordinal": 7, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/config.json b/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/config.json new file mode 100644 index 0000000..c528718 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/config.json @@ -0,0 +1,406 @@ +{ + "name": "c117337a02c215e4ae5d", + "layouts": [ + { + "id": 0, + "position": { + "x": 0, + "y": 0, + "z": 0, + "width": 1280, + "height": 720.25723472668813 + } + } + ], + "singleVisual": { + "visualType": "tableEx", + "projections": { + "Values": [ + { + "queryRef": "Номенклатура.Фото" + }, + { + "queryRef": "Номенклатура.Код УТ" + }, + { + "queryRef": "Sum(Номенклатура.max_year_quantity)" + }, + { + "queryRef": "Sum(Номенклатура.max_quarter_quantity)" + }, + { + "queryRef": "Sum(Номенклатура.Цена учетная, руб)" + }, + { + "queryRef": "Основной отчет.Торг. надбавка, руб" + }, + { + "queryRef": "Номенклатура.ТН за квартал" + }, + { + "queryRef": "Номенклатура.ТН за год" + }, + { + "queryRef": "Основной отчет.Торг. надбавка минус РК, руб" + }, + { + "queryRef": "Номенклатура.Остаток МАКС за год, руб" + }, + { + "queryRef": "Номенклатура.Остаток МАКС за квартал, руб" + }, + { + "queryRef": "Номенклатура.Рентабельность %" + }, + { + "queryRef": "Номенклатура.Рентабельность за год" + }, + { + "queryRef": "Sum(Упущенные продажи.Дней в продаже)" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "н", + "Entity": "Номенклатура", + "Type": 0 + }, + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "у", + "Entity": "Упущенные продажи", + "Type": 0 + } + ], + "Select": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Фото" + }, + "Name": "Номенклатура.Фото", + "NativeReferenceName": "Фото" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Код УТ" + }, + "Name": "Номенклатура.Код УТ", + "NativeReferenceName": "Код УТ" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "max_year_quantity" + } + }, + "Function": 0 + }, + "Name": "Sum(Номенклатура.max_year_quantity)", + "NativeReferenceName": "max_year_quantity" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Остаток МАКС за год, руб" + }, + "Name": "Номенклатура.Остаток МАКС за год, руб", + "NativeReferenceName": "Остаток МАКС за год, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Цена учетная, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Номенклатура.Цена учетная, руб)", + "NativeReferenceName": "Цена учетная, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Рентабельность % за квартал" + }, + "Name": "Номенклатура.Рентабельность %", + "NativeReferenceName": "Рентабельность % за квартал" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Рентабельность % за год" + }, + "Name": "Номенклатура.Рентабельность за год", + "NativeReferenceName": "Рентабельность % за год" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Остаток МАКС за квартал, руб" + }, + "Name": "Номенклатура.Остаток МАКС за квартал, руб", + "NativeReferenceName": "Остаток МАКС за квартал, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "max_quarter_quantity" + } + }, + "Function": 0 + }, + "Name": "Sum(Номенклатура.max_quarter_quantity)", + "NativeReferenceName": "max_quarter_quantity" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб" + }, + "Name": "Основной отчет.Торг. надбавка, руб", + "NativeReferenceName": "Торг. надбавка, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "у" + } + }, + "Property": "Дней в продаже" + } + }, + "Function": 0 + }, + "Name": "Sum(Упущенные продажи.Дней в продаже)", + "NativeReferenceName": "Дней в продаже" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "ТН за квартал" + }, + "Name": "Номенклатура.ТН за квартал", + "NativeReferenceName": "ТН за квартал" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "ТН за год" + }, + "Name": "Номенклатура.ТН за год", + "NativeReferenceName": "ТН за год" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка + РК, руб" + }, + "Name": "Основной отчет.Торг. надбавка минус РК, руб", + "NativeReferenceName": "Торг. надбавка минус РК, руб" + } + ], + "OrderBy": [ + { + "Direction": 2, + "Expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Рентабельность % за год" + } + } + } + ] + }, + "drillFilterOtherVisuals": true, + "objects": { + "columnWidth": [ + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "112.08922174722824D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Остаток МАКС за год, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "86.87160050508506D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Остаток МАКС за квартал, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "101.97026022304833D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Рентабельность %" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "72.78064515261566D" + } + } + } + }, + "selector": { + "metadata": "Номенклатура.Рентабельность за год" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "72.0686106261079D" + } + } + } + }, + "selector": { + "metadata": "Основной отчет.Торг. надбавка, руб" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "135.08550263750448D" + } + } + } + }, + "selector": { + "metadata": "Sum(Номенклатура.Цена учетная, руб)" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "82.44979918627925D" + } + } + } + }, + "selector": { + "metadata": "Sum(Упущенные продажи.Дней в продаже)" + } + }, + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "92.72668604258257D" + } + } + } + }, + "selector": { + "metadata": "Sum(Номенклатура.max_quarter_quantity)" + } + } + ] + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/filters.json b/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/visualContainer.json b/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/visualContainer.json new file mode 100644 index 0000000..66c38bf --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/007_Страница 1/visualContainers/00000_tableEx (c1173)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 720.26, + "id": 5853011913, + "width": 1280, + "x": 0, + "y": 0, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/config.json b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/filters.json b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/filters.json new file mode 100644 index 0000000..09032a2 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/filters.json @@ -0,0 +1,57 @@ +[ + { + "name": "ef4eee37ea4e1dce7a95", + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Номенклатура" + } + }, + "Property": "Код УТ" + } + }, + "filter": { + "Version": 2, + "From": [ + { + "Name": "н", + "Entity": "Номенклатура", + "Type": 0 + } + ], + "Where": [ + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Код УТ" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "'УТ-00210673'" + } + } + ] + ] + } + } + } + ] + }, + "type": "Categorical", + "howCreated": 1, + "objects": {} + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/section.json b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/section.json new file mode 100644 index 0000000..13d102e --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "Учетная цена остатка", + "displayOption": 1, + "height": 720, + "name": "21a1880180a03c12e6c2", + "ordinal": 8, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/config.json b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/config.json new file mode 100644 index 0000000..02045dd --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/config.json @@ -0,0 +1,474 @@ +{ + "name": "814c26460b52bb93ad35", + "layouts": [ + { + "id": 0, + "position": { + "x": 11.307498533420752, + "y": 0, + "z": 0, + "width": 1269.2667103764795, + "height": 407.06994720314708, + "tabOrder": 0 + } + } + ], + "singleVisual": { + "visualType": "pivotTable", + "projections": { + "Rows": [ + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "active": true + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "active": true + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.День", + "active": true + }, + { + "queryRef": "Закупки.Статья", + "active": true + } + ], + "Values": [ + { + "queryRef": "Закупки.Сумма закупки, руб" + }, + { + "queryRef": "Sum(Закупки.Кол-во закупка, шт)" + }, + { + "queryRef": "Sum(Номенклатура.Цена учетная, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Закупка, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Доставка, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.НДС, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Таможня, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Производство, руб)" + }, + { + "queryRef": "Sum(Закупки.Закуп.Доп расходы, руб)" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "к", + "Entity": ".Календарь", + "Type": 0 + }, + { + "Name": "з", + "Entity": "Закупки", + "Type": 0 + }, + { + "Name": "н", + "Entity": "Номенклатура", + "Type": 0 + } + ], + "Select": [ + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "NativeReferenceName": "Дата Год" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "NativeReferenceName": "Дата Месяц" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "День" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.День", + "NativeReferenceName": "Дата День" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Закупка, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Закупка, руб)", + "NativeReferenceName": "Закуп.Закупка, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Доставка, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Доставка, руб)", + "NativeReferenceName": "Закуп.Доставка, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.НДС, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.НДС, руб)", + "NativeReferenceName": "Закуп.НДС, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Таможня, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Таможня, руб)", + "NativeReferenceName": "Закуп.Таможня, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Производство, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Производство, руб)", + "NativeReferenceName": "Закуп.Производство, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Закуп.Доп расходы, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Закуп.Доп расходы, руб)", + "NativeReferenceName": "Закуп.Доп расходы, руб" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Статья" + }, + "Name": "Закупки.Статья", + "NativeReferenceName": "Статья" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Кол-во закупка, шт" + } + }, + "Function": 0 + }, + "Name": "Sum(Закупки.Кол-во закупка, шт)", + "NativeReferenceName": "Кол-во закупка, шт" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "н" + } + }, + "Property": "Цена учетная, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Номенклатура.Цена учетная, руб)", + "NativeReferenceName": "Цена учетная, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "з" + } + }, + "Property": "Сумма закупки, руб" + }, + "Name": "Закупки.Сумма закупки, руб", + "NativeReferenceName": "Сумма закупки, руб" + } + ] + }, + "expansionStates": [ + { + "roles": [ + "Rows" + ], + "levels": [ + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Год" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Месяц" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.День" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "День" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + "Закупки.Статья" + ], + "isCollapsed": true, + "isPinned": true + } + ], + "root": { + "identityValues": null, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'Октябрь'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "6L" + } + } + ], + "isToggled": true + }, + { + "identityValues": [ + { + "Literal": { + "Value": "14L" + } + } + ], + "isToggled": true + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Сентябрь'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "26L" + } + } + ], + "isToggled": true + }, + { + "identityValues": [ + { + "Literal": { + "Value": "10L" + } + } + ], + "isToggled": true + } + ] + } + ] + } + ] + } + } + ], + "drillFilterOtherVisuals": true + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/filters.json b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/visualContainer.json b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/visualContainer.json new file mode 100644 index 0000000..678ad35 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/008_Учетная цена остатка/visualContainers/00000_pivotTable (814c2)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 407.07, + "id": 5853011914, + "width": 1269.27, + "x": 11.31, + "y": 0, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/config.json b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/filters.json b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/section.json b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/section.json new file mode 100644 index 0000000..fc8a1d0 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/section.json @@ -0,0 +1,8 @@ +{ + "displayName": "МП оборот и расходы", + "displayOption": 1, + "height": 720, + "name": "ecf3d6be773af5b9f903", + "ordinal": 9, + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/config.json b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/config.json new file mode 100644 index 0000000..a1f7b60 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/config.json @@ -0,0 +1,626 @@ +{ + "name": "19efe866dcf60ed65995", + "layouts": [ + { + "id": 0, + "position": { + "x": 10.684520574745125, + "y": 0, + "z": 0, + "width": 1269.6771949655456, + "height": 632.16746733908656, + "tabOrder": 0 + } + } + ], + "singleVisual": { + "visualType": "pivotTable", + "projections": { + "Rows": [ + { + "queryRef": "Группы.Группа", + "active": true + }, + { + "queryRef": "Партнер.Партнер" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Год" + }, + { + "queryRef": ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + } + ], + "Values": [ + { + "queryRef": "Основной отчет.Торг. надбавка, руб" + }, + { + "queryRef": "mp оборот.НДС_20 по расходам, руб" + }, + { + "queryRef": "mp оборот.Расходы МП + РК + СПП, руб" + }, + { + "queryRef": "Основной отчет.Торг. надбавка, руб, %" + }, + { + "queryRef": "mp оборот.Расходы к учетной сумме, %" + }, + { + "queryRef": "mp оборот.Расходы к обороту, %" + }, + { + "queryRef": "Sum(mp оборот.Сумма оборот МП, руб)" + }, + { + "queryRef": "Основной отчет.Сумма продаж, руб" + }, + { + "queryRef": "Sum(Стоимость МП.Расходы МП, руб)" + }, + { + "queryRef": "Sum(mp реклама.Затраты РК, руб)" + }, + { + "queryRef": "Основной отчет.Сумма продаж + МП + РК, руб" + } + ] + }, + "prototypeQuery": { + "Version": 2, + "From": [ + { + "Name": "к", + "Entity": ".Календарь", + "Type": 0 + }, + { + "Name": "m", + "Entity": "mp оборот", + "Type": 0 + }, + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "с", + "Entity": "Стоимость МП", + "Type": 0 + }, + { + "Name": "m1", + "Entity": "mp реклама", + "Type": 0 + }, + { + "Name": "г", + "Entity": "Группы", + "Type": 0 + }, + { + "Name": "п", + "Entity": "Партнер", + "Type": 0 + } + ], + "Select": [ + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "NativeReferenceName": "Дата Год" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "NativeReferenceName": "Дата Месяц" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Сумма оборот МП, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(mp оборот.Сумма оборот МП, руб)", + "NativeReferenceName": "Сумма оборот МП, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж, руб" + }, + "Name": "Основной отчет.Сумма продаж, руб", + "NativeReferenceName": "Сумма продаж, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "с" + } + }, + "Property": "Расходы МП, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Стоимость МП.Расходы МП, руб)", + "NativeReferenceName": "Расходы МП, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "m1" + } + }, + "Property": "Затраты РК, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(mp реклама.Затраты РК, руб)", + "NativeReferenceName": "Затраты РК, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж + МП + РК, руб" + }, + "Name": "Основной отчет.Сумма продаж + МП + РК, руб", + "NativeReferenceName": "Сумма продаж + МП + РК, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Расходы к обороту, %" + }, + "Name": "mp оборот.Расходы к обороту, %", + "NativeReferenceName": "Расходы к обороту, %" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб" + }, + "Name": "Основной отчет.Торг. надбавка, руб", + "NativeReferenceName": "Торг. надбавка, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Расходы МП + РК + СПП, руб" + }, + "Name": "mp оборот.Расходы МП + РК + СПП, руб", + "NativeReferenceName": "Расходы МП + РК + СПП, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "НДС_20 по расходам, руб" + }, + "Name": "mp оборот.НДС_20 по расходам, руб", + "NativeReferenceName": "НДС_20 по расходам, руб" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "г" + } + }, + "Property": "Группа" + }, + "Name": "Группы.Группа", + "NativeReferenceName": "Группа" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "п" + } + }, + "Property": "Партнер" + }, + "Name": "Партнер.Партнер", + "NativeReferenceName": "Партнер" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Расходы к учетной сумме, %" + }, + "Name": "mp оборот.Расходы к учетной сумме, %", + "NativeReferenceName": "Расходы к учетной сумме, %" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб, %" + }, + "Name": "Основной отчет.Торг. надбавка, руб, %", + "NativeReferenceName": "Торг. надбавка, руб, %" + } + ] + }, + "expansionStates": [ + { + "roles": [ + "Rows" + ], + "levels": [ + { + "queryRefs": [ + "Группы.Группа" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Группы" + } + }, + "Property": "Группа" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + "Партнер.Партнер" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Партнер" + } + }, + "Property": "Партнер" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Год" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Месяц" + } + } + ], + "isPinned": true + } + ], + "root": { + "identityValues": null, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'Клеевые материалы'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Пленки виниловые'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Пряжа'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Резинка'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'ВАЙЛДБЕРРИЗ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Ткани'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + } + ] + } + } + ], + "drillFilterOtherVisuals": true, + "objects": { + "columnWidth": [ + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "139.22256829004024D" + } + } + } + }, + "selector": { + "metadata": "mp оборот.Расходы МП + РК + СПП, руб" + } + } + ] + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/dataTransforms.json b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/dataTransforms.json new file mode 100644 index 0000000..4cf361a --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/dataTransforms.json @@ -0,0 +1,1090 @@ +{ + "objects": { + "columnWidth": [ + { + "properties": { + "value": { + "expr": { + "Literal": { + "Value": "139.22256829004024D" + } + } + } + }, + "selector": { + "metadata": "mp оборот.Расходы МП + РК + СПП, руб" + } + } + ] + }, + "projectionOrdering": { + "Rows": [ + 11, + 12, + 0, + 1 + ], + "Values": [ + 8, + 10, + 9, + 14, + 13, + 7, + 2, + 3, + 4, + 5, + 6 + ] + }, + "projectionActiveItems": { + "Rows": [ + { + "queryRef": "Группы.Группа", + "suppressConcat": false + } + ] + }, + "queryMetadata": { + "Select": [ + { + "Restatement": "Год", + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "Type": 3 + }, + { + "Restatement": "Месяц", + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "Type": 2048 + }, + { + "Restatement": "Сумма оборот МП, руб", + "Name": "Sum(mp оборот.Сумма оборот МП, руб)", + "Type": 1, + "Format": "#,0" + }, + { + "Restatement": "Сумма продаж, руб", + "Name": "Основной отчет.Сумма продаж, руб", + "Type": 1, + "Format": "#,0" + }, + { + "Restatement": "Расходы МП, руб", + "Name": "Sum(Стоимость МП.Расходы МП, руб)", + "Type": 1 + }, + { + "Restatement": "Затраты РК, руб", + "Name": "Sum(mp реклама.Затраты РК, руб)", + "Type": 1, + "Format": "#,0" + }, + { + "Restatement": "Сумма продаж + МП + РК, руб", + "Name": "Основной отчет.Сумма продаж + МП + РК, руб", + "Type": 1, + "Format": "#,0" + }, + { + "Restatement": "Расходы к обороту, %", + "Name": "mp оборот.Расходы к обороту, %", + "Type": 1 + }, + { + "Restatement": "Торг. надбавка, руб", + "Name": "Основной отчет.Торг. надбавка, руб", + "Type": 1, + "Format": "#,0" + }, + { + "Restatement": "Расходы МП + РК + СПП, руб", + "Name": "mp оборот.Расходы МП + РК + СПП, руб", + "Type": 1, + "Format": "#,0" + }, + { + "Restatement": "НДС_20 по расходам, руб", + "Name": "mp оборот.НДС_20 по расходам, руб", + "Type": 1, + "Format": "#,0" + }, + { + "Restatement": "Группа", + "Name": "Группы.Группа", + "Type": 2048 + }, + { + "Restatement": "Партнер", + "Name": "Партнер.Партнер", + "Type": 2048 + }, + { + "Restatement": "Расходы к учетной сумме, %", + "Name": "mp оборот.Расходы к учетной сумме, %", + "Type": 1 + }, + { + "Restatement": "Торг. надбавка, руб, %", + "Name": "Основной отчет.Торг. надбавка, руб, %", + "Type": 1, + "Format": "#,0" + } + ], + "Filters": [ + { + "type": 0, + "expression": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Entity": ".Календарь" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + } + } + }, + { + "type": 0, + "expression": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Entity": ".Календарь" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + } + } + }, + { + "type": 0, + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Партнер" + } + }, + "Property": "Партнер" + } + } + }, + { + "type": 2, + "expression": { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "Сумма оборот МП, руб" + } + }, + "Function": 0 + } + } + }, + { + "type": 2, + "expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Основной отчет" + } + }, + "Property": "Сумма продаж, руб" + } + } + }, + { + "type": 2, + "expression": { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Стоимость МП" + } + }, + "Property": "Расходы МП, руб" + } + }, + "Function": 0 + } + } + }, + { + "type": 2, + "expression": { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "mp реклама" + } + }, + "Property": "Затраты РК, руб" + } + }, + "Function": 0 + } + } + }, + { + "type": 2, + "expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Основной отчет" + } + }, + "Property": "Сумма продаж + МП + РК, руб" + } + } + }, + { + "type": 2, + "expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Основной отчет" + } + }, + "Property": "Торг. надбавка, руб" + } + } + }, + { + "type": 2, + "expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "Расходы МП + РК + СПП, руб" + } + } + }, + { + "type": 2, + "expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "НДС_20 по расходам, руб" + } + } + }, + { + "type": 2, + "expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "Расходы к обороту, %" + } + } + }, + { + "type": 2, + "expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "Расходы к учетной сумме, %" + } + } + }, + { + "type": 0, + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Группы" + } + }, + "Property": "Группа" + } + } + }, + { + "type": 2, + "expression": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Основной отчет" + } + }, + "Property": "Торг. надбавка, руб, %" + } + } + } + ] + }, + "visualElements": [ + { + "DataRoles": [ + { + "Name": "Rows", + "Projection": 11, + "isActive": true + }, + { + "Name": "Rows", + "Projection": 12, + "isActive": false + }, + { + "Name": "Rows", + "Projection": 0, + "isActive": false + }, + { + "Name": "Rows", + "Projection": 1, + "isActive": false + }, + { + "Name": "Values", + "Projection": 8, + "isActive": false + }, + { + "Name": "Values", + "Projection": 10, + "isActive": false + }, + { + "Name": "Values", + "Projection": 9, + "isActive": false + }, + { + "Name": "Values", + "Projection": 14, + "isActive": false + }, + { + "Name": "Values", + "Projection": 13, + "isActive": false + }, + { + "Name": "Values", + "Projection": 7, + "isActive": false + }, + { + "Name": "Values", + "Projection": 2, + "isActive": false + }, + { + "Name": "Values", + "Projection": 3, + "isActive": false + }, + { + "Name": "Values", + "Projection": 4, + "isActive": false + }, + { + "Name": "Values", + "Projection": 5, + "isActive": false + }, + { + "Name": "Values", + "Projection": 6, + "isActive": false + } + ] + } + ], + "selects": [ + { + "displayName": "Год", + "queryName": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "roles": { + "Rows": true + }, + "type": { + "category": "Years", + "underlyingType": 66308 + }, + "expr": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Entity": ".Календарь" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + } + } + }, + { + "displayName": "Месяц", + "queryName": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "roles": { + "Rows": true + }, + "type": { + "category": "Months", + "underlyingType": 131585 + }, + "expr": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Entity": ".Календарь" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + } + } + }, + { + "displayName": "Сумма оборот МП, руб", + "format": "#,0", + "queryName": "Sum(mp оборот.Сумма оборот МП, руб)", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "Сумма оборот МП, руб" + } + }, + "Function": 0 + } + } + }, + { + "displayName": "Сумма продаж, руб", + "format": "#,0", + "queryName": "Основной отчет.Сумма продаж, руб", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Основной отчет" + } + }, + "Property": "Сумма продаж, руб" + } + } + }, + { + "displayName": "Расходы МП, руб", + "queryName": "Sum(Стоимость МП.Расходы МП, руб)", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Стоимость МП" + } + }, + "Property": "Расходы МП, руб" + } + }, + "Function": 0 + } + } + }, + { + "displayName": "Затраты РК, руб", + "format": "#,0", + "queryName": "Sum(mp реклама.Затраты РК, руб)", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "mp реклама" + } + }, + "Property": "Затраты РК, руб" + } + }, + "Function": 0 + } + } + }, + { + "displayName": "Сумма продаж + МП + РК, руб", + "format": "#,0", + "queryName": "Основной отчет.Сумма продаж + МП + РК, руб", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Основной отчет" + } + }, + "Property": "Сумма продаж + МП + РК, руб" + } + } + }, + { + "displayName": "Расходы к обороту, %", + "queryName": "mp оборот.Расходы к обороту, %", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "Расходы к обороту, %" + } + } + }, + { + "displayName": "Торг. надбавка, руб", + "format": "#,0", + "queryName": "Основной отчет.Торг. надбавка, руб", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Основной отчет" + } + }, + "Property": "Торг. надбавка, руб" + } + } + }, + { + "displayName": "Расходы МП + РК + СПП, руб", + "format": "#,0", + "queryName": "mp оборот.Расходы МП + РК + СПП, руб", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "Расходы МП + РК + СПП, руб" + } + } + }, + { + "displayName": "НДС_20 по расходам, руб", + "format": "#,0", + "queryName": "mp оборот.НДС_20 по расходам, руб", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "НДС_20 по расходам, руб" + } + } + }, + { + "displayName": "Группа", + "queryName": "Группы.Группа", + "roles": { + "Rows": true + }, + "type": { + "category": null, + "underlyingType": 1 + }, + "expr": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Группы" + } + }, + "Property": "Группа" + } + } + }, + { + "displayName": "Партнер", + "queryName": "Партнер.Партнер", + "roles": { + "Rows": true + }, + "type": { + "category": null, + "underlyingType": 1 + }, + "expr": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Партнер" + } + }, + "Property": "Партнер" + } + } + }, + { + "displayName": "Расходы к учетной сумме, %", + "queryName": "mp оборот.Расходы к учетной сумме, %", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "mp оборот" + } + }, + "Property": "Расходы к учетной сумме, %" + } + } + }, + { + "displayName": "Торг. надбавка, руб, %", + "format": "#,0", + "queryName": "Основной отчет.Торг. надбавка, руб, %", + "roles": { + "Values": true + }, + "type": { + "category": null, + "underlyingType": 259 + }, + "expr": { + "Measure": { + "Expression": { + "SourceRef": { + "Entity": "Основной отчет" + } + }, + "Property": "Торг. надбавка, руб, %" + } + } + } + ], + "expansionStates": [ + { + "roles": [ + "Rows" + ], + "levels": [ + { + "queryRefs": [ + "Группы.Группа" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Группы" + } + }, + "Property": "Группа" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + "Партнер.Партнер" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Партнер" + } + }, + "Property": "Партнер" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Год" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + } + ], + "isPinned": true + }, + { + "queryRefs": [ + ".Календарь.Дата.Изменение.Иерархия дат.Месяц" + ], + "isCollapsed": true, + "identityKeys": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Месяц" + } + } + ], + "isPinned": true + } + ], + "root": { + "identityValues": null, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'Клеевые материалы'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Пленки виниловые'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Пряжа'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Резинка'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'ВАЙЛДБЕРРИЗ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + }, + { + "identityValues": [ + { + "Literal": { + "Value": "'Ткани'" + } + } + ], + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ], + "isToggled": true, + "children": [ + { + "identityValues": [ + { + "Literal": { + "Value": "2025L" + } + } + ], + "isToggled": true + } + ] + } + ] + } + ] + } + } + ] +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/filters.json b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/filters.json new file mode 100644 index 0000000..311c52f --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/filters.json @@ -0,0 +1,159 @@ +[ + { + "name": "f083b0373665c2fecd27", + "expression": { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Entity": ".Календарь" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + } + }, + "filter": { + "Version": 2, + "From": [ + { + "Name": "l", + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab", + "Type": 0 + } + ], + "Where": [ + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "l" + } + }, + "Property": "Год" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "2025L" + } + } + ] + ] + } + } + } + ] + }, + "type": "Categorical", + "cachedDisplayNames": [ + { + "id": { + "scopeId": { + "Comparison": { + "ComparisonKind": 0, + "Left": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab" + } + }, + "Property": "Год" + } + }, + "Right": { + "Literal": { + "Value": "2025L" + } + } + } + } + }, + "displayName": "2025" + } + ], + "howCreated": 0, + "objects": {}, + "isHiddenInViewMode": false + }, + { + "name": "cf47c7a1257b5bb31e24", + "expression": { + "Column": { + "Expression": { + "SourceRef": { + "Entity": "Партнер" + } + }, + "Property": "Партнер" + } + }, + "filter": { + "Version": 2, + "From": [ + { + "Name": "п", + "Entity": "Партнер", + "Type": 0 + } + ], + "Where": [ + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "п" + } + }, + "Property": "Партнер" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "'ВАЙЛДБЕРРИЗ ООО'" + } + } + ], + [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ] + ] + } + } + } + ] + }, + "type": "Categorical", + "howCreated": 0, + "objects": {}, + "isHiddenInViewMode": false + } +] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/query.json b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/query.json new file mode 100644 index 0000000..368f8ca --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/query.json @@ -0,0 +1,368 @@ +{ + "Commands": [ + { + "SemanticQueryDataShapeCommand": { + "Query": { + "Version": 2, + "From": [ + { + "Name": "к", + "Entity": ".Календарь", + "Type": 0 + }, + { + "Name": "m", + "Entity": "mp оборот", + "Type": 0 + }, + { + "Name": "о", + "Entity": "Основной отчет", + "Type": 0 + }, + { + "Name": "с", + "Entity": "Стоимость МП", + "Type": 0 + }, + { + "Name": "m1", + "Entity": "mp реклама", + "Type": 0 + }, + { + "Name": "г", + "Entity": "Группы", + "Type": 0 + }, + { + "Name": "п", + "Entity": "Партнер", + "Type": 0 + }, + { + "Name": "l", + "Entity": "LocalDateTable_e0374236-67f4-4331-b4f5-c977a3082bab", + "Type": 0 + } + ], + "Select": [ + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Год" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Год", + "NativeReferenceName": "Дата Год" + }, + { + "HierarchyLevel": { + "Expression": { + "Hierarchy": { + "Expression": { + "PropertyVariationSource": { + "Expression": { + "SourceRef": { + "Source": "к" + } + }, + "Name": "Изменение", + "Property": "Дата" + } + }, + "Hierarchy": "Иерархия дат" + } + }, + "Level": "Месяц" + }, + "Name": ".Календарь.Дата.Изменение.Иерархия дат.Месяц", + "NativeReferenceName": "Дата Месяц" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Сумма оборот МП, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(mp оборот.Сумма оборот МП, руб)", + "NativeReferenceName": "Сумма оборот МП, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж, руб" + }, + "Name": "Основной отчет.Сумма продаж, руб", + "NativeReferenceName": "Сумма продаж, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "с" + } + }, + "Property": "Расходы МП, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(Стоимость МП.Расходы МП, руб)", + "NativeReferenceName": "Расходы МП, руб" + }, + { + "Aggregation": { + "Expression": { + "Column": { + "Expression": { + "SourceRef": { + "Source": "m1" + } + }, + "Property": "Затраты РК, руб" + } + }, + "Function": 0 + }, + "Name": "Sum(mp реклама.Затраты РК, руб)", + "NativeReferenceName": "Затраты РК, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Сумма продаж + МП + РК, руб" + }, + "Name": "Основной отчет.Сумма продаж + МП + РК, руб", + "NativeReferenceName": "Сумма продаж + МП + РК, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Расходы к обороту, %" + }, + "Name": "mp оборот.Расходы к обороту, %", + "NativeReferenceName": "Расходы к обороту, %" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб" + }, + "Name": "Основной отчет.Торг. надбавка, руб", + "NativeReferenceName": "Торг. надбавка, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Расходы МП + РК + СПП, руб" + }, + "Name": "mp оборот.Расходы МП + РК + СПП, руб", + "NativeReferenceName": "Расходы МП + РК + СПП, руб" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "НДС_20 по расходам, руб" + }, + "Name": "mp оборот.НДС_20 по расходам, руб", + "NativeReferenceName": "НДС_20 по расходам, руб" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "г" + } + }, + "Property": "Группа" + }, + "Name": "Группы.Группа", + "NativeReferenceName": "Группа" + }, + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "п" + } + }, + "Property": "Партнер" + }, + "Name": "Партнер.Партнер", + "NativeReferenceName": "Партнер" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "m" + } + }, + "Property": "Расходы к учетной сумме, %" + }, + "Name": "mp оборот.Расходы к учетной сумме, %", + "NativeReferenceName": "Расходы к учетной сумме, %" + }, + { + "Measure": { + "Expression": { + "SourceRef": { + "Source": "о" + } + }, + "Property": "Торг. надбавка, руб, %" + }, + "Name": "Основной отчет.Торг. надбавка, руб, %", + "NativeReferenceName": "Торг. надбавка, руб, %" + } + ], + "Where": [ + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "l" + } + }, + "Property": "Год" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "2025L" + } + } + ] + ] + } + } + }, + { + "Condition": { + "In": { + "Expressions": [ + { + "Column": { + "Expression": { + "SourceRef": { + "Source": "п" + } + }, + "Property": "Партнер" + } + } + ], + "Values": [ + [ + { + "Literal": { + "Value": "'ВАЙЛДБЕРРИЗ ООО'" + } + } + ], + [ + { + "Literal": { + "Value": "'ИНТЕРНЕТ РЕШЕНИЯ ООО'" + } + } + ] + ] + } + } + } + ] + }, + "Binding": { + "Primary": { + "Groupings": [ + { + "Projections": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 14 + ], + "Subtotal": 1 + } + ] + }, + "DataReduction": { + "DataVolume": 3, + "Primary": { + "Window": { + "Count": 500 + } + } + }, + "Version": 1 + }, + "ExecutionMetricsKind": 1 + } + } + ] +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/visualContainer.json b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/visualContainer.json new file mode 100644 index 0000000..20e3727 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/009_МП оборот и расходы/visualContainers/00000_pivotTable (19efe)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 632.17, + "id": 5853011903, + "width": 1269.68, + "x": 10.68, + "y": 0, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/999_Обновление/config.json b/analytics/pbi/model/report/Report/sections/999_Обновление/config.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/999_Обновление/config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/999_Обновление/filters.json b/analytics/pbi/model/report/Report/sections/999_Обновление/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/999_Обновление/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/999_Обновление/section.json b/analytics/pbi/model/report/Report/sections/999_Обновление/section.json new file mode 100644 index 0000000..6248e09 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/999_Обновление/section.json @@ -0,0 +1,7 @@ +{ + "displayName": "Обновление", + "displayOption": 1, + "height": 720, + "name": "ReportSectionbde6a9de8b7cb9bc9375", + "width": 1280 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/config.json b/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/config.json new file mode 100644 index 0000000..b28af5d --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/config.json @@ -0,0 +1,4028 @@ +{ + "name": "2067c8cf099df281d0a8", + "layouts": [ + { + "id": 0, + "position": { + "x": 10.174922889022294, + "y": 20.349845778044589, + "z": 0, + "width": 1270.1695406462832, + "height": 700.37385886103471, + "tabOrder": 0 + } + } + ], + "singleVisual": { + "visualType": "textbox", + "drillFilterOtherVisuals": true, + "objects": { + "general": [ + { + "properties": { + "paragraphs": [ + { + "textRuns": [ + { + "value": "ИСТОРИЯ ОБНОВЛЕНИЙ", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "26.01.2026" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'mp оборот' [Расходы к обороту, %] = (Оборот - Сумма продаж) / Оборот" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "14.01.2026" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена таблица 'mp оборот'" + } + ] + }, + { + "textRuns": [ + { + "value": "Сумма продаж по данным МП до вычета Скидки постоянного покупателя (СПП) и расходов, по установленным нами ценам." + } + ] + }, + { + "textRuns": [ + { + "value": "Другими словами, Сумма продаж + РК + СПП, по данным маркетплейсов." + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "08.12.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Номенклатура, папка Аналитика" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены столбцы [Оплаченный остаток], [Рентабельность остатка]" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Номенклатура, папка Измерения" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены столбцы [Количество упак в кванте], [Количество упак в коробе]" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица 'Заказы все'" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены папки 'Заказы согласование', 'Заказы выгружены на складе'" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "27.10.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица '.Календарь'." + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец [Год неделя]" + } + ] + }, + { + "textRuns": [ + { + "value": "Показывает год и номер недели с начала года. " + } + ] + }, + { + "textRuns": [ + { + "value": "Подходит для понедельного отчета." + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Номенклатура. Папка Свойства" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены столбцы [Особенность], [Размер], [Форма]" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "15.10.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Партнер. " + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены столбцы из 1с" + } + ] + }, + { + "textRuns": [ + { + "value": "Статус по динамике 2025/2024" + } + ] + }, + { + "textRuns": [ + { + "value": "Статус по обороту 2025" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Менеджеры." + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец Вышестоящее подразделение" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "28.09.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Номенклатура, папка Маркеты" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец [маркеты.Ozon] из 1с" + } + ] + }, + { + "textRuns": [ + { + "value": "Удален столбец [маркеты.FBS]" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Номенклатура, папка Аналитика" + } + ] + }, + { + "textRuns": [ + { + "value": "Ср. цена продажи упак, руб x 1000" + } + ] + }, + { + "textRuns": [ + { + "value": "Ср. цена учетная упак, руб x 1000" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "(Сумма продаж + МП + РК) * 1000 / Количество проданных упак" + } + ] + }, + { + "textRuns": [ + { + "value": "(Сумма учетная) * 1000 / Количество проданных упак" + } + ] + }, + { + "textRuns": [ + { + "value": "Меры рассчитаны по данным за последние 365 дней" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "ПРАЙСлист" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера [Цена отпускная упак все в руб]" + } + ] + }, + { + "textRuns": [ + { + "value": "Отпускная цена для всех товаров (руб и вал) за упаковку в рублях" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "09.09.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Партнер. Добавлены столбцы" + } + ] + }, + { + "textRuns": [ + { + "value": "Дата первого заказа" + } + ] + }, + { + "textRuns": [ + { + "value": "Когорта" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Номенклатура, папка Статусы. Добавлены столбцы из 1с" + } + ] + }, + { + "textRuns": [ + { + "value": "Неликвид" + } + ] + }, + { + "textRuns": [ + { + "value": "ABC статус 12м 08.25" + } + ] + }, + { + "textRuns": [ + { + "value": "ABC статус 3м 08.25" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "02.09.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица План продаж менеджеров. Добавлены меры " + } + ] + }, + { + "textRuns": [ + { + "value": "План продаж менеджеров год, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "% годового плана" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Отношение Суммы продаж + РК, руб к годовому плану" + } + ] + }, + { + "textRuns": [ + { + "value": "Годовой план рассчитан как сумма планов по месяцам" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Основной отчет. Добавлена мера" + } + ] + }, + { + "textRuns": [ + { + "value": "Продажи за год, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "Показывает 'Сумму продаж + РК, руб' за выбранный год" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Резервы. Удалены столбцы" + } + ] + }, + { + "textRuns": [ + { + "value": "В резерве со склада, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "В резерве под заказ, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "31.08.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Партнер. Добавлен столбец 'Статус партнера' из карточки в 1с" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "19.08.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Номенклатура. Удален столбец 'XYZ статус'" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица 'mp реклама'. Изменились названия столбцов" + } + ] + }, + { + "textRuns": [ + { + "value": "Затраты, руб/usd заменено на Затраты РК, руб/usd" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Основной отчет. " + } + ] + }, + { + "textRuns": [ + { + "value": "Изменены названия столбцов. Новые названия:" + } + ] + }, + { + "textRuns": [ + { + "value": "Сумма продаж + МП + РК" + } + ] + }, + { + "textRuns": [ + { + "value": "Сумма продаж + РК" + } + ] + }, + { + "textRuns": [ + { + "value": "Сумма продаж" + } + ] + }, + { + "textRuns": [ + { + "value": "где Сумма продаж - это чистая сумма, после вычета МП и РК " + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера:" + } + ] + }, + { + "textRuns": [ + { + "value": "Сумма продаж + РК Маркеты" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "17.08.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Номенклатура, папка Статусы. " + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены столбцы из карточки товара в 1с:" + } + ] + }, + { + "textRuns": [ + { + "value": "XYZ статус 12м" + } + ] + }, + { + "textRuns": [ + { + "value": "XYZ статус 3м" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Номенклатура, папка Описание" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены столбцы из внешних источников" + } + ] + }, + { + "textRuns": [ + { + "value": "Качество контента Magok" + } + ] + }, + { + "textRuns": [ + { + "value": "Качество контента Ozon" + } + ] + }, + { + "textRuns": [ + { + "value": "Качество контента WB" + } + ] + }, + { + "textRuns": [ + { + "value": "Качество контента WB by Ozon" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "14.08.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены меры ДРР. Отношение рекламных расходов из таблицы 'mp реклама' к сумме продаж/заказов" + } + ] + }, + { + "textRuns": [ + { + "value": "ДРР реальный от продаж, % = ", + "textStyle": { + "fontFamily": "Consolas, Courier New, monospace", + "fontSize": "12px", + "color": "#000000" + } + }, + { + "value": "затраты, руб / Сумма плюс МП, руб (Основной отчет)", + "textStyle": { + "fontFamily": "system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Ubuntu, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol", + "color": "#151515" + } + } + ] + }, + { + "textRuns": [ + { + "value": "ДРР заказы по рекламе, % = затраты, руб / с" + }, + { + "value": "умма заказов (mp реклама)", + "textStyle": { + "fontFamily": "system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Ubuntu, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol", + "fontSize": "14.5px", + "color": "#151515" + } + } + ] + }, + { + "textRuns": [ + { + "value": "ДРР заказы все, % = затраты, руб / Продано, руб (mp аналитика продаж, вид загрузки = ЗаказыВС)", + "textStyle": { + "fontFamily": "system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Ubuntu, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol", + "fontSize": "14.5px", + "color": "#151515" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "В таблицу 'mp реклама' добавлен столбец Затраты, usd" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены меры" + } + ] + }, + { + "textRuns": [ + { + "value": "Сумма продаж минус РК, usd" + } + ] + }, + { + "textRuns": [ + { + "value": "Торг. надбавка + РК, руб, %" + } + ] + }, + { + "textRuns": [ + { + "value": "Торг. надбавка + РК, usd, %" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Изменилась формула расчета торговой надбавки в руб и usd." + } + ] + }, + { + "textRuns": [ + { + "value": "Было: Торг. надбавка = Сумма продаж - Сумма учетная - МП" + } + ] + }, + { + "textRuns": [ + { + "value": "Стало: Торг. надбавка = Сумма продаж - Сумма учетная - МП - РК" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "07.08.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Номенклатура, папка Статистика" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены столбцы" + } + ] + }, + { + "textRuns": [ + { + "value": "Средние месячные продажи, упак " + } + ] + }, + { + "textRuns": [ + { + "value": "СКО месячных продаж, упак" + } + ] + }, + { + "textRuns": [ + { + "value": "Средние продажи в месяц и среднее квадратичное отклонение продаж в месяц за последние 12 полных месяцев, в упаковках" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера Коэффициент вариации = СКО/Средние продажи" + } + ] + }, + { + "textRuns": [ + { + "value": "Чем выше коэффициент, тем нестабильнее продажи (сезонность, акции, другие причины)" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Таблица Основной отчет. Добавлена мера" + } + ] + }, + { + "textRuns": [ + { + "value": "Торг. надбавка минус РК, руб, %", + "textStyle": { + "fontFamily": "Consolas, Courier New, monospace", + "fontSize": "12px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Торговая надбавка за вычетом расходов на рекламу маркетов, рассчитана от сумм в рублях, выражена в %." + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "06.08.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена таблица Резервы." + } + ] + }, + { + "textRuns": [ + { + "value": "Количество товаров в резерве на складе и под заказ на сегодня, без динамики по дням" + } + ] + }, + { + "textRuns": [ + { + "value": "Учтены резервы, созданные после 01.01.2025, резервы до 2025 г. не учитываются." + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены меры в Основной отчет/Остаток склад:" + } + ] + }, + { + "textRuns": [ + { + "value": "Остаток - МП - резерв, руб", + "textStyle": { + "fontFamily": "Consolas, Courier New, monospace", + "fontSize": "12px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Остаток - МП - резерв, упак", + "textStyle": { + "fontFamily": "Consolas, Courier New, monospace", + "fontSize": "12px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Остаток - МП - резерв, шт", + "textStyle": { + "fontFamily": "Consolas, Courier New, monospace", + "fontSize": "12px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Свободный остаток на нашем складе на сегодня, мп и резерв без динамики по дням" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "05.08.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "В таблицу Номенклатура, папка Описание добавлены ID OZON и ID WB" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "28.07.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "В Основной отчет добавлена папка Магок и маркеты." + } + ] + }, + { + "textRuns": [ + { + "value": "Здесь привычные меры с фильтром." + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Маркеты - это отбор по партнерам \"ВАЙЛДБЕРРИЗ ООО\", \"ИНТЕРНЕТ РЕШЕНИЯ ООО\"," + } + ] + }, + { + "textRuns": [ + { + "value": " \"ИНТЕРНЕТ РЕШЕНИЯ ООО юр. лица\", \"ЯНДЕКС.МАРКЕТ ООО\", \"ЯНДЕКС.МАРКЕТ ООО юр.лица\"" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Магок - это все остальные партнеры" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "_________________________________________________________________________" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Изменились названия мер в папке Основной отчет/Остаток склад:" + } + ] + }, + { + "textRuns": [ + { + "value": "\"Остаток - МП\" = Остаток на нашем складе" + } + ] + }, + { + "textRuns": [ + { + "value": "\"Остаток\" = Остаток на нашем складе + остаток на маркетплейсах" + } + ] + }, + { + "textRuns": [ + { + "value": "\"Остаток потенциальный\" = Остаток склад + маркетплейсы + в пути + в производстве" + } + ] + }, + { + "textRuns": [ + { + "value": "\"Остаток потенциальный + согласование\" = Остаток потенциальный + заказы поставщикам в статусе на согласовании" + } + ] + }, + { + "textRuns": [ + { + "value": "__________________________________________________________________________" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Удалила меры в Основном отчете:" + } + ] + }, + { + "textRuns": [ + { + "value": "Продажи, шт и Продажи, упак" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Такие меры уже есть:" + } + ] + }, + { + "textRuns": [ + { + "value": "Количество продаж, шт и Количество продаж, упак" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "23.07.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меры в таблицу Основной отчет:" + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "Учет.Списание товара, руб -- Стоимость списанного товара (недостача)", + "textStyle": { + "fontFamily": "Consolas, Courier New, monospace", + "fontSize": "12px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "Учет.Списание товара, usd", + "textStyle": { + "fontFamily": "Consolas, Courier New, monospace", + "fontSize": "12px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "\tМеры Сумма учетная, руб и Сумма учетная, usd увеличены, добавлена стоимость списанного товара" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "В таблицу Закупки добавлена Статья Оприходование излишков товара. " + } + ] + }, + { + "textRuns": [ + { + "value": "Увеличивает суммарное значение в столбцах Кол-во закупка, упак и Кол-во закупка, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "03.06.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила столбцы в таблицу Заказы все:" + } + ] + }, + { + "textRuns": [ + { + "value": "\tПартнер" + } + ] + }, + { + "textRuns": [ + { + "value": "\tСумма всего в usd2. --Сумма всех заказов, пересчитанная по курсу USD2+2" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меры в таблицу Заказы все:" + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "В производстве/ в пути / тех заказ сумма всего в руб", + "textStyle": { + "fontSize": "13.3333px" + } + }, + { + "value": " " + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "В производстве / в пути / тех заказ сумма всего в usd2", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "-- Сумма всех заказов, пересчитанная в руб и usd2+2" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меру в Основной отчет:" + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "Остаток склад + в пути + произв., руб ", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "27.05.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меры" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОстаток склад + в пути + произв., шт\t" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОтчет продажи шт/день" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОстаток дней продаж потенциальный без МП, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "26.05.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "В таблицу Номенклатура добавила столбцы:" + } + ] + }, + { + "textRuns": [ + { + "value": "\tЦеновой сегмент Магок" + } + ] + }, + { + "textRuns": [ + { + "value": "\tЦеновой сегмент МП" + } + ] + }, + { + "textRuns": [ + { + "value": "\tКол-во упак в заказе Магок" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "23.05.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Изменила меры. Из учетной суммы вычла Себестоимость. Доп расходы и Доп расходы USD2+2" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОсновной учет. Сумма учетная, руб (мера по старой схеме)" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОсновном учет. Сумма учетная, usd " + }, + { + "value": "(мера по старой схеме)", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "\tЗакупки. Сумма закупки, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "Закупки. Сумма закупки, usd", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "\tСебестоимость. Сумма учетная " + }, + { + "value": "(мера по новой схеме)", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "Себестоимость. Сумма учетная, usd (мера по новой схеме)", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меры:" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОсновной учет. Учет" + }, + { + "value": ".", + "textStyle": { + "color": "#098658" + } + }, + { + "value": "Доп расходы, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "Основной учет. Учет", + "textStyle": { + "fontSize": "13.3333px" + } + }, + { + "value": ".", + "textStyle": { + "fontSize": "13.3333px", + "color": "#098658" + } + }, + { + "value": "Доп расходы, usd", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "\tЗакупки. Закуп.Доп расходы, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "\t" + }, + { + "value": "Закупки. Закуп.Доп расходы, usd", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "21.05.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меры в таблицу 'Заказы все':" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОстаток склад + МП + в пути + произв. актуальные, упак" + } + ] + }, + { + "textRuns": [ + { + "value": "\tПродажи актуальных, упак" + } + ] + }, + { + "textRuns": [ + { + "value": "\tСумма учетная продаж актуальные, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "\tТорг. надбавка актуальные, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "Меры рассчитывают товарный остаток и суммы продаж только по тем товарам, которые есть в Заказах поставщикам." + } + ] + }, + { + "textRuns": [ + { + "value": "Необходимо для фильтрации мер по заказам поставщикам", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Дополнила меры в папке 'Номенклатура' Аналитика." + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила условие: рассчитывать показатели только по тем товарам, которые есть в Заказе поставщику." + } + ] + }, + { + "textRuns": [ + { + "value": "Необходимо для фильтрации мер по заказам поставщикам" + } + ] + }, + { + "textRuns": [ + { + "value": "Измененные меры:" + } + ] + }, + { + "textRuns": [ + { + "value": "\tДней в продаже" + } + ] + }, + { + "textRuns": [ + { + "value": "\tДней с первой продажи" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОстаток дней продаж" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОстаток дней продаж потенциальный" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОстаток МАКС за год, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОтчет ТН руб/день за 365 дней" + } + ] + }, + { + "textRuns": [ + { + "value": "\tРентабельность за год" + } + ] + }, + { + "textRuns": [ + { + "value": "\tУпущ. сумма продаж, руб\t" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "20.05.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меры Остаток конец, кг и Остаток конец, м3. " + } + ] + }, + { + "textRuns": [ + { + "value": "Вес и объем товара на складах на конец периода" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "15.05.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавил распределение прибыли и расходов по товарам и клиентам. " + } + ] + }, + { + "textRuns": [ + { + "value": "Добавил скидки" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавил меры с потенциальными цифрами - отталкиваясь от остатка у нас и товаров в пути и производстве" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "11.05.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила Объем в таблицу Заказы все, в пути, в производстве, тех. заказы" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меры Сумма в производстве только руб/cny/try/usd2 c отбором по валюте" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавила меры Сумма в пути только руб/cny/try/usd2 c отбором по валюте", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "mp аналитика продаж Установила ограничение по дате в Power Query, дата 01.01.2024 или позже (для уменьшения размера файла)", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "07.05.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавил таблицу ЗАКАЗЫ Все. Сделал меры для в пути, в произв, тех заказ" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавил Упущенные продажи " + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "'Номенклатура':" + } + ] + }, + { + "textRuns": [ + { + "value": "\tразбил по папкам " + } + ] + }, + { + "textRuns": [ + { + "value": "\tпапка Аналитика" + } + ] + }, + { + "textRuns": [ + { + "value": "\t[Остаток МАКС за год, руб] " + } + ] + }, + { + "textRuns": [ + { + "value": "\t[Рентабельность за год]" + } + ] + }, + { + "textRuns": [ + { + "value": "\t[Ср. уч. цена]" + } + ] + }, + { + "textRuns": [ + { + "value": "\tОстаток дней продаж потенциальный - Остаток склад + мп + в пути + в производстве / продажи упак в день" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "mp_ostatki - в базовой вью добавил отбор только по последней дате. Получили остатки на текущий день.", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "'Основной отчет'[продажи упак]" + } + ] + }, + { + "textRuns": [ + { + "value": "'Основной отчет'[продажи шт]", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "'Основной отчет'[Остаток склад + МП] - реалльный остаток", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "'Основной отчет'[Остаток склад + МП + в пути + в произв] - потенциальный остаток", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "'Основной отчет'", + "textStyle": { + "fontSize": "13.3333px" + } + }, + { + "value": "Торг. надбавка - 70р за упак, руб" + }, + { + "value": "]", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "08.04.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена таблица 'Заказы тех'. Заказы поставщикам со статусом \"Тех. заказ\" (Несогласованный)" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "07.04.2024" + } + ] + }, + { + "textRuns": [ + { + "value": "АБС план" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "03.04.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Цена учетная по закупкам, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "Цена учетная последняя известная, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "Остаток конец по средней закупке, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "Остаток конец по последней закупке, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "01.04.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "YTD Сумма продаж с начала года, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "Аппроксимация год, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "Оборачиваемость, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "Остаток средний, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "План закупки ост" + }, + { + "value": ".", + "textStyle": { + "color": "#098658" + } + }, + { + "value": " период, шт" + } + ] + }, + { + "textRuns": [ + { + "value": "План закупки ост" + }, + { + "value": ".", + "textStyle": { + "color": "#098658" + } + }, + { + "value": " период, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "План закупки ост" + }, + { + "value": ".", + "textStyle": { + "color": "#098658" + } + }, + { + "value": " период, usd" + } + ] + }, + { + "textRuns": [ + { + "value": "Курс TODAY-1, usd2" + } + ] + }, + { + "textRuns": [ + { + "value": "Закупки.Статья" + } + ] + }, + { + "textRuns": [ + { + "value": "Цена учетная по закупкам, руб" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "25.03.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлены меры в Основной отчет, папка MAA, MAT, MTD, PY, YTD:" + } + ] + }, + { + "textRuns": [ + { + "value": "PP Продажи за прошлый период, руб/шт/упак" + } + ] + }, + { + "textRuns": [ + { + "value": "PP Прирост к прошлому периоду, руб/шт/упак" + } + ] + }, + { + "textRuns": [ + { + "value": "PP Прирост к прошлому периоду, руб/шт/упак, %" + } + ] + }, + { + "textRuns": [ + { + "value": "Показывают продажи за период той же продолжительности, что и выбранный, но заканчивающийся перед его началом." + } + ] + }, + { + "textRuns": [ + { + "value": "А также прирост (абсолютн. и %) в текущем периоде к прошлому периоду." + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "03.03.2025" + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Артикулы продающие]. Выводит количество проданных уникальных артикулов за выбранный период." + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Количество реализаций] Выводит количество уникальных номеров реализации за выбранный период." + } + ] + }, + { + "textRuns": [ + { + "value": "Удален столбец 'Номенклатура'[Тип плетения] Сидорова М.А." + } + ] + }, + { + "textRuns": [ + { + "value": "Удален столбец 'Номенклатура'[Тип шнура] Сидорова М.А.", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена таблица 'Сохраненные настройки 1С для PowerBI' Сидорова М.А.", + "textStyle": { + "fontSize": "13.3333px" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "28.02.2025", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "ПРАЙСлист. Добавлены меры:", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Учетная цена (вал),", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Учетная цена (руб),", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Цена инвойс (вал),", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Цена отпускная (руб),", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Цена отпускная вал в раб", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Выводит последнюю известную цену на дату, указанную в визуализации ", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "17.04.2024", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена мера Когорта = ", + "textStyle": { + "fontSize": "12pt" + } + }, + { + "value": "FORMAT", + "textStyle": { + "fontSize": "12pt", + "color": "#3165bb" + } + }, + { + "value": "(", + "textStyle": { + "fontSize": "12pt" + } + }, + { + "value": "'Партнер'", + "textStyle": { + "fontSize": "12pt", + "color": "#001080" + } + }, + { + "value": "[Дата первого заказа]", + "textStyle": { + "fontSize": "12pt", + "color": "#5f5f5f" + } + }, + { + "value": ", ", + "textStyle": { + "fontSize": "12pt" + } + }, + { + "value": "\"YYYY-MM\"", + "textStyle": { + "fontSize": "12pt", + "color": "#a31515" + } + }, + { + "value": ")", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Причина: ошибка, нет столбца [Дата первого заказа]", + "textStyle": { + "fontSize": "12pt" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "25.03.2024", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Учет.Доставка, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Учет.Закупка ПТУ, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Учет.НДС, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Учет.Сборка, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Учет.Таможня, usd]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi Себестоимость'[Доставка, usd]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi Себестоимость'[НДС, usd]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi Себестоимость'[Сборка, usd]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi Себестоимость'[Таможня, usd]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "29.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец 'Партнер'[Дата последнего звонка] из Bitrix24", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Подключен новый источник Bitrix24", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец 'Партнер'[partner_link]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "28.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Прайс'[Учетная цена прайс, вал]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Прайс'[Учетная цена прайс, руб]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Средний чек]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Средний чек, вал]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Поле 'Номенклатура'[Наполнитель] переименовано в 'Номенклатура'[XYZ статус]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена таблица 'pbi Внешние остатки'", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена таблица 'pbi Внешние продажи'", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "27.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Закупки регистр'[Сборка]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Закупки регистр'[Таможня]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Закупки регистр'[Сумма, usd]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Сумма скидки, руб]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[% Скидки, руб]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Прайс'[Цена Инвойс, вал]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Прайс'[Цена отпускная, руб]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Прайс'[Цена отпускная, вал в руб]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "26.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец 'Номенклатура'[Да/Нет Собственное пр-во]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "25.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена таблица 'Прайс'", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "21.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец 'Партнер'[Сегмент]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена таблица 'Партнеры.Сегменты'", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Обновлена таблица 'Стоимость МП'. Заполнены организации и партнеры в пустых полях. Добавлен столбец 'ПартнерКод'", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена таблица-справочник 'Организация'. Добавлены связи с таблицами фактов.", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Скрыты поля 'artic_id', 'partner_id', 'Период', 'Организация' в таблицах фактов: 'pbi Себестоимость', 'Закупки регистр', 'Стоимость МП'", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "20.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Сумма продаж, руб] = Сумма, руб - Расходы МП, руб", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Сумма продаж, usd] = Сумма, usd - Расходы МП, usd", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалены меры 'Стоимость МП': [Продажи - расходы МП, руб], [Продажи - расходы МП, usd], ", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "[ТН - расходы МП, руб], [ТН - расходы МП, usd], [% ТН - расходы МП, руб], [% ТН - расходы МП, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удален вычисляемый столбец 'pbi Себестоимость'[Закупка учетная]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удален вычисляемый столбец 'pbi Себестоимость'[Закупка учетная, usd2]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена таблица 'Партнеры.Контрагенты', не используется (согласовано с Коваленко И.)", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец 'pbi ostatki'[Учетная цена по себест]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец 'pbi ostatki'[Учетная цена по себест, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi ostatki'[Учетная стоимость, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Остаток Начало, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Остаток Конец, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Оборачиваемость, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Основной отчет'[Рентаб. активов, usd]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Меры Основного отчета приведены к формату Целое число, Разделение разрядов тысяч", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "19.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец 'Партнеры'[ДатаРегистрации]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен столбец 'Партнеры'[bitrix_id]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Заказано_в_производстве'[Сумма в производстве, usd2]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Заказано_в_пути'[Сумма в пути, usd2]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'План продаж менеджеров'[Осталось до плана]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена таблица 'Сегменты номенклатуры', не используется (согласовано с Дивеевой И.)", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена таблица 'Google Analytics', не используется (согласовано с Дивеевой И.)", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "17.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi Себестоимость'[Закупка учетная]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi Себестоимость'[Закупка учетная, usd2]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi Себестоимость'[Сумма продаж, usd]", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "В таблице 'pbi Себестоимость' значения в рублях округлены до 5 знаков после запятой, значения в usd округлены до 7 знаков после запятой ", + "textStyle": { + "fontSize": "16px", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена мера 'Основной отчет'[Учет.ЕАЭС, руб]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "15.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена новая таблица 'pbi Себестоимость' из view [mag_pbi].[pbi].[Себестоимость+СебестоимостьПродаж]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлен вычисляемый столбец 'pbi Себестоимость'[Цена продажи]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена таблица 'pbi Себестоимость' из [mag_pbi].[pbi].[Себестоимость]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена мера 'Группы'[План продаж 2020, руб]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена мера 'Менеджеры 1С'[Кол. заказов с обратной связью]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Удалена мера 'Менеджеры 1С'[Рейтинг]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + }, + { + "textRuns": [ + { + "value": "14.12.2023", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Закупки регистр'[Доставка]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлена мера 'Закупки регистр'[НДС]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "Добавлено поле 'Номенклатура'[Номер цвета]", + "textStyle": { + "fontSize": "12pt", + "color": "#000000" + } + } + ] + }, + { + "textRuns": [ + { + "value": "" + } + ] + } + ] + } + } + ] + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/filters.json b/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/filters.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/filters.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/visualContainer.json b/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/visualContainer.json new file mode 100644 index 0000000..9d58022 --- /dev/null +++ b/analytics/pbi/model/report/Report/sections/999_Обновление/visualContainers/00000_textbox (2067c)/visualContainer.json @@ -0,0 +1,8 @@ +{ + "height": 700.37, + "id": 5853011912, + "width": 1270.17, + "x": 10.17, + "y": 20.35, + "z": 0 +} \ No newline at end of file diff --git a/analytics/pbi/model/report/ReportMetadata.json b/analytics/pbi/model/report/ReportMetadata.json new file mode 100644 index 0000000..abcdf8a --- /dev/null +++ b/analytics/pbi/model/report/ReportMetadata.json @@ -0,0 +1,6 @@ +{ + "Version": 5, + "AutoCreatedRelationships": [], + "CreatedFrom": "Cloud", + "CreatedFromRelease": "2026.01" +} \ No newline at end of file diff --git a/analytics/pbi/model/report/ReportSettings.json b/analytics/pbi/model/report/ReportSettings.json new file mode 100644 index 0000000..3b2c5e7 --- /dev/null +++ b/analytics/pbi/model/report/ReportSettings.json @@ -0,0 +1,11 @@ +{ + "Version": 1, + "ReportSettings": { + "UserConsentsToCompositeModels": true + }, + "QueriesSettings": { + "TypeDetectionEnabled": true, + "RelationshipImportEnabled": true, + "Version": "2.73.5586.802" + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/StaticResources/SharedResources/BaseThemes/CY20SU09.json b/analytics/pbi/model/report/StaticResources/SharedResources/BaseThemes/CY20SU09.json new file mode 100644 index 0000000..d1ff078 --- /dev/null +++ b/analytics/pbi/model/report/StaticResources/SharedResources/BaseThemes/CY20SU09.json @@ -0,0 +1,391 @@ +{ + "name": "CY20SU09", + "dataColors": [ + "#118DFF", + "#12239E", + "#E66C37", + "#6B007B", + "#E044A7", + "#744EC2", + "#D9B300", + "#D64550", + "#197278", + "#1AAB40", + "#15C6F4", + "#4092FF", + "#FFA058", + "#BE5DC9", + "#F472D0", + "#B5A1FF", + "#C4A200", + "#FF8080", + "#00DBBC", + "#5BD667", + "#0091D5", + "#4668C5", + "#FF6300", + "#99008A", + "#EC008C", + "#533285", + "#99700A", + "#FF4141", + "#1F9A85", + "#25891C", + "#0057A2", + "#002050", + "#C94F0F", + "#450F54", + "#B60064", + "#34124F", + "#6A5A29", + "#1AAB40", + "#BA141A", + "#0C3D37", + "#0B511F" + ], + "foreground": "#252423", + "foregroundNeutralSecondary": "#605E5C", + "foregroundNeutralTertiary": "#B3B0AD", + "background": "#FFFFFF", + "backgroundLight": "#F3F2F1", + "backgroundNeutral": "#C8C6C4", + "tableAccent": "#118DFF", + "good": "#1AAB40", + "neutral": "#D9B300", + "bad": "#D64554", + "maximum": "#118DFF", + "center": "#D9B300", + "minimum": "#DEEFFF", + "null": "#FF7F48", + "hyperlink": "#0078d4", + "visitedHyperlink": "#0078d4", + "textClasses": { + "callout": { + "fontSize": 45, + "fontFace": "DIN", + "color": "#252423" + }, + "title": { + "fontSize": 12, + "fontFace": "DIN", + "color": "#252423" + }, + "header": { + "fontSize": 12, + "fontFace": "Segoe UI Semibold", + "color": "#252423" + }, + "label": { + "fontSize": 10, + "fontFace": "Segoe UI", + "color": "#252423" + } + }, + "visualStyles": { + "*": { + "*": { + "*": [{ + "wordWrap": true + }], + "line":[{ + "transparency": 0 + }], + "outline":[{ + "transparency": 0 + }], + "plotArea":[{ + "transparency": 0 + }], + "categoryAxis":[{ + "showAxisTitle": true, + "gridlineStyle": "dotted" + }], + "valueAxis":[{ + "showAxisTitle": true, + "gridlineStyle": "dotted" + }], + "title": [{ + "titleWrap": true + }], + "lineStyles":[{ + "strokeWidth":3 + }], + "wordWrap": [{ + "show": true + }], + "background": [{ + "show": true, + "transparency": 0 + }], + "outspacePane": [{ + "backgroundColor": {"solid": {"color": "#ffffff"}}, + "foregroundColor": {"solid": {"color": "#252423"}}, + "transparency": 0, + "border": true, + "borderColor": {"solid": {"color": "#B3B0AD"}} + }], + "filterCard": [ + { + "$id": "Applied", + "transparency": 0, + "foregroundColor": {"solid": {"color": "#252423"}}, + "border": true + }, + { + "$id": "Available", + "transparency": 0, + "foregroundColor": {"solid": {"color": "#252423"}}, + "border": true + }] + } + }, + "scatterChart":{ + "*":{ + "bubbles":[{ + "bubbleSize":-10 + }], + "general": [{ + "responsive": true + }], + "fillPoint": [{ + "show": true + }], + "legend": [{ + "showGradientLegend": true + }] + } + }, + "lineChart": { + "*": { + "general": [{ + "responsive": true + }] + } + }, + "map":{ + "*":{ + "bubbles":[{ + "bubbleSize":-10 + }] + } + }, + "pieChart":{ + "*":{ + "legend":[{ + "show":true, + "position":"RightCenter" + }], + "labels":[{ + "labelStyle": "Data value, percent of total" + }] + } + }, + "donutChart":{ + "*":{ + "legend":[{ + "show":true, + "position":"RightCenter" + }], + "labels":[{ + "labelStyle": "Data value, percent of total" + }] + } + }, + "pivotTable": { + "*": { + "*": [{ + "showExpandCollapseButtons": true + }] + } + }, + "multiRowCard": { + "*": { + "card": [{ + "outlineWeight": 2, + "barShow": true, + "barWeight": 2 + }] + } + }, + "kpi": { + "*": { + "trendline": [{ + "transparency": 20 + }] + } + }, + "slicer": { + "*": { + "general": [{ + "responsive": true + }] + } + }, + "waterfallChart": { + "*": { + "general": [{ + "responsive": true + }] + } + }, + "columnChart": { + "*": { + "general": [{ + "responsive": true + }], + "legend": [{ + "showGradientLegend": true + }] + } + }, + "clusteredColumnChart": { + "*": { + "general": [{ + "responsive": true + }], + "legend": [{ + "showGradientLegend": true + }] + } + }, + "hundredPercentStackedColumnChart": { + "*": { + "general": [{ + "responsive": true + }], + "legend": [{ + "showGradientLegend": true + }] + } + }, + "barChart": { + "*": { + "general": [{ + "responsive": true + }], + "legend": [{ + "showGradientLegend": true + }] + } + }, + "clusteredBarChart": { + "*": { + "general": [{ + "responsive": true + }], + "legend": [{ + "showGradientLegend": true + }] + } + }, + "hundredPercentStackedBarChart": { + "*": { + "general": [{ + "responsive": true + }], + "legend": [{ + "showGradientLegend": true + }] + } + }, + "areaChart": { + "*": { + "general": [{ + "responsive": true + }] + } + }, + "stackedAreaChart": { + "*": { + "general": [{ + "responsive": true + }] + } + }, + "lineClusteredColumnComboChart": { + "*": { + "general": [{ + "responsive": true + }] + } + }, + "lineStackedColumnComboChart": { + "*": { + "general": [{ + "responsive": true + }] + } + }, + "ribbonChart": { + "*": { + "general": [{ + "responsive": true + }] + } + }, + "group": { + "*": { + "background": [{ + "show": false + }] + } + }, + "basicShape": { + "*": { + "background": [{ + "show": false + }], + "general": [{ + "keepLayerOrder": true + }], + "visualHeader": [{ + "show": false + }] + } + }, + "image": { + "*": { + "background": [{ + "show": false + }], + "general": [{ + "keepLayerOrder": true + }], + "visualHeader": [{ + "show": false + }] + } + }, + "actionButton": { + "*": { + "visualHeader": [{ + "show": false + }] + } + }, + "textbox": { + "*": { + "general": [{ + "keepLayerOrder": true + }], + "visualHeader": [{ + "show": false + }] + } + }, + "page": { + "*": { + "outspace": [ + { + "color": { "solid": { "color": "#FFFFFF" } } + } + ], + "background": [ + { + "transparency": 100 + } + ] + } + } + } +} \ No newline at end of file diff --git a/analytics/pbi/model/report/Version.txt b/analytics/pbi/model/report/Version.txt new file mode 100644 index 0000000..9244395 --- /dev/null +++ b/analytics/pbi/model/report/Version.txt @@ -0,0 +1 @@ +1.31 \ No newline at end of file diff --git a/analytics/python skript/Calculationofthecostofproductionreferences.bat b/analytics/python skript/Calculationofthecostofproductionreferences.bat new file mode 100644 index 0000000..47687bd --- /dev/null +++ b/analytics/python skript/Calculationofthecostofproductionreferences.bat @@ -0,0 +1,2 @@ +"C:\Users\administrator\AppData\Local\Programs\Python\Python312\python.exe" "F:\python skript\Calculationofthecostofproductionreferences.py" +exit \ No newline at end of file diff --git a/analytics/python skript/Calculationofthecostofproductionreferences.py b/analytics/python skript/Calculationofthecostofproductionreferences.py new file mode 100644 index 0000000..a6bce3a --- /dev/null +++ b/analytics/python skript/Calculationofthecostofproductionreferences.py @@ -0,0 +1,950 @@ +import decimal +import time +import numpy as np +import pyodbc + + +def sql_connect(): + server = '192.168.35.207' + database = 'mag_pbi' + username = 'goglev' + password = 'BOMoGbUZ1p' + connection_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}' + + conn = pyodbc.connect(connection_string) + print("successfully connected...") + print("#" * 20) + return conn + + +def get_totals(conn, counter, group): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22 + COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23 + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], + COALESCE([Доп расходы], 0) AS [Доп расходы], + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] + + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + + + +def get_totalsManufacture(conn, manufactureLevel, start_range, end_range): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22 + COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23 + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], + COALESCE([Доп расходы], 0) AS [Доп расходы], + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + +def find_sumof_total(sebes_sales, date, current_sales_id, current_params, last_string_values): + quantity = current_params['quantity'] + sumZakupka = current_params['sumZakupka'] + sumZakupkaUSD2 = current_params['sumZakupkaUSD2'] + sum_dostavka = current_params['sum_dostavka'] + sum_dostavkaUSD2 = current_params['sum_dostavkaUSD2'] + sum_NAT = current_params['sum_NAT'] + sum_NATUSD2 = current_params['sum_NATUSD2'] + sum_production = current_params['sum_production'] + sum_productionUSD2 = current_params['sum_productionUSD2'] + sum_zatratiMP = current_params['sum_zatratiMP'] + sum_custom = current_params['sum_custom'] + sum_customUSD2 = current_params['sum_customUSD2'] + sum_skladHranenie = current_params['sum_skladHranenie'] + sum_Priemka = current_params['sum_Priemka'] + sum_AtsMarkirovka = current_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = current_params['sum_SborkaZakaza'] + sum_DopRashod = current_params['sum_DopRashod'] + sum_DopRashodUSD2 = current_params['sum_DopRashodUSD2'] + i = current_params['counter'] + len_sebes_sales = len(sebes_sales) + while i < len_sebes_sales: + try: + curr_str = sebes_sales[i] + except: + print('Ошибка в иттераторе, тек ид =', current_sales_id) + print(i) + print(len_sebes_sales) + break + + if curr_str[10] > date or current_sales_id != curr_str[0]: + break + else: + i += 1 + + if curr_str[12] == 'Приход': + + # кажется что можно и нужно удалить ... + if curr_str[13] == 'Закупка' or curr_str[13] == 'Ввод остатков до 22' or curr_str[13] == 'Производство товара' or curr_str[13] == 'Пересчет товара': + quantity += curr_str[2] + + + if curr_str[9] > 0: + usd2_course = curr_str[9] + else: + if curr_str[13] == 'Ввод остатков до 22': + # для ввода остатков возьём курс на 1 января 2023 года + usd2_course = 75.7785 + else: + usd2_course = 1 + + sumZakupka += curr_str[4] + if curr_str[13] == 'Ввод остатков до 22': + sumZakupkaUSD2 += decimal.Decimal(float(sumZakupka) / usd2_course) + else: + sumZakupkaUSD2 += curr_str[18] + + + #if curr_str[11] == 'руб.': + # sumZakupkaUSD += sumZakupka / usd2_course + + sum_dostavka += curr_str[5] + sum_dostavkaUSD2 += curr_str[19] + sum_NAT += curr_str[6] + sum_NATUSD2 += curr_str[20] + sum_production += curr_str[7] + sum_productionUSD2 += curr_str[22] + sum_zatratiMP += curr_str[3] + sum_custom += curr_str[8] + sum_customUSD2 += curr_str[21] + sum_skladHranenie += curr_str[14] + sum_Priemka += curr_str[15] + sum_AtsMarkirovka += curr_str[16] + sum_SborkaZakaza += curr_str[17] + sum_DopRashod += curr_str[23] + sum_DopRashodUSD2 += curr_str[24] + + if curr_str[12] == 'Расход': + quantity -= last_string_values['quantity'] + sumZakupka -= last_string_values['sumZakupka'] + sumZakupkaUSD2 -= last_string_values['sumZakupkaUSD2'] + sum_dostavka -= last_string_values['sum_dostavka'] + sum_dostavkaUSD2 -= last_string_values['sum_dostavkaUSD2'] + sum_NAT -= last_string_values['sum_NAT'] + sum_NATUSD2 -= last_string_values['sum_NATUSD2'] + sum_production -= last_string_values['sum_production'] + sum_productionUSD2 -= last_string_values['sum_productionUSD2'] + sum_zatratiMP -= last_string_values['sum_zatratiMP'] + sum_custom -= last_string_values['sum_custom'] + sum_customUSD2 -= last_string_values['sum_customUSD2'] + sum_skladHranenie -= last_string_values['sum_skladHranenie'] + sum_Priemka -= last_string_values['sum_Priemka'] + sum_AtsMarkirovka -= last_string_values['sum_AtsMarkirovka'] + sum_SborkaZakaza -= last_string_values['sum_SborkaZakaza'] + sum_DopRashod -= last_string_values['sum_DopRashod'] + sum_DopRashodUSD2 -= last_string_values['sum_DopRashodUSD2'] + + if quantity <= 0: + quantity = 0 + sumZakupka = 0 + sumZakupkaUSD2 = 0 + sum_dostavka = 0 + sum_NAT = 0 + sum_production = 0 + sum_zatratiMP = 0 + sum_custom = 0 + sum_skladHranenie = 0 + sum_Priemka = 0 + sum_AtsMarkirovka = 0 + sum_SborkaZakaza = 0 + sum_dostavkaUSD2 = 0 + sum_NATUSD2 = 0 + sum_productionUSD2 = 0 + sum_customUSD2 = 0 + sum_DopRashod = 0 + sum_DopRashodUSD2 = 0 + + + return {'quantity': quantity, 'sumZakupka': sumZakupka, 'sumZakupkaUSD2': sumZakupkaUSD2, + 'sum_dostavka': sum_dostavka, + 'sum_NAT': sum_NAT, 'sum_production': sum_production, 'sum_zatratiMP': sum_zatratiMP, 'sum_custom': sum_custom, + 'sum_skladHranenie': sum_skladHranenie, 'sum_Priemka': sum_Priemka, 'sum_AtsMarkirovka': sum_AtsMarkirovka, 'sum_SborkaZakaza': sum_SborkaZakaza, + 'sum_dostavkaUSD2': sum_dostavkaUSD2, 'sum_NATUSD2': sum_NATUSD2, 'sum_productionUSD2': sum_productionUSD2, 'sum_customUSD2': sum_customUSD2, + 'sum_DopRashod': sum_DopRashod, 'sum_DopRashodUSD2': sum_DopRashodUSD2, + 'counter': i} + + +def insert_to_DB_Production(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьПроизводствоОт2022]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[СебестоимостьПроизводствоОт2022] + ([Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (?, ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + +def update_to_DB_Sales(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + if year == '2022': + table = '[СебестоимостьОт2022]' + elif year == '2023': + table = '[Себестоимость2023]' + elif year == '2024': + table = '[Себестоимость2024]' + + cursor.executemany( + """UPDATE [mag_pbi].[pbiProd].""" + table + """ + SET + [Закупка] = ? -- 0 + , [Закупка, usd2] = ? -- 1 + , [Доставка] = ? -- 2 + , [Производство] = ? -- 3 + , [НДС] = ? -- 4 + , [ЗатратыМП] = ? -- 5 + , [Таможня] = ? -- 6 + , [ЗатратыСкладХранение] = ? -- 7 + , [Учетная стоимость] = ? -- 8 + , [Учетная стоимость USD2+2] = ? -- 9 + , [Учетная цена] = ? -- 10 + , [Учетная цена USD2+2] = ? -- 11 + , [artic_id] = ? -- 12 + , [Приемка] = ? -- 13 + , [АтсМаркировка] = ? -- 14 + , [СборкаЗаказа] = ? -- 15 + , [Доставка USD2+2] = ? -- 16 + , [НДС USD2+2] = ? -- 17 + , [Таможня USD2+2] = ? -- 18 + , [Производство USD2+2] = ? -- 19 + , [Доп расходы] = ? -- 20 + , [Доп расходы USD2+2] = ? -- 21 + WHERE id = ?""", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def update_to_DB_sebest(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + # if year == '2022': + # table = '[СебестоимостьОт2022]' + # elif year == '2023': + # table = '[Себестоимость2023]' + # elif year == '2024': + # table = '[Себестоимость2024]' + cursor.executemany( + "UPDATE [mag_pbi].[pbiProd]." + table + " SET [Учетная стоимость] = ?, [Учетная стоимость USD2+2] = ?, [Учетная цена] = ?, [Учетная цена USD2+2] = ? WHERE id = ?", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def exec_procedure(conn, procedure_name): + sql_query = 'EXEC ' + procedure_name + cursor = conn.cursor() + cursor.execute(sql_query).commit() + + +def getMaxCounter(conn, group): + sql_query = "SELECT MAX(" + group + ") FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature]" + + cursor = conn.cursor() + cursor.execute(sql_query) + maxCounter = cursor.fetchall() + return maxCounter[0][0] + + + +def count_sebest(connect, counter = '2k', group = '1', manufactureLevel = 0, manufacture = False, start_range = 0, end_range = 0): + upload = True + ind = 0 + arr_sebes = [] + arr_sales = [] + arr_production = [] + arr_price = [] + last_utid = '' + last_operation = '' + last_state = '' + + if manufacture: + pbi_all = get_totalsManufacture(connect, manufactureLevel, start_range, end_range) + else: + pbi_all = get_totals(connect, counter, group) + + + nparr_all = np.asarray(pbi_all) + + for str in pbi_all: + ind += 1 + date = str[10] + utid = str[1] + id = str[0] + tableGod = str[14] + zakupkaRUB = round(0, 9) + zakupkaUSD2 = round(0, 9) + NAT = round(0, 9) + NATUSD2 = round(0, 9) + zatratiMP = round(0, 9) + production = round(0, 9) + dostavka = round(0, 9) + dostavkaUSD2 = round(0, 9) + custom = round(0, 9) + customUSD2 = round(0, 9) + skladHranenie = round(0, 9) + priemka = round(0, 9) + atsMarkirovka = round(0, 9) + sborkaZakaza = round(0, 9) + uchet_price = round(0, 9) + uchet_price_usd22 = round(0, 9) + dop_rashod = round(0, 9) + dop_rashod_usd22 = round(0, 9) + + + if utid != last_utid: + ## если последняя операция не Реализация Расход, то сделаем фейковую продажу чтобы посчитать цену на сегодня ... + if last_operation != 'Расход' and last_state != 'Реализация' and last_operation != '' and False: + arr_price.append(count_price(all_params, last_utid, connect)) + + + fltr = np.asarray([utid]) + pbi_all_current_utid = nparr_all[np.in1d(nparr_all[:, 1], fltr)] + last_utid = utid + current_params = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_zakupkaUSD2': 0, 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0, + 'counter': 0} + last_string_values = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0, + 'sum_zakupkaUSD2': 0} + + all_params = find_sumof_total(pbi_all_current_utid, date, str[0], current_params, last_string_values) + current_params = all_params.copy() + + + last_operation = str[12] + last_state = str[13] + sale_quantity = str[2] + + if str[9] > 0: + usd2_course = str[9] + else: + usd2_course = 1 + + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_zatratiMP = all_params['sum_zatratiMP'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + sum_skladHranenie = all_params['sum_skladHranenie'] + sum_Priemka = all_params['sum_Priemka'] + sum_AtsMarkirovka = all_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = all_params['sum_SborkaZakaza'] + sum_DopRashod = all_params['sum_DopRashod'] + sum_DopRashodUSD2 = all_params['sum_DopRashodUSD2'] + + + if (str[12] == 'Приход') and str[13] != 'Ввод остатков до 22': + + uchet_price = 0 + uchet_price_usd22 = 0 + uchet_stoimost = 0 + uchet_stoimost_usd22 = 0 + + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + + + if sum_quantity != 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + dop_rashod = round(sum_DopRashod, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2, 9) + + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sum_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sum_quantity, 9) + + if sale_quantity != 0: + uchet_stoimost = round(uchet_price * sale_quantity, 9) + uchet_stoimost_usd22 = round(uchet_price_usd22 * sale_quantity, 9) + + + arr_sebes.append((uchet_stoimost, uchet_stoimost_usd22, uchet_price, uchet_price_usd22, id)) + + + elif str[12] == 'Расход': + + if sale_quantity != 0: + + if sum_zakupka < 0: + sum_zakupka = 0 + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + #zakupkaUSD2 = round(sum_zakupkaUSD2 / usd2_course, 15) + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + dop_rashod = round(sum_DopRashod, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + zatratiMP = round(sum_zatratiMP / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + skladHranenie = round(sum_skladHranenie / sum_quantity * sale_quantity, 9) + priemka = round(sum_Priemka / sum_quantity * sale_quantity, 9) + atsMarkirovka = round(sum_AtsMarkirovka / sum_quantity * sale_quantity, 9) + sborkaZakaza = round(sum_SborkaZakaza / sum_quantity * sale_quantity, 9) + dop_rashod = round(sum_DopRashod / sum_quantity * sale_quantity, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2 / sum_quantity * sale_quantity, 9) + + + last_string_values = {'quantity': sale_quantity, 'sumZakupka': zakupkaRUB, 'sumZakupkaUSD2': zakupkaUSD2, + 'sum_dostavka': dostavka, + 'sum_NAT': NAT, 'sum_production': production, 'sum_zatratiMP': zatratiMP, + 'sum_custom': custom, 'sum_skladHranenie': skladHranenie, 'sum_Priemka': priemka, + 'sum_AtsMarkirovka': atsMarkirovka, 'sum_SborkaZakaza': sborkaZakaza, + 'sum_dostavkaUSD2': dostavkaUSD2, 'sum_NATUSD2': NATUSD2, 'sum_productionUSD2': productionUSD2, 'sum_customUSD2': customUSD2, + 'sum_DopRashod': dop_rashod, 'sum_DopRashodUSD2': dop_rashod_usd22} + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_stoimost = round((dostavka + NAT + zakupkaRUB + custom + production), 9) + uchet_stoimost_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2), 9) + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + arr_sales.append( + (float(-zakupkaRUB), float(-zakupkaUSD2), float(-dostavka), float(-production), float(-NAT), float(-zatratiMP), float(-custom), + float(-skladHranenie), float(uchet_stoimost), + float(uchet_stoimost_usd22), float(uchet_price), float(uchet_price_usd22), utid, float(-priemka), float(-atsMarkirovka), float(-sborkaZakaza), + float(-dostavkaUSD2), float(-NATUSD2), float(-productionUSD2), float(-customUSD2), float(-dop_rashod), float(-dop_rashod_usd22), + id)) + + if str[13] == 'Производство товара': + arr_production.append((str[10], str[1], float(uchet_price), float(uchet_price_usd22))) + + + # break + + if ind % 10000 == 0: + print(time.ctime(), ' ', ind, 'проходов') + + if len(arr_price) > 0 and False: + insert_to_DB_UchetPrice(arr_price, connect) + + if len(arr_production) > 0 and manufacture: + insert_to_DB_Production(arr_production, connect) + + + if upload and manufacture == False: + if len(arr_sales) > 0: + print(time.ctime(), ' записей sales: ', len(arr_sales)) + update_to_DB_Sales(arr_sales, connect, '2022') + + if len(arr_sebes) > 0: + print(time.ctime(), ' записей sebest: ', len(arr_sebes)) + update_to_DB_sebest(arr_sebes, connect, '2022') + + + upload = False + + +def fill_table_sebestoim2022(connect, skip = False): + + if skip: + return + + + #флаг для обработки без заполнения таблиц ... + prepare_table = True + fill_AtsMarkirovka = True + fill_DopRashod = True + fill_Dostavka = True + fill_Zakupka = True + fill_ZatratiMp = False + fill_Pereschet = True + fill_PereschetSklad = True + fill_Priemka = True + fill_Prodaji = True + fill_Proizvodstvo = True + fill_Sborka = True + + if prepare_table: + print('Подготовка таблицы СебестоимостьОт2022 ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]') + + # заполним таблицы данными закупки ... + if fill_AtsMarkirovka: + print('Заполнение таблицы данными: АтсМаркировка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]') + + if fill_DopRashod: + print('Заполнение таблицы данными: Доп расходы ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)]') + + if fill_Dostavka: + print('Заполнение таблицы данными: Доставка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]') + + if fill_Zakupka: + print('Заполнение таблицы данными: Закупка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]') + + if fill_ZatratiMp: + print('Заполнение таблицы данными: ЗатратыМП ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]') + + if fill_Pereschet: + print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)]') + + if fill_PereschetSklad: + print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)]') + + if fill_Priemka: + print('Заполнение таблицы данными: Приемка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]') + + if fill_Prodaji: + print('Заполнение таблицы данными: Продажи ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]') + + if fill_Proizvodstvo: + print('Заполнение таблицы данными: Производство ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]') + + if fill_Sborka: + print('Заполнение таблицы данными: Сборка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]') + +def count_price(all_params, last_utid, conn): + arr_price = [] + uchet_price = 0 + uchet_price_usd22 = 0 + sale_quantity = 1 + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + + + if sale_quantity != 0: + + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + + + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + + return (last_utid, float(uchet_price), float(uchet_price_usd22)) + #arr_price.append((last_utid, float(uchet_price), float(uchet_price_usd22))) + #if len(arr_price) > 0: + # insert_to_DB_UchetPrice(arr_price, conn) + + + + + + + + +def insert_to_DB_UchetPrice(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[pbiProd].[УчетнаяЦенаПоСебестоимости]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[УчетнаяЦенаПоСебестоимости] + ( [Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (CONVERT(date, GETDATE()), ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + + + +union_sebes = True +print('start time', time.ctime()) +connect = sql_connect() +ComputeManufacture = False +maxLvl = 1 + +if ComputeManufacture: + maxLvl = 4 + exec_procedure(connect, '[pbiProd].[Подготовка Производство: единая процедура для подготовки]') + + + +for stRange in range(0, maxLvl): + # Заполнение таблицы + skip = False + fill_table_sebestoim2022(connect, skip) + + if True: + group = '[2k]' + max_counter = getMaxCounter(connect, group) + print('Группа: ', group, ' Всего групп - ', max_counter) + for counter in range(max_counter): + counter += 1 + count_sebest(connect, counter, group) + print(time.ctime(), ' группа ', counter, ' обработана') + + + # Расчитаем товары которые учавствуют в производстве + if ComputeManufacture: + start_range = 0 + for i in range(stRange, stRange + 1): + for i_range in range(2000, 20000, 2000): + end_range = i_range + count_sebest(connect, "", "", i, True, start_range, end_range) + start_range = i_range + + # Нужно добавить 1с_id в таблицу .... + exec_procedure(connect, '[pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]') + + +# заполним сводную таблицу (финальную) для загрузки в пби ... +if union_sebes: + print('Объединение в сводную таблицу ~ 10 мин ...') + exec_procedure(connect, '[pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]') + + +connect.close() +print('end time ', time.ctime()) diff --git a/analytics/python skript/Calculationofthecostofreproduction.bat b/analytics/python skript/Calculationofthecostofreproduction.bat new file mode 100644 index 0000000..fb46a3e --- /dev/null +++ b/analytics/python skript/Calculationofthecostofreproduction.bat @@ -0,0 +1,2 @@ +"C:\Users\administrator\AppData\Local\Programs\Python\Python312\python.exe" "F:\python skript\Calculationofthecostofreproduction.py" +exit \ No newline at end of file diff --git a/analytics/python skript/Calculationofthecostofreproduction.py b/analytics/python skript/Calculationofthecostofreproduction.py new file mode 100644 index 0000000..a6627b2 --- /dev/null +++ b/analytics/python skript/Calculationofthecostofreproduction.py @@ -0,0 +1,950 @@ +import decimal +import time +import numpy as np +import pyodbc + + +def sql_connect(): + server = '192.168.35.207' + database = 'mag_pbi' + username = 'goglev' + password = 'BOMoGbUZ1p' + connection_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}' + + conn = pyodbc.connect(connection_string) + print("successfully connected...") + print("#" * 20) + return conn + + +def get_totals(conn, counter, group): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22 + COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23 + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], + COALESCE([Доп расходы], 0) AS [Доп расходы], + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] + + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + + + +def get_totalsManufacture(conn, manufactureLevel, start_range, end_range): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22 + COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23 + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], + COALESCE([Доп расходы], 0) AS [Доп расходы], + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + +def find_sumof_total(sebes_sales, date, current_sales_id, current_params, last_string_values): + quantity = current_params['quantity'] + sumZakupka = current_params['sumZakupka'] + sumZakupkaUSD2 = current_params['sumZakupkaUSD2'] + sum_dostavka = current_params['sum_dostavka'] + sum_dostavkaUSD2 = current_params['sum_dostavkaUSD2'] + sum_NAT = current_params['sum_NAT'] + sum_NATUSD2 = current_params['sum_NATUSD2'] + sum_production = current_params['sum_production'] + sum_productionUSD2 = current_params['sum_productionUSD2'] + sum_zatratiMP = current_params['sum_zatratiMP'] + sum_custom = current_params['sum_custom'] + sum_customUSD2 = current_params['sum_customUSD2'] + sum_skladHranenie = current_params['sum_skladHranenie'] + sum_Priemka = current_params['sum_Priemka'] + sum_AtsMarkirovka = current_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = current_params['sum_SborkaZakaza'] + sum_DopRashod = current_params['sum_DopRashod'] + sum_DopRashodUSD2 = current_params['sum_DopRashodUSD2'] + i = current_params['counter'] + len_sebes_sales = len(sebes_sales) + while i < len_sebes_sales: + try: + curr_str = sebes_sales[i] + except: + print('Ошибка в иттераторе, тек ид =', current_sales_id) + print(i) + print(len_sebes_sales) + break + + if curr_str[10] > date or current_sales_id != curr_str[0]: + break + else: + i += 1 + + if curr_str[12] == 'Приход': + + # кажется что можно и нужно удалить ... + if curr_str[13] == 'Закупка' or curr_str[13] == 'Ввод остатков до 22' or curr_str[13] == 'Производство товара' or curr_str[13] == 'Пересчет товара': + quantity += curr_str[2] + + + if curr_str[9] > 0: + usd2_course = curr_str[9] + else: + if curr_str[13] == 'Ввод остатков до 22': + # для ввода остатков возьём курс на 1 января 2023 года + usd2_course = 75.7785 + else: + usd2_course = 1 + + sumZakupka += curr_str[4] + if curr_str[13] == 'Ввод остатков до 22': + sumZakupkaUSD2 += decimal.Decimal(float(sumZakupka) / usd2_course) + else: + sumZakupkaUSD2 += curr_str[18] + + + #if curr_str[11] == 'руб.': + # sumZakupkaUSD += sumZakupka / usd2_course + + sum_dostavka += curr_str[5] + sum_dostavkaUSD2 += curr_str[19] + sum_NAT += curr_str[6] + sum_NATUSD2 += curr_str[20] + sum_production += curr_str[7] + sum_productionUSD2 += curr_str[22] + sum_zatratiMP += curr_str[3] + sum_custom += curr_str[8] + sum_customUSD2 += curr_str[21] + sum_skladHranenie += curr_str[14] + sum_Priemka += curr_str[15] + sum_AtsMarkirovka += curr_str[16] + sum_SborkaZakaza += curr_str[17] + sum_DopRashod += curr_str[23] + sum_DopRashodUSD2 += curr_str[24] + + if curr_str[12] == 'Расход': + quantity -= last_string_values['quantity'] + sumZakupka -= last_string_values['sumZakupka'] + sumZakupkaUSD2 -= last_string_values['sumZakupkaUSD2'] + sum_dostavka -= last_string_values['sum_dostavka'] + sum_dostavkaUSD2 -= last_string_values['sum_dostavkaUSD2'] + sum_NAT -= last_string_values['sum_NAT'] + sum_NATUSD2 -= last_string_values['sum_NATUSD2'] + sum_production -= last_string_values['sum_production'] + sum_productionUSD2 -= last_string_values['sum_productionUSD2'] + sum_zatratiMP -= last_string_values['sum_zatratiMP'] + sum_custom -= last_string_values['sum_custom'] + sum_customUSD2 -= last_string_values['sum_customUSD2'] + sum_skladHranenie -= last_string_values['sum_skladHranenie'] + sum_Priemka -= last_string_values['sum_Priemka'] + sum_AtsMarkirovka -= last_string_values['sum_AtsMarkirovka'] + sum_SborkaZakaza -= last_string_values['sum_SborkaZakaza'] + sum_DopRashod -= last_string_values['sum_DopRashod'] + sum_DopRashodUSD2 -= last_string_values['sum_DopRashodUSD2'] + + if quantity <= 0: + quantity = 0 + sumZakupka = 0 + sumZakupkaUSD2 = 0 + sum_dostavka = 0 + sum_NAT = 0 + sum_production = 0 + sum_zatratiMP = 0 + sum_custom = 0 + sum_skladHranenie = 0 + sum_Priemka = 0 + sum_AtsMarkirovka = 0 + sum_SborkaZakaza = 0 + sum_dostavkaUSD2 = 0 + sum_NATUSD2 = 0 + sum_productionUSD2 = 0 + sum_customUSD2 = 0 + sum_DopRashod = 0 + sum_DopRashodUSD2 = 0 + + + return {'quantity': quantity, 'sumZakupka': sumZakupka, 'sumZakupkaUSD2': sumZakupkaUSD2, + 'sum_dostavka': sum_dostavka, + 'sum_NAT': sum_NAT, 'sum_production': sum_production, 'sum_zatratiMP': sum_zatratiMP, 'sum_custom': sum_custom, + 'sum_skladHranenie': sum_skladHranenie, 'sum_Priemka': sum_Priemka, 'sum_AtsMarkirovka': sum_AtsMarkirovka, 'sum_SborkaZakaza': sum_SborkaZakaza, + 'sum_dostavkaUSD2': sum_dostavkaUSD2, 'sum_NATUSD2': sum_NATUSD2, 'sum_productionUSD2': sum_productionUSD2, 'sum_customUSD2': sum_customUSD2, + 'sum_DopRashod': sum_DopRashod, 'sum_DopRashodUSD2': sum_DopRashodUSD2, + 'counter': i} + + +def insert_to_DB_Production(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьПроизводствоОт2022]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[СебестоимостьПроизводствоОт2022] + ([Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (?, ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + +def update_to_DB_Sales(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + if year == '2022': + table = '[СебестоимостьОт2022]' + elif year == '2023': + table = '[Себестоимость2023]' + elif year == '2024': + table = '[Себестоимость2024]' + + cursor.executemany( + """UPDATE [mag_pbi].[pbiProd].""" + table + """ + SET + [Закупка] = ? -- 0 + , [Закупка, usd2] = ? -- 1 + , [Доставка] = ? -- 2 + , [Производство] = ? -- 3 + , [НДС] = ? -- 4 + , [ЗатратыМП] = ? -- 5 + , [Таможня] = ? -- 6 + , [ЗатратыСкладХранение] = ? -- 7 + , [Учетная стоимость] = ? -- 8 + , [Учетная стоимость USD2+2] = ? -- 9 + , [Учетная цена] = ? -- 10 + , [Учетная цена USD2+2] = ? -- 11 + , [artic_id] = ? -- 12 + , [Приемка] = ? -- 13 + , [АтсМаркировка] = ? -- 14 + , [СборкаЗаказа] = ? -- 15 + , [Доставка USD2+2] = ? -- 16 + , [НДС USD2+2] = ? -- 17 + , [Таможня USD2+2] = ? -- 18 + , [Производство USD2+2] = ? -- 19 + , [Доп расходы] = ? -- 20 + , [Доп расходы USD2+2] = ? -- 21 + WHERE id = ?""", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def update_to_DB_sebest(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + # if year == '2022': + # table = '[СебестоимостьОт2022]' + # elif year == '2023': + # table = '[Себестоимость2023]' + # elif year == '2024': + # table = '[Себестоимость2024]' + cursor.executemany( + "UPDATE [mag_pbi].[pbiProd]." + table + " SET [Учетная стоимость] = ?, [Учетная стоимость USD2+2] = ?, [Учетная цена] = ?, [Учетная цена USD2+2] = ? WHERE id = ?", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def exec_procedure(conn, procedure_name): + sql_query = 'EXEC ' + procedure_name + cursor = conn.cursor() + cursor.execute(sql_query).commit() + + +def getMaxCounter(conn, group): + sql_query = "SELECT MAX(" + group + ") FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature]" + + cursor = conn.cursor() + cursor.execute(sql_query) + maxCounter = cursor.fetchall() + return maxCounter[0][0] + + + +def count_sebest(connect, counter = '2k', group = '1', manufactureLevel = 0, manufacture = False, start_range = 0, end_range = 0): + upload = True + ind = 0 + arr_sebes = [] + arr_sales = [] + arr_production = [] + arr_price = [] + last_utid = '' + last_operation = '' + last_state = '' + + if manufacture: + pbi_all = get_totalsManufacture(connect, manufactureLevel, start_range, end_range) + else: + pbi_all = get_totals(connect, counter, group) + + + nparr_all = np.asarray(pbi_all) + + for str in pbi_all: + ind += 1 + date = str[10] + utid = str[1] + id = str[0] + tableGod = str[14] + zakupkaRUB = round(0, 9) + zakupkaUSD2 = round(0, 9) + NAT = round(0, 9) + NATUSD2 = round(0, 9) + zatratiMP = round(0, 9) + production = round(0, 9) + dostavka = round(0, 9) + dostavkaUSD2 = round(0, 9) + custom = round(0, 9) + customUSD2 = round(0, 9) + skladHranenie = round(0, 9) + priemka = round(0, 9) + atsMarkirovka = round(0, 9) + sborkaZakaza = round(0, 9) + uchet_price = round(0, 9) + uchet_price_usd22 = round(0, 9) + dop_rashod = round(0, 9) + dop_rashod_usd22 = round(0, 9) + + + if utid != last_utid: + ## если последняя операция не Реализация Расход, то сделаем фейковую продажу чтобы посчитать цену на сегодня ... + if last_operation != 'Расход' and last_state != 'Реализация' and last_operation != '' and False: + arr_price.append(count_price(all_params, last_utid, connect)) + + + fltr = np.asarray([utid]) + pbi_all_current_utid = nparr_all[np.in1d(nparr_all[:, 1], fltr)] + last_utid = utid + current_params = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_zakupkaUSD2': 0, 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0, + 'counter': 0} + last_string_values = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0, + 'sum_zakupkaUSD2': 0} + + all_params = find_sumof_total(pbi_all_current_utid, date, str[0], current_params, last_string_values) + current_params = all_params.copy() + + + last_operation = str[12] + last_state = str[13] + sale_quantity = str[2] + + if str[9] > 0: + usd2_course = str[9] + else: + usd2_course = 1 + + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_zatratiMP = all_params['sum_zatratiMP'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + sum_skladHranenie = all_params['sum_skladHranenie'] + sum_Priemka = all_params['sum_Priemka'] + sum_AtsMarkirovka = all_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = all_params['sum_SborkaZakaza'] + sum_DopRashod = all_params['sum_DopRashod'] + sum_DopRashodUSD2 = all_params['sum_DopRashodUSD2'] + + + if (str[12] == 'Приход') and str[13] != 'Ввод остатков до 22': + + uchet_price = 0 + uchet_price_usd22 = 0 + uchet_stoimost = 0 + uchet_stoimost_usd22 = 0 + + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + + + if sum_quantity != 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + dop_rashod = round(sum_DopRashod, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2, 9) + + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sum_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sum_quantity, 9) + + if sale_quantity != 0: + uchet_stoimost = round(uchet_price * sale_quantity, 9) + uchet_stoimost_usd22 = round(uchet_price_usd22 * sale_quantity, 9) + + + arr_sebes.append((uchet_stoimost, uchet_stoimost_usd22, uchet_price, uchet_price_usd22, id)) + + + elif str[12] == 'Расход': + + if sale_quantity != 0: + + if sum_zakupka < 0: + sum_zakupka = 0 + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + #zakupkaUSD2 = round(sum_zakupkaUSD2 / usd2_course, 15) + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + dop_rashod = round(sum_DopRashod, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + zatratiMP = round(sum_zatratiMP / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + skladHranenie = round(sum_skladHranenie / sum_quantity * sale_quantity, 9) + priemka = round(sum_Priemka / sum_quantity * sale_quantity, 9) + atsMarkirovka = round(sum_AtsMarkirovka / sum_quantity * sale_quantity, 9) + sborkaZakaza = round(sum_SborkaZakaza / sum_quantity * sale_quantity, 9) + dop_rashod = round(sum_DopRashod / sum_quantity * sale_quantity, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2 / sum_quantity * sale_quantity, 9) + + + last_string_values = {'quantity': sale_quantity, 'sumZakupka': zakupkaRUB, 'sumZakupkaUSD2': zakupkaUSD2, + 'sum_dostavka': dostavka, + 'sum_NAT': NAT, 'sum_production': production, 'sum_zatratiMP': zatratiMP, + 'sum_custom': custom, 'sum_skladHranenie': skladHranenie, 'sum_Priemka': priemka, + 'sum_AtsMarkirovka': atsMarkirovka, 'sum_SborkaZakaza': sborkaZakaza, + 'sum_dostavkaUSD2': dostavkaUSD2, 'sum_NATUSD2': NATUSD2, 'sum_productionUSD2': productionUSD2, 'sum_customUSD2': customUSD2, + 'sum_DopRashod': dop_rashod, 'sum_DopRashodUSD2': dop_rashod_usd22} + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_stoimost = round((dostavka + NAT + zakupkaRUB + custom + production), 9) + uchet_stoimost_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2), 9) + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + arr_sales.append( + (float(-zakupkaRUB), float(-zakupkaUSD2), float(-dostavka), float(-production), float(-NAT), float(-zatratiMP), float(-custom), + float(-skladHranenie), float(uchet_stoimost), + float(uchet_stoimost_usd22), float(uchet_price), float(uchet_price_usd22), utid, float(-priemka), float(-atsMarkirovka), float(-sborkaZakaza), + float(-dostavkaUSD2), float(-NATUSD2), float(-productionUSD2), float(-customUSD2), float(-dop_rashod), float(-dop_rashod_usd22), + id)) + + if str[13] == 'Производство товара': + arr_production.append((str[10], str[1], float(uchet_price), float(uchet_price_usd22))) + + + # break + + if ind % 10000 == 0: + print(time.ctime(), ' ', ind, 'проходов') + + if len(arr_price) > 0 and False: + insert_to_DB_UchetPrice(arr_price, connect) + + if len(arr_production) > 0 and manufacture: + insert_to_DB_Production(arr_production, connect) + + + if upload and manufacture == False: + if len(arr_sales) > 0: + print(time.ctime(), ' записей sales: ', len(arr_sales)) + update_to_DB_Sales(arr_sales, connect, '2022') + + if len(arr_sebes) > 0: + print(time.ctime(), ' записей sebest: ', len(arr_sebes)) + update_to_DB_sebest(arr_sebes, connect, '2022') + + + upload = False + + +def fill_table_sebestoim2022(connect, skip = False): + + if skip: + return + + + #флаг для обработки без заполнения таблиц ... + prepare_table = True + fill_AtsMarkirovka = True + fill_DopRashod = True + fill_Dostavka = True + fill_Zakupka = True + fill_ZatratiMp = False + fill_Pereschet = True + fill_PereschetSklad = True + fill_Priemka = True + fill_Prodaji = True + fill_Proizvodstvo = True + fill_Sborka = True + + if prepare_table: + print('Подготовка таблицы СебестоимостьОт2022 ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]') + + # заполним таблицы данными закупки ... + if fill_AtsMarkirovka: + print('Заполнение таблицы данными: АтсМаркировка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]') + + if fill_DopRashod: + print('Заполнение таблицы данными: Доп расходы ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)]') + + if fill_Dostavka: + print('Заполнение таблицы данными: Доставка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]') + + if fill_Zakupka: + print('Заполнение таблицы данными: Закупка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]') + + if fill_ZatratiMp: + print('Заполнение таблицы данными: ЗатратыМП ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]') + + if fill_Pereschet: + print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)]') + + if fill_PereschetSklad: + print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)]') + + if fill_Priemka: + print('Заполнение таблицы данными: Приемка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]') + + if fill_Prodaji: + print('Заполнение таблицы данными: Продажи ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]') + + if fill_Proizvodstvo: + print('Заполнение таблицы данными: Производство ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]') + + if fill_Sborka: + print('Заполнение таблицы данными: Сборка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]') + +def count_price(all_params, last_utid, conn): + arr_price = [] + uchet_price = 0 + uchet_price_usd22 = 0 + sale_quantity = 1 + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + + + if sale_quantity != 0: + + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + + + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + + return (last_utid, float(uchet_price), float(uchet_price_usd22)) + #arr_price.append((last_utid, float(uchet_price), float(uchet_price_usd22))) + #if len(arr_price) > 0: + # insert_to_DB_UchetPrice(arr_price, conn) + + + + + + + + +def insert_to_DB_UchetPrice(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[pbiProd].[УчетнаяЦенаПоСебестоимости]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[УчетнаяЦенаПоСебестоимости] + ( [Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (CONVERT(date, GETDATE()), ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + + + +union_sebes = True +print('start time', time.ctime()) +connect = sql_connect() +ComputeManufacture = True +maxLvl = 1 + +if ComputeManufacture: + maxLvl = 4 + exec_procedure(connect, '[pbiProd].[Подготовка Производство: единая процедура для подготовки]') + + + +for stRange in range(0, maxLvl): + # Заполнение таблицы + skip = False + fill_table_sebestoim2022(connect, skip) + + if True: + group = '[2k]' + max_counter = getMaxCounter(connect, group) + print('Группа: ', group, ' Всего групп - ', max_counter) + for counter in range(max_counter): + counter += 1 + count_sebest(connect, counter, group) + print(time.ctime(), ' группа ', counter, ' обработана') + + + # Расчитаем товары которые учавствуют в производстве + if ComputeManufacture: + start_range = 0 + for i in range(stRange, stRange + 1): + for i_range in range(2000, 20000, 2000): + end_range = i_range + count_sebest(connect, "", "", i, True, start_range, end_range) + start_range = i_range + + # Нужно добавить 1с_id в таблицу .... + exec_procedure(connect, '[pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]') + + +# заполним сводную таблицу (финальную) для загрузки в пби ... +if union_sebes: + print('Объединение в сводную таблицу ~ 10 мин ...') + exec_procedure(connect, '[pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]') + + +connect.close() +print('end time ', time.ctime()) diff --git a/analytics/python skript/CostCalculationFrom2022_1_5.bat b/analytics/python skript/CostCalculationFrom2022_1_5.bat new file mode 100644 index 0000000..0d8e173 --- /dev/null +++ b/analytics/python skript/CostCalculationFrom2022_1_5.bat @@ -0,0 +1,2 @@ +"C:\Users\administrator\AppData\Local\Programs\Python\Python312\python.exe" "F:\python skript\CostCalculationFrom2022_1_5.py" +exit \ No newline at end of file diff --git a/analytics/python skript/CostCalculationFrom2022_1_5.py b/analytics/python skript/CostCalculationFrom2022_1_5.py new file mode 100644 index 0000000..d0328fd --- /dev/null +++ b/analytics/python skript/CostCalculationFrom2022_1_5.py @@ -0,0 +1,887 @@ +import decimal +import time +import numpy as np +import pyodbc + + +def sql_connect(): + server = 'prdsql.mag-fur.ru' + #server = 'cloud.magok.ru' + database = 'mag_pbi' + username = 'goglev' + password = 'BOMoGbUZ1p' + connection_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}' + + conn = pyodbc.connect(connection_string) + print("successfully connected...") + print("#" * 20) + return conn + + +def get_totals(conn, counter, group): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2] -- 22 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2] + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + + + +def get_totalsManufacture(conn, manufactureLevel, start_range, end_range): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2] -- 22 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2] + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + +def find_sumof_total(sebes_sales, date, current_sales_id, current_params, last_string_values): + quantity = current_params['quantity'] + sumZakupka = current_params['sumZakupka'] + sumZakupkaUSD2 = current_params['sumZakupkaUSD2'] + sum_dostavka = current_params['sum_dostavka'] + sum_dostavkaUSD2 = current_params['sum_dostavkaUSD2'] + sum_NAT = current_params['sum_NAT'] + sum_NATUSD2 = current_params['sum_NATUSD2'] + sum_production = current_params['sum_production'] + sum_productionUSD2 = current_params['sum_productionUSD2'] + sum_zatratiMP = current_params['sum_zatratiMP'] + sum_custom = current_params['sum_custom'] + sum_customUSD2 = current_params['sum_customUSD2'] + sum_skladHranenie = current_params['sum_skladHranenie'] + sum_Priemka = current_params['sum_Priemka'] + sum_AtsMarkirovka = current_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = current_params['sum_SborkaZakaza'] + i = current_params['counter'] + len_sebes_sales = len(sebes_sales) + while i < len_sebes_sales: + try: + curr_str = sebes_sales[i] + except: + print('Ошибка в иттераторе, тек ид =', current_sales_id) + print(i) + print(len_sebes_sales) + break + + if curr_str[10] > date or current_sales_id != curr_str[0]: + break + else: + i += 1 + + if curr_str[12] == 'Приход': + + if curr_str[13] == 'Закупка' or curr_str[13] == 'Ввод остатков до 22' or curr_str[13] == 'Производство товара': + quantity += curr_str[2] + + + if curr_str[9] > 0: + usd2_course = curr_str[9] + else: + if curr_str[13] == 'Ввод остатков до 22': + # для ввода остатков возьём курс на 1 января 2023 года + usd2_course = 75.7785 + else: + usd2_course = 1 + + sumZakupka += curr_str[4] + if curr_str[13] == 'Ввод остатков до 22': + sumZakupkaUSD2 += decimal.Decimal(float(sumZakupka) / usd2_course) + else: + sumZakupkaUSD2 += curr_str[18] + + + #if curr_str[11] == 'руб.': + # sumZakupkaUSD += sumZakupka / usd2_course + + sum_dostavka += curr_str[5] + sum_dostavkaUSD2 += curr_str[19] + sum_NAT += curr_str[6] + sum_NATUSD2 += curr_str[20] + sum_production += curr_str[7] + sum_productionUSD2 += curr_str[22] + sum_zatratiMP += curr_str[3] + sum_custom += curr_str[8] + sum_customUSD2 += curr_str[21] + sum_skladHranenie += curr_str[14] + sum_Priemka += curr_str[15] + sum_AtsMarkirovka += curr_str[16] + sum_SborkaZakaza += curr_str[17] + + if curr_str[12] == 'Расход': + quantity -= last_string_values['quantity'] + sumZakupka -= last_string_values['sumZakupka'] + sumZakupkaUSD2 -= last_string_values['sumZakupkaUSD2'] + sum_dostavka -= last_string_values['sum_dostavka'] + sum_dostavkaUSD2 -= last_string_values['sum_dostavkaUSD2'] + sum_NAT -= last_string_values['sum_NAT'] + sum_NATUSD2 -= last_string_values['sum_NATUSD2'] + sum_production -= last_string_values['sum_production'] + sum_productionUSD2 -= last_string_values['sum_productionUSD2'] + sum_zatratiMP -= last_string_values['sum_zatratiMP'] + sum_custom -= last_string_values['sum_custom'] + sum_customUSD2 -= last_string_values['sum_customUSD2'] + sum_skladHranenie -= last_string_values['sum_skladHranenie'] + sum_Priemka -= last_string_values['sum_Priemka'] + sum_AtsMarkirovka -= last_string_values['sum_AtsMarkirovka'] + sum_SborkaZakaza -= last_string_values['sum_SborkaZakaza'] + + if quantity <= 0: + quantity = 0 + sumZakupka = 0 + sumZakupkaUSD2 = 0 + sum_dostavka = 0 + sum_NAT = 0 + sum_production = 0 + sum_zatratiMP = 0 + sum_custom = 0 + sum_skladHranenie = 0 + sum_Priemka = 0 + sum_AtsMarkirovka = 0 + sum_SborkaZakaza = 0 + sum_dostavkaUSD2 = 0 + sum_NATUSD2 = 0 + sum_productionUSD2 = 0 + sum_customUSD2 = 0 + + + return {'quantity': quantity, 'sumZakupka': sumZakupka, 'sumZakupkaUSD2': sumZakupkaUSD2, + 'sum_dostavka': sum_dostavka, + 'sum_NAT': sum_NAT, 'sum_production': sum_production, 'sum_zatratiMP': sum_zatratiMP, 'sum_custom': sum_custom, + 'sum_skladHranenie': sum_skladHranenie, 'sum_Priemka': sum_Priemka, 'sum_AtsMarkirovka': sum_AtsMarkirovka, 'sum_SborkaZakaza': sum_SborkaZakaza, + 'sum_dostavkaUSD2': sum_dostavkaUSD2, 'sum_NATUSD2': sum_NATUSD2, 'sum_productionUSD2': sum_productionUSD2, 'sum_customUSD2': sum_customUSD2, + 'counter': i} + + +def insert_to_DB_Production(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьПроизводствоОт2022]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[СебестоимостьПроизводствоОт2022] + ([Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (?, ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + +def update_to_DB_Sales(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + if year == '2022': + table = '[СебестоимостьОт2022]' + elif year == '2023': + table = '[Себестоимость2023]' + elif year == '2024': + table = '[Себестоимость2024]' + + cursor.executemany( + """UPDATE [mag_pbi].[pbiProd].""" + table + """ + SET + [Закупка] = ? -- 0 + , [Закупка, usd2] = ? -- 1 + , [Доставка] = ? -- 2 + , [Производство] = ? -- 3 + , [НДС] = ? -- 4 + , [ЗатратыМП] = ? -- 5 + , [Таможня] = ? -- 6 + , [ЗатратыСкладХранение] = ? -- 7 + , [Учетная стоимость] = ? -- 8 + , [Учетная стоимость USD2+2] = ? -- 9 + , [Учетная цена] = ? -- 10 + , [Учетная цена USD2+2] = ? -- 11 + , [artic_id] = ? -- 12 + , [Приемка] = ? -- 13 + , [АтсМаркировка] = ? -- 14 + , [СборкаЗаказа] = ? -- 15 + , [Доставка USD2+2] = ? -- 16 + , [НДС USD2+2] = ? -- 17 + , [Таможня USD2+2] = ? -- 18 + , [Производство USD2+2] = ? -- 19 + WHERE id = ?""", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def update_to_DB_sebest(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + if year == '2022': + table = '[СебестоимостьОт2022]' + elif year == '2023': + table = '[Себестоимость2023]' + elif year == '2024': + table = '[Себестоимость2024]' + cursor.executemany( + "UPDATE [mag_pbi].[pbiProd]." + table + " SET [Учетная стоимость] = ?, [Учетная стоимость USD2+2] = ?, [Учетная цена] = ?, [Учетная цена USD2+2] = ? WHERE id = ?", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def exec_procedure(conn, procedure_name): + sql_query = 'EXEC ' + procedure_name + cursor = conn.cursor() + cursor.execute(sql_query).commit() + + +def getMaxCounter(conn, group): + sql_query = "SELECT MAX(" + group + ") FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature]" + + cursor = conn.cursor() + cursor.execute(sql_query) + maxCounter = cursor.fetchall() + return maxCounter[0][0] + + + +def count_sebest(connect, counter = '2k', group = '1', manufactureLevel = 0, manufacture = False, start_range = 0, end_range = 0): + upload = True + ind = 0 + arr_sebes = [] + arr_sales = [] + arr_production = [] + arr_price = [] + last_utid = '' + last_operation = '' + last_state = '' + + if manufacture: + pbi_all = get_totalsManufacture(connect, manufactureLevel, start_range, end_range) + else: + pbi_all = get_totals(connect, counter, group) + + + nparr_all = np.asarray(pbi_all) + + for str in pbi_all: + ind += 1 + date = str[10] + utid = str[1] + id = str[0] + tableGod = str[14] + zakupkaRUB = round(0, 9) + zakupkaUSD2 = round(0, 9) + NAT = round(0, 9) + NATUSD2 = round(0, 9) + zatratiMP = round(0, 9) + production = round(0, 9) + dostavka = round(0, 9) + dostavkaUSD2 = round(0, 9) + custom = round(0, 9) + customUSD2 = round(0, 9) + skladHranenie = round(0, 9) + priemka = round(0, 9) + atsMarkirovka = round(0, 9) + sborkaZakaza = round(0, 9) + + + if utid != last_utid: + ## если последняя операция не Реализация Расход, то сделаем фейковую продажу чтобы посчитать цену на сегодня ... + if last_operation != 'Расход' and last_state != 'Реализация' and last_operation != '' and False: + arr_price.append(count_price(all_params, last_utid, connect)) + + + fltr = np.asarray([utid]) + pbi_all_current_utid = nparr_all[np.in1d(nparr_all[:, 1], fltr)] + last_utid = utid + current_params = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_zakupkaUSD2': 0, + 'counter': 0} + last_string_values = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_zakupkaUSD2': 0} + + all_params = find_sumof_total(pbi_all_current_utid, date, str[0], current_params, last_string_values) + current_params = all_params.copy() + + + last_operation = str[12] + last_state = str[13] + sale_quantity = str[2] + + if str[9] > 0: + usd2_course = str[9] + else: + usd2_course = 1 + + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_zatratiMP = all_params['sum_zatratiMP'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + sum_skladHranenie = all_params['sum_skladHranenie'] + sum_Priemka = all_params['sum_Priemka'] + sum_AtsMarkirovka = all_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = all_params['sum_SborkaZakaza'] + + + if (str[12] == 'Приход') and str[13] != 'Ввод остатков до 22': + + uchet_price = 0 + uchet_price_usd22 = 0 + uchet_stoimost = 0 + uchet_stoimost_usd22 = 0 + + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + + + if sum_quantity != 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sum_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sum_quantity, 9) + + if sale_quantity != 0: + uchet_stoimost = round(uchet_price * sale_quantity, 9) + uchet_stoimost_usd22 = round(uchet_price_usd22 * sale_quantity, 9) + + + arr_sebes.append((uchet_stoimost, uchet_stoimost_usd22, uchet_price, uchet_price_usd22, id)) + + + elif str[12] == 'Расход': + + if sale_quantity != 0: + + if sum_zakupka < 0: + sum_zakupka = 0 + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + #zakupkaUSD2 = round(sum_zakupkaUSD2 / usd2_course, 15) + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + zatratiMP = round(sum_zatratiMP / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + skladHranenie = round(sum_skladHranenie / sum_quantity * sale_quantity, 9) + priemka = round(sum_Priemka / sum_quantity * sale_quantity, 9) + atsMarkirovka = round(sum_AtsMarkirovka / sum_quantity * sale_quantity, 9) + sborkaZakaza = round(sum_SborkaZakaza / sum_quantity * sale_quantity, 9) + + + last_string_values = {'quantity': sale_quantity, 'sumZakupka': zakupkaRUB, 'sumZakupkaUSD2': zakupkaUSD2, + 'sum_dostavka': dostavka, + 'sum_NAT': NAT, 'sum_production': production, 'sum_zatratiMP': zatratiMP, + 'sum_custom': custom, 'sum_skladHranenie': skladHranenie, 'sum_Priemka': priemka, + 'sum_AtsMarkirovka': atsMarkirovka, 'sum_SborkaZakaza': sborkaZakaza, + 'sum_dostavkaUSD2': dostavkaUSD2, 'sum_NATUSD2': NATUSD2, 'sum_productionUSD2': productionUSD2, 'sum_customUSD2': customUSD2} + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_stoimost = round((dostavka + NAT + zakupkaRUB + custom + production), 9) + uchet_stoimost_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2), 9) + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + arr_sales.append( + (float(-zakupkaRUB), float(-zakupkaUSD2), float(-dostavka), float(-production), float(-NAT), float(-zatratiMP), float(-custom), + float(-skladHranenie), float(uchet_stoimost), + float(uchet_stoimost_usd22), float(uchet_price), float(uchet_price_usd22), utid, float(-priemka), float(-atsMarkirovka), float(-sborkaZakaza), + float(-dostavkaUSD2), float(-NATUSD2), float(-productionUSD2), float(-customUSD2), + id)) + + if str[13] == 'Производство товара': + arr_production.append((str[10], str[1], float(uchet_price), float(uchet_price_usd22))) + + + # break + + if ind % 10000 == 0: + print(time.ctime(), ' ', ind, 'проходов') + + if len(arr_price) > 0 and False: + insert_to_DB_UchetPrice(arr_price, connect) + + if len(arr_production) > 0 and manufacture: + insert_to_DB_Production(arr_production, connect) + + + if upload and manufacture == False: + if len(arr_sales) > 0: + print(time.ctime(), ' записей sales: ', len(arr_sales)) + update_to_DB_Sales(arr_sales, connect, '2022') + + if len(arr_sebes) > 0: + print(time.ctime(), ' записей sebest: ', len(arr_sebes)) + update_to_DB_sebest(arr_sebes, connect, '2022') + + + upload = False + + +def fill_table_sebestoim2022(connect, skip = False): + + if skip: + return + + + #флаг для обработки без заполнения таблиц ... + prepare_table = True + fill_AtsMarkirovka = True + fill_Dostavka = True + fill_Zakupka = True + fill_ZatratiMp = False + fill_Priemka = True + fill_Prodaji = True + fill_Proizvodstvo = True + fill_Sborka = True + + if prepare_table: + print('Подготовка таблицы СебестоимостьОт2022 ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]') + + # заполним таблицы данными закупки ... + if fill_AtsMarkirovka: + print('Заполнение таблицы данными: АтсМаркировка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]') + + if fill_Dostavka: + print('Заполнение таблицы данными: Доставка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]') + + if fill_Zakupka: + print('Заполнение таблицы данными: Закупка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]') + + if fill_ZatratiMp: + print('Заполнение таблицы данными: ЗатратыМП ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]') + + if fill_Priemka: + print('Заполнение таблицы данными: Приемка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]') + + if fill_Prodaji: + print('Заполнение таблицы данными: Продажи ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]') + + if fill_Proizvodstvo: + print('Заполнение таблицы данными: Производство ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]') + + if fill_Sborka: + print('Заполнение таблицы данными: Сборка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]') + +def count_price(all_params, last_utid, conn): + arr_price = [] + uchet_price = 0 + uchet_price_usd22 = 0 + sale_quantity = 1 + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + + + if sale_quantity != 0: + + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + + + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + + return (last_utid, float(uchet_price), float(uchet_price_usd22)) + #arr_price.append((last_utid, float(uchet_price), float(uchet_price_usd22))) + #if len(arr_price) > 0: + # insert_to_DB_UchetPrice(arr_price, conn) + + + + + + + + +def insert_to_DB_UchetPrice(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[pbiProd].[УчетнаяЦенаПоСебестоимости]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[УчетнаяЦенаПоСебестоимости] + ( [Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (CONVERT(date, GETDATE()), ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + + +union_sebes = True +print('start time', time.ctime()) +connect = sql_connect() + +for stRange in range(0, 1): + # Заполнение таблицы себестоимостьОт2022 + fill_table_sebestoim2022(connect, False) + + if True: + group = '[2k]' + max_counter = getMaxCounter(connect, group) + print('Группа: ', group, ' Всего групп - ', max_counter) + for counter in range(max_counter): + counter += 1 + count_sebest(connect, counter, group) + print(time.ctime(), ' группа ', counter, ' обработана') + + + # Расчитаем товары которые учавствуют в производстве + if False: + start_range = 0 + for i in range(stRange, stRange + 1): + for i_range in range(2000, 15000, 2000): + end_range = i_range + count_sebest(connect, "", "", i, True, start_range, end_range) + start_range = i_range + + # Нужно добавить 1с_id в таблицу .... + exec_procedure(connect, '[pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]') + + +# заполним сводную таблицу (финальную) для загрузки в пби ... +if union_sebes: + print('Объединение в сводную таблицу ~ 10 мин ...') + exec_procedure(connect, '[pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]') + + +connect.close() +print('end time ', time.ctime()) diff --git a/analytics/python skript/main (3).py b/analytics/python skript/main (3).py new file mode 100644 index 0000000..1e60649 --- /dev/null +++ b/analytics/python skript/main (3).py @@ -0,0 +1,566 @@ +import decimal +import time +import numpy as np +import pyodbc + + +def sql_connect(): + server = 'prdsql' + #server = 'cloud.magok.ru' + database = 'mag_pbi' + username = 'goglev' + password = 'BOMoGbUZ1p' + connection_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}' + + conn = pyodbc.connect(connection_string) + print("successfully connected...") + print("#" * 20) + return conn + + +def get_totals(conn, counter, group): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + [ЗатратыМП], -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + [НДС], -- 6 + COALESCE([Сборка], 0) AS [Сборка], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Сборка USD2+2], 0) AS [Сборка USD2+2] -- 22 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Сборка], 0) AS [Сборка], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Сборка USD2+2], 0) AS [Сборка USD2+2] + FROM [mag_pbi].[pbi].[СебестоимостьОт2022] + WHERE + [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbi].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + and [Период] >= '2022' + --and [artic_id] = 'e4532cdc-a827-11e5-80c7-305a3a00e12b' + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Закупка', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbi].[СебестоимостьИтогиДо2022] + where [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbi].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + -- and [artic_id] = 'e4532cdc-a827-11e5-80c7-305a3a00e12b' + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + + +def find_sumof_total(sebes_sales, date, current_sales_id, current_params, last_string_values): + quantity = current_params['quantity'] + sumZakupka = current_params['sumZakupka'] + sumZakupkaUSD2 = current_params['sumZakupkaUSD2'] + sum_dostavka = current_params['sum_dostavka'] + sum_dostavkaUSD2 = current_params['sum_dostavkaUSD2'] + sum_NAT = current_params['sum_NAT'] + sum_NATUSD2 = current_params['sum_NATUSD2'] + sum_sborka = current_params['sum_sborka'] + sum_sborkaUSD2 = current_params['sum_sborkaUSD2'] + sum_zatratiMP = current_params['sum_zatratiMP'] + sum_custom = current_params['sum_custom'] + sum_customUSD2 = current_params['sum_customUSD2'] + sum_skladHranenie = current_params['sum_skladHranenie'] + sum_Priemka = current_params['sum_Priemka'] + sum_AtsMarkirovka = current_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = current_params['sum_SborkaZakaza'] + i = current_params['counter'] + len_sebes_sales = len(sebes_sales) + while i < len_sebes_sales: + try: + curr_str = sebes_sales[i] + except: + print('Ошибка в иттераторе, тек ид =', current_sales_id) + print(i) + print(len_sebes_sales) + break + + if curr_str[10] > date or current_sales_id != curr_str[0]: + break + else: + i += 1 + + if curr_str[12] == 'Закупка' or curr_str[12] == 'Сборка заказа' or curr_str[12] == 'Приемка' or curr_str[12] == 'Атс маркировка': + quantity += curr_str[2] + + if curr_str[9] > 0: + usd2_course = curr_str[9] + else: + if curr_str[13] == 'Ввод остатков до 22': + # для ввода остатков возьём курс на 1 января 2023 года + usd2_course = 75.7785 + else: + usd2_course = 1 + + sumZakupka += curr_str[4] + if curr_str[13] == 'Ввод остатков до 22': + sumZakupkaUSD2 += decimal.Decimal(float(sumZakupka) / usd2_course) + else: + sumZakupkaUSD2 += curr_str[18] + + + #if curr_str[11] == 'руб.': + # sumZakupkaUSD += sumZakupka / usd2_course + + sum_dostavka += curr_str[5] + sum_dostavkaUSD2 += curr_str[19] + sum_NAT += curr_str[6] + sum_NATUSD2 += curr_str[20] + sum_sborka += curr_str[7] + sum_sborkaUSD2 += curr_str[22] + sum_zatratiMP += curr_str[3] + sum_custom += curr_str[8] + sum_customUSD2 += curr_str[21] + sum_skladHranenie += curr_str[14] + sum_Priemka += curr_str[15] + sum_AtsMarkirovka += curr_str[16] + sum_SborkaZakaza += curr_str[17] + + if curr_str[12] == 'Продажа': + quantity -= last_string_values['quantity'] + sumZakupka -= last_string_values['sumZakupka'] + sumZakupkaUSD2 -= last_string_values['sumZakupkaUSD2'] + sum_dostavka -= last_string_values['sum_dostavka'] + sum_dostavkaUSD2 -= last_string_values['sum_dostavkaUSD2'] + sum_NAT -= last_string_values['sum_NAT'] + sum_NATUSD2 -= last_string_values['sum_NATUSD2'] + sum_sborka -= last_string_values['sum_sborka'] + sum_sborkaUSD2 -= last_string_values['sum_sborkaUSD2'] + sum_zatratiMP -= last_string_values['sum_zatratiMP'] + sum_custom -= last_string_values['sum_custom'] + sum_customUSD2 -= last_string_values['sum_customUSD2'] + sum_skladHranenie -= last_string_values['sum_skladHranenie'] + sum_Priemka -= last_string_values['sum_Priemka'] + sum_AtsMarkirovka -= last_string_values['sum_AtsMarkirovka'] + sum_SborkaZakaza -= last_string_values['sum_SborkaZakaza'] + + if quantity <= 0: + quantity = 0 + sumZakupka = 0 + sumZakupkaUSD2 = 0 + sum_dostavka = 0 + sum_NAT = 0 + sum_sborka = 0 + sum_zatratiMP = 0 + sum_custom = 0 + sum_skladHranenie = 0 + sum_Priemka = 0 + sum_AtsMarkirovka = 0 + sum_SborkaZakaza = 0 + sum_dostavkaUSD2 = 0 + sum_NATUSD2 = 0 + sum_sborkaUSD2 = 0 + sum_customUSD2 = 0 + + + return {'quantity': quantity, 'sumZakupka': sumZakupka, 'sumZakupkaUSD2': sumZakupkaUSD2, + 'sum_dostavka': sum_dostavka, + 'sum_NAT': sum_NAT, 'sum_sborka': sum_sborka, 'sum_zatratiMP': sum_zatratiMP, 'sum_custom': sum_custom, + 'sum_skladHranenie': sum_skladHranenie, 'sum_Priemka': sum_Priemka, 'sum_AtsMarkirovka': sum_AtsMarkirovka, 'sum_SborkaZakaza': sum_SborkaZakaza, + 'sum_dostavkaUSD2': sum_dostavkaUSD2, 'sum_NATUSD2': sum_NATUSD2, 'sum_sborkaUSD2': sum_sborkaUSD2, 'sum_customUSD2': sum_customUSD2, + 'counter': i} + + + +def update_to_DB_Sales(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + if year == '2022': + table = '[СебестоимостьОт2022]' + elif year == '2023': + table = '[Себестоимость2023]' + elif year == '2024': + table = '[Себестоимость2024]' + + cursor.executemany( + """UPDATE [mag_pbi].[pbi].""" + table + """ + SET + [Закупка] = ? -- 0 + , [Закупка, usd2] = ? -- 1 + , [Доставка] = ? -- 2 + , [Сборка] = ? -- 3 + , [НДС] = ? -- 4 + , [ЗатратыМП] = ? -- 5 + , [Таможня] = ? -- 6 + , [ЗатратыСкладХранение] = ? -- 7 + , [Учетная стоимость] = ? -- 8 + , [Учетная стоимость USD2+2] = ? -- 9 + , [Учетная цена] = ? -- 10 + , [Учетная цена USD2+2] = ? -- 11 + , [artic_id] = ? -- 12 + , [Приемка] = ? -- 13 + , [АтсМаркировка] = ? -- 14 + , [СборкаЗаказа] = ? -- 15 + , [Доставка USD2+2] = ? -- 16 + , [НДС USD2+2] = ? -- 17 + , [Таможня USD2+2] = ? -- 18 + , [Сборка USD2+2] = ? -- 19 + WHERE id = ?""", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def update_to_DB_sebest(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + if year == '2022': + table = '[СебестоимостьОт2022]' + elif year == '2023': + table = '[Себестоимость2023]' + elif year == '2024': + table = '[Себестоимость2024]' + cursor.executemany( + "UPDATE [mag_pbi].[pbi]." + table + " SET [Учетная стоимость] = ?, [Учетная стоимость USD2+2] = ?, [Учетная цена] = ?, [Учетная цена USD2+2] = ? WHERE id = ?", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def exec_procedure(conn, procedure_name): + sql_query = 'EXEC ' + procedure_name + cursor = conn.cursor() + cursor.execute(sql_query).commit() + + +def getMaxCounter(conn, group): + sql_query = "SELECT MAX(" + group + ") FROM [mag_pbi].[pbi].[GroupsOfNomenclature]" + + cursor = conn.cursor() + cursor.execute(sql_query) + maxCounter = cursor.fetchall() + return maxCounter[0][0] + + + +def arr_to_nparr(arr): + return np.asarray(arr) + + +def count_sebest(connect, counter, group): + upload = True + ind = 0 + arr_sebes = [] + arr_sales = [] + last_utid = '' + pbi_all = get_totals(connect, counter, group) + nparr_all = arr_to_nparr(pbi_all) + + for str in pbi_all: + ind += 1 + date = str[10] + utid = str[1] + id = str[0] + tableGod = str[14] + zakupkaRUB = round(0, 15) + zakupkaUSD2 = round(0, 15) + NAT = round(0, 15) + NATUSD2 = round(0, 15) + zatratiMP = round(0, 15) + sborka = round(0, 15) + dostavka = round(0, 15) + dostavkaUSD2 = round(0, 15) + custom = round(0, 15) + customUSD2 = round(0, 15) + skladHranenie = round(0, 15) + priemka = round(0, 15) + atsMarkirovka = round(0, 15) + sborkaZakaza = round(0, 15) + + + if utid != last_utid: + fltr = np.asarray([utid]) + pbi_all_current_utid = nparr_all[np.in1d(nparr_all[:, 1], fltr)] + last_utid = utid + current_params = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_sborka': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_sborkaUSD2': 0, 'sum_customUSD2': 0, + 'sum_zakupkaUSD2': 0, + 'counter': 0} + last_string_values = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_sborka': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_sborkaUSD2': 0, 'sum_customUSD2': 0, + 'sum_zakupkaUSD2': 0} + + all_params = find_sumof_total(pbi_all_current_utid, date, str[0], current_params, last_string_values) + current_params = all_params.copy() + + sale_quantity = str[2] + + if str[9] > 0: + usd2_course = str[9] + else: + usd2_course = 1 + + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_sborka = all_params['sum_sborka'] + sum_sborkaUSD2 = all_params['sum_sborkaUSD2'] + sum_zatratiMP = all_params['sum_zatratiMP'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + sum_skladHranenie = all_params['sum_skladHranenie'] + sum_Priemka = all_params['sum_Priemka'] + sum_AtsMarkirovka = all_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = all_params['sum_SborkaZakaza'] + + + if (str[12] == 'Закупка' or str[12] == 'Сборка заказа' or str[12] == 'Приемка' or str[12] == 'Атс маркировка') and str[13] != 'Ввод остатков до 22': + + uchet_price = 0 + uchet_price_usd22 = 0 + uchet_stoimost = 0 + uchet_stoimost_usd22 = 0 + + zakupkaRUB = round(sum_zakupka, 15) + zakupkaUSD2 = round(sum_zakupkaUSD2, 15) + + + if sum_quantity != 0: + dostavka = round(sum_dostavka, 15) + dostavkaUSD2 = round(sum_dostavkaUSD2, 15) + NAT = round(sum_NAT, 15) + NATUSD2 = round(sum_NATUSD2, 15) + sborka = round(sum_sborka, 15) + sborkaUSD2 = round(sum_sborkaUSD2, 15) + zatratiMP = round(sum_zatratiMP, 15) + custom = round(sum_custom, 15) + customUSD2 = round(sum_customUSD2, 15) + skladHranenie = round(sum_skladHranenie, 15) + priemka = round(sum_Priemka, 15) + atsMarkirovka = round(sum_AtsMarkirovka, 15) + sborkaZakaza = round(sum_SborkaZakaza, 15) + + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + sborka) / sum_quantity, 15) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + sborkaUSD2) / sum_quantity, 15) + + if sale_quantity != 0: + uchet_stoimost = round(uchet_price * sale_quantity, 15) + uchet_stoimost_usd22 = round(uchet_price_usd22 * sale_quantity, 15) + + + arr_sebes.append((uchet_stoimost, uchet_stoimost_usd22, uchet_price, uchet_price_usd22, id)) + + + elif str[12] == 'Продажа': + + if sale_quantity != 0: + + if sum_zakupka < 0: + sum_zakupka = 0 + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 15) + zakupkaUSD2 = round(sum_zakupkaUSD2, 15) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 15) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 15) + + #zakupkaUSD2 = round(sum_zakupkaUSD2 / usd2_course, 15) + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 15) + dostavkaUSD2 = round(sum_dostavkaUSD2, 15) + NAT = round(sum_NAT, 15) + NATUSD2 = round(sum_NATUSD2, 15) + sborka = round(sum_sborka, 15) + sborkaUSD2 = round(sum_sborkaUSD2, 15) + zatratiMP = round(sum_zatratiMP, 15) + custom = round(sum_custom, 15) + customUSD2 = round(sum_customUSD2, 15) + skladHranenie = round(sum_skladHranenie, 15) + priemka = round(sum_Priemka, 15) + atsMarkirovka = round(sum_AtsMarkirovka, 15) + sborkaZakaza = round(sum_SborkaZakaza, 15) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 15) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 15) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 15) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 15) + sborka = round(sum_sborka / sum_quantity * sale_quantity, 15) + sborkaUSD2 = round(sum_sborkaUSD2 / sum_quantity * sale_quantity, 15) + zatratiMP = round(sum_zatratiMP / sum_quantity * sale_quantity, 15) + custom = round(sum_custom / sum_quantity * sale_quantity, 15) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 15) + skladHranenie = round(sum_skladHranenie / sum_quantity * sale_quantity, 15) + priemka = round(sum_Priemka / sum_quantity * sale_quantity, 15) + atsMarkirovka = round(sum_AtsMarkirovka / sum_quantity * sale_quantity, 15) + sborkaZakaza = round(sum_SborkaZakaza / sum_quantity * sale_quantity, 15) + + + last_string_values = {'quantity': sale_quantity, 'sumZakupka': zakupkaRUB, 'sumZakupkaUSD2': zakupkaUSD2, + 'sum_dostavka': dostavka, + 'sum_NAT': NAT, 'sum_sborka': sborka, 'sum_zatratiMP': zatratiMP, + 'sum_custom': custom, 'sum_skladHranenie': skladHranenie, 'sum_Priemka': priemka, + 'sum_AtsMarkirovka': atsMarkirovka, 'sum_SborkaZakaza': sborkaZakaza, + 'sum_dostavkaUSD2': dostavkaUSD2, 'sum_NATUSD2': NATUSD2, 'sum_sborkaUSD2': sborkaUSD2, 'sum_customUSD2': customUSD2} + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or sborka != 0 or dostavka != 0 or custom != 0: + uchet_stoimost = round((dostavka + NAT + zakupkaRUB + custom + sborka), 15) + uchet_stoimost_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + sborkaUSD2), 15) + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + sborka) / sale_quantity, 15) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + sborkaUSD2) / sale_quantity, 15) + + arr_sales.append( + (float(-zakupkaRUB), float(-zakupkaUSD2), float(-dostavka), float(-sborka), float(-NAT), float(-zatratiMP), float(-custom), + float(-skladHranenie), float(uchet_stoimost), + float(uchet_stoimost_usd22), float(uchet_price), float(uchet_price_usd22), utid, float(-priemka), float(-atsMarkirovka), float(-sborkaZakaza), + float(-dostavkaUSD2), float(-NATUSD2), float(-sborkaUSD2), float(-customUSD2), + id)) + + # break + + if ind % 10000 == 0: + print(time.ctime(), ' ', ind, 'проходов') + if upload: + if len(arr_sales) > 0: + print(time.ctime(), ' записей sales: ', len(arr_sales)) + update_to_DB_Sales(arr_sales, connect, '2022') + + if len(arr_sebes) > 0: + print(time.ctime(), ' записей sebest: ', len(arr_sebes)) + update_to_DB_sebest(arr_sebes, connect, '2022') + + + upload = False + + + +#флаг для обработки без заполнения таблиц ... +fill_BuysSells = True +fill_PriemkaMarkSborka = True +union_sebes = True +print('start time', time.ctime()) +connect = sql_connect() +# заполним таблицы данными закупки ... +if fill_BuysSells: + print('Заполнение таблицы данными ~ 14 мин, 8kk записей ...') + exec_procedure(connect, '[sebest].[Заполнить себестоимостьОт2022(закупки+продажи)]') + +if fill_PriemkaMarkSborka: + print('Заполнение таблицы данными ~ 30 мин, 5kk записей ...') + exec_procedure(connect, '[sebest].[Заполнить себестоимостьОт2022(Сборка)]') + + + +group = '[2k]' +max_counter = getMaxCounter(connect, group) +print('Группа: ', group, ' Всего групп - ', max_counter) +for counter in range(max_counter): + counter += 1 + count_sebest(connect, counter, group) + print(time.ctime(), ' группа ', counter, ' обработана') + + +# заполним сводную таблицу для дальнейшего использования ... +if union_sebes: + print('Объединение в сводную таблицу ~ 10 мин ...') + exec_procedure(connect, '[pbi].[ЗаполнитьСебестоимостьСводныйОт2022]') + + +connect.close() +print('end time ', time.ctime()) \ No newline at end of file diff --git a/analytics/python skript/main3.bat b/analytics/python skript/main3.bat new file mode 100644 index 0000000..e73c4f1 --- /dev/null +++ b/analytics/python skript/main3.bat @@ -0,0 +1,2 @@ +"C:\Users\administrator\AppData\Local\Programs\Python\Python312\python.exe" "F:\python skript\python skript\main (3).py" +exit \ No newline at end of file diff --git a/analytics/python skript/old/РасчетСебестоимостиБезПроизводства.py b/analytics/python skript/old/РасчетСебестоимостиБезПроизводства.py new file mode 100644 index 0000000..1932c0a --- /dev/null +++ b/analytics/python skript/old/РасчетСебестоимостиБезПроизводства.py @@ -0,0 +1,951 @@ +import decimal +import time +import numpy as np +import pyodbc + + +def sql_connect(): + server = '192.168.35.207' + server = 'cloud.magok.ru' + database = 'mag_pbi' + username = 'goglev' + password = 'BOMoGbUZ1p' + connection_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}' + + conn = pyodbc.connect(connection_string) + print("successfully connected...") + print("#" * 20) + return conn + + +def get_totals(conn, counter, group): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22 + COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23 + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], + COALESCE([Доп расходы], 0) AS [Доп расходы], + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] + + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + + + +def get_totalsManufacture(conn, manufactureLevel, start_range, end_range): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22 + COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23 + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], + COALESCE([Доп расходы], 0) AS [Доп расходы], + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + +def find_sumof_total(sebes_sales, date, current_sales_id, current_params, last_string_values): + quantity = current_params['quantity'] + sumZakupka = current_params['sumZakupka'] + sumZakupkaUSD2 = current_params['sumZakupkaUSD2'] + sum_dostavka = current_params['sum_dostavka'] + sum_dostavkaUSD2 = current_params['sum_dostavkaUSD2'] + sum_NAT = current_params['sum_NAT'] + sum_NATUSD2 = current_params['sum_NATUSD2'] + sum_production = current_params['sum_production'] + sum_productionUSD2 = current_params['sum_productionUSD2'] + sum_zatratiMP = current_params['sum_zatratiMP'] + sum_custom = current_params['sum_custom'] + sum_customUSD2 = current_params['sum_customUSD2'] + sum_skladHranenie = current_params['sum_skladHranenie'] + sum_Priemka = current_params['sum_Priemka'] + sum_AtsMarkirovka = current_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = current_params['sum_SborkaZakaza'] + sum_DopRashod = current_params['sum_DopRashod'] + sum_DopRashodUSD2 = current_params['sum_DopRashodUSD2'] + i = current_params['counter'] + len_sebes_sales = len(sebes_sales) + while i < len_sebes_sales: + try: + curr_str = sebes_sales[i] + except: + print('Ошибка в иттераторе, тек ид =', current_sales_id) + print(i) + print(len_sebes_sales) + break + + if curr_str[10] > date or current_sales_id != curr_str[0]: + break + else: + i += 1 + + if curr_str[12] == 'Приход': + + # кажется что можно и нужно удалить ... + if curr_str[13] == 'Закупка' or curr_str[13] == 'Ввод остатков до 22' or curr_str[13] == 'Производство товара' or curr_str[13] == 'Пересчет товара': + quantity += curr_str[2] + + + if curr_str[9] > 0: + usd2_course = curr_str[9] + else: + if curr_str[13] == 'Ввод остатков до 22': + # для ввода остатков возьём курс на 1 января 2023 года + usd2_course = 75.7785 + else: + usd2_course = 1 + + sumZakupka += curr_str[4] + if curr_str[13] == 'Ввод остатков до 22': + sumZakupkaUSD2 += decimal.Decimal(float(sumZakupka) / usd2_course) + else: + sumZakupkaUSD2 += curr_str[18] + + + #if curr_str[11] == 'руб.': + # sumZakupkaUSD += sumZakupka / usd2_course + + sum_dostavka += curr_str[5] + sum_dostavkaUSD2 += curr_str[19] + sum_NAT += curr_str[6] + sum_NATUSD2 += curr_str[20] + sum_production += curr_str[7] + sum_productionUSD2 += curr_str[22] + sum_zatratiMP += curr_str[3] + sum_custom += curr_str[8] + sum_customUSD2 += curr_str[21] + sum_skladHranenie += curr_str[14] + sum_Priemka += curr_str[15] + sum_AtsMarkirovka += curr_str[16] + sum_SborkaZakaza += curr_str[17] + sum_DopRashod += curr_str[23] + sum_DopRashodUSD2 += curr_str[24] + + if curr_str[12] == 'Расход': + quantity -= last_string_values['quantity'] + sumZakupka -= last_string_values['sumZakupka'] + sumZakupkaUSD2 -= last_string_values['sumZakupkaUSD2'] + sum_dostavka -= last_string_values['sum_dostavka'] + sum_dostavkaUSD2 -= last_string_values['sum_dostavkaUSD2'] + sum_NAT -= last_string_values['sum_NAT'] + sum_NATUSD2 -= last_string_values['sum_NATUSD2'] + sum_production -= last_string_values['sum_production'] + sum_productionUSD2 -= last_string_values['sum_productionUSD2'] + sum_zatratiMP -= last_string_values['sum_zatratiMP'] + sum_custom -= last_string_values['sum_custom'] + sum_customUSD2 -= last_string_values['sum_customUSD2'] + sum_skladHranenie -= last_string_values['sum_skladHranenie'] + sum_Priemka -= last_string_values['sum_Priemka'] + sum_AtsMarkirovka -= last_string_values['sum_AtsMarkirovka'] + sum_SborkaZakaza -= last_string_values['sum_SborkaZakaza'] + sum_DopRashod -= last_string_values['sum_DopRashod'] + sum_DopRashodUSD2 -= last_string_values['sum_DopRashodUSD2'] + + if quantity <= 0: + quantity = 0 + sumZakupka = 0 + sumZakupkaUSD2 = 0 + sum_dostavka = 0 + sum_NAT = 0 + sum_production = 0 + sum_zatratiMP = 0 + sum_custom = 0 + sum_skladHranenie = 0 + sum_Priemka = 0 + sum_AtsMarkirovka = 0 + sum_SborkaZakaza = 0 + sum_dostavkaUSD2 = 0 + sum_NATUSD2 = 0 + sum_productionUSD2 = 0 + sum_customUSD2 = 0 + sum_DopRashod = 0 + sum_DopRashodUSD2 = 0 + + + return {'quantity': quantity, 'sumZakupka': sumZakupka, 'sumZakupkaUSD2': sumZakupkaUSD2, + 'sum_dostavka': sum_dostavka, + 'sum_NAT': sum_NAT, 'sum_production': sum_production, 'sum_zatratiMP': sum_zatratiMP, 'sum_custom': sum_custom, + 'sum_skladHranenie': sum_skladHranenie, 'sum_Priemka': sum_Priemka, 'sum_AtsMarkirovka': sum_AtsMarkirovka, 'sum_SborkaZakaza': sum_SborkaZakaza, + 'sum_dostavkaUSD2': sum_dostavkaUSD2, 'sum_NATUSD2': sum_NATUSD2, 'sum_productionUSD2': sum_productionUSD2, 'sum_customUSD2': sum_customUSD2, + 'sum_DopRashod': sum_DopRashod, 'sum_DopRashodUSD2': sum_DopRashodUSD2, + 'counter': i} + + +def insert_to_DB_Production(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьПроизводствоОт2022]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[СебестоимостьПроизводствоОт2022] + ([Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (?, ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + +def update_to_DB_Sales(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + if year == '2022': + table = '[СебестоимостьОт2022]' + elif year == '2023': + table = '[Себестоимость2023]' + elif year == '2024': + table = '[Себестоимость2024]' + + cursor.executemany( + """UPDATE [mag_pbi].[pbiProd].""" + table + """ + SET + [Закупка] = ? -- 0 + , [Закупка, usd2] = ? -- 1 + , [Доставка] = ? -- 2 + , [Производство] = ? -- 3 + , [НДС] = ? -- 4 + , [ЗатратыМП] = ? -- 5 + , [Таможня] = ? -- 6 + , [ЗатратыСкладХранение] = ? -- 7 + , [Учетная стоимость] = ? -- 8 + , [Учетная стоимость USD2+2] = ? -- 9 + , [Учетная цена] = ? -- 10 + , [Учетная цена USD2+2] = ? -- 11 + , [artic_id] = ? -- 12 + , [Приемка] = ? -- 13 + , [АтсМаркировка] = ? -- 14 + , [СборкаЗаказа] = ? -- 15 + , [Доставка USD2+2] = ? -- 16 + , [НДС USD2+2] = ? -- 17 + , [Таможня USD2+2] = ? -- 18 + , [Производство USD2+2] = ? -- 19 + , [Доп расходы] = ? -- 20 + , [Доп расходы USD2+2] = ? -- 21 + WHERE id = ?""", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def update_to_DB_sebest(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + # if year == '2022': + # table = '[СебестоимостьОт2022]' + # elif year == '2023': + # table = '[Себестоимость2023]' + # elif year == '2024': + # table = '[Себестоимость2024]' + cursor.executemany( + "UPDATE [mag_pbi].[pbiProd]." + table + " SET [Учетная стоимость] = ?, [Учетная стоимость USD2+2] = ?, [Учетная цена] = ?, [Учетная цена USD2+2] = ? WHERE id = ?", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def exec_procedure(conn, procedure_name): + sql_query = 'EXEC ' + procedure_name + cursor = conn.cursor() + cursor.execute(sql_query).commit() + + +def getMaxCounter(conn, group): + sql_query = "SELECT MAX(" + group + ") FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature]" + + cursor = conn.cursor() + cursor.execute(sql_query) + maxCounter = cursor.fetchall() + return maxCounter[0][0] + + + +def count_sebest(connect, counter = '2k', group = '1', manufactureLevel = 0, manufacture = False, start_range = 0, end_range = 0): + upload = True + ind = 0 + arr_sebes = [] + arr_sales = [] + arr_production = [] + arr_price = [] + last_utid = '' + last_operation = '' + last_state = '' + + if manufacture: + pbi_all = get_totalsManufacture(connect, manufactureLevel, start_range, end_range) + else: + pbi_all = get_totals(connect, counter, group) + + + nparr_all = np.asarray(pbi_all) + + for str in pbi_all: + ind += 1 + date = str[10] + utid = str[1] + id = str[0] + tableGod = str[14] + zakupkaRUB = round(0, 9) + zakupkaUSD2 = round(0, 9) + NAT = round(0, 9) + NATUSD2 = round(0, 9) + zatratiMP = round(0, 9) + production = round(0, 9) + dostavka = round(0, 9) + dostavkaUSD2 = round(0, 9) + custom = round(0, 9) + customUSD2 = round(0, 9) + skladHranenie = round(0, 9) + priemka = round(0, 9) + atsMarkirovka = round(0, 9) + sborkaZakaza = round(0, 9) + uchet_price = round(0, 9) + uchet_price_usd22 = round(0, 9) + dop_rashod = round(0, 9) + dop_rashod_usd22 = round(0, 9) + + + if utid != last_utid: + ## если последняя операция не Реализация Расход, то сделаем фейковую продажу чтобы посчитать цену на сегодня ... + if last_operation != 'Расход' and last_state != 'Реализация' and last_operation != '' and False: + arr_price.append(count_price(all_params, last_utid, connect)) + + + fltr = np.asarray([utid]) + pbi_all_current_utid = nparr_all[np.in1d(nparr_all[:, 1], fltr)] + last_utid = utid + current_params = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_zakupkaUSD2': 0, 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0, + 'counter': 0} + last_string_values = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0, + 'sum_zakupkaUSD2': 0} + + all_params = find_sumof_total(pbi_all_current_utid, date, str[0], current_params, last_string_values) + current_params = all_params.copy() + + + last_operation = str[12] + last_state = str[13] + sale_quantity = str[2] + + if str[9] > 0: + usd2_course = str[9] + else: + usd2_course = 1 + + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_zatratiMP = all_params['sum_zatratiMP'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + sum_skladHranenie = all_params['sum_skladHranenie'] + sum_Priemka = all_params['sum_Priemka'] + sum_AtsMarkirovka = all_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = all_params['sum_SborkaZakaza'] + sum_DopRashod = all_params['sum_DopRashod'] + sum_DopRashodUSD2 = all_params['sum_DopRashodUSD2'] + + + if (str[12] == 'Приход') and str[13] != 'Ввод остатков до 22': + + uchet_price = 0 + uchet_price_usd22 = 0 + uchet_stoimost = 0 + uchet_stoimost_usd22 = 0 + + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + + + if sum_quantity != 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + dop_rashod = round(sum_DopRashod, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2, 9) + + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sum_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sum_quantity, 9) + + if sale_quantity != 0: + uchet_stoimost = round(uchet_price * sale_quantity, 9) + uchet_stoimost_usd22 = round(uchet_price_usd22 * sale_quantity, 9) + + + arr_sebes.append((uchet_stoimost, uchet_stoimost_usd22, uchet_price, uchet_price_usd22, id)) + + + elif str[12] == 'Расход': + + if sale_quantity != 0: + + if sum_zakupka < 0: + sum_zakupka = 0 + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + #zakupkaUSD2 = round(sum_zakupkaUSD2 / usd2_course, 15) + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + dop_rashod = round(sum_DopRashod, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + zatratiMP = round(sum_zatratiMP / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + skladHranenie = round(sum_skladHranenie / sum_quantity * sale_quantity, 9) + priemka = round(sum_Priemka / sum_quantity * sale_quantity, 9) + atsMarkirovka = round(sum_AtsMarkirovka / sum_quantity * sale_quantity, 9) + sborkaZakaza = round(sum_SborkaZakaza / sum_quantity * sale_quantity, 9) + dop_rashod = round(sum_DopRashod / sum_quantity * sale_quantity, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2 / sum_quantity * sale_quantity, 9) + + + last_string_values = {'quantity': sale_quantity, 'sumZakupka': zakupkaRUB, 'sumZakupkaUSD2': zakupkaUSD2, + 'sum_dostavka': dostavka, + 'sum_NAT': NAT, 'sum_production': production, 'sum_zatratiMP': zatratiMP, + 'sum_custom': custom, 'sum_skladHranenie': skladHranenie, 'sum_Priemka': priemka, + 'sum_AtsMarkirovka': atsMarkirovka, 'sum_SborkaZakaza': sborkaZakaza, + 'sum_dostavkaUSD2': dostavkaUSD2, 'sum_NATUSD2': NATUSD2, 'sum_productionUSD2': productionUSD2, 'sum_customUSD2': customUSD2, + 'sum_DopRashod': dop_rashod, 'sum_DopRashodUSD2': dop_rashod_usd22} + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_stoimost = round((dostavka + NAT + zakupkaRUB + custom + production), 9) + uchet_stoimost_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2), 9) + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + arr_sales.append( + (float(-zakupkaRUB), float(-zakupkaUSD2), float(-dostavka), float(-production), float(-NAT), float(-zatratiMP), float(-custom), + float(-skladHranenie), float(uchet_stoimost), + float(uchet_stoimost_usd22), float(uchet_price), float(uchet_price_usd22), utid, float(-priemka), float(-atsMarkirovka), float(-sborkaZakaza), + float(-dostavkaUSD2), float(-NATUSD2), float(-productionUSD2), float(-customUSD2), float(-dop_rashod), float(-dop_rashod_usd22), + id)) + + if str[13] == 'Производство товара': + arr_production.append((str[10], str[1], float(uchet_price), float(uchet_price_usd22))) + + + # break + + if ind % 10000 == 0: + print(time.ctime(), ' ', ind, 'проходов') + + if len(arr_price) > 0 and False: + insert_to_DB_UchetPrice(arr_price, connect) + + if len(arr_production) > 0 and manufacture: + insert_to_DB_Production(arr_production, connect) + + + if upload and manufacture == False: + if len(arr_sales) > 0: + print(time.ctime(), ' записей sales: ', len(arr_sales)) + update_to_DB_Sales(arr_sales, connect, '2022') + + if len(arr_sebes) > 0: + print(time.ctime(), ' записей sebest: ', len(arr_sebes)) + update_to_DB_sebest(arr_sebes, connect, '2022') + + + upload = False + + +def fill_table_sebestoim2022(connect, skip = False): + + if skip: + return + + + #флаг для обработки без заполнения таблиц ... + prepare_table = True + fill_AtsMarkirovka = True + fill_DopRashod = True + fill_Dostavka = True + fill_Zakupka = True + fill_ZatratiMp = False + fill_Pereschet = True + fill_PereschetSklad = True + fill_Priemka = True + fill_Prodaji = True + fill_Proizvodstvo = True + fill_Sborka = True + + if prepare_table: + print('Подготовка таблицы СебестоимостьОт2022 ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]') + + # заполним таблицы данными закупки ... + if fill_AtsMarkirovka: + print('Заполнение таблицы данными: АтсМаркировка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]') + + if fill_DopRashod: + print('Заполнение таблицы данными: Доп расходы ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)]') + + if fill_Dostavka: + print('Заполнение таблицы данными: Доставка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]') + + if fill_Zakupka: + print('Заполнение таблицы данными: Закупка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]') + + if fill_ZatratiMp: + print('Заполнение таблицы данными: ЗатратыМП ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]') + + if fill_Pereschet: + print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)]') + + if fill_PereschetSklad: + print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)]') + + if fill_Priemka: + print('Заполнение таблицы данными: Приемка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]') + + if fill_Prodaji: + print('Заполнение таблицы данными: Продажи ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]') + + if fill_Proizvodstvo: + print('Заполнение таблицы данными: Производство ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]') + + if fill_Sborka: + print('Заполнение таблицы данными: Сборка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]') + +def count_price(all_params, last_utid, conn): + arr_price = [] + uchet_price = 0 + uchet_price_usd22 = 0 + sale_quantity = 1 + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + + + if sale_quantity != 0: + + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + + + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + + return (last_utid, float(uchet_price), float(uchet_price_usd22)) + #arr_price.append((last_utid, float(uchet_price), float(uchet_price_usd22))) + #if len(arr_price) > 0: + # insert_to_DB_UchetPrice(arr_price, conn) + + + + + + + + +def insert_to_DB_UchetPrice(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[pbiProd].[УчетнаяЦенаПоСебестоимости]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[УчетнаяЦенаПоСебестоимости] + ( [Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (CONVERT(date, GETDATE()), ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + + + +union_sebes = True +print('start time', time.ctime()) +connect = sql_connect() +ComputeManufacture = False +maxLvl = 1 + +if ComputeManufacture: + maxLvl = 4 + exec_procedure(connect, '[pbiProd].[Подготовка Производство: единая процедура для подготовки]') + + + +for stRange in range(0, maxLvl): + # Заполнение таблицы + skip = False + fill_table_sebestoim2022(connect, skip) + + if True: + group = '[2k]' + max_counter = getMaxCounter(connect, group) + print('Группа: ', group, ' Всего групп - ', max_counter) + for counter in range(max_counter): + counter += 1 + count_sebest(connect, counter, group) + print(time.ctime(), ' группа ', counter, ' обработана') + + + # Расчитаем товары которые учавствуют в производстве + if ComputeManufacture: + start_range = 0 + for i in range(stRange, stRange + 1): + for i_range in range(2000, 20000, 2000): + end_range = i_range + count_sebest(connect, "", "", i, True, start_range, end_range) + start_range = i_range + + # Нужно добавить 1с_id в таблицу .... + exec_procedure(connect, '[pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]') + + +# заполним сводную таблицу (финальную) для загрузки в пби ... +if union_sebes: + print('Объединение в сводную таблицу ~ 10 мин ...') + exec_procedure(connect, '[pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]') + + +connect.close() +print('end time ', time.ctime()) diff --git a/analytics/python skript/old/РасчетСебестоимостиСПроизводством.py b/analytics/python skript/old/РасчетСебестоимостиСПроизводством.py new file mode 100644 index 0000000..0200488 --- /dev/null +++ b/analytics/python skript/old/РасчетСебестоимостиСПроизводством.py @@ -0,0 +1,951 @@ +import decimal +import time +import numpy as np +import pyodbc + + +def sql_connect(): + server = '192.168.35.207' + server = 'cloud.magok.ru' + database = 'mag_pbi' + username = 'goglev' + password = 'BOMoGbUZ1p' + connection_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}' + + conn = pyodbc.connect(connection_string) + print("successfully connected...") + print("#" * 20) + return conn + + +def get_totals(conn, counter, group): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22 + COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23 + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], + COALESCE([Доп расходы], 0) AS [Доп расходы], + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] + + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = 'c4bbfb4b-cf25-11ef-998c-b49691d57efd' + and [artic_id] IN (SELECT + [artic_id] + FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature] + where """ + group + """ = """ + str(counter) + """) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + + + +def get_totalsManufacture(conn, manufactureLevel, start_range, end_range): + sql_query = """ + SELECT --TOP (1000) + id, -- 0 + artic_id, -- 1 + COALESCE([Количество], 0) AS [Количество], -- 2 + COALESCE([ЗатратыМП], 0) AS ЗатратыМП, -- 3 + COALESCE([Закупка], 0) AS [Закупка], -- 4 + COALESCE([Доставка], 0) AS [Доставка], -- 5 + COALESCE([НДС], 0) AS [НДС], -- 6 + COALESCE([Производство], 0) AS [Производство], -- 7 + COALESCE([Таможня], 0) AS [Таможня], -- 8 + [Курс usd2] AS [Курс usd2], -- 9 + [Период] AS [Период], -- 10 + [Валюта документа] AS [Валюта документа], -- 11 + [Вид операции] AS [Вид операции], -- 12 + [Статья] AS [Статья], -- 13 + COALESCE([ЗатратыСкладХранение], 0) AS [ЗатратыСкладХранение], -- 14 + COALESCE([Приемка], 0) AS [Приемка], -- 15 + COALESCE([АтсМаркировка], 0) AS [АтсМаркировка], -- 16 + COALESCE([СборкаЗаказа], 0) AS [СборкаЗаказа], -- 17 + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], -- 18 + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], -- 19 + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], -- 20 + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], -- 21 + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], -- 22 + COALESCE([Доп расходы], 0) AS [Доп расходы], -- 23 + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] -- 24 + FROM + ( + SELECT + id, + artic_id, + COALESCE([Количество], 0) AS [Количество], + [ЗатратыМП], + COALESCE([Закупка], 0) AS [Закупка], + COALESCE([Доставка], 0) AS [Доставка], + [НДС], + COALESCE([Производство], 0) AS [Производство], + COALESCE([Таможня], 0) AS [Таможня], + [Курс usd2], + [Период], + [Валюта документа], + [Вид операции], + [Статья], + [ЗатратыСкладХранение], + [Приемка], + [АтсМаркировка], + [СборкаЗаказа], + COALESCE([Закупка, usd2], 0) AS [Закупка, usd2], + COALESCE([Доставка USD2+2], 0) AS [Доставка USD2+2], + COALESCE([НДС USD2+2], 0) AS [НДС USD2+2], + COALESCE([Таможня USD2+2], 0) AS [Таможня USD2+2], + COALESCE([Производство USD2+2], 0) AS [Производство USD2+2], + COALESCE([Доп расходы], 0) AS [Доп расходы], + COALESCE([Доп расходы USD2+2], 0) AS [Доп расходы USD2+2] + FROM [mag_pbi].[pbiProd].[СебестоимостьОт2022] + WHERE + 1=1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + and [Период] >= '2022' + + + UNION ALL + + SELECT + id, + artic_id, + COALESCE([Количество], 0), + [ЗатратыМП], + COALESCE([Закупка], 0), + COALESCE([Доставка], 0), + [НДС], + COALESCE([Сборка], 0), + COALESCE([Таможня], 0), + 0, + '2021', + NULL, + 'Приход', + 'Ввод остатков до 22', + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM [mag_pbi].[pbiProd].[СебестоимостьИтогиДо2022] + where + 1 = 1 + --and [artic_id] = '24d0c24b-3a60-11e9-ae9c-b496910dcfd6' + and [1c_id] IN (SELECT + [1c_id] + FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] + where [УровеньПроизводства] = """ + str(manufactureLevel) + """ + and [RowNum] BETWEEN """ + str(start_range) + """ AND """ + str(end_range) + """ + --and [1c_id] = 0x9981B49691D57EFD11EDDE7DA97A5E64 + ) + ) AS tabMain + --WHERE 1=1 + + ORDER BY + [artic_id], [Период] ASC, [Закупка] DESC; + """ + cursor = conn.cursor() + cursor.execute(sql_query) + pbi_totals = cursor.fetchall() + print(time.ctime(), ' Записей к обработке: ', len(pbi_totals)) + return pbi_totals + +def find_sumof_total(sebes_sales, date, current_sales_id, current_params, last_string_values): + quantity = current_params['quantity'] + sumZakupka = current_params['sumZakupka'] + sumZakupkaUSD2 = current_params['sumZakupkaUSD2'] + sum_dostavka = current_params['sum_dostavka'] + sum_dostavkaUSD2 = current_params['sum_dostavkaUSD2'] + sum_NAT = current_params['sum_NAT'] + sum_NATUSD2 = current_params['sum_NATUSD2'] + sum_production = current_params['sum_production'] + sum_productionUSD2 = current_params['sum_productionUSD2'] + sum_zatratiMP = current_params['sum_zatratiMP'] + sum_custom = current_params['sum_custom'] + sum_customUSD2 = current_params['sum_customUSD2'] + sum_skladHranenie = current_params['sum_skladHranenie'] + sum_Priemka = current_params['sum_Priemka'] + sum_AtsMarkirovka = current_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = current_params['sum_SborkaZakaza'] + sum_DopRashod = current_params['sum_DopRashod'] + sum_DopRashodUSD2 = current_params['sum_DopRashodUSD2'] + i = current_params['counter'] + len_sebes_sales = len(sebes_sales) + while i < len_sebes_sales: + try: + curr_str = sebes_sales[i] + except: + print('Ошибка в иттераторе, тек ид =', current_sales_id) + print(i) + print(len_sebes_sales) + break + + if curr_str[10] > date or current_sales_id != curr_str[0]: + break + else: + i += 1 + + if curr_str[12] == 'Приход': + + # кажется что можно и нужно удалить ... + if curr_str[13] == 'Закупка' or curr_str[13] == 'Ввод остатков до 22' or curr_str[13] == 'Производство товара' or curr_str[13] == 'Пересчет товара': + quantity += curr_str[2] + + + if curr_str[9] > 0: + usd2_course = curr_str[9] + else: + if curr_str[13] == 'Ввод остатков до 22': + # для ввода остатков возьём курс на 1 января 2023 года + usd2_course = 75.7785 + else: + usd2_course = 1 + + sumZakupka += curr_str[4] + if curr_str[13] == 'Ввод остатков до 22': + sumZakupkaUSD2 += decimal.Decimal(float(sumZakupka) / usd2_course) + else: + sumZakupkaUSD2 += curr_str[18] + + + #if curr_str[11] == 'руб.': + # sumZakupkaUSD += sumZakupka / usd2_course + + sum_dostavka += curr_str[5] + sum_dostavkaUSD2 += curr_str[19] + sum_NAT += curr_str[6] + sum_NATUSD2 += curr_str[20] + sum_production += curr_str[7] + sum_productionUSD2 += curr_str[22] + sum_zatratiMP += curr_str[3] + sum_custom += curr_str[8] + sum_customUSD2 += curr_str[21] + sum_skladHranenie += curr_str[14] + sum_Priemka += curr_str[15] + sum_AtsMarkirovka += curr_str[16] + sum_SborkaZakaza += curr_str[17] + sum_DopRashod += curr_str[23] + sum_DopRashodUSD2 += curr_str[24] + + if curr_str[12] == 'Расход': + quantity -= last_string_values['quantity'] + sumZakupka -= last_string_values['sumZakupka'] + sumZakupkaUSD2 -= last_string_values['sumZakupkaUSD2'] + sum_dostavka -= last_string_values['sum_dostavka'] + sum_dostavkaUSD2 -= last_string_values['sum_dostavkaUSD2'] + sum_NAT -= last_string_values['sum_NAT'] + sum_NATUSD2 -= last_string_values['sum_NATUSD2'] + sum_production -= last_string_values['sum_production'] + sum_productionUSD2 -= last_string_values['sum_productionUSD2'] + sum_zatratiMP -= last_string_values['sum_zatratiMP'] + sum_custom -= last_string_values['sum_custom'] + sum_customUSD2 -= last_string_values['sum_customUSD2'] + sum_skladHranenie -= last_string_values['sum_skladHranenie'] + sum_Priemka -= last_string_values['sum_Priemka'] + sum_AtsMarkirovka -= last_string_values['sum_AtsMarkirovka'] + sum_SborkaZakaza -= last_string_values['sum_SborkaZakaza'] + sum_DopRashod -= last_string_values['sum_DopRashod'] + sum_DopRashodUSD2 -= last_string_values['sum_DopRashodUSD2'] + + if quantity <= 0: + quantity = 0 + sumZakupka = 0 + sumZakupkaUSD2 = 0 + sum_dostavka = 0 + sum_NAT = 0 + sum_production = 0 + sum_zatratiMP = 0 + sum_custom = 0 + sum_skladHranenie = 0 + sum_Priemka = 0 + sum_AtsMarkirovka = 0 + sum_SborkaZakaza = 0 + sum_dostavkaUSD2 = 0 + sum_NATUSD2 = 0 + sum_productionUSD2 = 0 + sum_customUSD2 = 0 + sum_DopRashod = 0 + sum_DopRashodUSD2 = 0 + + + return {'quantity': quantity, 'sumZakupka': sumZakupka, 'sumZakupkaUSD2': sumZakupkaUSD2, + 'sum_dostavka': sum_dostavka, + 'sum_NAT': sum_NAT, 'sum_production': sum_production, 'sum_zatratiMP': sum_zatratiMP, 'sum_custom': sum_custom, + 'sum_skladHranenie': sum_skladHranenie, 'sum_Priemka': sum_Priemka, 'sum_AtsMarkirovka': sum_AtsMarkirovka, 'sum_SborkaZakaza': sum_SborkaZakaza, + 'sum_dostavkaUSD2': sum_dostavkaUSD2, 'sum_NATUSD2': sum_NATUSD2, 'sum_productionUSD2': sum_productionUSD2, 'sum_customUSD2': sum_customUSD2, + 'sum_DopRashod': sum_DopRashod, 'sum_DopRashodUSD2': sum_DopRashodUSD2, + 'counter': i} + + +def insert_to_DB_Production(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьПроизводствоОт2022]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[СебестоимостьПроизводствоОт2022] + ([Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (?, ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + +def update_to_DB_Sales(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + if year == '2022': + table = '[СебестоимостьОт2022]' + elif year == '2023': + table = '[Себестоимость2023]' + elif year == '2024': + table = '[Себестоимость2024]' + + cursor.executemany( + """UPDATE [mag_pbi].[pbiProd].""" + table + """ + SET + [Закупка] = ? -- 0 + , [Закупка, usd2] = ? -- 1 + , [Доставка] = ? -- 2 + , [Производство] = ? -- 3 + , [НДС] = ? -- 4 + , [ЗатратыМП] = ? -- 5 + , [Таможня] = ? -- 6 + , [ЗатратыСкладХранение] = ? -- 7 + , [Учетная стоимость] = ? -- 8 + , [Учетная стоимость USD2+2] = ? -- 9 + , [Учетная цена] = ? -- 10 + , [Учетная цена USD2+2] = ? -- 11 + , [artic_id] = ? -- 12 + , [Приемка] = ? -- 13 + , [АтсМаркировка] = ? -- 14 + , [СборкаЗаказа] = ? -- 15 + , [Доставка USD2+2] = ? -- 16 + , [НДС USD2+2] = ? -- 17 + , [Таможня USD2+2] = ? -- 18 + , [Производство USD2+2] = ? -- 19 + , [Доп расходы] = ? -- 20 + , [Доп расходы USD2+2] = ? -- 21 + WHERE id = ?""", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def update_to_DB_sebest(arr, conn, year): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[СебестоимостьОт2022]' + # if year == '2022': + # table = '[СебестоимостьОт2022]' + # elif year == '2023': + # table = '[Себестоимость2023]' + # elif year == '2024': + # table = '[Себестоимость2024]' + cursor.executemany( + "UPDATE [mag_pbi].[pbiProd]." + table + " SET [Учетная стоимость] = ?, [Учетная стоимость USD2+2] = ?, [Учетная цена] = ?, [Учетная цена USD2+2] = ? WHERE id = ?", + arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + +def exec_procedure(conn, procedure_name): + sql_query = 'EXEC ' + procedure_name + cursor = conn.cursor() + cursor.execute(sql_query).commit() + + +def getMaxCounter(conn, group): + sql_query = "SELECT MAX(" + group + ") FROM [mag_pbi].[pbiProd].[GroupsOfNomenclature]" + + cursor = conn.cursor() + cursor.execute(sql_query) + maxCounter = cursor.fetchall() + return maxCounter[0][0] + + + +def count_sebest(connect, counter = '2k', group = '1', manufactureLevel = 0, manufacture = False, start_range = 0, end_range = 0): + upload = True + ind = 0 + arr_sebes = [] + arr_sales = [] + arr_production = [] + arr_price = [] + last_utid = '' + last_operation = '' + last_state = '' + + if manufacture: + pbi_all = get_totalsManufacture(connect, manufactureLevel, start_range, end_range) + else: + pbi_all = get_totals(connect, counter, group) + + + nparr_all = np.asarray(pbi_all) + + for str in pbi_all: + ind += 1 + date = str[10] + utid = str[1] + id = str[0] + tableGod = str[14] + zakupkaRUB = round(0, 9) + zakupkaUSD2 = round(0, 9) + NAT = round(0, 9) + NATUSD2 = round(0, 9) + zatratiMP = round(0, 9) + production = round(0, 9) + dostavka = round(0, 9) + dostavkaUSD2 = round(0, 9) + custom = round(0, 9) + customUSD2 = round(0, 9) + skladHranenie = round(0, 9) + priemka = round(0, 9) + atsMarkirovka = round(0, 9) + sborkaZakaza = round(0, 9) + uchet_price = round(0, 9) + uchet_price_usd22 = round(0, 9) + dop_rashod = round(0, 9) + dop_rashod_usd22 = round(0, 9) + + + if utid != last_utid: + ## если последняя операция не Реализация Расход, то сделаем фейковую продажу чтобы посчитать цену на сегодня ... + if last_operation != 'Расход' and last_state != 'Реализация' and last_operation != '' and False: + arr_price.append(count_price(all_params, last_utid, connect)) + + + fltr = np.asarray([utid]) + pbi_all_current_utid = nparr_all[np.in1d(nparr_all[:, 1], fltr)] + last_utid = utid + current_params = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_zakupkaUSD2': 0, 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0, + 'counter': 0} + last_string_values = {'quantity': 0, 'sumZakupka': 0, 'sumZakupkaUSD2': 0, + 'sum_dostavka': 0, 'sum_NAT': 0, 'sum_production': 0, 'sum_zatratiMP': 0, 'sum_custom': 0, 'sum_skladHranenie': 0, 'sum_Priemka': 0, + 'sum_AtsMarkirovka': 0, 'sum_SborkaZakaza': 0, 'sum_dostavkaUSD2': 0, 'sum_NATUSD2': 0, 'sum_productionUSD2': 0, 'sum_customUSD2': 0, + 'sum_DopRashod': 0, 'sum_DopRashodUSD2': 0, + 'sum_zakupkaUSD2': 0} + + all_params = find_sumof_total(pbi_all_current_utid, date, str[0], current_params, last_string_values) + current_params = all_params.copy() + + + last_operation = str[12] + last_state = str[13] + sale_quantity = str[2] + + if str[9] > 0: + usd2_course = str[9] + else: + usd2_course = 1 + + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_zatratiMP = all_params['sum_zatratiMP'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + sum_skladHranenie = all_params['sum_skladHranenie'] + sum_Priemka = all_params['sum_Priemka'] + sum_AtsMarkirovka = all_params['sum_AtsMarkirovka'] + sum_SborkaZakaza = all_params['sum_SborkaZakaza'] + sum_DopRashod = all_params['sum_DopRashod'] + sum_DopRashodUSD2 = all_params['sum_DopRashodUSD2'] + + + if (str[12] == 'Приход') and str[13] != 'Ввод остатков до 22': + + uchet_price = 0 + uchet_price_usd22 = 0 + uchet_stoimost = 0 + uchet_stoimost_usd22 = 0 + + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + + + if sum_quantity != 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + dop_rashod = round(sum_DopRashod, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2, 9) + + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sum_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sum_quantity, 9) + + if sale_quantity != 0: + uchet_stoimost = round(uchet_price * sale_quantity, 9) + uchet_stoimost_usd22 = round(uchet_price_usd22 * sale_quantity, 9) + + + arr_sebes.append((uchet_stoimost, uchet_stoimost_usd22, uchet_price, uchet_price_usd22, id)) + + + elif str[12] == 'Расход': + + if sale_quantity != 0: + + if sum_zakupka < 0: + sum_zakupka = 0 + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + #zakupkaUSD2 = round(sum_zakupkaUSD2 / usd2_course, 15) + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + zatratiMP = round(sum_zatratiMP, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + skladHranenie = round(sum_skladHranenie, 9) + priemka = round(sum_Priemka, 9) + atsMarkirovka = round(sum_AtsMarkirovka, 9) + sborkaZakaza = round(sum_SborkaZakaza, 9) + dop_rashod = round(sum_DopRashod, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + zatratiMP = round(sum_zatratiMP / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + skladHranenie = round(sum_skladHranenie / sum_quantity * sale_quantity, 9) + priemka = round(sum_Priemka / sum_quantity * sale_quantity, 9) + atsMarkirovka = round(sum_AtsMarkirovka / sum_quantity * sale_quantity, 9) + sborkaZakaza = round(sum_SborkaZakaza / sum_quantity * sale_quantity, 9) + dop_rashod = round(sum_DopRashod / sum_quantity * sale_quantity, 9) + dop_rashod_usd22 = round(sum_DopRashodUSD2 / sum_quantity * sale_quantity, 9) + + + last_string_values = {'quantity': sale_quantity, 'sumZakupka': zakupkaRUB, 'sumZakupkaUSD2': zakupkaUSD2, + 'sum_dostavka': dostavka, + 'sum_NAT': NAT, 'sum_production': production, 'sum_zatratiMP': zatratiMP, + 'sum_custom': custom, 'sum_skladHranenie': skladHranenie, 'sum_Priemka': priemka, + 'sum_AtsMarkirovka': atsMarkirovka, 'sum_SborkaZakaza': sborkaZakaza, + 'sum_dostavkaUSD2': dostavkaUSD2, 'sum_NATUSD2': NATUSD2, 'sum_productionUSD2': productionUSD2, 'sum_customUSD2': customUSD2, + 'sum_DopRashod': dop_rashod, 'sum_DopRashodUSD2': dop_rashod_usd22} + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_stoimost = round((dostavka + NAT + zakupkaRUB + custom + production), 9) + uchet_stoimost_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2), 9) + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + arr_sales.append( + (float(-zakupkaRUB), float(-zakupkaUSD2), float(-dostavka), float(-production), float(-NAT), float(-zatratiMP), float(-custom), + float(-skladHranenie), float(uchet_stoimost), + float(uchet_stoimost_usd22), float(uchet_price), float(uchet_price_usd22), utid, float(-priemka), float(-atsMarkirovka), float(-sborkaZakaza), + float(-dostavkaUSD2), float(-NATUSD2), float(-productionUSD2), float(-customUSD2), float(-dop_rashod), float(-dop_rashod_usd22), + id)) + + if str[13] == 'Производство товара': + arr_production.append((str[10], str[1], float(uchet_price), float(uchet_price_usd22))) + + + # break + + if ind % 10000 == 0: + print(time.ctime(), ' ', ind, 'проходов') + + if len(arr_price) > 0 and False: + insert_to_DB_UchetPrice(arr_price, connect) + + if len(arr_production) > 0 and manufacture: + insert_to_DB_Production(arr_production, connect) + + + if upload and manufacture == False: + if len(arr_sales) > 0: + print(time.ctime(), ' записей sales: ', len(arr_sales)) + update_to_DB_Sales(arr_sales, connect, '2022') + + if len(arr_sebes) > 0: + print(time.ctime(), ' записей sebest: ', len(arr_sebes)) + update_to_DB_sebest(arr_sebes, connect, '2022') + + + upload = False + + +def fill_table_sebestoim2022(connect, skip = False): + + if skip: + return + + + #флаг для обработки без заполнения таблиц ... + prepare_table = True + fill_AtsMarkirovka = True + fill_DopRashod = True + fill_Dostavka = True + fill_Zakupka = True + fill_ZatratiMp = False + fill_Pereschet = True + fill_PereschetSklad = True + fill_Priemka = True + fill_Prodaji = True + fill_Proizvodstvo = True + fill_Sborka = True + + if prepare_table: + print('Подготовка таблицы СебестоимостьОт2022 ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]') + + # заполним таблицы данными закупки ... + if fill_AtsMarkirovka: + print('Заполнение таблицы данными: АтсМаркировка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]') + + if fill_DopRashod: + print('Заполнение таблицы данными: Доп расходы ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)]') + + if fill_Dostavka: + print('Заполнение таблицы данными: Доставка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]') + + if fill_Zakupka: + print('Заполнение таблицы данными: Закупка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]') + + if fill_ZatratiMp: + print('Заполнение таблицы данными: ЗатратыМП ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]') + + if fill_Pereschet: + print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)]') + + if fill_PereschetSklad: + print('Заполнение таблицы данными: Пересчет ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)]') + + if fill_Priemka: + print('Заполнение таблицы данными: Приемка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]') + + if fill_Prodaji: + print('Заполнение таблицы данными: Продажи ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]') + + if fill_Proizvodstvo: + print('Заполнение таблицы данными: Производство ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]') + + if fill_Sborka: + print('Заполнение таблицы данными: Сборка ~ ? мин, ? записей ...') + exec_procedure(connect, '[pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]') + +def count_price(all_params, last_utid, conn): + arr_price = [] + uchet_price = 0 + uchet_price_usd22 = 0 + sale_quantity = 1 + sum_quantity = all_params['quantity'] + sum_zakupka = all_params['sumZakupka'] + sum_zakupkaUSD2 = all_params['sumZakupkaUSD2'] + sum_dostavka = all_params['sum_dostavka'] + sum_dostavkaUSD2 = all_params['sum_dostavkaUSD2'] + sum_NAT = all_params['sum_NAT'] + sum_NATUSD2 = all_params['sum_NATUSD2'] + sum_production = all_params['sum_production'] + sum_productionUSD2 = all_params['sum_productionUSD2'] + sum_custom = all_params['sum_custom'] + sum_customUSD2 = all_params['sum_customUSD2'] + + + if sale_quantity != 0: + + + if sale_quantity > sum_quantity or sum_quantity == 0: + zakupkaRUB = round(sum_zakupka, 9) + zakupkaUSD2 = round(sum_zakupkaUSD2, 9) + else: + zakupkaRUB = round(decimal.Decimal(sum_zakupka) / sum_quantity * sale_quantity, 9) + zakupkaUSD2 = round(decimal.Decimal(sum_zakupkaUSD2) / sum_quantity * sale_quantity, 9) + + + if sale_quantity > sum_quantity or sum_quantity == 0: + dostavka = round(sum_dostavka, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2, 9) + NAT = round(sum_NAT, 9) + NATUSD2 = round(sum_NATUSD2, 9) + production = round(sum_production, 9) + productionUSD2 = round(sum_productionUSD2, 9) + custom = round(sum_custom, 9) + customUSD2 = round(sum_customUSD2, 9) + else: + dostavka = round(sum_dostavka / sum_quantity * sale_quantity, 9) + dostavkaUSD2 = round(sum_dostavkaUSD2 / sum_quantity * sale_quantity, 9) + NAT = round(sum_NAT / sum_quantity * sale_quantity, 9) + NATUSD2 = round(sum_NATUSD2 / sum_quantity * sale_quantity, 9) + production = round(sum_production / sum_quantity * sale_quantity, 9) + productionUSD2 = round(sum_productionUSD2 / sum_quantity * sale_quantity, 9) + custom = round(sum_custom / sum_quantity * sale_quantity, 9) + customUSD2 = round(sum_customUSD2 / sum_quantity * sale_quantity, 9) + + + + if zakupkaRUB != 0 or zakupkaUSD2 != 0 or NAT != 0 or production != 0 or dostavka != 0 or custom != 0: + uchet_price = round((dostavka + NAT + zakupkaRUB + custom + production) / sale_quantity, 9) + uchet_price_usd22 = round((dostavkaUSD2 + NATUSD2 + zakupkaUSD2 + customUSD2 + productionUSD2) / sale_quantity, 9) + + + return (last_utid, float(uchet_price), float(uchet_price_usd22)) + #arr_price.append((last_utid, float(uchet_price), float(uchet_price_usd22))) + #if len(arr_price) > 0: + # insert_to_DB_UchetPrice(arr_price, conn) + + + + + + + + +def insert_to_DB_UchetPrice(arr, conn): + try: + cursor = conn.cursor() + conn.autocommit = False + cursor.fast_executemany = True + table = '[pbiProd].[УчетнаяЦенаПоСебестоимости]' + + cursor.executemany(""" + INSERT INTO [mag_pbi].[pbiProd].[УчетнаяЦенаПоСебестоимости] + ( [Период], [artic_id], [Учетная цена], [Учетная цена USD2+2]) + VALUES (CONVERT(date, GETDATE()), ?, ?, ?); + """, arr) + + + except pyodbc.DatabaseError as err: + print('ошибка', err) + conn.rollback() + else: + conn.commit() + print(time.ctime(), 'обновлено', len(arr), ': записей') + finally: + conn.autocommit = True + + + + +union_sebes = True +print('start time', time.ctime()) +connect = sql_connect() +ComputeManufacture = True +maxLvl = 1 + +if ComputeManufacture: + maxLvl = 4 + exec_procedure(connect, '[pbiProd].[Подготовка Производство: единая процедура для подготовки]') + + + +for stRange in range(0, maxLvl): + # Заполнение таблицы + skip = False + fill_table_sebestoim2022(connect, skip) + + if True: + group = '[2k]' + max_counter = getMaxCounter(connect, group) + print('Группа: ', group, ' Всего групп - ', max_counter) + for counter in range(max_counter): + counter += 1 + count_sebest(connect, counter, group) + print(time.ctime(), ' группа ', counter, ' обработана') + + + # Расчитаем товары которые учавствуют в производстве + if ComputeManufacture: + start_range = 0 + for i in range(stRange, stRange + 1): + for i_range in range(2000, 20000, 2000): + end_range = i_range + count_sebest(connect, "", "", i, True, start_range, end_range) + start_range = i_range + + # Нужно добавить 1с_id в таблицу .... + exec_procedure(connect, '[pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]') + + +# заполним сводную таблицу (финальную) для загрузки в пби ... +if union_sebes: + print('Объединение в сводную таблицу ~ 10 мин ...') + exec_procedure(connect, '[pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]') + + +connect.close() +print('end time ', time.ctime())