analytics/mag_pbi/scripts/migrate_map_to_contractor_1c.sql
2026-02-18 14:36:38 +03:00

157 lines
7.2 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- Переход: counterparties → v_contractors (1С)
-- manufacturer_counterparty_map: counterparty_id → contractor_1c_id
-- Контрагенты и производители из 1С (v_contractors, v_producers)
-- =============================================================================
USE [mag_pbi]
GO
SET NOCOUNT ON;
-- Удаляем представления, ссылающиеся на map/counterparties
IF OBJECT_ID(N'[analytics].[v_manufacturer_counterparty_mapping]', N'V') IS NOT NULL
DROP VIEW [analytics].[v_manufacturer_counterparty_mapping];
GO
-- Удалить FK manufacturer_counterparty_map → counterparties (если есть)
DECLARE @fk NVARCHAR(256);
SELECT @fk = name FROM sys.foreign_keys
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]')
AND referenced_object_id = OBJECT_ID(N'[analytics].[counterparties]');
IF @fk IS NOT NULL
EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @fk);
GO
-- Очистить таблицу привязки
TRUNCATE TABLE [analytics].[manufacturer_counterparty_map];
PRINT 'manufacturer_counterparty_map: очищена';
GO
-- Заменить counterparty_id на contractor_1c_id
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'counterparty_id')
BEGIN
ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP COLUMN [counterparty_id];
PRINT 'Удалена колонка counterparty_id';
END
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'contractor_1c_id')
BEGIN
ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD [contractor_1c_id] BINARY(16) NOT NULL;
PRINT 'Добавлена колонка contractor_1c_id';
END
GO
-- Удалить старые уникальные ограничения (на counterparty_id), создать новое
DECLARE @uq NVARCHAR(256);
SELECT @uq = name FROM sys.key_constraints
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]')
AND type = 'UQ' AND name = 'UQ_mcm_counterparty';
IF @uq IS NOT NULL
EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @uq);
SELECT @uq = name FROM sys.key_constraints
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]')
AND type = 'UQ' AND name = 'UQ_mcm_pair';
IF @uq IS NOT NULL
EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @uq);
-- Один контрагент — один производитель
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'UQ_mcm_contractor')
ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD CONSTRAINT [UQ_mcm_contractor] UNIQUE ([contractor_1c_id]);
-- Уникальная пара
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'UQ_mcm_pair')
ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD CONSTRAINT [UQ_mcm_pair] UNIQUE ([manufacturer_id], [contractor_1c_id]);
GO
-- Удалить таблицу counterparties
IF OBJECT_ID(N'[analytics].[counterparties]', N'U') IS NOT NULL
BEGIN
DROP TABLE [analytics].[counterparties];
PRINT 'Удалена таблица analytics.counterparties';
END
GO
-- Создать v_contractors, v_producers если не существуют
IF OBJECT_ID(N'[analytics].[v_contractors]', N'V') IS NULL
BEGIN
EXEC('
CREATE VIEW [analytics].[v_contractors] AS
SELECT
c._IDRRef AS contractor_1c_id,
LOWER(CONCAT(
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 25, 8), ''-'',
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 21, 4), ''-'',
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 17, 4), ''-'',
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 1, 4), ''-'',
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 5, 12)
)) AS contractor_id,
c._Description AS contractor_name
FROM [MAG_2019].[dbo].[_Reference168] c
WHERE c._Marked = 0');
PRINT 'Создано представление v_contractors';
END
IF OBJECT_ID(N'[analytics].[v_producers]', N'V') IS NULL
BEGIN
EXEC('
CREATE VIEW [analytics].[v_producers] AS
SELECT
pr._IDRRef AS producer_1c_id,
LOWER(CONCAT(
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 25, 8), ''-'',
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 21, 4), ''-'',
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 17, 4), ''-'',
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 1, 4), ''-'',
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 5, 12)
)) AS producer_id,
pr._Description AS producer_name
FROM [MAG_2019].[dbo].[_Reference260] pr
WHERE pr._Marked = 0');
PRINT 'Создано представление v_producers';
END
GO
-- Представление для API: map + manufacturer + contractor/producer (из 1С)
CREATE VIEW [analytics].[v_manufacturer_counterparty_mapping] AS
SELECT
mcm.id,
mcm.manufacturer_id,
p.producer_id,
man.manufacturer AS manufacturer_name,
mcm.contractor_1c_id,
c.contractor_id,
c.contractor_name AS contractor_name,
man.days_of_sales,
man.logistics_days,
man.roic_norm
FROM [analytics].[manufacturer_counterparty_map] mcm
LEFT JOIN [analytics].[manufacturers] man ON man.id = mcm.manufacturer_id
LEFT JOIN [analytics].[v_contractors] c ON c.contractor_1c_id = mcm.contractor_1c_id
LEFT JOIN [analytics].[v_producers] p ON LTRIM(RTRIM(p.producer_name)) = LTRIM(RTRIM(man.manufacturer));
GO
-- Исправить [analytics].[get_orders_list]: counterparties удалена, map по contractor_1c_id,
-- manufacturers без ROI_norm/n_percent/n_days/m_percent/m_days — использовать v_manufacturers_roi_compat
IF OBJECT_ID(N'[analytics].[get_orders_list]', N'V') IS NOT NULL
BEGIN
DECLARE @def NVARCHAR(MAX);
SELECT @def = OBJECT_DEFINITION(OBJECT_ID(N'[analytics].[get_orders_list]'));
IF @def LIKE N'%counterparties%'
BEGIN
SET @def = REPLACE(@def, N'LEFT JOIN [analytics].[counterparties] cp ON cp.[counterparty] = r._Description', N'');
SET @def = REPLACE(@def, N'map.[counterparty_id] = cp.id', N'map.[contractor_1c_id] = r._IDRRef');
-- manufacturers без старых полей — join на v_manufacturers_roi_compat (ROI_norm, n_percent, n_days, m_percent, m_days)
IF @def LIKE N'%ROI_norm%' AND OBJECT_ID(N'[analytics].[v_manufacturers_roi_compat]', N'V') IS NOT NULL
SET @def = REPLACE(@def, N'[analytics].[manufacturers] man', N'[analytics].[v_manufacturers_roi_compat] man');
DROP VIEW [analytics].[get_orders_list];
EXEC sp_executesql @def;
PRINT 'Обновлено представление analytics.get_orders_list';
END
END
GO
PRINT 'Готово: manufacturer_counterparty_map с contractor_1c_id, counterparties удалена';
GO