create procedure proc_card_income(IN l_deduct_docid varchar(32), IN userid varchar(32), IN orgid varchar(32))
begin
	declare use_money decimal(22,10) default 0;
	declare l_mayope_money decimal(22,10);
	declare l_contract_number varchar(32);
	declare r_payment_number varchar(32);
	declare l_card_data_id varchar(32);
	declare l_own_bank varchar(100) default '';
	declare l_own_account varchar(100) default '';
	declare l_own_number varchar(100) default '';
	declare l_client_acc_number varchar(100);
	declare l_client_account varchar(100);
	declare l_client_bank varchar(100);
	declare l_deduct_info_id varchar(32);
	declare l_import_date varchar(32);
	declare l_export_date varchar(32);
	declare done boolean default false;
	DECLARE sql_error INT DEFAULT 0;
	declare card_data cursor for
	select id,mayope_money,client_acc_number,client_account,client_bank,contract_number,payment_number from lc_card_deduct_data  where deduct_docid =  l_deduct_docid and mayope_money > 0;
	declare continue handler for not found set done = true;
	open card_data;
	myLoop:loop
		fetch card_data into l_card_data_id,l_mayope_money,l_client_acc_number,l_client_account,l_client_bank,     l_contract_number,r_payment_number;
		if done then leave myLoop;
		end if;
		begin
			declare l_payment_number varchar(32);
			declare l_plan_list varchar(32);
			declare l_rent decimal;
			declare l_corpus decimal;
			declare l_interest decimal;
			declare l_penalty decimal;
			declare l_hire_list decimal;
			declare subdone boolean default false;
			declare rent_plan cursor for
			select vlrp.payment_number,vlrp.plan_list,vlrp.rent_over,vlrp.corpus_over,vlrp.interest_over,
			vlrp.penalty_over,ifnull(lri.ihire_list, 0) + ifnull(lrit.thire_list, 0) hire_list from vi_lc_rent_plan      vlrp left join (select payment_number,plan_list,
			count(1) ihire_list from lc_rent_income where roll_back = '0' group by payment_number,plan_list) lri on      lri.payment_number = vlrp.payment_number and lri.plan_list = vlrp.plan_list left join 
			(select payment_number, plan_list,count(1) thire_list from lc_rent_income_temp where roll_back = '0' and      is_flowing = '0' group by payment_number,plan_list) lrit on lrit.payment_number = vlrp.payment_number      and lrit.plan_list = vlrp.plan_list where vlrp.contract_number = l_contract_number order by plan_list;
			declare continue handler for not found set subdone = true;
			open rent_plan;
			subLoop:loop
				fetch rent_plan into l_payment_number,l_plan_list,l_rent,l_corpus,l_interest,l_penalty,l_hire_list;
				if subdone then leave subLoop;
				end if;
				if l_mayope_money > 0 and l_rent + l_penalty > 0 then
					insert into lc_rent_income(id,
																		 quot_id,
																		 cust_id,
																		 project_id,
																		 project_plan_number,
																		 contract_id,
																		 contract_plan_number,
																		 payment_number,
																		 plan_id,
																		 plan_list,
																		 hire_list,
																		 hire_date,
																		 rent,
																		 corpus,
																		 interest,
																		 penalty,
																		 corpus_adjust,
																		 interest_adjust,
																		 penalty_adjust,
																		 settle_method,
																		 carddeduct_id,
																		 carddeduct_status,
																		 hire_object,
																		 hire_bank,
																		 hire_account,
																		 hire_number,
																		 own_bank,
																		 own_account,
																		 own_number,
																		 roll_back,
																		 inputuserid,
																		 inputorgid,
																		 inputtime)
															select replace(UUID(), '-', ''),
																		 lrp.quot_id,
																		 lrp.cust_id,
																		 lrp.project_id,
																		 lrp.project_plan_number,
																		 lrp.contract_id,
																		 lrp.contract_plan_number,
																		 lrp.payment_number,
																		 lrp.id,
																		 lrp.plan_list,
																		 l_hire_list +1,
																		 date_format(now(), '%Y/%m/%d %H:%i:%s'),
																		 round(case when lio.first='PENALTY' then
																								case when l_mayope_money - l_penalty >= l_rent 																									then l_rent else 
																								case when l_mayope_money > l_penalty 
																								then l_mayope_money - l_penalty else 0 end end
																								else
																								case when l_mayope_money >= l_rent then l_rent 																										 else l_mayope_money end
																						end,2),
																		 round(case when lio.first='CORPUS' then
																								case when l_mayope_money >= l_corpus 
																										 then l_corpus else l_mayope_money end
																								when lio.second='CORPUS' and lio.first='INTEREST' then
																								case when l_mayope_money > l_interest then
																								case when l_mayope_money - l_interest >= 
																								          l_corpus then l_corpus else                                                          l_mayope_money - l_interest end
																								else 0 end
																								when lio.second='CORPUS' and lio.first='PENALTY' then
																								case when l_mayope_money > l_penalty then
																								case when l_mayope_money - l_penalty >= 
																													l_corpus then l_corpus else 																												 l_mayope_money - l_penalty end
																								else 0 end
																								else
																								case when l_mayope_money > l_interest + 
																													l_penalty then
																								case when l_mayope_money - l_interest - 
																													l_penalty >= l_corpus 
																										 then l_corpus else l_mayope_money - 
																													l_interest - l_penalty end
																								else 0 end
																								end,2),
																		 round(case when lio.first='INTEREST' then
																								case when l_mayope_money >= l_interest 
																										 then l_interest else l_mayope_money end
																								when lio.second='INTEREST' and lio.first='CORPUS' then
																								case when l_mayope_money>l_corpus then
																								case when l_mayope_money-l_corpus >= 
																													l_interest then l_interest else 																												 l_mayope_money-l_corpus end
																								else 0 end
																								when lio.second='INTEREST' and lio.first='PENALTY' then
																								case when l_mayope_money > l_penalty then
																								case when l_mayope_money - l_penalty >= 
																													l_interest then l_interest else 																												 l_mayope_money - l_penalty end
																								else 0 end
																								else
																								case when l_mayope_money>l_corpus + l_penalty 																									  then
																								case when l_mayope_money-l_corpus - l_penalty 																												 >= l_interest then l_interest else 																												 l_mayope_money - l_corpus - 
																													l_penalty end
																								else 0 end
																								end,2),
																		 round(case when lio.first='PENALTY' then
																								case when l_mayope_money >= l_penalty 
																										 then l_penalty else l_mayope_money end
																								when lio.second='PENALTY' and lio.first='CORPUS' then
																								case when l_mayope_money > l_corpus then
																								case when l_mayope_money - l_corpus >= 
																													l_penalty then l_penalty else 																												 l_mayope_money - l_corpus end
																								else 0 end
																								when lio.second='PENALTY' and lio.first='INTEREST' then
																								case when l_mayope_money > l_interest then
																								case when l_mayope_money - l_interest >= 
																													l_penalty then l_penalty else 																												 l_mayope_money - l_interest end
																								else 0 end
																								else
																								case when l_mayope_money > l_corpus + 
																													l_interest then
																								case when l_mayope_money - l_corpus - 
																													l_interest >= l_penalty 
																													then l_penalty else l_mayope_money - 																													l_corpus - l_interest end
																								else 0 end
																								end,2),
																		 0,0,0,
																		 'settlemethod13',
																		 l_card_data_id,
																		 'have_income',
																		 lul.customer_id,
																		 l_client_bank,
																		 l_client_account,
																		 l_client_acc_number,
																		 l_own_bank,
																		 l_own_account,
																		 l_own_number,
																		 '0',
																		 userid,
																		 orgid,
																		 date_format(now(),'%Y/%m/%d %H:%i:%s')
																from lc_rent_plan lrp left join lc_calc_condition lcc on lcc.payment_number = 															 l_payment_number
																left join lc_income_order lio on 1 = 1 and 
																lio.repayment_type=(case when curdate()-
																str_to_date(lrp.plan_date,'%Y/%m/%d')>cast(lcc.free_defa_inter_day as 
																decimal(5,0)) then 'over_income' else 'normal_income' end)
																left join lb_union_lessee lul on lul.contract_id = lcc.contract_id 
																and is_main='Y' where lrp.payment_number = l_payment_number 
																and lrp.plan_list = l_plan_list;
									-- 更新卡扣数据                          
									update lc_card_deduct_data set had_money = had_money + (case when l_mayope_money >= 								 l_rent + l_penalty then l_rent + l_penalty else l_mayope_money end),
									mayope_money = mayope_money - (case when l_mayope_money >= l_rent + l_penalty 
									then l_rent + l_penalty else l_mayope_money end) 
									where id = l_card_data_id;
                  -- 更新已核销金额
                  set use_money = use_money + (case when l_mayope_money >= l_rent + l_penalty                  	 then l_rent + l_penalty else l_mayope_money end);
                  -- 更新可核销金额
                  set l_mayope_money = l_mayope_money - (case when l_mayope_money >= l_rent + 
									l_penalty then l_rent + l_penalty else l_mayope_money end);
				elseif l_mayope_money = 0 then
					leave subLoop;
				end if;
			end loop subLoop;
		end;
		delete from lc_occupy_rent_list where payment_number = r_payment_number and flow_name = '卡扣核销';
		end loop myLoop;
		update lc_card_deduct_doc set allhad_money = allhad_money + use_money,allmayope_money = allmayope_money - 	 use_money,status = (case when allhad_money - use_money <= 0 then 'have_income' else case when use_money =    0 then status else 'part_icome' end end) where id = l_deduct_docid;
	close card_data;
end;

