Files
Bridge-and-Join-s/deploy/depo/fancy-m2m/FTV_M2M_UPDATE_HANDBOOK.sql
T
fontvielle b652baba63 DEPO: процедуры bj2depo — актуальные тексты с тестовой базы + FTV_M2M_UPDATE_HANDBOOK
В bj и deploy/depo/fancy-m2m лежали тексты на 23.09; программист Фонтвьель
менял процедуры 09–21.10 (EVENTS: новая логика и вызов UPDATE_HANDBOOK;
OPERATION: @PARAMETERS, счёт ностро 313 вместо 314; JOB, CREATE). Сняты
с BJ_DEPO_DATA (10.10.10.21) 22.10.2026 без изменений, CREATE → CREATE OR
ALTER. Добавлена FTV_M2M_UPDATE_HANDBOOK (её вызывает EVENTS). Порядок:
WIRING → OPERATION → UPDATE_HANDBOOK → EVENTS → CREATE → JOB.
Проверено на тесте: все 6 применяются в транзакции без ошибок (откат).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-22 13:19:19 +03:00

174 lines
6.6 KiB
Transact-SQL

CREATE OR ALTER procedure [dbo].[FTV_M2M_UPDATE_HANDBOOK] @COMMENT nvarchar(MAX) out
--grant execute on FTV_M2M_UPDATE_HANDBOOK to public;
/*
Обновление справочника участников сервиса
select * from FTV_M2M_HANDBOOK where ACTIVE = 1 and PARTICIPANT_CODE is not null
insert into FTV_M2M_EVENTS (EVENT_TYPE, EVENT_DATE) select 'HANDBOOK', getdate();
declare @ID int, @COMMENT nvarchar(MAX);
select @ID = max(ID) from FTV_M2M_EVENTS where EVENT_TYPE = 'HANDBOOK';
exec FTV_M2M_UPDATE_HANDBOOK @COMMENT out;
update FTV_M2M_EVENTS set COMMENT = @COMMENT where ID = @ID;
PRINT @COMMENT;
SELECT @COMMENT;
--УДАЛЯЛКА ДЛЯ ТИКЕРОВ
declare @M2M_Coder int;
select @M2M_Coder = F.SELF_ID from OD_FACES F where F.LAST_FLAG = 1 and F.MNEM = 'M2M';
delete from OD_FACE_CODERS where CODER = @M2M_Coder
--УДАЛЯЛКА ДЛЯ ЮРЛИЦ
delete from OD_FACES where S_TYPE = 1 and B_DATE >= dateadd(DAY, -1, cast(getdate() as date))
*/
as
set nocount on;
declare
@M2M_Coder int,
--@COMMENT nvarchar(MAX),
@Cnt int,
@FACE_ID int,
@ID int,
@ROW int = 0,
@DoubleINN int,
@INN varchar(12),
@CODE varchar(64),
@CODE2 varchar(64),
@NAME_SHORT nvarchar(128),
@NAME_FULL nvarchar(255);
declare @CRLF nvarchar(2) = NCHAR(13) + NCHAR(10);
select @M2M_Coder = F.SELF_ID from OD_FACES F where F.LAST_FLAG = 1 and F.MNEM = 'M2M';
--select @M2M_Coder;
--1. Статистика по участникам
declare @Codes_OUR table (SELF_ID int, INN varchar(12), CODE varchar(64), NAME_SHORT varchar(255), NAME_FULL varchar(255));
insert into @Codes_OUR (SELF_ID, INN, CODE, NAME_SHORT, NAME_FULL)
select
F.SELF_ID, F.INN, C.CODE, F.NAME, UF.FULL_NAME
from OD_FACE_CODERS C
left join OD_FACES F on F.SELF_ID = C.FACE and F.LAST_FLAG = 1 and F.E_DATE = '1.1.9999'
left join OD_U_FACES UF on UF.FACE = F.SELF_ID
where C.CODER = @M2M_Coder;
--select * from @Codes_OUR;
select @Cnt = count(*) from @Codes_OUR;
set @COMMENT = N'УЧАСТНИКИ СЕРВИСА: в справочнике юрлиц Фэнси - ' + trim(str(@Cnt));
select @Cnt = count(*) from FTV_M2M_HANDBOOK where ACTIVE = 1 and PARTICIPANT_CODE is not null;
set @COMMENT = @COMMENT + N', по данным НРД - ' + trim(str(@Cnt));
--PRINT @COMMENT;
--2. Принудительно добавляем отсутствующих юрлиц в Фэнси
declare cur cursor local fast_forward read_only for
select HB.ID, HB.PARTICIPANT_CODE, HB.INN, HB.NAME_SHORT, HB.NAME_FULL
from FTV_M2M_HANDBOOK HB
where HB.ACTIVE = 1 and HB.INN not in (select INN from OD_FACES F where F.LAST_FLAG = 1 and F.E_DATE = '1.1.9999' and F.INN is not null)
order by HB.NAME_SHORT;
open cur;
while 0 = 0 begin fetch next from cur into @ID, @CODE, @INN, @NAME_SHORT, @NAME_FULL;
if @@FETCH_STATUS <> 0 break;
set @ROW = @ROW + 1;
exec GEN_ID 'OD_FACES_ID_GEN', 1, @FACE_ID out;
insert into OD_FACES (ID, S_TYPE, INN, NAME)
values (@FACE_ID, 1, @INN, @NAME_SHORT);
insert into OD_U_FACES (FACE, FULL_NAME)
values (@FACE_ID, @NAME_FULL);
insert into OD_FACE_CODERS (CODE, CODER, FACE)
values (@CODE, @M2M_Coder, @FACE_ID);
set @COMMENT = @COMMENT + @CRLF + trim(str(@ROW)) + N'. Добавлено юрлицо: ' + @CODE + N', ' + @INN + N', ' + @NAME_SHORT;
end;
close cur;
deallocate cur;
----3. Добавляем отсутствующие коды участников в справочник тикеров Фэнси, сразу предупреждая о двойниках по ИНН
delete from @Codes_OUR;
insert into @Codes_OUR (SELF_ID, INN, CODE, NAME_SHORT, NAME_FULL)
select
F.SELF_ID, F.INN, C.CODE, F.NAME, UF.FULL_NAME
from OD_FACE_CODERS C
left join OD_FACES F on F.SELF_ID = C.FACE and F.LAST_FLAG = 1 and F.E_DATE = '1.1.9999'
left join OD_U_FACES UF on UF.FACE = F.SELF_ID
where C.CODER = @M2M_Coder;
declare cur cursor local fast_forward read_only for
select HB.ID, HB.PARTICIPANT_CODE, HB.INN, HB.NAME_SHORT, min(F.SELF_ID), count(*)
from FTV_M2M_HANDBOOK HB
left join OD_FACES F on F.INN = HB.INN
left join OD_FACE_CODERS C on C.CODER = @M2M_Coder and F.SELF_ID = C.FACE
where
HB.ACTIVE = 1
and HB.PARTICIPANT_CODE is not null
and F.S_TYPE = 1
and F.LAST_FLAG = 1
and F.E_DATE = '1.1.9999'
and C.CODE is null
and F.INN not in (select INN from @Codes_OUR)
group by HB.ID, HB.PARTICIPANT_CODE, HB.INN, HB.NAME_SHORT
order by HB.NAME_SHORT;
open cur;
while 0 = 0 begin fetch next from cur into @ID, @CODE, @INN, @NAME_SHORT, @FACE_ID, @Cnt;
if @@FETCH_STATUS <> 0 break;
set @ROW = @ROW + 1;
insert into OD_FACE_CODERS (CODE, CODER, FACE)
values (@CODE, @M2M_Coder, @FACE_ID);
set @COMMENT = @COMMENT + @CRLF + trim(str(@ROW)) + N'. Добавлен код участника ' + @CODE + N' к юрлицу: ' + @INN + N', ' + @NAME_SHORT;
if @Cnt > 1 begin
set @COMMENT = @COMMENT + N' (ПРЕДУПРЕЖДЕНИЕ: в Фэнси найдено несколько юрлиц с ИНН ' + @INN + N')';
end;
end;
close cur;
deallocate cur;
if @ROW = 0 begin
set @COMMENT = @COMMENT + N' (при обработке нового справочника НРД никаких изменений не обнаружено)'
end;
--4. Проверка на отличающиеся коды в Фэнси и НРД для одного юрлица по идентификации ИНН, или лишние коды в Фэнси
delete from @Codes_OUR;
insert into @Codes_OUR (SELF_ID, INN, CODE, NAME_SHORT, NAME_FULL)
select
F.SELF_ID, F.INN, C.CODE, F.NAME, UF.FULL_NAME
from OD_FACE_CODERS C
left join OD_FACES F on F.SELF_ID = C.FACE and F.LAST_FLAG = 1 and F.E_DATE = '1.1.9999'
left join OD_U_FACES UF on UF.FACE = F.SELF_ID
where C.CODER = @M2M_Coder;
declare cur cursor local fast_forward read_only for
select C.INN, C.NAME_SHORT, C.CODE, HB.PARTICIPANT_CODE
from @Codes_OUR C
left join FTV_M2M_HANDBOOK HB on HB.INN = C.INN and ACTIVE = 1 and HB.PARTICIPANT_CODE is not null
where
C.CODE <> HB.PARTICIPANT_CODE or HB.PARTICIPANT_CODE is null;
open cur;
while 0 = 0 begin fetch next from cur into @INN, @NAME_SHORT, @CODE, @CODE2
if @@FETCH_STATUS <> 0 break;
set @ROW = @ROW + 1;
if @CODE2 is null
set @COMMENT = @COMMENT + @CRLF + N'КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ: для юрлица ' + @INN + ' (' + @NAME_SHORT + N') в Фэнси указан код ' + @CODE + N', отсутствующий в НРД';
else
set @COMMENT = @COMMENT + @CRLF + N'КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ: для юрлица ' + @INN + ' (' + @NAME_SHORT + N') в Фэнси указан код ' + @CODE + N', отличающийся от кода в НРД ' + @CODE2;
end;
close cur;
deallocate cur;