USE [mag_pbi]
GO

/****** Object:  StoredProcedure [analytics].[create_forecast_loop]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [analytics].[create_forecast_loop] as begin
	--запускать только при изменении дат внутри процедуры
	--EXEC [analytics].[sp_fill_seasonality_groups_summ_1]; 

	DECLARE @from_month    DATE = '2025-11-01'--DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
	DECLARE @to_month_excl DATE = '2028-01-01';
	DECLARE @scenario_id   INT  = 4;
	DECLARE @path NVARCHAR(255);

	DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
	SELECT [path]
	FROM [pbi].[groups] g
	WHERE [lvl] = 2
	AND g.[path] NOT LIKE '*%'   -- (опционально) исключить служебные группы
	
	/*AND (
		g.[path] LIKE N'Р%' OR
		g.[path] LIKE N'С%' OR
		g.[path] LIKE N'Т%' OR
		g.[path] LIKE N'У%' OR
		g.[path] LIKE N'Ф%' OR
		g.[path] LIKE N'Х%' OR
		g.[path] LIKE N'Ц%' OR
		g.[path] LIKE N'Ч%' OR
		g.[path] LIKE N'Ш%' OR
		g.[path] LIKE N'Щ%' OR
		g.[path] LIKE N'Э%' OR
		g.[path] LIKE N'Ю%' OR
		g.[path] LIKE N'Я%'
	)*/
	ORDER BY [path];

	OPEN cur;
	FETCH NEXT FROM cur INTO @path;

	WHILE @@FETCH_STATUS = 0
	BEGIN
		PRINT CONCAT('Rebuild forecast for: ', @path);
		EXEC [analytics].[sp_build_forecast_s4_by_group]
			 @path          = @path,
			 @from_month    = @from_month,
			 @to_month_excl = @to_month_excl,
			 @scenario_id   = @scenario_id;

		FETCH NEXT FROM cur INTO @path;
	END

	CLOSE cur;
	DEALLOCATE cur;
END
GO

/****** Object:  StoredProcedure [analytics].[create_seasonality_groups]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE analytics.[create_seasonality_groups]  as
BEGIN 
	/* 1) Таблица результата */
	IF NOT EXISTS (
		SELECT 1 
		FROM sys.tables t 
		JOIN sys.schemas s ON s.schema_id = t.schema_id
		WHERE s.name = 'analytics' AND t.name = 'seasonality_groups'
	)
	BEGIN
		CREATE TABLE [analytics].[seasonality_groups](
			[group_1c_id]   BINARY(16)     NOT NULL,
			[month]         TINYINT        NOT NULL,  -- 1..12
			[seasonal_koef] DECIMAL(18,6)  NOT NULL,
			CONSTRAINT [PK_seasonality_groups] PRIMARY KEY ([group_1c_id], [month])
		);
		CREATE INDEX [IX_seasonality_groups_month] 
			ON [analytics].[seasonality_groups]([month]);
	END

	TRUNCATE TABLE [analytics].[seasonality_groups];
	/* 2) Пересчёт коэффициентов сезонности для g и g1 */
	;WITH
	-- Продажи по товарам за последние 24 месяца (кол-во)
	[base_sales] AS (
		SELECT
			[n].[1c_id]                AS [sku_1c_id],
			[gcur].[g],
			[gcur].[g1],
			[v].[Период]               AS [dt],
			CAST([v].[Количество] AS DECIMAL(18,6)) AS [qty]
		FROM [mag_pbi].[pbiProd].[СводныйСебестоимость Для PBI] AS [v]
		JOIN [pbi].[nomenclature] AS [n]
		  ON [n].[1c_id] = [v].[1c_id]
		LEFT JOIN [pbi].[groups] AS [gcur]
		  ON [gcur].[1c_id] = [n].[1c_group]
		WHERE [v].[Статья] = N'Реализация'
		  AND [v].[Период] >= DATEADD(YEAR, -2, CAST(GETDATE() AS date))
	),
	-- Агрегация по месяцам и уровню g (lvl=0)
	[lvl0_monthly] AS (
		SELECT
			[g0].[1c_id] AS [group_1c_id],
			DATEFROMPARTS(YEAR([b].[dt]), MONTH([b].[dt]), 1) AS [month_start],
			SUM([b].[qty]) AS [qty_m]
		FROM [base_sales] AS [b]
		JOIN [pbi].[groups] AS [g0]
		  ON [g0].[lvl] = 1
		 AND [g0].[g] = [b].[g]
		GROUP BY [g0].[1c_id], DATEFROMPARTS(YEAR([b].[dt]), MONTH([b].[dt]), 1)
	),
	-- Агрегация по месяцам и уровню g1 (lvl=1)
	[lvl1_monthly] AS (
		SELECT
			[g1].[1c_id] AS [group_1c_id],
			DATEFROMPARTS(YEAR([b].[dt]), MONTH([b].[dt]), 1) AS [month_start],
			SUM([b].[qty]) AS [qty_m]
		FROM [base_sales] AS [b]
		JOIN [pbi].[groups] AS [g1]
		  ON [g1].[lvl] = 2
		 AND [g1].[g1] = [b].[g1]
		GROUP BY [g1].[1c_id], DATEFROMPARTS(YEAR([b].[dt]), MONTH([b].[dt]), 1)
	),
	-- Объединяем уровни
	[monthly_union] AS (
		SELECT * FROM [lvl0_monthly]
		UNION ALL
		SELECT * FROM [lvl1_monthly]
	),
	-- Средние по «месяцу года»
	[per_moy] AS (
		SELECT
			[u].[group_1c_id],
			MONTH([u].[month_start]) AS [month],
			AVG([u].[qty_m]) AS [avg_qty_moy]
		FROM [monthly_union] AS [u]
		GROUP BY [u].[group_1c_id], MONTH([u].[month_start])
	),
	-- Общая средняя по группе
	[overall] AS (
		SELECT
			[u].[group_1c_id],
			AVG([u].[qty_m]) AS [overall_avg_monthly]
		FROM [monthly_union] AS [u]
		GROUP BY [u].[group_1c_id]
	),
	-- Черновой коэффициент
	[raw_koef] AS (
		SELECT
			[p].[group_1c_id],
			[p].[month],
			CASE 
				WHEN [o].[overall_avg_monthly] = 0 THEN 0
				ELSE [p].[avg_qty_moy] / [o].[overall_avg_monthly]
			END AS [k_raw]
		FROM [per_moy] AS [p]
		JOIN [overall] AS [o]
		  ON [o].[group_1c_id] = [p].[group_1c_id]
	),
	[norm] AS (
		SELECT
			[r].[group_1c_id],
			[r].[month],
			[r].[k_raw] / NULLIF(AVG([r].[k_raw]) OVER (PARTITION BY [r].[group_1c_id]), 0) AS [seasonal_koef]
		FROM [raw_koef] AS [r]
	)
	INSERT INTO [analytics].[seasonality_groups] ([group_1c_id], [month], [seasonal_koef])
	SELECT [group_1c_id], [month], CAST([seasonal_koef] AS DECIMAL(18,6))
	FROM [norm];

END
GO

/****** Object:  StoredProcedure [analytics].[sp_build_deficit_proposal]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/* =======================================================================
   [analytics].[sp_build_deficit_proposal]
   — Дефицит и рекомендации к заказу с учётом:
     • стартовых остатков (склад + МП),
     • прихода из заказов (4 статуса, включая 'Согласован'),
     • прогноза по сценарию,
     • НЕТ бэк-ордеров: спрос не «копится» ниже нуля,
       остаток считается итеративно и не уходит в минус,
     • размер заказа = прогноз окна [T .. T + @cover_months).
   ======================================================================= */
CREATE PROCEDURE [analytics].[sp_build_deficit_proposal]
    @scenario_id    INT               = 4,              -- ID сценария прогноза
    @group_path     NVARCHAR(255)     = N'',            -- path группы ('' = весь каталог)
    @lead_time_m    INT               = 4,              -- срок поставки (мес.)
    @cover_months   INT               = 6,              -- покрытие (мес.)
    @from_month     DATE              = NULL,           -- старт (1-е число месяца)
    @to_month_excl  DATE              = '2028-01-01',   -- полуинтервал [from, to)
    @debug          BIT               = 0
AS
BEGIN
    SET NOCOUNT ON;

    /* 0) Чистим прошлые данные по сценарию */
    DELETE FROM [analytics].[deficit_proposal] WHERE scenario_id = @scenario_id;

    /* Нормализация параметров */
    SET @group_path = LTRIM(RTRIM(REPLACE(@group_path, '''', N'')));
    IF @from_month IS NULL
        SET @from_month = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);

    /* 1) Календарь */
    IF OBJECT_ID('tempdb..#cal') IS NOT NULL DROP TABLE #cal;
    CREATE TABLE #cal (month_start DATE NOT NULL PRIMARY KEY);
    ;WITH cal AS (
        SELECT @from_month AS month_start
        UNION ALL
        SELECT DATEADD(MONTH, 1, month_start)
        FROM cal
        WHERE month_start < DATEADD(MONTH, -1, @to_month_excl)
    )
    INSERT INTO #cal(month_start)
    SELECT month_start FROM cal
    OPTION (MAXRECURSION 32767);

    /* 2) SKU по group_path */
    IF OBJECT_ID('tempdb..#skus') IS NOT NULL DROP TABLE #skus;
    CREATE TABLE #skus (
        sku_1c_id BINARY(16) NOT NULL PRIMARY KEY,
        code      NVARCHAR(36) NULL,
        minAvail  DECIMAL(18,6) NULL
    );
    INSERT INTO #skus(sku_1c_id, code, minAvail)
    SELECT n.[1c_id], n.[code], n.[minAvailableQty]
    FROM [pbi].[nomenclature] n
    JOIN [pbi].[groups] g ON g.[1c_id] = n.[1c_group]
    WHERE g.[path] LIKE @group_path + N'%';

    IF NOT EXISTS (SELECT 1 FROM #skus)
    BEGIN
        RAISERROR(N'По path=%s не найдено SKU.', 16, 1, @group_path);
        RETURN;
    END

    /* 3) Прогноз по сценарию */
    IF OBJECT_ID('tempdb..#fcast') IS NOT NULL DROP TABLE #fcast;
    CREATE TABLE #fcast (
        sku_1c_id BINARY(16) NOT NULL,
        [month]   DATE NOT NULL,
        qty       DECIMAL(18,3) NOT NULL,
        PRIMARY KEY (sku_1c_id, [month])
    );
    INSERT INTO #fcast(sku_1c_id, [month], qty)
    SELECT f.[1c_id], f.[month], f.[value]
    FROM [analytics].[forecast] f
    JOIN #skus s ON s.sku_1c_id = f.[1c_id]
    WHERE f.[scenario_id] = @scenario_id
      AND f.[month] >= @from_month
      AND f.[month] <  @to_month_excl;

    /* 4) Приходы из заказов (по месяцам) */
    IF OBJECT_ID('tempdb..#inb_status') IS NOT NULL DROP TABLE #inb_status;
    CREATE TABLE #inb_status (
        sku_1c_id BINARY(16) NOT NULL,
        [month]   DATE NOT NULL,
        [status]  NVARCHAR(100) NOT NULL,
        units     DECIMAL(18,3) NOT NULL,
        PRIMARY KEY (sku_1c_id, [month], [status])
    );
    INSERT INTO #inb_status(sku_1c_id, [month], [status], units)
    SELECT
        s.sku_1c_id,
        DATEFROMPARTS(TRY_CONVERT(INT, LEFT(o.[month], 4)),
                      TRY_CONVERT(INT, SUBSTRING(o.[month], 6, 2)), 1),
        o.[status],
        SUM(COALESCE(o.[units], 0.0))
    FROM [analytics].[get_orders_by_group] o
    JOIN #skus s ON s.code = o.[code]
    WHERE o.[status] IN (N'В пути', N'В производстве', N'Выгружен на складе'/*, N'Согласован'*/)
      AND TRY_CONVERT(INT, LEFT(o.[month], 4)) IS NOT NULL
      AND TRY_CONVERT(INT, SUBSTRING(o.[month], 6, 2)) BETWEEN 1 AND 12
    GROUP BY s.sku_1c_id,
             DATEFROMPARTS(TRY_CONVERT(INT, LEFT(o.[month], 4)),
                           TRY_CONVERT(INT, SUBSTRING(o.[month], 6, 2)), 1),
             o.[status];

    IF OBJECT_ID('tempdb..#inb') IS NOT NULL DROP TABLE #inb;
    CREATE TABLE #inb (
        sku_1c_id BINARY(16) NOT NULL,
        [month]   DATE NOT NULL,
        units     DECIMAL(18,3) NOT NULL,
        PRIMARY KEY (sku_1c_id, [month])
    );
    INSERT INTO #inb(sku_1c_id, [month], units)
    SELECT sku_1c_id, [month], SUM(units)
    FROM #inb_status
    WHERE [month] >= @from_month AND [month] < @to_month_excl
    GROUP BY sku_1c_id, [month];

    /* 5) Стартовые остатки: склад + МП */
    IF OBJECT_ID('tempdb..#stock_base') IS NOT NULL DROP TABLE #stock_base;
    CREATE TABLE #stock_base (sku_1c_id BINARY(16) NOT NULL PRIMARY KEY, qty DECIMAL(18,3) NOT NULL);
    INSERT INTO #stock_base(sku_1c_id, qty)
    SELECT s.sku_1c_id, COALESCE(b.qty, 0.0)
    FROM #skus s
    LEFT JOIN (
        SELECT code, SUM(COALESCE(quantity_base,0.0)) AS qty
        FROM [analytics].[get_quantity_by_group]
        GROUP BY code
    ) b ON b.code = s.code;

    IF OBJECT_ID('tempdb..#stock_mp') IS NOT NULL DROP TABLE #stock_mp;
    CREATE TABLE #stock_mp (sku_1c_id BINARY(16) NOT NULL PRIMARY KEY, qty DECIMAL(18,3) NOT NULL);
    INSERT INTO #stock_mp(sku_1c_id, qty)
    SELECT s.sku_1c_id, COALESCE(m.qty, 0.0)
    FROM #skus s
    LEFT JOIN (
        SELECT code, SUM(COALESCE(quantity_base,0.0)) AS qty
        FROM [analytics].[get_mp_quantity_by_group]
        GROUP BY code
    ) m ON m.code = s.code;

    IF OBJECT_ID('tempdb..#stock0') IS NOT NULL DROP TABLE #stock0;
    CREATE TABLE #stock0 (sku_1c_id BINARY(16) NOT NULL PRIMARY KEY, qty DECIMAL(18,3) NOT NULL);
    INSERT INTO #stock0(sku_1c_id, qty)
    SELECT s.sku_1c_id, COALESCE(b.qty,0) + COALESCE(mp.qty,0)
    FROM #skus s
    LEFT JOIN #stock_base b ON b.sku_1c_id = s.sku_1c_id
    LEFT JOIN #stock_mp   mp ON mp.sku_1c_id = s.sku_1c_id;

    /* 6) Лента (сырой спрос/приход) */
    IF OBJECT_ID('tempdb..#tl') IS NOT NULL DROP TABLE #tl;
    CREATE TABLE #tl (
        sku_1c_id BINARY(16) NOT NULL,
        [month]   DATE NOT NULL,
        demand_m  DECIMAL(18,3) NOT NULL,
        inb_m     DECIMAL(18,3) NOT NULL,
        cum_d     DECIMAL(38,3) NULL,   -- кумулятив обслуженного спроса
        cum_i     DECIMAL(38,3) NULL,   -- кумулятив прихода
        net_stock DECIMAL(38,3) NULL,   -- итоговый остаток месяца (>=0)
        served_m  DECIMAL(18,3) NULL,   -- обслуженный спрос в месяце
        lost_m    DECIMAL(18,3) NULL,   -- потерянный спрос в месяце
        PRIMARY KEY (sku_1c_id, [month])
    );
    INSERT INTO #tl(sku_1c_id, [month], demand_m, inb_m)
    SELECT s.sku_1c_id, c.month_start,
           COALESCE(f.qty, 0.0),
           COALESCE(i.units, 0.0)
    FROM #skus s
    CROSS JOIN #cal c
    LEFT JOIN #fcast f ON f.sku_1c_id = s.sku_1c_id AND f.[month] = c.month_start
    LEFT JOIN #inb   i ON i.sku_1c_id = s.sku_1c_id AND i.[month] = c.month_start;

    /* 6.1) Пронумеруем месяцы (для рекурсивного расчёта без бэк-ордеров) */
    IF OBJECT_ID('tempdb..#seq') IS NOT NULL DROP TABLE #seq;
    CREATE TABLE #seq (
        sku_1c_id BINARY(16) NOT NULL,
        [month]   DATE       NOT NULL,
        demand_m  DECIMAL(18,3) NOT NULL,
        inb_m     DECIMAL(18,3) NOT NULL,
        rn        INT NOT NULL,
        PRIMARY KEY (sku_1c_id, rn)
    );
    INSERT INTO #seq(sku_1c_id, [month], demand_m, inb_m, rn)
    SELECT t.sku_1c_id, t.[month], t.demand_m, t.inb_m,
           ROW_NUMBER() OVER (PARTITION BY t.sku_1c_id ORDER BY t.[month])
    FROM #tl t;

    /* 6.2) Рекурсивный расчёт: served/lost/net_stock (без накопления спроса ниже нуля) */
    IF OBJECT_ID('tempdb..#flow') IS NOT NULL DROP TABLE #flow;
    CREATE TABLE #flow(
        sku_1c_id BINARY(16) NOT NULL,
        rn        INT NOT NULL,
        [month]   DATE NOT NULL,
        demand_m  DECIMAL(18,3) NOT NULL,
        inb_m     DECIMAL(18,3) NOT NULL,
        served_m  DECIMAL(18,3) NOT NULL,
        lost_m    DECIMAL(18,3) NOT NULL,
        net_stock DECIMAL(38,3) NOT NULL,
        PRIMARY KEY (sku_1c_id, rn)
    );

    ;WITH r AS (
        /* первый месяц */
        SELECT
            s.sku_1c_id, s.rn, s.[month], s.demand_m, s.inb_m,
            CAST(
                CASE WHEN st.qty + s.inb_m >= s.demand_m
                     THEN s.demand_m
                     ELSE st.qty + s.inb_m
                END
            AS DECIMAL(18,3)) AS served_m,
            CAST(
                CASE WHEN st.qty + s.inb_m >= s.demand_m
                     THEN 0.0
                     ELSE s.demand_m - (st.qty + s.inb_m)
                END
            AS DECIMAL(18,3)) AS lost_m,
            CAST(
                CASE WHEN st.qty + s.inb_m - s.demand_m < 0
                     THEN 0
                     ELSE st.qty + s.inb_m - s.demand_m
                END
            AS DECIMAL(38,3)) AS net_stock
        FROM #seq s
        JOIN #stock0 st ON st.sku_1c_id = s.sku_1c_id
        WHERE s.rn = 1

        UNION ALL

        /* последующие месяцы */
        SELECT
            s.sku_1c_id, s.rn, s.[month], s.demand_m, s.inb_m,
            CAST(
                CASE WHEN r.net_stock + s.inb_m >= s.demand_m
                     THEN s.demand_m
                     ELSE r.net_stock + s.inb_m
                END
            AS DECIMAL(18,3)) AS served_m,
            CAST(
                CASE WHEN r.net_stock + s.inb_m >= s.demand_m
                     THEN 0.0
                     ELSE s.demand_m - (r.net_stock + s.inb_m)
                END
            AS DECIMAL(18,3)) AS lost_m,
            CAST(
                CASE WHEN r.net_stock + s.inb_m - s.demand_m < 0
                     THEN 0
                     ELSE r.net_stock + s.inb_m - s.demand_m
                END
            AS DECIMAL(38,3)) AS net_stock
        FROM r
        JOIN #seq s
          ON s.sku_1c_id = r.sku_1c_id
         AND s.rn = r.rn + 1
    )
    INSERT INTO #flow
    SELECT * FROM r
    OPTION (MAXRECURSION 32767);

    /* 6.3) Обновим #tl: кумулятивы по обслуженному спросу/приходу и итоговый остаток */
    ;WITH cd AS (
        SELECT f.sku_1c_id, s.[month],
               SUM(f.served_m) OVER (PARTITION BY f.sku_1c_id ORDER BY f.rn ROWS UNBOUNDED PRECEDING) AS cum_d_served,
               SUM(s.inb_m)    OVER (PARTITION BY s.sku_1c_id ORDER BY s.rn ROWS UNBOUNDED PRECEDING) AS cum_i_raw,
               f.net_stock, f.served_m, f.lost_m
        FROM #flow f
        JOIN #seq  s ON s.sku_1c_id = f.sku_1c_id AND s.rn = f.rn
    )
    UPDATE t
       SET t.cum_d     = cd.cum_d_served,
           t.cum_i     = cd.cum_i_raw,
           t.net_stock = cd.net_stock,
           t.served_m  = cd.served_m,
           t.lost_m    = cd.lost_m
    FROM #tl t
    JOIN cd ON cd.sku_1c_id = t.sku_1c_id AND cd.[month] = t.[month];

    /* 7) Первый месяц дефицита T (учитываем lead_time) */
    DECLARE @start_T DATE =
        DATEFROMPARTS(YEAR(DATEADD(MONTH, @lead_time_m, @from_month)),
                      MONTH(DATEADD(MONTH, @lead_time_m, @from_month)), 1);

    IF OBJECT_ID('tempdb..#first_def') IS NOT NULL DROP TABLE #first_def;
    CREATE TABLE #first_def (sku_1c_id BINARY(16) NOT NULL PRIMARY KEY, T DATE NULL);

    INSERT INTO #first_def(sku_1c_id, T)
    SELECT d.sku_1c_id, MIN(d.[month]) AS T
    FROM (
        SELECT t.sku_1c_id, t.[month]
        FROM #tl t
        JOIN #skus s ON s.sku_1c_id = t.sku_1c_id
        WHERE t.net_stock < COALESCE(s.minAvail, 0.0)
          AND t.[month]   >= @start_T
    ) d
    GROUP BY d.sku_1c_id;

    /* 8) Якоря: T, T+C, T+2C ... */
    IF OBJECT_ID('tempdb..#anchors') IS NOT NULL DROP TABLE #anchors;
    CREATE TABLE #anchors (
        sku_1c_id BINARY(16) NOT NULL,
        T DATE NOT NULL,
        PRIMARY KEY (sku_1c_id, T)
    );
    ;WITH recur AS (
        SELECT fd.sku_1c_id, fd.T
        FROM #first_def fd
        WHERE fd.T IS NOT NULL

        UNION ALL
        SELECT r.sku_1c_id, DATEADD(MONTH, @cover_months, r.T)
        FROM recur r
        WHERE DATEADD(MONTH, @cover_months, r.T) < @to_month_excl
    )
    INSERT INTO #anchors(sku_1c_id, T)
    SELECT sku_1c_id, T
    FROM recur
    OPTION (MAXRECURSION 32767);

    /* 9) Подготовка строк к вставке (размер заказа = прогноз окна) */
    IF OBJECT_ID('tempdb..#rows_to_insert') IS NOT NULL DROP TABLE #rows_to_insert;
    CREATE TABLE #rows_to_insert (
        [scenario_id] INT,
        [group_name]  NVARCHAR(255),
        [1c_id]       BINARY(16),
        [code]        NVARCHAR(36),
        [place_month] DATE,
        [arrival_month] DATE,
        [demand_window_C] DECIMAL(18,3),
        [projected_stock_at_T] DECIMAL(18,3),
        [order_qty] DECIMAL(18,3)
    );

    ;WITH base AS (
        SELECT
            s.sku_1c_id,
            s.code,
            a.T,
            st.qty AS stock0,

            /* прогноз окна [T .. T+C) */
            (SELECT SUM(demand_m)
             FROM #tl z
             WHERE z.sku_1c_id = s.sku_1c_id
               AND z.[month] >= a.T
               AND z.[month] <  DATEADD(MONTH, @cover_months, a.T)
            ) AS demand_window,

            /* кумулятивы до T-1 (обслуженный спрос и приход) */
            (SELECT TOP (1) z.cum_i
             FROM #tl z
             WHERE z.sku_1c_id = s.sku_1c_id
               AND z.[month]   < a.T
             ORDER BY z.[month] DESC
            ) AS cum_i_before,

            (SELECT TOP (1) z.cum_d
             FROM #tl z
             WHERE z.sku_1c_id = s.sku_1c_id
               AND z.[month]   < a.T
             ORDER BY z.[month] DESC
            ) AS cum_d_before,

            /* приход именно в T */
            (SELECT SUM(inb_m)
             FROM #tl z
             WHERE z.sku_1c_id = s.sku_1c_id
               AND z.[month]   = a.T
            ) AS inb_t
        FROM #anchors a
        JOIN #skus   s  ON s.sku_1c_id  = a.sku_1c_id
        JOIN #stock0 st ON st.sku_1c_id = s.sku_1c_id
    )
    INSERT INTO #rows_to_insert
    SELECT
        @scenario_id,
        @group_path,
        b.sku_1c_id,
        b.code,
        DATEADD(MONTH, -@lead_time_m, b.T) AS place_month,
        b.T AS arrival_month,
        CAST(ISNULL(b.demand_window,0) AS DECIMAL(18,3)) AS demand_window_C,

        /* старт на T (после прихода T), снизу 0 */
        CAST(
            CASE
                WHEN ( ISNULL(b.stock0,0)
                     + ISNULL(b.cum_i_before,0)
                     + ISNULL(b.inb_t,0)
                     - ISNULL(b.cum_d_before,0) ) < 0
                    THEN 0
                ELSE ( ISNULL(b.stock0,0)
                     + ISNULL(b.cum_i_before,0)
                     + ISNULL(b.inb_t,0)
                     - ISNULL(b.cum_d_before,0) )
            END
        AS DECIMAL(18,3)) AS projected_stock_at_T,

        /* размер заказа = прогноз окна */
        CAST(ISNULL(b.demand_window,0) AS DECIMAL(18,3)) AS order_qty
    FROM base AS b;

    /* 10) Вставка рекомендаций (незначащие — отбрасываем) */
    INSERT INTO [analytics].[deficit_proposal]
        ([scenario_id], [group_name], [1c_id], [code],
         [place_month], [arrival_month],
         [demand_window_C], [projected_stock_at_T], [order_qty],
         [updated_at])
    SELECT
        scenario_id, group_name, [1c_id], [code],
        [place_month], [arrival_month],
        [demand_window_C], [projected_stock_at_T], [order_qty],
        GETDATE()
    FROM #rows_to_insert
    WHERE [order_qty] > 0;

    /* 11) Отладка по желанию */
    IF @debug = 1
    BEGIN
        SELECT TOP (200)
               r.[code], r.[arrival_month], r.[place_month],
               r.[projected_stock_at_T], r.[demand_window_C], r.[order_qty]
        FROM #rows_to_insert r
        ORDER BY r.[arrival_month], r.[code];
    END
END
GO

/****** Object:  StoredProcedure [analytics].[sp_build_forecast_s4_by_group]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_build_forecast_s4_by_group]
    @path               NVARCHAR(255),              -- путь группы (например, N'Игрушки')
    @from_month         DATE = NULL,                -- по умолчанию: 1-е число текущего месяца
    @to_month_excl      DATE = '2028-01-01',        -- полуинтервал [from, to)
    @scenario_id        INT  = 4,
    @allow_fallback_all BIT  = 0                    -- 1 = если группа не найдена/пустая → считать весь каталог с дефолтной сезонностью
AS
BEGIN
    SET NOCOUNT ON;

    ----------------------------------------------------------------
    -- Нормализация пути: убираем лишние кавычки и пробелы
    ----------------------------------------------------------------
    SET @path = LTRIM(RTRIM(REPLACE(@path, '''', N'')));

    IF @from_month IS NULL
        SET @from_month = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);

    ----------------------------------------------------------------
    -- Идентификаторы групп для сезонности
    ----------------------------------------------------------------
    DECLARE @season_group_id   BINARY(16) = NULL;
    DECLARE @DEFAULT_GROUP_ID  BINARY(16) = 0x00000000000000000000000000000000;

    -- Пытаемся найти группу ровно по path
    SELECT @season_group_id = g.[1c_id]
    FROM [pbi].[groups] g
    WHERE g.[path] = @path;

    -- Если нет точного совпадения, ищем верхний узел, начинающийся с @path
    IF @season_group_id IS NULL
    BEGIN
        SELECT TOP (1) @season_group_id = g.[1c_id]
        FROM [pbi].[groups] g
        WHERE g.[path] LIKE @path + N'%'
        ORDER BY g.[lvl] ASC;
    END

    -- Если группу так и не нашли: по умолчанию НЕ уходим на весь каталог (защита от опечаток)
    IF @season_group_id IS NULL AND @allow_fallback_all = 0
    BEGIN
        RAISERROR (N'Группа с path = %s не найдена. Проверьте параметр @path или запустите с @allow_fallback_all=1 для расчёта по всему каталогу.', 16, 1, @path);
        RETURN;
    END

    -- Если всё-таки нужно фолбэкнуть на дефолтную сезонность
    IF @season_group_id IS NULL AND @allow_fallback_all = 1
        SET @season_group_id = @DEFAULT_GROUP_ID;

    ----------------------------------------------------------------
    -- TEMP: календарь месяцев [from, to)
    ----------------------------------------------------------------
    IF OBJECT_ID('tempdb..#cal') IS NOT NULL DROP TABLE #cal;
    CREATE TABLE #cal (month_start DATE NOT NULL PRIMARY KEY);

    ;WITH cal AS (
        SELECT @from_month AS month_start
        UNION ALL
        SELECT DATEADD(MONTH, 1, month_start)
        FROM cal
        WHERE month_start < DATEADD(MONTH, -1, @to_month_excl)
    )
    INSERT INTO #cal(month_start)
    SELECT month_start FROM cal
    OPTION (MAXRECURSION 32767);

    ----------------------------------------------------------------
    -- TEMP: SKU под деревом @path; если пусто и разрешён фолбэк → все SKU
    ----------------------------------------------------------------
    IF OBJECT_ID('tempdb..#skus') IS NOT NULL DROP TABLE #skus;
    CREATE TABLE #skus (
        sku_1c_id  BINARY(16) NOT NULL PRIMARY KEY,
        code       NVARCHAR(36) NULL
    );

    INSERT INTO #skus(sku_1c_id, code)
    SELECT n.[1c_id], n.[code]
    FROM [pbi].[nomenclature] n
    JOIN [pbi].[groups] g ON g.[1c_id] = n.[1c_group]
    WHERE g.[path] LIKE @path + N'%'
    OPTION (RECOMPILE);

    IF NOT EXISTS (SELECT 1 FROM #skus)
    BEGIN
        IF @allow_fallback_all = 1
        BEGIN
            INSERT INTO #skus(sku_1c_id, code)
            SELECT n.[1c_id], n.[code]
            FROM [pbi].[nomenclature] n;
            SET @season_group_id = @DEFAULT_GROUP_ID;
        END
        ELSE
        BEGIN
            RAISERROR (N'По path = %s не найдено ни одного SKU. Расчёт не выполнялся.', 16, 1, @path);
            RETURN;
        END
    END

    ----------------------------------------------------------------
    -- TEMP: ставки продаж (шт/день)
    ----------------------------------------------------------------
    IF OBJECT_ID('tempdb..#rate') IS NOT NULL DROP TABLE #rate;
    CREATE TABLE #rate (
        sku_1c_id    BINARY(16) NOT NULL PRIMARY KEY,
        rate_per_day DECIMAL(38,6) NOT NULL
    );

    INSERT INTO #rate(sku_1c_id, rate_per_day)
    SELECT a.[1c_id], ISNULL(a.[Продажи шт / день],0)
    FROM [analytics].[аналитика за 365 дн.] a
    JOIN #skus s ON s.sku_1c_id = a.[1c_id];

    ----------------------------------------------------------------
    -- TEMP: сезонность ТОЛЬКО по @season_group_id; если нет строк — используем дефолт
    ----------------------------------------------------------------
    IF OBJECT_ID('tempdb..#season') IS NOT NULL DROP TABLE #season;
    CREATE TABLE #season (
        [month]        TINYINT NOT NULL PRIMARY KEY,   -- 1..12
        seasonal_koef  DECIMAL(18,6) NOT NULL
    );
    INSERT INTO #season([month], seasonal_koef)
    SELECT
		[month]
		, ISNULL(AVG([koef]), 1.0)
	FROM [mag_pbi].[analytics].[seasonality_groups_summ_1]
	GROUP BY [month];

    /*IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO #season([month], seasonal_koef)
        SELECT sg.[month], sg.[seasonal_koef]
        FROM [analytics].[seasonality_groups] sg
        WHERE sg.[group_1c_id] = @DEFAULT_GROUP_ID;
        -- если и дефолта нет, #season останется пустой → в формуле будет 1.0
    END
	*/
    ----------------------------------------------------------------
    -- Удаляем старые строки сценария (батчами, чтобы не держать тяжёлые блокировки)
    ----------------------------------------------------------------
    WHILE 1 = 1
    BEGIN
        DELETE TOP (50000) f
        FROM [analytics].[forecast] f
        JOIN #skus s ON s.sku_1c_id = f.[1c_id]
        WHERE f.[scenario_id] = @scenario_id
          AND f.[month] >= @from_month
          AND f.[month] <  @to_month_excl;

        IF @@ROWCOUNT = 0 BREAK;
    END

    ----------------------------------------------------------------
    -- Вставка прогноза: rate_per_day × дни_в_месяце × seasonal_koef(@path/@default)
    ----------------------------------------------------------------
    INSERT INTO [analytics].[forecast]
        ([scenario_id], [1c_id], [code], [month], [value], [updated_at], [updated_by])
    SELECT
        @scenario_id,
        s.sku_1c_id,
        s.code,
        c.month_start,
        CAST(ISNULL(r.rate_per_day, 0)
             * DAY(EOMONTH(c.month_start))
             * ISNULL(se.seasonal_koef, 1.0) AS DECIMAL(18,3)) AS value,
        GETDATE(),
        SUSER_SNAME()
    FROM #skus s
    CROSS JOIN #cal c
    LEFT JOIN #rate   r  ON r.sku_1c_id = s.sku_1c_id
    LEFT JOIN #season se ON se.[month] = MONTH(c.month_start)
    OPTION (RECOMPILE);
END
GO

/****** Object:  StoredProcedure [analytics].[sp_create_analytics_365]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_create_analytics_365]
AS
BEGIN
    /*
    ... твой закомментированный блок без изменений ...
    */

    -------------------------------------------------------------
    -- 1) Базовая таблица аналитики за 365 дней
    -------------------------------------------------------------
    DROP TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]

    SELECT
        s.[1c_id],
        s.Code,
        SUM(s.Количество) as [Продано шт]
    INTO [mag_pbi].[analytics].[аналитика за 365 дн.]
    FROM [pbiProd].[СводныйСебестоимость Для PBI] s
    WHERE s.Статья = N'Реализация'
      AND s.[Период] >= DATEADD(day, -365, GETDATE())
    GROUP BY [1c_id], s.Code;


    -------------------------------------------------------------
    -- 2) Продажи шт / день
    -------------------------------------------------------------
    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Продажи шт / день') IS NULL
    BEGIN
        ALTER TABLE [analytics].[аналитика за 365 дн.]
        ADD [Продажи шт / день] numeric(38,6) NULL;
        /*ALTER TABLE [analytics].[аналитика за 365 дн.]
        ADD [Продажи шт / день опт] numeric(38,6) NULL;*/
    END;

    ;WITH bounds AS (
        SELECT
            CAST(DATEADD(day, -365, CAST(GETDATE() AS date)) AS date) AS start_date,
            CAST(GETDATE() AS date) AS end_date
    ),
    days365 AS (
        SELECT
            t.[_IDRREF] AS [1c_id],
            SUM(t.[ostatok]) AS days_on_sale_365
            --SUM(t.[ostatok10]) AS days_on_sale_365_opt
        FROM [pbi].[w_ostatok_da_net] t
        CROSS JOIN bounds b
        WHERE t.[dt] >= b.start_date
          AND t.[dt] <  b.end_date      -- исключаем текущий день
        GROUP BY t.[_IDRREF]
    )
    UPDATE a
    SET 
    
        [Продажи шт / день] =
        CASE
            WHEN d.days_on_sale_365 > 0
                THEN CAST(a.[Продано шт] AS numeric(38,6)) / CAST(d.days_on_sale_365 AS numeric(38,6))
            ELSE NULL
        END

        /*[Продажи шт / день опт] =
        CASE
            WHEN d.days_on_sale_365_opt > 0
                THEN CAST(a.[Продано шт] AS numeric(38,6)) / CAST(d.days_on_sale_365_opt AS numeric(38,6))
            ELSE NULL
        END*/

    FROM [analytics].[аналитика за 365 дн.] a
    LEFT JOIN days365 d
        ON d.[1c_id] = a.[1c_id];

   

    -------------------------------------------------------------
    -- 3) Остаток дней продаж
    -------------------------------------------------------------
    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Остаток дней продаж') IS NULL
    BEGIN
        ALTER TABLE [analytics].[аналитика за 365 дн.]
        ADD [Остаток дней продаж] numeric(38,6) NULL;
        /*ALTER TABLE [analytics].[аналитика за 365 дн.]
        ADD [Остаток дней продаж опт] numeric(38,6) NULL;*/
    END;

    UPDATE a
    SET 
        [Остаток дней продаж] =
        CASE 
            WHEN a.[Продажи шт / день] > 0 
                 THEN sb.[Остаток склад + МП, шт] / a.[Продажи шт / день]
            ELSE NULL
        END

        /*[Остаток дней продаж опт] =
        CASE 
            WHEN a.[Продажи шт / день опт] > 0 
                 THEN sb.[Остаток склад + МП, шт] / a.[Продажи шт / день опт]
            ELSE NULL
        END*/
    FROM [analytics].[аналитика за 365 дн.] a
    LEFT JOIN (
        SELECT 
            n.[1c_id],
            s.[Остаток склад + МП, шт]
        FROM [mag_pbi].[analytics].[stock_balance] s
        INNER JOIN [mag_pbi].[pbi].[nomenclature] n
            ON n.artic_id = s.artic_id
    ) sb
        ON sb.[1c_id] = a.[1c_id];




    -------------------------------------------------------------
    -- 4) Сумма продаж, учетка, ТН (год)
    -------------------------------------------------------------
    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Продажи / год, руб.') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Продажи / год, руб.] decimal(38,2) NULL;
    END;

    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'учетная сумма / год, руб.') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [учетная сумма / год, руб.] decimal(38,2) NULL;
    END;

    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'ТН / год, руб.') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [ТН / год, руб.] decimal(38,2) NULL;
    END;

    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Стоимость МП год, руб.') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Стоимость МП год, руб.] decimal(38,2) NULL;
    END;

    IF COL_LENGTH('analytics.аналитика за 365 дн.', '%ТН год, руб.') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [%ТН год, руб.] decimal(38,2) NULL;
    END;

    DECLARE @end   date = CAST(GETDATE() AS date);      -- сегодня (не включаем)
    DECLARE @start date = DATEADD(day, -365, @end);     -- 365 дней назад

    ;WITH Y AS (
        SELECT
            v.[1c_id],
            SUM(v.[Сумма продаж])        AS sales_year,
            SUM(v.[Учетная сумма])       AS acct_year,
            SUM(v.[Стоимость обработки]) AS cost_mp,
            SUM(v.[Торговая надбавка])   AS tn_year
        FROM [analytics].[Продажи_Учёт_Маржа_по_дням] v
        WHERE v.[d] >= @start AND v.[d] < @end
        GROUP BY v.[1c_id]
    )
    UPDATE a
    SET
        a.[Продажи / год, руб.]        = COALESCE(Y.sales_year, 0),
        a.[учетная сумма / год, руб.]  = COALESCE(Y.acct_year, 0),
        a.[ТН / год, руб.]             = COALESCE(Y.tn_year, 0),
        a.[Стоимость МП год, руб.]     = COALESCE(Y.cost_mp, 0),
        a.[%ТН год, руб.] = CASE 
            WHEN NULLIF(COALESCE(Y.acct_year, 0), 0) IS NULL THEN NULL
            ELSE 
                CAST(COALESCE(Y.tn_year, 0) AS decimal(19,6))
                / CAST(NULLIF(Y.acct_year, 0) AS decimal(19,6))
        END
    FROM [mag_pbi].[analytics].[аналитика за 365 дн.] AS a
    LEFT JOIN Y
      ON Y.[1c_id] = a.[1c_id];


    -------------------------------------------------------------
    -- 5) Дней в продаже / год и / квартал
    -------------------------------------------------------------
    SET @end = CAST(GETDATE() AS date);

    DECLARE @startY date = DATEADD(day,  -365, @end);
    DECLARE @startQ date = DATEADD(month, -3, @end);

    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Дней в продаже / год') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Дней в продаже / год] bigint NULL;
    END;

    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Дней в продаже / квартал') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Дней в продаже / квартал] bigint NULL;
    END;
    
    ;WITH daysY AS (
        SELECT [_IDRREF] AS [1c_id],
               COUNT_BIG(*) AS days_in_sale_year
        FROM [pbi].[w_ostatok_da_net] 
        WHERE [dt] >= @startY AND [dt] < @end
          AND [ostatok] >= 1
        GROUP BY [_IDRREF]
    ),
    daysQ AS (
        SELECT [_IDRREF] AS [1c_id],
               COUNT_BIG(*) AS days_in_sale_quarter
        FROM [pbi].[w_ostatok_da_net]
        WHERE [dt] >= @startQ AND [dt] < @end
          AND [ostatok] >= 1
        GROUP BY [_IDRREF]
    ),
    days AS (
        SELECT COALESCE(y.[1c_id], q.[1c_id]) AS [1c_id],
               y.days_in_sale_year,
               q.days_in_sale_quarter
        FROM daysY y
        FULL OUTER JOIN daysQ q ON q.[1c_id] = y.[1c_id]
    )
    UPDATE a
    SET
        a.[Дней в продаже / год]      = d.days_in_sale_year,
        a.[Дней в продаже / квартал]  = d.days_in_sale_quarter
    FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a
    LEFT JOIN days d
      ON d.[1c_id] = a.[1c_id];

    -------------------------------------------------------------
    -- 6) Сумма продаж, учетка, ТН (квартал)
    -------------------------------------------------------------
    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Продажи / квартал, руб.') IS NULL
    BEGIN
        ALTER TABLE [analytics].[аналитика за 365 дн.]
        ADD [Продажи / квартал, руб.] decimal(38,2) NULL;
    END;

    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'учетная сумма / квартал, руб.') IS NULL
    BEGIN
        ALTER TABLE [analytics].[аналитика за 365 дн.]
        ADD [учетная сумма / квартал, руб.] decimal(38,2) NULL;
    END;

    IF COL_LENGTH('analytics.аналитика за 365 дн.', 'ТН / квартал, руб.') IS NULL
    BEGIN
        ALTER TABLE [analytics].[аналитика за 365 дн.]
        ADD [ТН / квартал, руб.] decimal(38,2) NULL;
    END;

    SET @start = DATEADD(month, -3, @end);

    ;WITH Q AS (
        SELECT
            v.[1c_id],
            SUM(v.[Сумма продаж])      AS sales_q,
            SUM(v.[Учетная сумма])     AS acct_q,
            SUM(v.[Торговая надбавка]) AS tn_q
        FROM [analytics].[Продажи_Учёт_Маржа_по_дням] v
        WHERE v.[d] >= @start AND v.[d] < @end
        GROUP BY v.[1c_id]
    )
    UPDATE a
    SET
        a.[Продажи / квартал, руб.]        = Q.sales_q,
        a.[учетная сумма / квартал, руб.]  = Q.acct_q,
        a.[ТН / квартал, руб.]             = Q.tn_q
    FROM [analytics].[аналитика за 365 дн.] AS a
    LEFT JOIN Q
      ON Q.[1c_id] = a.[1c_id];


    -------------------------------------------------------------
    -- 7) ТН / месяц (по текущей скорости)
    -------------------------------------------------------------
    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'ТН / месяц, руб.') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [ТН / месяц, руб.] decimal(38,6) NULL;
    END;

    UPDATE a
    SET a.[ТН / месяц, руб.] =
          ISNULL(a.[ТН / год, руб.], 0) 
          / NULLIF(a.[Продано шт], 0) 
          * ISNULL(a.[Продажи шт / день], 0) 
          * 30
    FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a;


    -------------------------------------------------------------------------------------
    -- 8) ДОПОЛНИТЕЛЬНО: Оплаченный остаток и рентабельности (ROIC и по остатку в руб.)
    --      (год назад, квартал назад и на будущий год) по 12-месячному окну
    -------------------------------------------------------------------------------------

    -- новые колонки
    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Оплаченный остаток') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Оплаченный остаток] decimal(38,2) NULL;
    END;

    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность / год') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Рентабельность / год] decimal(38,6) NULL;
    END;

    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность / квартал') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Рентабельность / квартал] decimal(38,6) NULL;
    END;

    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность / будущий год') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Рентабельность / будущий год] decimal(38,6) NULL;
    END;

    -- новые поля рентабельности по остатку в рублях (сразу в %)
    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность по остатку / год') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Рентабельность по остатку / год] decimal(38,6) NULL;
    END;

    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность по остатку / квартал') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Рентабельность по остатку / квартал] decimal(38,6) NULL;
    END;

    IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность по остатку / будущий год') IS NULL
    BEGIN
        ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
        ADD [Рентабельность по остатку / будущий год] decimal(38,6) NULL;
    END;

    ---------------------------------------------------------
    -- 8.1 Окно 12 полных месяцев
    ---------------------------------------------------------
    DECLARE @mp_today           date = CAST(GETDATE() AS date);
    DECLARE @mp_lastFullMonth   date = EOMONTH(DATEADD(month, -1, @mp_today));
    DECLARE @mp_firstMonthStart date = DATEADD(
                                         month, -11,
                                         DATEFROMPARTS(YEAR(@mp_lastFullMonth), MONTH(@mp_lastFullMonth), 1)
                                       );
    DECLARE @mp_curMonthStart   date = @mp_firstMonthStart;

    IF OBJECT_ID('tempdb..#mp_months') IS NOT NULL DROP TABLE #mp_months;
    CREATE TABLE #mp_months (
        MonthStart date NOT NULL PRIMARY KEY
    );

    WHILE @mp_curMonthStart <= DATEFROMPARTS(YEAR(@mp_lastFullMonth), MONTH(@mp_lastFullMonth), 1)
    BEGIN
        INSERT INTO #mp_months (MonthStart) VALUES (@mp_curMonthStart);
        SET @mp_curMonthStart = DATEADD(month, 1, @mp_curMonthStart);
    END;

    ---------------------------------------------------------
    -- 8.2 Набор SKU из аналитики 365
    ---------------------------------------------------------
    IF OBJECT_ID('tempdb..#mp_s') IS NOT NULL DROP TABLE #mp_s;
    CREATE TABLE #mp_s(
        [1c_id] binary(16) NOT NULL,
        code    nchar(11)  NOT NULL,
        CONSTRAINT PK_mp_s PRIMARY KEY ([1c_id], code)
    );

    INSERT INTO #mp_s([1c_id], code)
    SELECT DISTINCT a.[1c_id], a.[Code]
    FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a;

    ---------------------------------------------------------
    -- 8.3 Внешние остатки
    ---------------------------------------------------------
    IF OBJECT_ID('tempdb..#mp_ext_stock') IS NOT NULL DROP TABLE #mp_ext_stock;
    CREATE TABLE #mp_ext_stock(
        Dt   date          NOT NULL,
        code nchar(11)     NOT NULL,
        qty  numeric(18,3) NOT NULL,
        CONSTRAINT PK_mp_ext_stock PRIMARY KEY (Dt, code)
    );

    INSERT INTO #mp_ext_stock (Dt, code, qty)
    SELECT
          CAST(o.[Дата обновления] AS date) AS Dt,
          o.code,
          SUM(o.[Количество])              AS qty
    FROM analytics.[Внешние остатки] o
    JOIN #mp_s s
        ON s.code = o.code
    GROUP BY CAST(o.[Дата обновления] AS date), o.code;

    ---------------------------------------------------------
    -- 8.4 Приходы (Закупка / Приход)
    ---------------------------------------------------------
    IF OBJECT_ID('tempdb..#mp_incoming') IS NOT NULL DROP TABLE #mp_incoming;
    CREATE TABLE #mp_incoming(
        MonthStart date          NOT NULL,
        [1c_id]    binary(16)    NOT NULL,
        qty        numeric(18,3) NOT NULL,
        CONSTRAINT PK_mp_incoming PRIMARY KEY (MonthStart, [1c_id])
    );

    INSERT INTO #mp_incoming (MonthStart, [1c_id], qty)
    SELECT
          DATEFROMPARTS(YEAR(s.[Период]), MONTH(s.[Период]), 1) AS MonthStart,
          s.[1c_id],
          SUM(s.[Количество])                                   AS qty
    FROM pbiProd.[СводныйСебестоимость Для PBI] s
    JOIN #mp_s sf
        ON sf.[1c_id] = s.[1c_id]
    WHERE s.[Статья]       = N'Закупка'
      AND s.[Вид операции] = N'Приход'
      AND s.[Период]      >= @mp_firstMonthStart
    GROUP BY
          DATEFROMPARTS(YEAR(s.[Период]), MONTH(s.[Период]), 1),
          s.[1c_id];

    ---------------------------------------------------------
    -- 8.5 Обязательства по месяцам
    ---------------------------------------------------------
    IF OBJECT_ID('tempdb..#mp_obligations') IS NOT NULL DROP TABLE #mp_obligations;
    CREATE TABLE #mp_obligations(
        MonthStart date          NOT NULL,
        [1c_id]    binary(16)    NOT NULL,
        obligation numeric(18,2) NOT NULL,
        CONSTRAINT PK_mp_obligations PRIMARY KEY (MonthStart, [1c_id])
    );

    -- 8.5 Обязательства: считаем по manufacturer_payment_stage (поддержка 2, 3 и более этапов)
    -- Этап «оплачен», если конец месяца M >= дата прихода + days. Сумма этапа = full_sum * percent/100.
    -- Два шага через CTE, чтобы избежать Msg 8124 (correlated subquery с несколькими внешними ссылками).
    ;WITH base_oblig AS (
        SELECT
              m.MonthStart,
              inc.MonthStart AS inc_month,
              inc.[1c_id],
              inc.qty * n2.[Цена учетная, руб] AS full_sum,
              EOMONTH(inc.MonthStart) AS inc_eom,
              EOMONTH(m.MonthStart) AS eval_eom,
              man.id AS manufacturer_id
        FROM #mp_months m
        JOIN #mp_incoming inc ON 1 = 1
        JOIN pbi.nomenclature n2 ON n2.[1c_id] = inc.[1c_id]
        LEFT JOIN analytics.manufacturers man ON man.[manufacturer] = n2.Производитель
    ),
    oblig_with_paid AS (
        SELECT
              b.MonthStart,
			  b.eval_eom,
              b.inc_eom,
              b.[1c_id],
              b.full_sum,
              ISNULL(SUM(
                  CASE WHEN b.eval_eom >= DATEADD(day, st.[days], b.inc_eom)
                       THEN b.full_sum * st.[percent] / 100.0 ELSE 0 END
              ), 0) AS paid_to_month
        FROM base_oblig b
        LEFT JOIN analytics.manufacturer_payment_stage st ON st.manufacturer_id = b.manufacturer_id
        GROUP BY b.MonthStart, b.inc_month, b.[1c_id], b.full_sum, b.eval_eom, b.inc_eom, b.manufacturer_id
    ),
    ObligRows AS (
        SELECT
              MonthStart,
              [1c_id],
              CASE
                  WHEN eval_eom < inc_eom THEN 0
                  WHEN full_sum - paid_to_month > 0 THEN full_sum - paid_to_month
                  ELSE 0
              END AS ObligationPerIncoming
        FROM oblig_with_paid
    )
    INSERT INTO #mp_obligations (MonthStart, [1c_id], obligation)
    SELECT
          MonthStart,
          [1c_id],
          SUM(ObligationPerIncoming) AS obligation
    FROM ObligRows
    GROUP BY
          MonthStart,
          [1c_id];

    ---------------------------------------------------------
    -- 8.6 ТН по месяцам
    ---------------------------------------------------------
    IF OBJECT_ID('tempdb..#mp_tn_monthly') IS NOT NULL DROP TABLE #mp_tn_monthly;

    CREATE TABLE #mp_tn_monthly(
        MonthStart date          NOT NULL,
        [1c_id]    binary(16)    NOT NULL,
        tn_amount  numeric(18,2) NULL,
        CONSTRAINT PK_mp_tn_monthly PRIMARY KEY (MonthStart, [1c_id])
    );

    INSERT INTO #mp_tn_monthly (MonthStart, [1c_id], tn_amount)
    SELECT
          DATEFROMPARTS(YEAR(p.[d]), MONTH(p.[d]), 1) AS MonthStart,
          p.[1c_id],
          SUM(ISNULL(p.[Торговая надбавка],0))       AS tn_amount
    FROM [mag_pbi].[analytics].[Продажи_Учёт_Маржа_по_дням] p
    JOIN #mp_s s
        ON s.[1c_id] = p.[1c_id]
    WHERE p.[d] >= @mp_firstMonthStart
      AND p.[d] <= @mp_lastFullMonth
    GROUP BY
          DATEFROMPARTS(YEAR(p.[d]), MONTH(p.[d]), 1),
          p.[1c_id];

    ---------------------------------------------------------
    -- 8.7 Помесячный план по всем SKU (остаток, оплаченный остаток, ТН, рубли-дни, остаток учетка руб)
    ---------------------------------------------------------
    IF OBJECT_ID('tempdb..#mp_plan') IS NOT NULL DROP TABLE #mp_plan;

    SELECT
          s.[1c_id],
          s.code,
          m.MonthStart,
          [Остаток шт] =
              ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0),
          [Остаток учетка руб] =
              (ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0))
              * ISNULL(n.[Цена учетная, руб], 0),
          [Оплаченный остаток] =
              CAST(
                  CASE 
                      WHEN paid_raw < 0 THEN 0
                      ELSE paid_raw
                  END
                  AS decimal(18,2)
              ),
          [ТН] = ISNULL(tn.tn_amount, 0),
          [рубли-дни] =
              CAST(
                  CASE 
                      WHEN paid_raw < 0 THEN 0
                      ELSE paid_raw
                  END * DAY(EOMONTH(m.MonthStart))
                  AS decimal(18,2)
              )
    INTO #mp_plan
    FROM #mp_months m
    CROSS JOIN #mp_s s
    OUTER APPLY (
        SELECT TOP (1) w1.quantity
        FROM [mag_pbi].[pbi].[w_ostatok_da_net] w1
        WHERE w1._IDRREF = s.[1c_id]
          AND w1.dt <= EOMONTH(m.MonthStart)
        ORDER BY w1.dt DESC
    ) AS intStock
    LEFT JOIN #mp_ext_stock ext
        ON  ext.code = s.code
        AND ext.Dt   = EOMONTH(m.MonthStart)
    LEFT JOIN #mp_obligations ob
        ON  ob.[1c_id]    = s.[1c_id]
        AND ob.MonthStart = m.MonthStart
    LEFT JOIN [mag_pbi].[pbi].[nomenclature] n
        ON n.[1c_id] = s.[1c_id]
    LEFT JOIN #mp_tn_monthly tn
        ON  tn.[1c_id]    = s.[1c_id]
        AND tn.MonthStart = m.MonthStart
    CROSS APPLY (
        SELECT
              (ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0))
                  * ISNULL(n.[Цена учетная, руб], 0)
              - ISNULL(ob.obligation, 0) AS paid_raw
    ) p;

    ---------------------------------------------------------
    -- 8.8 Агрегаты по SKU: ROIC (год/квартал/будущий) + рентабельность по остатку (год/квартал/будущий)
    ---------------------------------------------------------

    -- старт квартала (последние 3 месяца окна)
    DECLARE @mp_q_start date = DATEADD(
        month, -2,
        DATEFROMPARTS(YEAR(@mp_lastFullMonth), MONTH(@mp_lastFullMonth), 1)
    );

    ;WITH AggYear AS (
        SELECT
            p.[1c_id],
            tn_year      = SUM(p.[ТН]),
            rd_year      = SUM(p.[рубли-дни]),
            avg_cap_year = AVG(NULLIF(p.[Остаток учетка руб], 0.0))
        FROM #mp_plan p
        GROUP BY p.[1c_id]
    ),
    AggQuarter AS (
        SELECT
            p.[1c_id],
            tn_q      = SUM(p.[ТН]),
            rd_q      = SUM(p.[рубли-дни]),
            avg_cap_q = AVG(NULLIF(p.[Остаток учетка руб], 0.0))
        FROM #mp_plan p
        WHERE p.MonthStart >= @mp_q_start
        GROUP BY p.[1c_id]
    ),
    RoicPast AS (
        SELECT
            ay.[1c_id],
            RoicValue =
                CASE 
                    WHEN ay.rd_year > 0
                    THEN ay.tn_year * 365.0 / ay.rd_year * 100.0
                    ELSE NULL
                END,
            ay.tn_year,
            ay.avg_cap_year
        FROM AggYear ay
    ),
    RoicQuarterPast AS (
        SELECT
            aq.[1c_id],
            RoicQ =
                CASE 
                    WHEN aq.rd_q > 0
                    THEN aq.tn_q * 365.0 / aq.rd_q * 100.0
                    ELSE NULL
                END,
            aq.tn_q,
            aq.avg_cap_q
        FROM AggQuarter aq
    ),
    LastRow AS (
        SELECT
            p.[1c_id],
            p.[Оплаченный остаток],
            p.[Остаток шт],
            p.[Остаток учетка руб],
            ROW_NUMBER() OVER (
                PARTITION BY p.[1c_id]
                ORDER BY p.MonthStart DESC
            ) AS rn
        FROM #mp_plan p
    ),
    FutureBase AS (
        SELECT
            a.[1c_id],
            a.[Продажи шт / день]      AS sales_per_day,
            a.[Продано шт]             AS sold_year,
            a.[ТН / год, руб.]         AS tn_year_hist,
            lr.[Оплаченный остаток]    AS paid_stock_now,
            lr.[Остаток шт]            AS q_stock,
            lr.[Остаток учетка руб]    AS stock_rub_now
        FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a
        LEFT JOIN LastRow lr
          ON lr.[1c_id] = a.[1c_id]
         AND lr.rn = 1
    ),
    FutureInputs AS (
        SELECT
            f.[1c_id],
            f.sales_per_day,
            f.sold_year,
            tn_year = COALESCE(f.tn_year_hist, rp.tn_year),
            f.paid_stock_now,
            f.q_stock,
            f.stock_rub_now,
            tn_per_unit =
                CASE 
                    WHEN f.sold_year > 0 AND COALESCE(f.tn_year_hist, rp.tn_year) IS NOT NULL
                    THEN COALESCE(f.tn_year_hist, rp.tn_year) / f.sold_year
                    ELSE NULL
                END,
            max_sell_1y =
                CASE 
                    WHEN f.sales_per_day IS NULL THEN NULL
                    ELSE f.sales_per_day * 365.0
                END
        FROM FutureBase f
        LEFT JOIN RoicPast rp
          ON rp.[1c_id] = f.[1c_id]
    ),
    FutureCalc AS (
        SELECT
            fi.[1c_id],
            RoicFuture =
              CASE 
                WHEN fi.paid_stock_now IS NULL OR fi.paid_stock_now <= 0
                 OR fi.sales_per_day IS NULL OR fi.sales_per_day <= 0
                 OR fi.tn_per_unit IS NULL
                 OR fi.q_stock IS NULL OR fi.q_stock <= 0
                 OR fi.max_sell_1y IS NULL OR fi.max_sell_1y <= 0
                THEN NULL
                ELSE
                (
                  (
                    fi.tn_per_unit *
                    (CASE 
                         WHEN fi.q_stock <= fi.max_sell_1y THEN fi.q_stock
                         ELSE fi.max_sell_1y
                     END)
                  ) * 365.0
                  /
                  (
                    CASE 
                      WHEN fi.q_stock / fi.sales_per_day >= 365.0
                           THEN fi.paid_stock_now * 365.0
                      ELSE fi.paid_stock_now * (fi.q_stock / fi.sales_per_day) / 2.0
                    END
                  ) * 100.0
                )
              END,
            tn_future =
              CASE 
                WHEN fi.tn_per_unit IS NULL OR fi.max_sell_1y IS NULL OR fi.q_stock IS NULL
                THEN NULL
                ELSE
                  fi.tn_per_unit *
                  (CASE 
                       WHEN fi.q_stock <= fi.max_sell_1y THEN fi.q_stock
                       ELSE fi.max_sell_1y
                   END)
              END,
            q_future =
              CASE 
                WHEN fi.max_sell_1y IS NULL OR fi.q_stock IS NULL THEN NULL
                WHEN fi.q_stock <= fi.max_sell_1y THEN fi.q_stock
                ELSE fi.max_sell_1y
              END
        FROM FutureInputs fi
    ),
    CapRentFuture AS (
        SELECT
           fi.[1c_id],
           RentCapFuturePct =
               CASE 
                 WHEN fc.tn_future IS NULL
                  OR fi.stock_rub_now IS NULL OR fi.stock_rub_now <= 0
                  OR fi.q_stock IS NULL OR fi.q_stock <= 0
                  OR fc.q_future IS NULL OR fc.q_future <= 0
                 THEN NULL
                 ELSE
                    CASE 
                       WHEN (fi.stock_rub_now * (1.0 - (fc.q_future / fi.q_stock) / 2.0)) <= 0
                       THEN NULL
                       ELSE
                          fc.tn_future 
                          / (fi.stock_rub_now * (1.0 - (fc.q_future / fi.q_stock) / 2.0))
                          * 100.0
                    END
               END
        FROM FutureInputs fi
        LEFT JOIN FutureCalc fc
          ON fc.[1c_id] = fi.[1c_id]
    )
    UPDATE a
    SET
        a.[Рентабельность / год]                   = rp.RoicValue,
        a.[Рентабельность / квартал]               = rq.RoicQ,
        a.[Оплаченный остаток]                     = lr.[Оплаченный остаток],
        a.[Рентабельность / будущий год]          = fc.RoicFuture,
        a.[Рентабельность по остатку / год]    =
            CASE 
                WHEN rp.avg_cap_year IS NOT NULL AND rp.avg_cap_year > 0
                     AND rp.tn_year IS NOT NULL
                THEN (rp.tn_year / rp.avg_cap_year) * 100.0
                ELSE NULL
            END,
        a.[Рентабельность по остатку / квартал] =
            CASE 
                WHEN rq.avg_cap_q IS NOT NULL AND rq.avg_cap_q > 0
                     AND rq.tn_q IS NOT NULL
                THEN (rq.tn_q / rq.avg_cap_q) * 100.0
                ELSE NULL
            END,
        a.[Рентабельность по остатку / будущий год] = cf.RentCapFuturePct
    FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a
    LEFT JOIN RoicPast        rp ON rp.[1c_id] = a.[1c_id]
    LEFT JOIN RoicQuarterPast rq ON rq.[1c_id] = a.[1c_id]
    LEFT JOIN LastRow         lr ON lr.[1c_id] = a.[1c_id] AND lr.rn = 1
    LEFT JOIN FutureCalc      fc ON fc.[1c_id] = a.[1c_id]
    LEFT JOIN CapRentFuture   cf ON cf.[1c_id] = a.[1c_id];


    -------------------------------------------------------------------------------------
    -- 9) Индекс (как был)
    -------------------------------------------------------------------------------------
    CREATE NONCLUSTERED INDEX [analyticsаналитика за 365 дн.]
    ON [analytics].[аналитика за 365 дн.] ([1c_id])
    INCLUDE (
        [Продажи шт / день],
        [Остаток дней продаж],
        [ТН / год, руб.],
        [ТН / квартал, руб.],
        [Рентабельность / год],
        [Рентабельность / квартал],
        [Дней в продаже / год],
        [Дней в продаже / квартал]
    );
END
GO

/****** Object:  StoredProcedure [analytics].[sp_fill_deficit_money_request]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE [analytics].[sp_fill_deficit_money_request]
    @scenario_id INT = NULL  -- NULL = MAX(scenario_id) из deficit_proposal
AS
SET NOCOUNT ON;

DECLARE @scenario INT;

IF @scenario_id IS NOT NULL AND @scenario_id > 0
    SET @scenario = @scenario_id;
ELSE
    SET @scenario = (SELECT MAX(scenario_id) FROM [analytics].[deficit_proposal]);

IF @scenario IS NULL
BEGIN
    RAISERROR(N'Нет данных в deficit_proposal. Выполните sp_build_deficit_proposal.', 16, 1);
    RETURN;
END

-- Очищаем таблицу для данного сценария
DELETE FROM [analytics].[deficit_money_request] WHERE scenario_id = @scenario;

-- Заполняем: дефицит -> номенклатура (производитель, цена) -> manufacturers -> контрагент
-- Номенклатура: pbi.v_nomenclature_full содержит все коды, Производитель, учётную цену
INSERT INTO [analytics].[deficit_money_request] (
    scenario_id,
    manufacturer_id,
    contractor_1c_id,
    manufacturer_name,
    contractor_name,
    arrival_month,
    amount_rub,
    amount_usd,
    currency,
    order_qty_total,
    sku_count,
    updated_at
)
SELECT
    @scenario AS scenario_id,
    m.id AS manufacturer_id,
    mcm.contractor_1c_id,
    m.manufacturer AS manufacturer_name,
    c.contractor_name,
    CAST(FORMAT(dp.arrival_month, 'yyyy-MM-01') AS date) AS arrival_month,
    SUM(dp.order_qty * ISNULL(n.[Цена учетная, руб], 0)) AS amount_rub,
    SUM(dp.order_qty * ISNULL(n.[Цена учетная, usd], 0)) AS amount_usd,
    CASE 
        WHEN SUM(dp.order_qty * ISNULL(n.[Цена учетная, usd], 0)) > 
             SUM(dp.order_qty * ISNULL(n.[Цена учетная, руб], 0)) * 0.01 
        THEN N'USD' ELSE N'руб.' 
    END AS currency,
    SUM(dp.order_qty) AS order_qty_total,
    COUNT(DISTINCT dp.code) AS sku_count,
    SYSDATETIME() AS updated_at
FROM [analytics].[deficit_proposal] dp
-- Номенклатура: все коды, производитель и учётная цена (без фильтра по группе)
INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n 
    ON n.[code] = dp.code
-- Производитель: сопоставление по имени (LTRIM/RTRIM как в contractorProducer)
INNER JOIN [analytics].[manufacturers] m 
    ON LTRIM(RTRIM(ISNULL(n.[Производитель], N''))) = LTRIM(RTRIM(m.manufacturer))
    AND LTRIM(RTRIM(ISNULL(n.[Производитель], N''))) <> N''
LEFT JOIN [analytics].[manufacturer_counterparty_map] mcm 
    ON mcm.manufacturer_id = m.id
LEFT JOIN [analytics].[v_contractors] c 
    ON c.contractor_1c_id = mcm.contractor_1c_id
WHERE dp.scenario_id = @scenario
  AND dp.order_qty > 0
  AND (n.[Цена учетная, руб] IS NOT NULL OR n.[Цена учетная, usd] IS NOT NULL)
GROUP BY
    m.id,
    mcm.contractor_1c_id,
    m.manufacturer,
    c.contractor_name,
    CAST(FORMAT(dp.arrival_month, 'yyyy-MM-01') AS date);

-- Логируем результат
DECLARE @rows INT = @@ROWCOUNT;
PRINT CONCAT(N'analytics.sp_fill_deficit_money_request: внесено ', @rows, N' записей для scenario_id=', @scenario);
GO

/****** Object:  StoredProcedure [analytics].[sp_fill_seasonality_groups_summ_1]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_fill_seasonality_groups_summ_1]
AS
BEGIN
    SET NOCOUNT ON;

    -------------------------------------------------------------
    -- Заполнение [analytics].[seasonality_groups_summ_1]
    -- Период: 2023-01-01 — 2026-01-01 (3 года)
    -- koef — мультипликативный (среднее = 1.0): прогноз = rate_per_day × дни × koef
    -------------------------------------------------------------

    IF OBJECT_ID('tempdb..#Months') IS NOT NULL DROP TABLE #Months;
    CREATE TABLE #Months ([month] TINYINT NOT NULL PRIMARY KEY);
    INSERT INTO #Months ([month]) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);

    -------------------------------------------------------------
    -- 1. Продажи по g–g1 × месяц (2023–2025)
    -------------------------------------------------------------
    IF OBJECT_ID('tempdb..#SalesByGroupMonth') IS NOT NULL DROP TABLE #SalesByGroupMonth;

    SELECT
        g.[g],
        g.[g1],
        [month] = MONTH(s.[Период]),
        qty = SUM(s.[Количество])
    INTO #SalesByGroupMonth
    FROM [mag_pbi].[pbiProd].[СводныйСебестоимость Для PBI] AS s
    INNER JOIN [mag_pbi].[pbi].[nomenclature] n ON n.[1c_id] = s.[1c_id]
    INNER JOIN [mag_pbi].[pbi].[groups] g     ON g.[1c_id] = n.[1c_group]
    WHERE s.[Статья] = N'Реализация'
      AND s.[Период] >= '2023-01-01'
      AND s.[Период] <  '2026-01-01'
      AND g.[g] NOT LIKE N'*%'
    GROUP BY g.[g], g.[g1], MONTH(s.[Период]);

    -------------------------------------------------------------
    -- 2. Список g–g1
    -------------------------------------------------------------
    IF OBJECT_ID('tempdb..#GroupList') IS NOT NULL DROP TABLE #GroupList;

    SELECT DISTINCT [g], [g1]
    INTO #GroupList
    FROM #SalesByGroupMonth;

    -------------------------------------------------------------
    -- 3. g–g1 × все 12 месяцев (qty = 0, если продаж не было)
    -------------------------------------------------------------
    IF OBJECT_ID('tempdb..#AllGroupMonths') IS NOT NULL DROP TABLE #AllGroupMonths;

    SELECT
        gl.[g],
        gl.[g1],
        m.[month],
        qty = ISNULL(sbgm.qty, 0)
    INTO #AllGroupMonths
    FROM #GroupList gl
    CROSS JOIN #Months m
    LEFT JOIN #SalesByGroupMonth sbgm
        ON sbgm.[g] = gl.[g] AND sbgm.[g1] = gl.[g1] AND sbgm.[month] = m.[month];

    -------------------------------------------------------------
    -- 4. Общий объём продаж по g–g1
    -------------------------------------------------------------
    IF OBJECT_ID('tempdb..#GroupTotals') IS NOT NULL DROP TABLE #GroupTotals;

    SELECT [g], [g1], total_qty = SUM(qty)
    INTO #GroupTotals
    FROM #AllGroupMonths
    GROUP BY [g], [g1];

    -------------------------------------------------------------
    -- 5. Мультипликативный koef: (доля_месяца) × 12 → среднее = 1.0
    --    Формула прогноза: rate_per_day × дни × koef (без домножения на 12)
    -------------------------------------------------------------
    TRUNCATE TABLE [analytics].[seasonality_groups_summ_1];

    INSERT INTO [analytics].[seasonality_groups_summ_1] ([g], [g1], [month], [koef])
    SELECT
        agm.[g],
        agm.[g1],
        agm.[month],
        koef = CASE
                   WHEN gt.total_qty = 0 OR gt.total_qty IS NULL THEN 1.0
                   ELSE CAST(agm.qty AS DECIMAL(18,6)) / NULLIF(gt.total_qty, 0) * 12.0
               END
    FROM #AllGroupMonths agm
    INNER JOIN #GroupTotals gt
        ON gt.[g] = agm.[g] AND gt.[g1] = agm.[g1]
    ORDER BY agm.[g], agm.[g1], agm.[month];

    PRINT N'Заполнено [analytics].[seasonality_groups_summ_1]: ' + CAST(@@ROWCOUNT AS NVARCHAR(20)) + N' строк';
END
GO

/****** Object:  StoredProcedure [analytics].[sp_load_koef_groups]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_load_koef_groups] as BEGIN

Print('Запускайте код процедуры руками')
RETURN 0

DROP TABLE #koef

CREATE TABLE #koef (
    [group_1c_id] nvarchar(256) NOT NULL,
	[seasonal_koef] [decimal](18, 6) NOT NULL,
	[month] int NOT NULL
);

BULK INSERT #koef
FROM '\\192.168.35.3\admin3\Обмен\powerbi\k1.csv'
WITH (
    FIRSTROW = 2,                -- пропустить заголовок
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n',
    CODEPAGE = '1251'            -- если кириллица
);


-- Проверить наличие данных во вр таблице
select top 100 * from #koef


--DELETE FROM [analytics].[seasonality_groups]
INSERT INTO [analytics].[seasonality_groups]
SELECT 
	g.[1c_id],
	k.month,
	k.seasonal_koef
FROM #koef k
INNER JOIN pbi.groups g
	ON g.[1c_id]=k.group_1c_id



	------------------------------
	SET NOCOUNT ON;

------------------------------------------------------------
-- 1. Таблица месяцев 1..12
------------------------------------------------------------
IF OBJECT_ID('tempdb..#Months') IS NOT NULL DROP TABLE #Months;

CREATE TABLE #Months (
    [month] tinyint NOT NULL PRIMARY KEY
);

INSERT INTO #Months ([month])
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);


------------------------------------------------------------
-- 2. База продаж 2024–2025 по g–g1 × месяц
------------------------------------------------------------
IF OBJECT_ID('tempdb..#SalesByGroupMonth') IS NOT NULL DROP TABLE #SalesByGroupMonth;

SELECT
    g.[g],
    g.[g1],
    [month] = MONTH(s.[Период]),
    qty     = /* SUM(s.Сумма) */ SUM(s.[Количество])
INTO #SalesByGroupMonth
FROM [mag_pbi].[pbiProd].[СводныйСебестоимость Для PBI] AS s
    INNER JOIN [pbi].[nomenclature] n
        ON n.[1c_id] = s.[1c_id]
    INNER JOIN [pbi].[groups] g
        ON g.[1c_id] = n.[1c_group]
WHERE
    s.[Статья] = N'Реализация'
    AND s.[Период] >= '2023-12-01'
    AND s.[Период] <  '2025-12-01'
    AND g.[g] NOT LIKE N'*%'
GROUP BY
    g.[g],
    g.[g1],
    MONTH(s.[Период]);


------------------------------------------------------------
-- 3. Список всех g–g1, которые продавались
------------------------------------------------------------
IF OBJECT_ID('tempdb..#GroupList') IS NOT NULL DROP TABLE #GroupList;

SELECT DISTINCT
    sbgm.[g],
    sbgm.[g1]
INTO #GroupList
FROM #SalesByGroupMonth sbgm;


------------------------------------------------------------
-- 4. g–g1 × все 12 месяцев (qty = 0, если продаж не было)
------------------------------------------------------------
IF OBJECT_ID('tempdb..#AllGroupMonths') IS NOT NULL DROP TABLE #AllGroupMonths;

SELECT
    gl.[g],
    gl.[g1],
    m.[month],
    qty = ISNULL(sbgm.qty, 0)
INTO #AllGroupMonths
FROM #GroupList gl
CROSS JOIN #Months m
LEFT JOIN #SalesByGroupMonth sbgm
    ON  sbgm.[g]     = gl.[g]
    AND sbgm.[g1]    = gl.[g1]
    AND sbgm.[month] = m.[month];


------------------------------------------------------------
-- 5. Общий объём продаж по g–g1 за все 12 месяцев
------------------------------------------------------------
IF OBJECT_ID('tempdb..#GroupTotals') IS NOT NULL DROP TABLE #GroupTotals;

SELECT
    agm.[g],
    agm.[g1],
    total_qty = SUM(agm.qty)
INTO #GroupTotals
FROM #AllGroupMonths agm
GROUP BY
    agm.[g],
    agm.[g1];


------------------------------------------------------------
-- 6. Финальный результат: g, g1, koef, month
--    Сумма koef по 12 месяцам для каждого g–g1 = 1
------------------------------------------------------------
SELECT
    agm.[g],
    agm.[g1],
    agm.[month],
    koef = CASE 
               WHEN gt.total_qty = 0 THEN 0
               ELSE CAST(agm.qty AS decimal(18,6)) / NULLIF(gt.total_qty, 0)
           END
--INTO analytics .seasonality_groups_summ_1
FROM #AllGroupMonths agm
INNER JOIN #GroupTotals gt
    ON  gt.[g]  = agm.[g]
    AND gt.[g1] = agm.[g1]
ORDER BY
    agm.[g],
    agm.[g1],
    agm.[month];

END
GO

/****** Object:  StoredProcedure [analytics].[sp_rebuild_stock_plan_by_arrival]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE [analytics].[sp_rebuild_stock_plan_by_arrival]
    @scenario_id   INT,
    @from_month    DATE,   -- например: DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)
    @to_month      DATE    -- последний месяц горизонта + 1 день (интервал [from, to) по месяцам)
AS
BEGIN
    SET NOCOUNT ON;

    -- Безопасная рамка
    IF @from_month IS NULL SET @from_month = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
    IF @to_month   IS NULL SET @to_month   = DATEADD(MONTH, 12, @from_month); -- 12 мес по умолчанию

    -- Чистим целевой диапазон
    DELETE FROM [analytics].[stock_plan_by_arrival]
      WHERE [scenario_id] = @scenario_id
        AND [arrival_month] >= @from_month
        AND [arrival_month] <  @to_month;

    ;WITH months AS (   -- календарь месяцев [from, to)
        SELECT CAST(@from_month AS DATE) AS m
        UNION ALL
        SELECT DATEADD(MONTH, 1, m) FROM months WHERE DATEADD(MONTH, 1, m) < @to_month
    ),
    -- 1) Стартовый остаток на начало горизонта (берём последний известный quantity)
    opening AS (
        SELECT w._IDRREF               AS [1c_id],
               n.code                  AS [code],
               CAST(@from_month AS DATE) AS [arrival_month],
               CAST(
                   MAX(CASE WHEN w.dt = x.max_dt THEN w.quantity END)
                 AS DECIMAL(18,3))     AS opening_qty
        FROM [pbi].[w_ostatok_da_net] w
        JOIN (
            SELECT _IDRREF, MAX(dt) AS max_dt
            FROM [pbi].[w_ostatok_da_net]
            WHERE dt < @from_month
            GROUP BY _IDRREF
        ) x ON x._IDRREF = w._IDRREF AND x.max_dt = w.dt
        JOIN [pbi].[nomenclature] n ON n.[1c_id] = w._IDRREF
        GROUP BY w._IDRREF, n.code
    ),
    -- 2) Подтвержденные приходы (ожидаемые заказы) по дате прихода → к первому дню месяца
    inbound_confirmed AS (
        SELECT 
            o.[1c_id],
            n.code,
            o.month AS arrival_month,
            CAST(SUM(o.units) AS DECIMAL(18,3)) AS inbound_confirmed
        FROM [mag_pbi].[analytics].[get_orders_by_group] o
        JOIN [pbi].[nomenclature] n ON n.[1c_id] = o.[1c_id]
        WHERE o.[status] IN (N'В пути', N'В производстве', N'Выгружен на складе', N'Согласован')
          AND o.month >= @from_month
          AND o.month <  @to_month
        GROUP BY o.[1c_id], n.code,
                 o.month
    ),
    -- 3) Будущие заказы (дефицит → рекомендованные поставки) по месяцу прихода
    inbound_deficit AS (
        SELECT 
            d.[1c_id],
            d.[code],
            DATEFROMPARTS(YEAR(d.[arrival_month]), MONTH(d.[arrival_month]), 1) AS arrival_month,
            CAST(SUM(d.[order_qty]) AS DECIMAL(18,3)) AS inbound_deficit
        FROM [analytics].[deficit_proposal] d
        WHERE d.[scenario_id] = @scenario_id
          AND d.[arrival_month] >= @from_month
          AND d.[arrival_month] <  @to_month
        GROUP BY d.[1c_id], d.[code],
                 DATEFROMPARTS(YEAR(d.[arrival_month]), MONTH(d.[arrival_month]), 1)
    ),
    -- 4) Прогноз спроса по месяцам
    forecast AS (
        SELECT 
            f.[1c_id],
            f.[code],
            DATEFROMPARTS(YEAR(f.[month]), MONTH(f.[month]), 1) AS arrival_month,
            CAST(SUM(f.[value]) AS DECIMAL(18,3)) AS forecast_demand
        FROM [analytics].[forecast] f
        WHERE f.[scenario_id] = @scenario_id
          AND f.[month] >= @from_month
          AND f.[month] <  @to_month
        GROUP BY f.[1c_id], f.[code],
                 DATEFROMPARTS(YEAR(f.[month]), MONTH(f.[month]), 1)
    ),
    -- 5) Объединим каркас всех SKU × месяцы горизонта
    sku_calendar AS (
        SELECT DISTINCT n.[1c_id], n.[code], m.m AS arrival_month
        FROM [pbi].[nomenclature] n
        CROSS JOIN months m
    ),
    base_union AS (
        SELECT c.[1c_id], c.[code], c.[arrival_month],
               COALESCE(op.opening_qty, 0)                       AS opening_qty,
               COALESCE(ic.inbound_confirmed, 0)                 AS inbound_confirmed,
               COALESCE(idf.inbound_deficit, 0)                  AS inbound_deficit,
               COALESCE(fc.forecast_demand, 0)                   AS forecast_demand
        FROM sku_calendar c
        LEFT JOIN opening           op  ON op.[1c_id]=c.[1c_id] AND op.[code]=c.[code] AND op.[arrival_month]=@from_month
        LEFT JOIN inbound_confirmed ic  ON ic.[1c_id]=c.[1c_id] AND ic.[code]=c.[code] AND ic.[arrival_month]=c.[arrival_month]
        LEFT JOIN inbound_deficit   idf ON idf.[1c_id]=c.[1c_id] AND idf.[code]=c.[code] AND idf.[arrival_month]=c.[arrival_month]
        LEFT JOIN forecast          fc  ON fc.[1c_id]=c.[1c_id] AND fc.[code]=c.[code] AND fc.[arrival_month]=c.[arrival_month]
        WHERE c.[arrival_month] >= @from_month
          AND c.[arrival_month] <  @to_month
    ),
    -- 6) Расчёт rolling opening/closing по месяцам
    projected AS (
        SELECT
            @scenario_id         AS scenario_id,
            b.[1c_id],
            b.[code],
            b.[arrival_month],
            -- opening: для первого месяца берем opening_qty из "opening", далее — прошлый closing
            CAST(
                CASE 
                    WHEN b.[arrival_month] = @from_month 
                         THEN b.[opening_qty]
                    ELSE 0
                END
            AS DECIMAL(18,3)) AS opening_qty,
            b.[inbound_confirmed],
            b.[inbound_deficit],
            b.[forecast_demand]
        FROM base_union b
    )
    -- Вставка построчно с расчетом closing через окно
    INSERT INTO [analytics].[stock_plan_by_arrival]
        ([scenario_id],[arrival_month],[1c_id],[code],
         [opening_qty],[inbound_confirmed],[inbound_deficit],[forecast_demand],[closing_qty],[updated_at])
    SELECT
        p.scenario_id,
        p.arrival_month,
        p.[1c_id],
        p.[code],
        -- opening по месяцу = LAG(closing) OVER (по SKU упорядочено по месяцу), для первого — opening_qty
        CAST(
            COALESCE(
                LAG( closing_calc ) OVER (PARTITION BY p.[1c_id], p.[code] ORDER BY p.arrival_month),
                p.opening_qty
            )
        AS DECIMAL(18,3)) AS opening_qty,
        p.inbound_confirmed,
        p.inbound_deficit,
        p.forecast_demand,
        -- closing = opening + inbound_confirmed + inbound_deficit - forecast
        CAST(
            (
                COALESCE( LAG( closing_calc ) OVER (PARTITION BY p.[1c_id], p.[code] ORDER BY p.arrival_month), p.opening_qty)
                + p.inbound_confirmed
                + p.inbound_deficit
                - p.forecast_demand
            ) AS DECIMAL(18,3)
        ) AS closing_qty,
        SYSUTCDATETIME()
    FROM (
        -- промежуточное вычисление closing для использования в LAG
        SELECT
            scenario_id, [1c_id], [code], arrival_month, opening_qty, inbound_confirmed, inbound_deficit, forecast_demand,
            CAST(opening_qty + inbound_confirmed + inbound_deficit - forecast_demand AS DECIMAL(18,3)) AS closing_calc
        FROM projected
    ) p
    OPTION (MAXRECURSION 0);

END
GO

/****** Object:  StoredProcedure [analytics].[sp_recalc_roic]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
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

/****** Object:  StoredProcedure [analytics].[sp_report_ROI]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE [analytics].[sp_report_ROI]
    @scenario_id      INT             = 4,
    @min_deficit_rub  DECIMAL(18,2)   = 2000,
    @cutoff_month     DATE            = '2027-01-01',
    @pathPattern      NVARCHAR(400)    = N'Кружево%'
AS
BEGIN
    SET NOCOUNT ON;

    ;WITH stages_pivot AS (
        SELECT manufacturer_id,
            MAX(CASE WHEN rn = 1 THEN [percent] END) / 100.0 AS n_percent,
            MAX(CASE WHEN rn = 1 THEN days END) AS n_days,
            MAX(CASE WHEN rn = 2 THEN [percent] END) / 100.0 AS m_percent,
            MAX(CASE WHEN rn = 2 THEN days END) AS m_days
        FROM (
            SELECT manufacturer_id, [percent], days,
                ROW_NUMBER() OVER (PARTITION BY manufacturer_id ORDER BY sort_order) AS rn
            FROM [analytics].[manufacturer_payment_stage]
        ) t WHERE rn <= 2
        GROUP BY manufacturer_id
    ),
    base AS (
        SELECT
              g.[path] AS grp
            , n.[Производитель]
            , d.place_month
            , SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)) AS Deficit
            , SUM(a.[%ТН год, руб.] * d.order_qty * ISNULL(n.[Цена учетная, руб], 0))
                / NULLIF(SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)), 0) AS [%ТН средн]
        FROM [analytics].[deficit_proposal] d
        INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = d.[1c_id]
        INNER JOIN [analytics].[аналитика за 365 дн.] a ON a.[1c_id] = d.[1c_id]
        INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
        WHERE d.scenario_id = @scenario_id
          AND ISNULL(n.[cenovaya_gruppa], N'') = N'Валютная'
          AND g.[path] LIKE @pathPattern
        GROUP BY g.[path], n.[Производитель], d.place_month
        HAVING SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)) > @min_deficit_rub
    )
    SELECT
          b.grp AS [g]
        , b.[Производитель]
        , b.place_month
        , b.Deficit
        , b.[%ТН средн]
        , b.[%ТН средн] * ISNULL(m.roic_norm, 1.36) AS [%ROI заказа]
        , ISNULL(m.roic_norm, 1.36) AS [ROI normalized]
        , b.[%ТН средн] * ISNULL(m.roic_norm, 1.36) * b.Deficit AS [ROI руб]
        , ISNULL(sp.n_percent, 0.30) AS n_percent
        , ISNULL(sp.n_days, 1) AS n_days
        , ISNULL(sp.m_percent, 0.70) AS m_percent
        , ISNULL(sp.m_days, 60) AS m_days
    FROM base b
    LEFT JOIN [analytics].[manufacturers] m
        ON LTRIM(RTRIM(ISNULL(b.[Производитель], N''))) = LTRIM(RTRIM(m.manufacturer))
        AND LTRIM(RTRIM(ISNULL(b.[Производитель], N''))) <> N''
    LEFT JOIN stages_pivot sp ON sp.manufacturer_id = m.id
    ORDER BY [%ROI заказа] DESC, b.grp, b.Deficit DESC;

    -- 2. Платежи по месяцам (из deficit_proposal по path — dmr не хранит path)
    SELECT
          FORMAT(d.arrival_month, 'yyyy-MM') AS [Дата платежа]
        , SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)) AS [Сумма платежа]
    FROM [analytics].[deficit_proposal] d
    INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = d.[1c_id]
    INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
    WHERE d.scenario_id = @scenario_id
      AND g.[path] LIKE @pathPattern
    GROUP BY FORMAT(d.arrival_month, 'yyyy-MM')
    ORDER BY FORMAT(d.arrival_month, 'yyyy-MM') ASC;

    -- 3. Платежи до cutoff (из deficit_proposal по path)
    SELECT
        SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)) AS [Платежи в 2026]
    FROM [analytics].[deficit_proposal] d
    INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = d.[1c_id]
    INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
    WHERE d.scenario_id = @scenario_id
      AND g.[path] LIKE @pathPattern
      AND d.arrival_month < @cutoff_month;

    -- 4. Прогноз выручки по месяцам
    SELECT
          t.[month]
        , SUM(t.Выручка) AS revenue
        , SUM(t.[Сумм. учет]) AS uchet
    FROM (
        SELECT
              f.[month]
            , f.[value] * ISNULL(n.[Цена учетная, руб], 0) AS [Сумм. учет]
            , f.[value] * ISNULL(n.[Цена учетная, руб], 0) * (1 + a.[%ТН год, руб.]) AS Выручка
        FROM [analytics].[forecast] f
        INNER JOIN [analytics].[аналитика за 365 дн.] a ON a.[1c_id] = f.[1c_id]
        INNER JOIN [mag_pbi].[pbi].[nomenclature] n ON n.[1c_id] = f.[1c_id]
        INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
        WHERE f.scenario_id = @scenario_id
          AND a.[%ТН год, руб.] > 0
          AND g.[path] LIKE @pathPattern
    ) t
    GROUP BY t.[month]
    ORDER BY t.[month];

    -- 5. ROIC по группе (path pattern)
    ;WITH sku_in_group AS (
        SELECT
              a.[1c_id]
            , a.[Code] AS code
            , g.[path]
            , a.[Оплаченный остаток] AS PaidCapital
            , a.[Рентабельность по остатку / год] AS RoicPast
        FROM [analytics].[аналитика за 365 дн.] a
        INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = a.[1c_id]
        INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
        WHERE g.[path] LIKE @pathPattern
    )
    SELECT
          @pathPattern AS [Фильтр path]
        , SUM(PaidCapital) AS [Оплаченный остаток всего, руб]
        , CASE
              WHEN SUM(PaidCapital) > 0
              THEN SUM(ISNULL(PaidCapital, 0) * ISNULL(RoicPast, 0)) / SUM(PaidCapital)
              ELSE NULL
          END AS [Рентабельность остатка / год назад, %]
    FROM sku_in_group;

    -- 6. Итоговые ROIC по всей аналитике
    DECLARE @sumPaid           DECIMAL(38,6);
    DECLARE @sumWeightedPast   DECIMAL(38,6);
    DECLARE @sumWeightedFuture DECIMAL(38,6);
    DECLARE @roicPastTotal     DECIMAL(38,6);
    DECLARE @roicFutureTotal   DECIMAL(38,6);

    SELECT
          @sumPaid = SUM(CAST(ISNULL(a.[Оплаченный остаток], 0) AS DECIMAL(38,6)))
        , @sumWeightedPast = SUM(
              CAST(ISNULL(a.[Оплаченный остаток], 0) AS DECIMAL(38,6))
            * CAST(ISNULL(a.[Рентабельность по остатку / год], 0) AS DECIMAL(38,6))
          )
        , @sumWeightedFuture = SUM(
              CAST(ISNULL(a.[Оплаченный остаток], 0) AS DECIMAL(38,6))
            * CAST(ISNULL(a.[Рентабельность / будущий год], 0) AS DECIMAL(38,6))
          )
    FROM [analytics].[аналитика за 365 дн.] a
    INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = a.[1c_id]
    INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
    WHERE g.[path] LIKE @pathPattern;

    SET @roicPastTotal   = CASE WHEN @sumPaid > 0 THEN @sumWeightedPast / @sumPaid ELSE NULL END;
    SET @roicFutureTotal = CASE WHEN @sumPaid > 0 THEN @sumWeightedFuture / @sumPaid ELSE NULL END;

    SELECT
          @sumPaid         AS [Оплаченный остаток всего, руб]
        , @roicPastTotal   AS [Рентабельность остатка / год назад всего, %]
        , @roicFutureTotal AS [Рентабельность остатка / будущий год всего, %];
END
GO

/****** Object:  StoredProcedure [analytics].[sp_report_ROI_подробно]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure  [analytics].[sp_report_ROI_подробно] as BEGIN
---------------------------------------------------------
-- 0. Параметры дат: 12 полных месяцев НАЗАД
---------------------------------------------------------
DECLARE @today           date = CAST(GETDATE() AS date);
DECLARE @lastFullMonth   date;
DECLARE @firstMonthStart date;
DECLARE @curMonthStart   date;

-- последний полный месяц (месяц до текущего дня)
SET @lastFullMonth   = EOMONTH(DATEADD(month, -1, @today));
-- первый из 12 полных месяцев
SET @firstMonthStart = DATEADD(
                           month, -11,
                           DATEFROMPARTS(YEAR(@lastFullMonth), MONTH(@lastFullMonth), 1)
                       );
SET @curMonthStart   = @firstMonthStart;

---------------------------------------------------------
-- 1. Список месяцев (#months)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#months') IS NOT NULL DROP TABLE #months;

CREATE TABLE #months (
    MonthStart date NOT NULL PRIMARY KEY
);

WHILE @curMonthStart
      <= DATEFROMPARTS(YEAR(@lastFullMonth), MONTH(@lastFullMonth), 1)
BEGIN
    INSERT INTO #months (MonthStart)
    VALUES (@curMonthStart);

    SET @curMonthStart = DATEADD(month, 1, @curMonthStart);
END;

---------------------------------------------------------
-- 2. SKU (#s) – здесь укажи нужный код товара
---------------------------------------------------------
IF OBJECT_ID('tempdb..#s') IS NOT NULL DROP TABLE #s;

CREATE TABLE #s (
    [1c_id] binary(16) NOT NULL,
    code    nchar(11)  NOT NULL
);

INSERT INTO #s ([1c_id], code)
SELECT n.[1c_id], n.code
FROM pbi.nomenclature n
WHERE n.code = N'УТ-00176242';   -- <=== поменяй при необходимости

---------------------------------------------------------
-- 3. Внешние остатки (#ext_stock) – срезы на конец месяца
---------------------------------------------------------
IF OBJECT_ID('tempdb..#ext_stock') IS NOT NULL DROP TABLE #ext_stock;

CREATE TABLE #ext_stock (
    Dt   date          NOT NULL,
    code nchar(11)     NOT NULL,
    qty  numeric(18,3) NOT NULL,
    CONSTRAINT PK_ext_stock PRIMARY KEY (Dt, code)
);

INSERT INTO #ext_stock (Dt, code, qty)
SELECT
      CAST(o.[Дата обновления] AS date) AS Dt,
      o.code,
      SUM(o.[Количество])              AS qty
FROM analytics.[Внешние остатки] o
JOIN #s s
    ON s.code = o.code
GROUP BY CAST(o.[Дата обновления] AS date), o.code;

---------------------------------------------------------
-- 4. Приходы (#incoming) – Закупка / Приход по месяцам
--    БЕРЁМ ТОЛЬКО ПРИХОДЫ ВНУТРИ НАШИХ 12 МЕСЯЦЕВ
---------------------------------------------------------
IF OBJECT_ID('tempdb..#incoming') IS NOT NULL DROP TABLE #incoming;

CREATE TABLE #incoming (
    MonthStart date          NOT NULL,  -- месяц прихода (1-е число)
    code       nchar(11)     NOT NULL,
    qty        numeric(18,3) NOT NULL,
    CONSTRAINT PK_incoming PRIMARY KEY (MonthStart, code)
);

INSERT INTO #incoming (MonthStart, code, qty)
SELECT
      DATEFROMPARTS(YEAR(s.[Период]), MONTH(s.[Период]), 1) AS MonthStart,
      n.code,
      SUM(s.[Количество])                                   AS qty
FROM pbiProd.[СводныйСебестоимость Для PBI] s
JOIN pbi.nomenclature n
    ON n.[1c_id] = s.[1c_id]
JOIN #s sfilter
    ON sfilter.code = n.code
WHERE s.[Статья]       = N'Закупка'
  AND s.[Вид операции] = N'Приход'
  AND s.[Период]      >= @firstMonthStart          -- отключаем старые приходы
GROUP BY
      DATEFROMPARTS(YEAR(s.[Период]), MONTH(s.[Период]), 1),
      n.code;

---------------------------------------------------------
-- 5. Части платежей по каждому приходу (#pay_parts)
--    (1-й и 2-й платёж по производителю, проценты как ДОЛИ)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#pay_parts') IS NOT NULL DROP TABLE #pay_parts;

CREATE TABLE #pay_parts (
    MonthStart date          NOT NULL,  -- месяц прихода (ключ к #incoming)
    code       nchar(11)     NOT NULL,
    pay_date   date          NOT NULL,  -- дата платежа
    amount     numeric(18,2) NOT NULL
);

-- первый платёж (n)
INSERT INTO #pay_parts (MonthStart, code, pay_date, amount)
SELECT
      inc.MonthStart,
      inc.code,
      DATEADD(day, man.n_days - 90, EOMONTH(inc.MonthStart)) AS pay_date,
      inc.qty * n.[Цена учетная, руб] * man.n_percent        AS amount
FROM #incoming inc
JOIN pbi.nomenclature n
    ON n.code = inc.code
JOIN analytics.manufacturers man
    ON man.[manufacturer] = n.Производитель
WHERE man.n_percent IS NOT NULL
  AND man.n_percent <> 0;

-- второй платёж (m)
INSERT INTO #pay_parts (MonthStart, code, pay_date, amount)
SELECT
      inc.MonthStart,
      inc.code,
      DATEADD(day, man.m_days - 90, EOMONTH(inc.MonthStart)) AS pay_date,
      inc.qty * n.[Цена учетная, руб] * man.m_percent        AS amount
FROM #incoming inc
JOIN pbi.nomenclature n
    ON n.code = inc.code
JOIN analytics.manufacturers man
    ON man.[manufacturer] = n.Производитель
WHERE man.m_percent IS NOT NULL
  AND man.m_percent <> 0;

---------------------------------------------------------
-- 6. Платежи по месяцам (#payments) – для колонки [платеж]
---------------------------------------------------------
IF OBJECT_ID('tempdb..#payments') IS NOT NULL DROP TABLE #payments;

CREATE TABLE #payments (
    MonthStart date          NOT NULL,  -- месяц платежа (1-е число)
    code       nchar(11)     NOT NULL,
    amount     numeric(18,2) NOT NULL,
    CONSTRAINT PK_payments PRIMARY KEY (MonthStart, code)
);

INSERT INTO #payments (MonthStart, code, amount)
SELECT
      DATEFROMPARTS(YEAR(p.pay_date), MONTH(p.pay_date), 1) AS MonthStart,
      p.code,
      SUM(p.amount)                                         AS amount
FROM #pay_parts p
GROUP BY
      DATEFROMPARTS(YEAR(p.pay_date), MONTH(p.pay_date), 1),
      p.code;

---------------------------------------------------------
-- 7. Обязательства по месяцам (#obligations)
--    Считаем только по приходам (#incoming)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#obligations') IS NOT NULL DROP TABLE #obligations;

CREATE TABLE #obligations (
    MonthStart date          NOT NULL,  -- месяц, на который считаем долг
    code       nchar(11)     NOT NULL,
    obligation numeric(18,2) NOT NULL,
    CONSTRAINT PK_obligations PRIMARY KEY (MonthStart, code)
);

;WITH ObligRows AS (
    SELECT
          m.MonthStart,
          inc.code,
          CASE
              -- если месяц ещё до прихода товара – долга нет
              WHEN EOMONTH(m.MonthStart) < EOMONTH(inc.MonthStart) THEN 0
              ELSE
                  CASE 
                      WHEN full_sum - paid_to_month > 0 
                      THEN full_sum - paid_to_month
                      ELSE 0
                  END
          END AS ObligationPerIncoming
    FROM #months m
    JOIN #incoming inc
        ON 1 = 1                               -- каждая пара (месяц, приход)
    JOIN pbi.nomenclature n2
        ON n2.code = inc.code
    JOIN analytics.manufacturers man2
        ON man2.[manufacturer] = n2.Производитель
    CROSS APPLY (
        SELECT
              inc.qty * n2.[Цена учетная, руб] AS full_sum,
              (
                  -- оплачено к концу месяца m.MonthStart (по обоим платежам)
                  (CASE 
                       WHEN man2.n_percent IS NOT NULL
                            AND EOMONTH(m.MonthStart)
                                >= DATEADD(day, man2.n_days - 90,
                                           EOMONTH(inc.MonthStart))
                       THEN inc.qty * n2.[Цена учетная, руб] * man2.n_percent
                       ELSE 0
                   END)
                +
                  (CASE 
                       WHEN man2.m_percent IS NOT NULL
                            AND EOMONTH(m.MonthStart)
                                >= DATEADD(day, man2.m_days - 90,
                                           EOMONTH(inc.MonthStart))
                       THEN inc.qty * n2.[Цена учетная, руб] * man2.m_percent
                       ELSE 0
                   END)
              ) AS paid_to_month
    ) calc
)
INSERT INTO #obligations (MonthStart, code, obligation)
SELECT
      MonthStart,
      code,
      SUM(ObligationPerIncoming) AS obligation
FROM ObligRows
GROUP BY
      MonthStart,
      code;

---------------------------------------------------------
-- 8. ТН по месяцам (#tn_monthly) из Продажи_Учёт_Маржа_по_дням
---------------------------------------------------------
IF OBJECT_ID('tempdb..#tn_monthly') IS NOT NULL DROP TABLE #tn_monthly;

CREATE TABLE #tn_monthly (
    MonthStart date          NOT NULL,
    code       nchar(11)     NOT NULL,
    tn_amount  numeric(18,2) NOT NULL,
    CONSTRAINT PK_tn_monthly PRIMARY KEY (MonthStart, code)
);

INSERT INTO #tn_monthly (MonthStart, code, tn_amount)
SELECT
      DATEFROMPARTS(YEAR(p.[d]), MONTH(p.[d]), 1) AS MonthStart,
      p.[Code],
      SUM(p.[Торговая надбавка])                 AS tn_amount
FROM [mag_pbi].[analytics].[Продажи_Учёт_Маржа_по_дням] p
JOIN #s s
    ON s.code = p.[Code]
WHERE p.[d] >= @firstMonthStart
  AND p.[d] <= @lastFullMonth
GROUP BY
      DATEFROMPARTS(YEAR(p.[d]), MONTH(p.[d]), 1),
      p.[Code];

---------------------------------------------------------
-- 9. Финальный SELECT ПО МЕСЯЦАМ (прошлый год)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#month_plan') IS NOT NULL DROP TABLE #month_plan;

SELECT
      s.[1c_id],
      s.code,
      n.Производитель,
      n.[Цена учетная, руб],
      n.[Цена учетная, руб]*(ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0)) AS [Остаток учетка руб],
      man.n_percent,
      man.n_days,
      man.m_percent,
      man.m_days,
      RIGHT('0' + CAST(MONTH(m.MonthStart) AS varchar(2)), 2)
        + '-' + CAST(YEAR(m.MonthStart) AS varchar(4))            AS [месяц],       -- MM-YYYY (текст)
      m.MonthStart                                                AS [MonthStart],  -- реальная дата месяца
      ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0)           AS [остаток],     -- шт
      ISNULL(inc.qty, 0)                                          AS [приход],      -- шт
      ISNULL(pay.amount, 0)                                       AS [платеж],      -- руб
      ISNULL(ob.obligation, 0)                                    AS [Обязательства],-- руб
      CAST(
           CASE 
               WHEN p.paid_raw < 0 THEN 0
               ELSE p.paid_raw
           END
           AS numeric(18,2)
      )                                                           AS [Оплаченный остаток], -- руб
      ISNULL(tn.tn_amount, 0)                                     AS [ТН],          -- торговая надбавка за месяц, руб
      CAST(
           CASE 
               WHEN p.paid_raw < 0 THEN 0
               ELSE p.paid_raw
           END * DAY(EOMONTH(m.MonthStart))
           AS numeric(18,2)
      )                                                           AS [рубли-дни]   -- оплаченный остаток × дней в месяце
INTO #month_plan
FROM #months m
CROSS JOIN #s s

OUTER APPLY (
    SELECT TOP (1) w1.quantity
    FROM pbi.[w_ostatok_da_net] w1
    WHERE w1._IDRREF = s.[1c_id]
      AND w1.dt <= EOMONTH(m.MonthStart)
    ORDER BY w1.dt DESC
) AS intStock

LEFT JOIN #ext_stock ext
    ON  ext.code = s.code
    AND ext.Dt   = EOMONTH(m.MonthStart)

LEFT JOIN #incoming inc
    ON  inc.code      = s.code
    AND inc.MonthStart = m.MonthStart

LEFT JOIN pbi.nomenclature n
    ON n.code = s.code

LEFT JOIN analytics.manufacturers man
    ON man.[manufacturer] = n.Производитель

LEFT JOIN #payments pay
    ON  pay.code      = s.code
    AND pay.MonthStart = m.MonthStart

LEFT JOIN #obligations ob
    ON  ob.code       = s.code
    AND ob.MonthStart  = m.MonthStart

LEFT JOIN #tn_monthly tn
    ON  tn.code       = s.code
    AND tn.MonthStart  = m.MonthStart

CROSS APPLY (   -- сырые оплаченные рубли (до обрезки в 0)
    SELECT
        (ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0))
            * ISNULL(n.[Цена учетная, руб], 0)
        - ISNULL(ob.obligation, 0) AS paid_raw
) p

ORDER BY m.MonthStart;

-- помесячная картина прошлого
SELECT * FROM #month_plan;

---------------------------------------------------------
-- 10. Рентабельность за прошлый год (ROIC как было)
---------------------------------------------------------
DECLARE @roic_past        numeric(38,6);
DECLARE @tn_year          numeric(38,6);
DECLARE @ruble_days_year  numeric(38,6);

SELECT 
    @tn_year          = SUM(t.[ТН]),
    @ruble_days_year  = SUM(t.[рубли-дни])
FROM #month_plan t;

SET @roic_past = CASE 
                    WHEN @ruble_days_year > 0 
                        THEN @tn_year * 365.0 / @ruble_days_year * 100.0
                    ELSE NULL
                 END;

---------------------------------------------------------
-- 10a. Рентабельность по остатку В РУБЛЯХ (год и квартал назад)
--      ТН / средний остаток учетка руб
---------------------------------------------------------
DECLARE @rent_cap_year     numeric(38,6);
DECLARE @rent_cap_quarter  numeric(38,6);

-- год: средний Остаток учетка руб по всем 12 месяцам
DECLARE @avg_cap_year numeric(38,6);

SELECT 
    @avg_cap_year = AVG(NULLIF(t.[Остаток учетка руб], 0.0))
FROM #month_plan t;

IF @avg_cap_year IS NOT NULL AND @avg_cap_year > 0 AND @tn_year IS NOT NULL
    SET @rent_cap_year = @tn_year / @avg_cap_year;
ELSE
    SET @rent_cap_year = NULL;

-- квартал: последние 3 месяца окна
DECLARE @q_start date      = DATEADD(
                                month, -2,
                                DATEFROMPARTS(YEAR(@lastFullMonth), MONTH(@lastFullMonth), 1)
                            );
DECLARE @tn_q        numeric(38,6);
DECLARE @avg_cap_q   numeric(38,6);

SELECT 
    @tn_q      = SUM(t.[ТН]),
    @avg_cap_q = AVG(NULLIF(t.[Остаток учетка руб], 0.0))
FROM #month_plan t
WHERE t.MonthStart >= @q_start;

IF @avg_cap_q IS NOT NULL AND @avg_cap_q > 0 AND @tn_q IS NOT NULL
    SET @rent_cap_quarter = @tn_q / @avg_cap_q;
ELSE
    SET @rent_cap_quarter = NULL;

---------------------------------------------------------
-- 11. Рентабельность остатка на будущий год (ROIC вперёд)
---------------------------------------------------------

-- 11.1. Текущий SKU и его продажи / день
DECLARE @sku_1c_id binary(16);
SELECT TOP(1) @sku_1c_id = [1c_id] FROM #s;

DECLARE @sales_per_day numeric(38,6);      -- Продажи шт / день
DECLARE @sold_year     numeric(38,6);      -- Продано шт за последние 12 мес

-- берём скорость продаж из аналитики за 365 дней (если есть)
SELECT 
    @sales_per_day = a.[Продажи шт / день]
FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a
WHERE a.[1c_id] = @sku_1c_id;

-- продано шт за наши 12 месяцев (по себестоимости)
SELECT 
    @sold_year = SUM(s.[Количество])
FROM pbiProd.[СводныйСебестоимость Для PBI] s
WHERE s.[1c_id]   = @sku_1c_id
  AND s.[Статья]  = N'Реализация'
  AND s.[Период] >= @firstMonthStart
  AND s.[Период] <= @lastFullMonth;

IF (@sales_per_day IS NULL OR @sales_per_day = 0) AND @sold_year IS NOT NULL
BEGIN
    -- fallback, если ещё не прогоняли sp_create_analytics_365
    SET @sales_per_day = @sold_year / 365.0;
END;

-- 11.2. Маржа на штуку по истории
DECLARE @tn_per_unit numeric(38,6);

SET @tn_per_unit = CASE 
                      WHEN @sold_year IS NOT NULL AND @sold_year > 0 
                           THEN @tn_year / @sold_year
                      ELSE NULL
                   END;

-- 11.3. Текущий оплаченный остаток, остаток шт и остаток учетка руб (последний месяц окна)
DECLARE @q_stock           numeric(18,6);  -- текущий остаток шт
DECLARE @paid_stock_today  numeric(18,6);  -- оплаченный остаток в руб
DECLARE @stock_rub_today   numeric(18,6);  -- остаток учетка руб на конец окна

SELECT TOP(1)
      @q_stock           = [остаток],
      @paid_stock_today = [Оплаченный остаток],
      @stock_rub_today  = [Остаток учетка руб]
FROM #month_plan
ORDER BY MonthStart DESC;   -- последний из 12 месяцев = @lastFullMonth

-- 11.4. Сколько успеем продать за будущий год и какая будет ТН

DECLARE @q_future  numeric(18,6);  -- сколько штук реально успеем продать за год
DECLARE @tn_future numeric(18,6);  -- ожидаемая ТН за будущий год

IF @sales_per_day IS NOT NULL AND @sales_per_day > 0
BEGIN
    DECLARE @max_sell_1y numeric(18,6);
    SET @max_sell_1y = @sales_per_day * 365.0;

    SET @q_future = CASE 
                        WHEN @q_stock IS NULL THEN 0
                        WHEN @q_stock <= @max_sell_1y THEN @q_stock
                        ELSE @max_sell_1y
                    END;
END
ELSE
BEGIN
    SET @q_future = 0;
END;

IF @tn_per_unit IS NOT NULL
    SET @tn_future = @tn_per_unit * @q_future;
ELSE
    SET @tn_future = NULL;

-- 11.5. Будущие рубли-дни и ROIC вперёд

DECLARE @days_to_sell       numeric(18,6);
DECLARE @ruble_days_future  numeric(18,6);
DECLARE @roic_future        numeric(38,6);

IF @sales_per_day IS NOT NULL AND @sales_per_day > 0 AND @q_stock IS NOT NULL
    SET @days_to_sell = @q_stock / @sales_per_day;
ELSE
    SET @days_to_sell = NULL;

IF @days_to_sell IS NULL OR @paid_stock_today IS NULL OR @paid_stock_today <= 0 OR @tn_future IS NULL
BEGIN
    SET @roic_future = NULL;
END
ELSE
BEGIN
    IF @days_to_sell >= 365.0
        -- остаток будет лежать весь год
        SET @ruble_days_future = @paid_stock_today * 365.0;
    ELSE
        -- остаток линейно уходит до нуля за days_to_sell
        SET @ruble_days_future = @paid_stock_today * @days_to_sell / 2.0;

    IF @ruble_days_future > 0
        SET @roic_future = @tn_future * 365.0 / @ruble_days_future * 100.0;
    ELSE
        SET @roic_future = NULL;
END;

---------------------------------------------------------
-- 11.6. Рентабельность по остатку В РУБЛЯХ на будущий год
--       (ТН_future / средний остаток учетка руб в горизонте)
---------------------------------------------------------
DECLARE @rent_cap_future   numeric(38,6);

IF @stock_rub_today IS NULL OR @stock_rub_today <= 0 
   OR @q_stock IS NULL OR @q_stock <= 0 
   OR @q_future IS NULL OR @q_future <= 0 
   OR @tn_future IS NULL
BEGIN
    SET @rent_cap_future = NULL;
END
ELSE
BEGIN
    DECLARE @avg_cap_future numeric(38,6);

    -- считаем, что капитал уходит линейно пропорционально количеству:
    -- капитал "на продажу" = stock_rub_today * (q_future / q_stock)
    -- средний капитал = stock_rub_today - 0.5 * капитал_на_продажу
    SET @avg_cap_future =
        @stock_rub_today * (1.0 - (@q_future / @q_stock) / 2.0);

    IF @avg_cap_future > 0
        SET @rent_cap_future = @tn_future / @avg_cap_future;
    ELSE
        SET @rent_cap_future = NULL;
END;

---------------------------------------------------------
-- 11.7. Таблица будущего по месяцам (#future_plan) — как было
---------------------------------------------------------
IF OBJECT_ID('tempdb..#future_plan') IS NOT NULL DROP TABLE #future_plan;

CREATE TABLE #future_plan (
    PeriodStart      date,
    PeriodEnd        date,
    DaysInPeriod     int,
    QtyStart         numeric(18,6),
    Sold             numeric(18,6),
    QtyEnd           numeric(18,6),
    PaidCapitalAvg   numeric(18,6),
    RubleDays        numeric(18,6),
    TN_period        numeric(18,6),
    ROIC_period      numeric(38,6)
);

DECLARE 
    @f_start       date,
    @f_end         date,
    @days          int,
    @rem_qty       numeric(18,6),
    @qty_start     numeric(18,6),
    @qty_end       numeric(18,6),
    @sold          numeric(18,6),
    @capital_start numeric(18,6),
    @capital_end   numeric(18,6),
    @capital_avg   numeric(18,6),
    @tn_period     numeric(18,6),
    @ruble_days_m  numeric(18,6),
    @roic_m        numeric(38,6),
    @cum_days      int;

SET @rem_qty   = ISNULL(@q_stock, 0);
SET @f_start   = @today;
SET @cum_days  = 0;

WHILE @cum_days < 365 AND @rem_qty > 0 AND @sales_per_day IS NOT NULL AND @sales_per_day > 0
BEGIN
    -- конец периода = конец месяца, в котором f_start
    SET @f_end = EOMONTH(@f_start);
    SET @days  = DATEDIFF(day, @f_start, @f_end) + 1;

    -- не выходим за 365 дней горизонта
    IF @cum_days + @days > 365
    BEGIN
        SET @days = 365 - @cum_days;
        SET @f_end = DATEADD(day, @days - 1, @f_start);
    END;

    SET @qty_start = @rem_qty;

    DECLARE @can_sell numeric(18,6);
    SET @can_sell = @sales_per_day * @days;

    SET @sold = CASE 
                    WHEN @rem_qty <= @can_sell THEN @rem_qty
                    ELSE @can_sell
                END;

    SET @qty_end = @qty_start - @sold;

    IF @q_stock IS NOT NULL AND @q_stock > 0 AND @paid_stock_today IS NOT NULL 
    BEGIN
        SET @capital_start = @paid_stock_today * (@qty_start / @q_stock);
        SET @capital_end   = @paid_stock_today * (@qty_end   / @q_stock);
    END
    ELSE
    BEGIN
        SET @capital_start = 0;
        SET @capital_end   = 0;
    END;

    SET @capital_avg = (@capital_start + @capital_end) / 2.0;

    IF @tn_per_unit IS NOT NULL
        SET @tn_period = @tn_per_unit * @sold;
    ELSE
        SET @tn_period = NULL;

    SET @ruble_days_m = @capital_avg * @days;

    IF @ruble_days_m > 0 AND @tn_period IS NOT NULL
        SET @roic_m = @tn_period * 365.0 / @ruble_days_m * 100.0;
    ELSE
        SET @roic_m = NULL;

    INSERT INTO #future_plan (
        PeriodStart, PeriodEnd, DaysInPeriod,
        QtyStart, Sold, QtyEnd,
        PaidCapitalAvg, RubleDays, TN_period, ROIC_period
    )
    VALUES (
        @f_start, @f_end, @days,
        @qty_start, @sold, @qty_end,
        @capital_avg, @ruble_days_m, @tn_period, @roic_m
    );

    SET @rem_qty  = @qty_end;
    SET @cum_days = @cum_days + @days;
    SET @f_start  = DATEADD(day, 1, @f_end);

    IF @cum_days >= 365 BREAK;
END;

---------------------------------------------------------
-- 12. Итог: прошлое и будущее + рентабельность по остатку (руб)
---------------------------------------------------------
SELECT 
    @roic_past        AS [ROIC за год назад],
    @roic_future      AS [ROIC на будущий год],
    @rent_cap_year    AS [Рентабельность по остатку (руб) / год назад],
    @rent_cap_quarter AS [Рентабельность по остатку (руб) / квартал назад],
    @rent_cap_future  AS [Рентабельность по остатку (руб) / будущий год];

-- Таблица будущего по месяцам / периодам (как было)
SELECT * FROM #future_plan ORDER BY PeriodStart;

END
GO

/****** Object:  StoredProcedure [analytics].[sp_run_deficit_all_skus]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_run_deficit_all_skus]
	@scenario_id    INT
 as BEGIN
	DELETE FROM [analytics].[deficit_proposal] where scenario_id = @scenario_id

	EXEC [analytics].[sp_build_deficit_proposal]
		 @scenario_id   = @scenario_id,
		 @group_path    = N'',          -- пусто = все группы
		 @lead_time_m   = 4,
		 @cover_months  = 6,
		 @from_month    = '2025-10-01',
		 @to_month_excl = '2028-01-01',
		 @debug         = 0;            -- чтобы не заспамить Messages
END
GO

/****** Object:  StoredProcedure [analytics].[sp_загрузка_прогноза_закупки]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Script for SelectTopNRows command from SSMS  ******/

CREATE PROCEDURE [analytics].[sp_загрузка_прогноза_закупки] AS BEGIN

	SET NOCOUNT ON;

	IF OBJECT_ID('tempdb..#plan2026') IS NOT NULL
		DROP TABLE #plan2026;

	CREATE TABLE #plan2026 (
		code       nvarchar(50) NOT NULL,
		opt        decimal(18,2) NULL,
		mp         decimal(18,2) NULL,
		updated_by nvarchar(100) NULL
	);

	-- уникальный индекс по коду, дубли игнорируем
	CREATE UNIQUE INDEX UX_plan2026_code
	ON #plan2026(code)
	WITH (IGNORE_DUP_KEY = ON);

	BULK INSERT #plan2026
	FROM '\\192.168.35.3\admin3\Обмен\powerbi\plan2026.csv'
	WITH (
		  FIRSTROW        = 2,          -- пропускаем заголовок
		  FIELDTERMINATOR = ';',
		  ROWTERMINATOR   = '\n',
		  CODEPAGE        = '1251',    -- или 1251, если файл не в UTF-8
		  TABLOCK
	);

	-- Проверка
	SELECT COUNT(*)           AS total_rows,
		   COUNT(DISTINCT code) AS distinct_codes
	FROM #plan2026;

	-- Проверка
	SELECT TOP (20) * 
	FROM #plan2026


	SELECT 
		month
		, avg([koef])
	  FROM [mag_pbi].[analytics].[seasonality_groups_summ_1]
	  GROUP by month
	  order by  month




	------------------------------------------------------------
	-- 1. Средняя сезонность по месяцам → #Seasonality
	------------------------------------------------------------
	IF OBJECT_ID('tempdb..#Seasonality') IS NOT NULL
		DROP TABLE #Seasonality;

	SELECT
		  [month]
		, koef = AVG([koef])/12
	INTO #Seasonality
	FROM [mag_pbi].[analytics].[seasonality_groups_summ_1]
	GROUP BY [month];

	------------------------------------------------------------
	-- 2. Почистить сценарий 8 (если нужно пересчитать)
	------------------------------------------------------------
	DELETE FROM [mag_pbi].[analytics].[forecast]
	WHERE scenario_id = 8;

	------------------------------------------------------------
	-- 3. Записать прогноз в forecast для scenario_id = 8
	--    value = opt_месяц + mp_месяц
	------------------------------------------------------------
	INSERT INTO [mag_pbi].[analytics].[forecast] (
		  scenario_id
		, [1c_id]
		, [code]
		, [month]
		, [value]
		, [updated_at]
		, [updated_by]
		, [opt]
		, [mp]
	)
	SELECT
		  8 AS scenario_id
		, n.[1c_id]
		, p.[code]
		, DATEFROMPARTS(2026, s.[month], 1) AS [month]
		, CAST( (p.opt * s.koef) + (p.mp * s.koef) AS decimal(18,3)) AS [value]
		, GETDATE()                           AS updated_at
		, p.[updated_by]                      AS updated_by
		, CAST(p.opt * s.koef AS decimal(18,3)) AS [opt]
		, CAST(p.mp  * s.koef AS decimal(18,3)) AS [mp]
	FROM #plan2026                     AS p
	INNER JOIN [mag_pbi].[pbi].[nomenclature] AS n
		ON n.[code] = p.[code]
	CROSS JOIN #Seasonality            AS s;
	-- всего строк и разных кодов


	--EXEC [analytics].[sp_build_deficit_proposal] @scenario_id = 8
	/*
			/****** Script for SelectTopNRows command from SSMS  ******/
		INSERT INTO [mag_pbi].[analytics].[forecast] (
			  scenario_id
			, [1c_id]
			, [code]
			, [month]
			, [value]
			, [updated_at]
			, [updated_by]
			, [opt]
			, [mp]
		)
		SELECT 
			  8 AS scenario_id
			  ,[1c_id]
			  ,[code]
			  ,[month]
			  ,[value]
			  ,[updated_at]
			  ,[updated_by]
			  ,[opt]
			  ,[mp]
		  FROM [mag_pbi].[analytics].[forecast]
		  WHERE scenario_id = 5 AND code not in (SELECT code FROM [mag_pbi].[analytics].[forecast] WHERE scenario_id = 8 )
		  */

		  --EXEC [analytics].[sp_fill_deficit_money_request] @scenario_id = 8
		  
END
GO

/****** Object:  StoredProcedure [analytics].[usp_CreateForecastBasesKs]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE analytics.usp_CreateForecastBasesKs
AS
BEGIN
    SET NOCOUNT ON;

    -- Удаляем вьюху, если существует
    IF OBJECT_ID('analytics.ForecastBasesKs', 'V') IS NOT NULL
        DROP VIEW analytics.ForecastBasesKs;

    -- Создаём заново
    EXEC('
    CREATE VIEW [analytics].[ForecastBasesKs] AS
    WITH MaxDate AS (
        SELECT MAX(Период) AS max_date
        FROM [pbi].[Себестоимость]
        WHERE Статья = ''реализация''
    ),
    LastFullMonth AS (
        SELECT 
            YEAR(DATEADD(MONTH, -1, max_date)) AS last_year,
            MONTH(DATEADD(MONTH, -1, max_date)) AS last_month
        FROM MaxDate
    ),
    -- 1. Продажи по SKU × месяц
    Sales AS (
        SELECT
            artic_id,
            YEAR(Период) AS Год,
            MONTH(Период) AS Месяц,
            SUM(Количество) AS total_sales
        FROM [pbi].[Себестоимость]
        WHERE Статья = ''реализация''
        GROUP BY artic_id, YEAR(Период), MONTH(Период)
    ),
    -- 2. Дни в продаже
    Stock AS (
        SELECT
            artic_id,
            YEAR(dt) AS Год,
            MONTH(dt) AS Месяц,
            SUM(CASE WHEN ostatok = 1 THEN 1 ELSE 0 END) AS days_available
        FROM [pbi].[w_ostatok_da_net]
        GROUP BY artic_id, YEAR(dt), MONTH(dt)
    ),
    -- 3. База
    Base AS (
        SELECT
            s.artic_id,
            n.code,
            n.description,
            s.Год,
            s.Месяц,
            s.total_sales,
            st.days_available,
            sg.seasonal_koef,
            (s.total_sales / NULLIF(sg.seasonal_koef,0)) AS Normalized_sales,
            CASE WHEN st.days_available > 19 THEN 1 ELSE 0 END AS valid_month,
            CASE WHEN st.days_available > 19 
                 THEN (s.total_sales / NULLIF(sg.seasonal_koef,0)) 
                 ELSE NULL END AS normalized_valid_sales
        FROM Sales s
        LEFT JOIN Stock st
            ON s.artic_id = st.artic_id
           AND s.Год = st.Год
           AND s.Месяц = st.Месяц
        JOIN [pbi].[nomenclature] n
            ON s.artic_id = n.artic_id
        JOIN [analytics].[seasonality_groups] sg
            ON n.[1c_group] = sg.group_1c_id
           AND s.Месяц = sg.month
    ),
    Windowed AS (
        SELECT 
            b.*,
            ROW_NUMBER() OVER (PARTITION BY b.artic_id ORDER BY (b.Год*100 + b.Месяц) DESC) AS rn_desc
        FROM Base b
    ),
    Aggregates AS (
        SELECT 
            w.artic_id,
            AVG(CASE WHEN rn_desc <= 12 THEN normalized_valid_sales END) AS Base_12M,
            CASE 
                WHEN MIN(CASE WHEN rn_desc <= 3 THEN valid_month END) = 1
                THEN AVG(CASE WHEN rn_desc <= 3 THEN normalized_valid_sales END)
                ELSE NULL 
            END AS Base_3M
        FROM Windowed w
        CROSS JOIN LastFullMonth lm
        WHERE (w.Год*100 + w.Месяц) <= (lm.last_year*100 + lm.last_month)
        GROUP BY w.artic_id
    ),
    TrendData AS (
        SELECT 
            w.artic_id,
            ROW_NUMBER() OVER (PARTITION BY w.artic_id ORDER BY (w.Год*100 + w.Месяц)) - 1 AS t,
            LOG(w.normalized_valid_sales) AS ln_sales
        FROM Windowed w
        CROSS JOIN LastFullMonth lm
        WHERE (w.Год*100 + w.Месяц) > (lm.last_year*100 + lm.last_month - 200)
          AND (w.Год*100 + w.Месяц) <= (lm.last_year*100 + lm.last_month)
          AND w.normalized_valid_sales > 0
    ),
    TrendAgg AS (
        SELECT
            artic_id,
            COUNT(*) AS n_obs,
            EXP( (AVG(t*ln_sales) - AVG(t)*AVG(ln_sales)) / NULLIF(AVG(t*t) - AVG(t)*AVG(t),0) ) AS g_raw
        FROM TrendData
        GROUP BY artic_id
        HAVING COUNT(*) >= 6
    ),
    TrendFinal AS (
        SELECT
            artic_id,
            POWER(
                CASE 
                    WHEN POWER(g_raw, 12) < 0.7 THEN 0.7
                    WHEN POWER(g_raw, 12) > 1.5 THEN 1.5
                    ELSE POWER(g_raw, 12)
                END,
                1.0/12
            ) AS Ktrend
        FROM TrendAgg
    ),
    YoYpairs AS (
        SELECT 
            w.artic_id,
            (w.Год*100 + w.Месяц) AS ym,
            w.normalized_valid_sales AS v2,
            LAG(w.normalized_valid_sales, 12) OVER (
                PARTITION BY w.artic_id ORDER BY (w.Год*100 + w.Месяц)
            ) AS v1
        FROM Windowed w
        CROSS JOIN LastFullMonth lm
        WHERE (w.Год*100 + w.Месяц) <= (lm.last_year*100 + lm.last_month)
    ),
    YoYratios AS (
        SELECT artic_id, (v2 / v1) AS ratio
        FROM YoYpairs
        WHERE v1 > 0 AND v2 > 0
    ),
    YoYFinal AS (
        SELECT DISTINCT
            artic_id,
            CASE 
                WHEN PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ratio) 
                     OVER (PARTITION BY artic_id) < 0.7 THEN 0.7
                WHEN PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ratio) 
                     OVER (PARTITION BY artic_id) > 1.5 THEN 1.5
                ELSE PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ratio) 
                     OVER (PARTITION BY artic_id)
            END AS Kgrowth_YoY,
            COUNT(ratio) OVER (PARTITION BY artic_id) AS cnt_pairs
        FROM YoYratios
    ),
    YoYFiltered AS (
        SELECT artic_id, Kgrowth_YoY
        FROM YoYFinal
        WHERE cnt_pairs >= 3
    )
    SELECT 
        n.artic_id,
        n.code,
        n.description,
        a.Base_12M,
        a.Base_3M,
        CASE 
            WHEN a.Base_3M IS NOT NULL THEN a.Base_3M
            ELSE a.Base_12M
        END AS Base_Selected,
        tf.Ktrend,
        yf.Kgrowth_YoY
    FROM pbi.nomenclature n
    LEFT JOIN Aggregates a  ON n.artic_id = a.artic_id
    LEFT JOIN TrendFinal tf ON n.artic_id = tf.artic_id
    LEFT JOIN YoYFiltered yf ON n.artic_id = yf.artic_id;
    ');

END;
GO

/****** Object:  StoredProcedure [analytics].[usp_InsertForecasts]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE analytics.usp_InsertForecasts
AS
BEGIN
    SET NOCOUNT ON;

    -- Удаляем старые прогнозы
    DELETE FROM analytics.forecast
    WHERE scenario_id IN (5, 6);

    -- Чистим временные таблицы
    IF OBJECT_ID('tempdb..#Params') IS NOT NULL DROP TABLE #Params;
    IF OBJECT_ID('tempdb..#Calendar') IS NOT NULL DROP TABLE #Calendar;

    -- #Params
    SELECT DATEFROMPARTS(
               YEAR(DATEADD(MONTH, -1, MAX(Период))),
               MONTH(DATEADD(MONTH, -1, MAX(Период))),
               1
           ) AS LastMonth
    INTO #Params
    FROM pbi.Себестоимость
    WHERE Статья = 'реализация';

    -- #Calendar
    SELECT DATEFROMPARTS(YEAR(d), MONTH(d), 1) AS MonthStart
    INTO #Calendar
    FROM (
        SELECT TOP (1000)
               DATEADD(MONTH, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), 
                       (SELECT LastMonth FROM #Params)) AS d
        FROM master..spt_values
    ) x
    WHERE d <= '2026-12-01';

    -- Вставка Trend (5)
    INSERT INTO analytics.forecast (scenario_id, [1c_id], code, [month], value, updated_at, updated_by)
    SELECT 
        5,
        n.[1c_id],
        f.code,
        c.MonthStart,
        CAST(
            ROUND(
                f.Base_Selected * sg.seasonal_koef *
                POWER(f.Ktrend, DATEDIFF(MONTH, p.LastMonth, c.MonthStart)),
                0
            ) AS numeric(18,0)
        ),
        GETDATE(),
        SUSER_SNAME()
    FROM analytics.ForecastBasesKs f
    JOIN pbi.nomenclature n ON f.artic_id = n.artic_id
    CROSS JOIN #Params p
    JOIN #Calendar c ON c.MonthStart > p.LastMonth
    JOIN analytics.seasonality_groups sg
        ON n.[1c_group] = sg.group_1c_id
       AND sg.[month] = MONTH(c.MonthStart)
    WHERE f.Base_Selected IS NOT NULL
      AND f.Ktrend IS NOT NULL;

    -- Вставка YoY (6)
    INSERT INTO analytics.forecast (scenario_id, [1c_id], code, [month], value, updated_at, updated_by)
    SELECT 
        6,
        n.[1c_id],
        f.code,
        c.MonthStart,
        CAST(
            ROUND(
                f.Base_Selected * sg.seasonal_koef * f.Kgrowth_YoY,
                0
            ) AS numeric(18,0)
        ),
        GETDATE(),
        SUSER_SNAME()
    FROM analytics.ForecastBasesKs f
    JOIN pbi.nomenclature n ON f.artic_id = n.artic_id
    CROSS JOIN #Params p
    JOIN #Calendar c ON c.MonthStart > p.LastMonth
    JOIN analytics.seasonality_groups sg
        ON n.[1c_group] = sg.group_1c_id
       AND sg.[month] = MONTH(c.MonthStart)
    WHERE f.Base_Selected IS NOT NULL
      AND f.Kgrowth_YoY IS NOT NULL;

END;
GO

/****** Object:  StoredProcedure [analytics].[Подготовка таблицы продаж к прогнозу]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE analytics.[Подготовка таблицы продаж к прогнозу] as 
BEGIN
	/* ========= ПАРАМЕТРЫ ========= */
	DECLARE @FromDate date = '2023-01-01';
	DECLARE @ToDate   date = CAST(GETDATE() AS date);

	/* ========= ВСПОМОГАТЕЛЬНЫЕ: НЕДЕЛЯ С ПОНЕДЕЛЬНИКА ========= */
	IF OBJECT_ID('tempdb..#dates') IS NOT NULL DROP TABLE #dates;
	WITH d AS (
	  SELECT @FromDate AS d
	  UNION ALL SELECT DATEADD(day,1,d) FROM d WHERE d < @ToDate
	)
	SELECT d AS [date],
		   DATEADD(day, - (DATEPART(weekday,d) + @@DATEFIRST + 5) % 7, d) AS week_start
	INTO #dates
	FROM d
	OPTION (MAXRECURSION 0);

	CREATE INDEX IX_dates_week ON #dates(week_start);

	/* ========= 1) ПРОДАЖИ (только положительные) ========= */
	IF OBJECT_ID('tempdb..#sales_raw') IS NOT NULL DROP TABLE #sales_raw;

	SELECT
		CAST(s.[Период] AS date)                       AS [date],
		s.[1c_id]                                      AS sku_id,
		CAST(s.[КоличествоУпаковок] AS decimal(18,4))  AS qty
	INTO #sales_raw
	FROM [pbiProd].[СводныйСебестоимость Для PBI] s
	WHERE
		s.[Статья] = N'Реализация'
		AND s.[Вид операции] = N'Расход'
		AND s.[КоличествоУпаковок] > 0
		AND s.[Период] >= @FromDate
		AND s.[Период] <= @ToDate;

	CREATE INDEX IX_sales_raw ON #sales_raw(sku_id, [date]);

	/* ========= 2) ФИЛЬТРУЕМ ПРОДАЖИ ПО НАЛИЧИЮ (ostatok=1 из pbi.w_ostatok_da_net) ========= */
	IF OBJECT_ID('tempdb..#sales_clean_daily') IS NOT NULL DROP TABLE #sales_clean_daily;

	SELECT
		sr.sku_id,
		sr.[date],
		sr.qty
	INTO #sales_clean_daily
	FROM #sales_raw sr
	JOIN [pbi].[w_ostatok_da_net] a
	  ON a.[_IDRREF] = sr.sku_id
	 AND a.dt        = sr.[date]
	 AND a.ostatok   = 1;

	CREATE INDEX IX_sales_clean_daily ON #sales_clean_daily(sku_id, [date]);

	/* ========= 3) АГРЕГАЦИЯ В НЕДЕЛИ ========= */
	/* 3.1 Продажи по неделям */
	IF OBJECT_ID('tempdb..#sales_weekly') IS NOT NULL DROP TABLE #sales_weekly;

	SELECT
		scd.sku_id,
		d.week_start,
		SUM(scd.qty) AS qty_week
	INTO #sales_weekly
	FROM #sales_clean_daily scd
	JOIN #dates d
	  ON d.[date] = scd.[date]
	GROUP BY scd.sku_id, d.week_start;

	CREATE INDEX IX_sales_weekly ON #sales_weekly(sku_id, week_start);

	/* 3.2 Доля доступности по неделям (из pbi.w_ostatok_da_net) */
	IF OBJECT_ID('tempdb..#avail_weekly') IS NOT NULL DROP TABLE #avail_weekly;

	SELECT
		a.[_IDRREF]                  AS sku_id,
		d.week_start,
		SUM(a.ostatok)               AS days_available,
		COUNT(*)                     AS days_total,
		CAST(SUM(a.ostatok) * 1.0 / NULLIF(COUNT(*),0) AS decimal(6,4)) AS availability_rate
	INTO #avail_weekly
	FROM [pbi].[w_ostatok_da_net] a
	JOIN #dates d
	  ON d.[date] = a.dt
	WHERE a.dt BETWEEN @FromDate AND @ToDate
	GROUP BY a.[_IDRREF], d.week_start;

	CREATE INDEX IX_avail_weekly ON #avail_weekly(sku_id, week_start);

	/* ========= 4) СКЛЕЙКА: оставляем недели без продаж, если товар был доступен ========= */
	IF OBJECT_ID('tempdb..#weekly_base') IS NOT NULL DROP TABLE #weekly_base;

	SELECT
		COALESCE(sw.sku_id, aw.sku_id)             AS sku_id,
		COALESCE(sw.week_start, aw.week_start)     AS week_start,
		COALESCE(sw.qty_week, 0)                   AS qty_week,
		COALESCE(aw.availability_rate, 0)          AS availability_rate
	INTO #weekly_base
	FROM #sales_weekly sw
	FULL JOIN #avail_weekly aw
	  ON aw.sku_id = sw.sku_id
	 AND aw.week_start = sw.week_start;

	CREATE INDEX IX_weekly_base ON #weekly_base(sku_id, week_start);

	/* ========= 5) МЕТАДАННЫЕ SKU (cat L1, minAvailableQty) ========= */
	IF OBJECT_ID('tempdb..#sku_meta') IS NOT NULL DROP TABLE #sku_meta;

	SELECT
		n.[1c_id]  AS sku_id,
		n.minAvailableQty,
		CAST(CASE 
			WHEN CHARINDEX(N' | ', g.path) > 0 
				 THEN LEFT(g.path, CHARINDEX(N' | ', g.path) - 1)
			ELSE g.path
		END AS nvarchar(200)) AS category_l1
	INTO #sku_meta
	FROM [mag_pbi].[pbi].[nomenclature] n
	LEFT JOIN [mag_pbi].[pbi].[groups] g
	  ON g.group_id = n.group_id;

	CREATE INDEX IX_sku_meta ON #sku_meta(sku_id);

	/* ========= 6) ВИТРИНА С ЛАГАМИ И ФИЧАМИ (analytics) ========= */
	IF OBJECT_ID('analytics.sales_weekly_features', 'U') IS NOT NULL
		DROP TABLE analytics.sales_weekly_features;

	CREATE TABLE analytics.sales_weekly_features (
		sku_id            varbinary(16) NOT NULL,
		week_start        date          NOT NULL,
		qty_week          decimal(18,4) NOT NULL,
		availability_rate decimal(6,4)  NOT NULL,
		-- календарные
		year_num          int           NOT NULL,
		month_num         tinyint       NOT NULL,
		iso_week          tinyint       NOT NULL,
		quarter_num       tinyint       NOT NULL,
		dow_monday1       tinyint       NOT NULL,
		-- справочники
		category_l1       nvarchar(200) NULL,
		minAvailableQty   decimal(18,4) NULL,
		-- лаги
		lag_w1            decimal(18,4) NULL,
		lag_w2            decimal(18,4) NULL,
		lag_w4            decimal(18,4) NULL,
		lag_w12           decimal(18,4) NULL,
		lag_w26           decimal(18,4) NULL,
		lag_w52           decimal(18,4) NULL,
		-- скользящие средние
		ma4               decimal(18,4) NULL,
		ma12              decimal(18,4) NULL,
		created_at        datetime2      NOT NULL DEFAULT sysutcdatetime(),
		CONSTRAINT PK_sales_weekly_features PRIMARY KEY (sku_id, week_start)
	);

	WITH base AS (
	  SELECT wb.sku_id,
			 wb.week_start,
			 wb.qty_week,
			 wb.availability_rate,
			 YEAR(wb.week_start)               AS year_num,
			 MONTH(wb.week_start)              AS month_num,
			 DATEPART(ISO_WEEK, wb.week_start) AS iso_week,
			 DATEPART(QUARTER, wb.week_start)  AS quarter_num,
			 1                                 AS dow_monday1
	  FROM #weekly_base wb
	),
	enriched AS (
	  SELECT b.*,
			 m.category_l1,
			 m.minAvailableQty
	  FROM base b
	  LEFT JOIN #sku_meta m
		ON m.sku_id = b.sku_id
	),
	lags AS (
	  SELECT 
		e.*,
		LAG(e.qty_week, 1)  OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w1,
		LAG(e.qty_week, 2)  OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w2,
		LAG(e.qty_week, 4)  OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w4,
		LAG(e.qty_week, 12) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w12,
		LAG(e.qty_week, 26) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w26,
		LAG(e.qty_week, 52) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w52,
		CAST(AVG(e.qty_week) OVER (
			PARTITION BY e.sku_id 
			ORDER BY e.week_start 
			ROWS BETWEEN 4  PRECEDING AND 1 PRECEDING
		) AS decimal(18,4)) AS ma4,
		CAST(AVG(e.qty_week) OVER (
			PARTITION BY e.sku_id 
			ORDER BY e.week_start 
			ROWS BETWEEN 12 PRECEDING AND 1 PRECEDING
		) AS decimal(18,4)) AS ma12
	  FROM enriched e
	)
	INSERT INTO analytics.sales_weekly_features (
		sku_id, week_start, qty_week, availability_rate,
		year_num, month_num, iso_week, quarter_num, dow_monday1,
		category_l1, minAvailableQty,
		lag_w1, lag_w2, lag_w4, lag_w12, lag_w26, lag_w52,
		ma4, ma12
	)
	SELECT
		sku_id, week_start, qty_week, availability_rate,
		year_num, month_num, iso_week, quarter_num, dow_monday1,
		category_l1, minAvailableQty,
		lag_w1, lag_w2, lag_w4, lag_w12, lag_w26, lag_w52,
		ma4, ma12
	FROM lags;

	CREATE INDEX IX_sales_weekly_features_sku ON analytics.sales_weekly_features(sku_id, week_start);
	CREATE INDEX IX_sales_weekly_features_cat ON analytics.sales_weekly_features(category_l1, week_start);
END
GO

/****** Object:  StoredProcedure [dbo].[sp_create_forecast_deficit_money_request_scenario_4]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE sp_create_forecast_deficit_money_request_scenario_4 AS
	BEGIN
  		--запускать только при изменении дат внутри процедуры
		--EXEC [analytics].[sp_fill_seasonality_groups_summ_1]; 

		DELETE FROM [mag_pbi].[analytics].[forecast] WHERE scenario_id = 4
			SELECT count(*) FROM [mag_pbi].[analytics].[forecast] WHERE scenario_id = 4
   
		EXEC [analytics].[sp_fill_seasonality_groups_summ_1];
		EXEC [analytics].[create_forecast_loop]
			SELECT count(*) FROM [mag_pbi].[analytics].[forecast] WHERE scenario_id = 4

		EXEC [analytics].[sp_run_deficit_all_skus] @scenario_id = 4;
		EXEC [analytics].[sp_fill_deficit_money_request] @scenario_id = 4;
	END
GO

/****** Object:  StoredProcedure [dbo].[Расчет себестоимости 1 этап]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[Расчет себестоимости 1 этап] 
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	
	exec sebest.[Заполнить себестоимость закупкой]
	exec sebest.[Заполнить себестоимость начальным остатком]

	DELETE FROM [pbi].[СебестоимостьПродажи]
      WHERE 1=1


	
END
GO

/****** Object:  StoredProcedure [pbi].[migrate_groups]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	миграция регистров ВыручкаИСебестоимость продаж из двух баз
-- =============================================
CREATE PROCEDURE  [pbi].[migrate_groups] 
AS
BEGIN
	DROP TABLE [pbi].groups
	

	SELECT 
	*
	INTO [pbi].groups
	FROM [mag_pbi].[pbi].[groups_view]

	CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190906-120551] ON [pbi].[groups]
	(
		[group_id] ASC
	)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
	--GO
	ALTER TABLE [mag_pbi].[pbi].groups ADD [план] float NULL;
	ALTER TABLE [mag_pbi].[pbi].groups ADD [first group] NVARCHAR(36) NULL;

	 UPDATE [mag_pbi].[pbi].groups set [first group] = 
		(SELECT group_id FROM [mag_pbi].[pbi].groups gg WHERE gg.g = g.g and gg._ParentIDRRef = '00000000-0000-0000-0000-000000000000' )
	 FROM [mag_pbi].[pbi].groups g

	CREATE NONCLUSTERED INDEX IX_groups__g
	ON [pbi].[groups] ([g])
	INCLUDE ([group_id]);

	--CREATE NONCLUSTERED INDEX [1c_group_index]
	--ON [pbi].[nomenclature] ([1c_group])

END
GO

/****** Object:  StoredProcedure [pbi].[migrate_max_year_quantity]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_max_year_quantity] as
BEGIN

	-- ДЕЛАЕМ ДВА ПОЛЯ 
	-- max_year_quantity
	-- max_quarter_quantity
	
		IF NOT EXISTS (
			SELECT 1
			FROM INFORMATION_SCHEMA.COLUMNS
			WHERE TABLE_NAME = 'nomenclature' AND TABLE_SCHEMA='pbi'
			  AND COLUMN_NAME = 'max_year_quantity'
		)
		BEGIN
			ALTER TABLE mag_pbi.pbi.nomenclature
			ADD max_year_quantity NUMERIC(38,3) NULL;
		END

		UPDATE n
		SET n.max_year_quantity = (
			SELECT MAX(quantity) FROM pbi.[w_ostatok_da_net] o WHERE o._IDRREF = n.[1c_id] AND o.dt >= DATEADD(year,  -1, CAST(GETDATE() AS date))
		)
		FROM mag_pbi.pbi.nomenclature n
		
	
		--Нужно обязательно добавить регистр закупки, т.к. прием на склад идет не всегда всей партией товара
		;WITH YearlyQuantity AS (
			SELECT 
				analitikaUchetaNomenklaturi.[_Fld20498RRef] AS [1c_id],
				SUM(
					CASE 
						WHEN r._RecorderTRef IN (0x000001E3, 0x00000189, 0x000001D5, 0x000001B0) 
							THEN CASE [_Fld16345RRef] 
									 WHEN 0x970191967A54A8814BA45C6234640F68 THEN -[_Fld16361]
									 ELSE [_Fld16361] 
								 END
						WHEN r._RecorderTRef = 0x0000020D THEN 0
						WHEN r._RecorderTRef = 0x000001A1 THEN 0
						ELSE 0 
					END
				) AS total_quantity
			FROM mag_2019.dbo._AccumRg16344 r -- Регистр накопления Закупки
			LEFT JOIN [MAG_2019].[dbo].[_Reference160] AS analitikaUchetaNomenklaturi
				ON analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef]
			WHERE DATEADD(year, -2000, _Period) >= DATEADD(YEAR, -1, GETDATE())
			GROUP BY analitikaUchetaNomenklaturi.[_Fld20498RRef]
		)

		UPDATE n
		SET n.[max_year_quantity] = 
			CASE 
				WHEN y.total_quantity > n.[max_year_quantity] THEN y.total_quantity 
				ELSE n.[max_year_quantity] 
			END
		FROM [mag_pbi].[pbi].[nomenclature] n
		JOIN YearlyQuantity y ON n.[1c_id] = y.[1c_id];


------------------------------------------------------------------

-- max_quarter_quantity
		
		IF NOT EXISTS (
			SELECT 1
			FROM INFORMATION_SCHEMA.COLUMNS
			WHERE TABLE_NAME = 'nomenclature' AND TABLE_SCHEMA='pbi'
			  AND COLUMN_NAME = 'max_quarter_quantity'
		)
		BEGIN
			ALTER TABLE mag_pbi.pbi.nomenclature
			ADD max_quarter_quantity NUMERIC(38,3) NULL;
		END

		UPDATE n
		SET n.max_quarter_quantity = (
			SELECT MAX(quantity) FROM pbi.[w_ostatok_da_net] o WHERE o._IDRREF = n.[1c_id] AND o.dt >= DATEADD(month,  -3, CAST(GETDATE() AS date))
		)
		FROM mag_pbi.pbi.nomenclature n
		
		--Нужно обязательно добавить регистр закупки, т.к. прием на склад идет не всегда всей партией товара
		;WITH QuarterlyQuantity AS (
			SELECT 
				analitikaUchetaNomenklaturi.[_Fld20498RRef] AS [1c_id],
				SUM(
					CASE 
						WHEN r._RecorderTRef IN (0x000001E3, 0x00000189, 0x000001D5, 0x000001B0) 
							THEN CASE [_Fld16345RRef] 
									 WHEN 0x970191967A54A8814BA45C6234640F68 THEN -[_Fld16361]
									 ELSE [_Fld16361] 
								 END
						WHEN r._RecorderTRef = 0x0000020D THEN 0
						WHEN r._RecorderTRef = 0x000001A1 THEN 0
						ELSE 0 
					END
				) AS total_quantity
			FROM mag_2019.dbo._AccumRg16344 r -- Регистр накопления Закупки
			LEFT JOIN [MAG_2019].[dbo].[_Reference160] AS analitikaUchetaNomenklaturi
				ON analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef]
			WHERE DATEADD(year, -2000, _Period) >= DATEADD(MONTH, -3, GETDATE())
			--AND analitikaUchetaNomenklaturi.[_Fld20498RRef] = 0x9989B49691D57EFD11EF3F6ADA21AED9
			GROUP BY analitikaUchetaNomenklaturi.[_Fld20498RRef]
		)

		UPDATE n
		SET n.max_quarter_quantity = 
			CASE 
				WHEN y.total_quantity > n.max_quarter_quantity THEN y.total_quantity 
				ELSE n.max_quarter_quantity 
			END
		FROM [mag_pbi].[pbi].[nomenclature] n
		JOIN QuarterlyQuantity y ON n.[1c_id] = y.[1c_id];

END
GO

/****** Object:  StoredProcedure [pbi].[migrate_nomenclature]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	миграция регистров ВыручкаИСебестоимость продаж из двух баз
-- =============================================
CREATE PROCEDURE  [pbi].[migrate_nomenclature] 
AS
BEGIN
 	
	DROP TABLE IF EXISTS #dop
	SELECT * INTO #dop
	FROM(
		SELECT * FROM mag_pbi.pbi.[значения доп реквизитов номенклатуры]
		)as t
	
	CREATE NONCLUSTERED INDEX [NonClusteredIndex-1] ON #dop
	(_Reference188_IDRRef, _Fld21137RRef)

   DROP table IF EXISTS pbi.nomenclature
   SELECT *
   INTO pbi.nomenclature
   FROM(

	SELECT 
		LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),5,12) ))as artic_id
		, n._IDRRef as '1c_id'
		, n._Code as code
		, CASE 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Рублевая' 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Валютная' 
				ELSE 'Неопределено'
			END as cenovaya_gruppa

		, n._Description as description /*Наименование*/
		, n._Fld21043 as artic /*Артикул*/
		, n._Fld21053RRef as vid_nomen
		, cast( (SELECT _Description FROM [MAG_2019].[dbo].[_Reference260] pr WHERE pr._IDRRef = n._Fld21079RRef) as nvarchar(max)) as 'Производитель'
		, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2),5,12) ))as group_id
		
		, n._ParentIDRRef as '1c_group'
		--, isnull(us._Description, 'Менеджер') as [manager]

		, qr._Fld27045 as 'card'
		, concat('https://media.magok.ru/', f._Fld21201) as 'photo'
		, 2019 as base
		, n._Fld21046 as [Знаменатель веса]
		, n._Fld21049 as [Числитель веса]
		, n._Fld21089 as [Знаменатель объема]
		, n._Fld21092 as [Числитель объема]
		, n._Fld33769 as [Количество упак в коробе]
		, n._Fld33771 as [Количество упак в кванте]
		, n._Fld33413 as [id magok]

		, (SELECT value FROM #dop where _Fld21137RRef = 0x810D0CC47A052DFD11E8C0B216664650 and _Reference188_IDRRef =n._IDRRef) as [Товарныйменеджера]
		, (SELECT value FROM #dop where _Fld21137RRef = 0xAEA2B496910DCFD611E9DAEF699391C4 and _Reference188_IDRRef =n._IDRRef) as [МенеджерПоЗакупкам2]
		, (SELECT value FROM #dop where _Fld21137RRef = 0xAEA2B496910DCFD611E9DAF2AF0FBF08 and _Reference188_IDRRef =n._IDRRef) as [РуководительНаправления]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x9980B49691D57EFD11EDA7A875968BE2 and _Reference188_IDRRef =n._IDRRef) as [Менеджер OZON]
		, (SELECT value FROM #dop where _Fld21137RRef = 0xAEC4B496910DCFD611EC4E8357703C3A and _Reference188_IDRRef =n._IDRRef) as [Менеджер WB]
		, (SELECT value FROM #dop where _Fld21137RRef = 0xAEACB496910DCFD611EA4980351CDD01 and _Reference188_IDRRef =n._IDRRef) as [АБС статус]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F011642C1217A0 and _Reference188_IDRRef =n._IDRRef) as [АБС план]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F0C4629BFA88FF and _Reference188_IDRRef =n._IDRRef) as [ABC Парето]
		--, (SELECT value FROM #dop where _Fld21137RRef = 0x9987B49691D57EFD11EEFD8C032DF868 and _Reference188_IDRRef =n._IDRRef) as [АБС МП]
		--, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F08C910065CAE0 and _Reference188_IDRRef =n._IDRRef) as [ABC статус 12м 08.25]
		--, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F08C9141DE8102 and _Reference188_IDRRef =n._IDRRef) as [ABC статус 3м 08.25]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F078456358DE9B and _Reference188_IDRRef =n._IDRRef) as [XYZ статус 12м]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F0D41588B52E51 and _Reference188_IDRRef =n._IDRRef) as [Комментарий для матрицы]
		--, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F078466D61B354 and _Reference188_IDRRef =n._IDRRef) as [XYZ статус 3м]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x80C7305A3A00E12B11E5A300C980DC00 and _Reference188_IDRRef =n._IDRRef) as [Коллекция]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F037A75A7E983E and _Reference188_IDRRef =n._IDRRef) as [Ценовой сегмент Магок]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F037A7EA5402D7 and _Reference188_IDRRef =n._IDRRef) as [Ценовой сегмент МП]
		, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F037A7C791FA85 and _Reference188_IDRRef =n._IDRRef) as [Кол-во упак в заказе Магок]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x80F1305A3A00E12B11E63C4A303F49FB and _Reference188_IDRRef=n._IDRRef) as [Бренд]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A30013708A94 and _Reference188_IDRRef=n._IDRRef) as [Тип товара]			
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80D00CC47A052DFD11E691F14188BF4D and _Reference188_IDRRef=n._IDRRef) as [Метка]	
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80E00CC47A052DFD11E7029264A93CF6 and _Reference188_IDRRef=n._IDRRef) as [Ширина, мм]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A3008141292E and _Reference188_IDRRef=n._IDRRef) as [Цвет]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80E90CC47A052DFD11E72379276D8356 and _Reference188_IDRRef=n._IDRRef) as [Номер цвета]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0xAE9EB496910DCFD611E95F5710EB0448 and _Reference188_IDRRef=n._IDRRef) as [Тип шнура]
		--, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0xAE9EB496910DCFD611E95F5783A48B03 and _Reference188_IDRRef=n._IDRRef) as [Наполнитель]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0xAE9EB496910DCFD611E95F572768CAA7 and _Reference188_IDRRef=n._IDRRef) as [Тип плетения]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A2717FE9DE3A and _Reference188_IDRRef=n._IDRRef) as [Размер]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A3001EDD22AF and _Reference188_IDRRef=n._IDRRef) as [Особенность]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A300C980DC01 and _Reference188_IDRRef=n._IDRRef) as [Форма]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A300E8BE58AC and _Reference188_IDRRef=n._IDRRef) as [Ширина]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x997DB49691D57EFD11EC7F7E661783C3 and _Reference188_IDRRef=n._IDRRef) as [Формат упаковки]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5BAD05261251C and _Reference188_IDRRef=n._IDRRef) as [Макс. запас]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5BAD0706896DA and _Reference188_IDRRef=n._IDRRef) as [Мин. запас]
		, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x998CB49691D57EFD11EF9202AB464430 and _Reference188_IDRRef=n._IDRRef) as [QTY PACKS]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEA1B496910DCFD411E9B50C873C5A12 and _Reference188_IDRRef=n._IDRRef) as [Да/Нет Собственное пр-во]		
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x997DB49691D57EFD11EC9644B479DD39 and _Reference188_IDRRef=n._IDRRef) as [ID OZON]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x997DB49691D57EFD11EC8D98061ED9EB and _Reference188_IDRRef=n._IDRRef) as [ID WB]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBE86B75A98522 and _Reference188_IDRRef=n._IDRRef) as [WB]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC3B496910DCFD611EC1BAAEA86F8FE and _Reference188_IDRRef=n._IDRRef) as [Ozon]
		--, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBE86B6E01B921 and _Reference188_IDRRef=n._IDRRef) as [FBS]	
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBE60A4FB56689 and _Reference188_IDRRef=n._IDRRef) as [СТМ]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBDE53817D5CA3 and _Reference188_IDRRef=n._IDRRef) as [Выгружать на я.маркет]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBF5E566B4B9C7 and _Reference188_IDRRef=n._IDRRef) as [Выгружать в Google Merchant]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x998BB49691D57EFD11EF646A898FFD9C and _Reference188_IDRRef=n._IDRRef) as [Товар МП]
		, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x997DB49691D57EFD11EC96300ACEF865 and _Reference188_IDRRef=n._IDRRef) as [Неликвид]
				
		
		/* найти реквизит
						select * from (
							SELECT _IDRref, _Fld17721 as _Description FROM  [MAG_2019].[dbo].[_Chrc1109] 
							--UNION ALL
							--SELECT _reference69_IDRRef, _Fld18673 as _Description  FROM [MAG_2019].[dbo].[_Reference69_VT18669]
						) as t
						where t._Description like '%ширина%'
						*/
		, (SELECT value FROM #dop r where r._Fld21137RRef = 0x80DB0CC47A052DFD11E6E88DD05808D1 and r._Reference188_IDRRef=n._IDRRef) as [Статус]
		, (SELECT value FROM #dop r where r._Fld21137RRef = 0xAEBFB496910DCFD611EB9209C2655457 and r._Reference188_IDRRef=n._IDRRef) as [Сквозной цвет]
		, (SELECT TOP 1 upakovka FROM pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) as 'Базовая упаковка'
		, rating.ozon as 'Качество контента Ozon'
		, rating.wb as 'Качество контента WB'
		, rating.wb_by_ozon as 'Качество контента WB by Ozon'
		, rating.magok as 'Качество контента Magok'
		, (select r._Description from [MAG_2019].[dbo].[_Reference69] /*виды ном*/ r WHERE r._IDRRef = n._Fld21053RRef) as [Вид номенклатуры]
		 
	 from 
		[mag_2019].[dbo]._Reference188X1 n /*номенклатура*/ 
			LEFT JOIN [mag_pbi].[pbi].[content_rating] rating /* Качество контента */ ON rating.code = n._Code
			LEFT JOIN  [mag_2019].[dbo].[_InfoRg27043X1] /* Регистр сведений QR коды */ qr ON qr._Fld27044RRef = n._IDRRef
			LEFT JOIN [mag_2019].[dbo]._Reference191X1 f /*номенклатураПрисоедФайлы*/ 
				ON f._IDRRef = n._Fld21086RRef
	  WHERE  n._Folder = 1

	) as nom_2019

	ALTER TABLE mag_pbi.pbi.nomenclature
		ADD max_year_quantity NUMERIC(38,3) NULL;

	ALTER TABLE mag_pbi.pbi.nomenclature
		ADD max_quarter_quantity NUMERIC(38,3) NULL;

	ALTER TABLE [mag_pbi].[pbi].[nomenclature] ADD [Цена учетная, руб] DECIMAL(18,7) NULL;
	ALTER TABLE [mag_pbi].[pbi].[nomenclature] ADD [Цена учетная, usd] DECIMAL(18,7) NULL;

	-- Шаг 1: CTE для отбора строк из 'Себестоимость'
	WITH Закупки AS (
		SELECT
			CAST(s.[Период] AS DATE) AS [Период],
			s.[artic_id],
			s.[Количество] AS [Кол-во закупка],
			s.[Закупка] AS [Закуп.Закупка, руб],
			s.[Закупка, usd2] AS [Закуп.Закупка, usd2],
			s.[Доставка] AS [Закуп.Доставка, руб],
			s.[Таможня] AS [Закуп.Таможня, руб],
			s.[НДС] AS [Закуп.НДС, руб],
			s.[Производство] AS [Закуп.Производство, руб],
			s.[Доп расходы] AS [Закуп.Доп расходы, руб],
			s.[Курс usd2]
		FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
		WHERE s.[Вид операции] = 'Приход'
		AND s.[Статья] IN (
            'Закупка',
            'Ввод начальных остатков',
            'Производство товара',
            'Доставка контейнера ВЭД',
            'НДС',
            'Доп расходы'
		)
	),

	-- Шаг 2: Получить максимальную дату по каждому товару
	МаксДата AS (
		SELECT
			z.artic_id,
			MAX(z.[Период]) AS LastKnowDate
		FROM Закупки z
		GROUP BY z.artic_id
	),

	-- Шаг 3: Вычисление последней закупочной цены
	ПоследняяЦена AS (
		SELECT TOP (1) WITH TIES
			z.artic_id,
			z.[Период],
			SUM(ISNULL(z.[Закуп.Закупка, руб],0) + ISNULL(z.[Закуп.Таможня, руб],0) + ISNULL(z.[Закуп.Доставка, руб],0) +
				ISNULL(z.[Закуп.НДС, руб],0) + ISNULL(z.[Закуп.Производство, руб],0) - ISNULL(z.[Закуп.Доп расходы, руб],0)
			) AS [Сумма закупки, руб],

			SUM(ISNULL(z.[Закуп.Закупка, usd2],0) + (
				ISNULL(z.[Закуп.Таможня, руб],0) + ISNULL(z.[Закуп.Доставка, руб],0) +
				ISNULL(z.[Закуп.НДС, руб],0) + ISNULL(z.[Закуп.Производство, руб],0) - 
				ISNULL(z.[Закуп.Доп расходы, руб],0)) / z.[Курс usd2]
			) AS [Сумма закупки, usd],

			SUM(z.[Кол-во закупка]) AS [Кол-во закупка]

		FROM Закупки z
		INNER JOIN МаксДата m ON z.artic_id = m.artic_id AND z.[Период] <= m.LastKnowDate
		GROUP BY z.artic_id, z.[Период]
		ORDER BY ROW_NUMBER() OVER (PARTITION BY z.artic_id ORDER BY z.[Период] DESC)
	)

	-- Шаг 4: Обновление таблицы Номенклатура
	UPDATE n
	SET 
		n.[Цена учетная, руб] = 
			CASE 
				WHEN p.[Кол-во закупка] = 0 THEN 0
				ELSE p.[Сумма закупки, руб] * 1.0 / p.[Кол-во закупка]
			END,

		n.[Цена учетная, usd] = 
			CASE 
				WHEN p.[Кол-во закупка] = 0 THEN 0
				ELSE p.[Сумма закупки, usd] * 1.0 / p.[Кол-во закупка]
			END

	FROM [mag_pbi].[pbi].[nomenclature] n
	INNER JOIN ПоследняяЦена p ON n.[artic_id] = p.artic_id




	------------ Ср. кв. отклонение ----------------------
	ALTER TABLE [mag_pbi].[pbi].[nomenclature]
	ADD СредниеМесячныеПродажи FLOAT,
		СКО_МесячныхПродаж FLOAT,
		--minAvailableQty10 decimal(18,4) NULL, /* минимальный остаток = 10% от СредниеМесячныеПродажи*/
		minAvailableQty decimal(18,4) NULL; 

	WITH MonthlySales AS (
		SELECT 
			[1c_id],
			DATEFROMPARTS(YEAR([Период]), MONTH([Период]), 1) AS Месяц,
			--FORMAT(Период, 'yyyy-MM') AS Месяц, /*этот код дает ошибку,делает дубли строк и дат внутри месяца, заменила*/
			SUM(КоличествоУпаковок) AS СуммаПродаж
		FROM [pbiProd].[СводныйСебестоимость Для PBI]
		WHERE 
			[Статья] = 'Реализация'
			AND [Вид операции] = 'Расход'
			AND [Период] >= DATEFROMPARTS(YEAR(DATEADD(MONTH, -12, GETDATE())), MONTH(DATEADD(MONTH, -12, GETDATE())), 1)
			AND [Период] < DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) /*добавила, нам нужно 12 полных месяцев*/
		GROUP BY [1c_id], DATEFROMPARTS(YEAR([Период]), MONTH([Период]), 1) --FORMAT(Период, 'yyyy-MM')
	),
	Stats AS (
		SELECT 
			[1c_id],
			AVG(ISNULL(СуммаПродаж, 0)) AS СредниеМесячныеПродажи,
			STDEVP(ISNULL(СуммаПродаж, 0)) AS СКО_МесячныхПродаж
		FROM MonthlySales
		GROUP BY [1c_id]
	)
	UPDATE n
	SET 
		n.СредниеМесячныеПродажи = s.СредниеМесячныеПродажи,
		n.СКО_МесячныхПродаж = s.СКО_МесячныхПродаж,
		n.minAvailableQty = 
			CASE
				WHEN s.СредниеМесячныеПродажи IS NULL
					OR s.СредниеМесячныеПродажи = 0
					THEN 0.1
				WHEN s.СредниеМесячныеПродажи >= 100
					THEN 10
				ELSE s.СредниеМесячныеПродажи * 0.1
			END

	FROM [mag_pbi].[pbi].[nomenclature] n
	LEFT JOIN Stats s ON n.[1c_id] = s.[1c_id];
	------------------------------------------------------
/* старый расчет минимального остатка

	----- Минимальный доступный остаток, используется для определения есть товар на складе или нет ------------
	DECLARE @from_date date = '2024-01-01';
	DECLARE @N_min int = 20;   -- минимальное число строк продаж, чтобы доверять перцентилю SKU

	/* === 0) Добавим колонку minAvailableQty, если её нет === */
	IF COL_LENGTH('[mag_pbi].[pbi].[nomenclature]', 'minAvailableQty') IS NULL
	BEGIN
		ALTER TABLE [mag_pbi].[pbi].[nomenclature]
		  ADD minAvailableQty decimal(18,4) NULL;
	END

	/* === 1) Продажи: берём только фактический расход > 0 === */
	IF OBJECT_ID('tempdb..#sales') IS NOT NULL DROP TABLE #sales;

	SELECT
		CAST(s.[Период] AS date)                              AS order_date,
		CAST(s.[КоличествоУпаковок] AS decimal(18,4))         AS qty,
		s.[1c_id]                                             AS sku_id
	INTO #sales
	FROM [pbiProd].[СводныйСебестоимость Для PBI] s
	WHERE
		s.[Статья] = N'Реализация'
		AND s.[Вид операции] = N'Расход'
		AND s.[КоличествоУпаковок] > 0
		AND s.[Период] >= @from_date;

	/* === 2) Перцентиль P20 по SKU === */
	IF OBJECT_ID('tempdb..#sku_q') IS NOT NULL DROP TABLE #sku_q;

	WITH q AS (
		SELECT
			sku_id,
			PERCENTILE_CONT(0.20) WITHIN GROUP (ORDER BY qty)
				OVER (PARTITION BY sku_id) AS q20_sku,
			COUNT(*) OVER (PARTITION BY sku_id) AS n_lines
		FROM #sales
	)
	SELECT DISTINCT
		sku_id,
		q20_sku,
		n_lines,
		-- базовая нормализация: минимум 1 и округление вверх до целого
		CAST(CASE
			WHEN q20_sku IS NULL OR q20_sku < 1 THEN 1
			ELSE CEILING(q20_sku)
		END AS decimal(18,4)) AS min_avail_sku
	INTO #sku_q
	FROM q;

	/* === 3) Категория 1-го уровня: берём 1-й сегмент из groups.path (без вьюх) === */
	IF OBJECT_ID('tempdb..#sku_catL1') IS NOT NULL DROP TABLE #sku_catL1;

	SELECT
		n.[1c_id] AS sku_id,
		-- первый сегмент до ' | ' или весь path, если разделителя нет
		CAST(CASE 
			WHEN CHARINDEX(N' | ', g.path) > 0 
			  THEN LEFT(g.path, CHARINDEX(N' | ', g.path) - 1)
			ELSE g.path
		END AS nvarchar(200)) AS category_l1
	INTO #sku_catL1
	FROM [mag_pbi].[pbi].[nomenclature] n
	JOIN [mag_pbi].[pbi].[groups] g
	  ON g.group_id = n.group_id;

	/* === 4) Перцентиль P20 по категории 1-го уровня (фолбэк) === */
	IF OBJECT_ID('tempdb..#cat_q') IS NOT NULL DROP TABLE #cat_q;

	WITH sales_cat AS (
		SELECT 
			c.category_l1,
			s.qty
		FROM #sales s
		JOIN #sku_catL1 c
		  ON c.sku_id = s.sku_id
	),
	qcat AS (
		SELECT
			category_l1,
			PERCENTILE_CONT(0.20) WITHIN GROUP (ORDER BY qty)
				OVER (PARTITION BY category_l1) AS q20_cat,
			COUNT(*) OVER (PARTITION BY category_l1) AS n_lines_cat
		FROM sales_cat
	)
	SELECT DISTINCT
		category_l1,
		q20_cat,
		n_lines_cat,
		CAST(CASE
			WHEN q20_cat IS NULL OR q20_cat < 1 THEN 1
			ELSE CEILING(q20_cat)
		END AS decimal(18,4)) AS min_avail_cat
	INTO #cat_q
	FROM qcat;

	/* === 5) Выбор порога: если по SKU достаточно строк — берём SKU, иначе — по категории === */
	IF OBJECT_ID('tempdb..#final_min') IS NOT NULL DROP TABLE #final_min;

	SELECT
		n.[1c_id] AS sku_id,
		COALESCE(
			CASE WHEN q.n_lines >= @N_min AND q.min_avail_sku IS NOT NULL
				 THEN q.min_avail_sku END,
			cq.min_avail_cat,  -- фолбэк по категории
			CAST(1 AS decimal(18,4))  -- на крайний случай
		) AS min_avail_final
	INTO #final_min
	FROM [mag_pbi].[pbi].[nomenclature] n
	LEFT JOIN #sku_q q
	  ON q.sku_id = n.[1c_id]
	LEFT JOIN #sku_catL1 c
	  ON c.sku_id = n.[1c_id]
	LEFT JOIN #cat_q cq
	  ON cq.category_l1 = c.category_l1;

	/* === 6) Обновляем поле в номенклатуре === */
	UPDATE n
	SET n.minAvailableQty = f.min_avail_final
	FROM [mag_pbi].[pbi].[nomenclature] n
	JOIN #final_min f
	  ON f.sku_id = n.[1c_id];  */


  -------------------------------------------

	

	CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190908-132726] ON [pbi].nomenclature
	(
		[group_id] ASC
	)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
	--GO

	CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190908-132728] ON [pbi].nomenclature
	(
		[code] ASC
	)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
	--GO

	CREATE CLUSTERED INDEX [ClusteredIndex-20210315-180007] ON [pbi].[nomenclature]
	(
		[1c_id] ASC
	)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]


	DROP TABLE IF EXISTS #dop

END
GO

/****** Object:  StoredProcedure [pbi].[migrate_ostatki]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_ostatki] as 
BEGIN
	--DROP TABLE IF EXISTS mag_pbi.pbi.ostatki
	DELETE FROM mag_pbi.pbi.ostatki WHERE [date] >= '2025-01-01'
	INSERT INTO mag_pbi.pbi.ostatki 
	([artic_id],[1c_id],[Code],[sklad],[Категория склада],[upakovok],[quantity],[upakovka],[date],[upakovok_ship],[quantity_ship])
		SELECT  
			LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),5,12) )) as 'artic_id'
			, n._IDRRef as '1c_id'
			, n._Code as Code
			, s._Description as sklad
			, s.[Категория] as [Категория склада]
			, [_Fld17491]/(case  (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) when 0 then 1 else (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) end)*(case _RecordKind when  0 then 1 when 1 then -1 end) 
				as  upakovok
			, [_Fld17491]*(case _RecordKind when  0 then 1 when 1 then -1 end) as quantity
			, (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) as upakovka
			/*, (SELECT top 1 [_Fld27138] / 1000 FROM  [mag_2019].[dbo].[_InfoRg27129X1] ir WHERE ir._Fld27130RRef =  n._IDRRef AND [_Fld27138] > 0 order by ir._period desc)
				as [Учетная цена, старое]*/
			, DATEADD(year, -2000, t._Period) as [date] 
			, [_Fld17492]/(case  (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) when 0 then 1 else (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) end)*(case _RecordKind when  0 then 1 when 1 then -1 end) 
				as [upakovok_ship]
			, [_Fld17492]*(case _RecordKind when  0 then 1 when 1 then -1 end) as [quantity_ship]			

		FROM [mag_2019].[dbo].[_AccumRg17484] t /*регистр товары на складах*/
			INNER JOIN [mag_2019].[dbo]._Reference188X1 n /*номенклатура*/ ON n._IDRRef = t._Fld17485RRef	
			INNER JOIN [mag_pbi].[pbi].[sklad_2019] s /*склад*/	ON s._IDRRef = t._Fld17488RRef
		WHERE  t._Period >='4025-01-01' --AND n._IDRRef=0x80F60CC47A052DFD11E7D04C512712B6
	


	--DROP TABLE IF EXISTS mag_pbi.pbi.ostatki_short 
	DELETE FROM mag_pbi.pbi.ostatki_short WHERE [date] >= '2025-01-01'
	

	-- добавляем остатки за период c 1 января 2025 года до последнего числа месяца, который был 3 месяца назад, свернутые по месяцам	
	INSERT INTO mag_pbi.pbi.ostatki_short
	([artic_id],[1c_id],[Code],[sklad],[Категория склада],[upakovok],[quantity],
	[upakovka],[date],[upakovok_ship],[quantity_ship])	
	
	SELECT
			[artic_id]
			  ,[1c_id]
			  ,[Code]
			  ,[sklad]
			  ,[Категория склада]
			  ,sum([upakovok]) as [upakovok]
			  ,sum([quantity]) as [quantity]
			  ,avg([upakovka]) as [upakovka]
			  --,CASE WHEN sum(quantity) <> 0 THEN sum([quantity]*[Учетная цена по себест])/sum(quantity) ELSE 0 END as [Учетная цена по себест]
			  --,CASE WHEN sum(quantity) <> 0 THEN sum([quantity]*[Учетная цена по себест, usd2+2])/sum(quantity) ELSE 0 END as [Учетная цена по себест, usd2+2]
			  --,avg(UchetnajaCena) as UchetnajaCena
			  , DATEADD(mm, DATEDIFF(mm,0,[date]), 0) as [date]
			  ,sum([upakovok_ship]) as [upakovok_ship]
			  ,sum([quantity_ship]) as [quantity_ship]
		  FROM mag_pbi.pbi.ostatki 
		  WHERE date BETWEEN '2025-01-01'  
                        AND DATEADD(SECOND, -1, CAST(DATEADD(DAY, 1, EOMONTH(DATEADD(MONTH, -3, GETDATE()))) AS DATETIME))
		  -- where [Категория склада]<>'Виртуальный'
		  GROUP BY [artic_id], [1c_id], [Code], [sklad], [Категория склада], DATEADD(mm, DATEDIFF(mm,0,[date]), 0)
	
	
	
	-- добавляем остатки за 2 последних полных месяца и текущий месяц, развернутые по дням
	INSERT INTO mag_pbi.pbi.ostatki_short
	([artic_id],[1c_id],[Code],[sklad],[Категория склада],[upakovok],[quantity],
	[upakovka],[date],[upakovok_ship],[quantity_ship])
	
	SELECT
			[artic_id]
			  ,[1c_id]
			  ,[Code]
			  ,[sklad]
			  ,[Категория склада]
			  ,[upakovok]
			  ,[quantity]
			  ,[upakovka]
			  --,[Учетная цена по себест]
			  --,[Учетная цена по себест, usd2+2]
			  ,[date]
			  ,[upakovok_ship]
			  ,[quantity_ship]
		  FROM mag_pbi.pbi.ostatki 
		  WHERE date BETWEEN 
			CASE 
				WHEN DATEADD(MONTH, -3, CAST(GETDATE() AS DATE)) < '2025-01-01' 
				THEN '2025-01-01' 
				ELSE DATEADD(DAY, -DAY(DATEADD(MONTH, -2, GETDATE())) + 1, CAST(DATEADD(MONTH, -2, GETDATE()) AS DATE ))
			END
			AND GETDATE()
	

	-- добавляем остатки нового дня на маркетах в накопительную таблицу [pbi].[ostatki_mp]

	INSERT INTO [mag_pbi].[pbi].[ostatki_mp]
	([Дата],[Узел],[artic_id],[id_внешний],[Остаток МП, упак],[Доступно МП, упак], [Остаток МП, шт])

	SELECT
		CAST(src.[Дата обновления] AS DATE) AS [Дата],
		src.[Узел],
		src.[artic_id],
		src.[id_внешний],
		SUM(src.[Количество]),        
		SUM(src.[Доступное кол-во]),
		SUM(src.[Остаток МП, шт])   

	FROM [mag_pbi].[pbi].[Внешние остатки] AS src
	WHERE 
		src.[Тип] = 'Остатки'
		AND CAST(src.[Дата обновления] AS DATE) >
			ISNULL(
				(SELECT MAX([Дата]) FROM [mag_pbi].[pbi].[ostatki_mp]),
				'2000-01-01'
			)
	GROUP BY CAST(src.[Дата обновления] AS DATE), src.[Узел], src.[artic_id], src.[id_внешний];


	





		/*
	ALTER TABLE mag_pbi.pbi.ostatki add [Учетная цена по себест] numeric(38,15) NULL default 0
	ALTER TABLE mag_pbi.pbi.ostatki add [Учетная цена по себест, usd2+2] numeric(38,15) NULL default 0
	ALTER TABLE mag_pbi.pbi.ostatki add [Учетная цена, старое] numeric(38,15) NULL default 0
	*/
	
	-- добавляем учетную цену из таблицы [pbiProd].[СебестоимостьСводныйОт2022]
	/*UPDATE mag_pbi.pbi.ostatki SET 
		[Учетная цена по себест] = 
				(
					SELECT TOP 1 s.[Учетная цена] 
					FROM [pbiProd].[СебестоимостьСводныйОт2022] s 
					--WHERE s. [Вид операции]='Продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена] <> 0
					-- Такое сравнение даты использовано для скорости. Что делает? Приводит обе даты к началу месяца и берет в себестоимости более ранние или такие же даты, как в остатках
					WHERE [Статья]='Реализация'		AND s.[1c_id]=o.[1c_id]		AND s.[Период]<=o.date --	AND  s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(o.date) * 100 + MONTH(o.date))

					ORDER BY s.[Период] DESC)
		
		, [Учетная цена по себест, usd2+2] = 
				(	SELECT TOP 1 s.[Учетная цена USD2+2] 
					FROM [pbiProd].[СебестоимостьСводныйОт2022] s 
					--WHERE s. [Вид операции]='Продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена USD2+2] <> 0
					WHERE [Статья]='Реализация'		AND s.[1c_id]=o.[1c_id]		AND s.[Период]<=o.date --	AND  s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(o.date) * 100 + MONTH(o.date))
					ORDER BY s.[Период] DESC
				)

	 FROM mag_pbi.pbi.ostatki o 
	 WHERE o.date >= '2025-01-01'*/


	-- обновляем учетку по закупкам, тк в продажах не было
	/*UPDATE p SET
	[Учетная цена по себест] = 
		(	SELECT top 1 s.[Учетная цена] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s 
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
			ORDER by s.Период DESC
			),
	[Учетная цена по себест, usd2+2] = 
		(	SELECT top 1 s.[Учетная цена USD2+2] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
			ORDER by s.Период DESC)
	FROM  mag_pbi.pbi.ostatki p 
	WHERE  p.[Учетная цена по себест] is null AND p.date >= '2025-01-01'*/

	-- обновляем учетку по вводу начальных остатков
	/*UPDATE p SET
	[Учетная цена по себест] = 
		(	SELECT top 1 s.[Учетная цена] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s 
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
			ORDER by s.Период DESC
			),
	[Учетная цена по себест, usd2+2] = 
		(	SELECT top 1 s.[Учетная цена USD2+2] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date))  -- AND s.[Период]<=p.date
			ORDER by s.Период DESC)
	FROM  mag_pbi.pbi.ostatki p 
	WHERE  p.[Учетная цена по себест] is null AND p.date >= '2025-01-01'

	UPDATE mag_pbi.pbi.ostatki SET [Учетная цена по себест] = 0 WHERE [Учетная цена по себест] is null
	UPDATE mag_pbi.pbi.ostatki SET [Учетная цена по себест, usd2+2] = 0 WHERE [Учетная цена по себест, usd2+2] is null*/
	

	
	
	-- добавляем остатки за 2025 год, свернутые по месяцам
	/*SELECT
			[artic_id]
			  ,[1c_id]
			  ,[Code]
			  ,[sklad]
			  ,[Категория склада]
			  ,sum([upakovok]) as [upakovok]
			  ,sum([quantity]) as [quantity]
			  ,avg([upakovka]) as [upakovka]
			  ,CASE WHEN sum(quantity) <> 0 THEN sum([quantity]*[Учетная цена по себест])/sum(quantity) ELSE 0 END as [Учетная цена по себест]
			  ,CASE WHEN sum(quantity) <> 0 THEN sum([quantity]*[Учетная цена по себест, usd2+2])/sum(quantity) ELSE 0 END as [Учетная цена по себест, usd2+2]
			  --,avg(UchetnajaCena) as UchetnajaCena
			  , DATEADD(mm, DATEDIFF(mm,0,[date]), 0) as [date]
		  FROM mag_pbi.pbi.ostatki 
		  WHERE date>='2025-01-01'
		 -- where [Категория склада]<>'Виртуальный'
		  GROUP BY [artic_id], [1c_id], [Code], [sklad], [Категория склада], DATEADD(mm, DATEDIFF(mm,0,[date]), 0)*/
	
	
	
	--ALTER TABLE mag_pbi.pbi.ostatki_short add [Учетная цена по себест] numeric(38,15) NULL default 0
	--ALTER TABLE mag_pbi.pbi.ostatki_short add [Учетная цена по себест, usd2+2] numeric(38,15) NULL default 0
	--ALTER TABLE mag_pbi.pbi.ostatki_short add [Учетная цена, старое] numeric(38,15) NULL default 0
	/*
	CREATE NONCLUSTERED INDEX [NonClusteredIndex-2-1] ON [pbi].ostatki_short
	(
		[artic_id] ASC,
		[date] ASC
	)
	*/

	-------------------------------------------------------------- OLD
	/*
	UPDATE mag_pbi.pbi.ostatki_short SET 
		[Учетная цена по себест] = 
				(
					SELECT TOP 1 s.[Учетная цена] 
					FROM [pbiProd].[СебестоимостьСводныйОт2022] s 
					--WHERE s. [Вид операции]='Продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена] <> 0
					-- Такое сравнение даты использовано для скорости. Что делает? Приводит обе даты к началу месяца и берет в себестоимости более ранние или такие же даты, как в остатках
					WHERE [Статья]='Реализация'		AND s.[1c_id]=o.[1c_id]		AND s.[Период]<=o.date --	AND  s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(o.date) * 100 + MONTH(o.date))

					ORDER BY s.[Период] DESC)
		
		, [Учетная цена по себест, usd2+2] = 
				(	SELECT TOP 1 s.[Учетная цена USD2+2] 
					FROM [pbiProd].[СебестоимостьСводныйОт2022] s 
					--WHERE s. [Вид операции]='Продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена USD2+2] <> 0
					WHERE [Статья]='Реализация'		AND s.[1c_id]=o.[1c_id]		AND s.[Период]<=o.date --	AND  s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(o.date) * 100 + MONTH(o.date))
					ORDER BY s.[Период] DESC
				)

	 FROM mag_pbi.pbi.ostatki_short o 


	-- обновляем учетку по закупкам, тк в продажах не было
	UPDATE p SET
	[Учетная цена по себест] = 
		(	SELECT top 1 s.[Учетная цена] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s 
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
			ORDER by s.Период DESC
			),
	[Учетная цена по себест, usd2+2] = 
		(	SELECT top 1 s.[Учетная цена USD2+2] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
			ORDER by s.Период DESC)
	FROM  mag_pbi.pbi.ostatki_short p 
	WHERE  p.[Учетная цена по себест] is null

	-- обновляем учетку по вводу начальных остатков
	UPDATE p SET
	[Учетная цена по себест] = 
		(	SELECT top 1 s.[Учетная цена] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s 
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
			ORDER by s.Период DESC
			),
	[Учетная цена по себест, usd2+2] = 
		(	SELECT top 1 s.[Учетная цена USD2+2] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date))  -- AND s.[Период]<=p.date
			ORDER by s.Период DESC)
	FROM  mag_pbi.pbi.ostatki_short p 
	WHERE  p.[Учетная цена по себест] is null

	UPDATE mag_pbi.pbi.ostatki_short SET [Учетная цена по себест] = 0 WHERE [Учетная цена по себест] is null
	UPDATE mag_pbi.pbi.ostatki_short SET [Учетная цена по себест, usd2+2] = 0 WHERE [Учетная цена по себест, usd2+2] is null
	*/

	-- Тут старый код со старым регистром сведений

	 /*
	UPDATE mag_pbi.pbi.ostatki_short SET 
	 [Учетная цена по себест] = isnull(
			(SELECT top 1 its.[_Fld27138] / 1000  FROM  [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
			WHERE its._Fld27130RRef =  [1C_id] AND its.[_Fld27138] > 0 
			ORDER BY its._period desc)
			,0 
		)
	FROM mag_pbi.pbi.ostatki_short o
	WHERE [Учетная цена по себест] = 0 OR [Учетная цена по себест] is null 

	UPDATE mag_pbi.pbi.ostatki_short SET 
	 [Учетная цена по себест, usd2+2] = isnull(
			(SELECT top 1 its.[_Fld27138] / 1000 / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
													WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
													AND DATEADD(year, -2000, _Period) <= o.date 
													ORDER BY _Period desc)
			
			
			FROM  [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
			WHERE its._Fld27130RRef =  [1C_id] AND its.[_Fld27138] > 0 
			ORDER BY its._period desc)
			,0 
		)
	FROM mag_pbi.pbi.ostatki_short o
	WHERE [Учетная цена по себест, usd2+2] = 0 OR [Учетная цена по себест, usd2+2] is null
	*/


	
	/*
	UPDATE mag_pbi.pbi.ostatki_short SET 
	 [Учетная цена по себест] = isnull(
				(SELECT TOP 1 s.[Учетная цена, новое] FROM [pbi].[Себестоимость] s 
					WHERE s. [Вид операции]='продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date --AND s.[Учетная цена, новое] <> 0
					ORDER BY s.[Период] desc)
		, 0 )
	 FROM mag_pbi.pbi.ostatki_short o */

	/*
	UPDATE mag_pbi.pbi.ostatki_short SET 
	 [Учетная цена по себест] = 
		isnull(
			(
			SELECT top 1 its.[_Fld27138] / 1000  FROM  [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
			WHERE its._Fld27130RRef =  [1C_id] AND its.[_Fld27138] > 0 
				--and datediff(month, DATEADD(year, -2000, its._Period), date) >= 0 
			ORDER BY its._period desc)
			,0 
		)
	FROM mag_pbi.pbi.ostatki_short o
	WHERE [Учетная цена по себест] = 0 OR [Учетная цена по себест] is null */

	/*
	 UPDATE mag_pbi.pbi.ostatki SET 
	 [Учетная цена, старое] = 
		isnull(
			(
			SELECT top 1 its.[_Fld27138] / 1000  FROM  [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
			WHERE its._Fld27130RRef =  [1C_id] AND its.[_Fld27138] > 0 
				and datediff(month, DATEADD(year, -2000, its._Period), date) >= 0 
			ORDER BY its._period desc)
			,0 
		)
	FROM mag_pbi.pbi.ostatki o	
	*/
	/*
	 UPDATE mag_pbi.pbi.ostatki_short SET 
	 [Учетная цена по себест] = isnull(
			(SELECT TOP 1 s.[Учетная цена, старое] 
			FROM [pbi].[Себестоимость] s 
			WHERE s. [Вид операции]='продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date  AND s.[Учетная цена, старое] > 0
			ORDER BY s.[Период] desc)
		,0)
	 FROM mag_pbi.pbi.ostatki_short o
	 WHERE [Учетная цена по себест] = 0 OR [Учетная цена по себест] is null
	 */
END
GO

/****** Object:  StoredProcedure [pbi].[migrate_ostatok_da_net]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE [pbi].[migrate_ostatok_da_net]

AS
BEGIN
    SET NOCOUNT ON;
	
	DECLARE @Date1 DATE, @Date2 DATE
	SET @Date1 = '2024-01-01'
	SET @Date2 =  CAST( GETDATE() AS Date )

	drop table pbi.[w_ostatok_da_net]

	SELECT * INTO pbi.[w_ostatok_da_net] FROM 
	(
		SELECT DATEADD(DAY,number+1,@Date1) [dt]
		FROM master..spt_values
		WHERE type = 'P'
		AND DATEADD(DAY,number+1,@Date1) < @Date2
	)as t1
	cross join 
	(
		select 
			[1c_id] as [_IDRREF]
			, [artic_id] 
			, n.minAvailableQty
			--, n.minAvailableQty10
			
		from pbi.nomenclature n 
		--where [статус] in (/*'Выведен из ассортимента',*/ 'Основной', 'Базовый', 'Маркетплейс', 'Обособленное обеспечение', 'New')
	)as t2

	ALTER TABLE pbi.[w_ostatok_da_net] ADD [ostatok] numeric (15,6) NULL;
	--ALTER TABLE pbi.[w_ostatok_da_net] ADD [ostatok10] numeric (15,6) NULL;
	ALTER TABLE pbi.[w_ostatok_da_net] ADD [quantity] numeric (15,6) NULL;
	ALTER TABLE pbi.[w_ostatok_da_net] ADD [upakovok] numeric (15,6) NULL;
	ALTER TABLE pbi.[w_ostatok_da_net] ADD sellable_stock  decimal(18,6)  NULL

	UPDATE pbi.[w_ostatok_da_net] set [quantity] = (
		select sum(o.[quantity])-- >= n.minAvailableQty then sum(o.[quantity]) else 0 end
		FROM [mag_pbi].[pbi].[ostatki_short] o
		WHERE o.[1c_id]=n.[_IDRREF] AND ([Категория склада] IN ('Хранение', 'Розничная точка', 'Фасовка')) AND o.date <= n.[dt]
	)
	FROM pbi.[w_ostatok_da_net] n

	UPDATE pbi.[w_ostatok_da_net] set [upakovok] = (
		select sum(o.[upakovok])-- >= n.minAvailableQty then sum(o.[quantity]) else 0 end
		FROM [mag_pbi].[pbi].[ostatki_short] o
		WHERE o.[1c_id]=n.[_IDRREF] AND ([Категория склада] IN ('Хранение', 'Розничная точка', 'Фасовка')) AND o.date <= n.[dt]
	)
	FROM pbi.[w_ostatok_da_net] n


	UPDATE pbi.[w_ostatok_da_net] set [ostatok] = case when [upakovok] >= minAvailableQty then 1 else 0 end
	--UPDATE pbi.[w_ostatok_da_net] set [ostatok10] = case when [upakovok] >= minAvailableQty10 then 1 else 0 end


	--Добавляем остатки МП, если они еще не заполнены. Проверяем последние 3 дня

	
	ALTER TABLE pbi.[w_ostatok_da_net] ADD [quantity_mp] numeric (15,6) NULL;
	ALTER TABLE pbi.[w_ostatok_da_net] ADD [upakovok_mp] numeric (15,6) NULL;
	ALTER TABLE pbi.[w_ostatok_da_net] ADD [dostupno_upakovok_mp] numeric (15,6) NULL;
	ALTER TABLE pbi.[w_ostatok_da_net] ADD [ostatok_mp] numeric (15,6) NULL;
	ALTER TABLE pbi.[w_ostatok_da_net] ADD [ostatok_all] numeric (15,6) NULL;

    DECLARE 
        @DaysBack INT = 3,
        @StartTime DATETIME = SYSDATETIME(),
        @RowCount INT;

    WITH agg AS (
        SELECT
            CAST(src.[Дата] AS DATE) AS [Дата],
            src.[artic_id],
            SUM(src.[Остаток МП, шт]) AS sum_quantity_mp,
            SUM(src.[Остаток МП, упак]) AS sum_upakovok_mp,
            SUM(src.[Доступно МП, упак]) AS sum_dostupno_upakovok_mp

        FROM [mag_pbi].[pbi].[ostatki_mp] AS src
        WHERE CAST(src.[Дата] AS DATE) >= DATEADD(DAY, -@DaysBack, CAST(GETDATE() AS DATE))
        GROUP BY CAST(src.[Дата] AS DATE),src.[artic_id]
    )
    UPDATE tgt
    SET 
        tgt.[quantity_mp] = ISNULL(tgt.[quantity_mp], agg.sum_quantity_mp),
        tgt.[upakovok_mp] = ISNULL(tgt.[upakovok_mp], agg.sum_upakovok_mp),
        tgt.[dostupno_upakovok_mp] = ISNULL(tgt.[dostupno_upakovok_mp], agg.sum_dostupno_upakovok_mp)
    FROM [mag_pbi].[pbi].[w_ostatok_da_net] AS tgt
    INNER JOIN agg
        ON tgt.[artic_id] = agg.[artic_id]
       AND CAST(tgt.[dt] AS DATE) = agg.[Дата]
    WHERE 
        CAST(tgt.[dt] AS DATE) >= DATEADD(DAY, -@DaysBack, CAST(GETDATE() AS DATE))
        AND (
            tgt.[quantity_mp] IS NULL 
            OR tgt.[upakovok_mp] IS NULL 
            OR tgt.[dostupno_upakovok_mp] IS NULL
        );



    -- логирование результата
    BEGIN TRY
        INSERT INTO [analytics].[load_log_w_ostatok_da_net]
            ([load_time], [days_back], [rows_updated], [duration_sec])
        VALUES
            (
                @StartTime,
                @DaysBack,
                @RowCount,
                DATEDIFF(SECOND, @StartTime, SYSDATETIME())
            );
    END TRY
    BEGIN CATCH
		PRINT '⚠ Ошибка при записи в таблицу лога.';
    END CATCH;


	UPDATE pbi.[w_ostatok_da_net] set [ostatok_mp] = case when [upakovok_mp] >= minAvailableQty then 1 else 0 end
	UPDATE pbi.[w_ostatok_da_net] set [ostatok_all] = case when [upakovok] >= minAvailableQty OR [upakovok_mp] >= minAvailableQty then 1 else 0 end



	--Удаляем нулевые значения
	DELETE FROM [mag_pbi].[pbi].[w_ostatok_da_net] WHERE [ostatok_all] < 1

	CREATE NONCLUSTERED INDEX IX_w_ostatok__id_dt_desc__incl_qty
	ON [pbi].[w_ostatok_da_net] ([_IDRREF], [dt] DESC)
	INCLUDE ([quantity]);

	CREATE NONCLUSTERED INDEX IX_w_ostatok__dt_id__incl_qty
	ON [pbi].[w_ostatok_da_net] ([dt], [_IDRREF])
	INCLUDE ([quantity]);

    SET NOCOUNT OFF;

END
GO

/****** Object:  StoredProcedure [pbi].[migrate_pricelist]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_pricelist]
	
AS
BEGIN
	DROP TABLE [pbi].[pricelist]
	SELECT *
	INTO [pbi].[pricelist]
	FROM(
	SELECT
			[_Fld15493] as Цена
			,  (SELECT _Description FROM MAG_2019.[dbo].[_Reference78] r WHERE r._IDRRef = i.[_Fld15492RRef]) as [Вид цены]
			, i._Fld15490RRef as [1c_id]
			, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2),5,12) ))as artic_id	
			, DATEADD(year, -2000, i._Period) as [Дата]
			, _Period
		FROM [MAG_2019].[dbo].[_InfoRg15489] i /*РегистрСведений.ЦеныНоменклатуры*/
	) as pricelist


	CREATE NONCLUSTERED INDEX [NonClusteredIndex-20220325-100926] ON [pbi].[pricelist]
	(
		[1c_id] ASC,
		[Вид цены] ASC,
		[_Period] ASC
	)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

END
GO

/****** Object:  StoredProcedure [pbi].[migrate_stock_balance]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_stock_balance]
AS 
BEGIN
    SET NOCOUNT ON;

    DROP TABLE IF EXISTS mag_pbi.analytics.stock_balance;
	
	IF NOT EXISTS (
		SELECT 1
		FROM sys.indexes i
		INNER JOIN sys.objects o ON i.object_id = o.object_id
		WHERE i.name = N'N2'
		  AND o.name = N'nomenclature'
		  AND SCHEMA_NAME(o.schema_id) = N'pbi'
	)
	BEGIN
		CREATE NONCLUSTERED INDEX [N2]
		ON [pbi].[nomenclature] ([artic_id])
		INCLUDE ([Знаменатель объема],[Числитель объема],[Цена учетная, руб]);
	END
;WITH Calendar AS (
    SELECT CAST(GETDATE() AS DATE) AS DateValue
    UNION ALL
    SELECT DATEADD(DAY, 1, DateValue)
    FROM Calendar
    WHERE DateValue < CAST(GETDATE() AS DATE)
),
-- 2. Фильтруем таблицу остатков
Ostatki AS (
    SELECT
        DATEADD(year, -2000, t._Period) as [date],
        LOWER(CONCAT(
            SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2), 25,8),'-',
            SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2),21,4),'-',
            SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2),17,4),'-',
            SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2), 1,4),'-',
            SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2), 5,12)
        )) as artic_id,
		n._IDRRef as [1c_id],
		n._Code as code,
        (SELECT TOP 1 upakovka
           FROM mag_pbi.pbi.[БазоваяУпаковка] up
          WHERE t._Fld17485RRef = up._OwnerID_RRRef) as upakovka,
        [_Fld17491] / NULLIF(
            (SELECT TOP 1 upakovka
               FROM mag_pbi.pbi.[БазоваяУпаковка] up
              WHERE t._Fld17485RRef = up._OwnerID_RRRef), 0
        ) * (CASE _RecordKind WHEN 0 THEN 1 WHEN 1 THEN -1 END) as upakovok,
        [_Fld17491] * (CASE _RecordKind WHEN 0 THEN 1 WHEN 1 THEN -1 END) as quantity
    FROM [MAG_2019].[dbo].[_AccumRg17484] t /*Регистр ТоварыНаСкладах*/
    INNER JOIN [mag_pbi].[pbi].[sklad_2019] s ON s._IDRRef = t._Fld17488RRef
    FULL OUTER JOIN [mag_2019].[dbo]._Reference188X1 n ON t._Fld17485RRef = n._IDRRef
    WHERE s.[Категория] <> 'Виртуальный'
),
-- 3. Накопительный итог по каждому артикулу и дате
CumulativeStock AS (
    SELECT 
        c.DateValue AS [Дата],
        o.artic_id,
		o.[1c_id],
		o.code,
        SUM(ISNULL(o.quantity, 0)) AS [Остаток склад шт],
        SUM(ISNULL(o.upakovok, 0)) AS [Остаток склад упак],

        /* рассчитывается далее */
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад руб],
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад м3],

        /* новые колонки по МП */
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток МП, шт],
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток МП, руб],
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + МП, шт],
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + МП, руб],

        /* уже существующие комбинированные показатели */
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + в пути + произв., упак],
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + в пути + произв., руб],
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + МП + в пути + произв., упак],
        CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + МП + в пути + произв., руб]
    FROM Calendar c
    JOIN Ostatki o ON o.[date] <= c.DateValue
    GROUP BY c.DateValue, o.artic_id, o.[1c_id], o.code
)
-- 4. Результат в таблицу
SELECT * INTO mag_pbi.analytics.stock_balance
FROM CumulativeStock
ORDER BY [Дата];

-- Остаток на складе: руб и м3
UPDATE sb 
SET 
    [Остаток склад м3] = sb.[Остаток склад шт] * ISNULL(n.[Числитель объема], 0) 
        / NULLIF(ISNULL(n.[Знаменатель объема], 1), 0),
    [Остаток склад руб] = sb.[Остаток склад шт] * ISNULL(n.[Цена учетная, руб], 0)
FROM mag_pbi.analytics.stock_balance sb
LEFT JOIN mag_pbi.pbi.nomenclature n ON sb.artic_id = n.artic_id;

-- Добавляем остаток "в пути" и "в производстве"
;WITH Aggregated AS (
    SELECT
        sb.artic_id,
        sb.[Дата],
        sb.[Остаток склад руб],
        sb.[Остаток склад упак],
        SUM(ISNULL(z.[Сумма в руб.], 0)) AS [В пути и произв., руб],
        SUM(ISNULL(z.[Кол. упаковок], 0)) AS [В пути и произв., упак]
    FROM mag_pbi.analytics.stock_balance sb
    LEFT JOIN mag_pbi.analytics.Заказы z 
        ON z.artic_id = sb.artic_id
       AND z.[Дата заказа поставщику] <= sb.[Дата]
       AND z.[Статус] IN ('В пути', 'В производстве')
    GROUP BY sb.artic_id, sb.Дата, sb.[Остаток склад руб], sb.[Остаток склад упак]
)
UPDATE sb
SET
    [Остаток склад + в пути + произв., упак] = a.[Остаток склад упак] + ISNULL(a.[В пути и произв., упак], 0),
    [Остаток склад + в пути + произв., руб]  = a.[Остаток склад руб]  + ISNULL(a.[В пути и произв., руб],  0)
FROM mag_pbi.analytics.stock_balance sb
LEFT JOIN Aggregated a 
  ON sb.artic_id = a.artic_id 
 AND sb.Дата     = a.Дата;

-- Добавляем остаток МП за последнюю дату обновления из регистра сведений
;WITH AggregMarketplace AS (
    SELECT
        DATEADD(YEAR, -2000, ost._Fld33596) AS [Дата обновления],
        LOWER(CONCAT(
            SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2), 25,8),'-',
            SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2), 21,4),'-',
            SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2), 17,4),'-',
            SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2),  1,4),'-',
            SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2),  5,12)
        )) AS artic_id,
        SUM(ISNULL(ost._Fld33602, 0)) AS [Остаток МП упак]
    FROM [MAG_2019].[dbo].[_InfoRg28682X1] AS ost   /* РегистрСведений.ОстаткиТоваровВоВнешнихСистемах */
    WHERE ost._Fld33596 = (
        SELECT TOP (1) _Fld33596 
        FROM [MAG_2019].[dbo].[_InfoRg28682X1] 
        ORDER BY _Fld33596 DESC
    )
    GROUP BY ost._Fld28683RRef, ost._Fld33596 
)
-- Обновляем МП и комбинированные колонки
UPDATE sb 
SET 
    /* МП → шт и руб */
    [Остаток МП, шт]  = ISNULL(mp.[Остаток МП упак], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0),
    [Остаток МП, руб] = (
        ISNULL(mp.[Остаток МП упак], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0)
    ) * ISNULL(n.[Цена учетная, руб], 0),

    /* Склад + МП */
    [Остаток склад + МП, шт]  = sb.[Остаток склад шт] + (
        ISNULL(mp.[Остаток МП упак], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0)
    ),
    [Остаток склад + МП, руб] = sb.[Остаток склад руб] + (
        ISNULL(mp.[Остаток МП упак], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0) * ISNULL(n.[Цена учетная, руб], 0)
    ),

    /* Склад + МП + в пути + произв. (как было) */
    [Остаток склад + МП + в пути + произв., упак] = sb.[Остаток склад + в пути + произв., упак] + ISNULL(mp.[Остаток МП упак], 0),
    [Остаток склад + МП + в пути + произв., руб]  = sb.[Остаток склад + в пути + произв., руб]  + (
        ISNULL(mp.[Остаток МП упак], 0) * ISNULL(n.[Цена учетная, руб], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0)
    )
FROM mag_pbi.analytics.stock_balance sb
LEFT JOIN mag_pbi.pbi.nomenclature n
       ON sb.artic_id = n.artic_id
LEFT JOIN AggregMarketplace mp
       ON sb.artic_id = mp.artic_id 
      AND sb.Дата     = mp.[Дата обновления];

--OPTION (MAXRECURSION 0); -- при необходимости для Calendar
END
GO

/****** Object:  StoredProcedure [pbi].[migrate_uchet_summa]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_uchet_summa]
	
AS
BEGIN
	DROP TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi]
	SELECT s.*
	INTO [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] 
	FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
		INNER JOIN [mag_2019].[dbo]._Reference188X1 n /*номенклатура*/ ON n._IDRRef = s.[1c_id]
		INNER JOIN [mag_pbi].[pbi].[groups] g ON n._ParentIDRRef = g.[1c_id]
	WHERE g.g <> '*Внутренняя'


/*ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] DROP COLUMN [Учетная сумма, руб]*/
/*ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] DROP COLUMN [Учетная сумма, usd]*/


ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] ADD [Учетная сумма, руб] DECIMAL(21, 9) NULL
ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] ADD [Учетная сумма, usd] DECIMAL(21, 9) NULL
ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] ADD [Источник заказа] NVARCHAR(50) NULL


UPDATE s
SET s.[Учетная сумма, руб] = v.[Учетная сумма, руб]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] s
LEFT JOIN [mag_pbi].[pbi].[УчетнаяСуммаДляPBI] v
    ON s.[Период] = v.[Период]
    AND s.[artic_id] = v.[artic_id]
    AND s.[1c_document_id] = v.[1c_document_id]
    AND s.[Количество] = v.[Количество]
	AND [Статья] = 'Реализация'


UPDATE s
SET s.[Учетная сумма, usd] = v.[Учетная сумма, usd]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] s
LEFT JOIN [mag_pbi].[pbi].[УчетнаяСуммаДляPBI] v
    ON s.[Период] = v.[Период]
    AND s.[artic_id] = v.[artic_id]
    AND s.[1c_document_id] = v.[1c_document_id]
    AND s.[Количество] = v.[Количество]
	AND [Статья] = 'Реализация'

UPDATE s
SET s.[Источник заказа] = ord.[source]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] s
LEFT JOIN [mag_pbi].[dbo].[order_source] ord
	ON s.[Номер заказа] = ord.order_id


END
GO

/****** Object:  StoredProcedure [pbi].[sp_calc_ostatki_mp_2025]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE [pbi].[sp_calc_ostatki_mp_2025]
AS
BEGIN
    SET NOCOUNT ON;

    -------------------------------------------------------------------------
    -- 1. Очистка таблицы
    TRUNCATE TABLE pbi.ostatki_mp_2025_interpolated;

    -------------------------------------------------------------------------
    -- 2. Удаляем старые индексы
    IF EXISTS (SELECT 1 FROM sys.indexes 
               WHERE name = 'IX_ostatki_mp_daily_artic_date' 
                 AND object_id = OBJECT_ID('pbi.ostatki_mp_2025_interpolated'))
        DROP INDEX IX_ostatki_mp_daily_artic_date ON pbi.ostatki_mp_2025_interpolated;

    IF EXISTS (SELECT 1 FROM sys.indexes 
               WHERE name = 'IX_ostatki_mp_daily_uzel_date' 
                 AND object_id = OBJECT_ID('pbi.ostatki_mp_2025_interpolated'))
        DROP INDEX IX_ostatki_mp_daily_uzel_date ON pbi.ostatki_mp_2025_interpolated;

    -------------------------------------------------------------------------
    -- 3. Интерполяция Январь–Октябрь
    ;WITH BaseData AS (
    SELECT
        CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) AS Дата,
        nod._Description AS Узел,
        ost._Fld33595 AS Склад,
        LOWER(CONCAT(
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),25,8),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),21,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),17,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),1,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),5,12)
        )) AS artic_id,
        ost._Fld33599 AS id_внешний,
        ost._Fld33602 AS Qty,
        ost._Fld33603 AS AvailQty,
        ISNULL(up.upakovka,1) AS upakovka
    FROM [MAG_2019].[dbo].[_InfoRg28682X1] ost
    LEFT JOIN [MAG_2019].[dbo].[_Node28072X1] nod
        ON nod._IDRRef = ost._Fld28684RRef
    LEFT JOIN (
        SELECT _OwnerID_RRRef, MAX(upakovka) AS upakovka
        FROM mag_pbi.pbi.[БазоваяУпаковка]
        GROUP BY _OwnerID_RRRef
    ) up
        ON up._OwnerID_RRRef = ost._Fld28683RRef
    WHERE CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE)
          BETWEEN '2025-01-01' AND '2025-10-31'
),

-- Остатки на конец месяца
MonthBalancesRaw AS (
    SELECT
        Узел, Склад, artic_id, id_внешний,
        EOMONTH(Дата) AS MonthEnd,
        MAX(Qty) AS Qty,
        MAX(AvailQty) AS AvailQty,
        MAX(Qty*upakovka) AS PackQty
    FROM BaseData
    GROUP BY Узел, Склад, artic_id, id_внешний, EOMONTH(Дата)
),

-- Календарь месяцев 2025 (1–10)
Months AS (
    SELECT
        DATEFROMPARTS(2025, m.MonthNum, 1) AS MonthStart,
        EOMONTH(DATEFROMPARTS(2025, m.MonthNum, 1)) AS MonthEnd
    FROM (VALUES
        (1),(2),(3),(4),(5),
        (6),(7),(8),(9),(10)
    ) m(MonthNum)
),

-- Список всех товаров
Products AS (
    SELECT DISTINCT Узел, Склад, artic_id, id_внешний
    FROM BaseData
),

-- Полная сетка товар × месяц
MonthGrid AS (
    SELECT p.*, m.MonthStart, m.MonthEnd
    FROM Products p
    CROSS JOIN Months m
),

-- Подтягиваем реальные остатки (если нет — 0)
MonthBalances AS (
    SELECT
        g.Узел,
        g.Склад,
        g.artic_id,
        g.id_внешний,
        g.MonthStart,
        g.MonthEnd,
        ISNULL(r.Qty,0) AS Qty,
        ISNULL(r.AvailQty,0) AS AvailQty,
        ISNULL(r.PackQty,0) AS PackQty
    FROM MonthGrid g
    LEFT JOIN MonthBalancesRaw r
        ON r.Узел = g.Узел
        AND r.Склад = g.Склад
        AND r.artic_id = g.artic_id
        AND r.id_внешний = g.id_внешний
        AND r.MonthEnd = g.MonthEnd
),

-- Теперь LAG берёт строго предыдущий календарный месяц
WithPrev AS (
    SELECT *,
        ISNULL(LAG(Qty) OVER (
            PARTITION BY Узел, Склад, artic_id, id_внешний
            ORDER BY MonthEnd
        ),0) AS PrevQty,

        ISNULL(LAG(AvailQty) OVER (
            PARTITION BY Узел, Склад, artic_id, id_внешний
            ORDER BY MonthEnd
        ),0) AS PrevAvail,

        ISNULL(LAG(PackQty) OVER (
            PARTITION BY Узел, Склад, artic_id, id_внешний
            ORDER BY MonthEnd
        ),0) AS PrevPack
    FROM MonthBalances
),

-- Подготовка к интерполяции
Prepared AS (
    SELECT *,
        DATEDIFF(DAY, MonthStart, MonthEnd) + 1 AS DaysInMonth
    FROM WithPrev
)

-- Интерполяция по дням
INSERT INTO pbi.ostatki_mp_2025_interpolated
(
    Дата, Узел, Склад, artic_id, id_внешний,
    [Остаток МП, шт],
    [Доступно МП, упак],
    [Остаток МП, упак]
)
SELECT
    DATEADD(DAY, v.number, MonthStart) AS Дата,
    Узел, Склад, artic_id, id_внешний,

    PrevQty + ((Qty - PrevQty) * (v.number + 1)) / DaysInMonth,
    PrevAvail + ((AvailQty - PrevAvail) * (v.number + 1)) / DaysInMonth,
    PrevPack + ((PackQty - PrevPack) * (v.number + 1)) / DaysInMonth

FROM Prepared
CROSS APPLY (
    SELECT n AS number
    FROM (
        SELECT ones.n + tens.n*10 AS n
        FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n)
        CROSS JOIN (VALUES (0),(1),(2),(3)) tens(n)
    ) numbers
    WHERE n < DaysInMonth
) v

    -------------------------------------------------------------------------
    -- 4. Интерполяция ноября 1–18

    ;WITH OctoberEnd AS (
    SELECT
        nod._Description AS Узел,
        ost._Fld33595 AS Склад,
        LOWER(CONCAT(
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),25,8),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),21,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),17,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),1,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),5,12)
        )) AS artic_id,
        ost._Fld33599 AS id_внешний,
        MAX(ost._Fld33602) AS PrevQty,
        MAX(ost._Fld33603) AS PrevAvail,
        MAX(ost._Fld33602 * ISNULL(up.upakovka,1)) AS PrevPack
    FROM [MAG_2019].[dbo].[_InfoRg28682X1] ost
    LEFT JOIN [MAG_2019].[dbo].[_Node28072X1] nod
        ON nod._IDRRef = ost._Fld28684RRef
    LEFT JOIN (
        SELECT _OwnerID_RRRef, MAX(upakovka) AS upakovka
        FROM mag_pbi.pbi.[БазоваяУпаковка]
        GROUP BY _OwnerID_RRRef
    ) up
        ON up._OwnerID_RRRef = ost._Fld28683RRef
    WHERE CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) = '2025-10-31'
    GROUP BY
        nod._Description,
        ost._Fld33595,
        ost._Fld28683RRef,
        ost._Fld33599
),

November19 AS (
    SELECT
        nod._Description AS Узел,
        ost._Fld33595 AS Склад,
        LOWER(CONCAT(
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),25,8),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),21,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),17,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),1,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),5,12)
        )) AS artic_id,
        ost._Fld33599 AS id_внешний,
        ost._Fld33602 AS Qty19,
        ost._Fld33603 AS Avail19,
        ost._Fld33602 * ISNULL(up.upakovka,1) AS Pack19
    FROM [MAG_2019].[dbo].[_InfoRg28682X1] ost
    LEFT JOIN [MAG_2019].[dbo].[_Node28072X1] nod
        ON nod._IDRRef = ost._Fld28684RRef
    LEFT JOIN (
        SELECT _OwnerID_RRRef, MAX(upakovka) AS upakovka
        FROM mag_pbi.pbi.[БазоваяУпаковка]
        GROUP BY _OwnerID_RRRef
    ) up
        ON up._OwnerID_RRRef = ost._Fld28683RRef
    WHERE CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) = '2025-11-19'
)

INSERT INTO pbi.ostatki_mp_2025_interpolated
(
    Дата, Узел, Склад, artic_id, id_внешний,
    [Остаток МП, шт],
    [Доступно МП, упак],
    [Остаток МП, упак]
)
SELECT
    DATEADD(DAY, d.number, CAST('2025-11-01' AS DATE)) AS Дата,
    n.Узел,
    n.Склад,
    n.artic_id,
    n.id_внешний,

    ISNULL(o.PrevQty,0) 
        + ((n.Qty19 - ISNULL(o.PrevQty,0)) * (d.number + 1)) / 18.0,

    ISNULL(o.PrevAvail,0) 
        + ((n.Avail19 - ISNULL(o.PrevAvail,0)) * (d.number + 1)) / 18.0,

    ISNULL(o.PrevPack,0) 
        + ((n.Pack19 - ISNULL(o.PrevPack,0)) * (d.number + 1)) / 18.0

FROM November19 n
LEFT JOIN OctoberEnd o
    ON o.Узел = n.Узел
    AND o.Склад = n.Склад
    AND o.artic_id = n.artic_id
    AND o.id_внешний = n.id_внешний

CROSS JOIN (
    VALUES
        (0),(1),(2),(3),(4),(5),(6),(7),(8),
        (9),(10),(11),(12),(13),(14),(15),(16),(17)
) AS d(number);
   
    -------------------------------------------------------------------------
    -- 5. Остатки с 19.11.2025 по 31.12.2025 напрямую
    INSERT INTO pbi.ostatki_mp_2025_interpolated
        (Дата, Узел, Склад, artic_id, id_внешний, [Остаток МП, шт], [Доступно МП, упак], [Остаток МП, упак])
    SELECT
        CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) AS Дата,
        nod._Description AS Узел,
        ost._Fld33595 AS Склад,
        LOWER(CONCAT(
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),25,8),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),21,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),17,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),1,4),'-',
            SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),5,12)
        )) AS artic_id,
        ost._Fld33599 AS id_внешний,
        ost._Fld33602 AS [Остаток МП, шт],
        ost._Fld33603 AS [Доступно МП, упак],
        ost._Fld33602 * ISNULL(up.upakovka,1) AS [Остаток МП, упак]
    FROM [MAG_2019].[dbo].[_InfoRg28682X1] ost
    LEFT JOIN [MAG_2019].[dbo].[_Node28072X1] nod
        ON nod._IDRRef = ost._Fld28684RRef
    LEFT JOIN (
        SELECT _OwnerID_RRRef, MAX(upakovka) AS upakovka
        FROM mag_pbi.pbi.[БазоваяУпаковка]
        GROUP BY _OwnerID_RRRef
    ) up
        ON up._OwnerID_RRRef = ost._Fld28683RRef
    WHERE CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) BETWEEN '2025-11-19' AND '2025-12-31';

    -------------------------------------------------------------------------
    -- 6. Удаляем пустые строки
    DELETE FROM pbi.ostatki_mp_2025_interpolated
    WHERE [Остаток МП, шт] = 0;

    -------------------------------------------------------------------------
    -- 7. Создаем индексы заново
    CREATE CLUSTERED INDEX IX_ostatki_mp_daily_artic_date
        ON pbi.ostatki_mp_2025_interpolated (artic_id, Дата);

    CREATE NONCLUSTERED INDEX IX_ostatki_mp_daily_uzel_date
        ON pbi.ostatki_mp_2025_interpolated (Узел, Дата);

END
GO

/****** Object:  StoredProcedure [pbi].[sp_nomenclature_full_page]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE [pbi].[sp_nomenclature_full_page]
    @OffsetRows int = 0,
    @FetchRows  int = 1000
AS
BEGIN
    SET NOCOUNT ON;

    ;WITH page AS (
        SELECT
            nom.code,
            nom.[1c_group],

            -- === nom: оставил все поля как в твоей вьюхе ===
            nom.artic_id,
            nom.[1c_id],
            nom.cenovaya_gruppa,
            nom.description,
            nom.artic,
            nom.vid_nomen,
            nom.Производитель,
            nom.group_id,
            nom.card,
            nom.photo,
            nom.base,
            nom.[Знаменатель веса],
            nom.[Числитель веса],
            nom.[Знаменатель объема],
            nom.[Числитель объема],
            nom.[Количество упак в коробе],
            nom.[Количество упак в кванте],
            nom.[id magok],
            nom.Товарныйменеджера,
            nom.МенеджерПоЗакупкам2,
            nom.РуководительНаправления,
            nom.[Менеджер OZON],
            nom.[Менеджер WB],
            nom.[АБС статус],
            nom.[АБС план],
            nom.[ABC Парето],
            nom.[XYZ статус 12м],
            nom.[Комментарий для матрицы],
            nom.Коллекция,
            nom.[Ценовой сегмент Магок],
            nom.[Ценовой сегмент МП],
            nom.[Кол-во упак в заказе Магок],
            nom.Бренд,
            nom.[Тип товара],
            nom.Метка,
            nom.[Ширина, мм],
            nom.Цвет,
            nom.[Номер цвета],
            nom.[Тип шнура],
            nom.[Тип плетения],
            nom.Размер,
            nom.Особенность,
            nom.Форма,
            nom.Ширина,
            nom.[Формат упаковки],
            nom.[Макс. запас],
            nom.[Мин. запас],
            nom.[QTY PACKS],
            nom.[Да/Нет Собственное пр-во],
            nom.[ID OZON],
            nom.[ID WB],
            nom.WB,
            nom.Ozon,
            nom.СТМ,
            nom.[Выгружать на я.маркет],
            nom.[Выгружать в Google Merchant],
            nom.[Товар МП],
            nom.Неликвид,
            nom.Статус,
            nom.[Сквозной цвет],
            nom.[Базовая упаковка],
            nom.[Качество контента Ozon],
            nom.[Качество контента WB],
            nom.[Качество контента WB by Ozon],
            nom.[Качество контента Magok],
            nom.[Вид номенклатуры],
            nom.max_year_quantity,
            nom.max_quarter_quantity,
            nom.[Цена учетная, руб],
            nom.[Цена учетная, usd],
            nom.СредниеМесячныеПродажи,
            nom.СКО_МесячныхПродаж,
            nom.minAvailableQty
        FROM pbi.nomenclature AS nom
        ORDER BY nom.code
        OFFSET @OffsetRows ROWS
        FETCH NEXT @FetchRows ROWS ONLY
    ),

    -- ограничиваем ref188 только кодами из page
    ref188 AS (
        SELECT
            n._Code,
            n._IDRRef,
            n._Fld28142
        FROM MAG_2019.dbo._Reference188X1 AS n
        INNER JOIN (SELECT DISTINCT code FROM page) p
            ON p.code = n._Code
        WHERE n._Fld21101RRef IN (
            0x80C5305A3A00E12B11E5845202CA01FB,
            0x80C5305A3A00E12B11E584520AEC30EC
        )
    ),

    up_min AS (
        SELECT
            a._OwnerID_RRRef,
            a._Fld24768 AS upakovka,
            a._Fld24761 AS [Вес],
            a._Fld24763 AS [Высота],
            a._Fld24765 AS [Глубина],
            a._Fld24775 AS [Ширина],
            a._Fld24771 AS [Объем]
        FROM MAG_2019.dbo._Reference347X1 AS a
        LEFT JOIN MAG_2019.dbo._Reference347X1 AS b
            ON b._OwnerID_RRRef = a._OwnerID_RRRef
           AND a._Fld24768 > b._Fld24768
           AND a._Marked = 0x00
           AND b._Marked = 0x00
        INNER JOIN ref188 AS r
            ON r._IDRRef = a._OwnerID_RRRef
           AND r._Fld28142 = 0
        WHERE b._Fld24768 IS NULL
          AND a._Marked = 0x00
    ),
    up_max AS (
        SELECT
            a._OwnerID_RRRef,
            a._Fld24768 AS upakovka,
            a._Fld24761 AS [Вес],
            a._Fld24763 AS [Высота],
            a._Fld24765 AS [Глубина],
            a._Fld24775 AS [Ширина],
            a._Fld24771 AS [Объем]
        FROM MAG_2019.dbo._Reference347X1 AS a
        LEFT JOIN MAG_2019.dbo._Reference347X1 AS b
            ON b._OwnerID_RRRef = a._OwnerID_RRRef
           AND a._Fld24768 < b._Fld24768
           AND a._Marked = 0x00
           AND b._Marked = 0x00
        INNER JOIN ref188 AS r
            ON r._IDRRef = a._OwnerID_RRRef
           AND r._Fld28142 <> 0
        WHERE b._Fld24768 IS NULL
          AND a._Marked = 0x00
    ),
    up AS (
        SELECT * FROM up_min
        UNION ALL
        SELECT * FROM up_max
    ),
    ref1c AS (
        SELECT
            r._Code AS code,
            r._IDRRef,
            up._OwnerID_RRRef,
            LOWER(
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 25, 8) + N'-' +
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 21, 4) + N'-' +
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 17, 4) + N'-' +
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 1, 4)  + N'-' +
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 5, 12)
            ) AS artic_id,
            up.upakovka,
            up.[Вес],
            up.[Высота],
            up.[Глубина],
            up.[Ширина],
            up.[Объем]
        FROM ref188 AS r
        LEFT JOIN up
            ON up._OwnerID_RRRef = r._IDRRef
    ),
    bc AS (
        SELECT
            x._Fld15521RRef AS _IDRRef,
            STRING_AGG(x.barcode, N'; ') AS barcodes
        FROM (
            SELECT DISTINCT
                i._Fld15521RRef,
                CONVERT(nvarchar(64), i._Fld15520) AS barcode
            FROM MAG_2019.dbo._InfoRg15519 AS i
            INNER JOIN ref188 AS r
                ON r._IDRRef = i._Fld15521RRef
        ) AS x
        GROUP BY x._Fld15521RRef
    )

    SELECT
        p.*,

        g._Description AS group__Description,
        g.g, g.g1, g.g2, g.g3,
        g.group_id      AS group__group_id,
        g._ParentIDRRef AS group__ParentIDRRef,
        g.lvl           AS group__lvl,
        g.path          AS group__path,
        g.code          AS group__code,
        g.[1c_id]       AS group__1c_id,
        g.план          AS group__план,
        g.[first group] AS group__first_group,

        ref1c._IDRRef        AS ref_1c__IDRRef,
        ref1c._OwnerID_RRRef AS ref_1c__OwnerID_RRRef,
        ref1c.artic_id       AS ref_1c__artic_id,
        ref1c.upakovka       AS ref_1c__upakovka,
        ref1c.[Вес]          AS ref_1c__Вес,
        ref1c.[Высота]       AS ref_1c__Высота,
        ref1c.[Глубина]      AS ref_1c__Глубина,
        ref1c.[Ширина]       AS ref_1c__Ширина,
        ref1c.[Объем]        AS ref_1c__Объем,

        bc.barcodes          AS ref_1c__barcodes
    FROM page AS p
    LEFT JOIN pbi.groups AS g
        ON g.[1c_id] = p.[1c_group]
    LEFT JOIN ref1c
        ON ref1c.code = p.code
    LEFT JOIN bc
        ON bc._IDRRef = ref1c._IDRRef
    ORDER BY p.code
    OPTION (RECOMPILE); -- чтобы план подстраивался под offset/fetch
END
GO

/****** Object:  StoredProcedure [pbi].[sp_nomenclature_full_page_v]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE   PROCEDURE [pbi].[sp_nomenclature_full_page_v]
    @OffsetRows int = 0,
    @FetchRows  int = 1000
AS
BEGIN
    SET NOCOUNT ON;

    ;WITH page AS (
        SELECT
            nom.artic_id,
            nom.[1c_id],
            nom.code,
            nom.cenovaya_gruppa,
            nom.description,
            nom.artic,
            nom.vid_nomen,
            nom.Производитель,
            nom.group_id,
            nom.[1c_group],
            nom.card,
            nom.photo,
            nom.base,
            nom.[Знаменатель веса],
            nom.[Числитель веса],
            nom.[Знаменатель объема],
            nom.[Числитель объема],
            nom.[Количество упак в коробе],
            nom.[Количество упак в кванте],
            nom.[id magok],
            nom.Товарныйменеджера,
            nom.МенеджерПоЗакупкам2,
            nom.РуководительНаправления,
            nom.[Менеджер OZON],
            nom.[Менеджер WB],
            nom.[АБС статус],
            nom.[АБС план],
            nom.[ABC Парето],
            nom.[XYZ статус 12м],
            nom.[Комментарий для матрицы],
            nom.Коллекция,
            nom.[Ценовой сегмент Магок],
            nom.[Ценовой сегмент МП],
            nom.[Кол-во упак в заказе Магок],
            nom.Бренд,
            nom.[Тип товара],
            nom.Метка,
            nom.[Ширина, мм],
            nom.Цвет,
            nom.[Номер цвета],
            nom.[Тип шнура],
            nom.[Тип плетения],
            nom.Размер,
            nom.Особенность,
            nom.Форма,
            nom.Ширина,
            nom.[Формат упаковки],
            nom.[Макс. запас],
            nom.[Мин. запас],
            nom.[QTY PACKS],
            nom.[Да/Нет Собственное пр-во],
            nom.[ID OZON],
            nom.[ID WB],
            nom.WB,
            nom.Ozon,
            nom.СТМ,
            nom.[Выгружать на я.маркет],
            nom.[Выгружать в Google Merchant],
            nom.[Товар МП],
            nom.Неликвид,
            nom.Статус,
            nom.[Сквозной цвет],
            nom.[Базовая упаковка],
            nom.[Качество контента Ozon],
            nom.[Качество контента WB],
            nom.[Качество контента WB by Ozon],
            nom.[Качество контента Magok],
            nom.[Вид номенклатуры],
            nom.max_year_quantity,
            nom.max_quarter_quantity,
            nom.[Цена учетная, руб],
            nom.[Цена учетная, usd],
            nom.СредниеМесячныеПродажи,
            nom.СКО_МесячныхПродаж,
            nom.minAvailableQty
        FROM pbi.nomenclature AS nom
        ORDER BY nom.code
        OFFSET @OffsetRows ROWS
        FETCH NEXT @FetchRows ROWS ONLY
    ),

    ref188 AS (
        SELECT
            n._Code,
            n._IDRRef,
            n._Fld28142
        FROM MAG_2019.dbo._Reference188X1 AS n
        INNER JOIN (SELECT DISTINCT code FROM page) p
            ON p.code = n._Code
        WHERE n._Fld21101RRef IN (
            0x80C5305A3A00E12B11E5845202CA01FB,
            0x80C5305A3A00E12B11E584520AEC30EC
        )
    ),

    up_min AS (
        SELECT
            a._OwnerID_RRRef,
            a._Fld24768 AS upakovka,
            a._Fld24761 AS [Вес],
            a._Fld24763 AS [Высота],
            a._Fld24765 AS [Глубина],
            a._Fld24775 AS [Ширина],
            a._Fld24771 AS [Объем]
        FROM MAG_2019.dbo._Reference347X1 AS a
        LEFT JOIN MAG_2019.dbo._Reference347X1 AS b
            ON b._OwnerID_RRRef = a._OwnerID_RRRef
           AND a._Fld24768 > b._Fld24768
           AND a._Marked = 0x00 AND b._Marked = 0x00
        INNER JOIN ref188 AS r
            ON r._IDRRef = a._OwnerID_RRRef
           AND r._Fld28142 = 0
        WHERE b._Fld24768 IS NULL
          AND a._Marked = 0x00
    ),

    up_max AS (
        SELECT
            a._OwnerID_RRRef,
            a._Fld24768 AS upakovka,
            a._Fld24761 AS [Вес],
            a._Fld24763 AS [Высота],
            a._Fld24765 AS [Глубина],
            a._Fld24775 AS [Ширина],
            a._Fld24771 AS [Объем]
        FROM MAG_2019.dbo._Reference347X1 AS a
        LEFT JOIN MAG_2019.dbo._Reference347X1 AS b
            ON b._OwnerID_RRRef = a._OwnerID_RRRef
           AND a._Fld24768 < b._Fld24768
           AND a._Marked = 0x00 AND b._Marked = 0x00
        INNER JOIN ref188 AS r
            ON r._IDRRef = a._OwnerID_RRRef
           AND r._Fld28142 <> 0
        WHERE b._Fld24768 IS NULL
          AND a._Marked = 0x00
    ),

    up AS (
        SELECT * FROM up_min
        UNION ALL
        SELECT * FROM up_max
    ),

    ref1c AS (
        SELECT
            r._Code AS code,
            r._IDRRef,
            r._IDRRef AS _OwnerID_RRRef, -- чтобы сохранить имя ref_1c__OwnerID_RRRef как раньше (если нужно)
            LOWER(
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 25, 8) + N'-' +
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 21, 4) + N'-' +
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 17, 4) + N'-' +
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 1, 4)  + N'-' +
                SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 5, 12)
            ) AS artic_id,
            up.upakovka,
            up.[Вес],
            up.[Высота],
            up.[Глубина],
            up.[Ширина],
            up.[Объем]
        FROM ref188 AS r
        LEFT JOIN up
            ON up._OwnerID_RRRef = r._IDRRef
    ),

    bc AS (
        SELECT
            x._Fld15521RRef AS _IDRRef,
            STRING_AGG(x.barcode, N'; ') AS barcodes
        FROM (
            SELECT DISTINCT
                i._Fld15521RRef,
                CONVERT(nvarchar(64), i._Fld15520) AS barcode
            FROM MAG_2019.dbo._InfoRg15519 AS i
            INNER JOIN ref188 r
                ON r._IDRRef = i._Fld15521RRef
        ) AS x
        GROUP BY x._Fld15521RRef
    )

    SELECT
        -- === все поля как ты ожидаешь от v.[...] ===
        p.[artic_id],
        p.[1c_id],
        p.[code],
        p.[cenovaya_gruppa],
        p.[description],
        p.[artic],
        p.[vid_nomen],
        p.[Производитель],
        p.[group_id],
        p.[1c_group],
        p.[card],
        p.[photo],
        p.[base],
        p.[Знаменатель веса],
        p.[Числитель веса],
        p.[Знаменатель объема],
        p.[Числитель объема],
        p.[Количество упак в коробе],
        p.[Количество упак в кванте],
        p.[id magok],
        p.[Товарныйменеджера],
        p.[МенеджерПоЗакупкам2],
        p.[РуководительНаправления],
        p.[Менеджер OZON],
        p.[Менеджер WB],
        p.[АБС статус],
        p.[АБС план],
        p.[ABC Парето],
        p.[XYZ статус 12м],
        p.[Комментарий для матрицы],
        p.[Коллекция],
        p.[Ценовой сегмент Магок],
        p.[Ценовой сегмент МП],
        p.[Кол-во упак в заказе Магок],
        p.[Бренд],
        p.[Тип товара],
        p.[Метка],
        p.[Ширина, мм],
        p.[Цвет],
        p.[Номер цвета],
        p.[Тип шнура],
        p.[Тип плетения],
        p.[Размер],
        p.[Особенность],
        p.[Форма],
        p.[Ширина],
        p.[Формат упаковки],
        p.[Макс. запас],
        p.[Мин. запас],
        p.[QTY PACKS],
        p.[Да/Нет Собственное пр-во],
        p.[ID OZON],
        p.[ID WB],
        p.[WB],
        p.[Ozon],
        p.[СТМ],
        p.[Выгружать на я.маркет],
        p.[Выгружать в Google Merchant],
        p.[Товар МП],
        p.[Неликвид],
        p.[Статус],
        p.[Сквозной цвет],
        p.[Базовая упаковка],
        p.[Качество контента Ozon],
        p.[Качество контента WB],
        p.[Качество контента WB by Ozon],
        p.[Качество контента Magok],
        p.[Вид номенклатуры],
        p.[max_year_quantity],
        p.[max_quarter_quantity],
        p.[Цена учетная, руб],
        p.[Цена учетная, usd],
        p.[СредниеМесячныеПродажи],
        p.[СКО_МесячныхПродаж],
        p.[minAvailableQty],

        -- === упаковки/габариты/штрихкоды как ты хочешь в конце ===
        ref1c.upakovka      AS [upakovka],
        ref1c.[Вес]         AS [вес],
        ref1c.[Высота]      AS [Высота],
        ref1c.[Глубина]     AS [Глубина],
        ref1c.[Ширина]      AS [Ширина],
        ref1c.[Объем]       AS [Объем],
        bc.barcodes         AS [barcodes]

    FROM page AS p
    LEFT JOIN pbi.groups AS g
        ON g.[1c_id] = p.[1c_group]
    LEFT JOIN ref1c
        ON ref1c.code = p.code
    LEFT JOIN bc
        ON bc._IDRRef = ref1c._IDRRef
    ORDER BY p.code
    OPTION (RECOMPILE);
END
GO

/****** Object:  StoredProcedure [pbi].[Заполнить себестоимостьОт2022(закупки+продажи)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Заполнить себестоимостьОт2022(закупки+продажи)] 
	@dt datetime2 = '4022-01-01'
	
AS
BEGIN
	/*r._RecorderTRef:
	0x000001A1 Заявление о ввозе товаров из ЕАЭС
	0x000001E3 ПТУ
	0x00000189 Возврат товаров поставщику
	0x000001D5 Передача товаров
	0x000001B0 Корректировка приобретения
	0x0000020D Таможенная декларация на импорт

	закупка: (0x000001E3, 0x00000189,0x000001D5, 0x000001B0)
	ЕАЭС: 0x000001A1
	Таможня: 0x0000020D
	*/
	/*
		0x80CD002590EC174111E581505088A8D5 USD
		0x80D40CC47A052DFD11E6B6DD1820D178 Eur
		0x80E90CC47A052DFD11E7145927CEFC24 Cny
		0xAE9DB496910DCFD611E94F10743DE3FF USD2
		0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
	*/
		DELETE FROM mag_pbi.pbiProd.[СебестоимостьОт2022] WHERE 1=1

		DBCC CHECKIDENT ('[pbiProd].[СебестоимостьОт2022]', RESEED, 0);


		DECLARE @dtStart dateTime2;
		DECLARE @dtEnd datetime2;
		SET @dtStart = '2022-01-01'
		SET @dtEnd= '2025-01-01'
		-- выберем валюту рубль сразу ...
		DECLARE @CurrencyRubRRef UNIQUEIDENTIFIER;
		SELECT TOP (1) @CurrencyRubRRef = [_IDRRef]
		FROM [MAG_2019].[dbo].[_Reference50]
		WHERE _Code = '643';

		INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 
		--INSERT INTO mag_pbi.[pbi].[Себестоимость2023]
		--INSERT INTO mag_pbi.[pbi].[Себестоимость2024]
		
		
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Сборка], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Сборка USD2+2]
		)
		

SELECT --TOP (5000) 
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Сборка]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2]
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Сборка USD2+2]

FROM (

	SELECT 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, PartnerId
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма]
	, [СуммаБезНДС]
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	--, CASE WHEN [Валюта документа] = 'руб.' THEN
	--	[Закупка] / [Курс usd2]
	--  ELSE
	--	[Закупка, usd2]
	--  END as [Закупка, usd2]	
	, [Закупка] / [Курс usd2] as [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС] 
	, [Доставка]  
	, [Сборка] 
	, [ЗатратыМП]  
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка] / [Курс usd2] as [Доставка USD2+2]
	, [НДС] / [Курс usd2] as [НДС USD2+2]
	, [Таможня] / [Курс usd2] as [Таможня USD2+2]
	, [Сборка] / [Курс usd2] as [Сборка USD2+2]

FROM (
  -- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ЗАКУПКИ \\\\\\\\\\\\\\\\
	select  --top (1)
			DATEADD(year, -2000, _Period) as [Период]
			, case 
					WHEN  r._RecorderTRef=0x000001A1 or r._RecorderTRef=0x0000020D THEN 'НДС'
					--WHEN r._RecorderTRef=0x000001A1 THEN 'ЕАЭС'
					--WHEN r._RecorderTRef=0x0000020D THEN 'Таможня'
					ELSE 'Закупка' 
				END
				as [Статья]
			, 'Приход' as [Вид операции]	
			, h.value as [Хоз операция]
			, case r._RecorderTRef 
					WHEN 0x000001A1 then 'Заявление о ввозе товаров из ЕАЭС'
					WHEN 0x00000189 then 'Возврат товаров поставщику'
					WHEN 0x000001E3 then 'ПТУ'
					WHEN 0x000001D5 then 'Передача товаров'
					WHEN 0x000001B0 then 'Корректировка 	 '
					WHEN 0x0000020D then 'Таможенная декларация на импорт'
					ELSE 'Неизвестный тип'
				END as [тип документа]
			, '-' as [Номер документа]
			, '-' as [Номер заказа]
			, val._Description as [Валюта документа]
			,CASE 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
				WHEN r._RecorderTRef = 0x0000020D THEN 'Руб'
				ELSE 'Неопределено'
				END as [Ценовая группа]
			, r._RecorderRRef as [1c_document_id]
			, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = r._Fld16346RRef ) as [Организация]
			, (SELECT TOP(1) _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = r.[_Fld16353RRef]) as [Партнер]
			--, r.[_Fld16353RRef] as PartnerId
			, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),5,12) ))as PartnerId
			, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = r._Fld16354_RRRef) as [Контрагент]
			, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = [_Fld16348RRef]) as [Менеджер]

			,  analitikaUchetaNomenklaturi.[_Fld20498RRef]	 as [1c_id]
			, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),5,12))) as [artic_id]
			,CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
					THEN
						case [_Fld16345RRef] 
						when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16361]
						ELSE [_Fld16361]  END
					--WHEN r._RecorderTRef = 0x0000020D  THEN customDeclaration._Fld8943
					WHEN r._RecorderTRef = 0x0000020D  THEN 0
					--WHEN r._RecorderTRef=0x000001A1 THEN docEAS.[_Fld4052]  
					WHEN r._RecorderTRef=0x000001A1 THEN 0
					ELSE 0 END
				as [Количество]	
			, [_Fld16362] / 1000  as [Сумма]
			, [_Fld16363] / 1000  as [СуммаБезНДС] 
			,0 as [СуммаРучнойСкидки]
			,0 as [СуммаАвтоСкидки]
			, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
					THEN 
						case [_Fld16345RRef] 
							when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16362] / 1000
							ELSE [_Fld16362] / 1000 END
					ELSE 0 END
				AS [Закупка]
			, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка поле "сумма в валюте документа"
					THEN 
						case [_Fld16345RRef] 
							when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16373] / 1000
							ELSE [_Fld16373] / 1000  END
					ELSE 0 END as [Закупка, usd2]
			 , (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				--WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, r._Period) 
				ORDER BY _Period desc ) as  [Курс usd]
			, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
				--WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, r._Period) 
				ORDER BY _Period desc ) as  [Курс usd2]
			/*, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000 
				ELSE 0 END
				as [Таможня]
			, CASE WHEN r._RecorderTRef=0x000001A1 THEN [_Fld16369] / 1000 
				ELSE 0 END
				as [ЕАЭС] */
				, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000 END as [Таможня]
				, 0 as [ЕАЭС]
				, 0 as [Маркетинг] -- маркетинг
			    , 0 as [Доставка] -- доставка
				, 0 as [Сборка]-- Сборка 
				, 0 as [ЗатратыМП] -- Затраты МП
				,CASE WHEN LEFT(n._Code, 2) = '00'  -- только для вида операция закупка
					THEN '9' + CONVERT(nvarchar(15), TRIM('-' FROM TRIM (  '00'  FROM n._Code))) 
						ELSE '8' + TRIM ( 'УТ-'  FROM n._Code)  
					 END
				as [CodeUT]
				, CASE WHEN r._RecorderTRef=0x000001A1 THEN ([_Fld16362] - [_Fld16363]) / 1000 
				WHEN r._RecorderTRef=0x0000020D THEN ([_Fld16362] - [_Fld16363]) / 1000
				ELSE 0 END
				as [НДС]
				, 0 as [ЗатратыСкладХранение] -- Затраты cклад хранение
				, 0 as [ЗатратыСкладЗарплата]-- Затраты cклад зарплаты
				, 0 as [Приемка]
				, 0 as [АтсМаркировка]
				, 0 as [ВремяВыполненияМинут]
				, 0 as [СборкаЗаказа]
				
				--,RIGHT(n._Code, LEN(n._Code) - DATALENGTH(CONVERT(VARCHAR(100),'УТ-'))) as [CodeUT]
	
		from
			mag_2019.dbo._AccumRg16344 r-- Регистр накопления Закупки
				LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
					on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef] 
				left join MAG_2019.dbo._Reference188X1 as N
					on analitikaUchetaNomenklaturi.[_Fld20498RRef]	 = N._IDRRef
				LEFT JOIN [mag_reports].[dbo].[enums] h
					ON h._IDRref = r._Fld16345RRef
				LEFT JOIN MAG_2019.dbo._reference50 val 
					ON val._IDRRef = r._Fld16372RRef
				LEFT JOIN [MAG_2019].[dbo].[_Document525_VT8936] as customDeclaration
					ON customDeclaration.[_Document525_IDRRef] = [r]._RecorderRRef 
					and analitikaUchetaNomenklaturi.[_Fld20498RRef] = customDeclaration._Fld8939RRef 
				LEFT JOIN [MAG_2019].[dbo].[_Document417_VT4034] as docEAS
					ON docEAS.[_Document417_IDRRef] = [r]._RecorderRRef 
					and [_Fld16349RRef] = docEAS.[_Fld4037RRef] 
				) tabZakupki

UNION ALL
	
SELECT -- top (1000) 
		DATEADD(year, -2000, date) -- период 
       ,SR  -- Статья расходов 
	   , ВидОперации -- Вид операции
	   , '' -- хоз операция 
	   , typeReg -- Тип документа 
	   , НомерДокумента -- Номер документа 
	   , [Номер заказа] -- Номер заказа клиента для РТУ
	   , val._Description  -- Валюта документа 
	   , CASE 
				WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
				WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
				ELSE 'Неопределено'
				END -- Ценовая группа
	   , Регистратор -- Ссылка на документ 
	   , refOrganizaciya.[_Description] -- Организация 
	   , (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = Партнер)  -- Партнер
	   , LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), [Партнер], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),5,12) ))as PartnerId
	   , (SELECT _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = Контрагент)  -- Контрагент
	   , (SELECT _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = Менеджер)  -- Менеджер
	   , onec_id   -- 1с id 
	   , LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), onec_id, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),5,12))) -- arctic id
	   , (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date) 
				ORDER BY _Period desc ) as  [Курс usd]
	   , (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date) 
				ORDER BY _Period desc ) as  [Курс usd2]
	   , kolvo -- количество
	   , [Сумма] / 1000
	   , [СуммаБезНДС]  / 1000
	   , [СуммаРучнойСкидки] / 1000
	   , [СуммаАвтоСкидки] / 1000
	   , [Закупка] -- закупка
	   , [Закупка, usd2] -- закупка usd2
	   , 0 -- Таможня
	   , 0 --ЕАЭС
	--   , marketing / 1000 -- маркетинг
	   , delivery / 1000 -- доставка
	   , [Сборка] / 1000 as [Сборка]-- Сборка 
	   , [ЗатратыМП] / 1000  -- Затраты МП
	   --,CASE WHEN LEFT(refNomenclatura._Code, 2) = '00'  -- только для вида операция закупка
				--	THEN '9' + CONVERT(nvarchar(15), TRIM('-' FROM TRIM (  '00'  FROM refNomenclatura._Code))) 
				--		ELSE '8' + TRIM ( 'УТ-'  FROM refNomenclatura._Code)  
				--	 END
				--as [CodeUT]
		, 0 -- НДС
		, [ЗатратыСкладХранение] -- Затраты cклад хранение
		, [ЗатратыСкладЗарплата]-- Затраты cклад зарплаты
		, [Приемка]
		, [АтсМаркировка]
		, [ВремяВыполненияМинут]
		, [СборкаЗаказа]
		, delivery / 1000 / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date) 
				ORDER BY _Period desc ) as [Доставка USD2+2]
		, 0 as [НДС USD2+2]
		, 0 as [Таможня USD2+2]
		, [Сборка] / 1000 / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date) 
				ORDER BY _Period desc ) as [Сборка USD2+2]
	  -- ,RIGHT(refNomenclatura._Code, LEN(refNomenclatura._Code) - DATALENGTH(CONVERT(VARCHAR(100),'УТ-'))) as [CodeUT]
	

 FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ДОСТАВКА \\\\\\\\\\\\\\\\
SELECT --TOP (1) 
		refPTU.[_Date_Time] as date -- дата
	  , 'Доставка контейнера ВЭД' as SR
	  , 'Приход' as ВидОперации
	  , [_Fld33630RRef] as Регистратор -- регистратор
	  , '-' as НомерДокумента -- Номер документа
	  , '-' [Номер заказа]
	  , 'ПТУ' as typeReg  -- типРегистратора 
	  , refPTU.[_Fld7121RRef] as Организация -- Организация 
	  , refPTU.[_Fld7060RRef] as Партнер -- партнер
	  , refPTU.[_Fld7064RRef] as Контрагент -- контрагент
	  , refPTU.[_Fld7067RRef] as Менеджер -- Менеджер
      , [_Fld33631RRef] as onec_id -- Номенклатура
	  --,refPtuNomen.[_Fld7134] as kolvo				-- Количество
	  , 0 as kolvo    -- Количество
	  --, [_Fld33633] as [Сумма]
	  , 0 as [Сумма]
	  , 0 as [СуммаБезНДС]
	  , 0 as [СуммаРучнойСкидки]
	  , 0 as [СуммаАвтоСкидки]
	  , 0 as [Закупка]
	  , 0 as [Закупка, usd2] 
	  , refPTU.[_Fld7059RRef] as ВалютаДокумента			-- Валюта документа
      , [_Fld33632RRef]  -- ППУ
	  , 0 as marketing   -- маркетинг
      , [_Fld33633]  as delivery -- доставка
	  , 0 as [Сборка]-- Сборка 
	  , 0 as [ЗатратыМП]-- Затраты мп
	  , 0 as [ЗатратыСкладХранение]-- Затраты cклад хранение
	  , 0 as [ЗатратыСкладЗарплата]-- Затраты cклад зарплаты
      , 0 as [Приемка] -- Приемка
	  , 0 as [АтсМаркировка]
	  , 0 as [ВремяВыполненияМинут]
	  , 0 as [СборкаЗаказа]
  
  FROM [MAG_2019].[dbo].[_InfoRg33629]
  LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
	ON refPTU.[_IDRRef] = [_Fld33630RRef]
  LEFT JOIN [MAG_2019].[dbo].[_Document483_VT7128X1] as refPtuNomen
	ON refPtuNomen.[_Document483_IDRRef] = refPTU.[_IDRRef]
	AND refPtuNomen.[_Fld7130RRef] = [_Fld33631RRef]

where [_Fld33634_RRRef] = 0x997EB49691D57EFD11ECE1AC556F9FF0

UNION ALL
-- \\\\\\\\\\\\ МАРКЕТИНГ \\\\\\\\\\\\\\\
SELECT  --TOP (1) 
	   refPTU.[_Date_Time] 
	  , 'Маркетинг'
	  , 'Приход'
	  , [_Fld33630RRef]  -- регистратор
	  , '-' -- Номер документа
	  , '-' -- Номер заказа
	  , 'ПТУ' 
	  , refPTU.[_Fld7121RRef] -- Организация
	  , refPTU.[_Fld7060RRef] as Партнер -- партнер
	  , refPTU.[_Fld7064RRef] as Контрагент -- контрагент
	  , refPTU.[_Fld7067RRef] as Менеджер -- Менеджер
      , [_Fld33631RRef]  -- Номенклатура
	  , 0				-- Количество 
	  , 0 as [Сумма]
	  , 0 as [СуммаБезНДС]
	  , 0 as [СуммаРучнойСкидки]
	  , 0 as [СуммаАвтоСкидки]
	  , 0 as [Закупка]
	  , 0 as [Закупка, usd2] 
	  , refPTU.[_Fld7059RRef]				-- Валюта документа
      , [_Fld33632RRef]  -- ППУ 
	  , [_Fld33633]	-- маркетинг
      , 0				-- доставка
	  , 0 -- Сборка 
	  , 0 -- Затраты мп
	  , 0 -- Затраты cклад хранение
	  , 0 -- Затраты cклад зарплата
	  , 0 -- Приемка
	  , 0 -- [АтсМаркировка]
	  , 0 -- [ВремяВыполненияМинут]
	  , 0 -- [СборкаЗаказа]

  FROM [MAG_2019].[dbo].[_InfoRg33629]
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = [_Fld33630RRef]

where [_Fld33634_RRRef] = 0x9981B49691D57EFD11EDCE203CED30C4  


UNION ALL
-- ///////////////// ПРОДАЖИ ////////////////
SELECT  --TOP (1)
	  [_Period]
      ,'Реализация'
	  ,'Расход'
      ,[_RecorderRRef] -- регистратор
	  ,docRTU.[_Number] -- Номер документа
	  , orders.[_Number]  -- Номер заказа
	  ,case [_RecorderTRef]
					WHEN 0x000001F4 then 'РТУ'
					
					ELSE 'Неизвестный тип'
				END 
	 , AnalitikaUchetaPartner.[_Fld20514RRef] -- Организация 
	 , AnalitikaUchetaPartner.[_Fld20513RRef] -- партнер
	 , AnalitikaUchetaPartner.[_Fld20515_RRRef] -- контрагент
	 , [_Fld15559RRef] as Менеджер -- Менеджер
	 , analitikaUchetaNomenklaturi.[_Fld20498RRef] -- Номенклатура
	 , [_Fld15567]   -- количество
	 , [_Fld15568] as [Сумма]
	 , 0 as [СуммаБезНДС]
	 , [_Fld15595] as [СуммаРучнойСкидки]
	 , [_Fld15596] as [СуммаАвтоСкидки]
	 , 0 as [Закупка]
	 , 0 as [Закупка, usd2] 
	 , CASE
	 WHEN [_Fld15601RRef] IS NULL THEN 'руб.' -- Валюта документа
	 ELSE [_Fld15601RRef]
	 END AS [Валюта документа]
	 , '' -- ППУ
	 , 0 -- маректинг
	 , 0 -- Доставка 
	 , 0 -- Сборка 
	 , 0 -- Затраты мп
	 , 0 -- Затраты cклад хранение
	 , 0 -- Затраты cклад зарплаты
     , 0 -- Приемка
	 , 0 -- [АтсМаркировка]
	 , 0 -- [ВремяВыполненияМинут]
	 , 0 -- [СборкаЗаказа]

    
  FROM [MAG_2019].[dbo].[_AccumRg15547]
  LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
	on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld15548RRef] 
  LEFT JOIN [MAG_2019].[dbo].[_Reference162] as AnalitikaUchetaPartner
	on AnalitikaUchetaPartner.[_IDRRef] = [_Fld15550RRef]	
  LEFT JOIN [MAG_2019].[dbo].[_Document500X1] as docRTU
	on docRTU.[_IDRRef] = [_RecorderRRef]
  LEFT JOIN (SELECT 
			[_Document500_IDRRef] as _IDRRef  
			,MIN([_Fld7990_RRRef]) as orderRTU     
		  FROM [MAG_2019].[dbo].[_Document500_VT7967X1]
		  GROUP BY 
			[_Document500_IDRRef]) as ordersRTU
	ON ordersRTU._IDRRef = [_RecorderRRef]
  LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as orders
	ON orders.[_IDRRef] = ordersRTU.orderRTU

UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА  РАСХОД  БЕЗ ЗАТРАТ НА СБОРКУ\\\\\\\\\\\\\\\\
SELECT --TOP (1000)
	 znS.[_Date_Time] as per
	 , 'Сборка'
	 , 'Расход'
     , TabGoods.[_Document407_IDRRef] -- регистратор
	 , '-' -- Номер документа
	 , '-' -- Номер заказа
	 ,'Заказ на сборку'	
	 , ZnS.[_Fld3348RRef] -- Организация 
	 , Kontr.[_Fld20612RRef] -- партнер
	 , ZnS.[_Fld27876RRef] -- контрагент
     , ZnS.[_Fld28230RRef]  -- Менеджер
	 , [_Fld3381RRef] as nom -- Номенклатура
	 , [_Fld3385] as kolvo  -- Количество
	 --, tabset.[_Fld28063]
	 , 0 as [Сумма] 
	 , 0 as [СуммаБезНДС]
	 , 0 as [СуммаРучнойСкидки]
	 , 0 as [СуммаАвтоСкидки]
	 , (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist] 
				WHERE [Вид цены] = 'Учетная цена (руб)' 
					AND  [Дата] <= znS.[_Date_Time] 
					and [_Fld3381RRef] = [1c_id]
				ORDER BY Дата desc ) / 1000 * [_Fld3385] * -1   as [Закупка]
	 , (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist] 
				WHERE [Вид цены] = 'Учетная цена (руб)' 
					AND  [Дата] <= znS.[_Date_Time] 
					and [_Fld3381RRef] = [1c_id]
				ORDER BY Дата desc ) / 1000 * [_Fld3385] * -1  / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, znS.[_Date_Time]) 
				ORDER BY _Period desc ) as  [Закупка, usd2]
	 , currency._IDRRef -- Валюта документа
	 , '' -- ППУ
	 , 0 -- маректинг
	 , 0 -- Доставка 
	 , 0  -- сборка 
	 , 0 -- Затраты мп
	 , 0 -- Затраты cклад хранение
	 , 0 -- Затраты cклад зарплата
	 , 0 -- Приемка
	 , 0 -- [АтсМаркировка]
	 , 0 -- [ВремяВыполненияМинут]
	 , 0 -- [СборкаЗаказа]

  FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
  INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
	  on ZnS._IDRRef = [_Document407_IDRRef]
	  and _Posted = 0x01 -- проведен
	--  and [_Number] = 'АНУТ-010680' -- номер дока для проверки
	  and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
  LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
		 ON Kontr.[_IDRRef]  = ZnS.[_Fld27876RRef]

 
  LEFT JOIN (SELECT TOP (1) [_IDRRef]
	  FROM [MAG_2019].[dbo].[_Reference50]
	  where _code = '643') as currency
		 on 1 = 1




UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА  ПРИХОД + ЗАТРАТЫ НА СБОРКУ \\\\\\\\\\\\\\\\
SELECT --TOP (333)
	  znS.[_Date_Time]
	 , 'Сборка'
	 , 'Приход'
     , TabGoods.[_Document407_IDRRef] -- регистратор
	 , '-' -- Номер документа
	 , '-' -- Номер заказа
	 ,'Заказ на сборку'	
	 , ZnS.[_Fld3348RRef] -- Организация 
	 , Kontr.[_Fld20612RRef] -- партнер
	 , ZnS.[_Fld27876RRef] -- контрагент
     , ZnS.[_Fld28230RRef]  -- Менеджер
	 , tabSet.[_Fld28059RRef] -- Номенклатура
	 --, [_Fld3385]  -- Количество
	 , tabset.[_Fld28063]
	 , 0 as [Сумма] 
	 , 0 as [СуммаБезНДС]
	 , 0 as [СуммаРучнойСкидки]
	 , 0 as [СуммаАвтоСкидки]
	 --, CASE WHEN tabSetPrices.[SumSebes] IS NULL THEN 0
	 -- ELSE tabSetPrices.[SumSebes] / 1000 * tabset.[_Fld28063]
	 -- end as [Закупка]
	 , (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist] 
				WHERE [Вид цены] = 'Учетная цена (руб)' 
					AND  [дата] <= znS.[_Date_Time] 
					and [_Fld3381RRef] = [1c_id]
				ORDER BY Дата desc )  / 1000 * [_Fld3385]   as  [SumSebes] 
	 , (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist] 
				WHERE [Вид цены] = 'Учетная цена (руб)' 
					AND  [дата] <= znS.[_Date_Time] 
					and [_Fld3381RRef] = [1c_id]
				ORDER BY Дата desc )  / 1000 * [_Fld3385]  / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, znS.[_Date_Time]) 
				ORDER BY _Period desc ) as  [Закупка, usd2]
	 , currency._IDRRef -- Валюта документа
	 , '' -- ППУ
	 , 0 -- маректинг
	 , 0 -- Доставка 
	 , TabZatratiSborka.sborka as sborka -- сборка 
	 , 0 -- Затраты мп
	 , 0 -- Затраты cклад хранение
	 , 0 -- Затраты cклад зарплата
	 , 0 -- Приемка
	 , 0 -- [АтсМаркировка]
	 , 0 -- [ВремяВыполненияМинут]
	 , 0 -- [СборкаЗаказа]

  FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
  INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
	  on ZnS._IDRRef = [_Document407_IDRRef]
	  and _Posted = 0x01 -- проведен
	  --and [_Number] = 'АНУТ-010680' -- номер дока для проверки
	  and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
  LEFT JOIN [MAG_2019].[dbo]._Document407_VT28057 as tabSet -- тч комплекты, тут связь было-стало
	  on tabSet.[_Fld28070] = [_Fld28055]
	  and tabSet._Document407_IDRRef = TabGoods._Document407_IDRRef
  
  LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
		 ON Kontr.[_IDRRef]  = ZnS.[_Fld27876RRef]
  LEFT JOIN (SELECT TOP (1) [_IDRRef]
	  FROM [MAG_2019].[dbo].[_Reference50]
	  where _code = '643') as currency
		 on 1 = 1
LEFT JOIN (SELECT  --TOP (1000)	
      [_RecorderRRef] -- регистратор	
	 , [_Fld33653RRef] -- Номенклатура
	 , SUM([_Fld33658]) / 1000 as sborka -- сборка 
	 FROM [MAG_2019].[dbo].[_AccumRg33652] -- рн работы	
	where [_RecorderTRef] = 0x00000197

	group by 		
		 [_RecorderRRef]
		, [_Fld33653RRef] -- Номенклатура
		) as TabZatratiSborka
		ON TabZatratiSborka.[_RecorderRRef] = TabGoods.[_Document407_IDRRef]
		and TabZatratiSborka.[_Fld33653RRef] = tabSet.[_Fld28059RRef]   

  where [_Fld3392] = 0x00 -- отменено ложь





UNION ALL
-- \\\\\\\\\\\\\\\\\\\\ ЗАТРАТЫ МП \\\\\\\\\\\\\\\
SELECT -- TOP (1000) 
		[_Period]
      ,'Затраты МП'
	  ,'Приход'
      , [_RecorderRRef] -- Регистратор отчет комиссионера 
	  , '-' -- Номер документа
	   , '-' -- Номер заказа
	  , 'Отчет комиссионера'  
	  , otchetKommissionera.[_Fld5484RRef] -- Организация 
	  , otchetKommissionera.[_Fld5485RRef] -- партнер
	  , otchetKommissionera.[_Fld5486RRef] -- контрагент
      , otchetKommissionera.[_Fld5492RRef]  -- Менеджер
      , [_Fld33391RRef] -- номенклатура 
	  --,otchetKommissioneraTabTovari.[_Fld5531] -- Количество
	  , 0 -- Количество
	  , 0 as [Сумма]
	  --,[_Fld33394] as [Сумма]
	  , 0 as [СуммаБезНДС]
	  , 0 as [СуммаРучнойСкидки]
	  , 0 as [СуммаАвтоСкидки]
	  , 0 as [Закупка]
	  , 0 as [Закупка, usd2] 
	  , currency._IDRRef -- Валюта документа
	  , '' -- ППУ
	  , 0 -- маректинг
	  , 0 -- Доставка 
	  , 0 -- сборка 
      , [_Fld33394] -- Затраты МП
	  , 0 -- Затраты cклад хранение
	  , 0 -- Затраты cклад зарплата
	  , 0 -- Приемка
	  , 0 -- [АтсМаркировка]
	  , 0 -- [ВремяВыполненияМинут]
	  , 0 -- [СборкаЗаказа]

  FROM [MAG_2019].[dbo].[_AccumRg33390]
  LEFT JOIN [MAG_2019].[dbo].[_Document458_VT5524] as otchetKommissioneraTabTovari
  on otchetKommissioneraTabTovari.[_Fld5526RRef] = [_Fld33391RRef]
  AND otchetKommissioneraTabTovari.[_Document458_IDRRef] = [_RecorderRRef] 
  LEFT JOIN [MAG_2019].[dbo].[_Document458] as otchetKommissionera
  ON otchetKommissionera.[_IDRRef] = otchetKommissioneraTabTovari.[_Document458_IDRRef]
   LEFT JOIN (SELECT TOP (1) [_IDRRef]
	  FROM [MAG_2019].[dbo].[_Reference50]
	  where _code = '643') as currency
	  on 1 = 1

) as tabMain
LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura 
ON refNomenclatura.[_IDRRef] = tabMain.onec_id
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = tabMain.Регистратор
LEFT JOIN [MAG_2019].[dbo].[_Document484] as refPPU
ON refPPU.[_IDRRef] = tabMain.Регистратор
LEFT JOIN [MAG_2019].[dbo].[_Reference198X1] as refOrganizaciya
on refOrganizaciya._IDRRef = tabMain.Организация
LEFT JOIN MAG_2019.dbo._reference50 val 
ON val._IDRRef = tabMain.ВалютаДокумента

UNION ALL


-- \\\\\\\\\\\\\\\\\\\\ ПРИЕМКА, АТС МАРКИРОВКА \\\\\\\\\\\\\\\ 
SELECT -- TOP (5000) 

	  DATEADD(year, -2000, [Период]) as [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, val.[_Description] as [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = [Организация] ) as [Организация]
	, (SELECT TOP(1)_description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = [Партнер]) as [Партнер]
	, [PartnerId] 
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = Контрагент) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = Менеджер) as [Менеджер]
	, [1c_id]
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [1c_id], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [1c_id], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [1c_id], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [1c_id], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [1c_id], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, [Период]) 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, [Период]) 
				ORDER BY _Period desc ) as  [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Сборка]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, 0 as [Доставка USD2+2]
	, 0 as [НДС USD2+2]
	, 0 as [Таможня USD2+2]
	, 0 as [Сборка USD2+2]
	FROM (
 

-- \\\\\\\\\\\\\\\\\\\\ ПРИЕМКА \\\\\\\\\\\\\\\
   SELECT --top 1000
	docOtbor._Date_Time as [Период] 
	, 'Приемка товара' as [Статья]
	, 'Приход' as [Вид операции]
	, 'Закупка' as [Хоз операция]
	, 'Отбор (размещение) товара' as [тип документа]
	, docOtbor._Number as [Номер документа]
	, zakasPostavshiku._Number as [Номер заказа]
	, @CurrencyRubRRef	as [Валюта документа]		-- Валюта документа
	, 'Руб' as [Ценовая группа]
	, docOtbor._IDRRef as [1c_document_id]
	, zakasPostavshiku._Fld3411RRef as [Организация] -- Организация
	, zakasPostavshiku._Fld3409RRef as [Партнер] -- партнер
	, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),5,12) )) as [PartnerId]
	, zakasPostavshiku._Fld3410RRef as [Контрагент] -- контрагент
	, zakasPostavshiku._Fld3415RRef as [Менеджер] -- Менеджер
    , otborTabRazmeshenie._Fld5347RRef as [1c_id]  -- Номенклатура
	, '' as [artic_id]
	, '' as [Курс usd]
	, '' as [Курс usd2]
	, CAST(otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) as decimal(10,3)) as [Количество] --	 Количество 
	, 0 as [Сумма]
	, 0 as [СуммаБезНДС]
	, 0 as [СуммаРучнойСкидки]
	, 0 as [СуммаАвтоСкидки]
	, 0 as [Закупка]
	, 0 as [Закупка, usd2] 
	, 0 as [Таможня]
	, 0 as [ЕАЭС]
    , 0	as [Доставка]			-- доставка
	, 0 as [Сборка] -- Сборка 
	, 0 as [ЗатратыМП] -- Затраты мп
	, 0 as [НДС]
	, 0 as [ЗатратыСкладХранение] -- Затраты склад хранение
	, 0 as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
    , ((CASE 
        WHEN DAY(docOtbor._Fld5324) <> DAY(docOtbor._Fld5325) THEN
            ((20 - DATEPART(HOUR, docOtbor._Fld5324)) * 60 - DATEPART(MINUTE, docOtbor._Fld5324) - DATEPART(SECOND, docOtbor._Fld5324) / 60.0) +
            ((DATEDIFF(DAY, docOtbor._Fld5324, docOtbor._Fld5325) - 1) * 12 * 60) +
            ((DATEPART(HOUR, docOtbor._Fld5325) - 8) * 60 + DATEPART(MINUTE, docOtbor._Fld5325) + DATEPART(SECOND, docOtbor._Fld5325) / 60.0)
        ELSE
            DATEDIFF(SECOND, docOtbor._Fld5324, docOtbor._Fld5325) / 60.0
    END * 3 / SUM(otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1)) over (partition by docOtbor._IDRRef) 
	* otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1)) + 
    ((COUNT(*) over (partition by docOtbor._IDRRef) / 3000 + otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) / 50000 + 
     (upackovka.ves * otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) / 15000)) / 3 * 20000)) / 1000 AS [Приемка]
	, 0 as [АтсМаркировка]
	, 0 as [ВремяВыполненияМинут]
	, 0 as [СборкаЗаказа]
FROM 
    [MAG_2019].[dbo].[_Document453_VT5341X1] AS otborTabRazmeshenie
INNER JOIN [MAG_2019].[dbo].[_Document453X1] AS docOtbor
    ON docOtbor._IDRRef = otborTabRazmeshenie._Document453_IDRRef
	and docOtbor._Fld5316_RTRef = 0x000001E6 -- Фильтрация по псо
	and  docOtbor._Fld5325 >= @dtStart
	and  docOtbor._Fld5324 >= @dtStart
	and docOtbor._Posted = 0x01
	
INNER JOIN [MAG_2019].[dbo].[_Document486] as docPSO
	on docPSO._Fld7346_RTRef = 0x00000198  -- фильтрация по заказу поставщика
	and docOtbor._Fld5316_RRRef = docPSO._IDRRef
LEFT JOIN [MAG_2019].[dbo].[_Document408X1] as zakasPostavshiku 
	on docPSO._Fld7346_RRRef = zakasPostavshiku._IDRRef
LEFT JOIN (
    SELECT 
        upackovka._OwnerID_RRRef AS vladelec, -- Владелец
        CASE WHEN upackovka._Fld24768 = 0 THEN
			1
		ELSE
			ISNULL(upackovka._Fld24768, 1)
		END AS chislitel, -- Числитель
        upackovka._Fld24769 AS znamenatel, -- Знаменатель
        CAST(CASE 
            WHEN 1 = 1 -- ВесИспользовать
                AND upackovka._Fld24769 <> 0 -- Знаменатель
            THEN upackovka._Fld24768 / upackovka._Fld24769 
            ELSE 0
        END AS DECIMAL(15, 3)) AS ves
    FROM 
        [MAG_2019].[dbo].[_Reference347X1] AS upackovka
    WHERE 
        upackovka._Marked = 0 -- ПометкаУдаления
) AS upackovka
ON upackovka.vladelec = otborTabRazmeshenie._Fld5347RRef -- Сопоставление Номенклатуры и Владелец
WHERE
  1=1  
  and ISNULL(otborTabRazmeshenie._Fld5346, 0) > 0


  UNION ALL
  -- \\\\\\\\\\\\\\\\\\\\ АТС МАРКИРОВКА \\\\\\\\\\\\\\\

 SELECT -- TOP (1000)
	
	tabAts.[Период]  as [Период] 
	, 'Атс маркировка' as [Статья]
	, 'Приход' as [Вид операции]
	, 'Закупка' as [Хоз операция]
	, 'Атс Маркировка товара' as [тип документа]
	, AtsMark._Number as [Номер документа]
	, '' as [Номер заказа]
	, @CurrencyRubRRef	as [Валюта документа]		-- Валюта документа
	, 'Руб' as [Ценовая группа]
	, tabAts.atsRef as [1c_document_id]
    , '' as [Организация] -- Организация
	, '' as [Партнер] -- партнер
	, '' as [PartnerId]
	, '' as [Контрагент] -- контрагент
	, '' as [Менеджер] -- Менеджер
    , tabAts.nom AS Номенклатура -- Номенклатура
    , '' as [artic_id]
	, '' as [Курс usd]
	, '' as [Курс usd2]
	, CAST(tabAts._Fld33656 as decimal(10,3)) as [Количество] --	 Количество 
	, 0 as [Сумма]
	, 0 as [СуммаБезНДС]
	, 0 as [СуммаРучнойСкидки]
	, 0 as [СуммаАвтоСкидки]
	, 0 as [Закупка]
	, 0 as [Закупка, usd2] 
	, 0 as [Таможня]
	, 0 as [ЕАЭС]
    , 0	as [Доставка]			-- доставка
	, 0 as [Сборка] -- Сборка 
	, 0 as [ЗатратыМП] -- Затраты мп
	, 0 as [НДС]
	, 0 as [ЗатратыСкладХранение] -- Затраты склад хранение
	, 0 as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
    , 0 AS Приемка
    , tabAts.АтсМаркировка / 1000 AS [АтсМаркировка]
    , CASE 
        WHEN DAY(AtsMark._Fld27693) <> DAY(AtsMark._Fld27694) THEN
            (((20 - DATEPART(HOUR, AtsMark._Fld27693)) * 60 - DATEPART(MINUTE, AtsMark._Fld27693) - DATEPART(SECOND, AtsMark._Fld27693) / 60.0) +
             ((DATEDIFF(DAY, AtsMark._Fld27693, AtsMark._Fld27694) - 1) * 12 * 60) +
             ((DATEPART(HOUR, AtsMark._Fld27694) - 8) * 60 + DATEPART(MINUTE, AtsMark._Fld27694) + DATEPART(SECOND, AtsMark._Fld27694) / 60.0)) / SUM(tabAts._Fld33656) OVER (PARTITION BY tabAts.atsRef) * tabAts._Fld33656
        ELSE
            (DATEDIFF(MINUTE, AtsMark._Fld27693, AtsMark._Fld27694)) / SUM(tabAts._Fld33656) OVER (PARTITION BY tabAts.atsRef) * tabAts._Fld33656
    END AS [ВремяВыполненияМинут]
    , 0 AS [СборкаЗаказа]

FROM (
    SELECT 
        rnRaboti.[_Period] AS [Период],
        rnRaboti.[_RecorderRRef] AS atsRef,
        rnRaboti.[_Fld33653RRef] AS nom, -- Номенклатура
        SUM(rnRaboti.[_Fld33658]) / 1000 AS [АтсМаркировка],
        SUM(rnRaboti._Fld33656) AS [_Fld33656]
    FROM [MAG_2019].[dbo].[_AccumRg33652] AS rnRaboti
    WHERE 1 = 1 
      AND rnRaboti.[_RecorderTRef] = 0x00006C28
    GROUP BY 
        rnRaboti.[_Period],
        rnRaboti.[_RecorderRRef],
        rnRaboti.[_Fld33653RRef]
) AS tabAts
INNER JOIN [MAG_2019].[dbo].[_Document27688] AS AtsMark
    ON AtsMark.[_IDRRef] = tabAts.atsRef
	  AND AtsMark._Posted = 0x01
	  AND AtsMark._Fld27694 >= @dtStart
WHERE 1 = 1 




 --UNION ALL
 -- -- \\\\\\\\\\\\\\\\\\\\ СБОРКА ЗАКАЗА КЛИЕНТА \\\\\\\\\\\\\\\
 -- SELECT -- TOP (1000) 
		
	--docOtbor._Date_Time  as [Период] 
	--, 'Закупка' as [Статья]
	--, 'Сборка заказа' as [Вид операции]
	--, 'Закупка' as [Хоз операция]
	--, 'Отбор (отбор) товара'  as [тип документа]
	--, docOtbor._Number as [Номер документа]
	--, docZakazKlienta._Number as [Номер заказа]
	--, @CurrencyRubRRef	as [Валюта документа]		-- Валюта документа
	--, 'Руб' as [Ценовая группа]
	--, docOtbor._IDRRef as [1c_document_id]
	--, docZakazKlienta._Fld3129RRef as [Организация] -- Организация
	--, docZakazKlienta._Fld3127RRef as [Партнер] -- партнер
	--,  LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),5,12) ))  as [PartnerId]
	--, docZakazKlienta._Fld3128RRef as [Контрагент] -- контрагент
	--, docZakazKlienta._Fld3138RRef as [Менеджер] -- Менеджер
 --   , [_Fld5332RRef] as [1c_id]  -- Номенклатура
	--, '' as [artic_id]
	--, '' as [Курс usd]
	--, '' as [Курс usd2]
	--, CAST([_Fld5330] as decimal(10, 3))	 as [Количество] --	 Количество 
	--, 0 as [Сумма]
	--, 0 as [СуммаБезНДС]
	--, 0 as [СуммаРучнойСкидки]
	--, 0 as [СуммаАвтоСкидки]
	--, 0 as [Закупка]
	--, 0 as [Закупка, usd2] 
	--, 0 as [Таможня]
	--, 0 as [ЕАЭС]
 --   , 0	as [Доставка]			-- доставка
	--, 0 as [Сборка] -- Сборка 
	--, 0 as [ЗатратыМП] -- Затраты мп
	--, 0 as [НДС]
	--, 0 as [ЗатратыСкладХранение] -- Затраты склад хранение
	--, 0 as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
	--, 0 as [Приемка]
	--, 0 as [АтсМаркировка]
	-- , CASE 
 --       WHEN DAY(docOtbor.[_Fld5324]) <> DAY(docOtbor.[_Fld5325]) THEN
 --           (((20 - DATEPART(HOUR, docOtbor.[_Fld5324])) * 60 - DATEPART(MINUTE, docOtbor.[_Fld5324]) - DATEPART(SECOND, docOtbor.[_Fld5324]) / 60.0) +
 --           ((DATEDIFF(DAY, docOtbor.[_Fld5324], docOtbor.[_Fld5325]) - 1) * 12 * 60) +
 --           ((DATEPART(HOUR, docOtbor.[_Fld5325]) - 8) * 60 + DATEPART(MINUTE, docOtbor.[_Fld5325]) + DATEPART(SECOND, docOtbor.[_Fld5325]) / 60.0)) / SUM([_Fld5330]) over (partition by [_Document453_IDRRef]) * [_Fld5330]
 --       ELSE
 --           (DATEDIFF(SECOND, docOtbor.[_Fld5324], docOtbor.[_Fld5325]) / 60.0) / SUM([_Fld5330]) over (partition by [_Document453_IDRRef]) * [_Fld5330]
 --   END  as [ВремяВыполненияМинут] 
	--,((SUM(1) over (partition by [_Document453_IDRRef]) / 5000 + [_Fld5330] / 20000)/2*30000) / 1000 as СборкаЗаказа


      

 -- FROM [MAG_2019].[dbo].[_Document453_VT5326X1] as OtborTabOtbor
 -- INNER JOIN [MAG_2019].[dbo].[_Document453X1] as docOtbor
 -- ON docOtbor.[_IDRRef] = [_Document453_IDRRef] 
	--  and docOtbor._Posted = 0x01
	--  and  docOtbor._Fld5325 >= @dtStart
	--  and  docOtbor._Fld5324 >= @dtStart
	--  and docOtbor.[_Fld5316_RTRef] = 0x000001F0 -- RSO
 -- INNER JOIN [MAG_2019].[dbo].[_Document496X1] as docRSO
 -- on docOtbor._Fld5316_RRRef = docRSO._IDRRef
 -- and docRSO.[_Fld27744_RTRef] = 0x00000194  -- zakaz klienta 
 -- LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as docZakazKlienta
 -- on docRSO.[_Fld27744_RRRef] = docZakazKlienta._IDRRef

	-- WHERE 1=1
	 ) as tabItogovoya
	 

	
	LEFT JOIN MAG_2019.dbo._reference50 as val 
	ON val._IDRRef = tabItogovoya.[Валюта документа]

	 WHERE DATEADD(year, -2000, [Период]) BETWEEN @dtStart and @dtEnd



) tabItog
	WHERE 1=1 
	and [Период] BETWEEN @dtStart and @dtEnd
--AND [Период] < @dtEnd
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'







	
END
GO

/****** Object:  StoredProcedure [pbi].[Заполнить себестоимостьОт2022(СкладХранение)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимостьОт2022(СкладХранение)] 
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- выберем вылуту рубль сразу ...
DECLARE @CurrencyRubRRef UNIQUEIDENTIFIER;

SELECT TOP (1) @CurrencyRubRRef = [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
WHERE _Code = '643';

-- \\\\\\\\\\\\\\\\\\\\ ЗАТРАТЫ СКЛАД ХРАНЕНИЕ \\\\\\\\\\\\\\\
SELECT  --TOP (1) 
	   [Период] 
	  , 'Склад хранение'
	  ,'Закупка'
	  , null  -- регистратор
	  , '-' -- Номер документа
	  , '-' -- Номер заказа
	  , 'Склад хранение' 
	  , '' -- Организация
	  , null as Партнер -- партнер
	  , null as Контрагент -- контрагент
	  , null as Менеджер -- Менеджер
      , [1c_id]  -- Номенклатура
	  , 0		--	 Количество 
	  , 0 as [Сумма]
	  , 0 as [СуммаБезНДС]
	  , 0 as [СуммаРучнойСкидки]
	  , 0 as [СуммаАвтоСкидки]
	  , 0 as [Закупка]
	  , 0 as [Закупка, usd2] 
	  , @CurrencyRubRRef				-- Валюта документа
      , ''  -- ППУ 
	  , 0 -- маркетинг
      , 0				-- доставка
	  , 0 -- Сборка 
	  , 0 -- Затраты мп
	  , 20000000 / 30 * ([volume] / [totalVolume]) / 1000 as [ЗатратыСкладХранение]  -- Затраты склад хранение
	  , 200000 * ([volume] / [totalVolume]) / 1000 as [ЗатратыСкладЗарплата]  -- Затраты склад зарплата
      , 0 -- Приемка
	  , 0 -- [АтсМаркировка]
	  , 0 -- [ВремяВыполненияМинут]
	  , 0 -- [СборкаЗаказа]
	  --,[_Fld33634_RRRef] -- статья расходов

   FROM [mag_pbi].[pbi].[nomenclatureVolumeStorehouse]
   where YEAR([Период]) >= 2024

	
END
GO

/****** Object:  StoredProcedure [pbi].[Обновить себестоимость]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE  PROCEDURE [pbi].[Обновить себестоимость]
	@full_update bit = 0
AS
BEGIN
	-- DECLARE @full_update bit = 1
	DECLARE @dt datetime2 = '2015-01-01'
	DECLARE @full_update_local_var bit = 0
	
	--полностью обновляем таблицу в воскресенье
	IF ( SELECT DATEPART(WEEKDAY, GETDATE()) )= 7 OR @full_update = 1 OR format(getdate(), 'yyyy-MM-dd') = '2023-07-29'--( SELECT DAY(CURRENT_TIMESTAMP) )= 1 OR @full_update = 1 
		SET @full_update_local_var = 1 
		
	SELECT @full_update_local_var

	
	IF  @full_update_local_var = 1 
	BEGIN
		DROP TABLE IF EXISTS pbi.[Себестоимость] --таблицу удаляем, чтобы удалить индексы. так быстрее вставлять большие массивы данных
		EXEC [sebest].[Создать таблицу]
	END
	ELSE BEGIN
		SET @dt = (select DATEADD(MONTH, -1, GETDATE()))
	END
	
	--В этой процедуре создается таблица, в ней же очищается таблица себестоимость начиная с даты @dt
	exec sebest.[Заполнить себестоимость закупкой] @dt-- Добавляем закупку
	
	exec sebest.[Заполнить себестоимость начальным остатком] @dt-- Добавляем начальные остатки

	/* поменял процедуру только на копирование регистра Выручка и Себестоимость продаж */
	exec sebest.[Заполнить себестоимость продажей] @dt -- Добавляем продажи
	
	exec [sebest].[Заполнить себестоимость комплектующими] @dt
	exec sebest.[Заполнить себестоимость комплектами] @dt -- Добавляем все движения по фасовке

	IF  @full_update_local_var = 1--( SELECT DAY(CURRENT_TIMESTAMP) )= 1 OR @full_update = 1
		exec sebest.[Создать индексы]

	--Записываем две колонки с курсом usd2+2 и usd
	UPDATE mag_pbi.pbi.[Себестоимость] SET 
		[Курс usd2] = (
				SELECT TOP 1 _Fld13220/_Fld13221 FROM [mag_2019].[dbo].[_InfoRg13218] k--РегистрСведений.КурсыВалют
					WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
							AND DATEADD(year, -2000, k._Period) <= [Период]
					ORDER BY k._Period desc) 
		,
		[Курс usd] = (
			SELECT TOP 1 _Fld13220/_Fld13221 FROM [mag_2019].[dbo].[_InfoRg13218] k--РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef =  0x80CD002590EC174111E581505088A8D5 --USD
						AND DATEADD(year, -2000, k._Period) <= [Период]
				ORDER BY k._Period desc) 
	WHERE  [Период]>=@dt

	--записываем закупочную цену в usd2 из рублей, кроме тех, у кого валюта документа usd2
	UPDATE mag_pbi.pbi.[Себестоимость] SET [Закупка, usd2] = [Закупка]/[Курс usd2] 
	WHERE [Валюта документа]<>'USD2' AND [Статья] = 'Закупка' AND [Вид операции]<>'Продажа'
	AND [Период]>=@dt

	/* это главная процедура расчета себестоимости. Выполняется очень долго, каждое вс пересчитывает полностью весь регистр, каждый день считает только посл. 1 месяц*/
	exec [sebest].[Расчет себестомисти] @dt, 0 -- запуск не для коплектов, только комплектующие

	
	--exec [sebest].[Проставить стоимость комплектов] @dt
	--exec [sebest].[Расчет себестомисти] @dt, 1 -- второй проход для комплектующих



	UPDATE mag_pbi.pbi.[Себестоимость] SET [Учетная цена, новое] = CASE WHEN [Количество] <> 0 THEN [закупка] / [Количество] ELSE 0 END
	WHERE 1=1--[Статья] = 'Закупка' AND [Вид операции]='Продажа'
	AND [Период]>=@dt


	--exec sebest.[Заполнить себестоимость курсовой разницей] -- Добавляем курсовую разницу
		/*
		0x80CD002590EC174111E581505088A8D5 USD
		0x80D40CC47A052DFD11E6B6DD1820D178 Eur
		0x80E90CC47A052DFD11E7145927CEFC24 Cny
		0xAE9DB496910DCFD611E94F10743DE3FF USD2
		0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
	*/
END
/*
	-- Продажу считаем по внутреннему курсу
	/*UPDATE mag_pbi.pbi.[Себестоимость] SET [Курс usd2] = (
			SELECT TOP 1 _Fld13220 FROM [mag_2019].[dbo].[_InfoRg13218] k--РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
						AND DATEADD(year, -2000, k._Period) <= [Период]
				ORDER BY k._Period desc) 
	WHERE [Статья] = 'Закупка' AND [Вид операции]='Продажа'
	AND [Период]>=@dt
	*/


	--DECLARE @dt datetime2 = '2015-01-01'
	--подставляем старое значение учетной цены
	UPDATE mag_pbi.pbi.[Себестоимость] SET [Учетная цена, старое] = (
		isnull(
			(SELECT top 1 its.[_Fld27138] / 1000  FROM  [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
			WHERE its._Fld27130RRef =  [1C_id] AND its.[_Fld27138] > 0 
				and datediff(month, DATEADD(year, -2000, its._Period), [Период]) >= 0 
			ORDER BY its._period desc) ,
			(SELECT TOP (1) [Цена]/1000
				FROM [mag_reports].[sales].[pricelist] p
				where p.[1c_id] =  [1c_id] and [Вид цены] = 'Учетная цена (руб)'
				ORDER BY _Period desc)
		)
	)
	WHERE [Статья] = 'Закупка' AND [Вид операции]='Продажа'
	AND [Период]>=@dt
*/
GO

/****** Object:  StoredProcedure [pbi].[РасчетСебестоимостиОт2022]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE РасчетСебестоимостиОт2022
	-- Add the parameters for the stored procedure here

AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	
	exec [sebest].[Заполнить себестоимостьОт2022(закупки+продажи)]


	
END
GO

/****** Object:  StoredProcedure [pbi].[создание среза учетных цен]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[создание среза учетных цен] as 
BEGIN

	--DROP TABlE analytics.[срез учетных цен]
	INSERT INTO analytics.[срез учетных цен]
	SELECT  
		  [1c_id]
		  ,[artic_id]
		  , null as [Учетная цена]
		  , null as [Учетная цена USD2+2]
		  , format(GETDATE(), 'yyyy-MM-dd') as [Период]
		  , null as [Количество]
	FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] seb
	group by [1c_id]
		  ,[artic_id]

	UPDATE srez SET
		[Учетная цена] = (
			SELECT 
				sum(Закупка)+sum(НДС)+sum(Доставка)+sum(Таможня)
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] ss
			where Статья in ('Ввод начальных остатков', 'Закупка', 'Реализация', 'НДС', 'Доставка контейнера ВЭД', 'Производство товара')
			AND ss.[1c_id]=srez.[1c_id]
		)
	FROM analytics.[срез учетных цен] srez
	WHERE /* [Учетная цена] is null AND*/ [Период] = format(GETDATE(), 'yyyy-MM-dd')
	
	UPDATE srez SET
		[Количество] = (
			SELECT 
				sum([Количество])
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] ss
			where Статья in ('Ввод начальных остатков', 'Закупка', 'Реализация', 'НДС', 'Доставка контейнера ВЭД', 'Производство товара')
			AND ss.[1c_id]=srez.[1c_id]
		)
	FROM analytics.[срез учетных цен] srez
	WHERE  /*[Количество] is null AND */[Период] = format(GETDATE(), 'yyyy-MM-dd')
	
	UPDATE srez SET
		[Учетная цена USD2+2] = (
			SELECT 
				sum([Закупка, usd2])+sum(НДС/[Курс usd2])+sum(Доставка/[Курс usd2])+sum(Таможня/[Курс usd2])
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] ss
			where Статья in ('Ввод начальных остатков', 'Закупка', 'Реализация', 'НДС', 'Доставка контейнера ВЭД', 'Производство товара')
			AND ss.[1c_id]=srez.[1c_id]
		)
	FROM analytics.[срез учетных цен] srez
	WHERE  /*[Учетная цена USD2+2] is null AND*/ [Период] = format(GETDATE(), 'yyyy-MM-dd')

	UPDATE analytics.[срез учетных цен] SET [Учетная цена] = [Учетная цена] / [Количество] WHERE [Период] = format(GETDATE(), 'yyyy-MM-dd') AND [Количество]>0
	UPDATE analytics.[срез учетных цен] SET [Учетная цена USD2+2] = [Учетная цена USD2+2] / [Количество] WHERE [Период] = format(GETDATE(), 'yyyy-MM-dd') AND [Количество]>0

	UPDATE analytics.[срез учетных цен] SET [Учетная цена USD2+2] = null WHERE [Период] = format(GETDATE(), 'yyyy-MM-dd') --AND [Количество]>0




	-- обновляем учетку по закупкам, тк в продажах не было
	/*
	UPDATE p SET
	[Учетная цена] = 
		(	SELECT top 1 s.[Учетная цена] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s 
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 
			ORDER by s.Период DESC
			),
	[Учетная цена USD2+2] = 
		(	SELECT top 1 s.[Учетная цена USD2+2] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 
			ORDER by s.Период DESC)
	FROM analytics.[срез учетных цен] p 
	WHERE  [Учетная цена] is null
	-- обновляем учетку по вводу начальных остатков
	UPDATE p SET
	[Учетная цена] = 
		(	SELECT top 1 s.[Учетная цена] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s 
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 
			ORDER by s.Период DESC
			),
	[Учетная цена USD2+2] = 
		(	SELECT top 1 s.[Учетная цена USD2+2] 
			FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
			WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 
			ORDER by s.Период DESC)
	FROM analytics.[срез учетных цен] p 
	WHERE  [Учетная цена] is null
	*/
END
GO

/****** Object:  StoredProcedure [pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]
	-- Add the parameters for the stored procedure here

AS	
BEGIN
	
	DELETE FROM mag_pbi.[pbiProd].[СебестоимостьСводныйОт2022] WHERE 1=1

	DBCC CHECKIDENT ('[pbiProd].[СебестоимостьСводныйОт2022]', RESEED, 0);
	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьСводныйОт2022] (
	   [Период] 
	  ,[Статья] 
	  ,[Вид операции]
      ,[Хоз операция]
      ,[Организация]
      ,[Партнер]
      ,[PartnerId]
      ,[Контрагент]
      ,[Менеджер]
      ,[Тип документа]
      ,[Номер документа]
      ,[Валюта документа]
      ,[Ценовая группа]
      ,[1c_document_id]
      ,[1c_id]
      ,[artic_id]
      ,[Количество]
      ,[Сумма]
      ,[СуммаБезНДС]
      ,[СуммаРучнойСкидки]
      ,[СуммаАвтоСкидки]
      ,[Закупка]
      ,[Закупка, usd2]
      ,[Курс usd2]
      ,[Курс usd]
      ,[Таможня]
      ,[Учетная цена]
      ,[Учетная цена USD2+2]
      ,[Учетная стоимость]
      ,[Учетная стоимость USD2+2]
      ,[Заказ закрыт]
      ,[Номер заказа]
      ,[Доставка]
      ,[НДС]
      ,[Производство]
	  ,[Code]
	  ,[ЗатратыСкладХранение]
	  ,[Приемка]
	  ,[АтсМаркировка]
	  ,[ВремяВыполненияМинут]
	  ,[СборкаЗаказа]
	  ,[КоличествоУпаковок]
	  ,[Сумма скидки]
	  ,[Сумма скидки USD2+2]
	  ,[Доп расходы]
	  ,[Доп расходы USD2+2]
	  )

	SELECT  -- TOP (100) 
	   [Период]
      ,[Статья]
      ,[Вид операции]
      ,[Хоз операция]
      ,[Организация]
      ,[Партнер]
      ,[PartnerId]
      ,[Контрагент]
      ,[Менеджер]
      ,[Тип документа]
      ,[Номер документа]
      ,[Валюта документа]
      ,[Ценовая группа]
      ,[1c_document_id]
      ,ss.[1c_id]
      ,ss.[artic_id]
      ,[Количество]
      ,[Сумма]
      ,[СуммаБезНДС]
      ,[СуммаРучнойСкидки]
      ,[СуммаАвтоСкидки]
      ,[Закупка]
      ,[Закупка, usd2]
      ,[Курс usd2]
      ,[Курс usd]
      ,[Таможня]
      ,[Учетная цена]
      ,[Учетная цена USD2+2]
      ,[Учетная стоимость]
      ,[Учетная стоимость USD2+2]
      ,[Заказ закрыт]
      ,[Номер заказа]
      ,[Доставка]
      ,[НДС]
      ,[Производство]
	  ,nom.[code]
	  ,[ЗатратыСкладХранение]
	  ,[Приемка]
	  ,[АтсМаркировка]
	  ,[ВремяВыполненияМинут]
	  ,[СборкаЗаказа]
	  ,[Количество] / CASE WHEN ISNULL(nom.[Базовая упаковка], 1) = 0 THEN
		1
		else 
		ISNULL(nom.[Базовая упаковка], 1)
		END as [КоличествоУпаковок]
	  , [СуммаРучнойСкидки] + [СуммаАвтоСкидки] as [Сумма скидки]
	  , ([СуммаРучнойСкидки] + [СуммаАвтоСкидки]) / [Курс usd2] as [Сумма скидки USD2+2]
	  ,[Доп расходы]
	  ,[Доп расходы USD2+2]
  FROM [mag_pbi].[pbiProd].[СводныйСебестоимость] as ss
  LEFT JOIN [mag_pbi].[pbi].[nomenclature] as nom
  on nom.artic_id = ss.artic_id


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


	
SELECT -- top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2] 
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство USD2+2]

 FROM (

	  -- \\\\\\\\\\\\\\\\\\\\ АТС МАРКИРОВКА \\\\\\\\\\\\\\\

 SELECT -- TOP (1000)
	
      DATEADD(year, -2000, tabAts.[Период])  as [Период]
	, 'Атс маркировка' as [Статья]
	, 'Приход' as [Вид операции]
	, Null as [Хоз операция]
	, 'Атс Маркировка товара' as [тип документа]
	, AtsMark._Number as [Номер документа]
	, '' as [Номер заказа]
	, 'Руб'	as [Валюта документа]		-- Валюта документа
	, 'Руб' as [Ценовая группа]
	, tabAts.atsRef as [1c_document_id]
    , Null as [Организация] -- Организация
	, Null as [Партнер] -- партнер
	, Null as [PartnerId]
	, Null as [Контрагент] -- контрагент
	, Null as [Менеджер] -- Менеджер
    , tabAts.nom AS [1c_id] -- Номенклатура
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), tabAts.nom, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), tabAts.nom, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), tabAts.nom, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), tabAts.nom, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), tabAts.nom, 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  tabAts.[Период] 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= tabAts.[Период] 
				ORDER BY _Period desc ) as  [Курс usd2]
	, CAST(tabAts._Fld33656 as decimal(10,3)) as [Количество] --	 Количество 
	, Null as [Сумма]
	, Null as [СуммаБезНДС]
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2] 
	, Null as [Таможня]
	, Null as [ЕАЭС]
    , Null	as [Доставка]			-- доставка
	, Null as [Производство] -- Сборка 
	, Null as [ЗатратыМП] -- Затраты мп
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
	, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
    , Null as Приемка
    , tabAts.АтсМаркировка / 1000 AS [АтсМаркировка]
    , CASE 
        WHEN DAY(AtsMark._Fld27693) <> DAY(AtsMark._Fld27694) THEN
            (((20 - DATEPART(HOUR, AtsMark._Fld27693)) * 60 - DATEPART(MINUTE, AtsMark._Fld27693) - DATEPART(SECOND, AtsMark._Fld27693) / 60.0) +
             ((DATEDIFF(DAY, AtsMark._Fld27693, AtsMark._Fld27694) - 1) * 12 * 60) +
             ((DATEPART(HOUR, AtsMark._Fld27694) - 8) * 60 + DATEPART(MINUTE, AtsMark._Fld27694) + DATEPART(SECOND, AtsMark._Fld27694) / 60.0)) / SUM(tabAts._Fld33656) OVER (PARTITION BY tabAts.atsRef) * tabAts._Fld33656
        ELSE
            (DATEDIFF(MINUTE, AtsMark._Fld27693, AtsMark._Fld27694)) / SUM(tabAts._Fld33656) OVER (PARTITION BY tabAts.atsRef) * tabAts._Fld33656
    END as [ВремяВыполненияМинут]
    , Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2] 
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]

FROM (
    SELECT 
        rnRaboti.[_Period] AS [Период],
        rnRaboti.[_RecorderRRef] AS atsRef,
        rnRaboti.[_Fld33653RRef] AS nom, -- Номенклатура
        SUM(rnRaboti.[_Fld33658]) / 1000 AS [АтсМаркировка],
        SUM(rnRaboti._Fld33656) AS [_Fld33656]
    FROM [MAG_2019].[dbo].[_AccumRg33652] AS rnRaboti
    WHERE 1 = 1 
      AND rnRaboti.[_RecorderTRef] = 0x00006C28
    GROUP BY 
        rnRaboti.[_Period],
        rnRaboti.[_RecorderRRef],
        rnRaboti.[_Fld33653RRef]
) AS tabAts
INNER JOIN [MAG_2019].[dbo].[_Document27688] AS AtsMark
    ON AtsMark.[_IDRRef] = tabAts.atsRef
	  AND AtsMark._Posted = 0x01
	  AND AtsMark._Fld27694 >= @dtStart
WHERE 1 = 1 
	and tabAts.[Период] >= @dtSqlStart



) as tabPriemka


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		, [Доп расходы], [Доп расходы USD2+2]
		)


	
SELECT -- top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2]
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство USD2+2]
	, [Доп расходы] as [Доп расходы]
	, [Доп расходы] / [Курс usd2] as [Доп расходы USD2+2]

 FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ДОП РАСХОДЫ \\\\\\\\\\\\\\\\
SELECT --TOP (1) 

	  DATEADD(year, -2000, refPTU.[_Date_Time])  as [Период]
	, 'Доп расходы' as [Статья]
	, 'Приход' as [Вид операции]
	, Null as [Хоз операция]
	, 'ПТУ' as [тип документа]
	, Null as [Номер документа]
	, Null as [Номер заказа]
	, val._Description as [Валюта документа]
	,  CASE 
				WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
				WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
				ELSE 'Неопределено'
				END as [Ценовая группа]
	, _Fld33630RRef as [1c_document_id]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = refPTU.[_Fld7121RRef] ) as [Организация]
	, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = refPTU.[_Fld7060RRef]) as [Партнер]
	, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),5,12) ))as PartnerId
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = refPTU.[_Fld7064RRef]) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = refPTU.[_Fld7067RRef]) as [Менеджер]
	, [_Fld33631RRef] as [1c_id]
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  refPTU.[_Date_Time] 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= refPTU.[_Date_Time] 
				ORDER BY _Period desc ) as  [Курс usd2]
	, Null as [Количество]
	, Null as [Сумма] 
	, Null as [СуммаБезНДС] 
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2]
	, Null as [Таможня]
	, Null as [ЕАЭС]
	, Null as [Доставка]
	, Null as [Производство]
	, Null as [ЗатратыМП]
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение]
	, Null as [ЗатратыСкладЗарплата]
	, Null as [Приемка]
	, Null as [АтсМаркировка]
	, Null as [ВремяВыполненияМинут]
	, Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2]
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]
	, [_Fld33633] / 1000 as [Доп расходы]
	, 0 as [Доп расходы USD2+2]
  
  FROM [MAG_2019].[dbo].[_InfoRg33629]
  LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
	ON refPTU.[_IDRRef] = [_Fld33630RRef]
 -- LEFT JOIN [MAG_2019].[dbo].[_Document483_VT7128X1] as refPtuNomen
	--ON refPtuNomen.[_Document483_IDRRef] = refPTU.[_IDRRef]
	--	AND refPtuNomen.[_Fld7130RRef] = [_Fld33631RRef]
  LEFT JOIN MAG_2019.dbo._reference50 val 
	ON val._IDRRef = refPTU.[_Fld7059RRef]
  LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura 
	ON refNomenclatura.[_IDRRef] = [_Fld33631RRef]

where [_Fld33634_RRRef] = 0x998DB49691D57EFD11F0366B9FA43F0B
and refPTU.[_Date_Time] >= @dtSqlStart

) as tabDopRashod


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


	
SELECT -- top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка] / [Курс usd2] as [Доставка USD2+2]
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство USD2+2]

 FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ДОСТАВКА \\\\\\\\\\\\\\\\
SELECT --TOP (1) 

	  DATEADD(year, -2000, refPTU.[_Date_Time])  as [Период]
	, 'Доставка контейнера ВЭД' as [Статья]
	, 'Приход' as [Вид операции]
	, Null as [Хоз операция]
	, 'ПТУ' as [тип документа]
	, Null as [Номер документа]
	, Null as [Номер заказа]
	, val._Description as [Валюта документа]
	,  CASE 
				WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
				WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
				ELSE 'Неопределено'
				END as [Ценовая группа]
	, _Fld33630RRef as [1c_document_id]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = refPTU.[_Fld7121RRef] ) as [Организация]
	, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = refPTU.[_Fld7060RRef]) as [Партнер]
	, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),5,12) ))as PartnerId
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = refPTU.[_Fld7064RRef]) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = refPTU.[_Fld7067RRef]) as [Менеджер]
	, [_Fld33631RRef] as [1c_id]
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  refPTU.[_Date_Time] 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= refPTU.[_Date_Time] 
				ORDER BY _Period desc ) as  [Курс usd2]
	, Null as [Количество]
	, Null as [Сумма] 
	, Null as [СуммаБезНДС] 
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2]
	, Null as [Таможня]
	, Null as [ЕАЭС]
	, [_Fld33633] / 1000 as [Доставка]
	, Null as [Производство]
	, Null as [ЗатратыМП]
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение]
	, Null as [ЗатратыСкладЗарплата]
	, Null as [Приемка]
	, Null as [АтсМаркировка]
	, Null as [ВремяВыполненияМинут]
	, Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2]
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]
  
  FROM [MAG_2019].[dbo].[_InfoRg33629]
  LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
	ON refPTU.[_IDRRef] = [_Fld33630RRef]
 -- LEFT JOIN [MAG_2019].[dbo].[_Document483_VT7128X1] as refPtuNomen
	--ON refPtuNomen.[_Document483_IDRRef] = refPTU.[_IDRRef]
	--	AND refPtuNomen.[_Fld7130RRef] = [_Fld33631RRef]
  LEFT JOIN MAG_2019.dbo._reference50 val 
	ON val._IDRRef = refPTU.[_Fld7059RRef]
  LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura 
	ON refNomenclatura.[_IDRRef] = [_Fld33631RRef]

where [_Fld33634_RRRef] = 0x997EB49691D57EFD11ECE1AC556F9FF0
and refPTU.[_Date_Time] >= @dtSqlStart

) as tabDostavka


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'
		

	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство] , [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


SELECT --top 1000
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма]
	, [СуммаБезНДС]
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка] / [Курс usd2] as [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС] 
	, [Доставка]  
	, [Производство] 
	, [ЗатратыМП]  
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка] / [Курс usd2] as [Доставка USD2+2]
	, [НДС] / [Курс usd2] as [НДС USD2+2]
	, [Таможня] / [Курс usd2] as [Таможня USD2+2]
	, [Производство] / [Курс usd2] as [Производство USD2+2]

FROM (
  -- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ЗАКУПКИ \\\\\\\\\\\\\\\\
	select  --top (1)
			DATEADD(year, -2000, _Period) as [Период]
			, case 
					WHEN  r._RecorderTRef=0x000001A1 or r._RecorderTRef=0x0000020D THEN 'НДС'
					--WHEN r._RecorderTRef=0x000001A1 THEN 'ЕАЭС'
					--WHEN r._RecorderTRef=0x0000020D THEN 'Таможня'
					ELSE 'Закупка' 
				END
				as [Статья]
			, 'Приход' as [Вид операции]	
			, Null as [Хоз операция]
			, case r._RecorderTRef 
					WHEN 0x000001A1 then 'Заявление о ввозе товаров из ЕАЭС'
					WHEN 0x00000189 then 'Возврат товаров поставщику'
					WHEN 0x000001E3 then 'ПТУ'
					WHEN 0x000001D5 then 'Передача товаров'
					WHEN 0x000001B0 then 'Корректировка 	 '
					WHEN 0x0000020D then 'Таможенная декларация на импорт'
					ELSE 'Неизвестный тип'
				END as [тип документа]
			, Null as [Номер документа]
			, Null as [Номер заказа]
			, val._Description as [Валюта документа]
			, CASE 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
				WHEN r._RecorderTRef = 0x0000020D THEN 'Руб'
				ELSE 'Неопределено'
				END as [Ценовая группа]
			, r._RecorderRRef as [1c_document_id]
			, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = r._Fld16346RRef ) as [Организация]
			, (SELECT TOP(1) _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = r.[_Fld16353RRef]) as [Партнер]
			, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),5,12) ))as PartnerId
			, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = r._Fld16354_RRRef) as [Контрагент]
			, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = [_Fld16348RRef]) as [Менеджер]
			, analitikaUchetaNomenklaturi.[_Fld20498RRef]	 as [1c_id]
			, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),5,12))) as [artic_id]
			, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				--WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND _Period <= r._Period 
				ORDER BY _Period desc ) as  [Курс usd]
			, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
				--WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND _Period <= r._Period 
				ORDER BY _Period desc ) as  [Курс usd2]
			, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
					THEN
						case [_Fld16345RRef] 
						when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16361]
						ELSE [_Fld16361]  END
					--WHEN r._RecorderTRef = 0x0000020D  THEN customDeclaration._Fld8943
					WHEN r._RecorderTRef = 0x0000020D  THEN 0
					--WHEN r._RecorderTRef=0x000001A1 THEN docEAS.[_Fld4052]  
					WHEN r._RecorderTRef=0x000001A1 THEN 0
					ELSE 0 END
				as [Количество]	
			, [_Fld16362] / 1000  as [Сумма]
			, [_Fld16363] / 1000  as [СуммаБезНДС] 
			, 0 as [СуммаРучнойСкидки]
			, 0 as [СуммаАвтоСкидки]
			, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
					THEN 
						case [_Fld16345RRef] 
							when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16362] / 1000
							ELSE [_Fld16362] / 1000 END
					ELSE 0 END
				AS [Закупка]
			, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка поле "сумма в валюте документа"
					THEN 
						case [_Fld16345RRef] 
							when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16373] / 1000
							ELSE [_Fld16373] / 1000  END
					ELSE 0 END as [Закупка, usd2]
			, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000 END as [Таможня]
			, Null as [ЕАЭС]
			, Null as [Доставка] -- доставка
			, Null as [Производство] -- [Производство] 
			, Null as [ЗатратыМП] -- Затраты МП
			, CASE WHEN r._RecorderTRef=0x000001A1 or r._RecorderTRef=0x0000020D THEN ([_Fld16362] - [_Fld16363]) / 1000 
			  ELSE Null END as [НДС]
			, Null as [ЗатратыСкладХранение] -- Затраты cклад хранение
			, Null as [ЗатратыСкладЗарплата]-- Затраты cклад зарплаты
			, Null as [Приемка]
			, Null as [АтсМаркировка]
			, Null as [ВремяВыполненияМинут]
			, Null as [СборкаЗаказа]			
		from
			mag_2019.dbo._AccumRg16344 r-- Регистр накопления Закупки
				LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
					on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef] 
				LEFT JOIN MAG_2019.dbo._Reference188X1 as N
					on analitikaUchetaNomenklaturi.[_Fld20498RRef]	 = N._IDRRef
				LEFT JOIN MAG_2019.dbo._reference50 val 
					ON val._IDRRef = r._Fld16372RRef
				LEFT JOIN [MAG_2019].[dbo].[_Document525_VT8936] as customDeclaration
					ON customDeclaration.[_Document525_IDRRef] = [r]._RecorderRRef 
					and analitikaUchetaNomenklaturi.[_Fld20498RRef] = customDeclaration._Fld8939RRef 
				LEFT JOIN [MAG_2019].[dbo].[_Document417_VT4034] as docEAS
					ON docEAS.[_Document417_IDRRef] = [r]._RecorderRRef 
					and [_Fld16349RRef] = docEAS.[_Fld4037RRef] 

		where _Period >= @dtSqlStart
				) tabZakupki


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство] , [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


	
SELECT -- top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2] 
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство USD2+2]

 FROM (
-- \\\\\\\\\\\\\\\\\\\\ ЗАТРАТЫ МП \\\\\\\\\\\\\\\
SELECT -- TOP (1000) 
		
	  DATEADD(year, -2000, [_Period])  as [Период]
	, 'Затраты МП' as [Статья]
	, 'Приход' as [Вид операции]
	, Null as [Хоз операция]
	, 'Отчет комиссионера' as [тип документа]
	, Null as [Номер документа]
	, Null as [Номер заказа]
	, 'Руб' as [Валюта документа]
	, 'Руб' as [Ценовая группа]
	, [_RecorderRRef] as [1c_document_id]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = otchetKommissionera.[_Fld5484RRef]) as [Организация]
	, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = otchetKommissionera.[_Fld5485RRef] ) as [Партнер]
	, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2),5,12) ))as PartnerId
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = otchetKommissionera.[_Fld5486RRef]) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = otchetKommissionera.[_Fld5492RRef]) as [Менеджер]
	, [_Fld33391RRef] as [1c_id]
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  r.[_Period] 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= r.[_Period] 
				ORDER BY _Period desc ) as  [Курс usd2]
	, Null as [Количество]
	, Null as [Сумма] 
	, Null as [СуммаБезНДС] 
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2]
	, Null as [Таможня]
	, Null as [ЕАЭС]
	, Null as [Доставка]
	, Null as [Производство]
	, [_Fld33394] / 1000 as [ЗатратыМП]
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение]
	, Null as [ЗатратыСкладЗарплата]
	, Null as [Приемка]
	, Null as [АтсМаркировка]
	, Null as [ВремяВыполненияМинут]
	, Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2]
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as  [Производство USD2+2]

  FROM [MAG_2019].[dbo].[_AccumRg33390] as r
  LEFT JOIN [MAG_2019].[dbo].[_Document458_VT5524] as otchetKommissioneraTabTovari
  on otchetKommissioneraTabTovari.[_Fld5526RRef] = [_Fld33391RRef]
  AND otchetKommissioneraTabTovari.[_Document458_IDRRef] = [_RecorderRRef] 
  LEFT JOIN [MAG_2019].[dbo].[_Document458] as otchetKommissionera
  ON otchetKommissionera.[_IDRRef] = otchetKommissioneraTabTovari.[_Document458_IDRRef]
  
  where [_Period] >= @dtSqlStart

) as tabZatratiMP



END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


	
SELECT  --top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2] 
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство USD2+2]

 FROM (

 -- \\\\\\\\\\\\\\\\\\\\ СПИСАНИЕ ТОВАРОВ \\\\\\\\\\\\\\\
SELECT  --top (555)
    DATEADD(year, -2000, refSpisNedTov._Date_Time)  as [Период]
	, 'Списание товара' as [Статья]
	, 'Расход' as [Вид операции]
	, Null as [Хоз операция]
	, 'Списание недостач' as [тип документа]
	, refSpisNedTov._Number as [Номер документа]
	, '' as [Номер заказа]
	, 'Руб'	as [Валюта документа]		-- Валюта документа
	, 'Руб' as [Ценовая группа]
	, refSpisNedTov._IDRRef as [1c_document_id]
    , Null as [Организация] -- Организация
	, Null as [Партнер] -- партнер
	, Null as [PartnerId]
	, Null as [Контрагент] -- контрагент
	, Null as [Менеджер] -- Менеджер
    , tabSpisNedTov.[_Fld8532RRef] AS [1c_id] -- Номенклатура
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  refSpisNedTov._Date_Time 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= refSpisNedTov._Date_Time 
				ORDER BY _Period desc ) as  [Курс usd2]
	, CAST(tabSpisNedTov.[_Fld8535] as decimal(15,3)) as [Количество] --	 Количество 
	, Null as [Сумма]
	, Null as [СуммаБезНДС]
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2] 
	, Null as [Таможня]
	, Null as [ЕАЭС]
    , Null as [Доставка]			-- доставка
	, Null as [Производство] -- Сборка 
	, Null as [ЗатратыМП] -- Затраты мп
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
	, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
    , Null as Приемка
    , Null as [АтсМаркировка]
    , Null as [ВремяВыполненияМинут]
    , Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2] 
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]

  FROM [MAG_2019].[dbo].[_Document512_VT8530] as tabSpisNedTov
  INNER JOIN [MAG_2019].[dbo].[_Document512] as refSpisNedTov
  on refSpisNedTov._IDRRef = tabSpisNedTov._Document512_IDRRef
  and refSpisNedTov._Posted = 1


   -- \\\\\\\\\\\\\\\\\\\\ ОПРИХОДОВАНИЕ ИЗЛИШКОВ ТОВАРОВ \\\\\\\\\\\\\\\
  UNION ALL

  
SELECT --top (1000)
    DATEADD(year, -2000, refOprixTov._Date_Time)  as [Период]
	, 'Оприходование излишков товара' as [Статья]
	, 'Приход' as [Вид операции]
	, Null as [Хоз операция]
	, 'Оприходование излишков' as [тип документа]
	, refOprixTov._Number as [Номер документа]
	, '' as [Номер заказа]
	, 'Руб'	as [Валюта документа]		-- Валюта документа
	, 'Руб' as [Ценовая группа]
	, refOprixTov._IDRRef as [1c_document_id]
    , Null as [Организация] -- Организация
	, Null as [Партнер] -- партнер
	, Null as [PartnerId]
	, Null as [Контрагент] -- контрагент
	, Null as [Менеджер] -- Менеджер
    , tabOprixTov.[_Fld5171RRef] AS [1c_id] -- Номенклатура
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  refOprixTov._Date_Time 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= refOprixTov._Date_Time 
				ORDER BY _Period desc ) as  [Курс usd2]
	, CAST(tabOprixTov.[_Fld5174]  as decimal(15,3)) as [Количество] --	 Количество 
	, Null as [Сумма]
	, Null as [СуммаБезНДС]
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2] 
	, Null as [Таможня]
	, Null as [ЕАЭС]
    , Null as [Доставка]			-- доставка
	, Null as [Производство] -- Сборка 
	, Null as [ЗатратыМП] -- Затраты мп
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
	, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
    , Null as Приемка
    , Null as [АтсМаркировка]
    , Null as [ВремяВыполненияМинут]
    , Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2] 
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]

  FROM [MAG_2019].[dbo].[_Document446_VT5169] as tabOprixTov
   INNER JOIN [MAG_2019].[dbo].[_Document446] as refOprixTov
  on refOprixTov._IDRRef = tabOprixTov.[_Document446_IDRRef]
  and refOprixTov._Posted = 1

  ) as tabPereschet


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


	
SELECT  --top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2] 
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство USD2+2]

 FROM (

 -- \\\\\\\\\\\\\\\\\\\\ СПИСАНИЕ ТОВАРОВ \\\\\\\\\\\\\\\
SELECT  --top (555)
    DATEADD(year, -2000, RNtovariNaSkladah.[_Period])  as [Период]
	, 'Пересчет товара' as [Статья]
	, CASE WHEN [_RecordKind] = 1 THEN
		'Расход'
	  ELSE 
		'Приход'
	  END  as [Вид операции]  
	, Null as [Хоз операция]
	, 'Списание недостач' as [тип документа]
	, dokPereschet._Number as [Номер документа]
	, '' as [Номер заказа]
	, 'Руб'	as [Валюта документа]		-- Валюта документа
	, 'Руб' as [Ценовая группа]
	, [_RecorderRRef] as [1c_document_id]
    , Null as [Организация] -- Организация
	, Null as [Партнер] -- партнер
	, Null as [PartnerId]
	, Null as [Контрагент] -- контрагент
	, Null as [Менеджер] -- Менеджер
    , [_Fld17485RRef] AS [1c_id] -- Номенклатура
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  RNtovariNaSkladah.[_Period] 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= RNtovariNaSkladah.[_Period] 
				ORDER BY _Period desc ) as  [Курс usd2]
	,  CASE WHEN [_RecordKind] = 1 THEN
		[_Fld17491] * -1
		ELSE 
			[_Fld17491]
		END  as [Количество] --	 Количество 
	, Null as [Сумма]
	, Null as [СуммаБезНДС]
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2] 
	, Null as [Таможня]
	, Null as [ЕАЭС]
    , Null as [Доставка]			-- доставка
	, Null as [Производство] -- Сборка 
	, Null as [ЗатратыМП] -- Затраты мп
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
	, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
    , Null as Приемка
    , Null as [АтсМаркировка]
    , Null as [ВремяВыполненияМинут]
    , Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2] 
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]

  FROM [MAG_2019].[dbo].[_AccumRg17484] as RNtovariNaSkladah
  LEFT JOIN [MAG_2019].[dbo].[_Document473X1] as dokPereschet
  on dokPereschet._IDRRef = [_RecorderRRef]
  where [_RecorderTRef] = 0x000001D9 -- Документ пересчет 
   and [_Period] > @dtSqlStart

  

  ) as tabPereschet
   


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


	
SELECT -- top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2] 
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство USD2+2]

 FROM (

	-- \\\\\\\\\\\\\\\\\\\\ ПРИЕМКА \\\\\\\\\\\\\\\
   SELECT --top 1000
	  DATEADD(year, -2000, docOtbor._Date_Time)  as [Период]
	, 'Приемка товара' as [Статья]
	, 'Приход' as [Вид операции]
	, Null as [Хоз операция]
	, 'Отбор (размещение) товара' as [тип документа]
	, docOtbor._Number as [Номер документа]
	, zakasPostavshiku._Number as [Номер заказа]
	, 'Руб'	as [Валюта документа]		-- Валюта документа
	, 'Руб' as [Ценовая группа]
	, docOtbor._IDRRef as [1c_document_id]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = zakasPostavshiku._Fld3411RRef ) as [Организация]
	, (SELECT TOP(1) _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = zakasPostavshiku._Fld3409RRef) as [Партнер]
	, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),5,12) )) as [PartnerId]
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = zakasPostavshiku._Fld3410RRef) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = zakasPostavshiku._Fld3415RRef) as [Менеджер]
	, otborTabRazmeshenie._Fld5347RRef as [1c_id]
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  docOtbor._Date_Time 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= docOtbor._Date_Time 
				ORDER BY _Period desc ) as  [Курс usd2]
	, Null as [Количество] --	 Количество 
	, Null as [Сумма]
	, Null as [СуммаБезНДС]
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2] 
	, Null as [Таможня]
	, Null as [ЕАЭС]
    , Null as [Доставка]			-- доставка
	, Null as [Производство] -- Производство \\\ Сборка 
	, Null as [ЗатратыМП] -- Затраты мп
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
	, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
    , ((CASE 
        WHEN DAY(docOtbor._Fld5324) <> DAY(docOtbor._Fld5325) THEN
            ((20 - DATEPART(HOUR, docOtbor._Fld5324)) * 60 - DATEPART(MINUTE, docOtbor._Fld5324) - DATEPART(SECOND, docOtbor._Fld5324) / 60.0) +
            ((DATEDIFF(DAY, docOtbor._Fld5324, docOtbor._Fld5325) - 1) * 12 * 60) +
            ((DATEPART(HOUR, docOtbor._Fld5325) - 8) * 60 + DATEPART(MINUTE, docOtbor._Fld5325) + DATEPART(SECOND, docOtbor._Fld5325) / 60.0)
        ELSE
            DATEDIFF(SECOND, docOtbor._Fld5324, docOtbor._Fld5325) / 60.0
    END * 3 / SUM(otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1)) over (partition by docOtbor._IDRRef) 
	* otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1)) + 
    ((COUNT(*) over (partition by docOtbor._IDRRef) / 3000 + otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) / 50000 + 
     (upackovka.ves * otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) / 15000)) / 3 * 20000)) / 1000 AS [Приемка]
	, Null as [АтсМаркировка]
	, Null as [ВремяВыполненияМинут]
	, Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2] 
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]
FROM 
    [MAG_2019].[dbo].[_Document453_VT5341X1] AS otborTabRazmeshenie

	INNER JOIN [MAG_2019].[dbo].[_Document453X1] AS docOtbor
		ON docOtbor._IDRRef = otborTabRazmeshenie._Document453_IDRRef
		and docOtbor._Fld5316_RTRef = 0x000001E6 -- Фильтрация по псо
		and  docOtbor._Fld5325 >= @dtStart
		and  docOtbor._Fld5324 >= @dtStart
		and docOtbor._Posted = 0x01
	
	INNER JOIN [MAG_2019].[dbo].[_Document486] as docPSO
		on docPSO._Fld7346_RTRef = 0x00000198  -- фильтрация по заказу поставщика
		and docOtbor._Fld5316_RRRef = docPSO._IDRRef
	LEFT JOIN [MAG_2019].[dbo].[_Document408X1] as zakasPostavshiku 
		on docPSO._Fld7346_RRRef = zakasPostavshiku._IDRRef
	LEFT JOIN (
		SELECT 
			upackovka._OwnerID_RRRef AS vladelec, -- Владелец
			CASE WHEN upackovka._Fld24768 = 0 THEN
				1
			ELSE
				ISNULL(upackovka._Fld24768, 1)
			END AS chislitel, -- Числитель
			upackovka._Fld24769 AS znamenatel, -- Знаменатель
			CAST(CASE 
				WHEN 1 = 1 -- ВесИспользовать
					AND upackovka._Fld24769 <> 0 -- Знаменатель
				THEN upackovka._Fld24768 / upackovka._Fld24769 
				ELSE 0
			END AS DECIMAL(15, 3)) AS ves
		FROM 
			[MAG_2019].[dbo].[_Reference347X1] AS upackovka
		WHERE 
			upackovka._Marked = 0 -- ПометкаУдаления
								) AS upackovka

			ON upackovka.vladelec = otborTabRazmeshenie._Fld5347RRef -- Сопоставление Номенклатуры и Владелец
			WHERE
			  1=1  
			  and ISNULL(otborTabRazmeshenie._Fld5346, 0) > 0
			  and docOtbor._Date_Time >= @dtSqlStart
	

) as tabPriemka


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2], [Заказ закрыт]
		)


SELECT  --top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка] / [Курс usd2] as [Доставка USD2+2]
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство USD2+2]
	, [Заказ закрыт]

 FROM (
-- ///////////////// ПРОДАЖИ ////////////////
SELECT  --TOP (1)

	   DATEADD(year, -2000, [_Period])  as [Период] 
	, 'Реализация' as [Статья]
	, 'Расход' as  [Вид операции]
	, Null as [Хоз операция]
	, case [_RecorderTRef]
					WHEN 0x000001F4 then 'РТУ'				
					ELSE 'Неизвестный тип'
				END [тип документа]
	, docRTU.[_Number] as [Номер документа]
	, orders.[_Number] as [Номер заказа]
	, val._Description as [Валюта документа]
	, CASE 
		WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
		WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
		ELSE 'Неопределено'
		END as [Ценовая группа] 
	, [_RecorderRRef] as [1c_document_id]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = AnalitikaUchetaPartner.[_Fld20514RRef]  ) as [Организация]
	, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = AnalitikaUchetaPartner.[_Fld20513RRef]) as [Партнер]
	, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2),5,12) ))as PartnerId
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = AnalitikaUchetaPartner.[_Fld20515_RRRef]) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = orders._Fld3138RRef) as [Менеджер]
	, analitikaUchetaNomenklaturi.[_Fld20498RRef]  as [1c_id]
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2),21,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2),17,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2),1,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  r.[_Period] 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= r.[_Period] 
				ORDER BY _Period desc ) as  [Курс usd2]
	, [_Fld15567] as [Количество]
	, [_Fld15568] / 1000 as [Сумма] 
	, Null as [СуммаБезНДС] 
	, [_Fld15595] / 1000 as [СуммаРучнойСкидки]
	, [_Fld15596] / 1000 as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2]
	, Null as [Таможня]
	, Null as [ЕАЭС]
	, Null as [Доставка]
	, Null as [Производство]
	, Null as [ЗатратыМП]
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение]
	, Null as [ЗатратыСкладЗарплата]
	, Null as [Приемка]
	, Null as [АтсМаркировка]
	, Null as [ВремяВыполненияМинут]
	, Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2]
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]
	, DATEADD(year, -2000, SostZakazaClienta.DateClose) as [Заказ закрыт]
    
  FROM [MAG_2019].[dbo].[_AccumRg15547] as r 
  LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
	on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld15548RRef] 
  LEFT JOIN [MAG_2019].[dbo].[_Reference162] as AnalitikaUchetaPartner
	on AnalitikaUchetaPartner.[_IDRRef] = [_Fld15550RRef]	
  LEFT JOIN [MAG_2019].[dbo].[_Document500X1] as docRTU
	on docRTU.[_IDRRef] = [_RecorderRRef]
  LEFT JOIN (SELECT 
			[_Document500_IDRRef] as _IDRRef  
			,MIN([_Fld7990_RRRef]) as orderRTU     
		  FROM [MAG_2019].[dbo].[_Document500_VT7967X1]
		  GROUP BY 
			[_Document500_IDRRef]) as ordersRTU
	ON ordersRTU._IDRRef = [_RecorderRRef]
  LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as orders
	ON orders.[_IDRRef] = ordersRTU.orderRTU
  LEFT JOIN (SELECT --TOP (1000)
				MIN([_Period]) as DateClose
			  ,[_Fld28369_RRRef] as zakazrref
		  FROM [MAG_2019].[dbo].[_InfoRg28368]
		where [_Fld28370_RRRef] = 0x9AE0BC17F922537141FF55A099D7C9C4
		GROUP BY 
			[_Fld28369_RRRef]) as SostZakazaClienta
    ON SostZakazaClienta.zakazrref =  orders.[_IDRRef]
  LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura 
	ON refNomenclatura.[_IDRRef] = analitikaUchetaNomenklaturi.[_Fld20498RRef]
  LEFT JOIN MAG_2019.dbo._reference50 val 
	ON val._IDRRef = [_Fld15601RRef]

	where r.[_Period] >= @dtSqlStart
) as tabProdaji



END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'

	
	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 	
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


	
SELECT -- top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка] / [Курс usd2] as [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2] 
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство] / [Курс usd2] as [Производство USD2+2]

 FROM (

-- \\\\\\\\\\\\\\\\ СБОРКА  РАСХОД  БЕЗ ЗАТРАТ НА СБОРКУ\\\\\\\\\\\\\\\\
SELECT --TOP (1000)

	  DATEADD(year, -2000, znS.[_Date_Time])  as [Период]
	, 'Производство товара' as [Статья]
	, 'Расход' as [Вид операции]
	, Null as [Хоз операция]
	, 'Заказ на сборку' as [тип документа]
	, Null as [Номер документа]
	, Null as [Номер заказа]
	, 'Руб' as [Валюта документа]
	, 'Руб' as [Ценовая группа]
	, TabGoods.[_Document407_IDRRef] as [1c_document_id]

	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = ZnS.[_Fld3348RRef] ) as [Организация]
	, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = Kontr.[_Fld20612RRef]) as [Партнер]
	, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),5,12) ))as PartnerId
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = ZnS.[_Fld27876RRef]) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = ZnS.[_Fld28230RRef]) as [Менеджер]
	, [_Fld3381RRef] as [1c_id]
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  znS.[_Date_Time] 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= znS.[_Date_Time] 
				ORDER BY _Period desc ) as  [Курс usd2]
	, [_Fld3385] as [Количество]
	, Null as [Сумма] 
	, Null as [СуммаБезНДС] 
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	--, (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist] 
	--			WHERE [Вид цены] = 'Учетная цена (руб)' 
	--				AND  [Дата] <= znS.[_Date_Time] 
	--				and [_Fld3381RRef] = [1c_id]
	--			ORDER BY Дата desc ) / 1000 * [_Fld3385] * -1
	, Null as [Закупка]
	, Null as [Закупка, usd2]
	, Null as [Таможня]
	, Null as [ЕАЭС]
	, Null as [Доставка]
	, Null as [Производство]
	, Null as [ЗатратыМП]
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение]
	, Null as [ЗатратыСкладЗарплата]
	, Null as [Приемка]
	, Null as [АтсМаркировка]
	, Null as [ВремяВыполненияМинут]
	, Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2]
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]

  FROM [MAG_2019].[dbo].[_Document407_VT3379X1] as TabGoods
  INNER JOIN [MAG_2019].[dbo].[_Document407X1] as ZnS -- Заказ на сборку
	  on ZnS._IDRRef = [_Document407_IDRRef]
	  and _Posted = 0x01 -- проведен
	--  and [_Number] = 'АНУТ-010680' -- номер дока для проверки
	  and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
  LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
		 ON Kontr.[_IDRRef]  = ZnS.[_Fld27876RRef]

	where  znS.[_Date_Time] >= @dtSqlStart
	and TabGoods.[_Fld3392] = 0x00  -- отменено ложь



UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА  ПРИХОД + ЗАТРАТЫ НА СБОРКУ \\\\\\\\\\\\\\\\
SELECT -- top 1000
	DATEADD(year, -2000, znS.[_Date_Time])  as [Период]
	, 'Производство товара' as [Статья]
	, 'Приход' as [Вид операции]
	, Null as [Хоз операция]
	, 'Заказ на сборку' as [тип документа]
	, Null as [Номер документа]
	, ZnS._Number as [Номер заказа]
	, 'Руб' as [Валюта документа]
	, 'Руб' as [Ценовая группа]
	, [табКомплекты].[_Document407_IDRRef] as [1c_document_id]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = ZnS.[_Fld3348RRef] ) as [Организация]
	, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = Kontr.[_Fld20612RRef]) as [Партнер]
	, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),5,12) ))as PartnerId
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = ZnS.[_Fld27876RRef]) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = ZnS.[_Fld28230RRef]) as [Менеджер]
	, [табКомплекты].[_Fld28059RRef]   as [1c_id]
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2),5,12))) as [artic_id]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND  _Period <=  znS.[_Date_Time] 
				ORDER BY _Period desc ) as  [Курс usd]
	, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND _Period <= znS.[_Date_Time] 
				ORDER BY _Period desc ) as  [Курс usd2]
	, [табКомплекты].[_Fld28063] as [Количество]
	, Null as [Сумма] 
	, Null as [СуммаБезНДС] 
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, [табКомплектующие].Закупка as Закупка -- Новый не костыль 
	, Null as [Закупка, usd2]
	, Null as [Таможня]
	, Null as [ЕАЭС]
	, Null as [Доставка]
	, TabZatratiSborka.sborka / 1000 as [Производство]
	, Null as [ЗатратыМП]
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение]
	, Null as [ЗатратыСкладЗарплата]
	, Null as [Приемка]
	, Null as [АтсМаркировка]
	, Null as [ВремяВыполненияМинут]
	, Null as [СборкаЗаказа]
	, Null as [Доставка USD2+2]
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]

FROM [MAG_2019].[dbo]._Document407_VT28057X1 as [табКомплекты] -- список товаров к поступлению ...
INNER JOIN [MAG_2019].[dbo].[_Document407X1] as ZnS -- Заказ на сборку
	  on ZnS._IDRRef = [табКомплекты].[_Document407_IDRRef]
	  and _Posted = 0x01 -- проведен
	  and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт

LEFT JOIN (SELECT --top 500
	SUM(tabItog.[Закупка]) as [Закупка]
	, tabItog.[КодСтрокиКомплекта]
	, [ZnSRref] as [ZnSRref]
FROM (
SELECT 
	(SELECT TOP 1 [Учетная цена] FROM [mag_pbi].[pbiProd].[СебестоимостьПроизводствоОт2022] 
				WHERE [Период] <= znS.[_Date_Time] 
					and [1c_id] = [табКомплектующие]._Fld3381RRef
				ORDER BY [Период] desc )  * [_Fld3385] as [Закупка] 
	,[табКомплектующие].[_Fld28055] as [КодСтрокиКомплекта]
	, ZnS._IDRRef as [ZnSRref]
FROM [MAG_2019].[dbo].[_Document407_VT3379X1] as [табКомплектующие] -- в конфе это тч Товары, здесь лежит список товаров на ВХОД и Вариант комплектации ...
	--ON [табКомплектующие]._Document407_IDRRef = [табКомплекты].[_Document407_IDRRef]
	--and [табКомплектующие]
INNER JOIN [MAG_2019].[dbo].[_Document407X1] as ZnS -- Заказ на сборку
	  on ZnS._IDRRef = [табКомплектующие].[_Document407_IDRRef]
	  and _Posted = 0x01 -- проведен
	  and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт

) as tabItog

GROUP BY 
	tabItog.[КодСтрокиКомплекта]
	, [ZnSRref]
	) as [табКомплектующие] -- в конфе это тч Товары, здесь лежит список товаров на ВХОД и Вариант комплектации ...
		ON [табКомплектующие].КодСтрокиКомплекта = [табКомплекты].[_Fld28070]
		and [табКомплектующие].ZnSRref = [табКомплекты].[_Document407_IDRRef]

LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
		 ON Kontr.[_IDRRef]  = ZnS.[_Fld27876RRef]

 LEFT JOIN (SELECT  --TOP (1000)	
		  [_RecorderRRef] -- регистратор	
		 , [_Fld33653RRef] -- Номенклатура
		 , SUM([_Fld33658]) / 1000 as sborka -- сборка 
		 FROM [MAG_2019].[dbo].[_AccumRg33652] -- рн работы	
		where [_RecorderTRef] = 0x00000197

		group by 		
			 [_RecorderRRef]
			, [_Fld33653RRef] -- Номенклатура
			) as TabZatratiSborka
			ON TabZatratiSborka.[_RecorderRRef] = [табКомплекты].[_Document407_IDRRef]
			and TabZatratiSborka.[_Fld33653RRef] = [табКомплекты].[_Fld28059RRef]  

where 1=1 
  and [табКомплекты].[_Fld28152] = 0x00 -- отменено ложь
  and znS.[_Date_Time] >= @dtSqlStart
  --and tabSet.[_Fld28059RRef] = 0x9987B49691D57EFD11EEE1296BB584D6
  --and ZnS._Number = 'АНУТ-007990' 
  --and znS.[_Date_Time] >= @dtSqlStart
  ) as tabProizvodstvo


END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DECLARE @dtStart dateTime2;
	DECLARE @dtEnd datetime2;
	DECLARE @dtSqlStart dateTime2;
	DECLARE @dtSqlEnd datetime2;
	SET @dtStart = '2022-01-01'
	SET @dtEnd= '2030-01-01'
	SET @dtSqlStart = '4022-01-01'
	SET @dtSqlEnd= '4030-01-01'


	INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022] 
			
		([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
		[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
		)


SELECT -- top (1000) 
	  [Период]
	, [Статья]
	, [Вид операции]
	, [Хоз операция]
	, [тип документа]
	, [Номер документа]
	, [Номер заказа]
	, [Валюта документа]
	, [Ценовая группа]
	, [1c_document_id]
	, [Организация]
	, [Партнер]
	, [PartnerId]
	, [Контрагент]
	, [Менеджер]
	, [1c_id]
	, [artic_id]
	, [Курс usd]
	, [Курс usd2]
	, [Количество]
	, [Сумма] 
	, [СуммаБезНДС] 
	, [СуммаРучнойСкидки]
	, [СуммаАвтоСкидки]
	, [Закупка]
	, [Закупка, usd2]
	, [Таможня]
	, [ЕАЭС]
	, [Доставка]
	, [Производство]
	, [ЗатратыМП]
	, [НДС]
	, [ЗатратыСкладХранение]
	, [ЗатратыСкладЗарплата]
	, [Приемка]
	, [АтсМаркировка]
	, [ВремяВыполненияМинут]
	, [СборкаЗаказа]
	, [Доставка USD2+2] as [Доставка USD2+2]
	, [НДС USD2+2]
	, [Таможня USD2+2]
	, [Производство] / [Курс usd2] as [Производство USD2+2]

 FROM (
 
 -- \\\\\\\\\\\\\\\\\\\\ СБОРКА ЗАКАЗА КЛИЕНТА \\\\\\\\\\\\\\\
  SELECT  --TOP (100000) 
		
	  DATEADD(year, -2000, docOtbor._Date_Time) as [Период]
	, 'Сборка заказа' as [Статья]
	, 'Приход' as [Вид операции]
	, Null as [Хоз операция]
	, 'Отбор (отбор) товара'  as [тип документа]
	, docOtbor._Number as [Номер документа]
	, docZakazKlienta._Number as [Номер заказа]
	, 'Руб'	as [Валюта документа]		-- Валюта документа
	, 'Руб' as [Ценовая группа]
	, docOtbor._IDRRef as [1c_document_id]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = docZakazKlienta._Fld3129RRef ) as [Организация]
	, (SELECT TOP(1)_description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = docZakazKlienta._Fld3127RRef) as [Партнер]
	,  LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),5,12) ))  as [PartnerId]
	, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = docZakazKlienta._Fld3128RRef) as [Контрагент]
	, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = docZakazKlienta._Fld3138RRef) as [Менеджер]
    , [_Fld5332RRef] as [1c_id]  -- Номенклатура
	, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2),5,12))) as [artic_id]
	--, '' as [artic_id]
	 , (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				--WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND _Period <= docOtbor._Date_Time 
				ORDER BY _Period desc ) as  [Курс usd]
			, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
				--WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND _Period <= docOtbor._Date_Time 
				ORDER BY _Period desc ) as  [Курс usd2]
	, CAST([_Fld5330] as decimal(10,3)) as [Количество] --	 Количество 
	, Null as [Сумма]
	, Null as [СуммаБезНДС]
	, Null as [СуммаРучнойСкидки]
	, Null as [СуммаАвтоСкидки]
	, Null as [Закупка]
	, Null as [Закупка, usd2] 
	, Null as [Таможня]
	, Null as [ЕАЭС]
    , Null as [Доставка]			-- доставка
	, Null as [Производство] -- Сборка 
	, Null as [ЗатратыМП] -- Затраты мп
	, Null as [НДС]
	, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
	, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
	, Null as [Приемка]
	, Null as [АтсМаркировка]
	, CASE 
        WHEN DAY(docOtbor.[_Fld5324]) <> DAY(docOtbor.[_Fld5325]) THEN
            (((20 - DATEPART(HOUR, docOtbor.[_Fld5324])) * 60 - DATEPART(MINUTE, docOtbor.[_Fld5324]) - DATEPART(SECOND, docOtbor.[_Fld5324]) / 60.0) +
            ((DATEDIFF(DAY, docOtbor.[_Fld5324], docOtbor.[_Fld5325]) - 1) * 12 * 60) +
            ((DATEPART(HOUR, docOtbor.[_Fld5325]) - 8) * 60 + DATEPART(MINUTE, docOtbor.[_Fld5325]) + DATEPART(SECOND, docOtbor.[_Fld5325]) / 60.0)) / SUM([_Fld5330]) over (partition by [_Document453_IDRRef]) * [_Fld5330]
        ELSE
            (DATEDIFF(SECOND, docOtbor.[_Fld5324], docOtbor.[_Fld5325]) / 60.0) / SUM([_Fld5330]) over (partition by [_Document453_IDRRef]) * [_Fld5330]
    END  as [ВремяВыполненияМинут] 
	, ((SUM(1) over (partition by [_Document453_IDRRef]) / 5000 + [_Fld5330] / 20000)/2*30000) / 1000 as СборкаЗаказа
	, Null as [Доставка USD2+2]
	, Null as [НДС USD2+2]
	, Null as [Таможня USD2+2]
	, Null as [Производство USD2+2]


      

  FROM [MAG_2019].[dbo].[_Document453_VT5326X1] as OtborTabOtbor
  INNER JOIN [MAG_2019].[dbo].[_Document453X1] as docOtbor
  ON docOtbor.[_IDRRef] = [_Document453_IDRRef] 
	  and docOtbor._Posted = 0x01
	  and  docOtbor._Fld5325 >= @dtStart
	  and  docOtbor._Fld5324 >= @dtStart
	  and docOtbor.[_Fld5316_RTRef] = 0x000001F0 -- RSO
  INNER JOIN [MAG_2019].[dbo].[_Document496X1] as docRSO
  on docOtbor._Fld5316_RRRef = docRSO._IDRRef
  and docRSO.[_Fld27744_RTRef] = 0x00000194  -- zakaz klienta 
  LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as docZakazKlienta
  on docRSO.[_Fld27744_RRRef] = docZakazKlienta._IDRRef

	 WHERE 1=1
		and docOtbor._Date_Time >= @dtSqlStart

		) as tabSborka
END
GO

/****** Object:  StoredProcedure [pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DELETE FROM mag_pbi.pbiProd.[СебестоимостьОт2022] WHERE 1=1

	DBCC CHECKIDENT ('[pbiProd].[СебестоимостьОт2022]', RESEED, 0);

	

END
GO

/****** Object:  StoredProcedure [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Приход]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	

	
	INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням] 	
		([1c_id], [УровеньПроизводства])


	
SELECT 
	tabNomLVL.[1c_id] as [1c_id]
	, ISNULL(tabZNS.[УровеньПроизводства], 1) as [УровеньПроизводства]
FROM (
SELECT 
	_OwnerIDRRef as [1c_id]
FROM 
	[MAG_2019].[dbo].[_Reference54]

	LEFT JOIN [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLvl
	  on NomLvl.[1c_id] = _OwnerIDRRef 
WHERE 
	NomLvl.[УровеньПроизводства] IS NULL) as tabNomLVL

LEFT JOIN (
SELECT
	TabGoods.[_Fld3381RRef]  as [1c_id]
	, 2 as [УровеньПроизводства]
  FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
  --INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
	 -- on ZnS._IDRRef = [_Document407_IDRRef]
	 -- and _Posted = 0x01 -- проведен
	 -- and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
  
  where [_Fld3392] = 0x00 -- отменено ложь
  GROUP BY 
	TabGoods.[_Fld3381RRef] 
  ) as tabZNS
  ON 1=1
	 and tabZNS.[1c_id] = tabNomLVL.[1c_id]




END
GO

/****** Object:  StoredProcedure [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Расход]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Расход]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	

	
	INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням] 	
		([1c_id], [УровеньПроизводства])


	
SELECT DISTINCT 
	 [_Fld3381RRef] as [1c_id]
	 , 0 as [УровеньПроизводства]
FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
WHERE [_Fld3381RRef] NOT IN ( SELECT NomLVL.[1c_id] FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLVL)
  
  




END
GO

/****** Object:  StoredProcedure [pbiProd].[Подготовка Производство: единая процедура для подготовки]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: единая процедура для подготовки]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	DELETE FROM [pbiProd].[СебестоимостьПроизводствоОт2022]
      WHERE 1=1

	DELETE FROM [pbiProd].[НоменклатураВПроизводствеПоУровням]
      WHERE 1=1

	exec [pbiProd].[Подготовка Производство: Заполнить уровень 0]
	exec [pbiProd].[Подготовка Производство: Заполнить уровень 1]
	exec [pbiProd].[Подготовка Производство: Заполнить уровень 2] 
	exec [pbiProd].[Подготовка Производство: Заполнить уровень 3]
	exec [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Расход]
	exec [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Приход];

	WITH CTE AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY УровеньПроизводства 
            ORDER BY ID  -- или другая логика сортировки внутри группы
        ) AS RowNumNew
    FROM 
        [pbiProd].[НоменклатураВПроизводствеПоУровням]
	)
	UPDATE CTE
	SET RowNum = RowNumNew
	






END
GO

/****** Object:  StoredProcedure [pbiProd].[Подготовка Производство: Заполнить уровень 0]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Заполнить уровень 0]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	

	
	INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням] 	
		([1c_id], [УровеньПроизводства])


	
SELECT DISTINCT--TOP (1000)

      [_Fld18241RRef] as [1c_id]
	  , 0 as [УровеньПроизводства] 
     
     
     
  FROM [MAG_2019].[dbo].[_Reference54_VT18239]

  where  [_Fld18241RRef] NOT IN (SELECT 
   
      [_OwnerIDRRef] 
    
  FROM [MAG_2019].[dbo].[_Reference54])




END
GO

/****** Object:  StoredProcedure [pbiProd].[Подготовка Производство: Заполнить уровень 1]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Заполнить уровень 1]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	

	
	INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням] 	
		([1c_id], [УровеньПроизводства])


	

SELECT 
	tabItog.nomVlad as [1c_id]
	, 1 as [УровеньПроизводства]

FROM (
	SELECT DISTINCT 
		refKomplekt._OwnerIDRRef as nomVlad
		, MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) as [УровеньПроизводства]   
	FROM [MAG_2019].[dbo].[_Reference54_VT18239]

	LEFT JOIN [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLvl
	  on NomLvl.[1c_id] = _Fld18241RRef and NomLvl.УровеньПроизводства = 0

	LEFT JOIN [MAG_2019].[dbo].[_Reference54] as refKomplekt
	  on refKomplekt._IDRRef = [_Reference54_IDRRef]

	GROUP BY 
		refKomplekt._OwnerIDRRef
	HAVING 
		MAX(ISNULL(NomLvl.[УровеньПроизводства], 99))  = 0) as tabItog




	






END
GO

/****** Object:  StoredProcedure [pbiProd].[Подготовка Производство: Заполнить уровень 2]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Заполнить уровень 2]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	

	
	INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням] 	
		([1c_id], [УровеньПроизводства])


	


SELECT 
	tabItog.nomVlad
	, 2 as [УровеньПроизводства]
FROM (
	SELECT  
		refKomplekt._OwnerIDRRef as nomVlad 
		, MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) as [УровеньПроизводства]   
	FROM [MAG_2019].[dbo].[_Reference54_VT18239]

	LEFT JOIN [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLvl
	  on NomLvl.[1c_id] = _Fld18241RRef 

	LEFT JOIN [MAG_2019].[dbo].[_Reference54] as refKomplekt
	  on refKomplekt._IDRRef = [_Reference54_IDRRef]

	GROUP BY 
		refKomplekt._OwnerIDRRef
	HAVING 
		MAX(ISNULL(NomLvl.[УровеньПроизводства], 99))  = 1		
		) as tabItog




	






	






END
GO

/****** Object:  StoredProcedure [pbiProd].[Подготовка Производство: Заполнить уровень 3]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Заполнить уровень 3]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	

	
	INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням] 	
		([1c_id], [УровеньПроизводства])


	


SELECT 
	tabItog.nomVlad
	, 3 as [УровеньПроизводства]
FROM (
	SELECT  
		refKomplekt._OwnerIDRRef as nomVlad 
		, MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) as [УровеньПроизводства]   
	FROM [MAG_2019].[dbo].[_Reference54_VT18239]

	LEFT JOIN [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLvl
	  on NomLvl.[1c_id] = _Fld18241RRef 

	LEFT JOIN [MAG_2019].[dbo].[_Reference54] as refKomplekt
	  on refKomplekt._IDRRef = [_Reference54_IDRRef]

	GROUP BY 
		refKomplekt._OwnerIDRRef
	HAVING 
		MAX(ISNULL(NomLvl.[УровеньПроизводства], 99))  = 2		
		) as tabItog




	






	






END
GO

/****** Object:  StoredProcedure [pbiProd].[Подготовка: Заполнить группы номенклатуры для расчета]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка: Заполнить группы номенклатуры для расчета]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	BEGIN

		DELETE FROM mag_pbi.pbiProd.GroupsOfNomenclature

		INSERT INTO mag_pbi.pbiProd.GroupsOfNomenclature (artic_id)


		SELECT --TOP (1000)
		[artic_id]
		  FROM [mag_pbi].[pbi].[nomenclature]
		
		DECLARE @articid nchar(36)	
		DECLARE @2k int
		DECLARE @4k int
		DECLARE @6k int
		DECLARE @8k int
		DECLARE @10k int
		DECLARE @15k int
		DECLARE @20k int
		
		DECLARE @Counter2k int
		DECLARE @Counter4k int
		DECLARE @Counter6k int
		DECLARE @Counter8k int
		DECLARE @Counter10k int
		DECLARE @Counter15k int
		DECLARE @Counter20k int
		DECLARE @counter int


		SET @2k = 1
		SET @4k = 1
		SET @6k = 1
		SET @8k = 1
		SET @10k = 1
		SET @15k = 1
		SET @20k = 1

		SET @counter = 1
		SET @Counter2k = 1
		SET @Counter4k = 1
		SET @Counter6k = 1
		SET @Counter8k = 1
		SET @Counter10k = 1
		SET @Counter15k = 1
		SET @Counter20k = 1



	DECLARE itterate CURSOR FOR
		SELECT  
			[artic_id]	  
		FROM mag_pbi.[pbiProd].[GroupsOfNomenclature] as s

		order by 
			[artic_id]	

	OPEN itterate  
	FETCH NEXT FROM itterate INTO @articid

	WHILE @@FETCH_STATUS = 0  
	BEGIN  
			if @Counter2k <= 2000 begin
				SET @Counter2k = @Counter2k + 1
			end
			else begin
				SET @Counter2k = 0
				SET @2k = @2k + 1		
			end

			if @Counter4k <= 4000 begin
				SET @Counter4k = @Counter4k + 1
			end
			else begin
				SET @Counter4k = 0
				SET @4k = @4k + 1		
			end

			if @Counter6k <= 6000 begin
				SET @Counter6k = @Counter6k + 1
			end
			else begin
				SET @Counter6k = 0
				SET @6k = @6k + 1		
			end

			if @Counter8k <= 8000 begin
				SET @Counter8k = @Counter8k + 1
			end
			else begin
				SET @Counter8k = 0
				SET @8k = @8k + 1		
			end

			if @Counter10k <= 10000 begin
				SET @Counter10k = @Counter10k + 1
			end
			else begin
				SET @Counter10k = 0
				SET @10k = @10k + 1		
			end

			if @Counter15k <= 15000 begin
				SET @Counter15k = @Counter15k + 1
			end
			else begin
				SET @Counter15k = 0
				SET @15k = @15k + 1		
			end

			if @Counter20k <= 20000 begin
				SET @Counter20k = @Counter20k + 1
			end
			else begin
				SET @Counter20k = 0
				SET @20k = @20k + 1		
			end




				UPDATE mag_pbi.[pbiProd].[GroupsOfNomenclature]
				SET [2k] = @2k
					,[4k] = @4k
					,[6k] = @6k
					,[8k] = @8k
					,[10k] = @10k
					,[15k] = @15k
					,[20k] = @20k
					
					
				WHERE [artic_id]= @articid 

		FETCH NEXT FROM itterate INTO @articid
	END 

	CLOSE itterate  
	DEALLOCATE itterate 
END



END
GO

/****** Object:  StoredProcedure [pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	UPDATE [pbiProd].[СебестоимостьПроизводствоОт2022]
	SET [pbiProd].[СебестоимостьПроизводствоОт2022].[1c_id] = nom.[1c_id]
	FROM [pbiProd].[СебестоимостьПроизводствоОт2022] ss
	LEFT JOIN [mag_pbi].[pbi].[nomenclature] as nom ON ss.artic_id = nom.artic_id
	WHERE ss.[1c_id] IS NULL; 



END
GO

/****** Object:  StoredProcedure [sebest].[ComputeStorehouseVolume]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[ComputeStorehouseVolume] 
	-- Add the parameters for the stored procedure here
	
AS
BEGIN
	
	DELETE FROM [pbi].[nomenclatureVolumeStorehouse] WHERE 1=1
	;

	WITH calendar AS (
    SELECT 
        [_Fld13119] AS date -- date 
    FROM [MAG_2019].[dbo].[_InfoRg13116]
    WHERE [_Fld13117RRef] = 0x80CD002590EC174111E58150B83C760D -- calendar
      AND [_Fld13118] > 2018 -- year 
	  
),

GoodsInStorehousesTurnover AS (
    SELECT 
        GoodsInStorehousesTurnover.period AS period,
        GoodsInStorehousesTurnover.nomenclature AS nomenclature,
		GoodsInStorehousesTurnover.storehouse as storehouse,
        SUM(GoodsInStorehousesTurnover.Turnover) OVER (PARTITION BY storehouse, nomenclature ORDER BY period) AS balance
    FROM (
        SELECT
			period,
			nomenclature,
			storehouse,
			SUM(Turnover) as Turnover
		FROM (SELECT --Top (1000)
						[_Period] AS period,
						[_Fld17485RRef] AS nomenclature,
						[_Fld17488RRef] AS storehouse,
						CASE 
							WHEN [_RecordKind] = 0 THEN [_Fld17491]
							ELSE -[_Fld17491]
						END AS Turnover 
					FROM [MAG_2019].[dbo].[_AccumRg17484]
					WHERE
					1=1
					  --and [_Fld17485RRef] = 0x80C5305A3A00E12B11E585239E47A898 -- nom
					  AND [_Fld17488RRef] = 0x80D70CC47A052DFD11E6C841742D2F2C -- storehouse дед-2
					) as tabTurnover
				GROUP BY
					period,
					nomenclature,
					storehouse) AS GoodsInStorehousesTurnover
)

INSERT INTO [pbi].[nomenclatureVolumeStorehouse] ([Период], [balance], [1c_id], [storehouse], [volume], [totalVolume])

SELECT --top (10000)
    calendar_date as [Период],
    GoodsInStorehousesTurnover.balance as balance,
    GoodsInStorehousesTurnover.nomenclature as [1c_id],
	GoodsInStorehousesTurnover.storehouse as storehouse,
	GoodsInStorehousesTurnover.balance * tabVolume.volume as volume,
	SUM(GoodsInStorehousesTurnover.balance * tabVolume.volume) OVER (PARTITION BY GoodsInStorehousesTurnover.storehouse, calendar_date) as totalVolume 
FROM (
    SELECT
        calendar.date AS calendar_date,
        MAX(GoodsInStorehousesTurnover.period) AS turnover_period,
        GoodsInStorehousesTurnover.nomenclature AS nomenclature,
		GoodsInStorehousesTurnover.storehouse as storehouse
    FROM calendar
    LEFT JOIN GoodsInStorehousesTurnover 
        ON calendar.date >= GoodsInStorehousesTurnover.period
    GROUP BY
        calendar.date,	
        GoodsInStorehousesTurnover.nomenclature,
		GoodsInStorehousesTurnover.storehouse
) AS tabBalancePeriodMax
LEFT JOIN GoodsInStorehousesTurnover 
    ON GoodsInStorehousesTurnover.nomenclature = tabBalancePeriodMax.nomenclature
    AND GoodsInStorehousesTurnover.period = tabBalancePeriodMax.turnover_period

LEFT JOIN (SELECT --top (1000) 

				 _OwnerID_RRRef as [1c_id]
				,case when _Fld24768 = 0 then
					0 
				else 
					_Fld24771 / _Fld24768
				end as volume
			
	FROM [MAG_2019].dbo._Reference347X1 u
	INNER JOIN [mag_2019].dbo._Reference188X1 nn ON nn._IDRRef = u._OwnerID_RRRef
	INNER JOIN [mag_pbi].[pbi].[nomenclature] nom on nom.[1c_id] = u._OwnerID_RRRef and nom.[Статус] <> 'Не для продажи'
	where 
		u.[_Marked] = 0x00) as tabVolume
on tabVolume.[1c_id] = tabBalancePeriodMax.nomenclature

where 
	YEAR(calendar_date) >= 4024
	and GoodsInStorehousesTurnover.balance <> 0
	and DATEADD(YEAR, -2000, calendar_date) <= GETDATE()
ORDER BY  
    calendar_date;




END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить итоги до 2022]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить итоги до 2022] 
	-- Add the parameters for the stored procedure here
	
AS
BEGIN

		DELETE FROM [pbi].[СебестоимостьИтогиДо2022]
		 WHERE 1=1

		INSERT INTO mag_pbi.pbi.[СебестоимостьИтогиДо2022] (
		[artic_id], [Количество], [Закупка], [Таможня], [ЕАЭС], [Доставка], [НДС], [Сборка], [Учетная цена])

		

SELECT --TOP (5000) 
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
	  [artic_id]
	  ,[Количество]
      ,[Закупка]
      ,[Таможня]
      ,[ЕАЭС]
      ,[Доставка]
      ,[НДС]
      ,[Сборка]
	  ,case when [Количество] = 0 then 
		0
	   else
		([Закупка] + [Таможня] + [ЕАЭС] + [Доставка] + [НДС] + [Сборка]) / [Количество] 
		end as [Учетная цена]
  FROM (SELECT  
		[artic_id]
	  ,SUM([Количество]) as [Количество]
      ,SUM([Закупка]) as [Закупка]
      ,SUM([Таможня]) as [Таможня]
      ,SUM([ЕАЭС]) as [ЕАЭС]
      ,SUM([Доставка]) as [Доставка]
      ,SUM([НДС]) as [НДС]
      ,SUM([Сборка]) as [Сборка] 
	  FROM
	  
	 (SELECT 
      [artic_id]
	  ,CASE WHEN [Вид операции] = 'Продажа' THEN
		-SUM([Количество])
		else
			SUM([Количество])
			end as [Количество] 
      ,SUM([Закупка]) as [Закупка]
      ,SUM([Таможня]) as [Таможня]
      ,SUM([ЕАЭС]) as [ЕАЭС]
      ,SUM([Доставка]) as [Доставка]
      ,SUM([НДС]) as [НДС]
      ,SUM([Сборка]) as [Сборка]
 
  FROM [mag_pbi].[pbi].[СебестоимостьДо2022]
 -- where [artic_id] = '25c0d4a5-00dc-11e8-80f7-0cc47a052dfd' 
  group by
  [Вид операции]
	,[artic_id]	) as tabMain
	GROUP BY 
		[artic_id]) tabItog
--WHERE YEAR([Период]) < 2022 
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'

	
END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить себестоимость до 2022]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость до 2022] 
	-- Add the parameters for the stored procedure here
	
AS
BEGIN

		DELETE FROM [pbi].[СебестоимостьДо2022]
		 WHERE 1=1

		INSERT INTO mag_pbi.pbi.[СебестоимостьДо2022] ([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id],
		[artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня], [Доставка] ,[Сборка],  [НДС] ,[Учетная стоимость] ,[Учетная стоимость USD2+2] ,[Учетная цена] 
       ,[Учетная цена USD2+2]
		--, [CodeUT]
		/*[Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС] */)
		

SELECT --TOP (5000) 
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
	[Период]
	,[Статья]
	,[Вид операции]
	,[Хоз операция]
	,[тип документа]
	,[Номер документа]
	,[Номер заказа]
	,[Валюта документа]
	,[Ценовая группа]
	,[1c_document_id]
	,[Организация]
	,[Партнер]
	,[PartnerId]
	,[Контрагент]
	,[Менеджер]
	,[1c_id]
	,[artic_id]
	,[Курс usd]
	,[Курс usd2]
	,[Количество]
	,[Сумма] 
	,[СуммаБезНДС] 
	,[СуммаРучнойСкидки]
	,[СуммаАвтоСкидки]
	,[Закупка]
	,[Закупка, usd2]
	,[Таможня]
	--,[ЕАЭС]
	--,[Маркетинг] 
	,[Доставка]
	,[Сборка]
	--, [ЗатратыМП]
	--,[CodeUT]
	, [НДС]
	,[Учетная стоимость]
	,[Учетная стоимость USD2+2]
	,[Учетная цена]
	,[Учетная цена USD2+2]
    
FROM (
SELECT -- TOP (1000) 
	[id]
      ,[Период]
      ,[Статья]
      ,[Вид операции]
      ,[Хоз операция]
      ,[Организация]
      ,[Партнер]
      ,[PartnerId]
      ,[Контрагент]
      ,[Менеджер]
      ,[Тип документа]
      ,[Номер документа]
      ,[Валюта документа]
      ,[Ценовая группа]
      ,[1c_document_id]
      ,[1c_id]
      ,[artic_id]
      ,[Количество]
      ,[Сумма]
      ,[СуммаБезНДС]
      ,[СуммаРучнойСкидки]
      ,[СуммаАвтоСкидки]
      ,[Закупка]
      ,[Закупка, usd2]
      ,[Курс usd2]
      ,[Курс usd]
      ,[Таможня]
      ,[Учетная цена]
      ,[Учетная цена USD2+2]
      ,[Учетная стоимость]
      ,[Учетная стоимость USD2+2]
      ,[Заказ закрыт]
      ,[Номер заказа]
      ,[Доставка]
      ,[НДС]
      ,[Сборка]
      ,[PriceListPrice]
  FROM [mag_pbi].[pbi].[Себестоимость+СебестоимостьПродаж]



) tabItog
WHERE YEAR([Период]) < 2022 
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'

	
END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить себестоимость закупкой]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость закупкой] 
	@dt datetime2 = '2015-01-01'
AS
BEGIN
	/*r._RecorderTRef:
	0x000001A1 Заявление о ввозе товаров из ЕАЭС
	0x000001E3 ПТУ
	0x00000189 Возврат товаров поставщику
	0x000001D5 Передача товаров
	0x000001B0 Корректировка приобретения
	0x0000020D Таможенная декларация на импорт

	закупка: (0x000001E3, 0x00000189,0x000001D5, 0x000001B0)
	ЕАЭС: 0x000001A1
	Таможня: 0x0000020D
	*/
	/*
		0x80CD002590EC174111E581505088A8D5 USD
		0x80D40CC47A052DFD11E6B6DD1820D178 Eur
		0x80E90CC47A052DFD11E7145927CEFC24 Cny
		0xAE9DB496910DCFD611E94F10743DE3FF USD2
		0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
	*/
		DELETE FROM mag_pbi.pbi.[Себестоимость] WHERE [Период]>@dt

		DBCC CHECKIDENT ('[pbi].[Себестоимость]', RESEED, 0);

		INSERT INTO mag_pbi.pbi.[Себестоимость] ([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id],
		[artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Сборка], [ЗатратыМП], [НДС]
		--, [CodeUT]
		/*[Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС] */)
		

SELECT --TOP (5000) 
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
	[Период]
	,[Статья]
	,[Вид операции]
	,[Хоз операция]
	,[тип документа]
	,[Номер документа]
	,[Номер заказа]
	,[Валюта документа]
	,[Ценовая группа]
	,[1c_document_id]
	,[Организация]
	,[Партнер]
	,[PartnerId]
	,[Контрагент]
	,[Менеджер]
	,[1c_id]
	,[artic_id]
	,[Курс usd]
	,[Курс usd2]
	,[Количество]
	,[Сумма] 
	,[СуммаБезНДС] 
	,[СуммаРучнойСкидки]
	,[СуммаАвтоСкидки]
	, CASE WHEN YEAR([Период]) <= 2021 and  ([Партнер] = 'КИТАЙ' or [Партнер] = 'Luca-S')   and [Валюта документа] <> 'руб.' Then
		[Закупка] * 1.42
	ELSE 
		[Закупка]
	END as [Закупка]
	, CASE WHEN YEAR([Период]) <= 2021 and  ([Партнер] = 'КИТАЙ' or [Партнер] = 'Luca-S')   and [Валюта документа] <> 'руб.' Then
		[Закупка, usd2] * 1.42
	ELSE 
		[Закупка, usd2]
	END as [Закупка, usd2]
	,[Таможня]
	,[ЕАЭС]
	--,[Маркетинг] 
	,[Доставка]
	,[Сборка]
	, [ЗатратыМП]
	--,[CodeUT]
	, [НДС]

FROM (

select  --top (1)
			DATEADD(year, -2000, _Period) as [Период]
			, case 
					WHEN  r._RecorderTRef=0x000001A1 or r._RecorderTRef=0x0000020D THEN 'НДС'
					--WHEN r._RecorderTRef=0x000001A1 THEN 'ЕАЭС'
					--WHEN r._RecorderTRef=0x0000020D THEN 'Таможня'
					ELSE 'Закупка' 
				END
				as [Статья]
			, 'Закупка' as [Вид операции]	
			, h.value as [Хоз операция]
			, case r._RecorderTRef 
					WHEN 0x000001A1 then 'Заявление о ввозе товаров из ЕАЭС'
					WHEN 0x00000189 then 'Возврат товаров поставщику'
					WHEN 0x000001E3 then 'ПТУ'
					WHEN 0x000001D5 then 'Передача товаров'
					WHEN 0x000001B0 then 'Корректировка 	 '
					WHEN 0x0000020D then 'Таможенная декларация на импорт'
					ELSE 'Неизвестный тип'
				END as [тип документа]
			, '-' as [Номер документа]
			, '-' as [Номер заказа]
			, val._Description as [Валюта документа]
			,CASE 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
				WHEN r._RecorderTRef = 0x0000020D THEN 'Руб'
				ELSE 'Неопределено'
				END as [Ценовая группа]
			, r._RecorderRRef as [1c_document_id]
			, (SELECT _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = r._Fld16346RRef ) as [Организация]
			, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = r.[_Fld16353RRef]) as [Партнер]
			--, r.[_Fld16353RRef] as PartnerId
			, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),5,12) ))as PartnerId
			, (SELECT _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = r._Fld16354_RRRef) as [Контрагент]
			, (SELECT _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = [_Fld16348RRef]) as [Менеджер]

			,  analitikaUchetaNomenklaturi.[_Fld20498RRef]	 as [1c_id]
			, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),5,12))) as [artic_id]
			,CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
					THEN
						case [_Fld16345RRef] 
						when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16361]
						ELSE [_Fld16361]  END
					--WHEN r._RecorderTRef = 0x0000020D  THEN customDeclaration._Fld8943
					WHEN r._RecorderTRef = 0x0000020D  THEN 0
					--WHEN r._RecorderTRef=0x000001A1 THEN docEAS.[_Fld4052]  
					WHEN r._RecorderTRef=0x000001A1 THEN 0
					ELSE 0 END
				as [Количество]	
			, [_Fld16362] / 1000  as [Сумма]
			, [_Fld16363] / 1000  as [СуммаБезНДС] 
			,0 as [СуммаРучнойСкидки]
			,0 as [СуммаАвтоСкидки]
			, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
					THEN 
						case [_Fld16345RRef] 
							when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16362] / 1000
							ELSE [_Fld16362] / 1000 END
					ELSE 0 END
				AS [Закупка]
			, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка поле "сумма в валюте документа"
					THEN 
						case [_Fld16345RRef] 
							when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN  -[_Fld16373] / 1000
							ELSE [_Fld16373] / 1000 END
					ELSE 0 END as [Закупка, usd2]
			 , (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				--WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, r._Period) 
				ORDER BY _Period desc ) as  [Курс usd]
			, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
				--WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, r._Period) 
				ORDER BY _Period desc ) as  [Курс usd2]
			/*, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000 
				ELSE 0 END
				as [Таможня]
			, CASE WHEN r._RecorderTRef=0x000001A1 THEN [_Fld16369] / 1000 
				ELSE 0 END
				as [ЕАЭС] */
				, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000 END as [Таможня]
				, 0 as [ЕАЭС]
				, 0 as [Маркетинг] -- маркетинг
			    , 0 as [Доставка] -- доставка
				, 0 as [Сборка]-- Сборка 
				, 0 as [ЗатратыМП] -- Затраты МП
				,CASE WHEN LEFT(n._Code, 2) = '00'  -- только для вида операция закупка
					THEN '9' + CONVERT(nvarchar(15), TRIM('-' FROM TRIM (  '00'  FROM n._Code))) 
						ELSE '8' + TRIM ( 'УТ-'  FROM n._Code)  
					 END
				as [CodeUT]
				, CASE WHEN r._RecorderTRef=0x000001A1 THEN ([_Fld16362] - [_Fld16363]) / 1000 
				WHEN r._RecorderTRef=0x0000020D THEN ([_Fld16362] - [_Fld16363]) / 1000
				ELSE 0 END
				as [НДС]
				--,RIGHT(n._Code, LEN(n._Code) - DATALENGTH(CONVERT(VARCHAR(100),'УТ-'))) as [CodeUT]
	
		from
			mag_2019.dbo._AccumRg16344 r-- Регистр накопления Закупки
				LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
					on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef] 
				left join MAG_2019.dbo._Reference188X1 as N
					on analitikaUchetaNomenklaturi.[_Fld20498RRef]	 = N._IDRRef
				LEFT JOIN [mag_reports].[dbo].[enums] h
					ON h._IDRref = r._Fld16345RRef
				LEFT JOIN MAG_2019.dbo._reference50 val 
					ON val._IDRRef = r._Fld16372RRef
				LEFT JOIN [MAG_2019].[dbo].[_Document525_VT8936] as customDeclaration
					ON customDeclaration.[_Document525_IDRRef] = [r]._RecorderRRef 
					and analitikaUchetaNomenklaturi.[_Fld20498RRef] = customDeclaration._Fld8939RRef 
				LEFT JOIN [MAG_2019].[dbo].[_Document417_VT4034] as docEAS
					ON docEAS.[_Document417_IDRRef] = [r]._RecorderRRef 
					and [_Fld16349RRef] = docEAS.[_Fld4037RRef] 
		-- WHERE DATEADD(year, -2000, _Period) > @dt

UNION ALL
	
SELECT -- top (1000) 
		DATEADD(year, -2000, date) -- период 
       ,SR  -- Статья расходов 
	   , ВидОперации -- Вид операции
	   , '' -- хоз операция 
	   , typeReg -- Тип документа 
	   , НомерДокумента -- Номер документа 
	   , [Номер заказа] -- Номер заказа клиента для РТУ
	   , val._Description  -- Валюта документа 
	   , CASE 
				WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
				WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
				ELSE 'Неопределено'
				END -- Ценовая группа
	   , Регистратор -- Ссылка на документ 
	   , refOrganizaciya.[_Description] -- Организация 
	   , (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = Партнер)  -- Партнер
	  -- , [Партнер] as PartnerId
	   , LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), [Партнер], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),5,12) ))as PartnerId
	   , (SELECT _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = Контрагент)  -- Контрагент
	   , (SELECT _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = Менеджер)  -- Менеджер
	   , onec_id   -- 1с id 
	   , LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), onec_id, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),5,12))) -- arctic id
	   , kolvo -- количество
	   , [Сумма] / 1000
	   , [СуммаБезНДС]  / 1000
	   , [СуммаРучнойСкидки] / 1000
	   , [СуммаАвтоСкидки] / 1000
	   , [Закупка] -- закупка
	   , [Закупка, usd2] -- закупка usd2
	   , (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date) 
				ORDER BY _Period desc ) as  [Курс usd]
		, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date) 
				ORDER BY _Period desc ) as  [Курс usd2]
	   , 0 -- Таможня
	   , 0 --ЕАЭС
	   , marketing / 1000 -- маркетинг
	   , delivery / 1000 -- доставка
	   , [Сборка] / 1000 as [Сборка]-- Сборка 
	   , [ЗатратыМП] / 1000  -- Затраты МП
	   ,CASE WHEN LEFT(refNomenclatura._Code, 2) = '00'  -- только для вида операция закупка
					THEN '9' + CONVERT(nvarchar(15), TRIM('-' FROM TRIM (  '00'  FROM refNomenclatura._Code))) 
						ELSE '8' + TRIM ( 'УТ-'  FROM refNomenclatura._Code)  
					 END
				as [CodeUT]
		, 0 -- НДС
	  -- ,RIGHT(refNomenclatura._Code, LEN(refNomenclatura._Code) - DATALENGTH(CONVERT(VARCHAR(100),'УТ-'))) as [CodeUT]
	

 FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ДОСТАВКА \\\\\\\\\\\\\\\\
SELECT --TOP (1) 
		refPTU.[_Date_Time] as date -- дата
	  , 'Доставка контейнера ВЭД' as SR
	   ,'Закупка' as ВидОперации
	  ,[_Fld33630RRef] as Регистратор -- регистратор
	   , '-' as НомерДокумента -- Номер документа
	   , '-' [Номер заказа]
	  ,'ПТУ' as typeReg  -- типРегистратора 
	  ,refPTU.[_Fld7121RRef] as Организация -- Организация 
	  ,refPTU.[_Fld7060RRef] as Партнер -- партнер
	  ,refPTU.[_Fld7064RRef] as Контрагент -- контрагент
	  ,refPTU.[_Fld7067RRef] as Менеджер -- Менеджер
      ,[_Fld33631RRef] as onec_id -- Номенклатура
	  --,refPtuNomen.[_Fld7134] as kolvo				-- Количество
	  , 0 as kolvo    -- Количество
	  --, [_Fld33633] as [Сумма]
	  , 0 as [Сумма]
	  , 0 as [СуммаБезНДС]
	  , 0 as [СуммаРучнойСкидки]
	  , 0 as [СуммаАвтоСкидки]
	  , 0 as [Закупка]
	  , 0 as [Закупка, usd2] 
	  ,refPTU.[_Fld7059RRef] as ВалютаДокумента			-- Валюта документа
      ,[_Fld33632RRef]  -- ППУ
	  ,0 as marketing   -- маркетинг
      ,[_Fld33633]  as delivery -- доставка
	   ,0 as [Сборка]-- Сборка 
	   , 0 as [ЗатратыМП]-- Затраты мп
     -- ,[_Fld33634_RRRef] -- статья расходов
  
  FROM [MAG_2019].[dbo].[_InfoRg33629]
  LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
	ON refPTU.[_IDRRef] = [_Fld33630RRef]
  LEFT JOIN [MAG_2019].[dbo].[_Document483_VT7128X1] as refPtuNomen
	ON refPtuNomen.[_Document483_IDRRef] = refPTU.[_IDRRef]
	AND refPtuNomen.[_Fld7130RRef] = [_Fld33631RRef]

where [_Fld33634_RRRef] = 0x997EB49691D57EFD11ECE1AC556F9FF0

UNION ALL
-- \\\\\\\\\\\\ МАРКЕТИНГ \\\\\\\\\\\\\\\
SELECT  --TOP (1) 
	   refPTU.[_Date_Time] 
	  , 'Маркетинг'
	  ,'Закупка'
	  ,[_Fld33630RRef]  -- регистратор
	  , '-' -- Номер документа
	  , '-' -- Номер заказа
	  ,'ПТУ' 
	  ,refPTU.[_Fld7121RRef] -- Организация
	  ,refPTU.[_Fld7060RRef] as Партнер -- партнер
	  ,refPTU.[_Fld7064RRef] as Контрагент -- контрагент
	  ,refPTU.[_Fld7067RRef] as Менеджер -- Менеджер
      ,[_Fld33631RRef]  -- Номенклатура
	  , 0				-- Количество 
	  , 0 as [Сумма]
	  , 0 as [СуммаБезНДС]
	  , 0 as [СуммаРучнойСкидки]
	  , 0 as [СуммаАвтоСкидки]
	  , 0 as [Закупка]
	  , 0 as [Закупка, usd2] 
	  , refPTU.[_Fld7059RRef]				-- Валюта документа
      ,[_Fld33632RRef]  -- ППУ 
	  ,[_Fld33633]	-- маркетинг
      , 0				-- доставка
	   ,0 -- Сборка 
	   , 0 -- Затраты мп
      --,[_Fld33634_RRRef] -- статья расходов

  FROM [MAG_2019].[dbo].[_InfoRg33629]
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = [_Fld33630RRef]

where [_Fld33634_RRRef] = 0x9981B49691D57EFD11EDCE203CED30C4  


UNION ALL
-- ///////////////// ПРОДАЖИ ////////////////
SELECT  --TOP (1)
	  [_Period]
      ,'Реализация'
	  ,'Продажа'
      ,[_RecorderRRef] -- регистратор
	  ,docRTU.[_Number] -- Номер документа
	  , orders.[_Number]  -- Номер заказа
	  ,case [_RecorderTRef]
					WHEN 0x000001F4 then 'РТУ'
					
					ELSE 'Неизвестный тип'
				END 
	 , AnalitikaUchetaPartner.[_Fld20514RRef] -- Организация 
	 , AnalitikaUchetaPartner.[_Fld20513RRef] -- партнер
	 , AnalitikaUchetaPartner.[_Fld20515_RRRef] -- контрагент
	 , [_Fld15559RRef] as Менеджер -- Менеджер
	 , analitikaUchetaNomenklaturi.[_Fld20498RRef] -- Номенклатура
	 , [_Fld15567]   -- количество
	 , [_Fld15568] as [Сумма]
	 , 0 as [СуммаБезНДС]
	 , [_Fld15595] as [СуммаРучнойСкидки]
	 , [_Fld15596] as [СуммаАвтоСкидки]
	 , 0 as [Закупка]
	  , 0 as [Закупка, usd2] 
	 ,CASE
	 WHEN [_Fld15601RRef] IS NULL THEN 'руб.' -- Валюта документа
	 ELSE [_Fld15601RRef]
	 END AS [Валюта документа]
	 , '' -- ППУ
	 ,0 -- маректинг
	 ,0 -- Доставка 
	 ,0 -- Сборка 
	 , 0 -- Затраты мп
    
    
  FROM [MAG_2019].[dbo].[_AccumRg15547]
  LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
	on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld15548RRef] 
  LEFT JOIN [MAG_2019].[dbo].[_Reference162] as AnalitikaUchetaPartner
	on AnalitikaUchetaPartner.[_IDRRef] = [_Fld15550RRef]	
  LEFT JOIN [MAG_2019].[dbo].[_Document500X1] as docRTU
	on docRTU.[_IDRRef] = [_RecorderRRef]
  LEFT JOIN (SELECT 
			[_Document500_IDRRef] as _IDRRef  
			,MIN([_Fld7990_RRRef]) as orderRTU     
		  FROM [MAG_2019].[dbo].[_Document500_VT7967X1]
		  GROUP BY 
			[_Document500_IDRRef]) as ordersRTU
	ON ordersRTU._IDRRef = [_RecorderRRef]
  LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as orders
	ON orders.[_IDRRef] = ordersRTU.orderRTU

UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА  РАСХОД  БЕЗ ЗАТРАТ НА СБОРКУ\\\\\\\\\\\\\\\\
SELECT TOP (1000)
	 znS.[_Date_Time] as per
	 , 'Сборка'
	 , 'Продажа'
     , TabGoods.[_Document407_IDRRef] -- регистратор
	 , '-' -- Номер документа
	 , '-' -- Номер заказа
	 ,'Заказ на сборку'	
	 , ZnS.[_Fld3348RRef] -- Организация 
	 , Kontr.[_Fld20612RRef] -- партнер
	 , ZnS.[_Fld27876RRef] -- контрагент
     , ZnS.[_Fld28230RRef]  -- Менеджер
	 , [_Fld3381RRef] as nom -- Номенклатура
	 , [_Fld3385] as kolvo  -- Количество
	 --, tabset.[_Fld28063]
	 , 0 as [Сумма] 
	 , 0 as [СуммаБезНДС]
	 , 0 as [СуммаРучнойСкидки]
	 , 0 as [СуммаАвтоСкидки]
	 , (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist] 
				WHERE [Вид цены] = 'Учетная цена (руб)' 
					AND  [Дата] <= znS.[_Date_Time] 
					and [_Fld3381RRef] = [1c_id]
				ORDER BY Дата desc ) / 1000 * [_Fld3385] * -1   as [Закупка]
	 , 0 as [Закупка, usd2] 
	 , currency._IDRRef -- Валюта документа
	 , '' -- ППУ
	 , 0 -- маректинг
	 , 0 -- Доставка 
	 , 0  -- сборка 
	 , 0 -- Затраты мп

  FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
  INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
	  on ZnS._IDRRef = [_Document407_IDRRef]
	  and _Posted = 0x01 -- проведен
	  --and [_Number] = 'АНУТ-010680' -- номер дока для проверки
	  and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
  LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
		 ON Kontr.[_IDRRef]  = ZnS.[_Fld27876RRef]

 
  LEFT JOIN (SELECT TOP (1) [_IDRRef]
	  FROM [MAG_2019].[dbo].[_Reference50]
	  where _code = '643') as currency
		 on 1 = 1




UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА  ПРИХОД + ЗАТРАТЫ НА СБОРКУ \\\\\\\\\\\\\\\\
SELECT TOP (333)
	  znS.[_Date_Time]
	 , 'Сборка'
	 , 'Закупка'
     , TabGoods.[_Document407_IDRRef] -- регистратор
	 , '-' -- Номер документа
	 , '-' -- Номер заказа
	 ,'Заказ на сборку'	
	 , ZnS.[_Fld3348RRef] -- Организация 
	 , Kontr.[_Fld20612RRef] -- партнер
	 , ZnS.[_Fld27876RRef] -- контрагент
     , ZnS.[_Fld28230RRef]  -- Менеджер
	 , tabSet.[_Fld28059RRef] -- Номенклатура
	 --, [_Fld3385]  -- Количество
	 , tabset.[_Fld28063]
	 , 0 as [Сумма] 
	 , 0 as [СуммаБезНДС]
	 , 0 as [СуммаРучнойСкидки]
	 , 0 as [СуммаАвтоСкидки]
	 --, CASE WHEN tabSetPrices.[SumSebes] IS NULL THEN 0
	 -- ELSE tabSetPrices.[SumSebes] / 1000 * tabset.[_Fld28063]
	 -- end as [Закупка]
	   ,(SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist] 
				WHERE [Вид цены] = 'Учетная цена (руб)' 
					AND  [дата] <= znS.[_Date_Time] 
					and [_Fld3381RRef] = [1c_id]
				ORDER BY Дата desc )  / 1000 * [_Fld3385]   as  [SumSebes] 
	 , 0 as [Закупка, usd2] 
	 , currency._IDRRef -- Валюта документа
	 , '' -- ППУ
	 , 0 -- маректинг
	 , 0 -- Доставка 
	 , TabZatratiSborka.sborka as sborka -- сборка 
	 , 0 -- Затраты мп

  FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
  INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
	  on ZnS._IDRRef = [_Document407_IDRRef]
	  and _Posted = 0x01 -- проведен
	 -- and [_Number] = 'АНУТ-010680' -- номер дока для проверки
	  and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
  LEFT JOIN [MAG_2019].[dbo]._Document407_VT28057 as tabSet -- тч комплекты, тут связь было-стало
	  on tabSet.[_Fld28070] = [_Fld28055]
	  and tabSet._Document407_IDRRef = TabGoods._Document407_IDRRef
  
  LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
		 ON Kontr.[_IDRRef]  = ZnS.[_Fld27876RRef]
  LEFT JOIN (SELECT TOP (1) [_IDRRef]
	  FROM [MAG_2019].[dbo].[_Reference50]
	  where _code = '643') as currency
		 on 1 = 1
LEFT JOIN (SELECT  --TOP (1000)	
      [_RecorderRRef] -- регистратор	
	 , [_Fld33653RRef] -- Номенклатура
	 , SUM([_Fld33658]) / 1000 as sborka -- сборка 
	 FROM [MAG_2019].[dbo].[_AccumRg33652] -- рн работы	
	where [_RecorderTRef] = 0x00000197

	group by 		
		 [_RecorderRRef]
		, [_Fld33653RRef] -- Номенклатура
		) as TabZatratiSborka
		ON TabZatratiSborka.[_RecorderRRef] = TabGoods.[_Document407_IDRRef]
		and TabZatratiSborka.[_Fld33653RRef] = tabSet.[_Fld28059RRef]   

  where [_Fld3392] = 0x00 -- отменено ложь




UNION ALL
-- \\\\\\\\\\\\\\\\\\\\ ЗАТРАТЫ МП \\\\\\\\\\\\\\\
SELECT -- TOP (1000) 
		[_Period]
      ,'Затраты МП'
	  ,'Закупка'
      ,[_RecorderRRef] -- Регистратор отчет комиссионера 
	  , '-' -- Номер документа
	   , '-' -- Номер заказа
	  , 'Отчет комиссионера'  
	  , otchetKommissionera.[_Fld5484RRef] -- Организация 
	  , otchetKommissionera.[_Fld5485RRef] -- партнер
	  , otchetKommissionera.[_Fld5486RRef] -- контрагент
      , otchetKommissionera.[_Fld5492RRef]  -- Менеджер
      ,[_Fld33391RRef] -- номенклатура 
	  --,otchetKommissioneraTabTovari.[_Fld5531] -- Количество
	  ,0 -- Количество
	  ,0 as [Сумма]
	  --,[_Fld33394] as [Сумма]
	  , 0 as [СуммаБезНДС]
	  , 0 as [СуммаРучнойСкидки]
	  , 0 as [СуммаАвтоСкидки]
	  , 0 as [Закупка]
	  , 0 as [Закупка, usd2] 
	  , currency._IDRRef -- Валюта документа
	  , '' -- ППУ
	  , 0 -- маректинг
	  , 0 -- Доставка 
	  , 0 -- сборка 
      , [_Fld33394] -- Затраты МП
    
  FROM [MAG_2019].[dbo].[_AccumRg33390]
  LEFT JOIN [MAG_2019].[dbo].[_Document458_VT5524] as otchetKommissioneraTabTovari
  on otchetKommissioneraTabTovari.[_Fld5526RRef] = [_Fld33391RRef]
  AND otchetKommissioneraTabTovari.[_Document458_IDRRef] = [_RecorderRRef] 
  LEFT JOIN [MAG_2019].[dbo].[_Document458] as otchetKommissionera
  ON otchetKommissionera.[_IDRRef] = otchetKommissioneraTabTovari.[_Document458_IDRRef]
   LEFT JOIN (SELECT TOP (1) [_IDRRef]
	  FROM [MAG_2019].[dbo].[_Reference50]
	  where _code = '643') as currency
	  on 1 = 1

) as tabMain
LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura 
ON refNomenclatura.[_IDRRef] = tabMain.onec_id
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = tabMain.Регистратор
LEFT JOIN [MAG_2019].[dbo].[_Document484] as refPPU
ON refPPU.[_IDRRef] = tabMain.Регистратор
LEFT JOIN [MAG_2019].[dbo].[_Reference198X1] as refOrganizaciya
on refOrganizaciya._IDRRef = tabMain.Организация
LEFT JOIN MAG_2019.dbo._reference50 val 
ON val._IDRRef = tabMain.ВалютаДокумента



) tabItog
WHERE [Период] > @dt
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'

	
END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить себестоимость комплектами]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость комплектами] 
	-- Add the parameters for the stored procedure here
	@dt datetime2 = '2015-01-01'
AS
BEGIN
	insert into pbi.[Себестоимость]([Период], [Статья], [Вид операции],[Номер документа],[Тип документа], [1c_id], [artic_id], [Количество], [Ценовая группа])
	select 
			k.[Период]
			, 'Закупка' as [Статья]
			, 'Фасовка_Комплекты' as [Вид операции]
			, [Номер документа]
			, 'Заказ на сборку' as [Тип документа]
			, [1c_id]
			, [artic_id]
			, [Количество]
			, [Ценовая группа]

	FROM pbi.[сборки_комплекты] k
	WHERE 
		[Период] > @dt
END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить себестоимость комплектующими]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [sebest].[Заполнить себестоимость комплектующими] 
	-- Add the parameters for the stored procedure here
	@dt datetime2 = '2015-01-01'
AS
BEGIN
	insert into pbi.[Себестоимость]([Период], [Статья], [Вид операции],[Номер документа],[Тип документа], [1c_id], [artic_id], [Количество], [Ценовая группа])
	select 
			k.[Период]
			, 'Закупка' as [Статья]
			, 'Фасовка_Комплектующие' as [Вид операции]
			, [Номер документа]
			, 'Заказ на сборку' as [Тип документа]
			, [1c_id]
			, [artic_id]
			, [Количество]
			, [Ценовая группа]

	FROM pbi.[сборки_комплектующие] k
	WHERE 
		[Период] > @dt
END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить себестоимость курсовой разницей]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость курсовой разницей] 
	-- Add the parameters for the stored procedure here
AS
BEGIN
	
	insert into pbi.[Себестоимость] ([Период], [Статья], [Вид операции], [1c_id], [artic_id], [Количество], [Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС])
	SELECT --TOP (1000) 
		[Период]
		, 'Курсовая разница' as [Статья]
		,[Вид операции]
		,[1c_id]
		,[artic_id]
		, 0 as [Количество]
		, isnull([Валютная сумма] * 
			(SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= [Период] 
				ORDER BY _Period desc) - [Сумма], 0)
		as [Сумма]
		, 0 as [Сумма Без НДС]
		, 0 as [Валютная сумма]
		, 0 as [Валютная сумма Без НДС]
	FROM 
		mag_pbi.pbi.[Себестоимость]

	where 
		[Вид операции] = 'Продажа'
		and [Статья] = 'Закупка'
		and [Валютная сумма] <> 0
		and isnull([Валютная сумма] * 
			(SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= [Период] 
				ORDER BY _Period desc) - [Сумма], 0) <> 0

END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить себестоимость начальным остатком]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость начальным остатком] 
	-- Add the parameters for the stored procedure here
	@dt datetime2 = '2015-01-01'
AS
BEGIN
			/*
			0x80CD002590EC174111E581505088A8D5 USD
			0x80D40CC47A052DFD11E6B6DD1820D178 Eur
			0x80E90CC47A052DFD11E7145927CEFC24 Cny
			0xAE9DB496910DCFD611E94F10743DE3FF USD2
			0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
			*/
	insert into pbi.[Себестоимость]([Период], [Статья], [Вид операции],[Хоз операция],[Организация],[Тип документа],[Номер документа],[Валюта документа],[Ценовая группа],[1c_document_id], [1c_id], [artic_id], [Количество], [Закупка], [Закупка, usd2], [Курс usd], [Курс usd2]/*, [Курс usd2], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС] */)
	
	SELECT 
		tabItog.[Период],
		tabItog.[Статья],
		tabItog.[Вид операции],
		tabItog.[Хоз операция],
		tabItog.[Организация],
		tabItog.[Тип документа],
		tabItog.[Номер документа],
		tabItog.[Валюта документа],
		tabItog.[Ценовая группа],
		tabItog.[1c_document_id],
		tabItog.[1c_id],
		tabItog.[artic_id],
		tabItog.[Количество],
		tabItog.[Закупка],
		tabItog.[Закупка] / tabItog.[Курс usd2]	as [Закупка, usd2],
		tabItog.[Курс usd],
		tabItog.[Курс usd2]
	FROM   (select
		DATEADD(year, -2000, _Date_Time) as [Период]
		, 'Ввод начальных остатков' as [Статья]
		, 'Закупка' as [Вид операции]
		, 'Ввод остатков' as [Хоз операция]
		, (SELECT _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = d._Fld1778RRef ) as [Организация]
		, 'Ввод остатков' as [Тип документа]
		, D._Number as [Номер документа]
		, 'руб.' as [Валюта документа]
		, 'Руб' as [Ценовая группа]
		, D._IDRRef as [1c_document_id]
		, _Fld1811RRef as [1c_id]
		, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2),5,12))) as [artic_id]
		, _Fld1816 as [Количество]
		, _Fld1816 * isnull((SELECT TOP (1) [Цена] / 1000
			FROM [mag_reports].[sales].[pricelist] pl
			where [1c_id] =  _Fld1811RRef
				and [Вид цены] = 'Учетная цена (руб)'
				--and  pl._Period <= _Date_Time 
			ORDER BY _Period), 0) as [Закупка]
			, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, _Date_Time) 
				ORDER BY _Period desc ) as  [Курс usd]
			 , (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
				WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
					AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, _Date_Time) 
				ORDER BY _Period desc ) as  [Курс usd2]

	from
		mag_2019.dbo._Document385 as D-- Документ Ввод остатков
			inner join mag_2019.dbo._Document385_VT1809 as Tov-- Документ Ввод остатков.Товары
				on D._IDRRef = Tov._Document385_IDRRef
			inner join MAG_2019.dbo._Reference188X1 as N
				on Tov._Fld1811RRef = N._IDRRef
	where
		D._Posted = 0x01
			and d._Fld1777RRef = 0x8EADCC7BFE3B43C24D37E47DE504409F -- Тип операции = Собственные товары
			AND DATEADD(year, -2000, d._Date_Time) > '2012') as tabItog
END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить себестоимость продажей]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость продажей] 
	-- Add the parameters for the stored procedure here
	@dt datetime2 = '2015-01-01'
AS
BEGIN
	
		/* Вставить все продажи в таблицу себестоимости */
		/* UPDATE для каждой строки в отдельной процедуре */


		insert into pbi.[Себестоимость]([Период], [Статья], [Вид операции],[Организация],[Партнер],[Менеджер],[Номер документа],[Тип документа], [1c_id], [artic_id]
			, [Количество],[Сумма],[СуммаБезНДС],[СуммаРучнойСкидки],[СуммаАвтоСкидки],[Номер заказа],[Заказ закрыт], [Ценовая группа]
			)
		select --top 100
			DATEADD(year, -2000, r._Period) as [Период]
			, 'Закупка' as [Статья]
			, 'Продажа' as [Вид операции]
			, (SELECT _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = anp._Fld20514RRef ) as [Организация]
			, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = anp._Fld20513RRef) as [Партнер]
			, (SELECT _description FROM [mag_2019].[dbo].[_Reference228X1] WHERE _IDRRef = z._Fld3138RRef) as [Менеджер]
			, CASE _RecorderTRef 
					WHEN 0x000001F4 THEN (SELECT _Number FROM MAG_2019.dbo._Document500X1 d WHERE d._IDRRef = r._RecorderRRef) 
					WHEN 0x00000188 THEN (SELECT _Number FROM MAG_2019.dbo._Document392 d WHERE d._IDRRef = r._RecorderRRef) 
					WHEN 0x000001B1 THEN (SELECT _Number FROM MAG_2019.dbo._Document433 d WHERE d._IDRRef = r._RecorderRRef) 
					WHEN 0x000001CA THEN (SELECT _Number FROM MAG_2019.dbo._Document458 d WHERE d._IDRRef = r._RecorderRRef) 
					WHEN 0x000001E4 THEN (SELECT _Number FROM MAG_2019.dbo._Document484 d WHERE d._IDRRef = r._RecorderRRef) 
					WHEN 0x000001D5 THEN (SELECT _Number FROM MAG_2019.dbo._Document469 d WHERE d._IDRRef = r._RecorderRRef) 
					WHEN 0x00000178 THEN (SELECT _Number FROM MAG_2019.dbo._Document376 d WHERE d._IDRRef = r._RecorderRRef) 
				END as [Номер документа]
			, CASE _RecorderTRef 
					WHEN 0x000001F4 THEN 'Реализация'
					WHEN 0x00000188 THEN 'Возврат'
					WHEN 0x000001B1 THEN 'Корректировка реализации'
					WHEN 0x000001CA THEN 'Отчет комиссионера'
					WHEN 0x000001E4 THEN 'Приобретение Услуг и прочих активов'
					WHEN 0x000001D5 THEN 'Передача Товаров между организаций'
					WHEN 0x00000178 THEN 'Акт выполненных работ'
				END as [Тип документа]
			, n._IDRRef as [1c_id]
			, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), n._IDRRef, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), n._IDRRef, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), n._IDRRef, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), n._IDRRef, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), n._IDRRef, 2),5,12))) as [artic_id]
			, -1 * r._Fld15567 as [Количество]
			, r._Fld15568 / 1000 as 'sum'
			, r._Fld15569 / 1000  as 'СуммаБезНДС'
			, r._Fld15595 / 1000  as 'СуммаРучнойСкидки'
			, r._Fld15596 / 1000  as 'СуммаАвтоСкидки'
			, z._Number as [Номер заказа]
			, (SELECT top 1 convert(datetime, DATEADD(year, -2000, l._Period), 104) from [pbi].[ЛогЗаказов] l where l.status = 'Закрыт' and l.zakazNum = z._IDRRef) as [Заказ закрыт] 
			, CASE 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб' 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал' 
				ELSE 'Неопределено'
				END as [Ценовая группа]
		from
			mag_2019.dbo._AccumRg15547 r-- Регистр накопления Выручка и себестоимость продаж
				/*LEFT JOIN [MAG_2019].[dbo]._InfoRg12119 an-- Регистр сведений Аналитика учета номенклатуры
					on r._Fld15548RRef = an._Fld12126RRef
				*/
					
				INNER JOIN [mag_2019].[dbo]._Reference160 an /*ключ аналитики номенклатуры*/ ON r._Fld15548RRef = an._IDRRef
				INNER JOIN [mag_2019].[dbo]._Reference188X1 n /*номенклатура*/ ON n._IDRRef = an._Fld20498RRef

					
				LEFT JOIN [MAG_2019].[dbo].[_Document404X1] z /* заказ клиента */ ON z._IDRRef = r._Fld15549_RRRef
				--LEFT JOIN [mag_2019].[dbo]._Document500X1 rlz /*документ реализации*/ ON r._RecorderRRef = rlz._IDRRef
				INNER JOIN [mag_2019].[dbo]._Reference162 anp /*Ключ аналитики партнера*/ ON r._Fld15550RRef = anp._IDRRef
		where 1=1
			AND DATEADD(year, -2000, r._Period)> @dt
	
END
GO

/****** Object:  StoredProcedure [sebest].[Заполнить СебестоимостьСебестоимостьПродажиРезультат]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить СебестоимостьСебестоимостьПродажиРезультат] 
	

AS
BEGIN
	/*r._RecorderTRef:
	0x000001A1 Заявление о ввозе товаров из ЕАЭС
	0x000001E3 ПТУ
	0x00000189 Возврат товаров поставщику
	0x000001D5 Передача товаров
	0x000001B0 Корректировка приобретения
	0x0000020D Таможенная декларация на импорт

	закупка: (0x000001E3, 0x00000189,0x000001D5, 0x000001B0)
	ЕАЭС: 0x000001A1
	Таможня: 0x0000020D
	*/
	/*
		0x80CD002590EC174111E581505088A8D5 USD
		0x80D40CC47A052DFD11E6B6DD1820D178 Eur
		0x80E90CC47A052DFD11E7145927CEFC24 Cny
		0xAE9DB496910DCFD611E94F10743DE3FF USD2
		0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
	*/
		DELETE FROM mag_pbi.pbi.[СебестоимостьСебестоимостьПродажиРезультат] WHERE 1=1

		INSERT INTO mag_pbi.pbi.[СебестоимостьСебестоимостьПродажиРезультат] ([Период], [Статья], [Вид операции],
		[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
		[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
		[1c_id],
		[artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
		[Закупка],[Закупка, usd2], [Таможня], [Доставка] ,[Сборка],  [НДС], [code], [Учетная цена] ,[Учетная цена USD2+2]
		,[Учетная стоимость] ,[Учетная стоимость USD2+2]
		--, [CodeUT]
		/*[Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС] */)
		

SELECT --TOP (5000) 
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
	[Период]
	,[Статья]
	,[Вид операции]
	,[Хоз операция]
	,[тип документа]
	,[Номер документа]
	,[Номер заказа]
	,[Валюта документа]
	,[Ценовая группа]
	,[1c_document_id]
	,[Организация]
	,[Партнер]
	,[PartnerId]
	,[Контрагент]
	,[Менеджер]
	,[1c_id]
	,[artic_id]
	,[Курс usd]
	,[Курс usd2]
	,[Количество]
	,[Сумма] 
	,[СуммаБезНДС] 
	,[СуммаРучнойСкидки]
	,[СуммаАвтоСкидки]
	,[Закупка]
	,[Закупка, usd2]
	,[Таможня]
	,[Доставка]
	,[Сборка]	
	,[НДС]
	,[code]
	,[Учетная цена]
    ,[Учетная цена USD2+2]
    ,[Учетная стоимость]
    ,[Учетная стоимость USD2+2]

FROM ( 	
SELECT -- TOP (1000)
	[Период]
	,[Статья]
	,[Вид операции]
	,[Хоз операция]
	,[Тип документа]
	,[Номер документа]
	,[Номер заказа]
	,[Валюта документа]
	,[Ценовая группа]
	,[1c_document_id]
	,[Организация]
	,[Партнер]
	,[PartnerId]
	,[Контрагент]
	,[Менеджер]
	,tabMain.[1c_id]
	,tabMain.[artic_id]
	,[Курс usd]
	,[Курс usd2]
	,[Количество]
	,[Сумма]
	,[СуммаБезНДС]
	,[СуммаРучнойСкидки]
	,[СуммаАвтоСкидки]
	,[Закупка]
	,[Закупка, usd2]
	,[Таможня]
	,[Доставка]
	,[Сборка]
	,[НДС]
	, tabNom.[code]
	,[Учетная цена]
    ,[Учетная цена USD2+2]
    ,[Учетная стоимость]
    ,[Учетная стоимость USD2+2]

  FROM [mag_pbi].[pbi].[Себестоимость+СебестоимостьПродажОт2022] as tabMain
  LEFT JOIN [mag_pbi].[pbi].[nomenclature] as tabNom
  on tabNom.[artic_id] = tabMain.[artic_id]


) tabItog
WHERE 1=1
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'

	
END
GO

/****** Object:  StoredProcedure [sebest].[Проставить стоимость комплектов]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Проставить стоимость комплектов] 
		@dt datetime2(0) = '2015'
AS
BEGIN
	UPDATE [pbi].[Себестоимость] SET
		[Закупка] = (
			SELECT -1*SUM(Закупка) 
			FROM [pbi].[Себестоимость] ss
				INNER JOIN [pbi].[Сборки] sb
					ON sb.[Дата документа] = ss.Период AND sb.[Номер документа] = ss.[Номер документа]
			WHERE
				sb.[ИД номенклатура комплекта] = k.[1c_id]
				--0x80C5305A3A00E12B11E584C1000D5AA5 
		),
		[Закупка, usd2] = (
			SELECT -1*SUM([Закупка, usd2]) 
			FROM [pbi].[Себестоимость] ss
				INNER JOIN [pbi].[Сборки] sb
					ON sb.[Дата документа] = ss.Период AND sb.[Номер документа] = ss.[Номер документа]
			WHERE
				sb.[ИД номенклатура комплекта] = k.[1c_id]
				--0x80C5305A3A00E12B11E584C1000D5AA5 
		),
		[Таможня] = (
			SELECT -1*SUM([Таможня]) 
			FROM [pbi].[Себестоимость] ss
				INNER JOIN [pbi].[Сборки] sb
					ON sb.[Дата документа] = ss.Период AND sb.[Номер документа] = ss.[Номер документа]
			WHERE
				sb.[ИД номенклатура комплекта] = k.[1c_id]
				--0x80C5305A3A00E12B11E584C1000D5AA5 
		),
		[ЕАЭС] = (
			SELECT -1*SUM([ЕАЭС]) 
			FROM [pbi].[Себестоимость] ss
				INNER JOIN [pbi].[Сборки] sb
					ON sb.[Дата документа] = ss.Период AND sb.[Номер документа] = ss.[Номер документа]
			WHERE
				sb.[ИД номенклатура комплекта] = k.[1c_id]
				--0x80C5305A3A00E12B11E584C1000D5AA5 
		)

	FROM [pbi].[Себестоимость] k
	WHERE k. [Статья]='Закупка' AND k.[Вид операции] = 'Фасовка_Комплекты'
	AND [Период] > @dt
	
END
GO

/****** Object:  StoredProcedure [sebest].[Расчет себестомисти]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE  [sebest].[Расчет себестомисти] 
	@date datetime2(0) = '2018', 
	@complekty bit = 0 
as
BEGIN
	DECLARE @uid binary(16)
	DECLARE @q numeric(15,3)
	DECLARE @dt datetime2(0)
	DECLARE @id INT
	DECLARE @vid varchar(255)
	DECLARE @cenovaya_gruppa varchar(12)

	DECLARE @zakupka numeric(38,15)
	DECLARE @zakupka_usd2 numeric(38,15)
	DECLARE @kurs_usd2 numeric(15, 3)
	DECLARE @kurs_usd numeric(15, 3)
	DECLARE @kolich numeric(15,3)
	DECLARE @eaes numeric(38,15)
	DECLARE @tamoznia numeric(38,15)

	DECLARE db_cursor CURSOR FOR
		SELECT  
			id
			, s.[1c_id]
			, [количество]
			, [Период]
			, [Вид операции]
			, CASE 
				WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Валютная' 
				--WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Рублевая' 
				ELSE 'Рублевая'
			END as cenovaya_gruppa
			, s.[Курс usd2]
			, s.[Курс usd]
		FROM mag_pbi.pbi.[Себестоимость]  s
			INNER JOIN MAG_2019.dbo._Reference188X1 n--mag_reports.sales.w_nomenclature n
				ON n._IDRRef=s.[1c_id]
		WHERE 1=1
			and [Статья]='Закупка'
			AND ([Вид операции] IN ('Продажа'/*, 'Фасовка_Комплектующие', 'Фасовка_Комплекты'*/))
			AND [Период] > @date
			/*AND ( @complekty=0 AND n._IDRRef not in (SELECT [1c_id] FROM [pbi].[Сборки_комплекты])
					OR
				  @complekty=1 AND n._IDRRef in (SELECT [1c_id] FROM [pbi].[Сборки_комплекты])
				)
				*/
			--and n.[1c_id]=0x80F1305A3A00E12B11E63D0035692388
			--and n.[1c_id]=0xAEC4B496910DCFD611EC421521579D74
			--AND n.code = 'УТ-00039503'
		ORDER BY [Период] ASC


	OPEN db_cursor  
	FETCH NEXT FROM db_cursor INTO @id, @uid, @q, @dt, @vid, @cenovaya_gruppa, @kurs_usd2, @kurs_usd

	WHILE @@FETCH_STATUS = 0  
	BEGIN  
			--IF @vid = 'Продажа' OR @vid = 'Фасовка_Комплектующие' BEGIN
				/* расчет статьи себестоимости Закупка, вид операции Продажа */
				SET @kolich =  ISNULL((SELECT sum([Количество]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND ([Вид операции] IN ('Закупка', 'Продажа'/*, 'Фасовка_Комплектующие', 'Фасовка_Комплекты'*/) ) AND [Период] < @dt ),0)

				IF @cenovaya_gruppa = 'Рублевая' BEGIN
					SET @zakupka = ISNULL((SELECT sum([Закупка]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND ([Вид операции] IN ('Закупка', 'Продажа'/*, 'Фасовка_Комплектующие', 'Фасовка_Комплекты'*/) ) AND [Период] < @dt ),0)
					SET @zakupka = ( -- сумма всего / кол всего * кол
							CASE WHEN @kolich <= 0 THEN 0
								ELSE
									CASE WHEN -@zakupka > @zakupka/@kolich * @q THEN -@zakupka
										ELSE @zakupka/@kolich * @q END
							END
						)
					SET @zakupka_usd2 = @zakupka / @kurs_usd2
				END
				ELSE BEGIN
					SET @zakupka_usd2 = ISNULL((SELECT sum([Закупка, usd2]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND ([Вид операции] IN ('Закупка', 'Продажа'/*, 'Фасовка_Комплектующие', 'Фасовка_Комплекты'*/)) AND [Период] < @dt ),0)
					--select @zakupka_usd2
					SET @zakupka_usd2 = ( -- сумма всего / кол всего * кол
							CASE WHEN @kolich <= 0 THEN 0
								ELSE
									CASE WHEN -@zakupka_usd2 > @zakupka_usd2/@kolich * @q THEN -@zakupka_usd2
										ELSE @zakupka_usd2/@kolich * @q END
							END
						)
					--select @zakupka_usd2
					SET @zakupka = @zakupka_usd2 * @kurs_usd2
					--select @kurs_usd2
				END 
				
				SET @eaes = ISNULL((SELECT sum([ЕАЭС]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND [Вид операции]='ЕАЭС' AND [Период] < @dt ),0)
				SET @tamoznia = ISNULL((SELECT sum([Таможня]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND [Вид операции]='Таможня' AND [Период] < @dt ),0)

				UPDATE mag_pbi.pbi.[Себестоимость]
				SET [Закупка] = @zakupka
					, [Закупка, usd2] = @zakupka_usd2
					, [ЕАЭС] = ( -- сумма всего / кол всего * кол
							CASE WHEN @kolich <= 0 THEN 0
								ELSE
									CASE WHEN -@eaes > @eaes/@kolich * @q THEN -@eaes
										ELSE @eaes/@kolich * @q END
							END
						)
					, [Таможня] = ( -- сумма всего / кол всего * кол
							CASE WHEN @kolich <= 0 THEN 0
								ELSE
									CASE WHEN -@tamoznia > @tamoznia/@kolich * @q THEN -@tamoznia
										ELSE @tamoznia/@kolich * @q END
							END
						)
					
				WHERE id=@id 
			--END --@vid = 'Продажа'

		FETCH NEXT FROM db_cursor INTO @id, @uid, @q, @dt, @vid, @cenovaya_gruppa, @kurs_usd2, @kurs_usd
	END 

	CLOSE db_cursor  
	DEALLOCATE db_cursor 
END

		/*
			ELSE if @vid = 'Фасовка_Комплекты'
				
				UPDATE [mag_reports].[sebest].[Себестоимость]
				SET [Сумма] = ( -- сумма всех комплектующих
					SELECT sum(-[Сумма]) 
					FROM [mag_reports].[sebest].[Себестоимость] WHERE  [Комплект] = @uid AND [Статья] = 'Закупка' AND [Период] = dateadd(second, -1, @dt) AND [Сумма]<>0 and [Вид операции] = 'Фасовка_Комплектующие')
					, [Валютная сумма] = ( -- сумма всех комплектующих
					SELECT sum(-[Валютная сумма])
					FROM [mag_reports].[sebest].[Себестоимость] WHERE  [Комплект] = @uid AND [Статья] = 'Закупка' AND [Период] = dateadd(second, -1, @dt) AND [Валютная сумма]<>0 and [Вид операции] = 'Фасовка_Комплектующие')
					WHERE id=@id
					
					*/

			--расчет по учетной цене
			/*UPDATE [sebest].[Себестоимость] 
			  SET [Учетная цена]=
			  /*
			  --первый вариант учетной цены - по учетной цене руб
				(SELECT TOP (1) [Цена] / 1000
						FROM [mag_reports].[sales].[pricelist] pl
						where pl.[1c_id] =  @uid and [Вид цены] = 'Учетная цена (руб)'
						AND  DATEADD(year, -2000, pl._Period) <= @dt 
						ORDER BY pl._Period desc)
				 
  				*/
				 
				--второй вариант учетной цены - для вал товара пересчитываем уч цену через курс
				(CASE 
					WHEN (SELECT _Fld21101RRef FROM MAG_2019.dbo._Reference188X1 WHERE _IDRRef = @uid) = 0x80C5305A3A00E12B11E584520AEC30EC THEN --'Валютная' 
					-- Если валютная ценовая группа, то берем учетную цену (вал)
						(SELECT TOP (1) [Цена] / 1000
							FROM [mag_reports].[sales].[pricelist] pl
							where pl.[1c_id] =  @uid and [Вид цены] = 'Учетная цена (вал)'
							AND  DATEADD(year, -2000, pl._Period) <= @dt
							ORDER BY pl._Period desc) * (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] rg --РегистрСведений.КурсыВалют
													WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
													AND  DATEADD(year, -2000, rg._Period)<= @dt 
													ORDER BY rg._Period desc)

					ELSE --WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN --'Рублевая' 
						(SELECT TOP (1) [Цена] / 1000
						FROM [mag_reports].[sales].[pricelist] pl
						where pl.[1c_id] =  @uid and [Вид цены] = 'Учетная цена (руб)'
						AND  DATEADD(year, -2000, pl._Period) <= @dt 
						ORDER BY pl._Period desc) 
					END
		
					)
			WHERE id=@id*/


			/* ЗДЕСЬ ВСТАВЛЯЕМ РАСЧЕТ ДРУГИХ СТАТЕЙ СЕБЕСТОИМОСТИ ПРИ ПРОДАЖЕ */
			/*if @vid = 'Фасовка_Комплекты'
				
				insert into [sebest].[Себестоимость] ([Период], [Статья], [Вид операции], [1c_id], [artic_id], [Количество], [Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС])
				select
					@dt as [Период]
					, [Статья]
					, @vid as [Вид операции]
					, @uid as [1c_id]
					, @ar as [artic_id]
					, 0 as [Количество]
					, sum([Сумма]) as [Сумма]
					, 0 as [Сумма Без НДС]
					, sum([Валютная сумма]) as [Валютная сумма]
					, 0 as [Валютная сумма Без НДС]
				
				FROM [mag_reports].[sebest].[Себестоимость]
				WHERE  [Комплект] = @uid AND not [Статья] = 'Закупка' AND [Период] = dateadd(second, -1, @dt) and [Вид операции] = 'Фасовка_Комплектующие'
				group by
					[Статья]

			else
				insert into [sebest].[Себестоимость] ([Период], [Статья], [Вид операции], [1c_id], [artic_id], [Комплект], [Количество], [Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС])
				select
					@dt as [Период]
					, [Статья]
					, @vid as [Вид операции]
					, @uid as [1c_id]
					, @ar as [artic_id]
					, @kom as [Комплект]
					, 0 as [Количество]
					, @q * (sum([Сумма]) / (select sum([Количество])
						FROM [mag_reports].[sebest].[Себестоимость]
						WHERE  [1c_id] = @uid AND [Статья] = 'Закупка' AND [Период] < @dt)) as [Сумма]
					, 0 as [Сумма Без НДС]
					, @q * (sum([Валютная сумма]) / (select sum([Количество])
						FROM [mag_reports].[sebest].[Себестоимость]
						WHERE  [1c_id] = @uid AND [Статья] = 'Закупка' AND [Период] < @dt)) as [Валютная сумма]
					, 0 as [Валютная сумма Без НДС]
				
				FROM [mag_reports].[sebest].[Себестоимость]
				WHERE  [1c_id] = @uid AND not [Статья] = 'Закупка' AND [Период] < @dt
				group by
					[Статья]
					*/
GO

/****** Object:  StoredProcedure [sebest].[Создать индексы]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*

	*/


CREATE PROCEDURE  [sebest].[Создать индексы] as 
BEGIN
	CREATE NONCLUSTERED INDEX [NonClusteredIndex-20220320-182545] ON [pbi].[Себестоимость]
	(
		[1c_id] ASC,
		[Период] ASC
	)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
	
	CREATE NONCLUSTERED INDEX [NonClusteredIndex-1] 	ON [pbi].[Себестоимость] 
	([Статья],[Вид операции],[Период])
	INCLUDE ([1c_id],[Количество])

	CREATE NONCLUSTERED INDEX [NonClusteredIndex-2] ON [pbi].[Себестоимость]
	(
		[1c_id] ASC,
		[Статья] ASC,
		[Период] ASC
	)
	
	CREATE NONCLUSTERED INDEX [NonClusteredIndex-2-1] ON [pbi].[Себестоимость]
	(
		[Партнер] ASC,
		[Период] ASC
	)
	CREATE NONCLUSTERED INDEX [NonClusteredIndex-3] ON [pbi].[Себестоимость]
	(
		[1c_id] ASC,
		[Статья] ASC,
		[Вид операции] ASC,
		[Период] ASC
	)
	INCLUDE([Закупка],[ЕАЭС],[Таможня],[Количество])WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
	
	CREATE NONCLUSTERED INDEX [NonClusteredIndex-4]
	ON [pbi].[Себестоимость] ([Период],[Статья],[Вид операции],[1c_id],[Количество])

	CREATE NONCLUSTERED INDEX [NonClusteredIndex-5]
	ON [pbi].[Себестоимость] ([Статья],[1c_id],[Период])
	
	CREATE NONCLUSTERED INDEX [NonClusteredIndex-6]
	ON [pbi].[Себестоимость] ([Статья],[Вид операции],[1c_id],[Период])

END
GO

/****** Object:  StoredProcedure [sebest].[Создать таблицу]    Script Date: 2026-03-03 09:40:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Object:  Table [sebest].[Себестоимость]    Script Date: 10.04.2022 8:42:54 ******/
CREATE procedure [sebest].[Создать таблицу] as
BEGIN
	CREATE TABLE [pbi].[Себестоимость](
		id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
		[Период] [datetime2](0) NULL,
		[Статья] [varchar](255) NOT NULL,
		[Вид операции] [varchar](255) NOT NULL default '',
		[Хоз операция] [varchar](255) NOT NULL default '',
		[Организация] [varchar](255) NULL default '',
		[Партнер] [varchar](255) NULL default '',
		[Контрагент] [varchar](255) NULL default '',
		[Менеджер] [varchar](255) NULL default '',
		[Тип документа] [varchar](255) NULL default '',
		[Номер документа] [varchar](255) NULL default '',
		[Валюта документа] [varchar](255) NULL default '',
		[Ценовая группа] [varchar](255) NULL default '',
		[1c_document_id] [binary](16) NULL,
		[1c_id] [binary](16) NULL,
		[artic_id] [nvarchar](36) NULL,
		[Количество] [numeric](15, 3) NULL default 0,
		[Сумма] numeric(38,15) NULL default 0,
		[СуммаБезНДС] numeric(38,15) NULL default 0,
		[СуммаРучнойСкидки] numeric(38,15) NULL default 0,
		[СуммаАвтоСкидки] numeric(38,15) NULL default 0,
		[Закупка] numeric(38,15) NULL default 0,
		[Закупка, usd2] numeric(38,15) NULL default 0,
		[Курс usd2] [numeric](15, 3) NULL default 0,
		[Курс usd] [numeric](15, 3) NULL default 0,
		[Таможня] numeric(38,15) NULL default 0,
		[ЕАЭС] numeric(38,15) NULL default 0,
		[Учетная цена] numeric(38,15) NULL default 0,
		[Учетная цена USD2+2] numeric(38,15) NULL default 0, 
		[Заказ закрыт] datetime NULL,
		[Номер заказа] nchar(11) NULL,
		[Маркетинг] numeric(38,15) NULL default 0,
		[Доставка] numeric(38,15) NULL default 0,
		[НДС] numeric(38,15) NULL default 0,
		[Сборка] numeric(38,15) NULL default 0,
		[ЗатратыМП]  numeric(38,15) NULL default 0,
		[PartnerId] [nvarchar](36) NULL,
		[Учетная стоимость] numeric(38,15) NULL default 0,
		[Учетная стоимость USD2+2] numeric(38,15) NULL default 0
	) ON [PRIMARY]
END
GO
