# Date: 20/03/06 # Version: 105 $PATTERN(.BACK_EXEC_OBLIGATION) name=Исполнение обязательств по ВБР class=2 product=ALD_SECUR pattern_text=$TEXT(14364082) ------.BACK_EXEC_OBLIGATION #ifndef #back_exec_obligation #define #back_exec_obligation declare @d1_acc_money numeric, @d1_acc_stock numeric, @d1_plan_money numeric, @d1_plan_stock numeric, @d1_p2r int, @d1_saldo_b money, @d1_date_reg_fact datetime, @d2_date_reg_fact datetime, @d1_pl_item_id numeric, @d1_saldo_qty_b money, @d1_acc_money_type numeric, @d1_acc_stock_type numeric, @d1_foundation_id_s varchar(30), @d1_inv_id numeric, @d1_out_method_id numeric, @d1_is_realiz_x int, @d1_is_p2l_comis_x int, @d1_proc_status int, @d1_is_sint int, @d1_stock_oper_id numeric, @d1_money_oper_id numeric, @d1_old_stock_oper_id numeric, @d1_old_money_oper_id numeric, @d1_max_order_no int, @d1_proc_state int, @d1_is_com_in_x int, @d1_is_allow_short4stocks_x int, @d1_is_allow_short4money_x int, @d1_asset4pereoc_type_id_x numeric, @d1_plan2partner_id numeric, @d1_res_qty money, @d1_res_acc money, @d1_mess_res varchar(255) declare @deal_foundation_id numeric, @deal2date_id numeric .ID_VAR(@comission_calc_momentX) #endif --- Выдача параметров учетной организации .BACK_GET_ORG_PARMS(%OWNER_ID%,@d1_inv_id,@d1_plan_money,@d1_plan_stock,@d1_out_method_id,@d1_is_realiz_x,@d1_is_p2l_comis_x,@d1_is_com_in_x,@d1_is_allow_short4stocks_x,@d1_is_allow_short4money_x,@d1_asset4pereoc_type_id_x) -- заради возможности начислять комиссии в момент перерегистрации или в момент исполнения обязательств(Чикунов) select @comission_calc_momentX = comission_calc_moment from tb_broker_change where id = @d1_inv_id and .ITEMS_EXISTS_BY_TYPE(tb_broker_change.id,'broker_info') ---- 1- проводить проводки по комиссиям (на затраты или убыток) - в момент исполнения всех обязательств ---- 2 - в момент исполнения перерегистрации IF @comission_calc_momentX is null .EXIT_MESSAGE('Не могу определить момент начисления комиссий из установок в параметрах учетной организации') -- select @d1_plan2partner_id = .PLAN2PARTNER_ID( %OWNER_ID% ,@d1_plan_money) ---- в зависимости от того покупка или продажа вычисляются разные назначения счета, для поиска счета обязательств ВБР по ДС if %BAY_OR_SALE%=1 select @d1_p2r=3 else select @d1_p2r=2 ---вычисление счета .ACCID_FROM_CONST2PLAN(@d1_acc_money,'BACK_ACC_MONEY_VBR_DOG',@d1_plan_money,@d1_p2r,1,'Счет обязательст по деньгам',@d1_mess_res) ---- в зависимости от того покупка или продажа вычисляются разные назначения счета, для поиска счета обязательств ВБР по ЦБ if %BAY_OR_SALE%=1 select @d1_p2r=2 else select @d1_p2r=3 ---вычисление счета .ACCID_FROM_CONST2PLAN(@d1_acc_stock,'BACK_ACC_SECUR_VBR_DOG',@d1_plan_money,@d1_p2r,1,'Счет обязательст по ЦБ',@d1_mess_res) ---- вычисление типов счетов обязательств, для подстановки Д или К в шаблон САЛЬДО select @d1_acc_stock_type=(select acc_type_id from t_accounts where id=@d1_acc_stock) select @d1_acc_money_type=(select acc_type_id from t_accounts where id=@d1_acc_money) --- вычисление ид главной сделки, в случае если главная сделка - сделка с неск. ЦБ select @d1_pl_item_id=(select plan_item_id from t_items2plans where fact_item_id=%DEALING_ID%) ---- вычисление остатка на счете обязательств ВБР по ДС, после проведения операции(платеж, перерегистрация) if @d1_acc_money_type=1 begin /*.SALDO(%OWNER_ID%,@d1_plan_money,%DATE%,@d1_acc_money,%SUBC_MONEY%,Y,'D',@d1_saldo_b)*/ .SALDO_NOW_SUM(@d1_plan2partner_id,@d1_acc_money,%SUBC_MONEY%,1,@d1_saldo_b,@d1_res_qty,@d1_res_acc,null,null,null) end else begin /*.SALDO(%OWNER_ID%,@d1_plan_money,%DATE%,@d1_acc_money,%SUBC_MONEY%,Y,'K',@d1_saldo_b)*/ .SALDO_NOW_SUM(@d1_plan2partner_id,@d1_acc_money,%SUBC_MONEY%,(-1),@d1_saldo_b,@d1_res_qty,@d1_res_acc,null,null,null) end ---- вычисление остатка на счете обязательств ВБР по ЦБ, после проведения операции(платеж, перерегистрация) if @d1_acc_stock_type=1 begin /* .SALDO(%OWNER_ID%,@d1_plan_money,%DATE%,@d1_acc_stock,%SUBC_STOCK%,Y,'D',N,@d1_saldo_qty_b) */ .SALDO_NOW_SUM(@d1_plan2partner_id,@d1_acc_stock,%SUBC_MONEY%,1,@d1_res_qty,@d1_saldo_qty_b,@d1_res_acc,null,null,null) end else begin /*.SALDO(%OWNER_ID%,@d1_plan_money,%DATE%,@d1_acc_stock,%SUBC_STOCK%,Y,'K',N,@d1_saldo_qty_b)*/ .SALDO_NOW_SUM(@d1_plan2partner_id,@d1_acc_stock,%SUBC_MONEY%,(-1),@d1_res_qty,@d1_saldo_qty_b,@d1_res_acc,null,null,null) end ---- вычисление главной сделки,в случае если сделка создана сделкой с неск. ЦБ select @deal_foundation_id=(select foundation_id from td_depo_docs where id=%DEALING_ID%) ---- вычисление ид типа документа оплаты, для поиска самой последней даты платежа ---- т.к. оплата по сделке с неск. ЦБ идет по главной сделке, а не по внутренним сделкам if exists (select 1 from t_types,t_items,t_states where t_items.id=@deal_foundation_id and t_types.id=t_items.type_id and t_states.id=t_items.state_id and t_states.class_id=0 and t_types.type_code in ('DOG_DEALINGS_BAY_VBR_VEKSEL','DOG_DEALINGS_SALE_VBR_VEKSEL')) select @deal2date_id=@deal_foundation_id else select @deal2date_id=%DEALING_ID% -- letsko_av -- 17.03.2005 -- вычисление самой поздней даты исполенения IF %PAY_OR_REG% = 1 BEGIN -- платеж -- select @d1_date_reg_fact=(select max(in_date) from t_paydocs,td_depo_docs,.ACTUAL_TABLES where -- t_paydocs.foundation_id=@deal2date_id and t_states.id=@new_state_id and td_depo_docs.id=t_paydocs.id .ACTUAL_WHERE(t_paydocs.id)) SELECT @d1_date_reg_fact = MAX(td_depo_docs.in_date) FROM td_depo_docs WHERE td_depo_docs.foundation_id = @id AND ( .ITEMS_EXISTS_BY_TYPE_STATE_NO(td_depo_docs.id, 'REAL_PAYMENT_IN', 'DEL') OR .ITEMS_EXISTS_BY_TYPE_STATE_NO(td_depo_docs.id, 'REAL_PAYMENT_OUT', 'DEL') ) SELECT @d2_date_reg_fact = MAX(td_depo_docs.in_date) FROM t_paydocs, td_depo_docs WHERE t_paydocs.foundation_id = @id AND td_depo_docs.id = t_paydocs.id AND ( .ITEMS_EXISTS_BY_TYPE_STATE_NO(t_paydocs.id, 'REAL_PAYMENT_IN', 'DEL') OR .ITEMS_EXISTS_BY_TYPE_STATE_NO(t_paydocs.id, 'REAL_PAYMENT_OUT', 'DEL') ) IF ISNULL(@d2_date_reg_fact, 0) > ISNULL(@d1_date_reg_fact, 0) SELECT @d1_date_reg_fact = @d2_date_reg_fact END ELSE BEGIN -- перерегистрация -- select @d1_date_reg_fact=(select max(in_date) from td_depo_docs,.ACTUAL_TABLES where -- td_depo_docs.foundation_id=%DEALING_ID% and t_states.id=@new_state_id .ACTUAL_WHERE(td_depo_docs.id)) SELECT @d1_date_reg_fact = MAX(td_depo_docs.in_date) FROM td_depo_docs WHERE td_depo_docs.foundation_id = @id AND ( .ITEMS_EXISTS_BY_TYPE_STATE_NO(td_depo_docs.id, 'D_STOCK_IN_OTHER_DEPO', 'DEL') OR .ITEMS_EXISTS_BY_TYPE_STATE_NO(td_depo_docs.id, 'D_STOCK_OUT_OTHER_DEPO', 'DEL') ) SELECT @d2_date_reg_fact = MAX(td_depo_docs.in_date) FROM t_paydocs, td_depo_docs WHERE t_paydocs.foundation_id = @id AND td_depo_docs.id = t_paydocs.id AND ( .ITEMS_EXISTS_BY_TYPE_STATE_NO(t_paydocs.id, 'D_STOCK_IN_OTHER_DEPO', 'DEL') OR .ITEMS_EXISTS_BY_TYPE_STATE_NO(t_paydocs.id, 'D_STOCK_OUT_OTHER_DEPO', 'DEL') ) IF ISNULL(@d2_date_reg_fact, 0) > ISNULL(@d1_date_reg_fact, 0) SELECT @d1_date_reg_fact = @d2_date_reg_fact END -- letsko_av (end) select @d1_foundation_id_s=convert(varchar(30),%DEALING_ID%) /* declare @str_mes varchar(255) select @str_mes=convert(varchar,@d1_saldo_qty_b)+' :'+convert(varchar,@d1_saldo_b) .EXIT_MESSAGE(@str_mes) */ --- блок банка #ifdef ALD_BANK_SECS IF(.TEST_SINT_ACCOUNTING(@d1_inv_id)) BEGIN .ASSIGN(@d1_is_sint,1) SELECT @d1_stock_oper_id = tb_baysale_docitems.bank_stock_operation_id, @d1_money_oper_id = tb_baysale_docitems.bank_money_operation_id FROM tb_baysale_docitems WHERE tb_baysale_docitems.id = %DEALING_ID% SELECT @d1_max_order_no = (SELECT MAX(order_no) FROM tb_bind_deal2queries WHERE deal_id = %DEALING_ID%) .ASSIGN(@d1_max_order_no,(@d1_max_order_no + 1)) END ELSE .ASSIGN(@d1_is_sint,0) #endif if %PAY_OR_REG%=1 --- Для платежа (если шаблон вызвался из платежа) begin --1 if @d1_saldo_qty_b=0 -- Обязательства по поставке выполнены begin --- 2 if round(@d1_saldo_b,2)<=0 --Обязательства по оплате выполнены begin -- 3 /*Передвижка по статусам, в зависимости от остатка на счетах обязательств*/ if exists(select 1 from t_items,t_types where t_items.id=%DEALING_ID% and t_types.id=t_items.type_id and t_types.type_code in ('DOG_DEALINGS_BAY_VBR','DOG_DEALINGS_SALE_VBR')) begin .ITEM_MOVE_STATE(%DEALING_ID%,'OBYAZ_END') --- если сделка вбр end else begin .ITEM_MOVE_STATE(%DEALING_ID%,'PODT') -- если сделка тс end --- установка фактической даты оплаты update tb_plan2fact_dates set fact_pay_date =@d1_date_reg_fact where id =%DEALING_ID% --- установка фактической даты оплаты в главной сделке с неск цб вбр update tb_plan2fact_dates set fact_pay_date =@d1_date_reg_fact where id =@d1_pl_item_id ---- проведение проводок по клиентским комиссиям, ----- которые зависят от условий клиентского договора (в какую дату снимать) ----- только проводки вида 4.1 - 2.0.0, т.е. в которых снимаются деньги ----- если комиссия не снялась в предыдущих этапах сделки if %BAY_OR_SALE%=1 -- Покупка begin exec ap_oper2comis_bay @d1_foundation_id_s,@d1_date_reg_fact end else -- Продажа begin exec ap_oper2comis_sale @d1_foundation_id_s,@d1_date_reg_fact end --was before /*проведение проводок по комиссиям, которые д.б. созданы в момент исполнения обязательств. проводки вида соотнесение на затраты при покупке или на убыток при продаже */ if @comission_calc_momentX = 1 --- еще + ко всему есть галочка в учетной организации, в какой момент это делать ---------- т.е. есть вариант когда при исполнении или исполнения только перерегистрации ---- 1 - в момент исполнения обязательств begin if %BAY_OR_SALE%=1 -- Покупка begin --- exec ap_oper2comis_bay @d1_foundation_id_s,@d1_date_reg_fact .EXEC_ACTION(@d1_foundation_id_s,'dog_dealings_bay_vbr','ENDPART2',Y) end else -- Продажа begin --- exec ap_oper2comis_sale @d1_foundation_id_s,@d1_date_reg_fact .EXEC_ACTION(@d1_foundation_id_s,'dog_dealings_sale_vbr','END_2PART2',Y) end end #ifdef ALD_BANK_SECS IF(ISNULL(@d1_is_sint,0) = 1) BEGIN INSERT INTO tb_bind_deal2queries(deal_id, stock_operation_id, money_operation_id, order_no, foundation_id, old_stock_operation_id, old_money_operation_id) VALUES(%DEALING_ID%,4,4,@d1_max_order_no,@id,@d1_stock_oper_id,@d1_money_oper_id) UPDATE tb_baysale_docitems SET bank_stock_operation_id = 4, bank_money_operation_id = 4 WHERE id = %DEALING_ID% END #endif end -- 3 --- Обязательства по оплате выполнены end else -- 2 ----- Обязательства по поставке не выполнены begin if round(@d1_saldo_b,2)<=0 -- 3 - Обязательства по оплате выполнены begin /*Передвижка по статусам, в зависимости от остатка на счетах обязательств*/ if exists(select 1 from t_items,t_types where t_items.id=%DEALING_ID% and t_types.id=t_items.type_id and t_types.type_code in ('DOG_DEALINGS_BAY_VBR','DOG_DEALINGS_SALE_VBR')) begin .ITEM_MOVE_STATE(%DEALING_ID%,'OPL_END') --- сделка вбр или главная с неск. цб end --- установка фактической даты перерегистрации update tb_plan2fact_dates set fact_reg_date =@d1_date_reg_fact where id =%DEALING_ID% --- установка фактической даты перерегистрации в главной сделке с неск. цб update tb_plan2fact_dates set fact_reg_date =@d1_date_reg_fact where id =@d1_pl_item_id ---- проведение проводок по клиентским комиссиям, ----- которые зависят от условий клиентского договора (в какую дату снимать) ----- только проводки вида 4.1 - 2.0.0, т.е. в которых снимаются деньги ----- если комиссия не снялась в предыдущих этапах сделки if %BAY_OR_SALE%=1 -- Покупка begin exec ap_oper2comis_bay @d1_foundation_id_s,@d1_date_reg_fact end else --- Продажа begin exec ap_oper2comis_sale @d1_foundation_id_s,@d1_date_reg_fact end #ifdef ALD_BANK_SECS IF(ISNULL(@d1_is_sint,0) = 1) BEGIN INSERT INTO tb_bind_deal2queries(deal_id, stock_operation_id, money_operation_id, order_no, foundation_id, old_stock_operation_id, old_money_operation_id) VALUES(%DEALING_ID%,7,2,@d1_max_order_no,@id,@d1_stock_oper_id,@d1_money_oper_id) UPDATE tb_baysale_docitems SET bank_money_operation_id = 2, bank_stock_operation_id = 7 WHERE id = %DEALING_ID% END #endif end ---3 end --- 2 end else ---1 Для перерегистрации begin if round(@d1_saldo_b,2)>0 begin --- 2 Оплата не выполнена if @d1_saldo_qty_b=0 ---- 3 Поставка выполнена begin --- установка фактической даты перерегистрации update tb_plan2fact_dates set fact_reg_date =@d1_date_reg_fact where id =%DEALING_ID% --- установка фактической даты перерегистрации в главной сделке с неск. цб update tb_plan2fact_dates set fact_reg_date =@d1_date_reg_fact where id =@d1_pl_item_id /*проведение проводок по комиссиям, которые д.б. созданы в момент исполнения обязательств. проводки вида соотнесение на затраты при покупке или на убыток при продаже */ --inserted new if @comission_calc_momentX = 2 --- еще + ко всему есть галочка в учетной организации, в какой момент это делать ---------- т.е. есть вариант когда при исполнении или исполнения только перерегистрации ---- 2 - в момент исполнения перерегистрации begin if %BAY_OR_SALE%=1 --- 4 покупка begin --- exec ap_oper2comis_bay @d1_foundation_id_s,@d1_date_reg_fact .EXEC_ACTION(@d1_foundation_id_s,'dog_dealings_bay_vbr','ENDPART2',Y) end else --- 4 продажа begin --- exec ap_oper2comis_sale @d1_foundation_id_s,@d1_date_reg_fact .EXEC_ACTION(@d1_foundation_id_s,'dog_dealings_sale_vbr','END_2PART2',Y) end -- 4 конец покупки - продажи end ---- конец проведения проводок по комиссии /*Передвижка по статусам, в зависимости от остатка на счетах обязательств*/ if exists(select 1 from t_items,t_types where t_items.id=%DEALING_ID% and t_types.id=t_items.type_id and t_types.type_code in ('DOG_DEALINGS_BAY_VBR','DOG_DEALINGS_SALE_VBR')) begin .ITEM_MOVE_STATE(%DEALING_ID%,'POST_END') end ---- проведение проводок по клиентским комиссиям, ----- которые зависят от условий клиентского договора (в какую дату снимать) ----- только проводки вида 4.1 - 2.0.0, т.е. в которых снимаются деньги ----- если комиссия не снялась в предыдущих этапах сделки if %BAY_OR_SALE%=1 begin exec ap_oper2comis_bay @d1_foundation_id_s,@d1_date_reg_fact end else begin exec ap_oper2comis_sale @d1_foundation_id_s,@d1_date_reg_fact end #ifdef ALD_BANK_SECS IF(ISNULL(@d1_is_sint,0) = 1) BEGIN INSERT INTO tb_bind_deal2queries(deal_id, stock_operation_id, money_operation_id, order_no, foundation_id, old_stock_operation_id, old_money_operation_id) VALUES(%DEALING_ID%,3,7,@d1_max_order_no,@id,@d1_stock_oper_id,@d1_money_oper_id) UPDATE tb_baysale_docitems SET bank_stock_operation_id = 3, bank_money_operation_id = 7 WHERE id = %DEALING_ID% END #endif end -- 3 поставка выполнена end else -- 2 Оплата выполнена -- if round(@d1_saldo_b,2)<=0 -- 2 еще раз оплата выполнена begin if @d1_saldo_qty_b=0 begin ---- 3 поставка выполнена /*Передвижка по статусам, в зависимости от остатка на счетах обязательств*/ if exists(select 1 from t_items,t_types where t_items.id=%DEALING_ID% and t_types.id=t_items.type_id and t_types.type_code in ('DOG_DEALINGS_BAY_VBR','DOG_DEALINGS_SALE_VBR')) begin .ITEM_MOVE_STATE(%DEALING_ID%,'OBYAZ_END') end else begin .ITEM_MOVE_STATE(%DEALING_ID%,'PODT') end --- установка фактической даты перерегистрации update tb_plan2fact_dates set fact_reg_date =@d1_date_reg_fact where id =%DEALING_ID% --- установка фактической даты перерегистрации в главной сделке с неск. ЦБ update tb_plan2fact_dates set fact_reg_date =@d1_date_reg_fact where id =@d1_pl_item_id ---- проведение проводок по клиентским комиссиям, ----- которые зависят от условий клиентского договора (в какую дату снимать) ----- только проводки вида 4.1 - 2.0.0, т.е. в которых снимаются деньги ----- если комиссия не снялась в предыдущих этапах сделки if %BAY_OR_SALE%=1 --- 4 покупка begin exec ap_oper2comis_bay @d1_foundation_id_s,@d1_date_reg_fact end else --- 4 продажа begin exec ap_oper2comis_sale @d1_foundation_id_s,@d1_date_reg_fact end -- 4 конец покупки - продажи /*проведение проводок по комиссиям, которые д.б. созданы в момент исполнения обязательств. проводки вида соотнесение на затраты при покупке или на убыток при продаже */ --was before --- if @comission_calc_momentX = 1 --- еще + ко всему есть галочка в учетной организации, в какой момент это делать ---------- т.е. есть вариант когда при исполнении или исполнения только перерегистрации ---- 1 - в момент исполнения обязательств --- begin if %BAY_OR_SALE%=1 --- 4 покупка begin --- exec ap_oper2comis_bay @d1_foundation_id_s,@d1_date_reg_fact .EXEC_ACTION(@d1_foundation_id_s,'dog_dealings_bay_vbr','ENDPART2',Y) end else --- 4 продажа begin --- exec ap_oper2comis_sale @d1_foundation_id_s,@d1_date_reg_fact .EXEC_ACTION(@d1_foundation_id_s,'dog_dealings_sale_vbr','END_2PART2',Y) end -- 4 конец покупки - продажи --- end #ifdef ALD_BANK_SECS IF(ISNULL(@d1_is_sint,0) = 1) BEGIN INSERT INTO tb_bind_deal2queries(deal_id, stock_operation_id, money_operation_id, order_no, foundation_id, old_stock_operation_id, old_money_operation_id) VALUES(%DEALING_ID%,4,4,@d1_max_order_no,@id,@d1_stock_oper_id,@d1_money_oper_id) UPDATE tb_baysale_docitems SET bank_stock_operation_id = 4, bank_money_operation_id = 4 WHERE id = %DEALING_ID% END #endif end -- 3 end -- 2 end --1 ---- установка даты взимания брокерской комиссии в сделке (дата проводки вида 4.1 - 2.0.0) .BACK_UPDATE_BROK_DATE(%DEALING_ID%) $ENDTEXT(14364082) $PATTERNARG(%DEALING_ID%) name=Сделка order=1 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%BAY_OR_SALE%) name=Покупка или продажа order=2 comment=1-Покупка или 2-продажа mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%SUBC_MONEY%) name=Строка субконто для обязательств по ДС order=3 comment=Строка субконто для обязательств по ДС mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%SUBC_STOCK%) name=Строка субконто для обязательств по ЦБ order=4 comment=Строка субконто для обязательств по ЦБ mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%DATE%) name=Дата документа order=5 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%OWNER_ID%) name=Владелец плана order=6 comment=null mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $PATTERNARG(%PAY_OR_REG%) name=Платеж или регистрация order=7 comment=1-платеж, 2 - перерегистрация mandatory=1 default=null choose_type=null choose_action=null choose_field=null $ENDPATTERNARG $ENDPATTERN