create procedure dbo.%PROC% @plan_id numeric, @plan_code varchar(100), @partner_id numeric, @partner_code varchar(100), @op_date datetime, @op_date_s varchar(30), @doc_sum money, @doc_sum_s varchar(30), @op_sum_cur_id numeric, @op_sum_cur_id_s varchar(30), @rate_date datetime, @oper_comment varchar(255), @account_d numeric, @account_c numeric, @is_check_subconto int, @sum_accur_d money, @sum_accur_c money, @qty_sum_d money, @qty_sum_c money, @item_id numeric, @action_history_id numeric, @action_id numeric, /*Output parms*/ @operation_id numeric out , @oper_list_id_d numeric out , @oper_list_id_c numeric out , @result int out, @res_str varchar(255) out, @oper_type_id numeric = 1, -- Обычная операция -- Новые параметры @cur_id_d numeric = null, @cur_id_c numeric = null, @branch_id_d numeric = null, @branch_id_c numeric = null, @lic_acc_id_d numeric = null, @lic_acc_id_c numeric = null -- Окончание Новых параметров as declare @op_state_id numeric, @op_type_id numeric, @op_partner2plan_id numeric, @count int, @sysdate datetime begin DECLARE @letsko_acc_num_eff VARCHAR(40) .NAME_VAR(@mes) select @mes = isnull(@oper_comment,'Не задан') + ' на план ' + isnull(@plan_code,'Не задан') select @operation_id = null select @oper_list_id_d = null select @oper_list_id_c = null select @result = 0 select @res_str = '' select @sysdate=getdate() if @plan_id is null begin select @result = -1 select @res_str = 'Не задан план ' + isnull(@plan_code,'NULL')+ ' .' return end if @partner_id is null begin select @result = -1 select @res_str = 'Не задан владелец плана ' + isnull(@partner_code,'NULL')+ ' .' return end select @count= count(t_plans2partner.id) from t_plans2partner, t_items,t_states where t_plans2partner.plan_id=@plan_id and t_plans2partner.partner_id= @partner_id and t_plans2partner.id = t_items.id and t_states.id = t_items.state_id and t_states.class_id !=2 if @count > 1 begin select @result = -1 select @res_str = 'Найдено более одного сочетания плана ' + isnull(@plan_code,'NULL')+ ':'+ (select isnull(plan_code,'Не найден') from t_plans where id = @plan_id ) +' и владельца ' + isnull(@partner_code,'NULL')+ ':'+ (select isnull(partner_code,'Не найден') from t_partners where id = @plan_id ) + '.' return end if @count =0 begin select @result = -1 select @res_str = 'Не найдено ни одного сочетания плана ' + isnull(@plan_code,'NULL')+ ':'+ (select isnull(plan_code,'Не найден') from t_plans where id = @plan_id ) +' и владельца ' + isnull(@partner_code,'NULL')+ ':'+ (select isnull(partner_code,'Не найден') from t_partners where id = @plan_id ) + '.' return end select @op_partner2plan_id =(select t_plans2partner.id from t_plans2partner, t_items,t_states where t_plans2partner.plan_id=@plan_id and t_plans2partner.partner_id= @partner_id and t_plans2partner.id = t_items.id and t_states.id = t_items.state_id and t_states.class_id !=2) if @op_partner2plan_id is null begin select @result = -1 select @res_str = 'Не найдено сочетание плана ' + isnull(@plan_code,'NULL')+ ' и владельца ' + isnull(@partner_code,'NULL')+'.' return end if @op_date is null begin select @result = -1 select @res_str = 'Дата '+ isnull(@op_date_s,'NULL') + ' не определена' return end declare @str varchar(255) select @str=convert(varchar,isnull(@doc_sum,0))+':'+convert(varchar,isnull(@qty_sum_d,0))+':'+convert(varchar,isnull(@qty_sum_c,0)) /* if @plan_code='@tcb_plan_id' .EXIT_MESSAGE_PARM('!!!!!!!!!1',@oper_type_id) */ declare @is_qty smallint select @is_qty = is_qty from t_accounts where t_accounts.id = @account_d if isnull(@is_qty,0) <>1 select @qty_sum_d=0 select @is_qty = is_qty from t_accounts where t_accounts.id = @account_c if isnull(@is_qty,0) <>1 select @qty_sum_c=0 if isnull(@oper_type_id,0) <>0 -- Не нулевая операция begin if isnull(@doc_sum,0)=0 and isnull(@qty_sum_d,0)=0 and isnull(@qty_sum_c,0)=0 return end if @op_sum_cur_id is null and exists(select 1 from t_plans where id=@plan_id and cur_id is not null) begin select @result = -1 select @res_str = 'Валюта операции '+ isnull(@op_sum_cur_id_s,'NULL') + ' не определена.' return end if @action_history_id is null begin select @result = -1 select @res_str = 'Для проводки не задана переменная Actions History' return end select @op_type_id = (select id from t_types where upper(type_code) = 'T_OPERATIONS') if @op_type_id is null begin select @result = -1 select @res_str = 'Документ с шифром t_operations не найден в системе' return end select @op_state_id = (select id from t_states where type_id = @op_type_id and upper(state_code) = 'CRT' ) if @op_state_id is null begin select @result = -1 select @res_str = 'Статус CRT не найден у документа с шифром t_operations' return end --- -- Наличие плана счетов if not exists(select 1 from t_plans2partner , t_items, t_states where t_plans2partner.id=@op_partner2plan_id and t_plans2partner.id=t_items.id and t_items.state_id=t_states.id and t_states.class_id !=2) .EXIT_MESSAGE('Данный план счетов у предприятия не указан') --Попалдание в закрытый период if exists(select 1 from t_periods , t_items, t_states where t_periods.partner2plan_id=@op_partner2plan_id and t_periods.period_date > @op_date and t_periods.id=t_items.id and t_items.state_id=t_states.id and t_states.class_id !=2) .EXIT_MESSAGE('Период закрыт') -- Вставка T_OPERATIONS exec ap_getid @operation_id out if @@error!=0 begin select @result = -1 select @res_str = 'Ошибка генерации уникального номера проводки' select @oper_list_id_c=null select @oper_list_id_d=null select @operation_id=null return end /*insert t_items ( id, type_id, state_id, item_name ) values( @operation_id, @op_type_id, @op_state_id, '')*/ --- --- Конец проверок --- insert t_operations(id,partner2plan_id,op_date,op_sum,sum_cur_id,rate_date,op_name,operation_type,item_id,action_history_id,action_id) values(@operation_id,@op_partner2plan_id,@op_date,@doc_sum,@op_sum_cur_id,@rate_date,@oper_comment,0,@item_id, @action_history_id,@action_id) update t_operations set sysdate = @sysdate where id = @operation_id ---------- Общие расчеты для списов Д и К declare @crcdiff_recalc_type int, @plan_cur_id numeric, @is_money smallint, @acc_cur_id numeric, @is_test_saldo tinyint, @is_last tinyint, --- @type4cur_id numeric, -- Тип счета по валюте @subc_type_set4lic_id numeric, -- Набор аналитики лицевых счетов счета @branch_id numeric, -- Подразделение @lic_acc_id numeric, -- Лицевые счета @s_acc_cur_id numeric, -- Валюта счета @qty_sum money ---- select @crcdiff_recalc_type = t_plans.crcdiff_recalc_type, @plan_cur_id = t_plans.cur_id, @is_money = t_plans.is_money from t_plans2partner,t_plans where t_plans2partner.id = @op_partner2plan_id and t_plans2partner.plan_id = t_plans.id declare @rate_accur numeric(18,8), @rate_accur_date datetime, @rate_bal numeric(18,8), @rate_bal_date datetime, @sum_accur money, @sum_bal money, @rate_cur_op numeric(18,8), @rate_cur_bal numeric(18,8), @rate_cur_accur numeric(18,8), @rate_date_op datetime, @rate_date_bal datetime, @rate_date_accur datetime if @is_money != 1 -- План не денежный begin select @sum_bal = @doc_sum end else -- План денежный begin if @plan_cur_id = @op_sum_cur_id begin select @sum_bal = @doc_sum select @rate_bal = 1 end else begin IF ISNULL(@op_sum_cur_id, 0) = 0 SELECT @op_sum_cur_id = @plan_cur_id select @rate_cur_op = rate_value, @rate_date_op = rate_date from t_rates where cur_id=@op_sum_cur_id and rate_date=(select max(rate_date) from t_rates where cur_id=@op_sum_cur_id and rate_date <=@rate_date) if @rate_cur_op is null or @rate_cur_op <= 0 .EXIT_MESSAGE('Курс валюты операции должен быть задан и не может быть < = 0') select @rate_cur_bal = rate_value, @rate_date_bal=rate_date from t_rates where cur_id=@plan_cur_id and rate_date=(select max(rate_date) from t_rates where cur_id=@plan_cur_id and rate_date <=@rate_date) if @rate_cur_bal = null or @rate_cur_bal <= 0 .EXIT_MESSAGE('Курс валюты плана должен быть задан и не может быть < = 0') select @rate_bal = round(@rate_cur_op/@rate_cur_bal, 8) if @rate_date_op >= @rate_date_bal select @rate_bal_date = @rate_date_op else select @rate_bal_date = @rate_date_bal select @sum_bal= @doc_sum * @rate_bal end end ------------------- Вставка T_OPER_LIST_D exec ap_getid @oper_list_id_d out if @@error!=0 begin select @result = -1 select @res_str = 'Ошибка генерации уникального номера проводки для oper_list debet' select @oper_list_id_c=null select @oper_list_id_d=null select @operation_id=null return end -- --Проверка вставляемого -- /* ------------Дебет--------------*/ if not exists(select 1 from t_accounts , t_plans2partner,t_items,t_states where t_accounts.id=@account_d and t_plans2partner.plan_id = t_accounts.plan_id and t_plans2partner.id = @op_partner2plan_id and t_accounts.id = t_items.id and t_items.state_id = t_states.id and t_states.class_id !=2) begin select @mes = 'Счет, указанный в проводке по дебету не существует'+ ':'+ @mes .EXIT_MESSAGE(@mes) end select @branch_id = @branch_id_d select @lic_acc_id = @lic_acc_id_d select @sum_accur = @sum_accur_d -- Задана явно select @acc_cur_id = @cur_id_d --- Если задано явно select @s_acc_cur_id = t_accounts.cur_id, @is_test_saldo = is_test_saldo, @is_last = is_last, @is_qty = is_qty, @type4cur_id = type4cur_id, @subc_type_set4lic_id = subc_type_set4lic_id from t_accounts where t_accounts.id = @account_d if @is_last != 1 begin select @mes = 'Счет, указанный в проводке по дебету не является конечным' + @mes .EXIT_MESSAGE(@mes) end /* if @type4cur_id is null select @type4cur_id = 3 -- По умолчанию - многовалютный учет */ if isnull(@is_qty,0) <>1 begin select @qty_sum=0 end else select @qty_sum=@qty_sum_d if @branch_id is null select @branch_id = @partner_id if (@is_money <> 1) -- План не денежный or (@type4cur_id = 1) begin -- Учет в отдельной валюте на счету не ведется select @sum_accur = @doc_sum select @acc_cur_id = @plan_cur_id end else begin -- вычисления по валюте --- (1) if @type4cur_id = 3 begin -- Многовалютный вариант if @acc_cur_id is null -- Если не задано тогда из операции select @acc_cur_id = @op_sum_cur_id -- Валюта операции end else if @type4cur_id = 2 begin -- Одновалютный вариант - из счета select @acc_cur_id = @s_acc_cur_id -- Из счета end else begin -- В остальных случаях из плана (4) select @acc_cur_id = @plan_cur_id end if (@acc_cur_id is null) select @acc_cur_id = @plan_cur_id -- Если не задано, то из плана --- валютная сумма IF @type4cur_id = 1 BEGIN SELECT @sum_accur = @doc_sum SELECT @rate_accur = 1 END ELSE IF (@sum_accur is not null and (@type4cur_id = 4 or @type4cur_id is null)) begin --- (2) select @sum_accur = @sum_bal select @rate_accur = 1 end else if @sum_accur is null begin --- (2) if @acc_cur_id = @op_sum_cur_id begin select @sum_accur = @doc_sum select @rate_accur = 1 end else begin --- (3) select @rate_cur_op = rate_value, @rate_date_op=rate_date from t_rates where cur_id=@op_sum_cur_id and rate_date=(select max(rate_date) from t_rates where cur_id=@op_sum_cur_id and rate_date <=@rate_date) if @rate_cur_op = null or @rate_cur_op <= 0 begin exec ap_mess_raise 106 rollback transaction return end select @rate_cur_accur = rate_value, @rate_date_accur=rate_date from t_rates where cur_id=@acc_cur_id and rate_date=(select max(rate_date) from t_rates where cur_id= @acc_cur_id and rate_date <= @rate_date) if @rate_cur_accur = null or @rate_cur_accur <= 0 .EXIT_MESSAGE('Курс валюты счета должен быть задан и не может быть < = 0') select @rate_accur = round(@rate_cur_op/@rate_cur_accur, 8) if @rate_date_op >= @rate_date_accur select @rate_accur_date = @rate_date_op else select @rate_accur_date = @rate_date_accur if @sum_accur is null select @sum_accur= @doc_sum * @rate_accur end --- (3) end --- (2) end --- (1) insert t_oper_list(id,head_id,deb_or_cred,acc_id,qty_sum,is_check_subconto,sum_accur,partner2plan_id,op_date,rate_accur,rate_accur_date,rate_bal,rate_bal_date,sum_bal,sysdate,acc_cur_id, branch_id,lic_acc_id) values(@oper_list_id_d,@operation_id,1,@account_d,@qty_sum,@is_check_subconto,@sum_accur,@op_partner2plan_id,@op_date,@rate_accur,@rate_accur_date,@rate_bal,@rate_bal_date,@sum_bal,@sysdate, @acc_cur_id,@branch_id,@lic_acc_id) insert t_oper_subconto(id,subconto_type_id,item_id) select @oper_list_id_d,a2s.subc_id,null from t_acc2subconto a2s where a2s.acc_id=@account_d ------------------- Вставка T_OPER_LIST_C exec ap_getid @oper_list_id_c out if @@error!=0 begin select @result = -1 select @res_str = 'Ошибка генерации уникального номера проводки для oper_list credit' select @oper_list_id_c=null select @oper_list_id_d=null select @operation_id=null return end -- --Проверка вставляемого -- /* ------------Кредит--------------*/ IF NOT EXISTS( SELECT 1 FROM t_accounts, t_plans2partner, t_items, t_states WHERE t_accounts.id = @account_c and t_plans2partner.plan_id = t_accounts.plan_id and t_plans2partner.id = @op_partner2plan_id and t_accounts.id = t_items.id and t_items.state_id = t_states.id and t_states.class_id != 2 ) BEGIN SELECT @mes = 'Счет, указанный в проводке по кредиту (' + ISNULL(CAST(@account_c AS VARCHAR), '') + ') не существует : ' + @mes .EXIT_MESSAGE(@mes) END select @branch_id = @branch_id_c select @lic_acc_id = @lic_acc_id_c select @sum_accur = @sum_accur_c -- Задана явно select @acc_cur_id = @cur_id_c --- Если задано явно select @s_acc_cur_id = t_accounts.cur_id, @is_test_saldo = is_test_saldo, @is_last = is_last, @is_qty = is_qty, @type4cur_id = type4cur_id, @subc_type_set4lic_id = subc_type_set4lic_id from t_accounts where t_accounts.id = @account_c IF @is_last != 1 BEGIN SET @letsko_acc_num_eff = '<пусто>'; SELECT @letsko_acc_num_eff = ISNULL(acc_num_eff, '<пусто>') FROM t_accounts WHERE id = @account_c SELECT @mes = 'Счет, указанный в проводке по кредиту (' + @letsko_acc_num_eff + ') не является конечным' + @mes .EXIT_MESSAGE(@mes) END if isnull(@is_qty,0) <>1 begin select @qty_sum=0 end else select @qty_sum=@qty_sum_c if @branch_id is null select @branch_id = @partner_id if (@is_money <> 1) -- План не денежный or (@type4cur_id = 1) -- Учет в отдельной валюте на счету не ведется begin select @sum_accur = 0 select @acc_cur_id = null end else begin -- вычисления по валюте --- (1) if @type4cur_id = 3 -- Многовалютный вариант begin if @acc_cur_id is null -- Если не задано тогда из операции select @acc_cur_id = @op_sum_cur_id -- Валюта операции end else if @type4cur_id = 2 -- Одновалютный вариант - из счета begin select @acc_cur_id = @s_acc_cur_id -- Из счета end else -- В остальных случаях из плана (4) begin select @acc_cur_id = @plan_cur_id end if (@acc_cur_id is null) select @acc_cur_id = @plan_cur_id -- Если не задано, то из плана --- валютная сумма if (@sum_accur is not null and (@type4cur_id = 4 or @type4cur_id is null)) begin --- (2) select @sum_accur = @sum_bal select @rate_accur = 1 end else if @sum_accur is null begin --- (2) if @acc_cur_id = @op_sum_cur_id begin select @sum_accur = @doc_sum select @rate_accur = 1 end if @type4cur_id = 3 select @sum_accur = 0 else begin --- (3) select @rate_cur_op = rate_value, @rate_date_op=rate_date from t_rates where cur_id=@op_sum_cur_id and rate_date=(select max(rate_date) from t_rates where cur_id=@op_sum_cur_id and rate_date <=@rate_date) if @rate_cur_op = null or @rate_cur_op <= 0 begin exec ap_mess_raise 106 rollback transaction return end select @rate_cur_accur = rate_value, @rate_date_accur=rate_date from t_rates where cur_id=@acc_cur_id and rate_date=(select max(rate_date) from t_rates where cur_id= @acc_cur_id and rate_date <= @rate_date) if @rate_cur_accur = null or @rate_cur_accur <= 0 .EXIT_MESSAGE('Курс валюты счета должен быть задан и не может быть < = 0') select @rate_accur = round(@rate_cur_op/@rate_cur_accur, 8) if @rate_date_op >= @rate_date_accur select @rate_accur_date = @rate_date_op else select @rate_accur_date = @rate_date_accur if @sum_accur is null select @sum_accur= @doc_sum * @rate_accur end --- (3) end --- (2) end --- (1) insert t_oper_list(id,head_id,deb_or_cred,acc_id,qty_sum,is_check_subconto,sum_accur,partner2plan_id,op_date,rate_accur,rate_accur_date,rate_bal,rate_bal_date,sum_bal,sysdate,acc_cur_id, branch_id,lic_acc_id) values(@oper_list_id_c,@operation_id,-1,@account_c,@qty_sum,@is_check_subconto,@sum_accur,@op_partner2plan_id,@op_date,@rate_accur,@rate_accur_date,@rate_bal,@rate_bal_date,@sum_bal,@sysdate, @acc_cur_id,@branch_id,@lic_acc_id) insert t_oper_subconto(id,subconto_type_id,item_id) select @oper_list_id_c,a2s.subc_id,null from t_acc2subconto a2s where a2s.acc_id=@account_c end