Files
Bridge-and-Join-s/internal/lkgateway/depoprocs/FTV_M2M_PROCESS_EVENTS.sql
T
fontvielle 045dfac6c7 DEPO: установка процедур bj2depo из bj (проверка возможностей + применение)
Процедуры FTV_M2M_PROCESS_* и FTV_M2M_JOB встроены в bj (depoprocs/*.sql).
В разделе «Учёт DEPO» карточка «Процедуры обработки bj2depo»:
- «Проверить возможности» — подключение, это ли база DEPO, какие процедуры
  установлены, есть ли право CREATE PROCEDURE и логин bj в базе (ничего не меняет);
- «Установить» — логином администратора SQL (разово, не сохраняется) выполняет
  CREATE OR ALTER в порядке WIRING→OPERATION→EVENTS→CREATE→JOB и GRANT EXECUTE
  на FTV_M2M_JOB логину bj; без прав — отказ без изменений;
- скачивание единого скрипта для ручной установки в SSMS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 13:56:40 +03:00

278 lines
9.8 KiB
Transact-SQL

CREATE OR ALTER procedure [dbo].[FTV_M2M_PROCESS_EVENTS] (@ID int)
as
set nocount on;
/*
Вынести создание операции в отдельную процедуру FTV_M2M_PROCESS_OPERATION (параметры - @GUID и @REFERENCE, но проверку параметров оставить тут). Будем возвращать @OPER_ID
*/
if user = 'dbo' execute as user = 'SYSDBA';
print 'FTV_M2M_PROCESS_EVENTS';
print @ID;
--Обрабатываем событие по M2M-поручению
declare
@WHOS int = 383118,
@GUID uniqueidentifier,
@REFERENCE varchar(255),
@EVENT_TYPE varchar(64),
@EVENT_DATE datetime,
@M2M_REJECT_CODE varchar,
@PARAMETERS varchar(max),
@DIRECTION varchar(64),
--
@CONTRAGENT_FACE int,
@DEPONENT_FACE int,
@SHARE int,
@AMOUNT numeric(27, 7),
@PLACE int,
@CLIENT int,
@FACE int,
@CLISER_ID int,
@DOL_ID int,
--
@D_CAT int,
@NUM varchar(64),
@D_DATE datetime,
@OPER_ID int,
@DD_DATE datetime,
@DD_NUM varchar(64);
-- FTV_M2M_EVENTS.REFERENCE может быть пустой, в этом случае событие относится ко всему М2М-поручению
select
@GUID = ME.GUID,
@REFERENCE = ME.REFERENCE,
@EVENT_TYPE = ME.EVENT_TYPE,
@EVENT_DATE = ME.EVENT_DATE,
@M2M_REJECT_CODE = ME.M2M_REJECT_CODE,
@DIRECTION = M.DIRECTION
from FTV_M2M_EVENTS ME
left join FTV_M2M M on M.GUID = ME.GUID
where ME.ID = @ID;
if @REFERENCE is null begin
--Не все события могут быть применены ко всему М2М-поручению
if not (@EVENT_TYPE in ('BJ_RECEIVED', 'BJ_SENT', 'BJ_ORDER_SENT', 'BJ_ORDER_ACCEPTED', 'BJ_EXECUTED') or @EVENT_TYPE like 'BJ_QUIK_%')
raiserror ('Событие этого типа не может быть указано без REFERENCE', 16, 1);
select
@REFERENCE = ME.REFERENCE,
@CLISER_ID = H.DOC,
@DOL_ID = F.DOL,
@DD_DATE = cast(D.D_DATE as date),
@DD_NUM = D.NUM,
@SHARE = F.SHARE,
@AMOUNT = F.AMOUNT,
@PLACE = F.PLACE,
@CLIENT = F.CLIENT,
@FACE = H.DEPONENT
from FTV_M2M_EVENTS ME
left join FTV_M2M_LINES ML on ML.GUID = ME.GUID and ML.REFERENCE = ME.REFERENCE
left join FTV_M2M M on M.GUID = ME.GUID
left join D_CLISER_M2M_DOL F on F.DOL_REF = ME.REFERENCE
left join D_CLISER_M2M H on H.DOC_GUID = ME.GUID
left join OD_DOCS D on D.ID = H.DOC
where ME.ID = @ID;
end
else begin
select
@REFERENCE = ME.REFERENCE,
@CLISER_ID = H.DOC,
@DOL_ID = F.DOL,
@DD_DATE = cast(D.D_DATE as date),
@DD_NUM = D.NUM,
@SHARE = F.SHARE,
@AMOUNT = F.AMOUNT,
@PLACE = F.PLACE,
@CLIENT = F.CLIENT,
@FACE = H.DEPONENT
from FTV_M2M_EVENTS ME
left join FTV_M2M_LINES ML on ML.GUID = ME.GUID and ML.REFERENCE = ME.REFERENCE
left join FTV_M2M M on M.GUID = ME.GUID
left join D_CLISER_M2M_DOL F on F.DOL_REF = ME.REFERENCE
left join D_CLISER_M2M H on H.DOC_GUID = ME.GUID
left join OD_DOCS D on D.ID = H.DOC
where ME.ID = @ID;
--Критические ошибки
if @DOL_ID is null
raiserror ('Не найдена строка M2M-поручение по GUID + REFERENCE', 16, 1);
end;
--Пишем в признаки документа
insert into OD_INVALIDS (DOC, STATUS, COMMENT, DO_ING)
values (
@CLISER_ID,
0,
'Обработано событие: ' + FORMAT(@EVENT_DATE, 'dd.MM.yyyy HH:mm:ss') + ' - ' + @EVENT_TYPE + coalesce (' (референс - ' + @REFERENCE + ')', '') + coalesce (' (парамерты - ' + @PARAMETERS + ')', ''),
'Время начала обработки: ' + FORMAT(GETDATE(), 'dd.MM.yyyy HH:mm:ss')
)
print @EVENT_TYPE;
--ОБРАБОТКА КАЖДОГО ТИПА СОБЫТИЯ
if @EVENT_TYPE = 'BJ_RECEIVED' and @DIRECTION = 'OUT' begin
update OD_DOCS set ID = 0, STATE = 1 where ID = @CLISER_ID; --START - Начало обработки (зарегистрирован)
end
else
if @EVENT_TYPE = 'BJ_SENT' and @DIRECTION = 'IN' begin
update OD_DOCS set ID = 0, STATE = 1 where ID = @CLISER_ID; --START - Начало обработки (зарегистрирован)
end
else
if @EVENT_TYPE = 'BJ_DECISION_REJECT' and @DIRECTION = 'IN' begin
--M2M_STATUS = 10 TODO!!!!!!!!!!!!!!!!!
update D_CLISER_M2M_DOL set M2M_STATUS = 10, M2M_TEXT = '???' where DOL = @DOL_ID;
--только если отказ по всем строкам подвала документа
if not exists (select top 1 DOL from D_CLISER_M2M_DOL F left join OD_DOLS L on L.ID = F.DOL where L.DOC = @CLISER_ID and (M2M_STATUS is null or M2M_TEXT is null)) begin
update OD_DOCS set ID = 0, STATE = 3 where ID = @CLISER_ID; --REJECT - Отмена обработки
end;
end
else
if @EVENT_TYPE = 'BJ_CP_REJECT' and @DIRECTION = 'OUT' begin
--M2M_STATUS = 10 TODO!!!!!!!!!!!!!!!!!
update D_CLISER_M2M_DOL set M2M_STATUS = 10, M2M_TEXT = '???' where DOL = @DOL_ID;
--только если отказ по всем строкам подвала документа
--TODO зачем проверять все строки подвала, если мы не будем делать многострочные исходящие???
if not exists (select top 1 DOL from D_CLISER_M2M_DOL F left join OD_DOLS L on L.ID = F.DOL where L.DOC = @CLISER_ID and (M2M_STATUS is null or M2M_TEXT is null)) begin
update OD_DOCS set ID = 0, STATE = 3 where ID = @CLISER_ID; --REJECT - Отмена обработки
end;
end
else
--TODO что делать если мы проставили статус не по всем строкам документа??
if @EVENT_TYPE = 'BJ_DECISION_CONFIRM' and @DIRECTION = 'IN' begin
update OD_DOCS set ID = 0, STATE = 1 where ID = @CLISER_ID; --START - Начало обработки (зарегистрирован) --ОНО И ТАК УЖЕ ДОЛЖНО БЫТЬ В ЭТОМ СОСТОЯНИИ!!!
end
else
--TODO что делать если контрагент проставил статус не по всем строкам документа??
if @EVENT_TYPE = 'BJ_CP_CONFIRM' and @DIRECTION = 'OUT' begin
update OD_DOCS set ID = 0, STATE = 1 where ID = @CLISER_ID; --START - Начало обработки (зарегистрирован) --ОНО И ТАК УЖЕ ДОЛЖНО БЫТЬ В ЭТОМ СОСТОЯНИИ!!!
end
else
if @EVENT_TYPE = 'BJ_SERVICE_ERROR' or @EVENT_TYPE = 'BJ_CANCELLED' begin
update OD_DOCS set ID = 0, STATE = 3 where ID = @CLISER_ID; --REJECT - Отмена обработки
end
else
if @EVENT_TYPE = 'BJ_ORDER_ACCEPTED' begin
-----TODO exec FTV_M2M_PROCESS_OPERATION @GUID, @REFERENCE, @EVENT_DATE, @OPER_ID out;
--Направление
select @D_CAT = DC.ID
from OD_DOC_CATS DC
where DC.SYS_NAME = case when @DIRECTION = 'IN' then 'OP_INV_ZACH' else 'OP_INV_SPIS' end;
set @D_DATE = @EVENT_DATE;
exec GEN_ID 'OD_DOC_ID_GEN', 1, @OPER_ID out;
exec FU_NEXT_DOC_NUM @D_CAT, @D_DATE, null, @OPER_ID, @NUM out, @D_DATE out;
insert into OD_DOCS (ID, NUM, PARAM, D_CAT, D_DATE, STATE, DIRECTION, WHOS, KVIT)
values (@OPER_ID, @NUM, null, @D_CAT, @D_DATE, 0, 0, @WHOS, @CLISER_ID);
if @DIRECTION = 'IN' begin
--порядок полей - по форме документа (сверху вниз)
insert into U_OP_INV_ZACH
(
DOC,
DD_TYPE,
DD_DATE, DD_NUM,
SHARE, AMOUNT, BLANKS,
PLACE,
D_NUM,
DEPO,
K_NUM,
MARKET,
CONDITION, IS_REG, TAX_R,
B_TYPE,
B_DATE, B_NUM,
WIR_DATE, NOTIFY_DATE, REG_DATE,
IS_BLOCK,
FROM_FACE,
REJECT_REASON,
COMMENT
)
values
(
@OPER_ID,
1 /*Клиентское*/,
@DD_DATE, @DD_NUM,
@SHARE, @AMOUNT, null,
@PLACE,
314, /*98015 - 0 - Ценные бумаги и цифровые активы на хранении в других депозитариях (НОСТРО депо расчетный)*/
@CLIENT,
836, /*98070 - 4 - Ценные бумаги и цифровые активы на торгах*/
8106, /*ММВБ - ПАО Московская Биржа*/
null, null, null,
31, /*Отчет депозитария*/
@EVENT_DATE, 'Вопрос, что тут пишем',
@EVENT_DATE, @EVENT_DATE, @EVENT_DATE, --Берем из BJ
0,
@FACE,
null, --А есди это отмена??
'Перевод M2M (без поручения), GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE
);
end
else
if @DIRECTION = 'OUT' begin
insert into U_OP_INV_SPIS
(
DOC,
DD_TYPE,
DD_DATE, DD_NUM,
SHARE, AMOUNT, BLANKS,
PLACE,
D_NUM,
DEPO,
K_NUM,
MARKET,
OLD_CONDITIONS, IS_REG, TAX_R,
B_TYPE,
B_DATE, B_NUM,
WIR_DATE, NOTIFY_DATE, REG_DATE,
IS_BLOCK,
FROM_FACE,
REJECT_REASON,
COMMENT
)
values
(
@OPER_ID,
1 /*Клиентское*/,
@DD_DATE, @DD_NUM,
@SHARE, @AMOUNT, null,
@PLACE,
314, /*98015 - 0 - Ценные бумаги и цифровые активы на хранении в других депозитариях (НОСТРО депо расчетный)*/
@CLIENT,
836, /*98070 - 4 - Ценные бумаги и цифровые активы на торгах*/
8106, /*ММВБ - ПАО Московская Биржа*/
null, null, null,
31, /*Отчет депозитария*/
@EVENT_DATE, 'Вопрос, что тут пишем',
@EVENT_DATE, @EVENT_DATE, @EVENT_DATE, --Берем из BJ
0,
@FACE,
null, --А есди это отмена??
'Отчет НКО АО НРД [номер, дата]. Перевод M2M, GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE
);
end;
--И сразу проводим
exec FTV_M2M_PROCESS_WIRING @OPER_ID;
end
else if @EVENT_TYPE = 'CREATE_WIRING' begin
print 'CREATE_WIRING'
end;