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;