create procedure dbo.%PROC% @moment varchar(30) = null, /*Дата*/ @contract varchar(30) = null, /*Номер договора*/ @deal_time varchar(30) = null, /*Время сделки*/ @direct_no varchar(20) = null, /*Номер поручения (внутрибиржевого)*/ @emi_code varchar(50) = null, /*Шифр бумаги */ @deal_code varchar(30) = null, /*Шифр типа сделки*/ @deal_account varchar(50) = null, /*Код торгового счета*/ @price decimal(18,8) = null, /*Цена бумаги*/ @qty money = null, /*Количество ЦБ (лотов)*/ @deal_sum decimal(18,8) = null, /*Сумма сделки*/ @comis decimal(18,8) = null, /*Комиссия*/ @com_settle decimal(18,8) = null, /*Клиринговая комиссия*/ @brok_code varchar(50) = null, /*Шифр брокера*/ @company_code varchar(50) = null, /*Шифр клиенского договора?*/ @client_code varchar(50) = null, /*Код инвестора (клиента)/комментарий(код раздела учета/поручение); */ @nkd decimal(18,4) = null, /*НКД*/ @is_repo_rps varchar(255) = null, /*Сделка обычная, Неполные лоты, РПС или РЕПО*/ @exec_code varchar(50) = null, /*Код исполнения сделки (R14 - РЕПО 14 дней)*/ @repo_percent decimal(18,4) = null, /*Ставка РЕПО*/ @repo_price decimal(18,8) = null, /*Цена второй части РЕПО*/ @contragent varchar(50) = null, /*Код контрагента*/ ------------------Параметры из морды--------------------------- @external_broker_id_s varchar(30) = null, /*Внешний брокер*/ @organisation_id_s varchar(30) = null, /*Владелец*/ @dealing_look_s varchar(10) = null, /*Характер сделки (прямая/внешняя)*/ @broker_id_s varchar(30) = null, @rate_place_id_s varchar(30) = null, /*Площадка*/ @format_own_id_s varchar(30) = null, /*Код формата поля @client_code для собственных сделок из простого справочника 10001*/ @format_client_id_s varchar(30) = null, /*Код формата поля @client_code для клиентских сделок из простого справочника 10000*/ @quitovka int = null as declare @action_id numeric, @id numeric, @user_id numeric, @state_id numeric, @type_id numeric, @item_name varchar(100), @new_state_id numeric begin tran /* Шаблон метода вставки */ select @action_id = %ACTION_ID% .CHECK_USER .CHECK_INSERT .GET_PROPS declare @var varchar(50) declare @var1 varchar(50) declare @var2 varchar(50) declare @var3 varchar(50) declare @var_tmp varchar(50) declare @direction varchar(50) declare @deal_date datetime, @deal_time_t datetime, @sale_or_bay numeric, @value_id numeric, @investor_id numeric, @client_contract_id numeric, --@external_broker_id numeric, @dealing_look int, @qty_in_lot numeric, @repo_type_id numeric, @regime_deal int, @days_for_exec int, @repo_corresp_deal_sum money, @date_2part datetime, @coupon_account_sum_forone money, @date_of_cur datetime, @target_cur money, @summ2unkd money, -- @sale_type_id numeric, @org_contracts_id numeric, @days_for_exec_s varchar(10), @cntt int, @is_entry_cd int, @rate_place_id numeric, @stock_class varchar(255), @client_broker_code varchar(50), @client_code_b varchar(50), @is_settle_comis int, /* Выделять клиринговую комиссию (для сделок ЭДО) 0 - складывать комиссию биржи и клиринговую комиссию 1 - раздельно вводить клиринговую и биржевую комиссию */ @deal_acc_char varchar(1) /* В эту переменную заносится первая буква торгового счета S - собственные сделки, D - Доверительное управление, L - обычные сделки */ /* Сохранение форматов в таблицу с целью их дальнейшего использования по умолчанию (пока не работает, таблица есть) delete tb_imp_micex_new insert tb_imp_micex_new (format_own_id_s, format_client_id_s) values (@format_own_id_s, @format_client_id_s) */ select @is_settle_comis=convert(int,(.GET_CONST('SETTLE_COMIS'))) if @is_settle_comis=0 select @comis = isnull(@comis,0) + isnull(@com_settle,0) else if @is_settle_comis=1 .EXIT_MESSAGE('Раздельный учёт биржевой и клиринговой комиссии пока не используется') else .EXIT_MESSAGE('В системе отсутствует константа SETTLE_COMIS или она имеет неверное значение') select @deal_acc_char = substring(@deal_account,1,1) select @stock_class = @is_repo_rps if @quitovka is null select @quitovka = 0 if isnull(@rate_place_id_s,'')<>'' select @rate_place_id = convert(numeric, @rate_place_id_s) else .EXIT_MESSAGE('Площадка не задана') select @dealing_look=convert(int,@dealing_look_s) select @external_broker_id=convert(numeric,@external_broker_id_s) select @deal_date=convert(datetime,@moment,3) --.EXIT_MESSAGE_PARM('@moment',@moment) if @deal_date is null begin .EXIT_MESSAGE('Не задана дата сделки в ТС') end if @contract is null begin .EXIT_MESSAGE('Не задан номер сделки в ТС') end select @deal_time_t=convert(datetime,@deal_time,8) if @deal_time_t is null begin .EXIT_MESSAGE('Не задано время сделки') end if @emi_code is null begin .EXIT_MESSAGE('Не задан биржевой код бумаги') end if @dealing_look is null .EXIT_MESSAGE('Характер сделок не задан') if @dealing_look=2 begin if @external_broker_id is null .EXIT_MESSAGE('Внешний брокер не задан') end /* Вычисление кода инвестора (клиента) , кода раздела учета, кода поручения */ /****************************************************************************/ select @var = @client_code if patindex('%/%', @var) = 0 begin select @var1 = @var select @var2 = null select @var3 = null end else begin select @var1 = substring(@var, 1, patindex('%/%', @var)-1) select @var_tmp = substring(@var, patindex('%/%', @var)+1, 50) if patindex('%/%', @var_tmp) = 0 and isnull(@var_tmp,'')<>'' select @var2 = @var_tmp if patindex('%/%', @var_tmp) > 0 and isnull(@var_tmp,'')<>'' begin select @var2 = substring(@var_tmp, 1, patindex('%/%', @var_tmp)-1) select @var_tmp = substring(@var_tmp, patindex('%/%', @var_tmp)+1, 50) end if patindex('%/%', @var_tmp) = 0 and isnull(@var_tmp,'')<>'' select @var3 = @var_tmp if patindex('%/%', @var_tmp) > 0 and isnull(@var_tmp,'')<>'' begin select @var3 = substring(@var_tmp, 1, patindex('%/%', @var_tmp)-1) select @var_tmp = substring(@var_tmp, patindex('%/%', @var_tmp)+1, 50) end end if isnull(@var1,'')='' select @var1=null if isnull(@var2,'')='' select @var2=null if isnull(@var3,'')='' select @var3=null -- Если сделка собственная if upper(@deal_acc_char)='S' begin if @format_own_id_s='1' begin select @client_code = null select @client_broker_code = @var1 select @direction = @var2 end if @format_own_id_s='2' begin select @client_code = null select @client_broker_code = @var2 select @direction = @var1 end if @format_own_id_s='3' begin select @client_code = @var1 select @client_broker_code = @var2 select @direction = @var3 end if @format_own_id_s='4' begin select @client_code = @var1 select @client_broker_code = @var3 select @direction = @var2 end end else -- Если сделка клиентская begin if @format_client_id_s='1' begin select @client_code = @var1 select @client_broker_code = null select @direction = @var2 end if @format_client_id_s='2' begin select @client_code = @var1 select @client_broker_code = @var2 select @direction = @var3 end if @format_client_id_s='3' begin select @client_code = @var1 select @client_broker_code = @var3 select @direction = @var2 end end /*** Конец вычисления кода клиента , раздела учета, поручения ******************/ /*** Проверка ЦБ с одинаковыми кодами *******************************/ select @cntt=(select count (t_item2class.item_id) from t_item2class,t_classes,t_classvalues where upper(t_item2class.code)=upper(ltrim(rtrim(@emi_code))) and t_classes.code='SALE_STOCKS' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'td_stock_emis')) if @cntt > 1 .EXIT_MESSAGE('В системе имеются бумаги с одинаковыми кодами в классификаторе Бумаги, участвующие в торгах') /*********************************************************************/ select @stock_id=(select t_item2class.item_id from t_item2class,t_classes,t_classvalues where upper(ltrim(rtrim(t_item2class.code)))=upper(ltrim(rtrim(@emi_code))) and upper(ltrim(rtrim(t_classes.code)))='SALE_STOCKS' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS(t_item2class.item_id)) if @stock_id is null begin .EXIT_MESSAGE('Бумага не найдена') end select @value_id=(select t_item2class.value_id from t_item2class,t_classes,t_classvalues where upper(t_item2class.code)=upper(ltrim(rtrim(@emi_code))) and t_classes.code='SALE_STOCKS' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS(t_item2class.item_id)) /*** Проверка площадок с одинаковыми кодами ******************************/ select @cntt=(select count (t_item2class.item_id) from t_item2class,t_classes,t_classvalues where t_classes.code='SALE_STOCKS' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=@value_id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'rate_places')) if @cntt > 1 .EXIT_MESSAGE('В системе имеются площадки с одинаковыми кодами') /**************************************************************************/ /* Теперь площадка вводится из морды select @sale_place_id=(select t_item2class.item_id from t_item2class,t_classes,t_classvalues where t_classes.code='SALE_STOCKS' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=@value_id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'rate_places')) if @sale_place_id is null .EXIT_MESSAGE('Площадка не найдена') */ select @sale_place_id=@rate_place_id --declare @cl_id numeric if isnull(ltrim(rtrim(@contragent)),'')<>'' begin select @contragent_id=t_item2class.item_id, @value_id=t_item2class.value_id from t_item2class,t_classes,t_classvalues where upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(@contragent))) and t_classes.code='INVESTOR2EXCHANGE' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'PARTNERS_JUR') if @contragent_id is null .EXIT_MESSAGE('Контрагент не найден') end else begin /* Если в листинге ММВБ не указан контрагент, то контрагент - биржа */ select @contragent = t_partners.partner_code from t_partners where t_partners.id=(select client_id from tb_contracts where id=(select min(tb_contracts.id) from tb_contracts,tb_broker2exchange where tb_broker2exchange.exchange_id=@sale_place_id and tb_contracts.id=tb_broker2exchange.ext_broker_deal and .ITEMS_EXISTS_BY_TYPE(tb_broker2exchange.id,'broker2exchange') and .ITEMS_EXISTS_BY_TYPE(tb_contracts.id,'organization_contracts') and tb_contracts.dog_type_id=2)) select @contragent_id=t_item2class.item_id, @value_id=t_item2class.value_id from t_item2class,t_classes,t_classvalues where upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(@contragent))) and t_classes.code='INVESTOR2EXCHANGE' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'PARTNERS_JUR') end select @cur_id=(select td_rate_places.cur_id from td_rate_places where id=@sale_place_id) if @deal_code is null begin .EXIT_MESSAGE('Не задан тип сделки') end if upper(ltrim(rtrim(@deal_code)))='B' select @sale_or_bay=1 else if upper(ltrim(rtrim(@deal_code)))='S' select @sale_or_bay=2 if isnull(@price,0)=0 .EXIT_MESSAGE('Цена ЦБ не задана') select @stock_price=convert(decimal(18,8),@price) if isnull(@qty,0)=0 .EXIT_MESSAGE('Количество ЦБ не задано') if isnull(@deal_sum,0)=0 .EXIT_MESSAGE('Сумма сделки не задана') select @summ_doc_total=@deal_sum select @value_id=null if isnull(ltrim(rtrim(@client_code)),'')<>'' begin /* select @investor_id=t_item2class.item_id, @value_id=t_item2class.value_id from t_item2class,t_classes,t_classvalues where upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(rtrim(@client_code)))) and t_classes.code='INVESTOR2EXCHANGE' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'client_contracts') */ /* Теперь инвестор вычисляется не только по коду клиента, но и по площадке, поскольку клиент на разных площадках (в классификаторе "Инвесторы на биржах") может иметь один и тот же код */ select @value_id=t_item2class.value_id from t_item2class,t_classes,t_classvalues where upper(ltrim(rtrim(t_classes.code)))='INVESTOR2EXCHANGE' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and t_item2class.item_id=@sale_place_id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'RATE_PLACES') select @investor_id=t_item2class.item_id from t_item2class,t_classes,t_classvalues where t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and t_item2class.value_id=@value_id and upper(ltrim(rtrim(t_classes.code)))='INVESTOR2EXCHANGE' and upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(rtrim(@client_code)))) and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'client_contracts') and .ITEMS_EXISTS_BY_TYPE_STATE(t_item2class.item_id,'client_contracts','SIGN') --.EXIT_MESSAGE_PARM('XXX',@investor_id) select @cntt=(select count (client_id) from tb_contracts where id=@investor_id) if @cntt > 1 .EXIT_MESSAGE('Повторяющиеся коды клиентских договоров в классификаторе Инвесторы на биржах') select @client_id=(select client_id from tb_contracts where id=@investor_id) select @character_id=2 -- Клиентская select @client_contract_id=@investor_id if @dealing_look=2 begin if @investor_id is null begin /* select @investor_id=t_item2class.item_id, @value_id=t_item2class.value_id from t_item2class,t_classes,t_classvalues where upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(@client_code))) and t_classes.code='INVESTOR2EXCHANGE' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'BROKER_INFO') */ /* Теперь инвестор вычисляется не только по коду клиента, но и по площадке, поскольку клиент на разных площадках (в классификаторе "Инвесторы на биржах") может иметь один и тот же код */ select @value_id=t_item2class.value_id from t_item2class,t_classes,t_classvalues where upper(ltrim(rtrim(t_classes.code)))='INVESTOR2EXCHANGE' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and t_item2class.item_id=@sale_place_id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'RATE_PLACES') select @investor_id=t_item2class.item_id from t_item2class,t_classes,t_classvalues where t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and t_item2class.value_id=@value_id and upper(ltrim(rtrim(t_classes.code)))='INVESTOR2EXCHANGE' and upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(rtrim(@client_code)))) and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'BROKER_INFO') select @character_id=1 -- Дилерская end end end else begin if @dealing_look=1 begin if @investor_id is null begin select @character_id=1 select @investor_id=convert(numeric,@broker_id_s) end end end if @investor_id is null .EXIT_MESSAGE_PARM('Инвестор не найден',@client_code) if @value_id is not null begin --.EXIT_MESSAGE_PARM('@sale_place_id', @sale_place_id) --.EXIT_MESSAGE_PARM('@value_id', @value_id) if not exists (select 1 from t_item2class,t_classes,t_classvalues where t_classes.code='INVESTOR2EXCHANGE' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=@value_id and t_item2class.value_id=t_classvalues.id and t_item2class.item_id=@sale_place_id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'rate_places')) .EXIT_MESSAGE('Инвестор на заданной площадке не найден') end select @owner_id=convert(numeric,@organisation_id_s) if @owner_id is null .EXIT_MESSAGE('Брокер не задан') declare @props_inv_id numeric, @portfolio_sub_inv_id numeric, @portfolio_inv_id numeric, @portfolio_inv_comm_id numeric, @count int declare @act_state_id numeric, @type_doc_id numeric .TYPE_ID_FROM_CODE('PORTFOLIO_SECTION',@type_doc_id) select @act_state_id=.STATE_ID_FROM_CODE(@type_doc_id,'ACT') /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /* Брокер является нашим клиентом и имеет собственных клиентов */ /* Поиск балансового портфеля по коду клиента и id договора с брокером */ select @cntt=(select count(t_item2class.item_id) from t_item2class,t_classes,t_classvalues,tb_portfolio_section where t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and tb_portfolio_section.id=t_item2class.item_id and tb_portfolio_section.investor_id=@client_id and upper(ltrim(rtrim(t_classes.code)))='PORTFOLIO2EXCHANGE' and upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(@client_broker_code))) and .ITEMS_EXISTS_BY_STATE(tb_portfolio_section.id,@act_state_id) -- для выделения "портфеля по умолчанию", в который субклиенты привязываются. коряво это все and tb_portfolio_section.is_default=1) if @cntt > 1 .EXIT_MESSAGE('В системе имеются разделы учета с одинаковыми кодами в классификаторе Разделы учета на биржах') select @portfolio_sub_inv_id=t_item2class.item_id from t_item2class,t_classes,t_classvalues,tb_portfolio_section where t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and tb_portfolio_section.id=t_item2class.item_id and tb_portfolio_section.investor_id=@investor_id and upper(ltrim(rtrim(t_classes.code)))='PORTFOLIO2EXCHANGE' and upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(@client_broker_code))) and .ITEMS_EXISTS_BY_STATE(tb_portfolio_section.id,@act_state_id) and tb_portfolio_section.is_default=1 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ if @portfolio_sub_inv_id is null begin /* Вычисление количества разделов учета, если сделка не РЕПО */ ---if (@sale_or_bay = 2 and @is_repo_rps = 'РЕПО') or @is_repo_rps <> 'РЕПО' or @is_repo_rps is null ---begin select @count=(select count(*) from tb_portfolio_section where investor_id=@investor_id and (tb_portfolio_section.method_id <> 4 or tb_portfolio_section.method_id is null) and .ITEMS_EXISTS_BY_TYPE(tb_portfolio_section.id,'portfolio_section') and .ITEMS_EXISTS_BY_STATE(tb_portfolio_section.id,@act_state_id) and tb_portfolio_section.is_default=1) /*==============================================*/ /* Разделов учета может быть много, но в статусе "Создан" должен быть только один балансовый портфель, остальные - в статусе блокирован -- и притом он должен быть портфелем по умончанию, а сколько созданных - не важно */ if @count>1 .EXIT_MESSAGE('Количество разделов учета инвестора, используемых по умолчанию > 1') else if @count=0 .EXIT_MESSAGE('Раздел учета инвестора, используемый по умолчанию - не найден') else select @portfolio_sub_inv_id= (select id from tb_portfolio_section where investor_id=@investor_id and (tb_portfolio_section.method_id <> 4 or tb_portfolio_section.method_id is null) and .ITEMS_EXISTS_BY_TYPE(tb_portfolio_section.id,'portfolio_section') and .ITEMS_EXISTS_BY_STATE(tb_portfolio_section.id,@act_state_id) and tb_portfolio_section.is_default=1) ---end end .TYPE_ID_FROM_CODE('PORTFOLIO2INVESTOR',@type_doc_id) select @act_state_id=.STATE_ID_FROM_CODE(@type_doc_id,'ACT') select @portfolio_inv_comm_id=(select min(t_item2class.item_id) from t_item2class,t_classes,t_classvalues where t_classes.code='COMMON' and t_classvalues.class_id=t_classes.id and t_item2class.value_id=t_classvalues.id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'portfolio')) select @count=(select count(*) from tb_portfolio2investor where investor_id=@investor_id and .ITEMS_EXISTS_BY_TYPE(tb_portfolio2investor.id,'portfolio2investor') and .ITEMS_EXISTS_BY_STATE(tb_portfolio2investor.id,@act_state_id)) select @portfolio_inv_id=(select min(portfolio_id) from tb_portfolio2investor where investor_id=@investor_id and .ITEMS_EXISTS_BY_TYPE(tb_portfolio2investor.id,'portfolio2investor') and .ITEMS_EXISTS_BY_STATE(tb_portfolio2investor.id,@act_state_id)) if @count<=1 begin if @count=0 select @portfolio_inv_id=@portfolio_inv_comm_id end if @portfolio_inv_id is null .EXIT_MESSAGE('Портфель инвестора не найден либо их количество > 1') /*==============================================*/ if patindex('%:%', @is_repo_rps) > 0 begin select @is_repo_rps = upper(ltrim(rtrim(substring(@is_repo_rps, 1, patindex('%:%', @is_repo_rps)-1)))) end .TYPE_ID_FROM_CODE('OFFICIAL_PROPS',@type_doc_id) select @act_state_id=.STATE_ID_FROM_CODE(@type_doc_id,'ACT') select @count=(select count(*) from tb_official_props where investor_id=@investor_id and rate_place_id=@sale_place_id and portfolio_sub_id=@portfolio_sub_inv_id and .ITEMS_EXISTS_BY_TYPE(tb_official_props.id,'official_props') and .ITEMS_EXISTS_BY_STATE(tb_official_props.id,@act_state_id)) if @count>1 .EXIT_MESSAGE('Количество возможных реквизитов раздела учета инвестора для использования на данной площадке > 1') select @props_inv_id=(select id from tb_official_props where investor_id=@investor_id and rate_place_id=@sale_place_id and portfolio_sub_id=@portfolio_sub_inv_id and .ITEMS_EXISTS_BY_TYPE(tb_official_props.id,'official_props') and .ITEMS_EXISTS_BY_STATE(tb_official_props.id,@act_state_id)) if @props_inv_id is null begin /* select @count=(select count(*) from tb_official_props where investor_id=@investor_id and rate_place_id=@sale_place_id and .ITEMS_EXISTS_BY_TYPE_STATE(tb_official_props.id,'official_props','ACT') and .ITEMS_EXISTS_BY_TYPE(tb_official_props.asset_place_id,'BROKER2EXCHANGE') or .ITEMS_EXISTS_BY_TYPE(tb_official_props.asset_place_id,'BROKER_INFO')) */ -- tb_official_props - реквизиты лица select @count=(select count(*) from tb_official_props where investor_id=@investor_id and rate_place_id=@sale_place_id and .ITEMS_EXISTS_BY_TYPE(tb_official_props.id,'official_props') and .ITEMS_EXISTS_BY_STATE(tb_official_props.id,@act_state_id)) if @count>1 .EXIT_MESSAGE('Количество возможных реквизитов инвестора для использования на данной площадке > 1') else if @count=0 .EXIT_MESSAGE('Реквизитов инвестора для использования на данной площадке - не найдены') else select @props_inv_id=(select id from tb_official_props where investor_id=@investor_id and rate_place_id=@sale_place_id and .ITEMS_EXISTS_BY_TYPE(tb_official_props.id,'official_props') and .ITEMS_EXISTS_BY_STATE(tb_official_props.id,@act_state_id)) end -- Если не найден балансовый портфель по информации после слэша в поле @client_code исходного файла /* select @props_inv_id=(select id from tb_official_props where investor_id=@investor_id and rate_place_id=@sale_place_id and .ITEMS_EXISTS_BY_TYPE_STATE(tb_official_props.id,'official_props','ACT') and .ITEMS_EXISTS_BY_TYPE(tb_official_props.asset_place_id,'BROKER2EXCHANGE') or .ITEMS_EXISTS_BY_TYPE(tb_official_props.asset_place_id,'BROKER_INFO')) */ declare @sid varchar(30), @depo_subacc_id numeric, @bank_account_id numeric, @asset_place_id numeric select @depo_subacc_id=depo_account_id, @bank_account_id=bank_account_id, @asset_place_id=asset_place_id from tb_official_props where id=@props_inv_id /* Количество штук в лоте отныне не нужно, теперь будем сумму делить на цену select @qty_in_lot = td_stock_lots.stock_qty from td_stock_lots where .ITEMS_EXISTS(td_stock_lots.id) and td_stock_lots.stock_id = @stock_id if @qty_in_lot is null .EXIT_MESSAGE('Количество ЦБ в лоте не задано') */ -- Режим торгов по умолчанию с кодом 1 - сессия и вторичные торги -- Целевое назначение сделки по умолчанию с кодом 53 - обычная сделка select @repo_type_id = t_purposes.id from t_purposes where code=53 select @sale_type_id = 1 -- Если режим аукциона if patindex('%Аукцион%', @is_repo_rps) > 0 or patindex('%аукцион%', @is_repo_rps) > 0 or patindex('%АУКЦИОН%', @is_repo_rps) > 0 begin select @sale_type_id = 2 end -- Если режим неполных лотов if patindex('%Неполные%', @is_repo_rps) > 0 or patindex('%неполные%', @is_repo_rps) > 0 or patindex('%НЕПОЛНЫЕ%', @is_repo_rps) > 0 begin select @sale_type_id = 5 end /* if patindex('%Облиг%', @is_repo_rps) > 0 select @price=(@deal_sum+isnull(@nkd,0))/@qty, @is_entry_cd=1 else select @qty=@deal_sum/@price, @is_entry_cd=0 select @deal_units=1 */ declare @stock_class_type_id numeric select @stock_class_type_id=(select t_stock_types.stock_type_id from t_stock_types,td_stock_emis where td_stock_emis.id=@stock_id and t_stock_types.id=td_stock_emis.stock_type_id) if @stock_class_type_id=2 begin /* Способ ввода данных - обычный, поскольку сумма в листинге в рублях и цена тоже пересчитывается в рубли из процентов к номиналу */ select @deal_units=1 select @is_entry_cd=convert(int,(.GET_CONST('ENTRY_CD'))) --- if @is_entry_cd=1 --- select @price=(@deal_sum+isnull(@nkd,0))/@qty --- if @is_entry_cd=0 select @price=@deal_sum/@qty if @is_entry_cd<>0 and @is_entry_cd<>1 .EXIT_MESSAGE('Неверное значение константы ENTRY_CD (Купонный доход входит (1) или не входит (0) в сумму сделки). Значение должно быть 1 или 0.') if @is_entry_cd is null .EXIT_MESSAGE('Не найдена константа ENTRY_CD (Купонный доход входит (1) или не входит (0) в сумму сделки). Создайте константу.') end else begin select @qty=convert(decimal(18,4),(convert(decimal(18,8),@summ_doc_total)/@price)), @is_entry_cd=0 select @deal_units=1 /* Обычный способ ввода данных */ end select @stock_price=convert(decimal(18,8),@price) -- Вычисление количества дней на исполнение if @exec_code is null select @days_for_exec = 0 else begin select @days_for_exec_s = rtrim(ltrim(substring(@exec_code,2,50))) select @days_for_exec = convert(int,@days_for_exec_s) end -- Извлечение номера кода расчетов из простого справочника /* select @regime_deal = t1.id from t_simples t1 where t1.type_id = 5014 and t1.simple_name=upper(rtrim(ltrim(substring(@exec_code,1,1)))) */ select @regime_deal=( case upper(rtrim(ltrim(substring(@exec_code,1,1)))) when 'T' then 1 when 'B' then 2 when 'R' then 3 end) if @regime_deal is null select @regime_deal=1 if patindex('%:%', @is_repo_rps) > 0 begin select @is_repo_rps = upper(ltrim(rtrim(substring(@is_repo_rps, 1, patindex('%:%', @is_repo_rps)-1)))) end /* Сделка покупки - РЕПО */ if @is_repo_rps = 'РЕПО' and @sale_or_bay = 1 begin if @repo_price is null .EXIT_MESSAGE('Цена второй части в сделке РЕПО не задана') if @repo_price=0 .EXIT_MESSAGE('Цена второй части в сделке РЕПО равна нулю') select @repo_type_id = t_purposes.id from t_purposes where code=54 select @repo_corresp_deal_sum = @qty*@repo_price select @date_2part = dateadd(dd,@days_for_exec,@deal_date) select @sale_type_id = 4 /* Определение количества разделов учета инвестора с методом списания РЕПО */ /* select @count=(select count(*) from tb_portfolio_section where investor_id=@investor_id and method_id = 4 and .ITEMS_EXISTS_BY_TYPE(tb_portfolio_section.id,'portfolio_section')) if @count>1 .EXIT_MESSAGE('Количество разделов учета инвестора с методом списания РЕПО > 1') else if @count=0 .EXIT_MESSAGE('Раздел учета инвестора с методом списания РЕПО - не найден ') else select @portfolio_sub_inv_id= (select id from tb_portfolio_section where investor_id=@investor_id and method_id = 4 and .ITEMS_EXISTS_BY_TYPE(tb_portfolio_section.id,'portfolio_section')) */ end /* Сделка продажи - РЕПО*/ if @is_repo_rps = 'РЕПО' and @sale_or_bay = 2 begin if @repo_price is null .EXIT_MESSAGE('Цена второй части в сделке РЕПО не задана') if @repo_price=0 .EXIT_MESSAGE('Цена второй части в сделке РЕПО равна нулю') select @repo_type_id = t_purposes.id from t_purposes where code=55 select @repo_corresp_deal_sum = @qty*@repo_price select @date_2part = dateadd(dd,@days_for_exec,@deal_date) select @sale_type_id = 4 /* Определение количества разделов учета инвестора с методом списания РЕПО */ /* select @count=(select count(*) from tb_portfolio_section where investor_id=@investor_id and method_id = 4 and .ITEMS_EXISTS_BY_TYPE(tb_portfolio_section.id,'portfolio_section')) if @count>1 .EXIT_MESSAGE('Количество разделов учета инвестора с методом списания РЕПО > 1') else if @count=0 .EXIT_MESSAGE('Раздел учета инвестора с методом списания РЕПО - не найден ') else select @portfolio_sub_inv_id= (select id from tb_portfolio_section where investor_id=@investor_id and method_id = 4 and .ITEMS_EXISTS_BY_TYPE(tb_portfolio_section.id,'portfolio_section')) */ end if @is_repo_rps = 'РПС' --- and upper(rtrim(ltrim(@exec_code)))<>'T0' begin select @repo_type_id = t_purposes.id from t_purposes where code=76 select @date_2part = dateadd(dd,@days_for_exec,@deal_date) select @sale_type_id = 3 end /* if isnull(rtrim(ltrim(@client_code)),'') = '' begin select @client_code = t_partners.partner_code from t_partners where t_partners.id = .ORGANIZATION end */ /* Вычислять КД здесь не нужно, поскольку он вычисляется в методе вызываемом в EXEC_ACTION /*** Вычисление купонного дохода, если он не задан ***/ if isnull(@nkd,0)=0 begin .BACK_CALC_COUPON(@stock_id,@qty,@deal_date,1,@coupon_account_sum,@coupon_cur_id) -- .BACK_CALC_COUPON(@stock_id,@plan_money,@deal_date,@coupon_account_sum_forone,@coupon_cur_id) -- select @coupon_account_sum=round(@coupon_account_sum_forone*@qty,2) -- Проверка курса валюты на дату и конвертация купонного дохода (вычисление КД в валюте сделки) .TEST_RATE2CUR2DATE(@deal_date,@cur_id) .CONVERT_SUM(@coupon_cur_id,@cur_id,@deal_date,0,@coupon_account_sum,@coupon_deal_sum,@target_cur,@date_of_cur) -- Вычисление суммы с купонным select @summ2unkd = @summ_doc_total+isnull(@coupon_deal_sum,0) end else begin select @coupon_deal_sum = @nkd select @summ2unkd = @summ_doc_total+isnull(@coupon_deal_sum,0) end /*** Конец вычисления купонного дохода ***/ */ /* Сравнение производится по сумме полей (номер транзакции и покупка-продажа) поскольку могут быть сделки с одним номером, но одна - покупка, другая - продажа */ declare @deal_id numeric /* select @deal_id=tb_baysale_docitems.id from tb_baysale_docitems,t_types,td_depo_docs,.ACTUAL_TABLES where (isnull(tb_baysale_docitems.transaction_no,'')+(case tb_baysale_docitems.ticket_type_id when 1 then 'B' when 2 then 'S' end) )=(upper(ltrim(rtrim(@contract))) + upper(ltrim(rtrim(@deal_code)))) and tb_baysale_docitems.id=t_items.id and td_depo_docs.in_date=@deal_date and td_depo_docs.id=tb_baysale_docitems.id and td_depo_docs.owner_id=@owner_id and t_types.type_code .GROUP_EXISTS_ITEM('dealings') and t_types.id=t_items.type_id .ACTUAL_WHERE(tb_baysale_docitems.id) if @deal_id is null */ declare @deal_doc_type_code varchar(100) if upper(ltrim(rtrim(@deal_code)))='B' begin select @sale_or_bay=1 select @deal_doc_type_code = 'DEALINGS_VIA_BROKER' end else if upper(ltrim(rtrim(@deal_code)))='S' begin select @sale_or_bay=2 select @deal_doc_type_code = 'DEALINGS_VIA_BROKER_SALE' end ----------------------------------------------------------------------------------------- -- Теперь тип документа указывается явно (вместо шаблона .GROUP_EXISTS_ITEM('dealings')), -- поэтому можно не проверять в case "покупка" или "продажа", -- поскольку рассматриваем только тот тип документа, который указан в файле. -- Если сделка не существует, то импортировать сделку if not exists (select 1 from tb_baysale_docitems, t_types, td_depo_docs, t_items, t_states where tb_baysale_docitems.id = t_items.id and td_depo_docs.id = tb_baysale_docitems.id and td_depo_docs.in_date = @deal_date and td_depo_docs.owner_id = @owner_id and upper(ltrim(rtrim(t_types.type_code))) = upper(ltrim(rtrim(@deal_doc_type_code))) and upper(ltrim(rtrim(tb_baysale_docitems.transaction_no))) = upper(ltrim(rtrim(@contract))) and t_types.id = t_items.type_id and t_items.state_id = t_states.id and t_states.class_id = 0) ----------------------------------------------------------------------------------------- begin if @sale_or_bay=1 begin .TYPE_INIT('dealings_via_broker',3) ------------ Web - Invest special .TYPE_ASSIGN(in_date,(.OPERDAY),3) .TYPE_ASSIGN(out_date,@deal_date,3) .BACK_GEN_NO(@in_no3_1,1,@in_date3_1) ------ .TYPE_ASSIGN(props_id,@props_inv_id,3) .TYPE_ASSIGN(portfolio_sub_id,@portfolio_sub_inv_id,3) .TYPE_ASSIGN(payment_cur_id,(.CUR('RUR')),3) .TYPE_ASSIGN(instruction_on2off,1,3) .TYPE_ASSIGN(is_entry_cd,@is_entry_cd,3) .TYPE_ASSIGN(portfolio_id,@portfolio_inv_id,3) .TYPE_ASSIGN(stock_id,@stock_id,3) ---.TYPE_ASSIGN(doc_comment,@memo,3) .TYPE_ASSIGN(in_no,@in_no3_1,3) .TYPE_ASSIGN(stock_qty,@qty,3) .TYPE_ASSIGN(depo_doc_type,1,3) .TYPE_ASSIGN(stock_price,@stock_price,3) .TYPE_ASSIGN(summ_doc_total,@summ_doc_total,3) .TYPE_ASSIGN(summ_doc_total2unkd,(@summ_doc_total+isnull(@nkd,0)),3) .TYPE_ASSIGN(coupon_account_sum,@nkd,3) .TYPE_ASSIGN(coupon_cur_id,@cur_id,3) .TYPE_ASSIGN(transaction_no,@contract,3) .TYPE_ASSIGN(owner_id,@owner_id,3) .TYPE_ASSIGN(sale_place_id,@sale_place_id,3) .TYPE_ASSIGN(ticket_type_id,1,3) .TYPE_ASSIGN(cur_id,@cur_id,3) .TYPE_ASSIGN(character_id,@character_id,3) .TYPE_ASSIGN(trader_stock,(ltrim(rtrim(@emi_code))),3) .TYPE_ASSIGN(client_id,@client_id,3) .TYPE_ASSIGN(document_form_id,1,3) .TYPE_ASSIGN(folder_id,(.DEPO_FOLDER_DEFAULT),3) .TYPE_ASSIGN(client_contract_id,@client_contract_id,3) .TYPE_ASSIGN(dealing_look,@dealing_look,3) .TYPE_ASSIGN(external_broker_id,@external_broker_id,3) .TYPE_ASSIGN(depo_subacc_id,@depo_subacc_id,3) .TYPE_ASSIGN(bank_account_id,@bank_account_id,3) .TYPE_ASSIGN(asset_place_id,@asset_place_id,3) .TYPE_ASSIGN(in_time,@deal_time_t,3) .TYPE_ASSIGN(sale_type_id,@sale_type_id,3) .TYPE_ASSIGN(contragent_id,@contragent_id,3) .TYPE_ASSIGN(direct_no,@direction,3) .TYPE_ASSIGN(deal_units,@deal_units,3) --- Комиссии .TYPE_INSERT('dealings_via_broker','ED',3) /****** Создание документа "Параметры сделки" ************/ insert tb_repo_params (id, repo_type_id, repo_rel_init_type_id, repo_percent_year, repo_corresp_deal_sum, corr_exec_type_id, corr_exec_place_id, corr_exec_date_money, corr_exec_date_sec, is_zalog_id, date_2part, days_for_exec, repo_2part, regime_deal, margin_deal, disput_deal) values (@id3_1, @repo_type_id, 1, @repo_percent, @repo_corresp_deal_sum, 2, @sale_place_id, @date_2part, @date_2part, 0, @date_2part, @days_for_exec, @repo_price, @regime_deal, 0, 0) select @id=@id3_1 select @deal_id=@id3_1 select @sid = convert(varchar, @id) /*! Это было ниже (см. комментарий ниже) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ update tb_baysale_docitems set stock_qty_input=@qty, stock_price_input=@price where id=@id /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -- Шаблон .EXEC_ACTION формирует обратную сделку РЕПО автоматически /****** Конец создания документа "Параметры сделки" ************/ if @quitovka = 1 EXEC ap_quitovka @id /* update tb_baysale_docitems set stock_qty_input=@qty, stock_price_input=@price where id=@id */ update t_items set item_name='COPY' where id=@id3_1 end else begin .TYPE_INIT('DEALINGS_VIA_BROKER_SALE',2) ------------ Web - Invest special .TYPE_ASSIGN(in_date,(.OPERDAY),2) .TYPE_ASSIGN(out_date,@deal_date,2) .BACK_GEN_NO(@in_no2_1,1,@in_date2_1) ------ .TYPE_ASSIGN(props_id,@props_inv_id,2) .TYPE_ASSIGN(portfolio_sub_id,@portfolio_sub_inv_id,2) .TYPE_ASSIGN(payment_cur_id,(.CUR('RUR')),2) .TYPE_ASSIGN(instruction_on2off,1,2) .TYPE_ASSIGN(is_entry_cd,@is_entry_cd,2) .TYPE_ASSIGN(portfolio_id,@portfolio_inv_id,2) .TYPE_ASSIGN(stock_id,@stock_id,2) ---.TYPE_ASSIGN(doc_comment,@memo,2) .TYPE_ASSIGN(in_no,@in_no2_1,2) .TYPE_ASSIGN(stock_qty,@qty,2) .TYPE_ASSIGN(depo_doc_type,1,2) .TYPE_ASSIGN(stock_price,@stock_price,2) .TYPE_ASSIGN(summ_doc_total,@summ_doc_total,2) .TYPE_ASSIGN(summ_doc_total2unkd,(@summ_doc_total+isnull(@nkd,0)),2) .TYPE_ASSIGN(coupon_account_sum,@nkd,2) --.TYPE_ASSIGN(summ_doc_total2unkd,@summ2unkd,2) --.TYPE_ASSIGN(coupon_account_sum,@coupon_deal_sum,2) .TYPE_ASSIGN(coupon_cur_id,@cur_id,2) .TYPE_ASSIGN(transaction_no,@contract,2) .TYPE_ASSIGN(owner_id,@owner_id,2) .TYPE_ASSIGN(sale_place_id,@sale_place_id,2) .TYPE_ASSIGN(ticket_type_id,2,2) .TYPE_ASSIGN(cur_id,@cur_id,2) .TYPE_ASSIGN(character_id,@character_id,2) .TYPE_ASSIGN(trader_stock,(ltrim(rtrim(@emi_code))),2) .TYPE_ASSIGN(client_id,@client_id,2) .TYPE_ASSIGN(document_form_id,1,2) .TYPE_ASSIGN(folder_id,(.DEPO_FOLDER_DEFAULT),2) .TYPE_ASSIGN(client_contract_id,@client_contract_id,2) .TYPE_ASSIGN(dealing_look,@dealing_look,2) .TYPE_ASSIGN(external_broker_id,@external_broker_id,2) .TYPE_ASSIGN(depo_subacc_id,@depo_subacc_id,2) .TYPE_ASSIGN(bank_account_id,@bank_account_id,2) .TYPE_ASSIGN(asset_place_id,@asset_place_id,2) .TYPE_ASSIGN(in_time,@deal_time_t,2) .TYPE_ASSIGN(sale_type_id,@sale_type_id,2) .TYPE_ASSIGN(contragent_id,@contragent_id,2) .TYPE_ASSIGN(direct_no,@direction,2) .TYPE_ASSIGN(deal_units,@deal_units,2) --- Комиссии .TYPE_INSERT('DEALINGS_VIA_BROKER_SALE','ED',2) /****** Создание документа "Параметры сделки" ************/ insert tb_repo_params (id, repo_type_id, repo_rel_init_type_id, repo_percent_year, repo_corresp_deal_sum, corr_exec_type_id, corr_exec_place_id, corr_exec_date_money, corr_exec_date_sec, is_zalog_id, date_2part, days_for_exec, repo_2part, regime_deal, margin_deal, disput_deal) values (@id2_1, @repo_type_id, 1, @repo_percent, @repo_corresp_deal_sum, 2, @sale_place_id, @date_2part, @date_2part, 0, @date_2part, @days_for_exec, @repo_price, @regime_deal, 0, 0) select @id=@id2_1 select @deal_id=@id2_1 select @sid = convert(varchar, @id) /*! Это было ниже (см. комментарий ниже) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ update tb_baysale_docitems set stock_qty_input=@qty, stock_price_input=@price where id=@id /***************************************************************************************/ -- Шаблон .EXEC_ACTION формирует обратную сделку РЕПО автоматически /****** Конец создания документа "Параметры сделки" ************/ if @quitovka = 1 EXEC ap_quitovka @id /* update tb_baysale_docitems set stock_qty_input=@qty, stock_price_input=@price where id=@id */ update t_items set item_name='COPY' where id=@id2_1 end select @sid = convert(varchar, @deal_id) if @sale_or_bay=1 begin .EXEC_ACTION(@sid,'dealings_via_broker','DATA2IMPORT_BAY') .EXEC_ACTION(@sid,'tb_repo_params','ACTION_UPDATE_IMPORT_TS') end else begin .EXEC_ACTION(@sid,'DEALINGS_VIA_BROKER_SALE','DATA2IMPORT_SALE') .EXEC_ACTION(@sid,'tb_repo_params','ACTION_UPDATE_IMPORT_TS') end /* Простой справочник 5500 1 - комиссия ТС (торговой системы) 5 - Комиссия КК (клиринговой компании) 14 - Комиссия ИТС () */ /* Вычисление комиссии ТС */ if @deal_id is not null exec ap_calculate_comis @sid, 1, @comis /* Вычисление комиссии Клиринговой Компании */ if @deal_id is not null and isnull(@com_settle,0)<>0 and @is_settle_comis=1 exec ap_calculate_comis @sid, 5, @com_settle /* /* Вычисление комиссии ИТС */ if @deal_id is not null and isnull(@com_its,0)<>0 exec ap_calculate_comis @sid, 14, @com_its */ end commit tran --select sid = convert(varchar, @id)