1 Package body PAY_ZA_EOY_VAL as
2 /* $Header: pyzatyev.pkb 120.9.12010000.9 2008/09/11 08:35:29 rbabla ship $ */
3 -- Pacakge Body
4 Function modulus_10_test
5 (p_tax_number in number) return number
6 -- return 1 if correct, else return 0
7 is
8
9 nine_digits number(9);
10 tax_no number(10);
11 n1 number(2);
12 n2 number(1):= substr(p_tax_number,2,1);
13 n3 number(2):= 2 * substr(p_tax_number,3,1);
14 n4 number(1):= substr(p_tax_number,4,1);
15 n5 number(2):= 2 * substr(p_tax_number,5,1);
16 n6 number(1):= substr(p_tax_number,6,1);
17 n7 number(2):= 2 * substr(p_tax_number,7,1);
18 n8 number(1):= substr(p_tax_number,8,1);
19 n9 number(2):= 2* substr(p_tax_number,9,1);
20 n10 number(2):= substr(p_tax_number,10,1);
21 temp number(2);
22 temp1 number(2);
23 res number(2);
24 begin
25 -- Store the 10 digit tax number
26 -- only the first nine chars are used for the test
27
28
29 tax_no:=p_tax_number;
30 If ((length(tax_no) <> 10) or (tax_no is NULL)) then
31 return 0;
32 elsif tax_no between 7000000000 and 7980000000 then
33 -- replace the first digit 7 by 4
34 nine_digits := substr(tax_no,2,10);
35 tax_no := 4||nine_digits;
36 end if;
37
38 -- otherwise do not replace the first digit
39 -- Multiply the first number and thereafter every second number by 2
40 -- if the result is greater than 9, add the individual digits to get
41 -- the final answer
42
43 n1 := 2 * substr(tax_no,1,1);
44 if n1 > 9 then
45 n1 := substr(n1,1,1) + substr(n1,2,1);
46 end if;
47 if n3 > 9 then
48 n3 := substr(n3,1,1) + substr(n3,2,1);
49 end if;
50 if n5 > 9 then
51 n5 := substr(n5,1,1) + substr(n5,2,1);
52 end if;
53 if n7 > 9 then
54 n7 := substr(n7,1,1) + substr(n7,2,1);
55 end if;
56 if n9 > 9 then
57 n9 := substr(n9,1,1) + substr(n9,2,1);
58 end if;
59 temp := n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9;
60
61 -- deduct the total result from the next full ten to get the last digit
62 if mod(temp,10) > 0 then
63 temp1 := temp - mod(temp,10) + 10;
64 else
65 temp1 := temp;
66 end if;
67 res := temp1 - temp;
68 if res = n10 then
69 return 1;
70 else
71 return 0;
72 end if;
73
74 exception
75
76 when value_error then
77 return 0;
78
79 when others then
80 raise_application_error(-20101,'PAY_ZA_EOY_VAL.MODULUS_10_TEST exception');
81
82
83
84 end modulus_10_test;
85
86 Function modulus_10_test
87 (p_tax_number in varchar2) return number
88 -- return 1 if correct, else return 0
89 is
90
91 nine_digits varchar2(9);
92 tax_no varchar2(10);
93 n1 varchar2(2);
94 n2 varchar2(1):= substr(p_tax_number,2,1);
95 n3 varchar2(2):= 2 * substr(p_tax_number,3,1);
96 n4 varchar2(1):= substr(p_tax_number,4,1);
97 n5 varchar2(2):= 2 * substr(p_tax_number,5,1);
98 n6 varchar2(1):= substr(p_tax_number,6,1);
99 n7 varchar2(2):= 2 * substr(p_tax_number,7,1);
100 n8 varchar2(1):= substr(p_tax_number,8,1);
101 n9 varchar2(2):= 2* substr(p_tax_number,9,1);
102 n10 varchar2(2):= substr(p_tax_number,10,1);
103 temp varchar2(2);
104 temp1 varchar2(2);
105 res varchar2(2);
106 begin
107 -- Store the 10 digit tax number
108 -- only the first nine chars are used for the test
109
110
111 tax_no:=p_tax_number;
112 If ((length(tax_no) <> 10) or (tax_no is NULL)) then
113 return 0;
114 elsif tax_no between 7000000000 and 7980000000 then
115 -- replace the first digit 7 by 4
116 nine_digits := substr(tax_no,2,10);
117 tax_no := 4||nine_digits;
118 end if;
119
120 -- otherwise do not replace the first digit
121 -- Multiply the first number and thereafter every second number by 2
122 -- if the result is greater than 9, add the individual digits to get
123 -- the final answer
124
125 n1 := 2 * substr(tax_no,1,1);
126 if n1 > 9 then
127 n1 := substr(n1,1,1) + substr(n1,2,1);
128 end if;
129 if n3 > 9 then
130 n3 := substr(n3,1,1) + substr(n3,2,1);
131 end if;
132 if n5 > 9 then
133 n5 := substr(n5,1,1) + substr(n5,2,1);
134 end if;
135 if n7 > 9 then
136 n7 := substr(n7,1,1) + substr(n7,2,1);
137 end if;
138 if n9 > 9 then
139 n9 := substr(n9,1,1) + substr(n9,2,1);
140 end if;
141 temp := n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9;
142
143 -- deduct the total result from the next full ten to get the last digit
144 if mod(temp,10) > 0 then
145 temp1 := temp - mod(temp,10) + 10;
146 else
147 temp1 := temp;
148 end if;
149 res := temp1 - temp;
150 if res = n10 then
151 return 1;
152 else
153 return 0;
154 end if;
155
156 exception
157
158 when value_error then
159 return 0;
160
161 when others then
162 raise_application_error(-20101,'PAY_ZA_EOY_VAL.MODULUS_10_TEST exception');
163
164
165
166 end modulus_10_test;
167
168
169 -- Function to check id ID number and Data of birth of a person.
170 --
171 Function check_id_dob(p_id_number in number,p_dob in date) return number
172 is
173 -- return 0 if false, else return 1
174
175 id_six_nos number(6);
176 dob_six_nos varchar2(6);
177 begin
178 if (p_id_number is NULL OR p_dob is NULL) OR (length(p_id_number) <> 13) then
179 return 0;
180 else
181 -- Get the first six characters of the ID number
182 -- Get the data of birth in YYMMDD format and compare
183
184 id_six_nos := substr(p_id_number,1,6);
185
186 dob_six_nos := to_char(p_dob,'YYMMDD');
187 if id_six_nos <> to_number(dob_six_nos) then
188 return 0;
189 else
190 return 1;
191 end if;
192 end if;
193
194 exception
195
196 when others then
197 raise_application_error(-20102,'PAY_ZA_EOY_VAL.CHECK_ID_DOB exception');
198
199
200 end check_id_dob;
201
202 -- Function to check unique IRP5 number
203 Function check_IRP5_no( p_payroll_id in Number
204 ,p_irp5no in varchar2
205 ,p_tax_year in varchar2) return Number
206 -- return 0 if false, else return 1
207 is
208 v_count number;
209 v_tax_start_date varchar2(20);
210 v_tax_end_date varchar2(20);
211 begin
212 If (p_payroll_id is NULL) or (p_irp5no is NULL) or (p_tax_year is NULL) then
213 return 0;
214 else
215
216 get_tax_start_end_dates(p_payroll_id,p_tax_year,v_tax_start_date,v_tax_end_date);
217 --removed the sub query for selecting the max effective date ,since the date tracked
218 --checks would anyway get the latest payroll details
219
220 select count(*)
221 into v_count
222 from pay_all_payrolls_f pap,
223 hr_soft_coding_keyflex scl
224 where pap.business_group_id = (select pap2.business_group_id from pay_all_payrolls_f pap2 where pap2.payroll_id=p_payroll_id and rownum=1)
225 and pap.soft_coding_keyflex_id = scl.soft_coding_keyflex_id
226 and scl.segment8 = p_irp5no
227 and to_date(v_tax_end_date,'DD-MM-YYYY') between pap.effective_start_date and pap.effective_end_date;
228 if v_count > 1 then
229 return 0;
230 else
231 return 1;
232 end if;
233 end if;
234
235 exception
236
237 when others then
238 raise_application_error(-20103,'PAY_ZA_EOY_VAL.CHECK_IRP5_NO exception');
239
240
241 end check_IRP5_no;
242
243 -- Prcoedure to get the Tax Year Start Date and End date
244 Procedure get_tax_start_end_dates
245 (p_payroll_id in number
246 ,p_tax_year in varchar2
247 ,p_tax_start_date out nocopy varchar2
248 ,p_tax_end_date out nocopy varchar2) as
249 begin
250
251 select to_char(min(start_date),'dd-mon-yyyy'),to_char(max(end_date),'dd-mon-yyyy')
252 into p_tax_start_date,p_tax_end_date
253 from per_time_periods
254 where payroll_id = p_payroll_id
255 and prd_information1 = p_tax_year;
256
257 exception
258
259 when others then
260 raise_application_error(-20104,'PAY_ZA_EOY_VAL.GET_TAX_START_END_DATE exception');
261
262
263 end get_tax_start_end_dates;
264
265
266
267 -- Procedure to populate the validation messages form FND_NEW_MESSAGES
268 Procedure populate_messages(c_name OUT NOCOPY VARCHAR2,
269 c_ref_no OUT NOCOPY VARCHAR2,
270 c_ref_no_invalid OUT NOCOPY VARCHAR2,
271 c_person_name OUT NOCOPY VARCHAR2,
272 c_telephone OUT NOCOPY VARCHAR2,
273 c_add_line1 OUT NOCOPY VARCHAR2,
274 c_pcode OUT NOCOPY VARCHAR2,
275 c_pcode1 OUT NOCOPY VARCHAR2,
276 trade_name OUT NOCOPY VARCHAR2,
277 paye_no OUT NOCOPY VARCHAR2,
278 paye_no1 OUT NOCOPY VARCHAR2,
279 address OUT NOCOPY VARCHAR2,
280 pcode OUT NOCOPY VARCHAR2,
281 pcode1 OUT NOCOPY VARCHAR2,
282 payroll_number OUT NOCOPY VARCHAR2,
283 nature_entered OUT NOCOPY VARCHAR2,
284 id_passport OUT NOCOPY VARCHAR2,
285 no_id_passport OUT NOCOPY VARCHAR2,
286 sur_trade_name OUT NOCOPY VARCHAR2,
287 cc_no OUT NOCOPY VARCHAR2,
288 sur_first_name OUT NOCOPY VARCHAR2,
289 M_sur_fname OUT NOCOPY VARCHAR2,
290 M_id_pno_fname OUT NOCOPY VARCHAR2,
291 M_cc_trade_name OUT NOCOPY VARCHAR2,
292 M_lname_fname_cc OUT NOCOPY VARCHAR2,
293 invalid_it_no OUT NOCOPY VARCHAR2,
294 birth_id OUT NOCOPY VARCHAR2,
295 legal_entity OUT NOCOPY VARCHAR2,
296 no_site_paye_split OUT NOCOPY VARCHAR2,
297 neg_bal_not_alwd OUT NOCOPY VARCHAR2,
298 clearance_num OUT NOCOPY VARCHAR2,
299 terminate_emp OUT NOCOPY VARCHAR2,
300 town_city OUT NOCOPY VARCHAR2) as
301 begin
302 -- File header record messages
303 c_name:=fnd_message.get_string('PAY','PY_ZA_ENTER_CREATOR');
304 c_ref_no:=fnd_message.get_string('PAY','PY_ZA_ENTER_CREATOR_REF_NO');
305 c_ref_no_invalid:=fnd_message.get_string('PAY','PY_ZA_INVALID_CREATOR_REF_NO');
306 c_person_name:=fnd_message.get_string('PAY','PY_ZA_ENTER_CONTACT_NAME');
307 c_telephone:=fnd_message.get_string('PAY','PY_ZA_ENTER_CONTACT_PHONE_NO');
308 c_add_line1:=fnd_message.get_string('PAY','PY_ZA_ENTER_ADDRESS_LINE1');
309 c_pcode:=fnd_message.get_string('PAY','PY_ZA_ENTER_POSTAL_CODE');
310 c_pcode1:=fnd_message.get_string('PAY','PY_ZA_INVALID_POSTAL_CODE');
311
312 -- Employer validation messages
313 trade_name:=fnd_message.get_string('PAY','PY_ZA_ENTER_TRADING_NAME');
314 paye_no:=fnd_message.get_string('PAY','PY_ZA_ENTER_TAX_REF_NO');
315 paye_no1:=fnd_message.get_string('PAY','PY_ZA_INVALID_TAX_REF_NO');
316 address:=c_add_line1;
317 pcode:= c_pcode;
318 pcode1:=c_pcode1;
319
320 -- Payroll validation message
321 payroll_number:=fnd_message.get_string('PAY','PY_ZA_INVALID_IRP5_NO');
322
323 --Employee validation messages
324 nature_entered:=fnd_message.get_string('PAY','PY_ZA_ENTER_NATURE_PERSON');
325 id_passport:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_AC_ID_PASSNO');
326 no_id_passport:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_B_ID_PASSNO');
327 sur_trade_name:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_DEFGHK_TRADE');
328 cc_no:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_DEHK_CC_NO');
329
330 sur_first_name:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_ABC_S_F_NAME');
331 M_sur_fname:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_M_S_F_NAME');
332 M_id_pno_fname:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_M_IDPNO_SF_NAM');
333 M_cc_trade_name:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_M_CC_NO');
334
335 M_lname_fname_cc:=fnd_message.get_string('PAY','PY_ZA_ENTER_NAT_M_FM_NAME_CCNO');
336
337 invalid_it_no:=fnd_message.get_string('PAY','PY_ZA_INVALID_IT_TAX_NO');
338 birth_id:=fnd_message.get_string('PER','HR_ZA_INVALID_NI_DOB');
339 legal_entity:=fnd_message.get_string('PAY','PY_ZA_ENTER_LEGAL_ENTITY');
340
341 no_site_paye_split:=fnd_message.get_string('PAY','PY_ZA_NO_SITE_PAYE_SPLIT');
342 neg_bal_not_alwd :=fnd_message.get_string('PAY','PY_ZA_NEG_BAL_NOT_ALWD');
343 clearance_num:=fnd_message.get_string('PAY','PA_ZA_ENTER_CLEARANCE_NUM');
344 terminate_emp:=fnd_message.get_string('PAY','PA_ZA_TERMINATE_EMP');
345 town_city := fnd_message.get_string('PAY','PAY_ZA_ENTER_TOWN_CITY');
346
347 exception
348
349 when others then
350 raise_application_error(-20105,'PAY_ZA_EOY_VAL.POPULATE_MESSAGES exception');
351
352
353 end populate_messages;
354
355 -- function to convert the decimal separator if it is ',' Eg 123,45 => 123.45
356 function decimal_character_conversion ( amount_char in varchar2) return varchar2 is
357 amount_num number ;
358 amount_ret varchar2(100) ;
359 begin
360 amount_num := to_number(amount_char) ;
361 return amount_char ;
362 exception
363 when others then
364 amount_ret := replace(amount_char,',','.') ;
365 return amount_ret ;
366 end decimal_character_conversion ;
367
368 -- for TYE 2008 write the exceptions to the log file
369 PROCEDURE VALIDATE_TYE_DATA (
370 errbuf out nocopy varchar2,
371 retcode out nocopy number,
372 p_payroll_action_id in pay_payroll_actions.payroll_action_id%type,
373 p_tax_yr_start_date IN DATE,
374 p_tax_yr_end_date IN DATE
375 )is
376 /* Cursor to select all Income Sars Codes which have negative balances*/
377 g_default_clrno CONSTANT VARCHAR2(11) := '99999999999' ;
378 g_default_dirno CONSTANT VARCHAR2(7) := 'Default' ;
379 g_application_id CONSTANT NUMBER := 801 ;
380
381 CURSOR negative_amt_check_cur(p_asgn_action_id pay_assignment_actions.assignment_action_id%TYPE) IS
382 select irp5.code,
386 ff_database_items dbi
383 sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))))) value
384 FROM pay_za_irp5_bal_codes irp5,
385 ff_archive_items arc,
387 WHERE dbi.user_entity_id = arc.user_entity_id
388 and irp5.user_name = dbi.user_name
389 AND arc.context1 = p_asgn_action_id
390 and irp5.balance_sequence = 1
391 and (
392 (irp5.code BETWEEN 3601 AND 3607)
393 OR
394 (irp5.code BETWEEN 3609 AND 3613)
395 or
396 (irp5.code BETWEEN 3615 AND 3617 ) -- 3608 and 3614 are LMPSM balance
397 or
398 (irp5.code BETWEEN 3651 AND 3667)
399 OR
400 (irp5.code BETWEEN 3701 AND 3706)
401 OR
402 (irp5.code BETWEEN 3708 AND 3717) -- 3707 and 3718 are LMPSM balances
403 OR
404 (irp5.code BETWEEN 3751 AND 3768)
405 or
406 (irp5.code BETWEEN 3801 and 3810)
407 or
408 (irp5.code BETWEEN 3851 and 3860)
409 or
410 (irp5.code BETWEEN 3813 and 3863)
411 OR -- 3901 to 3907 are LMPSM balances
412 (irp5.code BETWEEN 3951 and 3957)
413 or
414 (irp5.code BETWEEN 3695 and 3699)
415 OR -- 4001 to 4004, 4006, 4007 are Deduction balances
416 (irp5.code = 4005 )
417 or
418 (irp5.code = 4018)
419 or
420 (irp5.code BETWEEN 4024 and 4025)
421 or
422 (irp5.code BETWEEN 4101 and 4103)
423 or
424 (irp5.code BETWEEN 4472 and 4474)
425 or
426 (irp5.code BETWEEN 4485 and 4487)
427 or
428 (irp5.code = 4493)
429 )
430 group by irp5.code
431 HAVING sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))))) < 0 ;
432
433 /* Cursor to fetch all LumpSum Balance Sars Codes ( For Main Certificate) which have neagtive amounts*/
434 CURSOR fetch_lmpsm_bal_cur ( p_asgn_action_id pay_assignment_actions.assignment_action_id%TYPE) is
435 select irp5.code,
436 sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))))) value
437 FROM pay_za_irp5_bal_codes irp5,
438 ff_archive_items arc,
439 ff_database_items dbi,
440 ff_archive_item_contexts faic2,
441 ff_contexts ffc2
442 WHERE irp5.code IN (3608, 3614, 3707, 3718, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3915)
443 AND irp5.balance_sequence = 3
444 AND irp5.user_name = dbi.user_name
445 AND dbi.user_entity_id = arc.user_entity_id
446 AND arc.context1 = p_asgn_action_id
450 AND faic2.CONTEXT = 'To Be Advised'
447 AND faic2.archive_item_id = arc.archive_item_id
448 AND ffc2.context_id = faic2.context_id
449 AND ffc2.context_name = 'SOURCE_TEXT'
451 group by irp5.code
452 HAVING sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0)))))<0 ;
453
454 /* Cursor to fetch The -ve Lump Sum balances with Directive Number other than Default
455 That is checking the Lump Sum Certificate balances */
456 CURSOR get_lmpsm_crt_bal (p_asg_act_id pay_assignment_actions.assignment_action_id%TYPE) is
457 select sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(arc.value)))) value
458 , faic2.CONTEXT Tax_Directive_Number
459 , irp5.code code
460 from pay_za_irp5_bal_codes irp5,
461 ff_archive_items arc,
462 ff_database_items dbi,
463 ff_archive_item_contexts faic2,
464 ff_contexts ffc2
465 where arc.context1 in (select ch.assignment_action_id
466 from pay_assignment_actions main
467 , pay_assignment_actions ch
468 where main.assignment_action_id = p_asg_act_id
469 and ch.payroll_action_id = main.payroll_action_id
470 and ch.assignment_action_id < main.assignment_action_id
471 AND ch.assignment_id = main.assignment_id)
472 and
473 (
474 arc.value is not null
475 or
476 (
477 arc.value is not null
478 and arc.value <> 0
479 )
480 )
481 and dbi.user_entity_id = arc.user_entity_id
482 and irp5.code IN (3608, 3614, 3707, 3718, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3915)
483 AND irp5.balance_sequence = 3
484 AND dbi.user_name = irp5.user_name
485 AND faic2.archive_item_id = arc.archive_item_id
486 AND ffc2.context_id = faic2.context_id
487 AND ffc2.context_name = 'SOURCE_TEXT'
488 group BY faic2.CONTEXT
489 , irp5.code
490 HAVING sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(arc.value)))) < 0;
491
492
493 /*Cursor to fetch all Deduction Balances which have either negative amounts or missing clearance numbers*/
494 CURSOR fetch_deduction_bal_cur ( p_asgn_action_id pay_assignment_actions.assignment_action_id%type) IS
495 select irp5.code ,
496 faic2.CONTEXT clearance_num,
497 sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))))) value
498 FROM pay_za_irp5_bal_codes irp5,
499 ff_archive_items arc,
500 ff_database_items dbi,
501 ff_archive_item_contexts faic2,
502 ff_contexts ffc2
503 WHERE irp5.code IN (4001, 4002, 4003, 4004, 4006, 4007)
504 AND irp5.balance_sequence = 1
505 AND irp5.user_name = dbi.user_name
506 AND dbi.user_entity_id = arc.user_entity_id
507 AND arc.context1 = p_asgn_action_id
508 AND faic2.archive_item_id = arc.archive_item_id
509 AND ffc2.context_id = faic2.context_id
510 AND ffc2.context_name = 'SOURCE_NUMBER'
511 group by irp5.code,
512 faic2.CONTEXT
513 HAVING (sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0)))))<0)
514 OR (faic2.CONTEXT = g_default_clrno
515 and sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))))) <> 0);
516 --added above condition for Bug 7214056
517
518 /*Cursor to fetch Medical Aid Code Values for Cross Validation*/
519 CURSOR fetch_med_code_bal_cur ( p_asgn_action_id pay_assignment_actions.assignment_action_id%TYPE) IS
520 select irp5.code,
521 sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))))) value
522 FROM pay_za_irp5_bal_codes irp5,
523 ff_archive_items arc,
524 ff_database_items dbi
525 WHERE irp5.code IN (3810, 3813, 4005, 4024, 4025, 4485, 4486)
526 AND irp5.balance_sequence = 1
527 AND irp5.user_name = dbi.user_name
528 AND dbi.user_entity_id = arc.user_entity_id
529 AND arc.context1 = p_asgn_action_id
530 group by irp5.code;
531
532 /* Cursor to fetch all assignment_id and max(assignment_action_id) for given payroll_action_id */
533 CURSOR asgn_for_payroll_action_cur IS
534 SELECT assignment_id,
535 max(assignment_action_id) assignment_action_id -- max assignment_action_id relates to Main Certificate
536 FROM pay_assignment_actions
537 WHERE payroll_action_id = p_payroll_action_id
538 GROUP BY assignment_id ;
539
540 /*Cursor to fetch assignment_action_id corresponding to payroll run for given assignment_id and that tax year*/
541 CURSOR payroll_asgn_ac_id_cur(p_asgn_id pay_assignment_actions.assignment_id%type,
542 p_start_date DATE,
543 p_end_date DATE) IS
544 select paa.assignment_action_id
545 from pay_action_contexts pac,
546 pay_assignment_actions paa,
547 pay_payroll_actions ppa,
548 ff_contexts ffc
549 where paa.assignment_id = p_asgn_id
553 And pac.context_value = g_default_clrno
550 and paa.payroll_action_id = ppa.payroll_action_id
551 and ppa.action_type in ('R', 'Q','B')
552 AND pac.assignment_Action_id = paa.assignment_action_id
554 and ffc.context_name = 'SOURCE_NUMBER'
555 and ffc.context_id = pac.context_id
556 and ppa.effective_date >= p_start_date
557 and ppa.effective_date <= p_end_date;
558
559 /*Cursor the fetch all element names which have missing clearance numbers for given assignment_id*/
560 CURSOR elem_names_cur (p_asgn_ac_id pay_assignment_actions.assignment_action_id%type)IS
561 Select element_name
562 FROM pay_assignment_actions paa,
563 pay_payroll_actions ppa,
564 pay_element_types_f pet,
565 pay_input_values_f piv,
566 pay_run_results prr,
567 pay_run_result_values prv
568 Where paa.assignment_action_id = p_asgn_ac_id
569 and prr.assignment_Action_id = paa.assignment_action_id
570 and pet.element_type_id = prr.element_type_id
571 and piv.element_type_id = pet.element_type_id
572 and piv.name = 'Clearance Number'
573 and prv.run_result_id = prr.run_result_id
574 and prv.input_value_id = piv.input_value_id
575 and prv.RESULT_VALUE = g_default_clrno
576 and ppa.payroll_action_id = paa.payroll_action_id
577 and ppa.effective_date between pet.effective_start_date and pet.effective_end_date
578 and ppa.effective_date between piv.effective_start_date and piv.effective_end_date ;
579
580 /*To fetch PKG balance feed for employee not on pension basis */
581 CURSOR fetch_pkg_balances( p_asgn_action_id pay_assignment_actions.assignment_action_id%type) IS
582 select irp5.code,
583 irp5.full_balance_name bal_name,
584 irp5.balance_type_id bal_type_id,
585 trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0)))) value
586 FROM pay_za_irp5_bal_codes irp5,
587 ff_archive_items arc,
588 ff_database_items dbi,
589 per_assignment_extra_info paei,
590 pay_assignment_actions paa
591 WHERE dbi.user_name in
592 (
593 'A_ANNUAL_ASSET_PURCHASED_AT_REDUCED_VALUE_PKG_ASG_TAX_YTD',
594 'A_ASSET_PURCHASED_AT_REDUCED_VALUE_PKG_ASG_TAX_YTD',
595 'A_USE_OF_MOTOR_VEHICLE_PKG_ASG_TAX_YTD',
596 'A_RIGHT_OF_USE_OF_ASSET_PKG_ASG_TAX_YTD',
597 'A_MEALS_REFRESHMENTS_AND_VOUCHERS_PKG_ASG_TAX_YTD',
598 'A_FREE_OR_CHEAP_ACCOMMODATION_PKG_ASG_TAX_YTD',
599 'A_FREE_OR_CHEAP_SERVICES_PKG_ASG_TAX_YTD',
600 'A_LOW_OR_INTEREST_FREE_LOANS_PKG_ASG_TAX_YTD',
601 'A_ANNUAL_PAYMENT_OF_EMPLOYEE_DEBT_PKG_ASG_TAX_YTD',
602 'A_PAYMENT_OF_EMPLOYEE_DEBT_PKG_ASG_TAX_YTD',
603 'A_ANNUAL_BURSARIES_AND_SCHOLARSHIPS_PKG_ASG_TAX_YTD',
604 'A_BURSARIES_AND_SCHOLARSHIPS_PKG_ASG_TAX_YTD',
605 'A_MEDICAL_AID_PAID_ON_BEHALF_OF_EMPLOYEE_PKG_ASG_TAX_YTD',
606 'A_MED_COSTS_PD_BY_ER_IRO_EE_FAMILY_PKG_ASG_TAX_YTD',
607 'A_ANNUAL_MED_COSTS_PD_BY_ER_IRO_EE_FAMILY_PKG_ASG_TAX_YTD',
608 'A_MED_COSTS_PD_BY_ER_IRO_OTHER_PKG_ASG_TAX_YTD',
609 'A_ANNUAL_MED_COSTS_PD_BY_ER_IRO_OTHER_PKG_ASG_TAX_YTD',
610 'A_TAXABLE_INCOME_PKG_ASG_TAX_YTD',
611 'A_TAXABLE_PENSION_PKG_ASG_TAX_YTD',
612 'A_ANNUAL_BONUS_PKG_ASG_TAX_YTD',
613 'A_TAXABLE_ANNUAL_PAYMENT_PKG_ASG_TAX_YTD',
614 'A_ANNUAL_COMMISSION_PKG_ASG_TAX_YTD',
615 'A_COMMISSION_PKG_ASG_TAX_YTD',
616 'A_ANNUAL_OVERTIME_PKG_ASG_TAX_YTD',
617 'A_OVERTIME_PKG_ASG_TAX_YTD',
618 'A_ANNUITY_FROM_RETIREMENT_FUND_PKG_ASG_TAX_YTD',
619 'A_PURCHASED_ANNUITY_TAXABLE_PKG_ASG_TAX_YTD',
620 'A_ANNUAL_RESTRAINT_OF_TRADE_PKG_ASG_TAX_YTD',
621 'A_RESTRAINT_OF_TRADE_PKG_ASG_TAX_YTD',
622 'A_ANNUAL_INDEPENDENT_CONTRACTOR_PAYMENTS_PKG_ASG_TAX_YTD',
623 'A_INDEPENDENT_CONTRACTOR_PAYMENTS_PKG_ASG_TAX_YTD',
624 'A_ANNUAL_LABOUR_BROKER_PAYMENTS_PKG_ASG_TAX_YTD',
625 'A_LABOUR_BROKER_PAYMENTS_PKG_ASG_TAX_YTD',
626 'A_TRAVEL_ALLOWANCE_PKG_ASG_TAX_YTD',
627 'A_TAXABLE_REIMBURSIVE_TRAVEL_PKG_ASG_TAX_YTD',
628 'A_TAXABLE_SUBSISTENCE_PKG_ASG_TAX_YTD',
629 'A_ENTERTAINMENT_ALLOWANCE_PKG_ASG_TAX_YTD',
630 'A_PUBLIC_OFFICE_ALLOWANCE_PKG_ASG_TAX_YTD',
631 'A_TOOL_ALLOWANCE_PKG_ASG_TAX_YTD',
632 'A_COMPUTER_ALLOWANCE_PKG_ASG_TAX_YTD',
633 'A_TELEPHONE_ALLOWANCE_PKG_ASG_TAX_YTD',
634 'A_OTHER_TAXABLE_ALLOWANCE_PKG_ASG_TAX_YTD',
635 'A_TAXABLE_SUBSISTENCE_ALLOWANCE_FOREIGN_TRAVEL_PKG_ASG_TAX_YTD',
636 'A_EE_BROADBASED_SHARE_PLAN_PKG_ASG_TAX_YTD',
637 'A_OTHER_LUMP_SUM_TAXED_AS_ANNUAL_PAYMENT_PKG_ASG_TAX_YTD',
638 'A_MEDICAL_AID_PAID_ON_BEHALF_OF_EMPLOYEE_PKG_ASG_TAX_YTD',
639 'A_MED_COSTS_DMD_PD_BY_EE_EE_FAMILY_PKG_ASG_TAX_YTD',
640 'A_ANNUAL_MED_COSTS_DMD_PD_BY_EE_EE_FAMILY_PKG_ASG_TAX_YTD',
644 AND irp5.balance_sequence = 1
641 'A_MED_COSTS_DMD_PD_BY_EE_OTHER_PKG_ASG_TAX_YTD',
642 'A_ANNUAL_MED_COSTS_DMD_PD_BY_EE_OTHER_PKG_ASG_TAX_YTD'
643 )
645 AND irp5.user_name = dbi.user_name
646 AND dbi.user_entity_id = arc.user_entity_id
647 AND paei.assignment_id = paa.assignment_id
648 AND arc.context1 = p_asgn_action_id
649 AND arc.context1 = paa.assignment_action_id
650 AND paei.AEI_INFORMATION8 <> '1' -- 'Pension Basis: Fixed Percentage of Specific Income
651 AND paei.information_type = 'ZA_SPECIFIC_INFO'
652 AND pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0)) <> '0';
653
654 /*Fetch elements feeding to PKG classification */
655 CURSOR fetch_pkg_ele( p_asgn_action_id pay_assignment_actions.assignment_action_id%type, p_bal_typ_id pay_balance_types.balance_type_id%type) IS
656 SELECT ELEM.element_name element_name,
657 sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(TARGET.RESULT_VALUE,0)))))
658 from pay_balance_feeds_f FEED
659 , pay_run_result_values TARGET
660 , pay_run_results RR
661 , per_time_periods PPTP
662 , per_time_periods BPTP
663 , pay_payroll_actions PACT
664 , pay_assignment_actions ASSACT
665 , pay_payroll_actions BACT
666 , pay_assignment_actions BAL_ASSACT
667 , pay_element_types_f ELEM
668 where BAL_ASSACT.assignment_action_id = p_asgn_action_id
669 and BAL_ASSACT.payroll_action_id = BACT.payroll_action_id
670 and FEED.input_value_id = TARGET.input_value_id
671 and TARGET.run_result_id = RR.run_result_id
672 and RR.assignment_action_id = ASSACT.assignment_action_id
673 + decode(PPTP.year_number, 0, 0, 0)
674 and ASSACT.payroll_action_id = PACT.payroll_action_id
675 and PACT.effective_date between FEED.effective_start_date
676 and FEED.effective_end_date
677 and BPTP.payroll_id = BACT.payroll_id
678 and PPTP.payroll_id = PACT.payroll_id
679 and nvl(BACT.date_earned,BACT.effective_date)
680 between BPTP.start_date and BPTP.end_date
681 and PACT.date_earned between PPTP.start_date and PPTP.end_date
682 and RR.status in ('P','PA')
683 AND ELEM.element_type_id = RR.element_type_id
684 and PPTP.prd_information1 = BPTP.prd_information1
685 and ASSACT.action_sequence <= BAL_ASSACT.action_sequence
686 and ASSACT.assignment_id = BAL_ASSACT.assignment_id
687 AND feed.BALANCE_TYPE_ID = p_bal_typ_id
688 GROUP BY ELEM.element_name
689 HAVING sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(TARGET.RESULT_VALUE,0))))) <> 0;
690
691
692 TYPE med_code_tab IS TABLE OF NUMBER Index BY PLS_INTEGER;
693 med_code_t med_code_tab ;
694 retiremnt_fund_lmpsum med_code_tab;
695
696 l_empno per_all_people_f.employee_number%type;
697 l_assgno per_all_assignments_f.assignment_number%type;
698 l_tax_ytd ff_archive_items.value%TYPE ; -- to save Tax paid by employee during tax year
699 l_site ff_archive_items.value%TYPE ;
700 l_paye ff_archive_items.value%TYPE ;
701 l_msgtext varchar2(2000);
702 l_missing_clrno_flag VARCHAR2(1) ;
703 l_count NUMBER :=0;
704 l_count1 NUMBER :=0;
705
706
707 --Changes done for Bug No 6749775
708 CURSOR emp_number_cur ( asgn_ac_id pay_assignment_actions.assignment_action_id%TYPE) IS
709 SELECT per.employee_number empno, asgn2.assignment_number assgno
710 FROM pay_assignment_actions paa,
711 per_all_assignments_f asgn2,
712 per_all_people_f per,
713 pay_payroll_actions ppa
714 WHERE paa.assignment_action_id = asgn_ac_id
718 AND asgn2.effective_start_date =
715 AND ppa.payroll_action_id = paa.payroll_action_id
716 AND asgn2.assignment_id = paa.assignment_id
717 AND per.person_id = asgn2.person_id
719 ( select max(paf2.effective_start_date)
720 from per_assignments_f paf2
721 where paf2.effective_start_date <= ppa.effective_date
722 and paf2.assignment_id = asgn2.assignment_id
723 )
724 AND per.effective_start_date =
725 ( select max(per2.effective_start_date)
726 from per_all_people_f per2
727 where per2.effective_start_date <= ppa.effective_date
728 and per2.person_id = per.person_id
729 );
730 --End changes for Bug No 6749775
731
732 /* Cursor to check sanity of 3915 and 4115 codes */
733 CURSOR chk_rtrmnt_fnd_cur ( p_asgn_action_id pay_assignment_actions.assignment_action_id%TYPE) IS
734 SELECT irp5.code, sum(trunc(to_number(pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))))) value
735 FROM ff_archive_items arc,
736 ff_database_items dbi,
737 pay_za_irp5_bal_codes irp5
738 WHERE arc.user_entity_id = dbi.user_entity_id
739 and irp5.user_name = dbi.user_name
740 and arc.context1 in (p_asgn_action_id)
741 and code in (3915,4115)
742 GROUP BY irp5.code ;
743
744 begin
745 retcode := 0;
746 -- hr_utility.trace_on(null,'ZATYEVL');
747 FND_FILE.PUT_LINE(FND_FILE.LOG,'In validate_tye_data');
748 FND_FILE.PUT_LINE(FND_FILE.LOG,'p_payroll_action_id :' || p_payroll_action_id);
749 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Inside validate_tye_data');
750
751 /*Loop through all Assignments for given payroll_action_id*/
752 FOR asgn IN asgn_for_payroll_action_cur
753 LOOP
754 l_count:=0;
755 l_count1:=0;
756 /* Fetch Employee_number */
757 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Action Id : ' || asgn.assignment_action_id);
758 -- FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
759 -- FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
760 FOR emp_num IN emp_number_cur(asgn.assignment_action_id)
761 LOOP
762 l_empno := emp_num.empno ;
763 l_assgno:= emp_num.assgno;
764 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
765 END LOOP;
766
767 -- Rule 1) If an employee has paid any Tax during the current tax year,
768 -- they must have a value in the SITE and/or PAYE balance (SITE_ASG_TAX_YTD or PAYE_ASG_TAX_YTD)
769 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Rule 1) If Employee has paid tax during current tax year, he should have SITE/PAYE split');
770 select pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))
771 into l_tax_ytd
772 from ff_archive_items arc,
773 ff_database_items dbi
774 where dbi.user_name = 'A_TAX_ASG_TAX_YTD'
775 and arc.user_entity_id = dbi.user_entity_id
776 and arc.context1 = asgn.assignment_action_id;
777
778 IF l_tax_ytd > 0 THEN
779 select pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))
780 into l_site
781 from ff_archive_items arc,
782 ff_database_items dbi
783 where dbi.user_name = 'A_SITE_ASG_TAX_YTD'
784 and arc.user_entity_id = dbi.user_entity_id
785 and arc.context1 = asgn.assignment_action_id;
786
787 select pay_za_eoy_val.decimal_character_conversion(nvl(arc.value,0))
788 into l_paye
789 from ff_archive_items arc,
790 ff_database_items dbi
791 where dbi.user_name = 'A_PAYE_ASG_TAX_YTD'
792 and arc.user_entity_id = dbi.user_entity_id
793 and arc.context1 = asgn.assignment_action_id;
794
795 IF l_site = 0 AND l_paye = 0 THEN
796 l_count:=1;
797 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
798 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
799 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
800 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
801 fnd_message.set_name('PAY', 'PY_ZA_NO_SITE_PAYE_SPLIT');
802 fnd_message.set_token('EMPNO',l_empno);
803 l_msgtext := fnd_message.get('Y');
804 FND_FILE.PUT_LINE(FND_FILE.LOG, ' Tax Amount : '||l_tax_ytd) ;
805 FND_FILE.PUT_LINE(FND_FILE.LOG, ' SITE balance : '||l_site) ;
806 FND_FILE.PUT_LINE(FND_FILE.LOG, ' PAYE balance : '||l_paye) ;
807 FND_FILE.PUT_LINE(FND_FILE.LOG, l_msgtext);
808 END IF ;
809 END IF ;
810
811 -- Rule 2) Check for Income Balances which may not contain negative amounts
812 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Rule 2) Check for Income Balances which may not contain negative amounts');
813 FOR neg_amt_check IN negative_amt_check_cur(asgn.assignment_action_id)
814 LOOP
815 if l_count <>1 then
816 l_count:=1;
817 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
818 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
819 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
820 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
824 fnd_message.set_token('SARScode',neg_amt_check.code);
821 end if;
822 fnd_message.set_name('PAY', 'PY_ZA_NEG_BAL_NOT_ALWD');
823 fnd_message.set_token('EMPno',l_empno);
825 l_msgtext := fnd_message.get('Y');
826 FND_FILE.PUT_LINE(FND_FILE.LOG, l_msgtext);
827 END LOOP ;
828
829 -- Rule 3) Check Lumpsum balances which may not contain negative amounts
830 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Rule 3) Check Lumpsum balances which may not contain negative amounts');
831 FOR lmpsum_bal IN fetch_lmpsm_bal_cur(asgn.assignment_action_id)
832 LOOP
833 if l_count <>1 then
834 l_count:=1;
835 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
836 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
837 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
838 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
839 end if;
840 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Tax Directive Number ' || g_default_dirno);
841 fnd_message.set_name('PAY', 'PY_ZA_NEG_BAL_NOT_ALWD');
842 fnd_message.set_token('EMPno',l_empno);
843 fnd_message.set_token('SARScode',lmpsum_bal.code);
844 l_msgtext := fnd_message.get('Y');
845 FND_FILE.PUT_LINE(FND_FILE.LOG, l_msgtext);
846 END LOOP ;
847 ---- Check for the Lump Sum Balances with Directive Number Other than the Defoult directive number
848
849 FOR rec_lmpsm_crt_bal IN get_lmpsm_crt_bal(asgn.assignment_action_id)
850 loop
851 if l_count <>1 then
852 l_count:=1;
853 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
854 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
855 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
856 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
857 end if;
858 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Tax Directive Number ' || rec_lmpsm_crt_bal.Tax_Directive_Number);
859 fnd_message.set_name('PAY', 'PY_ZA_NEG_BAL_NOT_ALWD');
860 fnd_message.set_token('EMPno',l_empno);
861 fnd_message.set_token('SARScode',rec_lmpsm_crt_bal.code);
862 l_msgtext := fnd_message.get('Y');
863 FND_FILE.PUT_LINE(FND_FILE.LOG, l_msgtext);
864
865
866 END loop;
867 -- End check for Lump Sum Balances with Directive Number Other than the Defoult directive number
868 -- Rule 4) Check for Deduction Balances
869 -- a) may not contain negative amounts
870 -- b) Clearance number must be entered
871 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Rule 4) Check for Deduction Balances ') ;
872 l_missing_clrno_flag := 'N' ;
873 FOR ded_bal IN fetch_deduction_bal_cur(asgn.assignment_action_id)
874 LOOP
875 IF ded_bal.value <0 THEN
876 if l_count <>1 then
877 l_count:=1;
878 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
879 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
880 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
881 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
882 end if;
883 fnd_message.set_name('PAY', 'PY_ZA_NEG_BAL_NOT_ALWD');
884 fnd_message.set_token('EMPno',l_empno);
885 fnd_message.set_token('SARScode',ded_bal.code);
886 l_msgtext := fnd_message.get('Y');
887 FND_FILE.PUT_LINE(FND_FILE.LOG, l_msgtext);
888 END IF ;
889 IF ded_bal.clearance_num = g_default_clrno THEN
890 l_missing_clrno_flag := 'Y' ;
891 END IF ;
892 END LOOP ;
893
894 -- If clearance number is g_default_clrno,
895 -- find out the element(s) whose run_result_values contain defaults (99999999999) for 'Clearance' Input value
896 IF l_missing_clrno_flag = 'Y' THEN
897 /*Loop through all assignment_action_id for payroll run for given assignment*/
898 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Clearance Number is default ') ;
899 FOR paa IN payroll_asgn_ac_id_cur(asgn.assignment_id, p_tax_yr_start_date, p_tax_yr_end_date)
900 LOOP
901 /*Loop through all element names for which the employee has missing clearance numbers*/
902 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'For payroll assignment_action id : '||paa.assignment_action_id) ;
903 FOR elem_names IN elem_names_cur (paa.assignment_action_id)
904 LOOP
905 if l_count <>1 then
906 l_count:=1;
907 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
908 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
909 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
910 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
911 end if;
912 fnd_message.set_name('PAY', 'PA_ZA_ENTER_CLEARANCE_NUM');
913 fnd_message.set_token('EMPno',l_empno);
914 fnd_message.set_token('ELEMENTname',elem_names.element_name);
915 l_msgtext := fnd_message.get('Y');
916 FND_FILE.PUT_LINE(FND_FILE.LOG, l_msgtext);
917 END LOOP ;
918 END LOOP ;
919 END IF;
920
921 /* Loop through all the PKG balances fed through elements for employee not on PKG structure
922 For Bug 7264311 */
923 FOR pkg_bal IN fetch_pkg_balances(asgn.assignment_action_id)
924 LOOP
925 if l_count <>1 then
926 l_count:=1;
927 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
928 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
929 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
930 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
931 end if;
932
933 IF l_count1 <>1 then
934 fnd_message.set_name('PAY', 'PY_ZA_PKG_BAL_NT_ALLOW');
935 fnd_message.set_token('EMPno',l_empno);
936 l_msgtext := fnd_message.get('Y');
937 FND_FILE.PUT_LINE (FND_FILE.LOG,l_msgtext);
938 l_count1:=1;
939 END IF;
940
941 FOR pkg_ele IN fetch_pkg_ele(asgn.assignment_action_id, pkg_bal.bal_type_id)
942 LOOP
943 fnd_message.set_name('PAY', 'PY_ZA_ELE_FEED_PKG_BAL');
944 fnd_message.set_token('ELEMENTname',pkg_ele.element_name);
945 fnd_message.set_token('BALANCEname',pkg_bal.bal_name);
946 l_msgtext := fnd_message.get('Y');
947 FND_FILE.PUT_LINE (FND_FILE.LOG,l_msgtext);
948 END LOOP;
949
950 END LOOP;
951
952 -- Rule 5) Cross validation of Medical Aid Codes
953 -- initialize table of medical aid codes
954 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Rule 5) Cross validation of Medical Aid Codes');
955 med_code_t(3810) := 0 ;
956 med_code_t(3813) := 0 ;
957 med_code_t(4005) := 0 ;
958 med_code_t(4024) := 0 ;
959 med_code_t(4025) := 0 ;
960 med_code_t(4485) := 0 ;
961 med_code_t(4486) := 0 ;
962 FOR med_code_bal IN fetch_med_code_bal_cur(asgn.assignment_action_id)
963 LOOP
964 med_code_t(med_code_bal.code) := med_code_bal.value ;
965 END LOOP ;
966
967 -- 5a) Code 3813 must be equal to the sum of Codes 4024 and 4485
968 IF med_code_t(3813) <> (med_code_t(4024) + med_code_t(4485)) THEN
969 if l_count <>1 then
970 l_count:=1;
971 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
972 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
973 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
974 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
975 end if;
976 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Code 3813 must be equal to the sum of Codes 4024 and 4485') ;
977 END IF ;
978 -- 5b) Code 4005 must be greater than zero if there is a value in 3810 or 4025
979 IF (med_code_t(3810) <>0) OR (med_code_t(4025) <>0) THEN
980 IF med_code_t(4005) <=0 THEN
981 if l_count <>1 then
982 l_count:=1;
983 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
984 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
985 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
986 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
987 end if;
988 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Code 4005 must be greater than zero if Code 3810 or 4025 has a value') ;
989 END IF;
990 END IF ;
991 -- 5c) Code 4486 must be greater than zero if there is a value in 4025
992 IF med_code_t(4025) <>0 THEN
993 IF med_code_t(4486) <= 0 THEN
994 if l_count <>1 then
995 l_count:=1;
996 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
997 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
998 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
999 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
1000 end if;
1001 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Code 4486 must be greater than zero if Code 4025 has a value') ;
1002 END IF ;
1003 END IF ;
1004 -- 5d) Code 4025 may not be greater than 4005
1005 IF med_code_t(4025) > med_code_t(4005) THEN
1006 if l_count <>1 then
1007 l_count:=1;
1008 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
1009 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
1010 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee Number : ' || l_empno);
1011 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Assignment Number : ' || l_assgno);
1012 end if;
1013 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Code 4025 may not be greater than Code 4005') ;
1014 END IF ;
1015
1016 -- Retirement Fund Lumpsum PAYE balance (4115) should not be present if
1017 -- Retirement Fund Lumpsum (3915) itself is not present
1018 retiremnt_fund_lmpsum(3915) := 0 ;
1019 retiremnt_fund_lmpsum(4115) := 0 ;
1020 -- FND_FILE.PUT_LINE(FND_FILE.LOG, 'Rule 6) Cross Validation of codes 3915 and 4115 ') ;
1021 FOR chk_rtrmnt_fnd IN chk_rtrmnt_fnd_cur(asgn.assignment_action_id)
1022 LOOP
1023 retiremnt_fund_lmpsum(chk_rtrmnt_fnd.code) := chk_rtrmnt_fnd.value ;
1024 END LOOP;
1025
1026 IF retiremnt_fund_lmpsum(4115)<> 0 and retiremnt_fund_lmpsum(3915) = 0 THEN
1027 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Code 4115 must not be present if Code 3915 is not present') ;
1028 END IF ;
1029
1030 END LOOP ; -- End of assignment Loop
1031 FND_FILE.PUT_LINE(FND_FILE.LOG,'End of log file');
1032 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
1033 -- hr_utility.trace_off;
1034 EXCEPTION
1035 WHEN OTHERS then
1036 errbuf := substr(SQLERRM,1,255);
1037 retcode := sqlcode;
1038 end VALIDATE_TYE_DATA;
1039
1040 end PAY_ZA_EOY_VAL;