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
This commit is contained in:
@@ -1,188 +1,209 @@
|
||||
CREATE OR ALTER procedure [dbo].[FTV_M2M_PROCESS_CREATE] (@ID int)
|
||||
|
||||
--grant execute on FTV_M2M_PROCESS_CREATE to public;
|
||||
|
||||
/*
|
||||
TODO:
|
||||
Дата поручения - сейчас getdate, но можно передавать, для этого ввести пновое поле в FTV_M2M, или потом брать з события и изменять
|
||||
Для входящий переводов из СПБ возможно следует дать raiserror
|
||||
*/
|
||||
/*
|
||||
TODO:
|
||||
Дата поручения - сейчас getdate, но можно передавать, для этого ввести пновое поле в FTV_M2M, или потом брать из события и изменять
|
||||
Для входящих переводов из СПБ возможно следует дать raiserror (но это должен делать bj)
|
||||
*/
|
||||
|
||||
as
|
||||
set nocount on;
|
||||
as
|
||||
set nocount on;
|
||||
|
||||
if user = 'dbo' execute as user = 'SYSDBA';
|
||||
if user = 'dbo' execute as user = 'SYSDBA';
|
||||
|
||||
print 'FTV_M2M_PROCESS_CREATE';
|
||||
print @ID;
|
||||
print 'FTV_M2M_PROCESS_CREATE';
|
||||
print @ID;
|
||||
|
||||
--Создаем M2M-поручение вместе с подвалом документа
|
||||
--Создаем 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;
|
||||
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;
|
||||
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. Критические ошибки
|
||||
--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.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.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.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();
|
||||
--1.5. Шапка документа
|
||||
exec GEN_ID 'OD_DOC_ID_GEN', 1, @CLISER_ID out;
|
||||
set @D_DATE = getdate();
|
||||
|
||||
exec FU_NEXT_DOC_NUM @D_CAT, @D_DATE, null, @CLISER_ID, @NUM out, null;
|
||||
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 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;
|
||||
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);
|
||||
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.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.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;
|
||||
--1.8. Входящая запись только для списания (исходящего перевода OUT)
|
||||
if @DIRECTION = 'OUT' begin
|
||||
exec GEN_ID 'OD_DOC_ID_GEN', 1, @FILER_ID out;
|
||||
|
||||
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;
|
||||
set @FILER_DATE = getdate();
|
||||
|
||||
--Бумага
|
||||
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;
|
||||
exec FU_NEXT_DOC_NUM 'D_FILER', @FILER_DATE, 1, @FILER_ID, @FILER_NUM out, null;
|
||||
|
||||
--Счет МХ
|
||||
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;
|
||||
insert into OD_DOCS
|
||||
(ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS)
|
||||
values
|
||||
(@FILER_ID, @FILER_NUM, 255, @FILER_DATE, 2, 1, @WHOS);
|
||||
|
||||
--Счет клиента
|
||||
select @DEPO = C.ID
|
||||
from OD_CLIENTS C
|
||||
where C.NUMBER = @DEPO_NUMBER;
|
||||
insert into D_FILER
|
||||
(DOC, PASS_KIND, RUBRICA, COMMENT, DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS)
|
||||
values
|
||||
(@FILER_ID, 7, 8, 'M2M поручение на списание через MOEX-МОСТ', @NUM, cast(@D_DATE as date), @DEPONENT, @DEPONENT, @DEPO, @PLACE, @FILER_DATE, @D_CAT, cast(@GUID as varchar(36)));
|
||||
|
||||
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;
|
||||
--Связываем с М2М-поручением
|
||||
update OD_DOCS set ID = 0, KVIT = @FILER_ID where ID = @CLISER_ID;
|
||||
end;
|
||||
|
||||
Reference in New Issue
Block a user