# Date: 14/08/06 # Version: 105 $PATTERN(.BACK_SECURS_INOUT_MON) name=Зачисление - списание ЦБ на плане ДС class=2 product=ALD_SECUR pattern_text=$TEXT(17250803) /* Содержимое шаблона 1.проверяет на возможность короткой позиции, в момент когда не хватает денег или бумаг 2.проводит зачисление на счет реализации, пропорционально либо списываемому количеству на длинной позиции при продаже, либо списываемому количеству на короткой позиции при покупке 3.Вызывает шаблоны (процедуру) партионного списания ЦБ, КД, затрат на преобретение. 4.Если списываемые бумаги с длинной позиции по сделке продажи закончились, то идет зачисление на короткую. 5.Если списываемые бумаги с короткой позиции по сделке покупки закончились, то идет зачисление на длинную. 6.Считается финансовый результат и идут проводки на прибыль/убыток 7.Идет отражение по фондам инвестора Шаблон используется как в бэкэ так и в пифе. */ #ifndef #BACK_SECURS_INOUT_MON #define #BACK_SECURS_INOUT_MON DECLARE @bo1_oblig_acc_xx_id NUMERIC, @bo1_s_sum MONEY, @bo1_s_qty MONEY, @is_last INT, @oper_sum MONEY, @subc_for_check VARCHAR(255), @qty_check MONEY, @bo_purpose_code INT, @bo_investor_id NUMERIC, @bo_stock_id NUMERIC, @bo_deal_id NUMERIC, @marg_acc_id NUMERIC, @type_repo_code INT, @type_repo_id NUMERIC, @d_acc_id NUMERIC, @k_acc_id NUMERIC, @d_subc_str VARCHAR(255), @k_subc_str VARCHAR(255), @fond_own_id NUMERIC, @fond_cl_id NUMERIC, @bo1_comm_1 VARCHAR(255), @bo1_comm_2 VARCHAR(255), @bo1_profit MONEY, @acc_pncd_cl NUMERIC, @subc_pnkd VARCHAR(255), @fond_stock_own_id NUMERIC, @acc_uncd_cl NUMERIC, @bo_profit MONEY, @bo_nkd_profit_sum MONEY, @subc_for_c VARCHAR(255), @bo_marg_sum_ds MONEY, @bo1_total_com_in MONEY, @bo1_total_nkd2portf MONEY, @bo1_c_sum MONEY, @bo1_asset_place_id NUMERIC, @bo1_home_place_class_id NUMERIC, @bo1_home_object_id NUMERIC, @bo1_nominal_cur_id NUMERIC, @bo1_nominal_sum MONEY, @bo1_total_nkd2portf_acc MONEY, @bo1_bal_short_acc_sum MONEY, @bo1_unkd_bal_short_acc_sum MONEY, @bo1_bal_long_acc_sum MONEY, @bo1_unkd_bal_long_acc_sum MONEY, @fond_sum MONEY, @bo1_sum_accur MONEY, @dog_date DATETIME, @bo1_sum_qty2accur MONEY, @total_out_acc_sum MONEY, @xx_stock_id NUMERIC, @xx_subc_str VARCHAR(255), @acc_cur_id NUMERIC, @bo1_long_acc_sum MONEY, @bo1_short_acc_sum MONEY, @bo1_s_acc_sum MONEY, @bo1_acc_oper_sum MONEY, @bo_acc_sum_cur_id NUMERIC, @bo_profit_d_acc_cur_id NUMERIC, @bo_profit_c_acc_cur_id NUMERIC, @bo_plan_buch_id NUMERIC, @bo_plan2partner_id NUMERIC, @bo_qty2s MONEY, @bo_qty2acc2s MONEY, @bo1_id_date_d DATETIME, @free_ds_id NUMERIC, @dealing2upd_id NUMERIC, @bo_allow_short_tmp int, @bo_type_redemption NUMERIC, @bo_rate_face_value DECIMAL(18, 8), @oper_sum_my MONEY, @bo1_acc_oper_sum_my MONEY, @bo1_long_sum_my MONEY, @bo1_nominal_sum_my MONEY, @bo1_sum_accur_my MONEY, @bo1_unkd_long_sum_my MONEY, @bo1_short_sum_my MONEY, @bo1_unkd_short_sum_my MONEY, @bo1_profit_my MONEY, @bo1_nkd_profit_sum_my MONEY, @fond_sum_my MONEY, @bo1_unkd_bal_long_sum_my MONEY, @my_stock_nominal MONEY, @my_first_nominal MONEY, @res_oper_sum_close MONEY, @t_acc_id NUMERIC, @t_subc_str VARCHAR(255) #endif SELECT @bo_plan_buch_id = (SELECT .ARG_PLAN('PIF_ACCOUNT')) SELECT @bo_type_redemption = ISNULL(%TYPE_REDEMPTION%, 1) SELECT @bo_rate_face_value = %RATE_FACE_VALUE% ---- из строки аналитики достается ид сделки .GET_ITEM_FROM_TYPE_SUBC_STR(%P2L_SUBC%, 'DOC_SEC', @bo_deal_id) SELECT @acc_cur_id = cur_id FROM tb_baysale_docitems WHERE id = @bo_deal_id ----- код целевого назначения SELECT @bo_purpose_code = .PURPOSE_CODE(@bo1_perpose_id) ---- признак маржинальной сделки SELECT @type_repo_id = ( SELECT margin_deal FROM tb_repo_params WHERE id = @bo_deal_id ) -- Процесс доставания счетов для проводок -- если операция собственная, достается счет фонда компании IF %CHARACTER_ID% = 1 BEGIN .ACCID_FROM_CONST2PLAN(@fond_own_id, 'BACK_ACC_FUND_MONEY', @bo1_plan_money_id, 1, 2, 'Счет фонда компании', @bo1_mess_res) -- проводки по зачислению ПНКД так же туда SELECT @acc_pncd_cl = @fond_own_id END -- операция клиентская ELSE BEGIN -- по сделке ВБР -- клиентский счет по незавершенным сделкам вбр 3.1 IF @bo_purpose_code IN (27, 30) BEGIN .ACCID_FROM_CONST2PLAN(@fond_own_id, 'BACK_ACC_CL_OBLIG_VBR', @bo1_plan_money_id, 1, 1, 'Счет задолженности клиента', @bo1_mess_res) END -- в противном случае -- фонд клиента по ДС ELSE BEGIN .ACCID_FROM_CONST2PLAN(@fond_own_id, 'BACK_ACC_FUND_MONEY', @bo1_plan_money_id, 1, 3, 'Счет фонда ДС клиента', @bo1_mess_res) END -- далее достаются счета ПНКД, УНКД, фонда клиента по ЦБ .ACCID_FROM_CONST2PLAN(@acc_pncd_cl, 'BACK_ACC_CLIENT_PNKD', @bo1_plan_money_id, 1, 1, 'Счет ПНКД клиентов', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@fond_stock_own_id, 'BACK_ACC_FUND_SECUR', @bo1_plan_money_id, 1, 3, 'Счет фонда ЦБ клиентов', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@acc_uncd_cl, 'BAC_ACC_CLIENT_UNKD', @bo1_plan_money_id, 1, 1, 'Счет УНКД клиентов', @bo1_mess_res) END -- если план не ПИФ, то вычисляется счет 2.0 IF @bo1_plan_money_id <> @bo_plan_buch_id BEGIN -- используется для поиска остатка ДС и проверку на короткую позицию .ACCID_FROM_CONST2PLAN(@free_ds_id, 'BACK_ACC_MONEY_PLACE', @bo1_plan_money_id, 1, 1, 'Счет ДС', @bo1_mess_res) END #ifndef #stock_all #define #stock_all .MONEY_VAR(@stock_all_qty) .MONEY_VAR(@stock_all_exec) #endif #ifndef #stock_all1 .INT_VAR(@back_securs_inout_count) #define #stock_all1 #endif -- Вычисление еще ряда счетов .ACCID_FROM_CONST2PLAN(@bo1_long_acc_id, 'BACK_ACC_SECUR_MP_LONG', @bo1_plan_money_id, 1, 1, 'Счет ЦБ (длинная позиция)', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@bo1_short_acc_id, 'BACK_ACC_SECUR_MP_SHORT', @bo1_plan_money_id, 1, 1, 'Счет ЦБ (короткая позиция)', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@bo1_unkd_acc_id, 'BACK_ACC_UNKD', @bo1_plan_money_id, 1, 1, 'Счет УНКД', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@bo1_pnkd_acc_id, 'BACK_ACC_PNKD', @bo1_plan_money_id, 1, 1, 'Счет ПНКД', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@bo1_unkd_short_acc_id, 'BACK_ACC_UNKD_SHORT', @bo1_plan_money_id, 1, 1, 'Счет купонного дохода, зачисленного на короткую позицию', @bo1_mess_res) -- Вычисление счетов, корреспондирующих со счетами 4.4.0, 1.0.0 ,.... -- Для сделки в ТС это как правило 2.0....., -- для ряда групп. операций и опер. зачисл/списания ЦБ из целевого назначения IF @bo_purpose_code NOT IN (63, 58, 28, 43, 31, 44) BEGIN .ACCID_FROM_OBJ2PLAN(@bo1_ext_acc_id, @bo1_perpose_id, @bo1_plan_money_id, 1, 1, 'Внешний счет', @bo1_mess_res) END -- для ТС по месту нахождения ELSE BEGIN .GET_ITEM_FROM_TYPE_SUBC_STR(%EXT_SUBC%, 'ASSET_PLACES', @bo1_asset_place_id) .BACK_GET_OBJ2BROK2TS(@bo1_asset_place_id, @bo1_owner_id, @bo1_home_place_class_id, @bo1_home_object_id) .ACCID_FROM_OBJ2PLAN(@bo1_ext_acc_id, @bo1_home_place_class_id, @bo1_plan_money_id, 1, 1, 'Внешний счет', @bo1_mess_res) END -- Вычисление ряда счетов .ACCID_FROM_CONST2PLAN(@bo1_realiz_acc_id, 'BACK_ACC_REALIZ', @bo1_plan_money_id, 1, 1, 'Cчет реализации', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@bo1_profit_acc_id, 'BACK_ACC_PROFIT_BAYSALE_MAIN', @bo1_plan_money_id, 1, 1, 'Счет прибыли или убытки по сделке (основной)', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@bo1_pereoc_acc_id, 'BACK_ACC_PEREOC', @bo1_plan_money_id, 1, 1, 'Счет переоценки ', @bo1_mess_res) .ACCID_FROM_CONST2PLAN(@bo1_fut_profit_acc_id, 'BACK_ACC_PROFIT_BAYSALE_FUTUR', @bo1_plan_money_id, 1, 1, 'Счет прибыли или убытки со счетов расходов - доходов будущих периодов ', @bo1_mess_res) -- если ВБР IF @bo_purpose_code IN (27, 30) BEGIN -- поиск факт даты подп. договора, ЦБ (т.к. могут различаться с ЦБ в операции), валюту сделки SELECT @dog_date = fact_dog_date, @xx_stock_id = stock_id, @bo_acc_sum_cur_id = tb_baysale_docitems.cur_id FROM tb_plan2fact_dates, tb_baysale_docitems WHERE tb_plan2fact_dates.id = @bo_deal_id AND tb_baysale_docitems.id = @bo_deal_id SELECT @xx_subc_str = %EXT_SUBC% .SUBC_STR_ADD(@xx_subc_str, 'STOCK_EMIS', @xx_stock_id) END -- дата сделки, для задания дат, если они вдруг не заданы в шаблоне и для ТС SELECT @bo1_id_date_d = in_date FROM td_depo_docs WHERE id = @bo_deal_id IF @dog_date IS NULL SELECT @dog_date = @bo1_id_date_d IF %OP_DATE% IS NULL SELECT %OP_DATE% = @bo1_id_date_d IF %RATE_DATE% IS NULL SELECT %RATE_DATE% = @bo1_id_date_d SELECT @bo_plan2partner_id = .PLAN2PARTNER_ID(@bo1_owner_id, @bo1_plan_money_id) -- если ВБр IF @bo_purpose_code IN (27, 30) BEGIN -- ищем количество бумаг по сделке и сумму в валюте сделки с КД SELECT @bo1_sum_qty2accur = stock_qty, @bo1_sum_accur = summ_doc_total2unkd FROM tb_baysale_docitems WHERE id = @bo_deal_id -- Вычисление остатков по сделкам ВБР по счетам обязательств (1.2.2,1.1.2) -- если покупка IF @bo1_in_out = 1 BEGIN .ACCID_FROM_CONST2PLAN(@bo1_oblig_acc_xx_id, 'BACK_ACC_SECUR_VBR_DOG', @bo1_plan_money_id, 2, 1, 'Счет обязательств по ЦБ (договор)', @bo1_mess_res) SELECT @bo1_s_sum = 0 .SALDO_NOW_SBC(@bo_plan2partner_id, @bo1_oblig_acc_xx_id, %EXT_SUBC%, 1, @bo1_s_sum, @bo1_s_qty, @bo1_s_acc_sum) END -- продажа ELSE BEGIN .ACCID_FROM_CONST2PLAN(@bo1_oblig_acc_xx_id, 'BACK_ACC_SECUR_VBR_DOG', @bo1_plan_money_id, 3, 1, 'Счет обязательств по ЦБ (договор)', @bo1_mess_res) .SALDO_NOW_SBC(@bo_plan2partner_id, @bo1_oblig_acc_xx_id, %EXT_SUBC%, (-1), @bo1_s_sum, @bo1_s_qty, @bo1_s_acc_sum) END END IF ISNULL(@bo1_sum_qty2accur, 0) = 0 SELECT @bo1_sum_accur = 0 ELSE -- вычисление списываемой суммы, прапорционально количеству списываемых ЦБ SELECT @bo1_sum_accur = ROUND((CONVERT(DOUBLE PRECISION, @bo1_sum_accur) * CONVERT(DOUBLE PRECISION, %STOCK_QTY% / @bo1_sum_qty2accur)), 2) .ASSIGN(@back_securs_inout_count, 1) SELECT @subc_for_check = %HOME_SUBC% .SUBC_STR_DEL(@subc_for_check, 'DOC_SEC_IN') .SUBC_STR_DEL(@subc_for_check, 'PORTFOLIO') -- Проверка что последняя перерегистрация SELECT @bo1_s_sum = ROUND(@bo1_s_sum, 2) SELECT @bo1_s_acc_sum = ROUND(@bo1_s_acc_sum, 2) IF @bo1_s_qty = %STOCK_QTY% SELECT @is_last = 1 ELSE SELECT @is_last = 0 -- Принятие и снятие с клиента IF ( SELECT code FROM t_purposes WHERE id = @bo1_perpose_id ) IN (29, 32, 108, 110, 93) BEGIN -- Вычисление счетов счетов УНКД по ряду целевых назначений .ACCID_FROM_CONST2PLAN(@bo1_client_unkd_acc_id, 'BAC_ACC_CLIENT_UNKD', @bo1_plan_money_id, 1, 1, 'Счет фондов клиента - УНКД', @bo1_mess_res) END -- в противном случае счет УНКД - счет ДС ELSE BEGIN .ASSIGN(@bo1_client_unkd_acc_id, @bo1_ext_acc_id) END .ASSIGN(@bo1_home_subc, %HOME_SUBC% ) .ASSIGN(@bo1_ext_subc, %EXT_SUBC% ) .ASSIGN(@bo1_realiz_subc, %PNKD_SUBC%) .ASSIGN(@bo1_qty_ost, %STOCK_QTY% ) .ASSIGN(@bo1_allow_short4own, %IS_ALLOW_SHORT4OWN%) .ASSIGN(@bo1_allow_short4client, %IS_ALLOW_SHORT4CLIENT%) .ASSIGN(@is_calc_profit, %IS_CALC_PROFIT% ) SELECT @bo1_comm = ( SELECT name FROM t_purposes WHERE id = @bo1_perpose_id ) .ASSIGN(@bo1_comm_add1, @bo1_comm) .ASSIGN(@bo1_lf_subc_type_id, (.SUBCTYPE_FROM_CODE('DOC_SEC_IN'))) .GET_ITEM_FROM_TYPE_SUBC_STR(%HOME_SUBC%, 'INVESTORS', @bo_investor_id) .GET_ITEM_FROM_TYPE_SUBC_STR(%HOME_SUBC%, 'STOCK_EMIS', @bo_stock_id) SELECT @my_stock_nominal = stock_nominal, @my_first_nominal = first_nominal FROM td_stock_emis WHERE id = @bo_stock_id -- установка даты проведения операции для списания лифо-фифо .LF_NUMBER_UPDATE(@id) -- Обработка если покупка/продажа ТС,прием/снятие ЦБ, корпоративные действия -- Поступление IF @bo1_in_out = 1 BEGIN -- Пытаемся списать короткую позицию IF %CHARACTER_ID% = 2 BEGIN -- короткая позиция клиента SELECT @subc_for_c = '' .SUBC_STR_ADD(@subc_for_c, 'INVESTORS', @bo_investor_id) SELECT @bo1_c_sum = 0 --Вычисление сальдо денег по всем счетам ДС для проверки короткой по деньгам IF @bo_purpose_code IN (43, 44) BEGIN .SALDO(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_ext_acc_id, @subc_for_c, N, D, @bo1_c_sum, N) END ELSE BEGIN .SALDO(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @free_ds_id, @subc_for_c, N, D, @bo1_c_sum, N) END -- какой будет остаток после проведения сделки SELECT @bo_marg_sum_ds = ISNULL(@bo1_c_sum, 0) - %SUM% END -- короткая позиция собственная ELSE BEGIN SELECT @subc_for_c = '' .SUBC_STR_ADD(@subc_for_c, 'INVESTORS', @bo_investor_id) -- Вычисление сальдо денег по всем счетам ДС для проверки короткой по деньгам .SALDO(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @free_ds_id, @subc_for_c, N, D, @bo1_c_sum, N) -- какой будет остаток после проведения сделки SELECT @bo_marg_sum_ds = ISNULL(@bo1_c_sum, 0) - %SUM% SELECT @bo1_c_sum = 0 END IF @bo_purpose_code NOT IN (27, 35, 109, 94, 48, 45, 63) AND @bo1_plan_money_id <> @bo_plan_buch_id BEGIN -- в случае запрета короткой позиции IF %CHARACTER_ID% = 2 SELECT @bo_allow_short_tmp = %IS_ALLOW_SHORT4CLIENT% ELSE SELECT @bo_allow_short_tmp = %IS_ALLOW_SHORT4OWN% IF (@bo_allow_short_tmp <> 1) --AND (ROUND(@bo_marg_sum_ds, 4) < 0) BEGIN -- Списание с ДП .EXIT_MESSAGE('Превышен остаток по длинной позиции по ДС. Короткая позиция не разрешена') END -- если короткая разрешена ELSE IF (@bo_allow_short_tmp = 1) AND (ROUND(@bo_marg_sum_ds, 4) < 0) BEGIN --- ставим галочку, что она маржинальная UPDATE tb_repo_params SET margin_deal = 1 WHERE id = @bo_deal_id END END--2 SELECT @bo_marg_sum_ds = ABS(@bo_marg_sum_ds) .ASSIGN(@bo1_comm_main, (' Перечисление ДС на реализацию')) -- Блок перевода ДС на реализацию -- Если используем счет 5.0 (реализация) IF %IS_REALIZ% = 1 BEGIN -- вычисление количества, которое вообще находится на короткой позиции (которое надо откупить) SELECT @qty_check = ISNULL(SUM(a.saldo_qty * a.deb_or_cred) * (-1), 0) FROM t_account_now a, t_accnow_subconto s, td_depo_docs d WHERE a.plan2partner_id = @bo_plan2partner_id AND a.acc_id = @bo1_short_acc_id AND a.subc_eff_num LIKE ISNULL('%' + @subc_for_check + '%', '%') AND a.id = s.id AND s.subconto_type_id = @bo1_lf_subc_type_id AND s.item_id = d.id AND d.lf_date < DATEADD(DAY, 1, %OP_DATE%) -- вычисление количества ЦБ, прапорционально чему будет списываться сумма на реализацию IF @qty_check >= %STOCK_QTY% SELECT @qty_check = %STOCK_QTY% -- вычисление суммы, которая пойдет на реализацию SELECT @oper_sum = (ROUND((%SUM% * @qty_check / %STOCK_QTY%), 2)) + (ROUND((ISNULL(%NKD_SUM%, 0) * @qty_check / %STOCK_QTY%), 2)) -- вычисление суммы в валюте, которая пойдет на реализацию SELECT @bo1_acc_oper_sum = (ROUND((%ACC_SUM% * @qty_check / %STOCK_QTY%), 2)) -- Разрешить, если ц.н. 44 IF @bo_purpose_code NOT IN (29, 35, 50, 55, 94, 43, 108, 109, 93, 32, 36, 51, 65, 110, 111) BEGIN -- проводка по реализации IF @bo_type_redemption IN (3, 4) BEGIN SELECT @oper_sum_my = ROUND(((@oper_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) SELECT @bo1_acc_oper_sum_my = ROUND(((@bo1_acc_oper_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_main = @bo1_comm_main + ' - 1' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_realiz_acc_id, @bo1_ext_acc_id, @oper_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_main, Y, @operation_id, @id, @action_id, @action_history_id, NULL, @bo1_acc_oper_sum_my, @bo1_realiz_subc, @bo1_ext_subc, NULL, @bo_acc_sum_cur_id) END ELSE BEGIN --select @bo1_comm_main = @bo1_comm_main + ' - 2' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_realiz_acc_id, @bo1_ext_acc_id, @oper_sum, @bo1_money_plan_cur_id, %OP_DATE%, @qty_check, @qty_check, @bo1_comm_main, Y, @operation_id, @id, @action_id, @action_history_id, NULL, @bo1_acc_oper_sum, @bo1_realiz_subc, @bo1_ext_subc, NULL, @bo_acc_sum_cur_id) END END END .ASSIGN(@bo1_comm_main, (@bo1_comm + ' Покрываем короткую позицию ')) -- Списания обяз. по короткой позиции -- если реализация IF %IS_REALIZ% = 1 AND @bo_purpose_code NOT IN (29, 35, 50, 55, 94, 43, 108, 109, 93, 32, 36, 51, 65, 110, 111) BEGIN -- 1) 1.0.1 - 5.0 (списание к.п. по партиям) -- 2) 4.4.1 - 4.4.4 (Списание УНКД с короткой позиции если с Купонным доходом) -- 3) списание затрат по продаже -- партионное списание с короткой позиции ЦБ, купона, затрат с корреспонденцией счет реализации -- .ASSET_BAL_OUT(@bo1_owner_id, @bo1_plan_money_id, @bo1_out_method_id, -1, @bo1_short_acc_id, @bo1_realiz_acc_id, @bo1_unkd_short_acc_id, @bo1_pnkd_acc_id, @bo1_pereoc_acc_id, @bo1_fut_profit_acc_id, @bo1_lf_subc_type_id, -- %OP_DATE%, %STOCK_QTY%, @bo1_comm_main, @bo1_home_subc, @bo1_realiz_subc, %PNKD_SUBC%, @action_history_id, %IS_COM_IN%, @bo1_bal_short_sum, @bo1_short_qty, @bo1_unkd_bal_short_sum, -- @bo1_unkd_short_qty, @bo1_pereoc_sum, @bo1_pereoc_qty, @bo1_total_com_in, @bo1_total_nkd2portf, @bo1_result, -- @bo1_total_nkd2portf_acc, @bo1_bal_short_acc_sum, @bo1_unkd_bal_short_acc_sum, @total_out_acc_sum, @res_oper_sum_close, @bo_type_redemption, @bo_rate_face_value, %TOTAL_SUM%) EXEC ap_back_asset_bal_out @bo1_owner_id, @bo1_plan_money_id, @bo1_out_method_id, -1, @bo1_short_acc_id, @bo1_realiz_acc_id, @bo1_unkd_short_acc_id, @bo1_pnkd_acc_id, @bo1_pereoc_acc_id, @bo1_fut_profit_acc_id, @bo1_lf_subc_type_id, %OP_DATE%, %STOCK_QTY%, @bo1_comm_main, @bo1_home_subc, @bo1_realiz_subc, %PNKD_SUBC%, @action_history_id, %IS_COM_IN%, @bo1_bal_short_sum OUT, @bo1_short_qty OUT, @bo1_unkd_bal_short_sum OUT, @bo1_unkd_short_qty OUT, @bo1_pereoc_sum OUT, @bo1_pereoc_qty OUT, @bo1_result OUT, @bo1_total_com_in OUT, @bo1_total_nkd2portf OUT, @bo1_total_nkd2portf_acc OUT, @bo1_bal_short_acc_sum OUT, @bo1_unkd_bal_short_acc_sum OUT, @total_out_acc_sum OUT, @res_oper_sum_close OUT, @bo_type_redemption, @bo_rate_face_value, %TOTAL_SUM% END ELSE BEGIN -- 1) 1.0.1 - один из трех счетов (списание к.п. по партиям) -- 2) 4.4.1 - 4.4.4 (Списание УНКД с короткой позиции если с Купонным доходом) -- 3) списание затрат по продаже -- партионное списание с короткой позиции ЦБ, купона, затрат с корреспонденцией счет ДС (обяз. по ВБР) -- .ASSET_BAL_OUT(@bo1_owner_id, @bo1_plan_money_id, @bo1_out_method_id, (-1), @bo1_short_acc_id, @bo1_ext_acc_id, @bo1_unkd_short_acc_id, @bo1_pnkd_acc_id, @bo1_pereoc_acc_id, @bo1_fut_profit_acc_id, @bo1_lf_subc_type_id, -- %OP_DATE%, %STOCK_QTY%, @bo1_comm_main, @bo1_home_subc, @bo1_ext_subc, %PNKD_SUBC%, @action_history_id, %IS_COM_IN%, @bo1_bal_short_sum, @bo1_short_qty, @bo1_unkd_bal_short_sum, -- @bo1_unkd_short_qty, @bo1_pereoc_sum, @bo1_pereoc_qty, @bo1_total_com_in, @bo1_total_nkd2portf, @bo1_result, @bo1_total_nkd2portf_acc, @bo1_bal_short_acc_sum, @bo1_unkd_bal_short_acc_sum, -- @total_out_acc_sum, @res_oper_sum_close, @bo_type_redemption, @bo_rate_face_value, %TOTAL_SUM%) EXEC ap_back_asset_bal_out @bo1_owner_id, @bo1_plan_money_id, @bo1_out_method_id, -1, @bo1_short_acc_id, @bo1_ext_acc_id, @bo1_unkd_short_acc_id, @bo1_pnkd_acc_id, @bo1_pereoc_acc_id, @bo1_fut_profit_acc_id, @bo1_lf_subc_type_id, %OP_DATE%, %STOCK_QTY%, @bo1_comm_main, @bo1_home_subc, @bo1_ext_subc, %PNKD_SUBC%, @action_history_id, %IS_COM_IN%, @bo1_bal_short_sum OUT, @bo1_short_qty OUT, @bo1_unkd_bal_short_sum OUT, @bo1_unkd_short_qty OUT, @bo1_pereoc_sum OUT, @bo1_pereoc_qty OUT, @bo1_result OUT, @bo1_total_com_in OUT, @bo1_total_nkd2portf OUT, @bo1_total_nkd2portf_acc OUT, @bo1_bal_short_acc_sum OUT, @bo1_unkd_bal_short_acc_sum OUT, @total_out_acc_sum OUT, @res_oper_sum_close OUT, @bo_type_redemption, @bo_rate_face_value, %TOTAL_SUM% END -- Вычисление списанных величин SELECT %TOTAL_OUT_SUM% = @bo1_bal_short_sum SELECT %TOTAL_OUT_QTY% = @bo1_short_qty SELECT %TOTAL_UNKD_SUM_OUT% = @bo1_unkd_bal_short_sum SELECT %TOTAL_OUT_COM_IN% = @bo1_total_com_in IF @bo_purpose_code IN (27, 30) SELECT @bo1_sum_accur = ISNULL(@bo1_sum_accur,0) - ISNULL(@total_out_acc_sum, 0) ELSE SELECT @bo1_sum_accur = 0 .ASSIGN(@bo1_long_qty, (%STOCK_QTY% - @bo1_short_qty)) -- Короткая сумма пропорциональна кол бумаг -- Списали не все бумаги IF @bo1_short_qty < %STOCK_QTY% BEGIN -- если часть бумаг осталась не списанная, то вычисляем сколько пойдет на длинную .ASSIGN(@bo1_short_sum,(ROUND((%SUM% * @bo1_short_qty / %STOCK_QTY%), 2))) .ASSIGN(@bo1_long_sum,(ROUND(%SUM%, 2) - @bo1_short_sum)) .ASSIGN(@bo1_unkd_short_sum,(ROUND((%NKD_SUM% * @bo1_short_qty / %STOCK_QTY%), 2))) .ASSIGN(@bo1_unkd_long_sum,(ROUND(%NKD_SUM%, 2) - @bo1_unkd_short_sum)) END -- Все количество ушло на покрытие короткой ELSE BEGIN .ASSIGN(@bo1_short_sum, (ROUND(%SUM%, 2))) .ASSIGN(@bo1_long_sum, 0) .ASSIGN(@bo1_unkd_short_sum, (ROUND(%NKD_SUM%, 2))) .ASSIGN(@bo1_unkd_long_sum, 0) END -- Прибыль по откупу короткой .ASSIGN(@bo1_profit_sum, (@bo1_short_sum - ROUND(@bo1_bal_short_sum, 2))) -- Прибыль по УНКД .ASSIGN(@bo1_nkd_profit_sum, (@bo1_unkd_short_sum - ROUND(@bo1_unkd_bal_short_sum, 2))) SELECT @bo1_s_sum = ISNULL(@bo1_s_sum, 0) - ISNULL(@bo1_long_sum, 0) - ISNULL(@bo1_short_sum, 0) - ISNULL(%NKD_SUM%, 0) -- добиваем сумму прибыли/убытка на остаток IF (@is_last = 1) AND (@bo_purpose_code NOT IN (27, 28, 29, 30, 31, 32, 35, 36)) BEGIN IF ISNULL(@bo1_profit_sum, 0) <> 0 SELECT @bo1_profit_sum = @bo1_profit_sum + @bo1_s_sum ELSE SELECT @bo1_long_sum = @bo1_long_sum + @bo1_s_sum END -- Зачисляем на длинную IF @bo1_long_qty > 0 BEGIN .ASSIGN(@bo1_comm_main, (@bo1_comm + ' Постановка на баланс ')) SELECT @bo1_long_sum = ROUND(@bo1_long_sum, 2) -- вычисление зачисляемой суммы на 100 счет в валюте номинала .BACK_CALC_STOCK_VAL_SUM(@bo_stock_id, %OP_DATE%, @bo1_long_sum, @bo1_money_plan_cur_id, @bo1_nominal_sum, @bo1_nominal_cur_id) -- 1.0.0 - один из трех счетов -- проводка зачисления на 100 IF @bo_type_redemption IN (3, 4) BEGIN SELECT @bo1_long_sum_my = ROUND(((@bo1_long_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) SELECT @bo1_nominal_sum_my = ROUND(((@bo1_nominal_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) SELECT @bo1_sum_accur_my = ROUND(((@bo1_sum_accur * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_main = @bo1_comm_main + ' - 3' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_long_acc_id, @bo1_ext_acc_id, @bo1_long_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_main, Y, @operation_id, @id, @action_id, @action_history_id, @bo1_nominal_sum_my, @bo1_sum_accur_my, @bo1_home_subc, @bo1_ext_subc, @bo1_nominal_cur_id, @acc_cur_id) END ELSE BEGIN --select @bo1_comm_main = @bo1_comm_main + ' - 4' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_long_acc_id, @bo1_ext_acc_id, @bo1_long_sum, @bo1_money_plan_cur_id, %OP_DATE%, @bo1_long_qty, @bo1_long_qty, @bo1_comm_main, Y, @operation_id, @id, @action_id, @action_history_id, @bo1_nominal_sum, @bo1_sum_accur, @bo1_home_subc, @bo1_ext_subc, @bo1_nominal_cur_id, @acc_cur_id) END -- зачисление части УНКД IF ISNULL(@bo1_unkd_long_sum, 0) > 0 BEGIN SELECT @bo1_unkd_long_sum = ROUND(@bo1_unkd_long_sum, 2) .ASSIGN(@bo1_comm_add1, (@bo1_comm_add1 + ' Постановка на баланс НКД')) -- вычисление зачисляемой суммы на счет 440 в валюте номинала (КД) .BACK_CALC_STOCK_VAL_SUM(@bo_stock_id, %OP_DATE%, @bo1_unkd_long_sum, @bo1_money_plan_cur_id, @bo1_nominal_sum, @bo1_nominal_cur_id) -- 4.4.0 - один из трех счетов (или 3.3.0 если прием ЦБ в фонд клиента) -- проводка по зачислению УНКД IF @bo_type_redemption IN (3, 4) BEGIN -- SELECT @bo1_unkd_long_sum_my = ROUND(((@bo1_unkd_long_sum * @bo_rate_face_value) / 100), 2) SELECT @bo1_unkd_long_sum_my = ROUND(((@bo1_unkd_long_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) -- SELECT @bo1_nominal_sum_my = ROUND(((@bo1_nominal_sum * @bo_rate_face_value) / 100), 2) SELECT @bo1_nominal_sum_my = ROUND(((@bo1_nominal_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_add1 = @bo1_comm_add1 + ' - 5' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_unkd_acc_id, @bo1_client_unkd_acc_id, @bo1_unkd_long_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_add1, Y, @operation_id, @id, @action_id, @action_history_id, @bo1_nominal_sum_my, NULL, @bo1_home_subc, @bo1_ext_subc, @bo1_nominal_cur_id, NULL) END ELSE IF @bo_type_redemption = 1 BEGIN --select @bo1_comm_add1 = @bo1_comm_add1 + ' - 6' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_unkd_acc_id, @bo1_client_unkd_acc_id, @bo1_unkd_long_sum, @bo1_money_plan_cur_id, %OP_DATE%, @bo1_long_qty, 0, @bo1_comm_add1, Y, @operation_id, @id, @action_id, @action_history_id, @bo1_nominal_sum, NULL, @bo1_home_subc, @bo1_ext_subc, @bo1_nominal_cur_id, NULL) END END END END -- Списание ELSE BEGIN -- Пытаемся списать длинную позицию -- Блок перевода ДС на реализацию -- Через реализацию ДС IF %IS_REALIZ% = 1 BEGIN .ASSIGN(@bo1_comm_main, (' Перечисление ДС на реализацию')) -- вычисление количества ЦБ, которое находится на длинной позиции SELECT @qty_check = ISNULL(SUM(a.saldo_qty * a.deb_or_cred), 0) FROM t_account_now a, t_accnow_subconto s, td_depo_docs d WHERE a.plan2partner_id = @bo_plan2partner_id AND a.acc_id = @bo1_long_acc_id AND a.subc_eff_num LIKE ISNULL('%' + @subc_for_check + '%', '%') AND a.id = s.id AND s.subconto_type_id = @bo1_lf_subc_type_id AND s.item_id = d.id AND d.lf_date < DATEADD(DAY, 1, %OP_DATE%) -- вычисление количества, прапорционально которому будет рассчитываться -- сумма реалтизации IF @qty_check >= %STOCK_QTY% SELECT @qty_check = %STOCK_QTY% -- вычисление суммы реализации .ASSIGN(@oper_sum, (ROUND((%SUM% * @qty_check / %STOCK_QTY%), 2))) SELECT @bo1_acc_oper_sum = (ROUND((%ACC_SUM% * @qty_check / %STOCK_QTY%), 2)) IF @bo1_plan_money_id = @bo_plan_buch_id BEGIN SELECT @oper_sum = ROUND(%SUM%, 2) SELECT @qty_check = %STOCK_QTY% END -- проводка по реализации IF @bo_purpose_code NOT IN (29, 35, 50, 55, 94, 43, 108, 109, 93, 32, 36, 51, 65, 110, 111) BEGIN IF @bo_type_redemption IN (3, 4) BEGIN SELECT @oper_sum_my = ROUND(((@my_first_nominal * @bo_rate_face_value*%STOCK_QTY%)/100),2) --kashuba_av в случае частичного погашения считаем так SELECT @bo1_acc_oper_sum_my = ROUND(((@bo1_acc_oper_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_main = @bo1_comm_main + ' - 7' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_ext_acc_id, @bo1_realiz_acc_id, @oper_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_main, Y, @operation_id, @id, @action_id, @action_history_id, @bo1_acc_oper_sum_my, NULL, @bo1_ext_subc, @bo1_realiz_subc, @bo_acc_sum_cur_id, NULL) END ELSE BEGIN --select @bo1_comm_main = @bo1_comm_main + ' - 8' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_ext_acc_id, @bo1_realiz_acc_id, @oper_sum, @bo1_money_plan_cur_id, %OP_DATE%, @qty_check, @qty_check, @bo1_comm_main, Y, @operation_id, @id, @action_id, @action_history_id, @bo1_acc_oper_sum, NULL, @bo1_ext_subc, @bo1_realiz_subc, @bo_acc_sum_cur_id, NULL) END END END -- Конец списания через реализацию .ASSIGN(@bo1_comm_main, (@bo1_comm + ' Списание балансовой стоимости ')) -- через реализацию ЦБ IF %IS_REALIZ% = 1 AND @bo_purpose_code NOT IN (29, 35, 50, 55, 94, 43, 108, 109, 93, 32, 36, 51, 65, 110, 111) BEGIN -- 1) 5.0 - 1.0.0 (списание длинной поз. по партиям) -- 2) 4.4.0 - 4.4.1 (Списание УНКД) -- 3) списание затрат по покупке. Проводка только в том случае, если исп. отд. счет для затрат по покупке. -- 4.3.0.0 (4.3.0.2 - если используем отд. счет для приб/уб по комиссиям) - 4.4.6 -- 3.7.0 (если собств.) (3.0.0 (если клиентская)) - 4.3.0.0 (4.3.0.2) -- партионное списание ЦБ, Купона, затрат на преобретение, накопленной переоценки в корресп. со счетом реализации -- .ASSET_BAL_OUT(@bo1_owner_id, @bo1_plan_money_id, @bo1_out_method_id, 1, @bo1_long_acc_id, @bo1_realiz_acc_id, @bo1_unkd_acc_id, @bo1_pnkd_acc_id, @bo1_pereoc_acc_id, @bo1_fut_profit_acc_id, @bo1_lf_subc_type_id, -- %OP_DATE%, %STOCK_QTY%, @bo1_comm_main, @bo1_home_subc, @bo1_realiz_subc, %PNKD_SUBC%, @action_history_id, %IS_COM_IN%, @bo1_bal_long_sum, @bo1_long_qty, @bo1_unkd_bal_long_sum, -- @bo1_unkd_long_qty, @bo1_pereoc_sum, @bo1_pereoc_qty, @bo1_total_com_in, @bo1_total_nkd2portf, @bo1_result, @bo1_total_nkd2portf_acc, -- @bo1_bal_long_acc_sum, @bo1_unkd_bal_long_acc_sum, @total_out_acc_sum, @res_oper_sum_close, @bo_type_redemption, @bo_rate_face_value, %TOTAL_SUM%) EXEC ap_back_asset_bal_out @bo1_owner_id, @bo1_plan_money_id, @bo1_out_method_id, 1, @bo1_long_acc_id, @bo1_realiz_acc_id, @bo1_unkd_acc_id, @bo1_pnkd_acc_id, @bo1_pereoc_acc_id, @bo1_fut_profit_acc_id, @bo1_lf_subc_type_id, %OP_DATE%, %STOCK_QTY%, @bo1_comm_main, @bo1_home_subc, @bo1_realiz_subc, %PNKD_SUBC%, @action_history_id, %IS_COM_IN%, @bo1_bal_long_sum OUT, @bo1_long_qty OUT, @bo1_unkd_bal_long_sum OUT, @bo1_unkd_long_qty OUT, @bo1_pereoc_sum OUT, @bo1_pereoc_qty OUT, @bo1_result OUT, @bo1_total_com_in OUT, @bo1_total_nkd2portf OUT, @bo1_total_nkd2portf_acc OUT, @bo1_bal_long_acc_sum OUT, @bo1_unkd_bal_long_acc_sum OUT, @total_out_acc_sum OUT, @res_oper_sum_close OUT, @bo_type_redemption, @bo_rate_face_value, %TOTAL_SUM% END -- Не через реализацию ЦБ ELSE BEGIN -- 1) один из трех счетов - 1.0.0 (списание длинной поз. по партиям) -- 2) 4.4.0 - 4.4.1 (Списание УНКД) -- 3) списание затрат по покупке. Проводка только в том случае, если исп. отд. счет для затрат по покупке. -- 4.3.0.0 (4.3.0.2 - если используем отд. счет для приб/уб по комиссиям) - 4.4.6 -- 3.0.7(если собств.) (3.0.0 (если клиентская)) - 4.3.0.0 (4.3.0.2) -- партионное списание ЦБ, Купона, затрат на преобретение, накопленной переоценки в корресп. со счетом ДС (или 1.1.2,1.2.2) -- .ASSET_BAL_OUT(@bo1_owner_id, @bo1_plan_money_id, @bo1_out_method_id, 1, @bo1_long_acc_id, @bo1_ext_acc_id, @bo1_unkd_acc_id, @bo1_pnkd_acc_id, @bo1_pereoc_acc_id, @bo1_fut_profit_acc_id, @bo1_lf_subc_type_id, -- %OP_DATE%, %STOCK_QTY%, @bo1_comm_main, @bo1_home_subc, @bo1_ext_subc, %PNKD_SUBC%, @action_history_id, %IS_COM_IN%, @bo1_bal_long_sum, @bo1_long_qty, @bo1_unkd_bal_long_sum, -- @bo1_unkd_long_qty, @bo1_pereoc_sum, @bo1_pereoc_qty, @bo1_total_com_in, @bo1_total_nkd2portf, @bo1_result, -- @bo1_total_nkd2portf_acc, @bo1_bal_long_acc_sum, @bo1_unkd_bal_long_acc_sum, @total_out_acc_sum, @res_oper_sum_close, @bo_type_redemption, @bo_rate_face_value, %TOTAL_SUM%) EXEC ap_back_asset_bal_out @bo1_owner_id, @bo1_plan_money_id, @bo1_out_method_id, 1, @bo1_long_acc_id, @bo1_ext_acc_id, @bo1_unkd_acc_id, @bo1_pnkd_acc_id, @bo1_pereoc_acc_id, @bo1_fut_profit_acc_id, @bo1_lf_subc_type_id, %OP_DATE%, %STOCK_QTY%, @bo1_comm_main, @bo1_home_subc, @bo1_ext_subc, %PNKD_SUBC%, @action_history_id, %IS_COM_IN%, @bo1_bal_long_sum OUT, @bo1_long_qty OUT, @bo1_unkd_bal_long_sum OUT, @bo1_unkd_long_qty OUT, @bo1_pereoc_sum OUT, @bo1_pereoc_qty OUT, @bo1_result OUT, @bo1_total_com_in OUT, @bo1_total_nkd2portf OUT, @bo1_total_nkd2portf_acc OUT, @bo1_bal_long_acc_sum OUT, @bo1_unkd_bal_long_acc_sum OUT, @total_out_acc_sum OUT, @res_oper_sum_close OUT, @bo_type_redemption, @bo_rate_face_value, %TOTAL_SUM% END -- Получение списанных параметров SELECT %TOTAL_OUT_SUM% = @bo1_bal_long_sum SELECT %TOTAL_OUT_QTY% = @bo1_long_qty SELECT %TOTAL_UNKD_SUM_OUT% = @bo1_unkd_bal_long_sum SELECT %TOTAL_OUT_COM_IN% = @bo1_total_com_in IF @bo_purpose_code IN (27, 30) SELECT @bo1_sum_accur = ISNULL(@bo1_sum_accur, 0) - ISNULL(@total_out_acc_sum, 0) ELSE SELECT @bo1_sum_accur = 0 .ASSIGN(@bo1_short_qty, (%STOCK_QTY% - @bo1_long_qty)) -- Длинная сумма пропорциональна кол бумаг -- Списали не все бумаги IF @bo1_long_qty < %STOCK_QTY% BEGIN -- вычисляем, сколько пойдет на короткую позицию .ASSIGN(@bo1_long_sum, (ROUND((%SUM% * @bo1_long_qty / %STOCK_QTY%), 2))) .ASSIGN(@bo1_short_sum,(ROUND(%SUM%, 2) - @bo1_long_sum)) .ASSIGN(@bo1_unkd_long_sum,(ROUND((%NKD_SUM% * @bo1_long_qty / %STOCK_QTY%), 2))) .ASSIGN(@bo1_unkd_short_sum,(ROUND(%NKD_SUM%, 2) - @bo1_unkd_long_sum)) END ELSE BEGIN -- Все количество ушло на списание с длинной .ASSIGN(@bo1_long_sum, (ROUND(%SUM%, 2))) .ASSIGN(@bo1_short_sum, 0) .ASSIGN(@bo1_unkd_long_sum, (ROUND(%NKD_SUM%, 2))) .ASSIGN(@bo1_unkd_short_sum, 0) END -- вычисление прибыли/убытка .ASSIGN(@bo1_profit_sum, (@bo1_long_sum - ROUND(@bo1_bal_long_sum, 2))) SELECT @bo1_s_sum = ISNULL(@bo1_s_sum, 0) - ISNULL(@bo1_long_sum, 0) - ISNULL(@bo1_short_sum, 0) - ISNULL(%NKD_SUM%, 0) IF @is_last = 1 BEGIN IF ISNULL(@bo1_profit_sum, 0) <> 0 BEGIN IF %IS_REALIZ% <> 1 SELECT @bo1_profit_sum = @bo1_profit_sum + @bo1_s_sum END END -- Прибыль по УНКД .ASSIGN(@bo1_nkd_profit_sum, (@bo1_unkd_long_sum - ROUND(@bo1_unkd_bal_long_sum, 2) - ISNULL(@bo1_total_nkd2portf, 0))) -- Проверка на короткую позицию по ЦБ -- короткая позиция клиента IF %CHARACTER_ID% = 2 BEGIN -- Чтоб не было проверки по ПИФ IF @bo1_plan_money_id <> @bo_plan_buch_id BEGIN -- Списание с ДП IF (%IS_ALLOW_SHORT4CLIENT% <> 1) AND (ROUND(@bo1_short_qty, 4) > 0) BEGIN -- короткая не разрешена .EXIT_MESSAGE('Превышен остаток по длинной позиции по ЦБ. Короткая позиция не разрешена.') END ELSE IF (%IS_ALLOW_SHORT4CLIENT% = 1) AND (ROUND(@bo1_short_qty, 4) > 0) BEGIN -- короткая разрешена, ставим галочку UPDATE tb_repo_params SET margin_deal = 1 WHERE id = @bo_deal_id END END END -- короткая позиция клиента ELSE BEGIN -- короткая позиция собственная if @bo1_plan_money_id<>@bo_plan_buch_id /*Чтоб не было проверки по ПИФ*/ begin if (%IS_ALLOW_SHORT4OWN% <> 1) and (ROUND(@bo1_short_qty, 4) > 0) -- Списание с ДП begin --- короткая не разрешена .EXIT_MESSAGE('Превышен остаток по длинной позиции по ЦБ. Короткая позиция не разрешена.') end else if (%IS_ALLOW_SHORT4OWN% = 1) and (ROUND(@bo1_short_qty, 4) > 0) begin ----select @type_repo_id=id from t_purposes where code = 67 ---- короткая разрешена , ставим галочку update tb_repo_params set margin_deal=1 where id=@bo_deal_id end end end -- короткая позиция собственная /*Конец проверки короткой позиции*/ if @bo1_short_qty > 0 -------- Зачисляем на короткую begin .ASSIGN(@bo1_comm_main,(@bo1_comm+' Зачисление на короткую позицию')) select @bo1_short_sum=round(@bo1_short_sum,2) ---- вычисление суммы зачисления в валюте номинала .BACK_CALC_STOCK_VAL_SUM(@bo_stock_id,%OP_DATE%,@bo1_short_sum,@bo1_money_plan_cur_id,@bo1_nominal_sum,@bo1_nominal_cur_id) --- один из трех счетов - 1.0.1 (зачисление на короткую позицию бумаг) SELECT @bo1_short_sum=isnull(@bo1_short_sum,0) --- проводка по зачислению IF @bo_type_redemption IN (3, 4) BEGIN SELECT @bo1_short_sum_my = ROUND(((@bo1_short_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) SELECT @bo1_sum_accur_my = ROUND(((@bo1_sum_accur * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) SELECT @bo1_nominal_sum_my = ROUND(((@bo1_nominal_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_main = @bo1_comm_main + ' - 9' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_ext_acc_id, @bo1_short_acc_id, @bo1_short_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_main, Y, @operation_id, @id, @action_id, @action_history_id, @bo1_sum_accur_my, @bo1_sum_accur_my, @bo1_ext_subc, @bo1_home_subc, @acc_cur_id, @acc_cur_id) END ELSE BEGIN --select @bo1_comm_main = @bo1_comm_main + ' - 10' .OPERATION_SBC(@bo1_owner_id,@bo1_plan_money_id,%OP_DATE%,@bo1_ext_acc_id,@bo1_short_acc_id,@bo1_short_sum ,@bo1_money_plan_cur_id,%OP_DATE%,@bo1_short_qty,@bo1_short_qty, @bo1_comm_main,Y,@operation_id,@id,@action_id,@action_history_id, @bo1_sum_accur,@bo1_sum_accur,@bo1_ext_subc,@bo1_home_subc,@acc_cur_id,@acc_cur_id) END if isnull(@bo1_unkd_short_sum,0) > 0 begin .ASSIGN(@bo1_comm_add1,(@bo1_comm_add1+' Зачисление НКД на короткую позицию')) select @bo1_unkd_short_sum=round(@bo1_unkd_short_sum,2) --- вычисление зачисляемой суммы КД на короткую .BACK_CALC_STOCK_VAL_SUM(@bo_stock_id,%OP_DATE%,@bo1_unkd_short_sum,@bo1_money_plan_cur_id,@bo1_nominal_sum,@bo1_nominal_cur_id) --- Зачисляем на к.п. УНКД --- один из трех счетов (3.0.9 если клиентская) - 4.4.4 if @bo_purpose_code in (29,35,50,55,94,43,108,109,93,32,36,51,65,110,111) select @bo1_client_unkd_acc_id=@fond_own_id ----- в дебете был счет @bo1_client_unkd_acc_id, теперь @fond_own_id по ряду целевых назначений IF @bo_type_redemption IN (3, 4) BEGIN SELECT @bo1_unkd_short_sum_my = ROUND(((@bo1_unkd_short_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) -- SELECT @bo1_nominal_sum_my = ROUND(((@bo1_nominal_sum * @bo_rate_face_value) / 100), 2) SELECT @bo1_nominal_sum_my = ROUND(((@bo1_nominal_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_add1 = @bo1_comm_add1 + ' - 11' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_client_unkd_acc_id, @bo1_unkd_short_acc_id, @bo1_unkd_short_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_add1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, @bo1_nominal_sum_my, @bo1_ext_subc, @bo1_home_subc, NULL, @bo1_nominal_cur_id) END ELSE IF @bo_type_redemption = 1 BEGIN --select @bo1_comm_add1 = @bo1_comm_add1 + ' - 12' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_client_unkd_acc_id, @bo1_unkd_short_acc_id, @bo1_unkd_short_sum, @bo1_money_plan_cur_id, %OP_DATE%, @bo1_short_qty, @bo1_short_qty, @bo1_comm_add1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, @bo1_nominal_sum, @bo1_ext_subc, @bo1_home_subc, NULL, @bo1_nominal_cur_id) END end end end -- Конец продажи .GET_ITEM_FROM_TYPE_SUBC_STR(%P2L_SUBC%,'DOC_SEC',@dealing2upd_id) update tb_baysale_docitems set coupon_profit=isnull(@bo1_nkd_profit_sum,0) where id=@dealing2upd_id -- Прибыли или Убытки SELECT @bo_nkd_profit_sum = ROUND(@bo1_nkd_profit_sum, 2) IF @bo_type_redemption IN (3, 4) BEGIN IF @bo1_in_out = 1 BEGIN -- стартовая сумма - посчитанная SELECT @bo1_profit = @bo_rate_face_value * @my_first_nominal / 100 - (@bo1_bal_long_sum - @bo1_bal_short_sum) - @res_oper_sum_close END ELSE BEGIN SELECT @bo1_profit = ROUND(ISNULL(@bo1_profit_sum, 0), 2) END SELECT @bo_profit = ROUND(@bo1_profit, 2) END ELSE BEGIN IF @bo1_in_out = 1 BEGIN SELECT @bo1_profit = ROUND(ISNULL(@bo1_nkd_profit_sum, 0), 2) + ROUND(ISNULL(@bo1_profit_sum, 0), 2) END ELSE BEGIN SELECT @bo1_profit = ROUND(ISNULL(@bo1_profit_sum, 0), 2) END SELECT @bo_profit = ROUND(@bo1_profit, 2) END if %IS_REALIZ%<>1 begin select @bo1_realiz_acc_id=@bo1_ext_acc_id select @bo1_realiz_subc=%EXT_SUBC% end /*Блок проводок по прибыли/убытку */ if @bo_purpose_code in (27,28,30,31,43,44,45,46,47,49,52,63) /*48,58*/ begin if @bo_profit<=0 begin if @bo1_in_out = 1 begin select @bo1_comm_1='Прибыль по покрытию короткой позиции' select @bo1_comm_2='Списание прибыли по покрытию короткой позиции на фонды' select @bo1_profit=@bo1_profit*(-1.0) select @d_acc_id=@bo1_realiz_acc_id select @k_acc_id=@bo1_profit_acc_id select @d_subc_str=@bo1_realiz_subc select @k_subc_str=%P2L_SUBC% select @bo_profit_d_acc_cur_id=@bo_acc_sum_cur_id select @bo_profit_c_acc_cur_id=null end else begin select @bo1_comm_1='Убыток по списанию' select @bo1_comm_2='Списание убытка по списанию на фонды' select @bo1_profit=@bo1_profit*(-1.0) select @d_acc_id=@bo1_profit_acc_id select @k_acc_id=@bo1_realiz_acc_id select @d_subc_str=%P2L_SUBC% select @k_subc_str=@bo1_realiz_subc select @bo_profit_c_acc_cur_id=@bo_acc_sum_cur_id select @bo_profit_d_acc_cur_id=null end end else if @bo_profit>0 begin if @bo1_in_out = 1 begin select @bo1_comm_1='Убыток по покрытию короткой позиции' select @bo1_comm_2='Списание убытка по покрытию короткой позиции на фонды' select @d_acc_id=@bo1_profit_acc_id select @k_acc_id=@bo1_realiz_acc_id select @d_subc_str=%P2L_SUBC% select @k_subc_str=@bo1_realiz_subc select @bo_profit_c_acc_cur_id=@bo_acc_sum_cur_id select @bo_profit_d_acc_cur_id=null end else begin select @bo1_comm_1='Прибыль по списанию' select @bo1_comm_2='Списание прибыли по списанию на фонды' select @d_acc_id=@bo1_realiz_acc_id select @k_acc_id=@bo1_profit_acc_id select @d_subc_str=@bo1_realiz_subc select @k_subc_str=%P2L_SUBC% select @bo_profit_d_acc_cur_id=@bo_acc_sum_cur_id select @bo_profit_c_acc_cur_id=null end end if @is_calc_profit = 1 -- Если рассчитываем прибыль begin --- Прибыль по покрытию короткой позиции, если рассчитываем прибыль --- 5.0 - 4.3.0.0 --- Убыток по списанию, если рассчитываем прибыль --- 4.3.0.0 - 5.0 --- Убыток по покрытию короткой позиции, если рассчитываем прибыль --- 4.3.0.0 - 5.0 --- Прибыль по списанию, если рассчитываем прибыль --- 5.0 - 4.3.0.0 if @bo1_plan_money_id <> @bo_plan_buch_id begin IF @bo_type_redemption IN (3, 4) BEGIN -- SELECT @bo1_profit_my = ROUND(((@bo1_profit * @bo_rate_face_value) / 100), 2) SELECT @bo1_profit_my = ROUND(((@bo1_profit * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_1 = @bo1_comm_1 + ' - 13' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_profit_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str, @bo_profit_d_acc_cur_id, @bo_profit_c_acc_cur_id) END ELSE BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 14' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_profit, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str, @bo_profit_d_acc_cur_id, @bo_profit_c_acc_cur_id) END end end if @bo_profit<0 begin if @bo1_in_out = 1 begin select @d_acc_id=@bo1_profit_acc_id select @k_acc_id=@fond_own_id select @d_subc_str=%P2L_SUBC% select @k_subc_str=@bo1_ext_subc end else begin select @d_acc_id=@fond_own_id select @k_acc_id=@bo1_profit_acc_id select @d_subc_str=@bo1_ext_subc select @k_subc_str=%P2L_SUBC% end end else if @bo_profit>0 begin if @bo1_in_out = 1 begin select @d_acc_id=@fond_own_id select @k_acc_id=@bo1_profit_acc_id select @d_subc_str=@bo1_ext_subc select @k_subc_str=%P2L_SUBC% end else begin select @d_acc_id=@bo1_profit_acc_id select @k_acc_id=@fond_own_id select @d_subc_str=%P2L_SUBC% select @k_subc_str=@bo1_ext_subc end end if @is_calc_profit = 1 -- Если рассчитываем прибыль begin if @d_acc_id<>@k_acc_id -- чтобы не было лишней пров.по ПИФ begin --- Списание прибыли по покрытию короткой позиции на фонды,если рассчитываем прибыль --- 4.3.0.0 - 3.0.9 --- Списание убытка по списанию на фонды,если рассчитываем прибыль --- 3.0.9 - 4.3.0.0 --- Списание убытка по покрытию короткой позиции на фонды,если рассчитываем прибыль --- 3.0.9 - 4.3.0.0 --- Списание прибыли по списанию на фонды,если рассчитываем прибыль --- 4.3.0.0 - 3.0.9 if (@bo1_plan_money_id <> @bo_plan_buch_id) begin IF @bo_type_redemption IN (3, 4) BEGIN -- SELECT @bo1_profit_my = ROUND(((@bo1_profit * @bo_rate_face_value) / 100), 2) SELECT @bo1_profit_my = ROUND(((@bo1_profit * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_2 = @bo1_comm_2 + ' - 15' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_profit_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_2, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE BEGIN --select @bo1_comm_2 = @bo1_comm_2 + ' - 16' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_profit, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_2, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END end end end else if @is_calc_profit = 0 begin if @bo_profit<0 begin if @bo1_in_out = 1 begin select @d_acc_id=@bo1_realiz_acc_id select @k_acc_id=@fond_own_id select @d_subc_str=@bo1_realiz_subc select @k_subc_str=@bo1_ext_subc select @bo_profit_d_acc_cur_id=@bo_acc_sum_cur_id select @bo_profit_c_acc_cur_id=null end else begin select @d_acc_id=@fond_own_id select @k_acc_id=@bo1_realiz_acc_id select @d_subc_str=@bo1_ext_subc select @k_subc_str=@bo1_realiz_subc select @bo_profit_c_acc_cur_id=@bo_acc_sum_cur_id select @bo_profit_d_acc_cur_id=null end end else if @bo_profit>0 begin if @bo1_in_out = 1 begin select @d_acc_id=@fond_own_id select @k_acc_id=@bo1_realiz_acc_id select @d_subc_str=@bo1_ext_subc select @k_subc_str=@bo1_realiz_subc select @bo_profit_c_acc_cur_id=@bo_acc_sum_cur_id select @bo_profit_d_acc_cur_id=null end else begin select @d_acc_id=@bo1_realiz_acc_id select @k_acc_id=@fond_own_id select @d_subc_str=@bo1_realiz_subc select @k_subc_str=@bo1_ext_subc select @bo_profit_d_acc_cur_id=@bo_acc_sum_cur_id select @bo_profit_c_acc_cur_id=null end end --- Прибыль по покрытию короткой позиции, если не расчитываем прибыль, с использованием счета реализации --- 5.0 - 3.0.9 --- Прибыль по покрытию короткой позиции, если не расчитываем прибыль, без использования счета реализации --- - 3.0.9 IF (@bo1_plan_money_id <> @bo_plan_buch_id) BEGIN IF @bo_type_redemption IN (3, 4) BEGIN SELECT @bo1_profit_my = ISNULL(@bo_rate_face_value, 0) * ISNULL(@my_first_nominal, 0) / 100 * %STOCK_QTY% - (ISNULL(@bo1_short_sum, 0) + ISNULL(@bo1_bal_long_sum, 0)) * @bo_rate_face_value * @my_first_nominal / (100 * @my_stock_nominal) - ISNULL(@res_oper_sum_close, 0) --select @bo1_comm_1 = @bo1_comm_1 + ' - 17' END ELSE BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 18' SELECT @bo1_profit_my = ISNULL(%STOCK_QTY% * @total_sum, 0) - ISNULL(@bo1_short_sum, 0) - ISNULL(@bo1_bal_long_sum, 0) - ISNULL(@res_oper_sum_close, 0) END SELECT @bo1_profit_my = ROUND(@bo1_profit_my, 2) IF @bo1_profit_my < 0 BEGIN SELECT @bo1_comm_1 = 'Убыток по списанию' SELECT @bo1_profit_my = @bo1_profit_my * -1 END ELSE BEGIN SELECT @bo1_comm_1 = 'Прибыль по списанию' SELECT @t_acc_id = @d_acc_id SELECT @d_acc_id = @k_acc_id SELECT @k_acc_id = @t_acc_id SELECT @t_subc_str = @d_subc_str SELECT @d_subc_str = @k_subc_str SELECT @k_subc_str = @t_subc_str END .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_profit_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str, @bo_profit_d_acc_cur_id, @bo_profit_c_acc_cur_id) END end end /*Конец блока проводок по прибыли/убытку */ select @subc_pnkd='' select @subc_pnkd=%PNKD_SUBC% if @bo_purpose_code in (32,36) select @bo1_nkd_profit_sum=isnull((@bo1_unkd_bal_long_sum*(-1.0)),0) --.SUBC_STR_ADD(@subc_pnkd,'DOC_SEC_IN',@partion_id) --.SUBC_STR_ADD(@subc_pnkd,'STOCK_EMIS',@stock_id) /*Блок проводок по зачислению КД,ПНКД, прибыли по КД по счетам 4*/ if @bo_purpose_code in (29,32,108,110,93,36) begin .ACCID_FROM_CONST2PLAN(@bo1_ext_acc_id,'BACK_ACC_FUND_MONEY',@bo1_plan_money_id,1,3,'Счет фонда ДС клиента',@bo1_mess_res) end if @bo1_in_out=-1 -- Списание begin if @bo_purpose_code not in (32,36) begin if isnull(@bo1_unkd_long_sum,0)>0 begin select @bo1_comm_1='Зачисление ПНКД' select @d_acc_id=@bo1_ext_acc_id select @k_acc_id=@bo1_pnkd_acc_id select @d_subc_str=@bo1_ext_subc select @k_subc_str=@subc_pnkd select @bo1_unkd_long_sum=round(@bo1_unkd_long_sum,2) ---- зачисление ПНКД IF @bo_type_redemption IN (3, 4) BEGIN -- SELECT @bo1_unkd_long_sum_my = ROUND(((@bo1_unkd_long_sum * @bo_rate_face_value) / 100), 2) SELECT @bo1_unkd_long_sum_my = ROUND(((@bo1_unkd_long_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_1 = @bo1_comm_1 + ' - 19' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_unkd_long_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE IF @bo_type_redemption = 1 BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 20' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_unkd_long_sum, @bo1_money_plan_cur_id, %OP_DATE%, 0, %STOCK_QTY%, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END end end if isnull(@bo1_nkd_profit_sum,0)<>0 begin IF @bo_type_redemption = 3 SELECT @bo1_nkd_profit_sum = ROUND(%TOTAL_SUM% - (@bo1_unkd_bal_long_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal), 2) if isnull(@bo1_nkd_profit_sum, 0) > 0 begin select @bo1_comm_1='Доход по КД' select @d_acc_id=@bo1_pnkd_acc_id select @k_acc_id=@bo1_fut_profit_acc_id select @d_subc_str=@subc_pnkd select @k_subc_str=%P2L_SUBC% end else begin select @bo1_comm_1='Убыток по КД' select @bo1_nkd_profit_sum=@bo1_nkd_profit_sum*(-1.0) select @d_acc_id=@bo1_fut_profit_acc_id select @k_acc_id=@bo1_pnkd_acc_id select @d_subc_str=%P2L_SUBC% select @k_subc_str=@subc_pnkd end select @bo1_nkd_profit_sum=round(@bo1_nkd_profit_sum,2) if @is_calc_profit = 1 -- Если рассчитываем прибыль begin if @d_acc_id<>@k_acc_id -- чтобы не было лишней пров.по ПИФ begin IF @bo_type_redemption IN (3, 4) BEGIN SELECT @bo1_nkd_profit_sum_my = ROUND(((@bo1_nkd_profit_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) select @bo1_comm_1 = @bo1_comm_1 + ' - 21' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_nkd_profit_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE IF @bo_type_redemption = 1 BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 22' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_nkd_profit_sum, @bo1_money_plan_cur_id, %OP_DATE%, %STOCK_QTY%, %STOCK_QTY%, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END end if isnull(@bo_nkd_profit_sum,0)>0 begin select @d_acc_id=@bo1_fut_profit_acc_id select @k_acc_id=@acc_pncd_cl select @d_subc_str=%P2L_SUBC% select @k_subc_str=@bo1_ext_subc end else begin select @d_acc_id=@acc_pncd_cl select @k_acc_id=@bo1_fut_profit_acc_id select @d_subc_str=@bo1_ext_subc select @k_subc_str=%P2L_SUBC% end if @d_acc_id<>@k_acc_id -- чтобы не было лишней пров.по ПИФ begin if (@bo1_plan_money_id <> @bo_plan_buch_id) begin IF @bo_type_redemption IN (3, 4) BEGIN SELECT @bo1_nkd_profit_sum_my = ROUND(((@bo1_nkd_profit_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_1 = @bo1_comm_1 + ' - 23' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_nkd_profit_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE IF @bo_type_redemption = 1 BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 24' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_nkd_profit_sum, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END end end END ELSE IF @is_calc_profit = 0 BEGIN IF @bo_type_redemption = 3 SELECT @bo1_nkd_profit_sum_my = %TOTAL_SUM% * %STOCK_QTY% - @bo1_unkd_bal_long_sum ELSE IF @bo_type_redemption = 1 begin -- kashuba_av Сделано, чтобы различать методы расчета для сделки и групповой операции if .ITEM_TYPE_CODE(@bo_deal_id) = 'STOCK_REDEMPTION' SELECT @bo1_nkd_profit_sum_my = %COUPON_SUM_ONE% * %STOCK_QTY% - @bo1_unkd_bal_long_sum else SELECT @bo1_nkd_profit_sum_my = @bo1_unkd_long_sum - @bo1_unkd_bal_long_sum end IF ISNULL(@bo1_nkd_profit_sum_my, 0) > 0 BEGIN SELECT @bo1_comm_1 = 'Доход по КД' SELECT @d_acc_id = @bo1_pnkd_acc_id SELECT @k_acc_id = @acc_pncd_cl SELECT @d_subc_str = @subc_pnkd SELECT @k_subc_str = @bo1_ext_subc END ELSE BEGIN SELECT @bo1_comm_1 = 'Убыток по КД' SELECT @d_acc_id = @acc_pncd_cl SELECT @k_acc_id = @bo1_pnkd_acc_id SELECT @d_subc_str = @bo1_ext_subc SELECT @k_subc_str = @subc_pnkd END IF @d_acc_id <> @k_acc_id BEGIN -- чтобы не было лишней пров.по ПИФ IF @bo1_plan_money_id <> @bo_plan_buch_id BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 25' --select @bo1_comm_1 = @bo1_comm_1 + ' - 26' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_nkd_profit_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END end end end end --Конец блока проводок /*Блок проводок по счетам 3 клиентов*/ if (select code from t_purposes where id = @bo1_perpose_id) in (30,27,28,31,43,44,45,46,47,48,49,52,63,75,32,36) -- По сделкам and %CHARACTER_ID% = 2 -- Сделка клиентская begin if @bo1_in_out = 1 -- Покупка begin select @bo1_comm_1='Зачисление УНКД' select @d_acc_id=@fond_own_id select @k_acc_id=@acc_uncd_cl select @d_subc_str=@subc_pnkd select @k_subc_str=@subc_pnkd select @bo1_unkd_long_sum=round(@bo1_unkd_long_sum,2) IF @bo_type_redemption IN (3, 4) BEGIN -- SELECT @bo1_unkd_long_sum_my = ROUND(((@bo1_unkd_long_sum * @bo_rate_face_value) / 100), 2) SELECT @bo1_unkd_long_sum_my = ROUND(((@bo1_unkd_long_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_1 = @bo1_comm_1 + ' - 27' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_unkd_long_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE IF @bo_type_redemption = 1 BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 28' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_unkd_long_sum, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END if @bo_purpose_code not in (50,51,65,66,29,108,93) begin select @subc_for_check='' .SUBC_STR_ADD(@subc_for_check,'INVESTORS',@bo_investor_id) .SUBC_STR_ADD(@subc_for_check,'STOCK_EMIS',@bo_stock_id) ---- .SALDO(@bo1_owner_id,@bo1_plan_money_id,%OP_DATE%,@marg_acc_id,@subc_for_check,N,D,@bo1_c_sum,@bo1_q_sum) select @bo1_comm_1='Зачисление балансовой стоимости' select @d_acc_id=@fond_own_id select @k_acc_id=@fond_stock_own_id select @d_subc_str=@subc_pnkd select @k_subc_str=@subc_pnkd select @fond_sum=isnull(@bo1_bal_short_sum,0)+isnull(@bo1_long_sum,0) IF @bo_type_redemption IN (3, 4) BEGIN -- SELECT @fond_sum_my = ROUND(((@fond_sum * @bo_rate_face_value) / 100), 2) SELECT @fond_sum_my = ROUND(((@fond_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_1 = @bo1_comm_1 + ' - 29' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @fond_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 30' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @fond_sum, @bo1_money_plan_cur_id, %OP_DATE%, 0, %STOCK_QTY%, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END end end else --- Продаже begin select @bo1_comm_1='Списание УНКД' select @d_acc_id=@acc_uncd_cl select @k_acc_id=@acc_pncd_cl select @d_subc_str=@subc_pnkd select @k_subc_str=@subc_pnkd select @bo1_unkd_bal_long_sum = round(@bo1_unkd_bal_long_sum,2) IF @bo_type_redemption = 3 BEGIN -- SELECT @bo1_unkd_bal_long_sum_my = ROUND(((@bo1_unkd_bal_long_sum * @bo_rate_face_value) / 100), 2) -- SELECT @bo1_unkd_bal_long_sum_my = ROUND(((@bo1_unkd_bal_long_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_1 = @bo1_comm_1 + ' - 31' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_unkd_bal_long_sum, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE IF @bo_type_redemption = 1 BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 32' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_unkd_bal_long_sum, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END if @bo_purpose_code not in (32,36) begin select @bo1_comm_1='Зачисление ПНКД' select @d_acc_id=@acc_pncd_cl select @k_acc_id=@fond_own_id select @d_subc_str=@subc_pnkd select @k_subc_str=@subc_pnkd select @bo1_unkd_long_sum = round(@bo1_unkd_long_sum,2) IF @bo_type_redemption IN (3, 4) BEGIN SELECT @bo1_unkd_long_sum_my = ROUND(((@bo1_unkd_long_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_1 = @bo1_comm_1 + ' - 33' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_unkd_long_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 34' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @bo1_unkd_long_sum, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END end if @bo_purpose_code not in (50,51,65,66,32,110) begin select @bo1_comm_1='Списание балансовой стоимости' select @d_acc_id=@fond_stock_own_id select @k_acc_id=@fond_own_id select @d_subc_str=@subc_pnkd select @k_subc_str=@subc_pnkd select @bo1_bal_long_sum=round(@bo1_bal_long_sum,2) select @subc_for_check='' .GET_ITEM_FROM_TYPE_SUBC_STR(%HOME_SUBC%,'INVESTORS',@bo_investor_id) .SUBC_STR_ADD(@subc_for_check,'INVESTORS',@bo_investor_id) ---.SUBC_STR_ADD(@subc_for_check,'INVESTORS',@bo_stock_id) ---.ACCID_FROM_CONST2PLAN(@marg_acc_id,'BACK_ACC_OBLIG_MARG_DS',@bo1_plan_money_id,1,3,'Задолженность по ДС клиента',@bo1_mess_res) select @bo1_c_sum=0 ----.SALDO(@bo1_owner_id,@bo1_plan_money_id,%OP_DATE%,@marg_acc_id,@subc_for_check,N,D,@bo1_c_sum,N) select @fond_sum = isnull(@bo1_short_sum, 0) + isnull(@bo1_bal_long_sum, 0) IF @bo_type_redemption IN (3, 4) BEGIN SELECT @fond_sum_my = ROUND(((@fond_sum * @bo_rate_face_value * @my_first_nominal) / (100 * @my_stock_nominal)), 2) --select @bo1_comm_1 = @bo1_comm_1 + ' - 35' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @fond_sum_my, @bo1_money_plan_cur_id, %OP_DATE%, 0, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END ELSE BEGIN --select @bo1_comm_1 = @bo1_comm_1 + ' - 36' .OPERATION_SBC(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @d_acc_id, @k_acc_id, @fond_sum, @bo1_money_plan_cur_id, %OP_DATE%, %STOCK_QTY%, 0, @bo1_comm_1, Y, @operation_id, @id, @action_id, @action_history_id, NULL, NULL, @d_subc_str, @k_subc_str) END end end end /*Конец блока проводок по счетам 3 клиентов*/ IF @bo1_in_out = 1 BEGIN IF %CHARACTER_ID% = 2 BEGIN SELECT @subc_for_c = '' .SUBC_STR_ADD(@subc_for_c, 'INVESTORS', @bo_investor_id) SELECT @bo1_c_sum = 0 IF @bo_purpose_code IN (43, 44) BEGIN .SALDO(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @bo1_ext_acc_id, @subc_for_c, N, D, @bo1_c_sum, N) END ELSE BEGIN .SALDO(@bo1_owner_id, @bo1_plan_money_id, %OP_DATE%, @free_ds_id, @subc_for_c, N, D, @bo1_c_sum, N) END IF @bo_purpose_code NOT IN (27, 29, 45, 48, 63, 93, 108) AND @bo1_plan_money_id <> @bo_plan_buch_id BEGIN IF (%IS_ALLOW_SHORT4CLIENT% <> 1) -- AND (ROUND(@bo1_c_sum, 4) < 0) BEGIN .EXIT_MESSAGE('Превышен остаток по длинной позиции по ДС. Короткая позиция не разрешена.') END END ELSE IF (%IS_ALLOW_SHORT4CLIENT% = 1) AND (ROUND(@bo1_c_sum, 4) < 0) BEGIN UPDATE tb_repo_params SET margin_deal = 1 WHERE id = @bo_deal_id END END END $ENDTEXT(17250803) $PATTERNARG(%STOCK_QTY%) name=Количество ЦБ order=1 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%SUM%) name=Сумма order=5 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%NKD_SUM%) name=Сумма УНКД order=10 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%OP_DATE%) name=Дата проводки order=15 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%RATE_DATE%) name=Дата курса order=20 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%CUR_ID%) name=Валюта проводки order=25 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%HOME_SUBC%) name=Внутреняя строка аналитики order=30 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%EXT_SUBC%) name=Внешняя строка аналитики order=35 comment=null mandatory=1 default='' choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%PNKD_SUBC%) name=Строка субконто ПНКД order=40 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%ACC_SUM%) name=Валютная сумма счета order=45 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%COMM2PURP2MOVE%) name=Формирование комментария к проводкам order=50 comment=Формирование комментария к проводкам(1 - формировать исходя из целевого назначения,0 - формировать исходя из исходного и целевого объекта) mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%IS_ALLOW_SHORT4OWN%) name=Разрешаем короткую для себя order=55 comment=Разрешаем короткую для себя mandatory=1 default=@is_allow_short4own choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%IS_ALLOW_SHORT4CLIENT%) name=Разрешаем короткую для клиента order=60 comment=Разрешаем короткую для клиента mandatory=1 default=@is_allow_short4client choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%TOTAL_OUT_SUM%) name=Общая сумма списания (вых) order=65 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%TOTAL_OUT_QTY%) name=Общее количество списано (вых) order=70 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%TOTAL_UNKD_SUM_OUT%) name=Общая сумма списанного купонного дохода. order=75 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%IS_CALC_PROFIT%) name=Считаем прибыль order=80 comment=1 - считаем, 0 - не считаем, 2 - списание (принятие) - по балансовой(оценочной) стоимости mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%CHARACTER_ID%) name=Характер сделки order=85 comment=Характер сделки mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%P2L_SUBC%) name=Субконто по прибыли/убытку order=90 comment=Субконто по прибыли/убытку mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%IS_REALIZ%) name=Через реализацию или нет order=95 comment=Через реализацию или нет mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%IS_P2L_COMIS%) name=Использование счета пр/уб по комиссиям order=100 comment=Использование счета пр/уб по комиссиям mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%IS_COM_IN%) name=Использование счета для затрат по приобретению order=105 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%TOTAL_OUT_COM_IN%) name=Сумма списанных расходов на приобретение/списание order=110 comment=Сумма списанных расходов на приобретение/списание mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%TYPE_REDEMPTION%) name=Тип погашения order=115 comment=Тип погашения mandatory=0 default=1 choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%RATE_FACE_VALUE%) name=Процент от номинала order=120 comment=Процент от номинала mandatory=0 default=100 choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%TOTAL_SUM%) name=Сумма на одну ЦБ order=125 comment=Сумма на одну ЦБ mandatory=0 default=0 choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%COUPON_SUM_ONE%) name=Сумма купона на 1 ЦБ order=126 comment=Сумма купона на 1 ЦБ mandatory=0 default=0 choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $ENDPATTERN