CREATE OR ALTER procedure [dbo].[FTV_M2M_PROCESS_CREATE] (@ID int) /* TODO: Дата поручения - сейчас getdate, но можно передавать, для этого ввести пновое поле в FTV_M2M, или потом брать з события и изменять Для входящий переводов из СПБ возможно следует дать raiserror */ as set nocount on; if user = 'dbo' execute as user = 'SYSDBA'; print 'FTV_M2M_PROCESS_CREATE'; print @ID; --Создаем M2M-поручение вместе с подвалом документа declare @WHOS int = 383118, @GUID uniqueidentifier, --шапка @DIRECTION varchar(64), @CONTRAGENT_M2M_CODE varchar(255), @DEPONENT_NAME varchar(255), @DEPONENT_DOC varchar(255), --подвал @REFERENCE varchar(36), @ISIN varchar(12), @SEC_CODE varchar(255), @AMOUNT numeric(25, 7), @PLACE_NUMBER varchar(255), @LINK_NUMBER varchar(128), @DEPO_NUMBER varchar(128), --переменные документа @D_CAT int, @NUM varchar(64), @D_DATE datetime, @CONTRAGENT int, @DEPONENT int, @SHARE int, @PLACE int, @DEPO int, @CLISER_ID int, @FILER_ID int, @FILER_NUM varchar(64), @FILER_DATE datetime, @DOL_ID int; select @GUID = GUID, @DIRECTION = DIRECTION, @CONTRAGENT_M2M_CODE = CONTRAGENT_M2M_CODE, @DEPONENT_NAME = DEPONENT_NAME, @DEPONENT_DOC = DEPONENT_DOC from FTV_M2M where ID = @ID; --1. Критические ошибки --1.1. Неуникальный GUID if exists (select top 1 1 from D_CLISER_M2M where DOC_GUID = @GUID) raiserror ('Неуникальный GUID', 16, 1); --1.2. Направление перевода if @DIRECTION = 'IN' select @D_CAT = ID from OD_DOC_CATS where SYS_NAME = 'I_CLISER_M2M_ZACH' else if @DIRECTION = 'OUT' select @D_CAT = ID from OD_DOC_CATS where SYS_NAME = 'I_CLISER_M2M_SPIS' else raiserror ('Ошибочное направление DIRECTION (должно быть IN, OUT)', 16, 1); --1.3. Контрагент select @CONTRAGENT = C.FACE from OD_FACE_CODERS C left join OD_FACES F on F.SELF_ID = C.CODER and F.LAST_FLAG = 1 where F.MNEM = 'M2M' and C.CODE = @CONTRAGENT_M2M_CODE; if @CONTRAGENT is null raiserror ('Не найден депозитарий-контрагент', 16, 1); --1.4. Депонент select @DEPONENT = F.SELF_ID from OD_FACES F where F.LAST_FLAG = 1 and replace(F.NAME, ' ', '') = replace(@DEPONENT_NAME, ' ', '') and replace(F.DOC_SER + F.DOC_NUM, ' ', '') = replace(@DEPONENT_DOC, ' ', '') --1.5. Шапка документа exec GEN_ID 'OD_DOC_ID_GEN', 1, @CLISER_ID out; --TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! set @D_DATE = getdate(); exec FU_NEXT_DOC_NUM @D_CAT, @D_DATE, null, @CLISER_ID, @NUM out, null; insert into OD_DOCS (ID, NUM, PARAM, D_CAT, D_DATE, STATE, DIRECTION, WHOS, KVIT) select @CLISER_ID, @NUM, null, @D_CAT, @D_DATE, 0, 0, @WHOS, null; insert into D_CLISER_M2M (DOC, DEPONENT, DOC_GUID, DOC_STATUS, IIS_TYPE, IIS_INN, IIS_NUM, IIS_DATE) select @CLISER_ID, @DEPONENT, @GUID, 0, 0, null, null, null; if @DIRECTION = 'IN' insert into OD_IN_DOCS (DOC, FROM_FACE, PASS_KIND) values (@CLISER_ID, @CONTRAGENT, 8); else if @DIRECTION = 'OUT' insert into OD_OUT_DOCS (DOC, TO_FACE, PASS_KIND) values (@CLISER_ID, @CONTRAGENT, 8); --1.6. Обогащаем FTV_M2M update FTV_M2M set DOC = @CLISER_ID, CONTRAGENT = @CONTRAGENT, DEPONENT = @DEPONENT where GUID = @GUID; --1.7. Подвал документа (только в курсоре) declare cur cursor local fast_forward read_only for select ML.REFERENCE, ML.ISIN, ML.SEC_CODE, ML.AMOUNT, ML.PLACE_NUMBER, ML.LINK_NUMBER, ML.DEPO_NUMBER from FTV_M2M_LINES ML join FTV_M2M M on M.GUID = ML.GUID where ML.GUID = @GUID and ML.STATE = 'TODO' order by ML.ID; open cur; while 0 = 0 begin fetch next from cur into @REFERENCE, @ISIN, @SEC_CODE, @AMOUNT, @PLACE_NUMBER, @LINK_NUMBER, @DEPO_NUMBER; if @@FETCH_STATUS <> 0 break; --Бумага select @SHARE = V.ID from OD_VALUES V left join OD_VALUE_CODERS C on C.SHARE = V.ID left join OD_FACES F on F.SELF_ID = C.CODER and F.LAST_FLAG = 1 where V.ISIN = @ISIN and F.MNEM = 'НДЦ' and C.CODE = @SEC_CODE; --Счет МХ select @PLACE = C.ID from OD_CLIENTS C left join OD_CLIENTS_REC CR on CR.CLIENT = C.SELF_ID and CR.E_DATE = '9999-01-01' where C.NUMBER like '%' + @PLACE_NUMBER + '%' and CR.LINK_NUMBER = @LINK_NUMBER; --Счет клиента select @DEPO = C.ID from OD_CLIENTS C where C.NUMBER = @DEPO_NUMBER; exec GEN_ID 'OD_DOL_ID_GEN', 1, @DOL_ID out; insert into OD_DOLS (ID, DOC) values (@DOL_ID, @CLISER_ID); insert into D_CLISER_M2M_DOL (DOL, SHARE, AMOUNT, DOL_REF, PLACE, CLIENT) values (@DOL_ID, @SHARE, @AMOUNT, @REFERENCE, @PLACE, @DEPO); --Обогащаем FTV_M2M_LINES update FTV_M2M_LINES set STATE = 'SUCCESS', DOC = @CLISER_ID, DOL = @DOL_ID, SHARE = @SHARE, PLACE = @PLACE, DEPO = @DEPO where GUID = @GUID and REFERENCE = @REFERENCE; end; close cur; deallocate cur; --1.8. Входящая запись только для списания (исходящего перевода OUT) if @DIRECTION = 'OUT' begin exec GEN_ID 'OD_DOC_ID_GEN', 1, @FILER_ID out; --TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! set @FILER_DATE = getdate(); exec FU_NEXT_DOC_NUM @D_CAT, @FILER_DATE, null, @FILER_ID, @FILER_NUM out, null; insert into OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS) values (@FILER_ID, @FILER_NUM, 255, @FILER_DATE, 2, 1, @WHOS); insert into D_FILER (DOC, PASS_KIND, RUBRICA, COMMENT, DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT) values (@FILER_ID, 7, 173, 'M2M поручение на списание через MOEX-МОСТ', @NUM, cast(@D_DATE as date), @DEPONENT, @DEPONENT, @DEPO, @PLACE, @FILER_DATE, @D_CAT); --Связываем с М2М-поручением update OD_DOCS set ID = 0, KVIT = @FILER_ID where ID = @CLISER_ID; end;