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_s VARCHAR(50) = NULL, /*Цена бумаги*/ @qty_s VARCHAR(50) = NULL, /*Количество ЦБ (лотов)*/ @deal_sum_s VARCHAR(50) = NULL, /*Сумма сделки*/ @comis_s VARCHAR(50) = NULL, /*Комиссия*/ @com_settle_s VARCHAR(50) = NULL, /*Комиссия клиринговой компании*/ @com_its_s VARCHAR(50) = NULL, /*Комиссия ИТС*/ @brok_code varchar(50) = null, /*Шифр брокера*/ @company_code varchar(50) = null, /*Шифр клиенского договора?*/ @client_code varchar(50) = null, /*Код инвестора (клиента)/комментарий(код раздела учета/поручение); */ @nkd_s VARCHAR(50) = NULL, /*НКД*/ @is_repo_rps varchar(255) = null, /*Сделка обычная, Неполные лоты, РПС или РЕПО*/ @exec_code varchar(50) = null, /*Код исполнения сделки (R14 - РЕПО 14 дней)*/ @repo_percent_s VARCHAR(50) = NULL, /*Ставка РЕПО*/ @repo_price_s VARCHAR(50) = 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*/ @asset_place_id_s varchar(30)=null, /*Место нахождения ЦБ*/ @quitovka int = null as DECLARE @price DECIMAL(18, 8), @qty MONEY, @deal_sum DECIMAL(18, 8), @comis DECIMAL(18, 8), @com_settle DECIMAL(18, 8), @com_its DECIMAL(18, 8), @nkd DECIMAL(18, 4), @repo_percent DECIMAL(18, 4), @repo_price DECIMAL(18, 8); IF rtrim(ltrim(@contragent))='' SELECT @contragent = NULL IF @price_s = '' SELECT @price = NULL ELSE SELECT @price = CONVERT(DECIMAL(18, 8), @price_s); IF @qty_s = '' SELECT @qty = NULL ELSE SELECT @qty = CONVERT(MONEY, @qty_s); IF @deal_sum_s = '' SELECT @deal_sum = NULL ELSE SELECT @deal_sum = CONVERT(DECIMAL(18, 8), @deal_sum_s); IF @comis_s = '' SELECT @comis = NULL ELSE SELECT @comis = CONVERT(DECIMAL(18, 8), @comis_s); IF @com_settle_s = '' SELECT @com_settle = NULL ELSE SELECT @com_settle = CONVERT(DECIMAL(18, 8), @com_settle_s); IF @com_its_s = '' SELECT @com_its = NULL ELSE SELECT @com_its = CONVERT(DECIMAL(18, 8), @com_its_s); IF @nkd_s = '' SELECT @nkd = NULL ELSE SELECT @nkd = CONVERT(DECIMAL(18, 4), @nkd_s); IF @repo_percent_s = '' SELECT @repo_percent = NULL ELSE SELECT @repo_percent = CONVERT(DECIMAL(18, 4), @repo_percent_s); IF @repo_price_s = '' SELECT @repo_price = NULL ELSE SELECT @repo_price = CONVERT(DECIMAL(18, 8), @repo_price_s); 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 @ticket_type_id numeric declare @character_id numeric declare @sale_place_id numeric declare @transaction_no varchar(80) declare @stock_id numeric declare @stock_price decimal(18, 8) declare @stock_qty money declare @summ_doc_total money declare @cur_id numeric declare @pay_cur_id numeric declare @days_for_regs int declare @who_prepares int declare @days_to_pay int declare @days_to_pay_saler_noexec int declare @who_reg int declare @who_pay_regs int declare @reestr_id numeric declare @properter_id numeric declare @mediator_id numeric declare @resp_executor varchar(100) declare @resp_exec_tel varchar(30) declare @is_nayfor_member int declare @contragent_id numeric declare @cnt_properter_id numeric declare @cnt_mediator_id numeric declare @cnt_resp_executor varchar(100) declare @cnt_resp_exec_tel varchar(30) declare @cnt_is_nayfor_member int declare @nom_holder_id numeric declare @cnt_nom_holder_id numeric declare @dog_calc_order int declare @is_affelir int declare @who_confirm int declare @reg_place_id numeric declare @who_stock_reg int declare @client_id numeric declare @direction_id numeric declare @comm_who_pays int declare @comm_who_pays_regs int declare @comm_who_regs int declare @days_for_sign int declare @days_to_prepare_contract int declare @days_to_prepare_regdocs int declare @regdocs_prepare_date datetime declare @who_regdocs_prepare int declare @trader_id numeric declare @contr_form_id numeric declare @organisation_id numeric declare @rate_date datetime declare @sum_in_paycur money declare @portfolio_id numeric declare @coupon_account_sum decimal(18, 8) declare @coupon_deal_sum decimal(18, 8) declare @coupon_cur_id numeric declare @portfolio_sub_id numeric declare @props_id numeric declare @contract_date datetime declare @out_date datetime declare @in_date datetime declare @who_get varchar(100) declare @who_put varchar(100) declare @out_no varchar(50) declare @in_no varchar(50) declare @correspondent_id numeric declare @payer_id numeric declare @pay_sum money declare @initiator_id numeric declare @document_form_id numeric declare @depo_doc_type int declare @folder_id numeric declare @sum_cur_id numeric declare @doc_comment varchar(255) declare @owner_id numeric declare @foundation_id numeric declare @payment_sum money declare @exec_qty money declare @payment_cur_id numeric declare @dogovor_name varchar(255) declare @deal_units int declare @stock_price_input decimal(18, 8) declare @stock_qty_input money declare @coupon_sum_input decimal(18, 8) declare @is_comis int declare @oper_date datetime declare @plan_dog_date datetime declare @fact_dog_date datetime declare @plan_reg_date datetime declare @fact_reg_date datetime declare @plan_pay_date datetime declare @fact_pay_date datetime declare @external_broker_id numeric declare @margin_deal int declare @disput_deal int 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 @rv money, @rd datetime, @msg varchar(255), @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), @comis_currency decimal(18,8), -- Комиссия в валюте выставления -- @cur_id numeric, -- Валюта комиссии @currency numeric, -- Валюта выставления комиссии @is_settle_comis int, /* Выделять клиринговую комиссию (для сделок ЭДО) 0 - складывать комиссию биржи и клиринговую комиссию 1 - раздельно вводить клиринговую (КК) и биржевую (ТС) комиссию */ @deal_acc_char varchar(1), /* В эту переменную заносится первая буква торгового счета S - собственные сделки, D - Доверительное управление, L - обычные сделки */ @asset_place_id numeric /* Сохранение форматов в таблицу с целью их дальнейшего использования по умолчанию (пока не работает, таблица есть) 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) */ /*** Сохраняем значения цены, количества и суммы, которые были в файле *******************/ declare @price_file decimal(18,8) declare @qty_file money declare @deal_sum_file decimal(18,8) select @price_file=@price select @qty_file=@qty select @deal_sum_file=@deal_sum /******************************************************************************************/ /*** Если вместо наименования рынка в файле стоит код рынка *********/ if upper(ltrim(rtrim(@is_repo_rps)))='EQBR' select @is_repo_rps='Акции А1' if upper(ltrim(rtrim(@is_repo_rps)))='EQBS' select @is_repo_rps='Акции А2' if upper(ltrim(rtrim(@is_repo_rps)))='EQNL' select @is_repo_rps='Акции Б' if upper(ltrim(rtrim(@is_repo_rps)))='EQNE' select @is_repo_rps='Внесп.акц' if upper(ltrim(rtrim(@is_repo_rps)))='EQOB' select @is_repo_rps='Обл. А1' if upper(ltrim(rtrim(@is_repo_rps)))='EQOS' select @is_repo_rps='Обл. А2' if upper(ltrim(rtrim(@is_repo_rps)))='EQNO' select @is_repo_rps='Обл. Б' if upper(ltrim(rtrim(@is_repo_rps)))='EQNB' select @is_repo_rps='Внесп.обл.' if upper(ltrim(rtrim(@is_repo_rps)))='EQEB' select @is_repo_rps='Еврооблигации' if upper(ltrim(rtrim(@is_repo_rps)))='PSEQ' select @is_repo_rps='РПС:Акции А1' if upper(ltrim(rtrim(@is_repo_rps)))='PSES' select @is_repo_rps='РПС:Акции А2' if upper(ltrim(rtrim(@is_repo_rps)))='PSNL' select @is_repo_rps='РПС:Акции Б' if upper(ltrim(rtrim(@is_repo_rps)))='PSNE' select @is_repo_rps='РПС:Внесп.акц.' if upper(ltrim(rtrim(@is_repo_rps)))='PSOB' select @is_repo_rps='РПС:Обл. А1' if upper(ltrim(rtrim(@is_repo_rps)))='PSOS' select @is_repo_rps='РПС:Обл. А2' if upper(ltrim(rtrim(@is_repo_rps)))='PSNO' select @is_repo_rps='РПС:Обл. Б' if upper(ltrim(rtrim(@is_repo_rps)))='PSNB' select @is_repo_rps='РПС:Внесп.обл' if upper(ltrim(rtrim(@is_repo_rps)))='RPEQ' select @is_repo_rps='РЕПО:Акции' if upper(ltrim(rtrim(@is_repo_rps)))='RPOB' select @is_repo_rps='РЕПО:Облигации' if upper(ltrim(rtrim(@is_repo_rps)))='AUCT' select @is_repo_rps='Аукцион' if upper(ltrim(rtrim(@is_repo_rps)))='PSAU' select @is_repo_rps='РПС:Аукцион' /***************************************************************************/ /* Необходимо реализовать раздельный учёт комиссий (лучше не по константе, а анализировать услуги и выдавать сообщение "Тариф комиссии клиринговой компании не найден") Если значение константы 0 (не выделять клиринговую комиссию), то суммируем комиссии Если значение константы 1 (отдельно клиринговая комиссия и отдельно комиссия ТС), то добавляем еще одну комиссию (см. в конце этой процедуры) Если значение константы не 0 и не 1 , то сообщение об ошибке !!!!!!!!!!!!!!!*/ 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 or @is_settle_comis < 0) .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 ---Добавил Демихов Т.Е. 20.09.04 Площадка будет определятся по местонахождению активов if isnull(@asset_place_id_s,'')<>'' select @asset_place_id = convert(numeric,@asset_place_id_s) else .EXIT_MESSAGE('Местонахождение активов не задано') select @rate_place_id = (select exchange_id from tb_broker2exchange where tb_broker2exchange.id = @asset_place_id) if @rate_place_id is null begin .EXIT_MESSAGE('Площадка не задана') end ---Конец добавлений Демихов Т.Е. 20.09.04 ---Закоментировал Демихов Т.Е. 17.09.04 /*if isnull(@rate_place_id_s,'')<>'' select @rate_place_id = convert(numeric, @rate_place_id_s) else .EXIT_MESSAGE('Площадка не задана')*/ ---Закоментировал Демихов Т.Е. 17.09.04 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) 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('Характер сделок не задан') /* Вычисление кода инвестора (клиента) , кода раздела учета, кода поручения */ /****************************************************************************/ 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 /*** Конец вычисления кода клиента , раздела учета, поручения ******************/ --надо проверять при проверках, что мы ищем привязку для классификатора той площадки, -- что у нас указана на морде - я не понял пока как это сходу делать /* Начало 16/08/2004 Богаковский */ select @cntt=(select count (distinct t_classvalues.id) from t_item2class,t_classes,t_classvalues where t_item2class.item_id=@rate_place_id 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_BY_TYPE(t_item2class.item_id,'RATE_PLACES')) if @cntt=1 begin /* Вычисление ID значения классификатора "Бумаги, участвующие в торгах" для заданной площадки */ select @value_id = (select distinct t_classvalues.id from t_item2class,t_classes,t_classvalues where t_item2class.item_id=@rate_place_id 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_BY_TYPE(t_item2class.item_id,'RATE_PLACES')) end if @cntt<1 .EXIT_MESSAGE('Для заданной площадки не найдено значение классификатора "Бумаги, участвующие в торгах"') if @cntt>1 .EXIT_MESSAGE('Для заданной площадки найдено более одного значения классификатора "Бумаги, участвующие в торгах"') /* Вычисление количества ЦБ с одинаковыми кодами на заданной площадке */ select @cntt=(select count(distinct 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 t_classvalues.id=@value_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 begin select @msg='Найдено более одной ЦБ с кодом ' + upper(ltrim(rtrim(@emi_code))) + ' на заданной площадке' .EXIT_MESSAGE(@msg) end if @cntt<1 begin select @msg='Бумага с кодом ' + upper(ltrim(rtrim(@emi_code))) + ' не проклассифицирована, отсутствует или не торгуется на заданной площадке' .EXIT_MESSAGE(@msg) end /* Конец 16/08/2004 Богаковский */ /* Вычисление ID ЦБ по коду в классификаторе "Бумаги, участвующие в торгах" и по значению его на заданной площадке */ if @cntt=1 begin select @stock_id=(select distinct 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 t_classvalues.id=@value_id and .ITEMS_EXISTS_BY_TYPE(t_item2class.id,'item2classvalues') and .ITEMS_EXISTS_BY_TYPE(t_item2class.item_id,'td_stock_emis')) end if @stock_id is null begin select @msg='Бумага с кодом ' + upper(ltrim(rtrim(@emi_code))) + ' не проклассифицирована, отсутствует или не торгуется на заданной площадке' .EXIT_MESSAGE(@msg) end /* Теперь площадка вводится из морды select @value_id=(select max(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 (distinct 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 distinct 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 /*** Блок поиска контрагента Богаковский 30/05/2005 **********************************/ -- Поиск внешнего брокера из местонахождения select @external_broker_id= (select tb_contracts.client_id from tb_contracts, tb_broker2exchange where tb_contracts.id = tb_broker2exchange.ext_broker_deal and tb_broker2exchange.id=@asset_place_id) if @dealing_look=2 begin if @external_broker_id is null .EXIT_MESSAGE('Внешний брокер не задан') end -- Значение константы "Контрагент по умолчанию" declare @is_default_contragent varchar(10) select @is_default_contragent=rtrim(ltrim(.GET_CONST('DEFAULT_CONTRAGENT'))) -- Поиск контрагента по коду @contragent с помощью классификатора "Инвесторы на биржах" select @contragent_id= (select distinct t_item2class.item_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')) select @value_id= (select distinct 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')) /* Возможные варианты: 1) Контрагент - внешний брокер 2) Контрагент - биржа 3) Контрагент - не найден по заданному коду - ошибка 4) Контрагент - юридическое лицо, найденное по заданному коду Переменные: @is_default_contragent значение константы DEFAULT_CONTRAGENT. 1 - использовать контрагента по умолчанию, не 1 - не использовать @dealing_look 1 - прямая сделка, 2 - сделка через внешнего брокера @contragent код контрагента, берётся из файла импорта (входной параметр процедуры) @contragent_id ID юр. лица, найденного по коду @contragent с помощью классификатора "Инвесторы на биржах" */ -- 1) Контрагент - внешний брокер if @dealing_look=2 and ((@is_default_contragent <> '1' and @contragent is null) or (@is_default_contragent = '1' and @contragent_id is null)) select @contragent_id = @external_broker_id -- 2) Контрагент - биржа if @dealing_look=1 and @contragent is null begin declare @contr varchar(255) select @contr = 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= (select distinct t_item2class.item_id from t_item2class,t_classes,t_classvalues where upper(ltrim(rtrim(t_item2class.code)))=upper(rtrim(ltrim(@contr))) 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')) select @value_id= (select distinct 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 -- 3) Контрагент не найден - сообщение об ошибке if @is_default_contragent<>1 and @contragent is not null and @contragent_id is null .EXIT_MESSAGE('Контрагент не найден') -- 4) Если не попали ни в одну из трёх ветвей, то значит код контрагента задан и по этому коду успешно найден контрагент /*** Конец блока поиска контрагента ******************/ 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 @value_id= (select distinct 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')) /* Изменено 27/09/04 select @investor_id= (select distinct 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')) */ ---чикунов вставил 25.02.05 во избежание бессмысленной для пользователя ошибки при нескольких проклассифицированных договорах declare @count_trouble tinyint select @count_trouble = (select count(distinct t_item2class.item_id) from t_item2class,t_classes,t_classvalues,td_depo_docs where t_classvalues.class_id=t_classes.id and td_depo_docs.id = t_item2class.item_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_STATE(t_item2class.item_id,'client_contracts','SIGN') and td_depo_docs.owner_id = @organisation_id_s) if @count_trouble > 1 .EXIT_MESSAGE_PARM('Более одного клиентского договора для вашей учетной организации проклассифицировано кодом',@client_code) --------------- select @investor_id= (select distinct t_item2class.item_id from t_item2class,t_classes,t_classvalues,td_depo_docs where t_classvalues.class_id=t_classes.id and td_depo_docs.id = t_item2class.item_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') and td_depo_docs.owner_id = @organisation_id_s) --.EXIT_MESSAGE_PARM('XXX',@investor_id) select @cntt=(select count (distinct client_id) from tb_contracts where id=@investor_id) if @cntt > 1 .EXIT_MESSAGE('Повторяющиеся коды клиентских договоров в классификаторе Инвесторы на биржах') select @client_id=(select distinct 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 @value_id= (select distinct 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= (select distinct 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 @investor_id= (select distinct t_item2class.item_id from t_item2class,t_classes,t_classvalues,td_depo_docs where t_classvalues.class_id=t_classes.id and td_depo_docs.id = t_item2class.item_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') and td_depo_docs.owner_id = @organisation_id_s) 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(distinct 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=(select distinct 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_PARM('Количество разделов учета инвестора, используемых по умолчанию > 1', @count) else if @count=0 .EXIT_MESSAGE_PARM('Раздел учета инвестора, используемый по умолчанию - не найден', @investor_id) 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 asset_place_id=@asset_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) /* Богаковский 24/08/2004 добавил проверки, отсеивающие реквизиты на удаленных площадках и т.д. */ and ((.ITEMS_EXISTS(tb_official_props.rate_place_id)) or (tb_official_props.rate_place_id is null)) and ((.ITEMS_EXISTS(tb_official_props.depo_account_id)) or (tb_official_props.depo_account_id is null)) and ((.ITEMS_EXISTS(tb_official_props.bank_account_id)) or (tb_official_props.bank_account_id is null)) and ((.ITEMS_EXISTS(tb_official_props.asset_place_id)) or (tb_official_props.asset_place_id is null))) if @count>1 .EXIT_MESSAGE('Количество возможных реквизитов раздела учета инвестора для использования на данной площадке > 1') select @props_inv_id=(select id from tb_official_props where investor_id=@investor_id and asset_place_id=@asset_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) /* Богаковский 24/08/2004 добавил проверки, отсеивающие реквизиты на удаленных площадках и т.д. */ and ((.ITEMS_EXISTS(tb_official_props.rate_place_id)) or (tb_official_props.rate_place_id is null)) and ((.ITEMS_EXISTS(tb_official_props.depo_account_id)) or (tb_official_props.depo_account_id is null)) and ((.ITEMS_EXISTS(tb_official_props.bank_account_id)) or (tb_official_props.bank_account_id is null)) and ((.ITEMS_EXISTS(tb_official_props.asset_place_id)) or (tb_official_props.asset_place_id is null))) 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 asset_place_id=@asset_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) /* Богаковский 24/08/2004 добавил проверки, отсеивающие реквизиты на удаленных площадках и т.д. */ and ((.ITEMS_EXISTS(tb_official_props.rate_place_id)) or (tb_official_props.rate_place_id is null)) and ((.ITEMS_EXISTS(tb_official_props.depo_account_id)) or (tb_official_props.depo_account_id is null)) and ((.ITEMS_EXISTS(tb_official_props.bank_account_id)) or (tb_official_props.bank_account_id is null)) and ((.ITEMS_EXISTS(tb_official_props.asset_place_id)) or (tb_official_props.asset_place_id is null))) 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 asset_place_id=@asset_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) /* Богаковский 24/08/2004 добавил проверки, отсеивающие реквизиты на удаленных площадках и т.д. */ and ((.ITEMS_EXISTS(tb_official_props.rate_place_id)) or (tb_official_props.rate_place_id is null)) and ((.ITEMS_EXISTS(tb_official_props.depo_account_id)) or (tb_official_props.depo_account_id is null)) and ((.ITEMS_EXISTS(tb_official_props.bank_account_id)) or (tb_official_props.bank_account_id is null)) and ((.ITEMS_EXISTS(tb_official_props.asset_place_id)) or (tb_official_props.asset_place_id is null))) end -- Если не найден балансовый портфель по информации после слэша в поле @client_code исходного файла declare @sid varchar(30), @depo_subacc_id numeric, @bank_account_id numeric select @depo_subacc_id=depo_account_id, @bank_account_id=bank_account_id from tb_official_props where id=@props_inv_id -- Режим торгов по умолчанию с кодом 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 @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 /* Количество ЦБ, цена ЦБ, сумма связаны друг с другом в зависимости от типа ЦБ У облигации цена - в процентах от номинала, количество - в штуках У акции цена - за штуку, количество в лотах Цены облигаций и количества акций вычисляются */ 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) /* Базовые типы ЦБ (подробнее см. простой справочник 3060) @stock_class_type_id: 1 - акция 2 - облигация 3 - Вексель 4 - Пай 5 - Депозитарная расписка 6 - Фьючерс 7 - Опцион ... */ 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 abs(@price-@price_file)<1 begin select @price=@price_file end -- Богаковский 26/05/2005 добавил : /*** Вычисление цены второй части сделки РЕПО для облигаций. Формула взята из правил проведения торгов от 30 июля 2002 г. п. 17.9. */ declare @date2 datetime -- Дата второй части сделки РЕПО declare @nkd_2 decimal(18,4) select @date2=dateadd(dd, @days_for_exec, @deal_date) .BACK_CALC_COUPON(@stock_id, @qty, @date2, 1, @nkd_2, @coupon_cur_id) select @repo_price = (@price + @nkd/@qty) * (1 + (@repo_percent/100) * (@days_for_exec/365)) - @nkd_2/@qty /* @repo_price - Цена второй части сделки РЕПО @price - Цена сделки (первой части сделки РЕПО) @nkd - НКД на дату заключения первой части сделки РЕПО @repo_percent - ставка РЕПО @days_for_exec - Количество КАЛЕНДАРНЫХ дней между первой и второй частью сделки РЕПО @nkd_2 - НКД на дату второй части сделки РЕПО */ /****************************************************/ 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 if @stock_class_type_id=4 begin select @qty=convert(decimal(18,5),(convert(decimal(18,8),@summ_doc_total)/@price)), @is_entry_cd=0 select @deal_units=1 /* Обычный способ ввода данных */ -- Если вычисленное количество незначительно отличается от количества в файле, то в сделку импортируем количество из файла if abs(@qty-@qty_file)<1 select @qty=@qty_file end else begin /* 14/01/2004 Богаковский изменил 18,4 на 18,0 , поскольку иначе возможно получение дробного количества ЦБ */ select @qty=convert(decimal(18,0),(convert(decimal(18,8),@summ_doc_total)/@price)), @is_entry_cd=0 select @deal_units=1 /* Обычный способ ввода данных */ -- Если вычисленное количество незначительно отличается от количества в файле, то в сделку импортируем количество из файла if abs(@qty-@qty_file)<1 select @qty=@qty_file end select @stock_price=convert(decimal(18,8),@price) -- Извлечение номера кода расчетов из простого справочника /* 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 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 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 /* Сравнение производится по сумме полей (номер транзакции и покупка-продажа) поскольку могут быть сделки с одним номером, но одна - покупка, другая - продажа */ 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 begin if @sale_or_bay=1 begin .TYPE_INIT('dealings_via_broker',3) .BACK_GEN_NO(@in_no3_1,1,@deal_date) .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(in_date,@deal_date,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, coupon_account_sum2, coupon_cur_id) 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, @nkd_2*@qty, @coupon_cur_id) 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) .BACK_GEN_NO(@in_no2_1,1,@deal_date) .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(in_date,@deal_date,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, coupon_account_sum2, coupon_cur_id) 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, @nkd_2*@qty, @coupon_cur_id) 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 /**** Создание документа "Данные операции ПИФ" ***/ if exists (select 1 from sysobjects where name = 't_sd_info4oper' and type = 'U') insert into t_sd_info4oper (id, is_fixed, reg_date, assent_date, reg_time, doc_name) values (@deal_id, 1, @deal_date, dateadd(hh, 20, @deal_date), convert(datetime,'20:10:00',108), 'Сводное поручение от ' + convert(varchar(10), @deal_date, 103)) /*************************************************/ 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 and isnull(@comis,0)<>0 begin -- Валюта комиссии select @cur_id = (select cur_id from td_comis2oper where item_id=@deal_id and service_id=1 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper'))) -- Валюта выставления комиссии select @currency = (select currency from td_comis2oper where item_id=@deal_id and service_id=1 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper'))) -- Вычисление комиссии в валюте выставления if @cur_id <> @currency begin .CONVERT_SUM(@cur_id,@currency,@deal_date,0,@comis,@comis_currency,@rv,@rd) end else select @comis_currency = @comis -- Замена комиссии ТС update td_comis2oper set comis=@comis, comis_currency = @comis_currency, comment='Комиссия взята из импортируемого файла', is_edit=1 where item_id=@deal_id and service_id=1 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper')) if @@error!=0 or @@rowcount=0 begin rollback tran raiserror 40000 'Тариф комиссии ТС не найден. Настройте прайс-лист' return end end /* Замена значения комиссии Клиринговой Компании, вычисленного по прайс-листу, на значение, взятое из импортируемого файла */ if @deal_id is not null and isnull(@com_settle,0)<>0 and @is_settle_comis = 1 begin -- Валюта комиссии КК select @cur_id = (select cur_id from td_comis2oper where item_id=@deal_id and service_id=5 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper'))) -- Валюта выставления комиссии КК select @currency = (select currency from td_comis2oper where item_id=@deal_id and service_id=5 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper'))) -- Вычисление комиссии КК в валюте выставления if @cur_id <> @currency begin .CONVERT_SUM(@cur_id,@currency,@deal_date,0,@com_settle,@comis_currency,@rv,@rd) end else select @comis_currency = @com_settle -- Замена комиссии КК update td_comis2oper set comis=@com_settle, comis_currency = @comis_currency, comment='Комиссия взята из импортируемого файла', is_edit=1 where item_id=@deal_id and service_id=5 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper')) if @@error!=0 or @@rowcount=0 begin rollback tran raiserror 40000 'Тариф комиссии Клиринговой Компании не найден. Настройте прайс-лист или установите значение константы "SETTLE_COMIS" равным нулю' return end end /* Замена значения комиссии ИТС, вычисленного по прайс-листу, на значение, взятое из импортируемого файла */ if @deal_id is not null and isnull(@com_its,0)<>0 begin -- Валюта комиссии ИТС select @cur_id = (select cur_id from td_comis2oper where item_id=@deal_id and service_id=14 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper'))) -- Валюта выставления комиссии ИТС select @currency = (select currency from td_comis2oper where item_id=@deal_id and service_id=14 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper'))) -- Вычисление комиссии ИТС в валюте выставления if @cur_id <> @currency begin .CONVERT_SUM(@cur_id,@currency,@deal_date,0,@com_its,@comis_currency,@rv,@rd) end else select @comis_currency = @com_its -- Замена комиссии ИТС update td_comis2oper set comis=@com_its, comis_currency = @comis_currency, comment='Комиссия взята из импортируемого файла', is_edit=1 where item_id=@deal_id and service_id=14 and exists(select 1 from t_items, t_states, t_types where t_items.id=td_comis2oper.id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.id=t_items.type_id and upper(t_types.type_code)=upper('td_comis2oper')) if @@error!=0 or @@rowcount=0 begin rollback tran raiserror 40000 'Тариф комиссии ИТС не найден. Настройте прайс-лист.' return end end end -- Если такой сделки не существует commit tran=