This commit is contained in:
Basoff 2026-02-18 14:03:49 +03:00
parent 64f8a96ba0
commit 7ac5adf509
167 changed files with 32273 additions and 0 deletions

178
analytics/STRUCTURE.md Normal file
View File

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

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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) (полуоткрытые).

Binary file not shown.

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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];

View File

@ -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

Binary file not shown.

Binary file not shown.

View File

@ -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"
}

View File

@ -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"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
database report
compatibilityLevel: 1600

View File

@ -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

View File

@ -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

View File

@ -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: '.Календарь'.Дата

View File

@ -0,0 +1,7 @@
role 'Алова Елена'
modelPermission: read
tablePermission Номенклатура = [Менеджер по закупкам] == "Алова Елена" || [РуководительНаправления] == "Алова Елена" || [Товарный менеджер] == "Алова Елена"
annotation PBI_Id = 232ba4e958694f06a7d05f870c7a2e09

View File

@ -0,0 +1,7 @@
role 'Гладышева Ольга'
modelPermission: read
tablePermission Номенклатура = [Менеджер по закупкам] == "Гладышева Ольга" || [РуководительНаправления] == "Гладышева Ольга" || [Товарный менеджер] == "Гладышева Ольга"
annotation PBI_Id = 7c1c9d1f38744bf4a1bd941e24707af1

View File

@ -0,0 +1,7 @@
role 'Иншакова Ксения'
modelPermission: read
tablePermission Номенклатура = [Менеджер по закупкам] == "Иншакова Ксения" || [РуководительНаправления] == "Иншакова Ксения" || [Товарный менеджер] == "Иншакова Ксения" || [Товарный менеджер] == "Дивеева Ирина"
annotation PBI_Id = 2b33c12aca5843adae941a60b22de032

View File

@ -0,0 +1,7 @@
role 'Кирилюк Юлия'
modelPermission: read
tablePermission Номенклатура = [Менеджер по закупкам] == "Кирилюк Юлия" || [РуководительНаправления] == "Кирилюк Юлия" || [Товарный менеджер] == "Кирилюк Юлия"
annotation PBI_Id = 229e8df5eeb84976a4877b1f158b9061

View File

@ -0,0 +1,7 @@
role 'Ларина Татьяна'
modelPermission: read
tablePermission Номенклатура = [Менеджер по закупкам] == "Ларина Татьяна" || [РуководительНаправления] == "Ларина Татьяна" || [Товарный менеджер] == "Ларина Татьяна"
annotation PBI_Id = 8e3b251c563a42249202718154a471e4

View File

@ -0,0 +1,5 @@
role 'Менеджер отдела закупок'
modelPermission: read
annotation PBI_Id = 5c63de3d119c4466a367623e23f8c9e3

View File

@ -0,0 +1,5 @@
role 'Менеджер отдела интернет-маркетинга'
modelPermission: read
annotation PBI_Id = 09735f8d6e7f4139929ac3460ed5829b

View File

@ -0,0 +1,5 @@
role 'Менеджер отдела продаж'
modelPermission: read
annotation PBI_Id = 3e05b61dc5134a3f9ef8d14b2a0b742a

View File

@ -0,0 +1,7 @@
role 'Ханоян Артем'
modelPermission: read
tablePermission Номенклатура = [Менеджер по закупкам] == "Ханоян Артем" || [РуководительНаправления] == "Ханоян Артем" || [Товарный менеджер] == "Ханоян Артем"
annotation PBI_Id = 2ae5566020ac4b96a50a5f1937670aee

View File

@ -0,0 +1,7 @@
role 'Шевченко Антонина'
modelPermission: read
tablePermission Номенклатура = [Менеджер по закупкам] == "Шевченко Антонина" || [РуководительНаправления] == "Шевченко Антонина" || [Товарный менеджер] == "Шевченко Антонина"
annotation PBI_Id = 00514f80ab984abd9f6957c4a3df98ea

View File

@ -0,0 +1,5 @@
role 'Эдуард Рахматуллин'
modelPermission: read
annotation PBI_Id = ffed27e83fa442788546be7bc067a933

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 = Навигация

View File

@ -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

View File

@ -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 = Навигация

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 = Навигация

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,15 @@
table Организация
column Организация
summarizeBy: none
isNameInferred
sourceColumn: Себестоимость[Организация]
annotation SummarizationSetBy = Automatic
partition Организация = calculated
mode: import
source = VALUES('Себестоимость'[Организация])
annotation PBI_Id = edae5abbb56b4e8dba63758043b0a407

File diff suppressed because it is too large Load Diff

View File

@ -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 = Навигация

View File

@ -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

View File

@ -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 = Навигация

View File

@ -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

View File

@ -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 = Навигация

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 = Навигация

View File

@ -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 = Навигация

View File

@ -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 = Навигация

View File

@ -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

View File

@ -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

View File

@ -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"
}
}
}
}
}
]
}
}

View File

@ -0,0 +1 @@
[]

View File

@ -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
}
}
]
}

View File

@ -0,0 +1,17 @@
{
"objects": {
"outspacePane": [
{
"properties": {
"width": {
"expr": {
"Literal": {
"Value": "191L"
}
}
}
}
}
]
}
}

View File

@ -0,0 +1,8 @@
{
"displayName": "Себестоимость для сверки",
"displayOption": 1,
"height": 720,
"name": "ReportSection1ae8f92a5273f14462dd",
"ordinal": 1,
"width": 1280
}

View File

@ -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"
}
}
]
}
}
}

View File

@ -0,0 +1,18 @@
[
{
"name": "Filter064e79cb305a69cb0d82",
"expression": {
"Column": {
"Expression": {
"SourceRef": {
"Entity": "Себестоимость"
}
},
"Property": "Вид операции"
}
},
"type": "Categorical",
"howCreated": 1,
"objects": {}
}
]

View File

@ -0,0 +1,8 @@
{
"height": 292.24,
"id": 5853011910,
"width": 1280,
"x": 0,
"y": 292.24,
"z": 1000
}

View File

@ -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": "Основной отчет.НДС, руб"
}
}
]
}
}
}

View File

@ -0,0 +1,18 @@
[
{
"name": "Filter064e79cb305a69cb0d82",
"expression": {
"Column": {
"Expression": {
"SourceRef": {
"Entity": "Себестоимость"
}
},
"Property": "Вид операции"
}
},
"type": "Categorical",
"howCreated": 1,
"objects": {}
}
]

View File

@ -0,0 +1,8 @@
{
"height": 292.64,
"id": 5853011911,
"width": 1280,
"x": 0,
"y": 0,
"z": 0
}

View File

@ -0,0 +1,8 @@
{
"displayName": "Закупка для сверки",
"displayOption": 1,
"height": 720,
"name": "754c9d1730b0f20a23b9",
"ordinal": 2,
"width": 1280
}

View File

@ -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
}
}

View File

@ -0,0 +1,8 @@
{
"height": 256,
"id": 5853011909,
"width": 1200.1,
"x": 0,
"y": 360.36,
"z": 1000
}

Some files were not shown because too many files have changed in this diff Show More