1 package body ota_elig_profile_util as
2 /* $Header: oteligprfl.pkb 120.4.12020000.5 2013/02/08 04:17:48 jaysridh ship $ */
3
4 g_package varchar2(33) := 'ota_elig_profile_util'; -- Global package name
5
6 CURSOR csr_get_learner(
7 p_per_bg_grp_prof_val number,
8 p_ota_global_bg_prof_val number
9 ) IS
10 SELECT paf.person_id
11 , paf.assignment_id
12 , paf.assignment_type
13 , paf.business_group_id
14 FROM per_people_f ppf
15 ,per_assignments_f paf
16 ,per_person_type_usages_f ptu
17 ,per_person_types pts
18 ,per_business_groups pbg
19 WHERE
20 ppf.person_id = paf.person_id
21 AND ((pts.system_person_type IN ('EMP','CWK') AND paf.primary_flag = 'Y') OR (paf.assignment_type = 'A' AND pts.system_person_type ='APL'))
22 AND trunc(sysdate) BETWEEN ppf.effective_start_date AND ppf.effective_end_date
23 AND trunc(sysdate) BETWEEN paf.effective_start_date AND paf.effective_end_date --added
24 AND trunc(sysdate) BETWEEN trunc(ptu.effective_start_date) AND trunc(ptu.effective_end_date) --added
25 AND pts.person_type_id = ptu.person_type_id
26 AND ptu.person_id = ppf.person_id
27 AND pts.system_person_type IN ('EMP', 'CWK', 'APL')
28 AND paf.assignment_type IN ('A','E','C')
29 AND (p_ota_global_bg_prof_val IS NOT NULL or pbg.business_group_id = p_per_bg_grp_prof_val)
30 -- AND pbg.business_group_id = p_per_bg_grp_prof_val
31 AND paf.business_group_id = pbg.business_group_id
32 AND
33 ((pts.system_person_type = 'APL'
34 AND NOT EXISTS (SELECT person_id
35 FROM per_person_type_usages_f ptf,
36 per_person_types ptp WHERE trunc(sysdate) BETWEEN trunc(ptf.effective_start_date) AND trunc(ptf.effective_end_date)
37 AND ptf.person_type_id = ptp.person_type_id
38 AND ptp.system_person_type IN ('EMP', 'CWK')
39 AND ptf.person_id = ppf.PERSON_ID)
40 )
41 OR pts.system_person_type IN ('EMP', 'CWK'))
42 order by paf.person_id;
43
44 function check_processing_status(p_user_group_id in number,p_eligibility_profile_id in number default null )
45 return varchar2 is
46
47 cursor check_status_for_elig_prf is
48 select
49 nvl(processing_status,'A') processing_status_flag
50 from
51 ota_user_group_elements
52 where
53 user_group_id = p_user_group_id
54 --and trunc(sysdate) between start_date_active and nvl(end_date_active,trunc(sysdate+1))
55 --Adding above clause will not display members for end dated user groups
56 and elig_prfl_id = p_eligibility_profile_id
57 and person_id is null;
58
59 cursor check_status_for_ug is
60 select
61 processing_status
62 from
63 ota_user_group_elements
64 where
65 user_group_id = p_user_group_id
66 --and trunc(sysdate) between start_date_active and nvl(end_date_active,trunc(sysdate+1))
67 --Adding above clause will not display members for end dated user groups
68 and elig_prfl_id is not null
69 and person_id is null
70 and nvl(processing_status,'A') <> 'A';
71
72
73 l_processing_status_flag varchar2(1);
74
75 begin
76 if p_eligibility_profile_id is not null then
77 open check_status_for_elig_prf;
78 fetch check_status_for_elig_prf into l_processing_status_flag;
79
80 if check_status_for_elig_prf%NOTFOUND then
81 l_processing_status_flag:='E';--some error,so skip processing
82 end if;
83 close check_status_for_elig_prf;
84
85 else
86 open check_status_for_ug;
87 fetch check_status_for_ug into l_processing_status_flag;
88 if check_status_for_ug%NOTFOUND then
89 l_processing_status_flag:='A';
90 end if;
91 close check_status_for_ug;
92
93
94 end if;
95
96 return l_processing_status_flag;
97
98 end check_processing_status;
99
100 function get_learner_group_name(p_ug_id in number)
101 return varchar2 is
102
103 cursor get_learner_group_name is
104 select
105 user_group_name
106 from ota_user_groups_tl
107 where
108 user_group_id = p_ug_id
109 and language = userenv('LANG');
110
111 l_lrnr_group_name ota_user_groups_tl.user_group_name%type;
112
113 begin
114
115 open get_learner_group_name;
116 fetch get_learner_group_name into l_lrnr_group_name;
117 close get_learner_group_name;
118
119 return l_lrnr_group_name;
120
121 end get_learner_group_name;
122
123 function is_learner_in_resolved_ug_data(p_user_group_id in number,
124 p_person_id in number,
125 p_processing_status in varchar2 default null)
126 return varchar2 is
127
128 cursor check_resolved_data is
129 select person_id
130 from
131 ota_user_group_elements
132 where
133 user_group_id = p_user_group_id and person_id= p_person_id
134 and processing_status = nvl(p_processing_status,processing_status)
135 and elig_prfl_id is not null
136 and person_id is not null;
137
138 l_data_exists varchar2(1) := 'N';
139 l_person_id ota_user_group_elements.person_id%type;
140
141 begin
142 open check_resolved_data ;
143 fetch check_resolved_data into l_person_id;
144 if check_resolved_data %NOTFOUND then
145 close check_resolved_data;
146 else
147 l_data_exists := 'Y';
148 close check_resolved_data;
149 end if;
150
151 return l_data_exists;
152 end is_learner_in_resolved_ug_data;
153
154
155 function get_elig_object_id(p_user_group_id in number)
156 return number is
157
158 cursor get_elig_obj_id is
159 select elig_obj_id
160 from ben_elig_obj_f
161 where
162 TABLE_NAME = 'OTA_USER_GROUPS_B'
163 and COLUMN_NAME='USER_GROUP_ID'
164 and COLUMN_VALUE= p_user_group_id
165 and trunc(sysdate) between effective_start_date and effective_end_date;
166
167 l_elig_obj_id number :=null;
168 begin
169
170 open get_elig_obj_id;
171 fetch get_elig_obj_id into l_elig_obj_id;
172 close get_elig_obj_id;
173
174 return l_elig_obj_id;
175
176 end get_elig_object_id;
177
178
179 Procedure process_eligible_lrnr_record(p_person_id per_all_assignments_f.person_id%type,
180 p_user_group_id ota_user_group_elements.user_group_id%type,
181 p_eligibility_profile_id ota_user_group_elements.elig_prfl_id%type,
182 p_business_group_id ota_user_group_elements.business_group_id%type,
183 p_enable_logging in varchar2 default 'N') IS
184
185 l_object_version_number number :=1;
186 begin
187
188 if is_learner_in_resolved_ug_data(p_user_group_id, p_person_id)= 'Y' then
189 if p_enable_logging = 'Y' then
190 FND_FILE.PUT_LINE(FND_FILE.LOG,'Record exist for person_id : ' ||TO_CHAR(p_person_id) ||' user_group_id : ' ||TO_CHAR(p_user_group_id) ||' so update.Eligibility profile id is : '||TO_CHAR(p_eligibility_profile_id));
191 end if;
192
193 update ota_user_group_elements set processing_status= 'A' ,elig_prfl_id = p_eligibility_profile_id
194 where
195 user_group_id= p_user_group_id and
196 person_id = p_person_id and
197 elig_prfl_id is not null;
198
199
200
201 else
202 if p_enable_logging = 'Y' then
203 FND_FILE.PUT_LINE(FND_FILE.LOG,'Record does not exist for person_id : ' ||TO_CHAR(p_person_id) ||' user_group_id : ' ||TO_CHAR(p_user_group_id) ||' so create.Eligibility profile id is : '||TO_CHAR(p_eligibility_profile_id));
204 end if;
205
206 insert into ota_user_group_elements(
207 USER_GROUP_ELEMENT_ID,
208 USER_GROUP_ID,
209 BUSINESS_GROUP_ID,
210 PERSON_ID,
211 OBJECT_VERSION_NUMBER,
212 CREATION_DATE,
213 ELIG_PRFL_ID,
214 processing_status)
215 VALUES(
216 ota_user_group_elements_s.nextval,
217 p_user_group_id,
218 p_business_group_id,
219 p_person_id,
220 l_object_version_number,
221 sysdate,
222 p_eligibility_profile_id,
223 'A');
224
225 end if;
226 end process_eligible_lrnr_record;
227
228
229
230
231 procedure resolve_eligibility_profile(errbuf out nocopy varchar2,
232 retcode out nocopy varchar2,
233 p_learner_group_id in number,
234 p_elig_prof_id in number,
235 p_enable_logging in varchar2 default 'N') is
236
237 cursor get_elig_prof_details(p_elig_prof_id in number) is
238 select
239 eligy_prfl_id,
240 name,
241 asmt_to_use_cd,
242 business_group_id
243 from ben_eligy_prfl_f
244 where
245 eligy_prfl_id = p_elig_prof_id
246 and trunc(sysdate) between effective_start_date and effective_end_date
247 and stat_cd in ('A','P');
248
249
250
251 l_elig_prof_id ben_eligy_prfl_f.eligy_prfl_id%type;
252 l_elig_prof_name ben_eligy_prfl_f.name%type;
253 l_asmt_to_use_cd ben_eligy_prfl_f.asmt_to_use_cd%type;
254 l_elig_pro_bg_id ben_eligy_prfl_f.business_group_id%type;
255 l_sql_stmnt varchar2(4000);
256 l_allow_contingent_wrk varchar2(1) := 'Y';
257 l_learner_group_name ota_user_groups_tl.user_group_name%type;
258 l_numberof_records_processed number:=0;
259 assignment_whereclause varchar2(100);
260 l_elig_obj_id number;
261 l_counter number:=0;
262 l_learner_group_element_id ota_user_group_elements.user_group_element_id%type;
263
264 TYPE learner_rec IS RECORD(
265 person_id per_assignments_f.person_id%type,
266 assignment_id per_assignments_f.assignment_id%type,
267 assignment_type per_assignments_f.assignment_type%type,
268 business_group_id per_assignments_f.business_group_id%type
269 );
270
271 lrnr_rec learner_rec;
272
273 TYPE ug_rec IS RECORD(
274 user_group_id ota_user_group_elements.user_group_id%type,
275 elig_prfl_id ota_user_group_elements.elig_prfl_id%type,
276 user_group_element_id ota_user_group_elements.user_group_element_id%type,
277 business_group_id ota_user_group_elements.business_group_id%type
278 );
279
280 user_group_rec ug_rec;
281
282 TYPE learner_assign_details IS REF CURSOR;
283 csr_get_lrnr_in_assign learner_assign_details;
284 csr_get_ug_to_be_processed learner_assign_details;
285
286 ug_ep_whereclause varchar2(200);
287 get_ug_to_be_processed varchar2(4000);
288 l_eligprof_tab ben_evaluate_elig_profiles.proftab;
289 l_score_tab ben_evaluate_elig_profiles.scoreTab;
290 begin
291
292 if p_learner_group_id is not null and p_elig_prof_id is not null then
293 ug_ep_whereclause := 'user_group_id = ' ||TO_CHAR(p_learner_group_id)
294 || 'and elig_prfl_id = '||TO_CHAR(p_elig_prof_id);
295 elsif p_elig_prof_id is null and p_learner_group_id is not null then
296 ug_ep_whereclause := 'user_group_id = ' ||TO_CHAR(p_learner_group_id) ;
297 elsif p_elig_prof_id is not null and p_learner_group_id is null then
298 ug_ep_whereclause := 'user_group_id in
299 (select user_group_id from ota_user_group_elements
300 where elig_prfl_id ='|| TO_CHAR(p_elig_prof_id)|| ')';
301 else
302 ug_ep_whereclause := '1=1';
303
304 end if;
305
306 get_ug_to_be_processed := 'select * from
307 (select
308 ug.user_group_id,
309 uge.elig_prfl_id,
310 uge.user_group_element_id,
311 uge.business_group_id
312 from
313 ota_user_groups_b ug,
314 ota_user_group_elements uge
315 where
316 ug.user_group_id = uge.user_group_id
317 and trunc(sysdate) between trunc(ug.start_date_active) and nvl(ug.end_date_active,trunc(sysdate+1))
318 and uge.elig_prfl_id is not null
319 and uge.person_id is null
320 and nvl(uge.processing_status,''A'') <> ''P''
321 and ug.business_group_id = ota_general.get_business_group_id) QRSLT WHERE '|| ug_ep_whereclause ;
322
323
324 if p_enable_logging = 'Y' then
325 FND_FILE.PUT_LINE(FND_FILE.LOG,'OTA_HR_GLOBAL_BUSINESS_GROUP_ID :' ||fnd_profile.value('OTA_HR_GLOBAL_BUSINESS_GROUP_ID'));
326 FND_FILE.PUT_LINE(FND_FILE.LOG,'PER_BUSINESS_GROUP_ID :' ||fnd_profile.value('PER_BUSINESS_GROUP_ID'));
327 FND_FILE.PUT_LINE(FND_FILE.LOG,'get_ug_to_be_processed is:'||get_ug_to_be_processed);
328
329 end if;
330
331 OPEN csr_get_ug_to_be_processed for get_ug_to_be_processed;
332 LOOP
333 FETCH csr_get_ug_to_be_processed into user_group_rec;
334 EXIT WHEN csr_get_ug_to_be_processed %NOTFOUND;
335
336 l_eligprof_tab(1).eligy_prfl_id := null;
337 l_eligprof_tab(1).mndtry_flag := 'N';
338 l_eligprof_tab(1).compute_score_flag := 'Y';
339 l_eligprof_tab(1).trk_scr_for_inelg_flag := 'N';
340 l_counter :=l_counter+1;
341
342 l_learner_group_name := get_learner_group_name(user_group_rec.user_group_id);
343
344
345 FND_FILE.PUT_LINE(FND_FILE.LOG,'Learner group being processed : '||l_learner_group_name);
346
347 if check_processing_status(user_group_rec.user_group_id, user_group_rec.elig_prfl_id) <> 'P' then
348 --This is done to avoid the learner group if its been picked/processed by some other run of this conc program
349 --i.e the user group is under processing in the mean time.
350 l_learner_group_element_id := user_group_rec.user_group_element_id;
351 update ota_user_group_elements set processing_status = 'P' --Parent record to Processing
352 where user_group_element_id = user_group_rec.user_group_element_id;
353 update ota_user_group_elements set processing_status = 'H' --Child records to history
354 where user_group_id = user_group_rec.user_group_id and elig_prfl_id =user_group_rec.elig_prfl_id and person_id is not null;
355 commit;--commit early so that other re-runs of conc programs donot pick it up
356
357 open get_elig_prof_details(user_group_rec.elig_prfl_id);
358 fetch get_elig_prof_details into l_elig_prof_id,l_elig_prof_name,l_asmt_to_use_cd,l_elig_pro_bg_id;
359 if get_elig_prof_details%NOTFOUND then
360 close get_elig_prof_details;
361 FND_FILE.PUT_LINE(FND_FILE.LOG,'Eligibility profile details not found or it is in inactive/closed status');
362 --write messages in conc program log;
363 else
364 -- row exists, so resolve ppl based on column asmt_to_use_cd and then function is_eligible.
365 --lookup name 'BEN_ASMT_TO_USE';
366 close get_elig_prof_details;
367 l_eligprof_tab(1).eligy_prfl_id := l_elig_prof_id;
368
369 l_elig_obj_id := get_elig_object_id(user_group_rec.user_group_id);
370 FND_FILE.PUT_LINE(FND_FILE.LOG,'Eligibility profile being processed :'||l_elig_prof_name);
371
372 if l_asmt_to_use_cd = 'EAO' then --(Employee Assignment only)
373 assignment_whereclause := 'assignment_type = ''E'' ';
374 elsif l_asmt_to_use_cd = 'AAO' then --(Applicant Assignment only)
375 assignment_whereclause := 'assignment_type = ''A'' ' ;
376 elsif l_asmt_to_use_cd = 'CWAO' then --(Contingent Worker Assignment only)
377 assignment_whereclause := 'assignment_type = ''C'' ';
378 elsif l_asmt_to_use_cd = 'EAAO' then --(Employee and Applicant Assignments only)
379 assignment_whereclause := 'assignment_type in (''A'',''E'')' ;
380 elsif l_asmt_to_use_cd = 'ECWA' then --(Employee and Contingent Worker only)
381 assignment_whereclause := 'assignment_type in (''A'',''C'')' ;
382 elsif l_asmt_to_use_cd = 'ANY' then --(Any Assignment Employee, Applicant and Contingent Worker)
383 assignment_whereclause := 'assignment_type in (''A'',''E'',''C'')';
384 end if;
385
386 l_sql_stmnt := 'select
387 * from(
388 select
389 person_id,
390 assignment_id,
391 assignment_type,
392 business_group_id
393 from
394 per_assignments_f
395 where
396 trunc(sysdate) between effective_start_date and effective_end_date
397 and((assignment_type in (''E'',''C'') and PRIMARY_FLAG = ''Y'') OR (assignment_type = ''A''))
398 and ((fnd_profile.value(''OTA_HR_GLOBAL_BUSINESS_GROUP_ID'') is not null and business_group_id = '||l_elig_pro_bg_id||') or (business_group_id = fnd_profile.value(''PER_BUSINESS_GROUP_ID''))))
399 QRSLT WHERE ' || assignment_whereclause;
400
401 if p_enable_logging = 'Y' then
402 FND_FILE.PUT_LINE(FND_FILE.LOG,'l_sql_stmnt is:'||l_sql_stmnt);
403 FND_FILE.PUT_LINE(FND_FILE.LOG,'l_elig_obj_id is:'|| TO_CHAR(l_elig_obj_id));
404 end if;
405
406 OPEN csr_get_lrnr_in_assign FOR l_sql_stmnt;
407
408 LOOP
409 FETCH csr_get_lrnr_in_assign into lrnr_rec;
410 EXIT WHEN csr_get_lrnr_in_assign %NOTFOUND;
411
412
413 --- Added this code to set the context .
414
415 ben_env_object.init
416 (p_business_group_id =>lrnr_rec.business_group_id,
417 p_thread_id => null,
418 p_chunk_size => null,
419 p_threads => null,
420 p_max_errors => null,
421 p_benefit_action_id => null,
422 p_effective_date=> trunc(sysdate));
423
424
425 if lrnr_rec.business_group_id = l_elig_pro_bg_id then
426
427 IF ben_evaluate_elig_profiles.eligible
428 (p_person_id => lrnr_rec.person_id,
429 p_assignment_id => lrnr_rec.assignment_id,
430 p_business_group_id => lrnr_rec.business_group_id,
431 p_eval_typ => 'E',
432 p_comp_obj_mode => false,
433 p_eligprof_tab => l_eligprof_tab,
434 p_score_tab => l_score_tab,
435 p_effective_date => trunc (sysdate)) THEN
436
437 --if ben_per_asg_elig.eligible(lrnr_rec.person_id,lrnr_rec.assignment_id,l_elig_obj_id,trunc(sysdate), lrnr_rec.business_group_id,l_allow_contingent_wrk) = 'Y' then
438
439 l_numberof_records_processed := l_numberof_records_processed +1;
440 process_eligible_lrnr_record(lrnr_rec.person_id, user_group_rec.user_group_id,
441 user_group_rec.elig_prfl_id, user_group_rec.business_group_id, p_enable_logging);
442
443 if l_numberof_records_processed = 1000 then
444 commit;--commit for every 1000 child records
445 l_numberof_records_processed :=0;
446 end if;
447 end if;
448 end if;
449
450 END LOOP;
451 CLOSE csr_get_lrnr_in_assign;
452 end if;--end if for get_elig_prof_details%NOTFOUND
453
454 update ota_user_group_elements set processing_status= 'A'
455 where user_group_element_id = user_group_rec.user_group_element_id;--set status of master record to A
456 end if ; --end if for check_processing_status
457 end loop;
458 close csr_get_ug_to_be_processed;
459
460 if l_counter = 0 then
461 FND_FILE.PUT_LINE(FND_FILE.LOG,'The given combination of learner group and eligibility profile donot exist');
462 end if;
463
464 commit;
465 exception
466 when others then
467
468 update ota_user_group_elements set processing_status= 'E' --Parent record to Error
469 where user_group_element_id =l_learner_group_element_id;
470
471 FND_FILE.PUT_LINE(FND_FILE.LOG,'Error in processing learner group '||l_learner_group_name);
472 commit;
473
474 end resolve_eligibility_profile;
475
476 procedure resolve_elig_profile_multi(errbuf out nocopy varchar2,
477 retcode out nocopy varchar2,
478 p_action_id in number default null,
479 p_chunk_size in number default 1000,
480 p_thread_count in number default 3,
481 p_learner_group_id in number,
482 p_elig_prof_id in number,
483 p_enable_logging in varchar2 default 'N') is
484
485
486 TYPE learner_rec IS RECORD(
487 person_id per_assignments_f.person_id%type,
488 assignment_id per_assignments_f.assignment_id%type,
489 assignment_type per_assignments_f.assignment_type%type,
490 business_group_id per_assignments_f.business_group_id%type
491 );
492
493 lrnr_rec learner_rec;
494
495 l_sql_stmnt varchar2(4000);
496 l_counter number:=0;
497 l_per_bg_grp_prof_val number:= fnd_profile.value('PER_BUSINESS_GROUP_ID');
498 l_ota_global_bg_prof_val number:= fnd_profile.value('OTA_HR_GLOBAL_BUSINESS_GROUP_ID');
499
500 l_object_version_number Number(15);
501 l_request_id number;
502 l_action_id number(15);
503 l_person_action_id number(15);
504 l_range_id number(15);
505 l_num_range number := 0;
506 l_threads number := p_thread_count;
507 l_chunk_num number := 1;
508 l_person_ok varchar2(1) := 'Y';
509 l_person_actn_cnt number := 0;
510 l_start_person_action_id number(15);
511 l_end_person_action_id number(15);
512 l_commit number;
513 l_num_row number := 0;
514 l_validate varchar2(1) := 'N';
515 l_pre_person_id per_assignments_f.person_id%type := -1;
516
517 ug_whereclause varchar2(200);
518
519 TYPE ug_rec IS RECORD(
520 user_group_id ota_user_group_elements.user_group_id%type,
521 elig_prfl_id ota_user_group_elements.elig_prfl_id%type,
522 user_group_element_id ota_user_group_elements.user_group_element_id%type,
523 business_group_id ota_user_group_elements.business_group_id%type
524 );
525
526 TYPE t_ug_rec IS TABLE OF ug_rec
527 INDEX BY BINARY_INTEGER;
528
529 user_elig_pro_rec t_ug_rec;
530
531 TYPE learner_assign_details IS REF CURSOR;
532 csr_get_ug_to_be_processed learner_assign_details;
533
534 get_ug_to_be_processed varchar2(4000);
535 l_pre_ug_id ota_user_group_elements.user_group_id%TYPE := -1;
536 l_general_bg number := ota_general.get_business_group_id;
537 l_proc varchar2(200) := 'resolve_eligibility_profile';
538 OTA_NO_PERSON_LG_TO_PROCESS exception;
539
540 begin
541
542 if p_enable_logging = 'Y' then
543 FND_FILE.PUT_LINE(FND_FILE.LOG,'l_per_bg_grp_prof_val:'||l_per_bg_grp_prof_val);
544 FND_FILE.PUT_LINE(FND_FILE.LOG,'l_ota_global_bg_prof_val:'||l_ota_global_bg_prof_val);
545 FND_FILE.PUT_LINE(FND_FILE.LOG,'Entering :resolve_eligibility_profile');
546 FND_FILE.PUT_LINE(FND_FILE.LOG,'p_action_id:'||p_action_id);
547 FND_FILE.PUT_LINE(FND_FILE.LOG,'p_learner_group_id:'||p_learner_group_id);
548 FND_FILE.PUT_LINE(FND_FILE.LOG,'p_elig_prof_id:'||p_elig_prof_id);
549 FND_FILE.PUT_LINE(FND_FILE.LOG,'p_enable_logging:'||p_enable_logging);
550 end if;
551
552 If p_action_id is null then
553 --
554 if p_enable_logging = 'Y' then
555 FND_FILE.PUT_LINE(FND_FILE.LOG,'p_action_id is null');
556 end if;
557
558 ota_batch_action_api.create_bulk_enr_request
559 (p_bulk_enr_request_id => l_action_id
560 ,p_requestor_id => fnd_global.conc_login_id
561 ,p_object_type => 'EP'
562 ,p_business_group_id => ota_general.get_business_group_id
563 ,p_conc_program_request_id => fnd_global.conc_request_id);
564
565 if p_enable_logging = 'Y' then
566 FND_FILE.PUT_LINE(FND_FILE.LOG,'l_action_id:'||l_action_id);
567 end if;
568
569 if p_learner_group_id is not null and p_elig_prof_id is not null then
570
571 ug_whereclause := 'user_group_id = ' ||TO_CHAR(p_learner_group_id)
572 || ' and elig_prfl_id = '||TO_CHAR(p_elig_prof_id);
573
574 elsif p_elig_prof_id is null and p_learner_group_id is not null then
575
576 ug_whereclause := 'user_group_id = ' ||TO_CHAR(p_learner_group_id) ;
577
578 elsif p_elig_prof_id is not null and p_learner_group_id is null then
579
580 ug_whereclause := 'user_group_id in
581 (select user_group_id from ota_user_group_elements
582 where elig_prfl_id ='|| TO_CHAR(p_elig_prof_id)|| ')';
583 else
584
585 ug_whereclause := '1=1';
586 end if;
587
588 get_ug_to_be_processed := 'select * from
589 (select
590 ug.user_group_id,
591 uge.elig_prfl_id,
592 uge.user_group_element_id,
593 uge.business_group_id
594 from
595 ota_user_groups_b ug,
596 ota_user_group_elements uge
597 where
598 ug.user_group_id = uge.user_group_id
599 and trunc(sysdate) between trunc(ug.start_date_active) and nvl(ug.end_date_active,trunc(sysdate+1))
600 and uge.elig_prfl_id is not null
601 and uge.person_id is null
602 and nvl(uge.processing_status,''A'') in (''A'',''E'')
603 and ug.business_group_id = ota_general.get_business_group_id) QRSLT WHERE '|| ug_whereclause ||
604 ' order by user_group_id';
605
606 OPEN csr_get_ug_to_be_processed for get_ug_to_be_processed;
607 FETCH csr_get_ug_to_be_processed BULK COLLECT into user_elig_pro_rec;
608 CLOSE csr_get_ug_to_be_processed;
609
610 if p_enable_logging = 'Y' then
611 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' get_ug_to_be_processed:'||get_ug_to_be_processed);
612 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' ota_general.get_business_group_id:'||ota_general.get_business_group_id);
613 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' user_elig_pro_rec.count:'||user_elig_pro_rec.count);
614 end if;
615 if user_elig_pro_rec.count > 0 then -- check whether there is any ug to process
616
617 for ug_print_count in user_elig_pro_rec.first..user_elig_pro_rec.last --{ ug_ep loop
618 loop
619 if l_pre_ug_id <> user_elig_pro_rec(ug_print_count).user_group_id then
620 update ota_user_group_elements set processing_status = fnd_global.conc_request_id --Parent record to Processing
621 where user_group_id = user_elig_pro_rec(ug_print_count).user_group_id
622 and elig_prfl_id is not null
623 and person_id is null
624 and BUSINESS_GROUP_ID = l_general_bg;
625
626 update ota_user_group_elements set processing_status = 'H' --Child records to history
627 where user_group_id = user_elig_pro_rec(ug_print_count).user_group_id
628 and elig_prfl_id is not null
629 and person_id is not null
630 and BUSINESS_GROUP_ID = l_general_bg;
631
632 l_pre_ug_id := user_elig_pro_rec(ug_print_count).user_group_id;
633 end if;
634
635 end loop;
636 commit;--commit early so that other re-runs of conc programs donot pick it up
637
638
639 FOR lrnr_rec IN csr_get_learner (l_per_bg_grp_prof_val,l_ota_global_bg_prof_val) LOOP
640
641 if l_pre_person_id <> lrnr_rec.person_id then
642 l_pre_person_id := lrnr_rec.person_id;
643
644 ota_batch_action_api.create_bulk_enr_request_member
645 (p_person_action_id => l_person_action_id
646 ,p_person_id => lrnr_rec.person_id
647 ,p_assignment_id => lrnr_rec.assignment_id
648 ,p_bulk_enr_request_id => l_action_id
649 ,p_action_status_cd => 'U'
650 ,p_business_group_id => lrnr_rec.business_group_id);
651
652 l_num_row := l_num_row + 1;
653 l_end_person_action_id := l_person_action_id;
654 --
655 If l_num_row = 1 then
656 --
657 l_start_person_action_id := l_person_action_id;
658 --
659 End if;
660 --
661 If l_num_row = p_chunk_size then
662 --
663 -- Create a range of data to be multithreaded.
664 --
665
666 ota_batch_action_api.create_batch_ranges
667 (p_validate => false
668 ,p_range_id => l_range_id
669 ,p_batch_source_cd => 'EP'
670 ,p_batch_action_id => l_action_id
671 ,p_range_status_cd => 'U'
672 ,p_starting_person_action_id => l_start_person_action_id
673 ,p_ending_person_action_id => l_end_person_action_id
674 ,p_object_version_number => l_object_version_number);
675
676 l_start_person_action_id := 0;
677 l_end_person_action_id := 0;
678 l_num_row := 0;
679 l_num_range := l_num_range + 1;
680 --
681 End if;
682 end if;
683 end loop;
684
685 If l_num_row <> 0 then
686 --
687 --
688 ota_batch_action_api.create_batch_ranges
689 (p_validate => false
690 ,p_range_id => l_range_id
691 ,p_batch_source_cd => 'EP'
692 ,p_batch_action_id => l_action_id
693 ,p_range_status_cd => 'U'
694 ,p_starting_person_action_id => l_start_person_action_id
695 ,p_ending_person_action_id => l_end_person_action_id
696 ,p_object_version_number => l_object_version_number);
697
698 l_num_range := l_num_range + 1;
699 --
700 End if;
701
702 end if; --end of ug check if
703 else --Restaring part which will have p_action_id
704 --
705 l_action_id := p_action_id;
706 --
707 l_num_range := 1;
708 --
709 end if; --If p_action_id is null
710
711 if l_num_range > 1 --2
712 then
713
714 l_threads := least(l_threads, l_num_range);
715 --
716 for l_count in 1..(l_threads - 1)
717 loop
718 --
719 --l_request_id := fnd_request.submit_request();
720
721 l_request_id := FND_REQUEST.SUBMIT_REQUEST(application => 'OTA'
722 ,program => 'OTA_RESOLVE_ELIG_PRF_MUL'
723 ,argument1 => l_action_id
724 ,argument2 => p_chunk_size
725 ,argument3 => p_thread_count
726 ,argument4 => p_learner_group_id
727 ,argument5 => p_elig_prof_id
728 ,argument6 => p_enable_logging);
729
730
731 --
732 -- Store the request id of the concurrent request
733 --
734 ota_elig_profile_util.g_num_processes := ota_elig_profile_util.g_num_processes + 1;
735 ota_elig_profile_util.g_processes_tbl(ota_elig_profile_util.g_num_processes) := l_request_id;
736
737 --
738 end loop;
739 --
740 commit;
741 --
742 elsif l_num_range = 0
743 then
744 -- Means no person is selected or no ug to process
745 --
746 --
747 raise OTA_NO_PERSON_LG_TO_PROCESS;
748
749 --
750 end if; --2
751
752 --<< better to keep this code in separate procedure >>
753 begin --1
754 --<<available batch range and available person in that range will be selected>>
755 --<<for each person get the learner group/groups details that should be processed>>
756 --<<If more than one group is present loop through all the groups>>
757 --<<as we have the person id select appropriate assignment record to check the eligibility>>
758 --<<get the elig_obj_id for the learner group>>
759 --<<check the eligibility of the person assignment against the learner group>>
760 --<<If multiple assignment records are present should loop through all the assigments
761 -- but if any one of the assignment is eligible to LG then person is eligible to LG
762 -- then no need to loop all the records>>
763 -- Call resolve_eligibility_profile_m;
764
765
766 process_elig_profile_multi( p_validate =>l_validate ,
767 p_action_id =>l_action_id,
768 p_business_group_id => ota_general.get_business_group_id,
769 p_learner_group_id => p_learner_group_id,
770 p_elig_prof_id => p_elig_prof_id,
771 p_enable_logging => p_enable_logging,
772 p_chunk_size => p_chunk_size,
773 p_thread_count => p_thread_count);
774
775 If p_action_id is null then
776
777 l_pre_ug_id := -1;
778 for ug_print_count in user_elig_pro_rec.first..user_elig_pro_rec.last --{ ug_ep loop
779 loop
780 if l_pre_ug_id <> user_elig_pro_rec(ug_print_count).user_group_id then
781 update ota_user_group_elements set processing_status = 'A' --Parent record to completed
782 where user_group_id = user_elig_pro_rec(ug_print_count).user_group_id
783 and nvl(processing_status,'A') <> 'E'
784 and elig_prfl_id is not null
785 and person_id is null
786 and BUSINESS_GROUP_ID = l_general_bg;
787
788 l_pre_ug_id := user_elig_pro_rec(ug_print_count).user_group_id;
789 end if;
790 end loop;
791 commit;
792 end if;
793 hr_utility.set_location('in multithread',10);
794 end; --1
795 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' leaving');
796 exception
797 when OTA_NO_PERSON_LG_TO_PROCESS then
798 if p_enable_logging = 'Y' then
799 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' No person or no learner group to process');
800 end if;
801 IF user_elig_pro_rec.count > 0 THEN
802 for ug_print_count in user_elig_pro_rec.first..user_elig_pro_rec.last --{ ug_ep loop
803 loop
804 if l_pre_ug_id <> user_elig_pro_rec(ug_print_count).user_group_id then
805 update ota_user_group_elements set processing_status = 'P' --Parent record to Processed
806 where user_group_id = user_elig_pro_rec(ug_print_count).user_group_id
807 and elig_prfl_id is not null
808 and person_id is null
809 and BUSINESS_GROUP_ID = l_general_bg;
810
811 l_pre_ug_id := user_elig_pro_rec(ug_print_count).user_group_id;
812 end if;
813 end loop;
814 end if;
815 commit;
816 when others then
817 if p_enable_logging = 'Y' then
818 FND_FILE.PUT_LINE(FND_FILE.LOG,'Error:'||substr(SQLERRM,1,2000));
819 end if;
820 IF user_elig_pro_rec.count > 0 THEN
821 for ug_print_count in user_elig_pro_rec.first..user_elig_pro_rec.last --{ ug_ep loop
822 loop
823 if l_pre_ug_id <> user_elig_pro_rec(ug_print_count).user_group_id then
824 update ota_user_group_elements set processing_status = 'E' --Parent record to Error
825 where user_group_id = user_elig_pro_rec(ug_print_count).user_group_id
826 and elig_prfl_id is not null
827 and person_id is null
828 and BUSINESS_GROUP_ID = l_general_bg;
829
830 l_pre_ug_id := user_elig_pro_rec(ug_print_count).user_group_id;
831 end if;
832 end loop;
833 end if;
834 commit;
835 raise;
836 end resolve_elig_profile_multi;
837
838 /**
839 This function is used to get the parent request id for a concurrent program.
840 returns - Parent request id or Current request id (if no parent)
841 **/
842 function conc_parent_request_id(p_conc_request_id number) return number is
843
844 cursor get_parent_request_id is
845 select decode(PARENT_REQUEST_ID,-1,REQUEST_ID,PARENT_REQUEST_ID)
846 from fnd_concurrent_requests
847 where REQUEST_ID = p_conc_request_id;
848
849 l_parent_request_id number := -1;
850 begin
851
852 open get_parent_request_id;
853
854 fetch get_parent_request_id into l_parent_request_id;
855
856 if get_parent_request_id%notfound then
857 close get_parent_request_id;
858 return -1;
859 end if;
860
861 close get_parent_request_id;
862 return l_parent_request_id;
863
864 end conc_parent_request_id;
865
866 /**
867 This procedure is used to process the individual threads of the resolve eligiblity profile concurrent program
868 **/
869 PROCEDURE process_elig_profile_multi
870 (p_validate IN varchar2 DEFAULT 'N'
871 ,p_action_id IN number
872 ,p_business_group_id IN number
873 ,p_learner_group_id IN number
874 ,p_elig_prof_id IN number
875 ,p_enable_logging IN varchar2 DEFAULT 'N'
876 ,p_chunk_size IN number
877 ,p_thread_count IN number) IS
878 l_effective_date date;
879 l_range_id OTA_BATCH_RANGES.range_id%TYPE;
880 l_record_number number DEFAULT 0;
881 l_start_person_action_id number DEFAULT 0;
882 l_end_person_action_id number DEFAULT 0;
883 l_actn varchar2(80);
884 l_cnt number(5) DEFAULT 0;
885 l_per_bg_prof_val number := fnd_profile.value ('PER_BUSINESS_GROUP_ID');
886 l_ota_global_bg_prof_val number:= fnd_profile.value('OTA_HR_GLOBAL_BUSINESS_GROUP_ID');
887
888 l_eligprof_tab ben_evaluate_elig_profiles.proftab;
889 l_score_tab ben_evaluate_elig_profiles.scoreTab;
890
891 CURSOR c_range_thread IS
892 SELECT ran.range_id
893 ,ran.starting_person_action_id
894 ,ran.ending_person_action_id
895 FROM OTA_BATCH_RANGES ran
896 WHERE ran.range_status_cd = 'U'
897 AND ran.batch_source_cd = 'EP'
898 AND ran.BATCH_ACTION_ID = p_action_id
899 AND rownum < 2
900 FOR UPDATE OF ran.range_status_cd;
901
902 cursor c_person_assign_thread is
903 SELECT perf.person_id
904 ,perf.assignment_id
905 ,perf.mbr_bg_id
906 FROM ota_bulk_enr_req_members perf
907 WHERE perf.BULK_ENR_REQUEST_ID = p_action_id
908 AND perf.person_action_id BETWEEN l_start_person_action_id AND l_end_person_action_id
909 ORDER BY perf.person_action_id;
910
911 l_commit number;
912
913 CURSOR get_elig_prof_details
914 (p_elig_prof_id IN number) IS
915 SELECT DISTINCT
916 asmt_to_use_cd
917 FROM ben_eligy_prfl_f
918 WHERE eligy_prfl_id = p_elig_prof_id
919 AND trunc (sysdate) BETWEEN effective_start_date
920 AND effective_end_date
921 AND stat_cd IN ('A','P');
922
923 l_elig_prof_id ben_eligy_prfl_f.eligy_prfl_id%TYPE;
924 l_elig_prof_name ben_eligy_prfl_f.name%TYPE;
925 l_asmt_to_use_cd ben_eligy_prfl_f.asmt_to_use_cd%TYPE;
926 l_allow_contingent_wrk varchar2(1) DEFAULT 'Y';
927 l_learner_group_name ota_user_groups_tl.user_group_name%TYPE;
928 l_numberof_records_processed number DEFAULT 0;
929 assignment_whereclause varchar2(100);
930 l_elig_obj_id number;
931 l_counter number DEFAULT 0;
932 l_learner_group_element_id ota_user_group_elements.user_group_element_id%TYPE;
933 TYPE learner_rec IS RECORD (person_id per_assignments_f.person_id%TYPE
934 ,assignment_id per_assignments_f.assignment_id%TYPE
935 ,business_group_id per_assignments_f.business_group_id%TYPE);
936 TYPE t_learner_rec IS TABLE OF learner_rec INDEX BY binary_integer;
937 lrnr_rec t_learner_rec;
938 TYPE ug_rec IS RECORD (user_group_id ota_user_group_elements.user_group_id%TYPE
939 ,elig_prfl_id ota_user_group_elements.elig_prfl_id%TYPE
940 ,user_group_element_id ota_user_group_elements.user_group_element_id%TYPE
941 ,business_group_id ota_user_group_elements.business_group_id%TYPE
942 ,elig_pro_bg_id ben_eligy_prfl_f.business_group_id%TYPE);
943
944 TYPE t_ug_rec IS TABLE OF ug_rec INDEX BY binary_integer;
945 user_elig_pro_rec t_ug_rec;
946 TYPE learner_assign_details IS REF CURSOR;
947 csr_get_lrnr_in_assign learner_assign_details;
948 csr_get_ug_to_be_processed learner_assign_details;
949 csr_get_ug_ep_det learner_assign_details;
950 ug_whereclause varchar2(200);
951 get_ug_to_be_processed varchar2(4000);
952 l_pre_ug_id ota_user_group_elements.user_group_id%TYPE := -1;
953 l_proc varchar2(200) := 'resolve_eligibility_profile_m';
954 l_ota_general_bg number := ota_general.get_business_group_id;
955 l_is_eligible boolean := false;
956
957 BEGIN
958
959 IF p_learner_group_id IS NOT NULL
960 AND p_elig_prof_id IS NOT NULL THEN
961 ug_whereclause := 'user_group_id = '
962 || to_char (p_learner_group_id)
963 || ' and elig_prfl_id = '
964 || to_char (p_elig_prof_id);
965 ELSIF p_elig_prof_id IS NULL
966 AND p_learner_group_id IS NOT NULL THEN
967 ug_whereclause := 'user_group_id = '
968 || to_char (p_learner_group_id);
969 ELSIF p_elig_prof_id IS NOT NULL
970 AND p_learner_group_id IS NULL THEN
971 ug_whereclause := 'user_group_id in (select user_group_id from ota_user_group_elements
972 where elig_prfl_id = '
973 || to_char (p_elig_prof_id)
974 || ' )';
975 ELSE
976 ug_whereclause := '1=1';
977 END IF;
978
979 get_ug_to_be_processed := 'select * from
980 (select
981 ug.user_group_id user_group_id,
982 uge.elig_prfl_id elig_prfl_id,
983 uge.user_group_element_id user_group_element_id,
984 uge.business_group_id uge_business_group_id,
985 bep.business_group_id ep_business_group_id
986 from
987 ota_user_groups_b ug,
988 ota_user_group_elements uge,
989 ben_eligy_prfl_f bep
990 where
991 ug.user_group_id = uge.user_group_id
992 and trunc(sysdate) between trunc(ug.start_date_active) and nvl(ug.end_date_active,trunc(sysdate+1))
993 and uge.elig_prfl_id is not null
994 and uge.person_id is null
995 and bep.eligy_prfl_id = uge.elig_prfl_id
996 and trunc(sysdate) between bep.effective_start_date AND bep.effective_end_date
997 and bep.stat_cd IN (''A'',''P'')
998 and nvl(uge.processing_status,''A'') = '''
999 || to_char (conc_parent_request_id(fnd_global.conc_request_id))
1000 || ''' and ug.business_group_id = ota_general.get_business_group_id) QRSLT WHERE '
1001 || ug_whereclause
1002 || ' order by user_group_id';
1003 if p_enable_logging = 'Y' then
1004 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' get_ug_to_be_processed:'||get_ug_to_be_processed);
1005 end if;
1006
1007 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' conc_parent_request_id:'||conc_parent_request_id(fnd_global.conc_request_id));
1008
1009 OPEN csr_get_ug_to_be_processed
1010 FOR get_ug_to_be_processed;
1011
1012 FETCH csr_get_ug_to_be_processed
1013 BULK COLLECT INTO user_elig_pro_rec;
1014
1015 CLOSE csr_get_ug_to_be_processed;
1016
1017 LOOP
1018 OPEN c_range_thread;
1019
1020 FETCH c_range_thread
1021 INTO l_range_id
1022 ,l_start_person_action_id
1023 ,l_end_person_action_id;
1024
1025 IF c_range_thread%NOTFOUND THEN
1026
1027 CLOSE c_range_thread;
1028
1029 EXIT;
1030 END IF;
1031
1032 CLOSE c_range_thread;
1033
1034 UPDATE OTA_BATCH_RANGES ran
1035 SET ran.range_status_cd = 'P'
1036 WHERE ran.range_id = l_range_id;
1037
1038 COMMIT;
1039
1040 IF user_elig_pro_rec.count > 0 THEN -- if no elig pro record to process skip processing
1041
1042 l_eligprof_tab(1).eligy_prfl_id := null;
1043 l_eligprof_tab(1).mndtry_flag := 'N';
1044 l_eligprof_tab(1).compute_score_flag := 'Y';
1045 l_eligprof_tab(1).trk_scr_for_inelg_flag := 'N';
1046
1047 l_record_number := 0;
1048 l_counter := l_counter + 1;
1049 FOR l_rec IN c_person_assign_thread LOOP
1050
1051 IF p_enable_logging = 'Y' THEN
1052 FND_FILE.PUT_LINE(FND_FILE.LOG,'-------------------------------------------------------------');
1053 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' l_rec.person_id:'||l_rec.person_id);
1054 FND_FILE.PUT_LINE(FND_FILE.LOG,l_proc || ' l_rec.mbr_bg_id:'||l_rec.mbr_bg_id);
1055 End if;
1056
1057 l_counter := l_counter + 1;
1058 l_pre_ug_id := - 1;
1059
1060 FOR l_ug_count IN user_elig_pro_rec.first .. user_elig_pro_rec.last LOOP
1061 IF l_rec.mbr_bg_id = user_elig_pro_rec (l_ug_count).elig_pro_bg_id THEN
1062 IF not l_is_eligible or l_pre_ug_id <> user_elig_pro_rec (l_ug_count).user_group_id THEN
1063 l_is_eligible := false;
1064
1065 IF l_pre_ug_id <> user_elig_pro_rec (l_ug_count).user_group_id THEN
1066 l_pre_ug_id := user_elig_pro_rec (l_ug_count).user_group_id;
1067
1068 l_learner_group_name := get_learner_group_name (user_elig_pro_rec (l_ug_count).user_group_id);
1069
1070 l_elig_obj_id := get_elig_object_id (user_elig_pro_rec (l_ug_count).user_group_id);
1071 END IF;
1072
1073 l_learner_group_element_id := user_elig_pro_rec (l_ug_count).user_group_element_id;
1074
1075 l_eligprof_tab(1).eligy_prfl_id := user_elig_pro_rec (l_ug_count).elig_prfl_id;
1076
1077 ben_env_object.init
1078 (p_business_group_id => l_rec.mbr_bg_id
1079 ,p_thread_id => NULL
1080 ,p_chunk_size => NULL
1081 ,p_threads => NULL
1082 ,p_max_errors => NULL
1083 ,p_benefit_action_id => NULL
1084 ,p_effective_date => trunc (sysdate));
1085
1086 IF ben_evaluate_elig_profiles.eligible
1087 (p_person_id => l_rec.person_id,
1088 p_assignment_id => l_rec.assignment_id,
1089 p_business_group_id => l_rec.mbr_bg_id,
1090 p_eval_typ => 'E',
1091 p_comp_obj_mode => false,
1092 p_eligprof_tab => l_eligprof_tab,
1093 p_score_tab => l_score_tab,
1094 p_effective_date => trunc (sysdate)) THEN
1095 l_numberof_records_processed := l_numberof_records_processed + 1;
1096
1097 process_eligible_lrnr_record (l_rec.person_id
1098 ,user_elig_pro_rec (l_ug_count).user_group_id
1099 ,user_elig_pro_rec (l_ug_count).elig_prfl_id
1100 ,user_elig_pro_rec (l_ug_count).business_group_id
1101 ,p_enable_logging);
1102 l_is_eligible := true;
1103 IF l_numberof_records_processed = 1000 THEN
1104 COMMIT;
1105
1106 l_numberof_records_processed := 0;
1107 END IF;
1108
1109 IF p_enable_logging = 'Y' THEN
1110 fnd_file.put_line (fnd_file.log
1111 ,l_rec.person_id
1112 || ' is eligible for '
1113 || l_learner_group_name);
1114 END IF;
1115 l_score_tab.delete;
1116 END IF;
1117 END IF;
1118 END IF;
1119 END LOOP;
1120
1121 UPDATE ota_bulk_enr_req_members
1122 SET action_status_cd = 'P'
1123 WHERE person_id = l_rec.person_id
1124 AND BULK_ENR_REQUEST_ID = p_action_id
1125 AND action_status_cd <> 'P';
1126
1127 lrnr_rec.delete;
1128 END LOOP;
1129 update ota_bulk_enr_req_members set action_status_cd = 'P'
1130 WHERE BULK_ENR_REQUEST_ID = p_action_id
1131 AND action_status_cd <> 'P'
1132 AND person_action_id BETWEEN l_start_person_action_id
1133 AND l_end_person_action_id;
1134 END IF;
1135 END LOOP;
1136
1137 user_elig_pro_rec.delete;
1138 l_eligprof_tab.delete;
1139
1140
1141 ota_elig_profile_util.check_all_slaves_finished
1142 (p_rpt_flag => TRUE);
1143
1144 IF l_counter = 0 THEN
1145 fnd_file.put_line (fnd_file.log
1146 ,'The given combination of learner group and eligibility profile donot exist');
1147 END IF;
1148
1149 IF p_enable_logging = 'Y' THEN
1150 fnd_file.put_line (fnd_file.log
1151 ,'Commit Done');
1152 END IF;
1153
1154 COMMIT;
1155 EXCEPTION
1156 WHEN others THEN
1157
1158 l_pre_ug_id := -1;
1159
1160 IF user_elig_pro_rec.count > 0 THEN
1161 for ug_print_count in user_elig_pro_rec.first..user_elig_pro_rec.last --{ ug_ep loop
1162 loop
1163 if l_pre_ug_id <> user_elig_pro_rec(ug_print_count).user_group_id then
1164 update ota_user_group_elements set processing_status = 'E' --Parent record to Error
1165 where user_group_id = user_elig_pro_rec(ug_print_count).user_group_id
1166 and elig_prfl_id is not null
1167 and person_id is null
1168 and BUSINESS_GROUP_ID = l_ota_general_bg;
1169
1170 l_pre_ug_id := user_elig_pro_rec(ug_print_count).user_group_id;
1171 end if;
1172 end loop;
1173 end if;
1174 fnd_file.put_line (fnd_file.log
1175 ,'Error in processing learner group '
1176 || l_learner_group_name);
1177
1178 fnd_file.put_line (fnd_file.log
1179 ,substr (sqlerrm
1180 ,1
1181 ,2000)
1182 || l_learner_group_name);
1183
1184 COMMIT;
1185 END process_elig_profile_multi;
1186
1187 procedure delete_ineligible_records(errbuf out nocopy varchar2,
1188 retcode out nocopy varchar2,
1189 p_learner_group_id in number,
1190 p_elig_prof_id in number) is
1191
1192 --user_group_rec get_ug_to_be_processed%rowtype;
1193 l_counter number:=0;
1194 l_learner_group_name ota_user_groups_tl.user_group_name%type;
1195 l_learner_group_element_id ota_user_group_elements.user_group_element_id%type;
1196 ug_ep_whereclause varchar2(200);
1197 get_ug_to_be_processed varchar2(4000);
1198 l_business_group_id ben_eligy_prfl_f.business_group_id%type;
1199
1200 TYPE ug_rec IS RECORD(
1201 user_group_id ota_user_group_elements.user_group_id%type,
1202 elig_prfl_id ota_user_group_elements.elig_prfl_id%type,
1203 user_group_element_id ota_user_group_elements.user_group_element_id%type,
1204 business_group_id ota_user_group_elements.business_group_id%type
1205 );
1206
1207 user_group_rec ug_rec;
1208
1209 TYPE learner_assign_details IS REF CURSOR;
1210 csr_get_ug_to_be_processed learner_assign_details;
1211
1212 l_elig_prof_id ben_eligy_prfl_f.eligy_prfl_id%type;
1213 l_elig_prof_name ben_eligy_prfl_f.name%type;
1214 l_asmt_to_use_cd ben_eligy_prfl_f.asmt_to_use_cd%type;
1215 begin
1216
1217
1218 if p_learner_group_id is not null and p_elig_prof_id is not null then
1219 ug_ep_whereclause := 'user_group_id = ' ||TO_CHAR(p_learner_group_id)
1220 || 'and elig_prfl_id = '||TO_CHAR(p_elig_prof_id);
1221 elsif p_elig_prof_id is null and p_learner_group_id is not null then
1222 ug_ep_whereclause := 'user_group_id = ' ||TO_CHAR(p_learner_group_id) ;
1223 elsif p_elig_prof_id is not null and p_learner_group_id is null then
1224 ug_ep_whereclause := 'user_group_id in
1225 (select user_group_id from ota_user_group_elements
1226 where elig_prfl_id ='|| TO_CHAR(p_elig_prof_id)|| ')';
1227 else
1228 ug_ep_whereclause := '1=1';
1229
1230 end if;
1231
1232 get_ug_to_be_processed := 'select * from
1233 (select
1234 ug.user_group_id,
1235 uge.elig_prfl_id,
1236 uge.user_group_element_id,
1237 uge.business_group_id
1238 from
1239 ota_user_groups_b ug,
1240 ota_user_group_elements uge
1241 where
1242 ug.user_group_id = uge.user_group_id
1243 and trunc(sysdate) between trunc(ug.start_date_active) and nvl(ug.end_date_active,trunc(sysdate+1))
1244 and uge.elig_prfl_id is not null
1245 and uge.person_id is null
1246 and nvl(uge.processing_status,''A'') <> ''P''
1247 and ug.business_group_id = ota_general.get_business_group_id) QRSLT WHERE '|| ug_ep_whereclause ;
1248
1249 OPEN csr_get_ug_to_be_processed for get_ug_to_be_processed;
1250 LOOP
1251 FETCH csr_get_ug_to_be_processed into user_group_rec;
1252 EXIT WHEN csr_get_ug_to_be_processed %NOTFOUND;
1253
1254 l_learner_group_name := get_learner_group_name(user_group_rec.user_group_id);
1255 l_learner_group_element_id := user_group_rec.user_group_element_id;
1256
1257 FND_FILE.PUT_LINE(FND_FILE.LOG,'Learner group being processed : '||l_learner_group_name);
1258
1259 open get_elig_prof_details(user_group_rec.elig_prfl_id);
1260 fetch get_elig_prof_details into l_elig_prof_id,l_elig_prof_name,l_asmt_to_use_cd,l_business_group_id;
1261 if get_elig_prof_details%NOTFOUND then
1262 close get_elig_prof_details;
1263 FND_FILE.PUT_LINE(FND_FILE.LOG,'Eligibility profile details not found or it is in inactive/closed status');
1264 --write messages in conc program log;
1265 else
1266
1267 l_counter := l_counter+1;
1268 delete from ota_user_group_elements uge where
1269 uge.person_id is not null and
1270 uge.elig_prfl_id is not null and
1271 uge.processing_status = 'H' and
1272 uge.user_group_id = user_group_rec.user_group_id and
1273 uge.elig_prfl_id = user_group_rec.elig_prfl_id
1274 and exists
1275 (
1276 select user_group_element_id from
1277 ota_user_group_elements parent
1278 where
1279 parent.elig_prfl_id = uge.elig_prfl_id
1280 and parent.user_group_id = uge.user_group_id
1281 and nvl(parent.processing_status,'A') = 'A'
1282 and parent.person_id is null
1283 );
1284
1285 commit;
1286 end if;
1287
1288 end loop;
1289
1290 if l_counter = 0 then
1291 FND_FILE.PUT_LINE(FND_FILE.LOG,'The given combination of learner group and eligibility profile donot exist');
1292 end if;
1293
1294 exception
1295 when others then
1296
1297 update ota_user_group_elements set processing_status= 'E' --Parent record to Error
1298 where user_group_element_id =l_learner_group_element_id;
1299
1300 FND_FILE.PUT_LINE(FND_FILE.LOG,'Error in deleting ineligible records for learner group '||l_learner_group_name);
1301 commit;
1302
1303 end delete_ineligible_records;
1304
1305
1306
1307 function is_profile_attached_to_ug(p_elig_prof_id in number)
1308 return varchar2 is
1309
1310 cursor user_group_exists is
1311 select user_group_id
1312 from
1313 ota_user_group_elements
1314 where
1315 elig_prfl_id=p_elig_prof_id;
1316
1317 l_user_group_id ota_user_group_elements.user_group_id%type;
1318
1319 begin
1320
1321 open user_group_exists;
1322 fetch user_group_exists into l_user_group_id;
1323 if user_group_exists%NOTFOUND then
1324 close user_group_exists;
1325 return 'N';
1326 else
1327 close user_group_exists;
1328 return 'Y';
1329 end if;
1330
1331
1332 end is_profile_attached_to_ug;
1333
1334
1335
1336 procedure create_eligibility_object
1337 (p_eligibility_profile_id in number,
1338 p_user_group_id in number,
1339 p_business_group_id in number,
1340 p_result out nocopy varchar2) is
1341
1342 cursor get_elig_object_id (p_user_group_id in number) is
1343 select
1344 elig_obj_id
1345 from
1346 ben_elig_obj_f EO
1347 where
1348 trunc(sysdate) between EFFECTIVE_START_DATE and EFFECTIVE_END_DATE
1349 and TABLE_NAME = 'OTA_USER_GROUPS_B'
1350 and COLUMN_NAME = 'USER_GROUP_ID'
1351 and COLUMN_VALUE = p_user_group_id;
1352
1353
1354 l_elig_obj_id ben_elig_obj_f.elig_obj_id%type;
1355 l_start_date date;
1356 l_end_date date;
1357 l_object_version_number1 number;
1358 l_effective_start_date date;
1359 l_effective_end_date date;
1360 l_object_version_number2 number;
1361 l_business_group_id number:= p_business_group_id;
1362 l_elig_obj_obj_version ben_elig_obj_elig_profl_f.object_version_number%type;
1363 l_elig_prof_id ben_elig_obj_elig_profl_f.elig_prfl_id%type;
1364 l_elig_obj_elig_prf_id ben_elig_obj_elig_profl_f.elig_obj_elig_prfl_id%type;
1365
1366 begin
1367
1368
1369 savepoint create_eligibility_object;
1370
1371 open get_elig_object_id(p_user_group_id);
1372 fetch get_elig_object_id into l_elig_obj_id;
1373 close get_elig_object_id;
1374
1375 if l_elig_obj_id is null then
1376 ben_elig_obj_api.create_ELIG_OBJ
1377 (
1378 p_validate => false
1379 ,p_elig_obj_id => l_elig_obj_id
1380 ,p_effective_start_date => l_start_date
1381 ,p_effective_end_date => l_end_date
1382 ,p_business_group_id => l_business_group_id
1383 ,p_table_name => 'OTA_USER_GROUPS_B'
1384 ,p_column_name => 'USER_GROUP_ID'
1385 ,p_column_value => p_user_group_id
1386 ,p_object_version_number => l_object_version_number1
1387 ,p_effective_date => trunc(sysdate)
1388 );
1389 end if;
1390
1391 if(l_elig_obj_id is null) then
1392 p_result := 'F';
1393 ROLLBACK TO create_ELIG_OBJ_ELIG_PROFL;
1394 return;
1395 -- raise;
1396 end if;
1397
1398 open get_elig_obj_elig_prf_id(l_elig_obj_id,p_eligibility_profile_id);
1399 fetch get_elig_obj_elig_prf_id into l_elig_obj_elig_prf_id,l_elig_prof_id,l_elig_obj_obj_version;
1400 close get_elig_obj_elig_prf_id;
1401
1402 if l_elig_obj_elig_prf_id is null then
1403 ben_ELIG_OBJ_ELIG_PROFL_api.create_elig_obj_elig_profl
1404 (
1405 p_validate => false
1406 ,p_elig_obj_id => l_elig_obj_id
1407 ,p_elig_prfl_id => p_eligibility_profile_id
1408 ,p_mndtry_flag => 'N'
1409 ,p_business_group_id => l_business_group_id
1410 ,p_effective_start_date => l_effective_start_date
1411 ,p_effective_end_date => l_effective_end_date
1412 ,p_elig_obj_elig_prfl_id => l_elig_obj_elig_prf_id
1413 ,p_object_version_number => l_object_version_number2
1414 ,p_effective_date => trunc(sysdate)
1415 );
1416 end if;
1417
1418 if(l_elig_obj_elig_prf_id is not null) then
1419 p_result := 'S';
1420 else
1421 p_result := 'F';
1422 end if;
1423
1424 Exception
1425 when others then
1426 ROLLBACK TO create_elig_obj_elig_profl;
1427 p_result := 'F';
1428 end create_eligibility_object;
1429
1430
1431 procedure delete_eligibility_object(
1432 p_user_group_id in varchar2,
1433 p_eligibility_profile_id in varchar2,
1434 p_result out nocopy varchar) is
1435
1436 cursor get_elig_object_id (p_user_group_id in number) is
1437 select
1438 elig_obj_id ,
1439 object_version_number
1440 from
1441 ben_elig_obj_f EO
1442 where
1443 trunc(sysdate) between EFFECTIVE_START_DATE and EFFECTIVE_END_DATE
1444 and TABLE_NAME = 'OTA_USER_GROUPS_B'
1445 and COLUMN_NAME = 'USER_GROUP_ID'
1446 and COLUMN_VALUE = p_user_group_id;
1447
1448
1449
1450 cursor check_elig_obj_asso_id_exist(p_elig_obj_id in number) is
1451 select
1452 elig_obj_elig_prfl_id
1453 from
1454 ben_elig_obj_elig_profl_f
1455 where
1456 trunc(sysdate) between effective_start_date and effective_end_date
1457 and elig_obj_id = p_elig_obj_id
1458 and rownum < 2;
1459
1460 l_elig_object_id ben_elig_obj_f.elig_obj_id%type;
1461 l_obj_version ben_elig_obj_f.object_version_number%type;
1462 l_elig_obj_elig_prf_id ben_elig_obj_elig_profl_f.elig_obj_elig_prfl_id%type;
1463 l_elig_obj_obj_version ben_elig_obj_elig_profl_f.object_version_number%type;
1464 l_elig_prof_id ben_elig_obj_elig_profl_f.elig_prfl_id%type;
1465 l_effective_start_date date;
1466 l_effective_end_date date;
1467 l_check_elig_obj_elig_prf_id ben_elig_obj_elig_profl_f.elig_obj_elig_prfl_id%type;
1468 begin
1469
1470 savepoint delete_eligibility_object;
1471
1472 open get_elig_object_id(p_user_group_id);
1473 fetch get_elig_object_id into l_elig_object_id,l_obj_version;
1474 close get_elig_object_id;
1475
1476 if l_elig_object_id is null then--add logic for cursor not found
1477 p_result := 'F';
1478 ROLLBACK TO delete_eligibility_object;
1479 return;
1480 end if;
1481
1482 open get_elig_obj_elig_prf_id(l_elig_object_id,p_eligibility_profile_id);
1483 fetch get_elig_obj_elig_prf_id into l_elig_obj_elig_prf_id,l_elig_prof_id,l_elig_obj_obj_version;
1484 close get_elig_obj_elig_prf_id;
1485
1486 ben_elig_obj_elig_profl_api.delete_elig_obj_elig_profl
1487 (p_validate => false
1488 ,p_elig_obj_elig_prfl_id => l_elig_obj_elig_prf_id
1489 ,p_effective_start_date => l_effective_start_date
1490 ,p_effective_end_date => l_effective_end_date
1491 ,p_object_version_number => l_elig_obj_obj_version
1492 ,p_effective_date => trunc(sysdate)
1493 ,p_datetrack_mode => hr_api.g_zap
1494 );
1495
1496 open check_elig_obj_asso_id_exist(l_elig_object_id);
1497 fetch check_elig_obj_asso_id_exist into l_check_elig_obj_elig_prf_id;
1498 close check_elig_obj_asso_id_exist;
1499
1500 if l_check_elig_obj_elig_prf_id is null then
1501 ben_elig_obj_api.delete_ELIG_OBJ
1502 (p_validate => false
1503 ,p_elig_obj_id => l_elig_object_id
1504 ,p_effective_start_date => l_effective_start_date
1505 ,p_effective_end_date => l_effective_end_date
1506 ,p_object_version_number => l_obj_version
1507 ,p_effective_date => trunc(sysdate)
1508 ,p_datetrack_mode => hr_api.g_zap
1509 );
1510 else
1511 l_obj_version := 1;
1512 end if;
1513 if l_elig_obj_obj_version is not null and l_obj_version is not null then
1514 delete from ota_user_group_elements
1515 where user_group_id=p_user_group_id and
1516 elig_prfl_id=l_elig_prof_id and
1517 person_id is not null;
1518 p_result := 'S';
1519 else
1520 p_result := 'F';
1521 end if;
1522
1523 exception
1524 when others then
1525 ROLLBACK TO delete_eligibility_object;
1526 p_result := 'F';
1527 end delete_eligibility_object;
1528
1529 function submit_conc_request(
1530 p_user_group_id in varchar2,
1531 p_elig_prfl_id in varchar2 default NULL,
1532 p_enable_debug in varchar2 default 'N')
1533 return number is
1534
1535 l_conc_proc_id number;
1536 begin
1537
1538 l_conc_proc_id := FND_REQUEST.SUBMIT_REQUEST(application => 'OTA'
1539 ,program => 'OTA_RESOLVE_ELIG_PRF_MUL'
1540 ,argument1 => NULL
1541 ,argument2 => 1000
1542 ,argument3 => 3
1543 ,argument4 => p_user_group_id
1544 ,argument5 => p_elig_prfl_id
1545 ,argument6 => p_enable_debug);
1546
1547 return l_conc_proc_id;
1548
1549 end submit_conc_request;
1550
1551 -- ============================================================================
1552 -- << Rpt_error >>
1553 -- ============================================================================
1554 --
1555 procedure rpt_error (p_proc in varchar2
1556 ,p_last_actn in varchar2
1557 ,p_rpt_flag in boolean default FALSE
1558 ) is
1559 L_proc varchar2(80) := g_package||'.rpt_error';
1560 Begin
1561 If (p_rpt_flag ) then
1562 fnd_file.put_line(fnd_file.log,'<<<Fail in '||p_proc||' while '|| p_last_actn||'>>>');
1563 End if;
1564 hr_utility.set_location('> Fail in ' || p_proc, 999 );
1565 hr_utility.set_location('>> While ' || p_last_actn, 999);
1566 End rpt_error;
1567
1568 --
1569 -- ============================================================================
1570 -- <<Check_all_slaves_finished>>
1571 -- ============================================================================
1572 --
1573 Procedure check_all_slaves_finished(p_rpt_flag Boolean default FALSE) is
1574 --
1575 l_proc varchar2(80) := g_package||'.check_all_slaves_finished';
1576 l_no_slaves boolean := true;
1577 l_dummy varchar2(1);
1578 l_actn varchar2(80);
1579 --
1580 Cursor c_slaves(p_request_id number) is
1581 Select null
1582 From fnd_concurrent_requests fnd
1583 Where fnd.phase_code <> 'C'
1584 And fnd.request_id = p_request_id;
1585 Begin
1586 hr_utility.set_location ('Entering '||l_proc,5);
1587 If g_num_processes <> 0 then
1588 l_actn := 'Checking Slaves.....';
1589 While l_no_slaves loop
1590 l_no_slaves := false;
1591 For l_count in 1..g_num_processes loop
1592 open c_slaves(g_processes_tbl(l_count));
1593 fetch c_slaves into l_dummy;
1594 If c_slaves%found then
1595 l_no_slaves := true;
1596 close c_slaves;
1597 exit;
1598 End if;
1599 Close c_slaves;
1600 End loop;
1601 If (l_no_slaves) then
1602 dbms_lock.sleep(5);
1603 End if;
1604 End loop;
1605 End if;
1606 hr_utility.set_location ('Leaving '||l_proc,5);
1607 Exception
1608 when others then
1609 rpt_error(p_proc =>l_proc,p_last_actn=>l_actn,p_rpt_flag=>p_rpt_flag);
1610 raise;
1611 End check_all_slaves_finished;
1612
1613 end ota_elig_profile_util;
1614