CREATE OR ALTER procedure [dbo].[FTV_M2M_PROCESS_EVENTS] (@ID int) --grant execute on FTV_M2M_PROCESS_EVENTS to public; --TODO что делать если мы проставили статус не по всем строкам документа?? as set nocount on; --if user = 'dbo' execute as user = 'SYSDBA'; print 'FTV_M2M_PROCESS_EVENTS'; print @ID; declare @WHOS int = 383118, @GUID uniqueidentifier, @REFERENCE varchar(255), @EVENT_TYPE varchar(64), @EVENT_DATE datetime, @M2M_REJECT_CODE varchar, @PARAMETERS nvarchar(4000), @DIRECTION varchar(64), @COMMENT varchar(MAX), -- @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), @STATE int, @RAISERROR varchar(64) = null; select @GUID = ME.GUID, @REFERENCE = ME.REFERENCE, @EVENT_TYPE = ME.EVENT_TYPE, @EVENT_DATE = ME.EVENT_DATE, @M2M_REJECT_CODE = ME.M2M_REJECT_CODE, @PARAMETERS = ME.PARAMETERS, @DIRECTION = M.DIRECTION, @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; --1. Обновление справоника участников сервмса if @EVENT_TYPE = 'HANDBOOK' begin exec FTV_M2M_UPDATE_HANDBOOK @COMMENT out; update FTV_M2M_EVENTS set COMMENT = @COMMENT where ID = @ID; return; end; --2. Критические ошибки (TODO другте обязательные поля) if @GUID is null raiserror ('Не указан GUID', 16, 1); if @REFERENCE is null raiserror ('Не указан REFERENCE', 16, 1); if @DOL_ID is null raiserror ('Не найдена строка M2M-поручение по GUID + REFERENCE', 16, 1); --3. Пишем в признаки документа 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; --4. ОБРАБОТКА КАЖДОГО ТИПА СОБЫТИЯ -- https://lic.zetit.ru/docs/fancy-events if @EVENT_TYPE = 'BJ_RECEIVED' begin update OD_DOCS set ID = 0, STATE = 1 where ID = @CLISER_ID; --START = Начало обработки (зарегистрирован) end if @EVENT_TYPE = 'BJ_SENT' begin select @STATE = ID from OD_DOC_STATES where SYS_NAME = 'WAIT_RESP_DECIS'; update OD_DOCS set ID = 0, STATE = @STATE where ID = @CLISER_ID; --WAIT_RESP_DECIS = Ожидание ответа Response/Decision end else if @EVENT_TYPE in ('BJ_DECISION_CONFIRM', 'BJ_CP_CONFIRM') begin --TODO эти события для СТРОКИ!!! update OD_DOCS set ID = 0, STATE = 8 where ID = @CLISER_ID; --RECIEVED = Принят: ожидает обработки end else if @EVENT_TYPE in ('BJ_DECISION_REJECT', 'BJ_CP_REJECT') begin --TODO эти события для СТРОКИ!!! update OD_DOCS set ID = 0, STATE = 3 where ID = @CLISER_ID; --REJECT = Отмена обработки end else if @EVENT_TYPE = 'BJ_SERVICE_ERROR' begin update OD_DOCS set ID = 0, STATE = 3 where ID = @CLISER_ID; --REJECT = Отмена обработки 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 if @EVENT_TYPE = 'BJ_ORDER_SENT' begin select @STATE = ID from OD_DOC_STATES where SYS_NAME = 'WAIT_OPER'; update OD_DOCS set ID = 0, STATE = @STATE where ID = @CLISER_ID; --WAIT_OPER = Ожидание исполнения операции end else if @EVENT_TYPE = 'BJ_ORDER_ACCEPTED' begin --Создаем операцию и проводим ее exec FTV_M2M_PROCESS_OPERATION @GUID, @REFERENCE, @EVENT_DATE, @PARAMETERS, @OPER_ID out; update OD_DOCS set ID = 0, STATE = 2 where ID = @CLISER_ID; -- FINAL - Конец обработки (в архиве) end --BJ_ORDER_REJECTED --TODO задал вопрос 16.10.2026 --BJ_EXECUTED --Оно уже в событии BJ_ORDER_ACCEPTED в финале и с проводками, что делать-то? else if @EVENT_TYPE = 'BJ_EXECUTED' begin print 'BJ_EXECUTED --Оно уже в событии BJ_ORDER_ACCEPTED в финале и с проводками, что делать-то?'; end else if @EVENT_TYPE = 'BJ_CANCELLED' begin update OD_DOCS set ID = 0, STATE = 3 where ID = @CLISER_ID; --REJECT = Отмена обработки end else if @EVENT_TYPE = 'BJ_GATEWAY_REJECT' begin update OD_DOCS set ID = 0, STATE = 3 where ID = @CLISER_ID; --REJECT = Отмена обработки --ОНО по строке, и не понятно что делать 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 in ( 'BJ_ORDER_LATE', 'BJ_PING', 'BJ_QUIK_BLOCKED', 'BJ_QUIK_RELEASED', 'BJ_QUIK_SIGNED', 'BJ_QUIK_DEPOSITED' ) begin print 'ничего не делать'; end else begin set @RAISERROR = 'От сервиса BJ получено неизвестное событие ' + @EVENT_TYPE; raiserror (@RAISERROR, 16, 1); end;