1 procedure ReBuild_IE02(
2 pi_aac001 in number,
3 po_fhz out varchar2,
4 po_msg out varchar2)
5 is
6 type typ_tab_ie02 is table of ie02%rowtype index by binary_integer;
7 type typ_rec_InterestRate is record(
8 YearRate number(8, 6),
9 MonthRate number(7, 6)
10 );
11 type typ_tab_InterestRate is table of typ_rec_InterestRate index by binary_integer;
12
13 cursor cur_list is
14 select ic50.bae001, --系统机构代码
15 ic50.aab001, --组织ID-即虚拟单位编号
16 ic50.aac001, --个人编号
17 case when nvl(ic52.aab383, 0) - nvl(ic52.aic021, 0) > 0 then nvl(ic52.aab383, 0) - nvl(ic52.aic021, 0) else 0 end aic441, --划入统筹金额 = 应缴金额 - 划入账户金额
18 case when nvl(ic52.aic452, 0) > 0 then nvl(ic52.aic452, 0) else 0 end aic452, --政府补贴金额
19 aae002
20 from ic50,
21 ic52
22 where ic50.aac001 = ic52.aac001
23 and ic50.aac001 = pi_aac001
24 and ic52.bce094 = '1' --缴费标志
25 and ic52.aae016 = '1'; --复核标志
26
27 i_count integer;
28 s_bae001 ac01.bae001%type;
29 n_aab001 ac01.aab001%type;
30 n_MinYear_ie02 number(4);
31 n_SysCurYear number(4);
32 n_LoopYear number(4);
33 n_LoopMonth number(2);
34 tab_ie02 typ_tab_ie02;
35 tab_InterestRate typ_tab_InterestRate;
36
37 procedure GetMinYear_ie02
38 is
39 begin
40 select min(aae001)
41 into n_MinYear_ie02
42 from ic52
43 where aac001 = pi_aac001
44 and bce094 = '1'
45 and aae016 = '1';
46 end GetMinYear_ie02;
47
48 procedure Init_tab_ie02
49 is
50 begin
51 for i in n_MinYear_ie02..n_SysCurYear loop
52 tab_ie02(i).bae001 := s_bae001; --系统机构代码
53 tab_ie02(i).aab001 := n_aab001; --组织ID
54 tab_ie02(i).aac001 := pi_aac001; --人员ID
55 tab_ie02(i).aae001 := i; --账户年度
56 tab_ie02(i).cic103 := 0; --截止上年末个人缴费划拨统筹部分累计本息
57 tab_ie02(i).cic105 := 0; --1月增加个人缴费划拨统筹部分金额
58 tab_ie02(i).cic106 := 0; --2月增加个人缴费划拨统筹部分金额
59 tab_ie02(i).cic107 := 0; --3月增加个人缴费划拨统筹部分金额
60 tab_ie02(i).cic108 := 0; --4月增加个人缴费划拨统筹部分金额
61 tab_ie02(i).cic109 := 0; --5月增加个人缴费划拨统筹部分金额
62 tab_ie02(i).cic110 := 0; --6月增加个人缴费划拨统筹部分金额
63 tab_ie02(i).cic111 := 0; --7月增加个人缴费划拨统筹部分金额
64 tab_ie02(i).cic112 := 0; --8月增加个人缴费划拨统筹部分金额
65 tab_ie02(i).cic113 := 0; --9月增加个人缴费划拨统筹部分金额
66 tab_ie02(i).cic114 := 0; --10月增加个人缴费划拨统筹部分金额
67 tab_ie02(i).cic115 := 0; --11月增加个人缴费划拨统筹部分金额
68 tab_ie02(i).cic116 := 0; --12月增加个人缴费划拨统筹部分金额
69 tab_ie02(i).cic117 := 0; --本年个人缴费划拨统筹部分本金总额
70 tab_ie02(i).cic131 := 0; --本年缴纳个人缴费划拨统筹部分本年计入利息
71 tab_ie02(i).cic133 := 0; --截止上年末个人缴费划拨统筹部分累计本息在本年产生的利息
72 tab_ie02(i).cic135 := 0; --截止本年末个人缴费划拨统筹部分累计储存额(本息)
73 tab_ie02(i).aae013 := null; --备注
74 end loop;
75 end Init_tab_ie02;
76
77 procedure Init_tab_InterestRate
78 is
79 begin
80 for i in n_MinYear_ie02..n_SysCurYear loop
81 GetAcctYearlyRate(
82 i,
83 '110',
84 tab_InterestRate(i).YearRate,
85 po_fhz,
86 po_msg);
87 if po_fhz <> pkg_pub.def_OK then
88 return;
89 end if;
90
91 tab_InterestRate(i).MonthRate := round(tab_InterestRate(i).YearRate / 12, 6);
92 end loop;
93 end Init_tab_InterestRate;
94
95 procedure FillinAllotCorpusAmt(ai_aic441 in number) --划入统筹金额
96 is
97 begin
98 if ai_aic441 <> 0 then
99 case n_LoopMonth
100 when 1 then tab_ie02(n_LoopYear).cic105 := tab_ie02(n_LoopYear).cic105 + ai_aic441; --1月增加个人缴费划拨统筹部分金额
101 when 2 then tab_ie02(n_LoopYear).cic106 := tab_ie02(n_LoopYear).cic106 + ai_aic441; --2月增加个人缴费划拨统筹部分金额
102 when 3 then tab_ie02(n_LoopYear).cic107 := tab_ie02(n_LoopYear).cic107 + ai_aic441; --3月增加个人缴费划拨统筹部分金额
103 when 4 then tab_ie02(n_LoopYear).cic108 := tab_ie02(n_LoopYear).cic108 + ai_aic441; --4月增加个人缴费划拨统筹部分金额
104 when 5 then tab_ie02(n_LoopYear).cic109 := tab_ie02(n_LoopYear).cic109 + ai_aic441; --5月增加个人缴费划拨统筹部分金额
105 when 6 then tab_ie02(n_LoopYear).cic110 := tab_ie02(n_LoopYear).cic110 + ai_aic441; --6月增加个人缴费划拨统筹部分金额
106 when 7 then tab_ie02(n_LoopYear).cic111 := tab_ie02(n_LoopYear).cic111 + ai_aic441; --7月增加个人缴费划拨统筹部分金额
107 when 8 then tab_ie02(n_LoopYear).cic112 := tab_ie02(n_LoopYear).cic112 + ai_aic441; --8月增加个人缴费划拨统筹部分金额
108 when 9 then tab_ie02(n_LoopYear).cic113 := tab_ie02(n_LoopYear).cic113 + ai_aic441; --9月增加个人缴费划拨统筹部分金额
109 when 10 then tab_ie02(n_LoopYear).cic114 := tab_ie02(n_LoopYear).cic114 + ai_aic441; --10月增加个人缴费划拨统筹部分金额
110 when 11 then tab_ie02(n_LoopYear).cic115 := tab_ie02(n_LoopYear).cic115 + ai_aic441; --11月增加个人缴费划拨统筹部分金额
111 when 12 then tab_ie02(n_LoopYear).cic116 := tab_ie02(n_LoopYear).cic116 + ai_aic441; --12月增加个人缴费划拨统筹部分金额
112 end case;
113
114 tab_ie02(n_LoopYear).cic117 := tab_ie02(n_LoopYear).cic117 + ai_aic441; --本年个人缴费划拨统筹部分本金总额
115 end if;
116 end FillinAllotCorpusAmt;
117
118 procedure CalculateAccountAccrual
119 is
120 n_cic103 number(8, 2); --截止上年末个人缴费划拨统筹部分累计本息
121 n_AccrualEndMonth number(2);
122 begin
123 n_cic103 := 0;
124 for n_year in tab_ie02.First..tab_ie02.Last loop
125 tab_ie02(n_year).cic103 := n_cic103;
126
127 if n_year < n_SysCurYear then
128 n_AccrualEndMonth := 12;
129 else
130 n_AccrualEndMonth := to_number(to_char(sysdate, 'mm'));
131 end if;
132
133 --按正常按时缴费模式处理,从缴费当月起计息
134 for n_month in 1..n_AccrualEndMonth loop
135 --1月份
136 if n_month = 1 then
137 if tab_ie02(n_year).cic105 <> 0 and n_AccrualEndMonth >= n_month then
138 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic105 * (n_AccrualEndMonth - n_month + 1);
139 end if;
140 --2月份
141 elsif n_month = 2 then
142 if tab_ie02(n_year).cic106 <> 0 and n_AccrualEndMonth >= n_month then
143 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic106 * (n_AccrualEndMonth - n_month + 1);
144 end if;
145 --3月份
146 elsif n_month = 3 then
147 if tab_ie02(n_year).cic107 <> 0 and n_AccrualEndMonth >= n_month then
148 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic107 * (n_AccrualEndMonth - n_month + 1);
149 end if;
150 --4月份
151 elsif n_month = 4 then
152 if tab_ie02(n_year).cic108 <> 0 and n_AccrualEndMonth >= n_month then
153 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic108 * (n_AccrualEndMonth - n_month + 1);
154 end if;
155 --5月份
156 elsif n_month = 5 then
157 if tab_ie02(n_year).cic109 <> 0 and n_AccrualEndMonth >= n_month then
158 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic109 * (n_AccrualEndMonth - n_month + 1);
159 end if;
160 --6月份
161 elsif n_month = 6 then
162 if tab_ie02(n_year).cic110 <> 0 and n_AccrualEndMonth >= n_month then
163 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic110 * (n_AccrualEndMonth - n_month + 1);
164 end if;
165 --7月份
166 elsif n_month = 7 then
167 if tab_ie02(n_year).cic111 <> 0 and n_AccrualEndMonth >= n_month then
168 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic111 * (n_AccrualEndMonth - n_month + 1);
169 end if;
170 --8月份
171 elsif n_month = 8 then
172 if tab_ie02(n_year).cic112 <> 0 and n_AccrualEndMonth >= n_month then
173 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic112 * (n_AccrualEndMonth - n_month + 1);
174 end if;
175 --9月份
176 elsif n_month = 9 then
177 if tab_ie02(n_year).cic113 <> 0 and n_AccrualEndMonth >= n_month then
178 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic113 * (n_AccrualEndMonth - n_month + 1);
179 end if;
180 --10月份
181 elsif n_month = 10 then
182 if tab_ie02(n_year).cic114 <> 0 and n_AccrualEndMonth >= n_month then
183 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic114 * (n_AccrualEndMonth - n_month + 1);
184 end if;
185 --11月份
186 elsif n_month = 11 then
187 if tab_ie02(n_year).cic115 <> 0 and n_AccrualEndMonth >= n_month then
188 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic115 * (n_AccrualEndMonth - n_month + 1);
189 end if;
190 --12月份
191 elsif n_month = 12 then
192 if tab_ie02(n_year).cic116 <> 0 and n_AccrualEndMonth >= n_month then
193 tab_ie02(n_year).cic131 := tab_ie02(n_year).cic131 + tab_InterestRate(n_year).MonthRate * tab_ie02(n_year).cic116 * (n_AccrualEndMonth - n_month + 1);
194 end if;
195 end if;
196 end loop;
197
198 if n_AccrualEndMonth = 12 then
199 tab_ie02(n_year).cic133 := tab_ie02(n_year).cic103 * tab_InterestRate(n_year).YearRate;
200 else
201 tab_ie02(n_year).cic133 := tab_ie02(n_year).cic103 * tab_InterestRate(n_year).MonthRate * n_AccrualEndMonth;
202 end if;
203
204 tab_ie02(n_year).cic135 := tab_ie02(n_year).cic103 + tab_ie02(n_year).cic117 + tab_ie02(n_year).cic131 + tab_ie02(n_year).cic133;
205
206 n_cic103 := tab_ie02(n_year).cic135;
207 end loop;
208 end CalculateAccountAccrual;
209
210 procedure Insert_ie02
211 is
212 begin
213 for i in n_MinYear_ie02..n_SysCurYear loop
214 insert into ie02(
215 bae001, --系统机构代码
216 aab001, --组织ID
217 aac001, --人员ID
218 aae001, --账户年度
219 cic103, --截止上年末个人缴费划拨统筹部分累计本息
220 cic105, --1月增加个人缴费划拨统筹部分金额
221 cic106, --2月增加个人缴费划拨统筹部分金额
222 cic107, --3月增加个人缴费划拨统筹部分金额
223 cic108, --4月增加个人缴费划拨统筹部分金额
224 cic109, --5月增加个人缴费划拨统筹部分金额
225 cic110, --6月增加个人缴费划拨统筹部分金额
226 cic111, --7月增加个人缴费划拨统筹部分金额
227 cic112, --8月增加个人缴费划拨统筹部分金额
228 cic113, --9月增加个人缴费划拨统筹部分金额
229 cic114, --10月增加个人缴费划拨统筹部分金额
230 cic115, --11月增加个人缴费划拨统筹部分金额
231 cic116, --12月增加个人缴费划拨统筹部分金额
232 cic117, --本年个人缴费划拨统筹部分本金总额
233 cic131, --本年缴纳个人缴费划拨统筹部分本年计入利息
234 cic133, --截止上年末个人缴费划拨统筹部分累计本息在本年产生的利息
235 cic135, --截止本年末个人缴费划拨统筹部分累计储存额(本息)
236 aae013) --备注
237 values(
238 tab_ie02(i).bae001, --系统机构代码
239 tab_ie02(i).aab001, --组织ID
240 tab_ie02(i).aac001, --人员ID
241 tab_ie02(i).aae001, --账户年度
242 tab_ie02(i).cic103, --截止上年末个人缴费划拨统筹部分累计本息
243 tab_ie02(i).cic105, --1月增加个人缴费划拨统筹部分金额
244 tab_ie02(i).cic106, --2月增加个人缴费划拨统筹部分金额
245 tab_ie02(i).cic107, --3月增加个人缴费划拨统筹部分金额
246 tab_ie02(i).cic108, --4月增加个人缴费划拨统筹部分金额
247 tab_ie02(i).cic109, --5月增加个人缴费划拨统筹部分金额
248 tab_ie02(i).cic110, --6月增加个人缴费划拨统筹部分金额
249 tab_ie02(i).cic111, --7月增加个人缴费划拨统筹部分金额
250 tab_ie02(i).cic112, --8月增加个人缴费划拨统筹部分金额
251 tab_ie02(i).cic113, --9月增加个人缴费划拨统筹部分金额
252 tab_ie02(i).cic114, --10月增加个人缴费划拨统筹部分金额
253 tab_ie02(i).cic115, --11月增加个人缴费划拨统筹部分金额
254 tab_ie02(i).cic116, --12月增加个人缴费划拨统筹部分金额
255 tab_ie02(i).cic117, --本年个人缴费划拨统筹部分本金总额
256 tab_ie02(i).cic131, --本年缴纳个人缴费划拨统筹部分本年计入利息
257 tab_ie02(i).cic133, --截止上年末个人缴费划拨统筹部分累计本息在本年产生的利息
258 tab_ie02(i).cic135, --截止本年末个人缴费划拨统筹部分累计储存额(本息)
259 tab_ie02(i).aae013); --备注
260 end loop;
261 end Insert_ie02;
262
263 begin
264 po_fhz := pkg_pub.def_OK;
265
266 select count(1)
267 into i_count
268 from ic52
269 where aac001 = pi_aac001
270 and bce094 = '1' --缴费标志
271 and aae016 = '1' --复核标志
272 and (aae002 is null or length(to_char(aae002)) <> 6);
273 if i_count > 0 then
274 po_fhz := pkg_pub.def_ERR;
275 po_msg := to_char(pi_aac001)||'系统检查发现该参保人存在有失地居民人员养老按年零星缴费记录的【费款所属期】不正确,无法重建划统筹部分的账户记录,请先检查核实!';
276 return;
277 end if;
278
279 select count(1) into i_count from ie02 where aac001 = pi_aac001;
280 if i_count > 0 then
281 delete ie02 where aac001 = pi_aac001;
282 end if;
283
284 select bae001, aab001 into s_bae001, n_aab001 from ac01 where aac001 = pi_aac001;
285 n_SysCurYear := to_char(sysdate, 'yyyy');
286
287 GetMinYear_ie02;
288 if n_MinYear_ie02 is null then
289 return;
290 elsif n_MinYear_ie02 > n_SysCurYear then
291 po_fhz := pkg_pub.def_ERR;
292 po_msg := to_char(pi_aac001)||'系统检查发现该参保人存在有失地居民人员养老按年零星缴费记录的所属账户年度大于系统当前年度值,认为数据有问题,请先检查核实!';
293 return;
294 end if;
295
296 Init_tab_ie02;
297 for rec in cur_list loop
298 n_LoopYear := to_number(substr(rec.aae002, 1, 4));
299 n_LoopMonth := to_number(substr(rec.aae002, 5, 2));
300
301 if n_LoopMonth < 1 or n_LoopMonth > 12 then
302 po_fhz := pkg_pub.def_ERR;
303 po_msg := to_char(pi_aac001)||'系统检查发现该参保人存在有失地居民人员养老按年零星缴费记录无法确定其记账所属年月,认为数据有问题,请通知系统管理员协助检查核实!';
304 return;
305 end if;
306
307 FillinAllotCorpusAmt(rec.aic441);
308
309 if tab_ie02(n_LoopYear).bae001 <> rec.bae001 then
310 tab_ie02(n_LoopYear).bae001 := rec.bae001;
311 end if;
312 if tab_ie02(n_LoopYear).aab001 <> rec.aab001 then
313 tab_ie02(n_LoopYear).aab001 := rec.aab001;
314 end if;
315 end loop;
316
317 Init_tab_InterestRate;
318 if po_fhz <> pkg_pub.def_OK then
319 return;
320 end if;
321
322 CalculateAccountAccrual;
323 Insert_ie02;
324 exception
325 when others then
326 po_fhz := pkg_pub.def_ERR;
327 po_msg := to_char(pi_aac001)||'对该参保人的失地居民人员养老按年零星缴费记录重建划统筹部分的账户记录时发生失败:'||sqlerrm;
328 end ReBuild_IE02;