DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_SC_BULK_ASSIGN

Source


1 PACKAGE BODY IGS_SC_BULK_ASSIGN AS
2  /* $Header: IGSSC07B.pls 120.7 2006/02/02 07:10:55 skpandey noship $ */
3 
4 
5 
6 Type StrArray IS VARRAY(10) of VARCHAR2(500);
7 Type DateArray IS VARRAY(10) of VARCHAR2(11);
8 l_usrroles_array StrArray;
9 l_startdate_array DateArray;
10 l_enddate_array DateArray;
11 
12 l_prog_label CONSTANT VARCHAR2(500) :='igs.plsql.igs_sc_bulk_assign';
13 l_label VARCHAR2(4000);
14 l_debug_str VARCHAR2(32000);
15 
16 
17 PROCEDURE PopulateRolesArray(EncdStr VARCHAR2) IS
18  ------------------------------------------------------------------
19   --Updated by  : ssawhney, Oracle India
20   --Date created:  27-MAY-2001
21   --
22   --Purpose: This procedure will populate the roles arrays with the values of
23   --  Role Name,Start Date and End Date
24   --
25   --Change History:
26 ------------------------------------------------------------------
27 --This Local variable will save	the String passed as parameter
28 l_Param_Str VARCHAR2(4000);
29 l_Rec_Str VARCHAR2(500);
30 --This will have the end positions of the substring
31 l_End_Count NUMBER;
32 --This will have the send position of a particular record
33 l_End_Rec_Count NUMBER;
34 l_array_index binary_integer;
35 -- This will have the current array index
36 
37 BEGIN
38   /* Debug */
39 IF fnd_log.test(fnd_log.level_procedure,l_prog_label) THEN
40   l_label := 'igs.plsql.igs_sc_bulk_assign.PopulateRolesArray';
41   l_debug_str := 'Entering PopulateRolesArray. EncdStr is ' || EncdStr;
42   fnd_log.string_with_context( fnd_log.level_procedure,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
43 END IF;
44 
45 
46 L_Param_Str := EncdStr;
47 L_End_Count := INSTR(L_Param_Str,'\:\');
48 l_array_index := 1;
49 
50 WHILE L_Param_Str IS NOT NULL LOOP
51 
52 l_usrroles_array.EXTEND(1);
53 l_startdate_array.EXTEND(1);
54 l_enddate_array.EXTEND(1);
55 
56 l_Rec_Str := SUBSTR(L_Param_Str,1,L_End_Count-1);
57 l_End_Rec_Count := INSTR(l_Rec_Str,'\~\');
58 l_usrroles_array(l_array_index) := SUBSTR(l_Rec_Str,1,l_End_Rec_Count-1);
59 
60 l_Rec_Str := SUBSTR(l_Rec_Str,l_End_Rec_Count+3);
61 l_End_Rec_Count := INSTR(l_Rec_Str,'\~\');
62 l_startdate_array(l_array_index) := SUBSTR(l_Rec_Str,1,l_End_Rec_Count-1);
63 l_Rec_Str := SUBSTR(l_Rec_Str,l_End_Rec_Count+3);
64 
65 IF l_Rec_Str IS NOT NULL THEN
66 	l_enddate_array(l_array_index) := l_Rec_Str;
67 END IF;
68 
69 l_Param_Str := SUBSTR(L_Param_Str,L_End_Count+3);
70 l_array_index := l_array_index +1;
71 L_End_Count := INSTR(L_Param_Str,'\:\');
72 
73 IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
74   l_label := 'igs.plsql.igs_sc_bulk_assign.PopulateRolesArray';
75   l_debug_str := 'Inside PopulateRolesArray. l_Rec_Str: '||l_Rec_Str|| ', l_End_Rec_Count: '||l_End_Rec_Count||
76 			', l_Param_Str: '||l_Param_Str|| ', l_array_index: '||l_array_index;
77   fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
78 END IF;
79 
80 END LOOP;
81    /* Debug */
82 IF fnd_log.test(fnd_log.level_procedure,l_prog_label) THEN
83   l_label := 'igs.plsql.igs_sc_bulk_assign.PopulateRolesArray';
84   l_debug_str := 'Exiting PopulateRolesArray.';
85   fnd_log.string_with_context( fnd_log.level_procedure,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
86 END IF;
87 
88 END PopulateRolesArray;
89 
90 
91 
92 FUNCTION getTokens( EncdStr Varchar2)
93 RETURN StrArray
94 IS
95 ------------------------------------------------------------------
96   --Updated by  : ssawhney, Oracle India
97   --Date created:  27-MAY-2001
98   --
99   --Purpose:This Function will return an array populated with user attributes
100   --
101   --Change History:
102 ------------------------------------------------------------------
103 --This Local variable will save the String passed as parameter
104 L_Param_Str VARCHAR2(4000);--This will have the beg position of the substring
105 --This will have the end positions of the substring
106 L_End_Count NUMBER;
107 l_tokenArray StrArray := StrArray();
108 l_array_index binary_integer;
109 
110 BEGIN
111   /* Debug */
112 IF fnd_log.test(fnd_log.level_procedure,l_prog_label) THEN
113   l_label := 'igs.plsql.igs_sc_bulk_assign.getTokens';
114   l_debug_str := 'Entering getTokens. EncdStr is ' || EncdStr||', l_array_index is ' || l_array_index;
115   fnd_log.string_with_context( fnd_log.level_procedure,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
116 END IF;
117 
118 L_Param_Str := EncdStr;
119 L_End_Count := INSTR(L_Param_Str,'\:\');
120 l_array_index := 1;
121 
122 
123 IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
124   l_label := 'igs.plsql.igs_sc_bulk_assign.getTokens';
125   l_debug_str := 'Inside getTokens. L_Param_Str is'||L_Param_Str|| ', L_End_Count is '||L_End_Count;
126   fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
127 END IF;
128 
129 WHILE L_Param_Str IS NOT NULL LOOP
130 l_tokenArray.EXTEND(1);
131 l_tokenArray(l_array_index) := SUBSTR(L_Param_Str,1,L_End_Count-1);
132 L_Param_Str := SUBSTR(L_Param_Str,L_End_Count+3);
133 
134 l_array_index := l_array_index +1;
135 L_End_Count := INSTR(L_Param_Str,'\:\');
136 
137 END LOOP;
138   /* Debug */
139 IF fnd_log.test(fnd_log.level_procedure,l_prog_label) THEN
140   l_label := 'igs.plsql.igs_sc_bulk_assign.getTokens';
141   l_debug_str := 'Exiting getTokens. Returning l_tokenArray(1)= ' ||l_tokenArray(1);
142   fnd_log.string_with_context( fnd_log.level_procedure,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
143 END IF;
144 
145 RETURN l_tokenArray;
146 End getTokens;
147 
148 
149 PROCEDURE BulkSecAssignment(
150  retValue out NOCOPY number,
151  orgUnitStr IN varchar2,
152  locStr IN varchar2,
153  pgmStr IN varchar2,
154  unitMdStr IN varchar2,
155  userRolesStr_one IN varchar2,
156  userRolesStr_two IN varchar2,
157  prsnGrpStr IN varchar2)
158  IS
159  ------------------------------------------------------------------
160   --Updated by  : ssawhney, Oracle India
161   --Date created:  27-MAY-2001
162   --
163   --Purpose: This Procedure will carry out the Bulk Assignment of user Attributes
164   --         Does a submit request. Called by SS Page.
165   --
166   --Change History:
167   --who                 when                  what
168   --skpandey            08-SEP-2005           Bug: 4583789
169   --                                          Description: Corrected spelling
170 ------------------------------------------------------------------
171 
172 BEGIN
173  /* Debug */
174 IF fnd_log.test(fnd_log.level_procedure,l_prog_label) THEN
175      l_label := 'igs.plsql.igs_sc_bulk_assign.BulkSecAssignment';
176      l_debug_str :=  'Entering BulkSecAssignment parameter values:'||
177 		     'Org  Unit: '||orgUnitStr||','||
178 		     'Location: '||locStr||','||
179 		     'Program Type: '||pgmStr||','||
180 		     'Unit Mode: '||unitMdStr||','||
181 		     'User Roles Str1: '||userRolesStr_one||','||
182 		     'User Roles Str2: '||userRolesStr_two||','||
183 		     'Person Group: '||prsnGrpStr;
184             fnd_log.string_with_context( fnd_log.level_procedure,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
185   END IF;
186   retValue := fnd_request.submit_request('IGS','IGSSCJ01','Bulk Security Attributes Assignment',NULL,false,
187                orgUnitStr,locStr,pgmStr,unitMdStr,userRolesStr_one,userRolesStr_two,prsnGrpStr);
188 
189   /* Debug */
190 IF fnd_log.test(fnd_log.level_procedure,l_prog_label) THEN
191   l_label := 'igs.plsql.igs_sc_bulk_assign.BulkSecAssignment';
192   l_debug_str := 'Exiting BulkSecAssignment. retValue is '||retValue;
193   fnd_log.string_with_context( fnd_log.level_procedure,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
194 END IF;
195 
196 END BulkSecAssignment;
197 
198 PROCEDURE ASSIGN_USER_ATTRIBUTES (
199           ERRBUF out NOCOPY VARCHAR2,
200           RETCODE out NOCOPY NUMBER,
201           P_ORGUNIT_STR IN VARCHAR2 DEFAULT NULL,
202           P_LOCATIONS_STR IN VARCHAR2 DEFAULT NULL,
203           P_PGMTYPES_STR IN VARCHAR2 DEFAULT NULL,
204           P_UNITMODE_STR IN VARCHAR2 DEFAULT NULL,
205           P_USERROLES_STR_ONE IN VARCHAR2 DEFAULT NULL,
206           P_USERROLES_STR_TWO IN VARCHAR2 DEFAULT NULL,
207           P_PRSNGRP_STR IN VARCHAR2) IS
208  ------------------------------------------------------------------
209   --Updated by  : ssawhney, Oracle India
210   --Date created:  27-MAY-2001
211   --
212   --Purpose: Called by SRS Conc Job
213   --
214   --Change History:
215   --gmaheswa	5-Jan-2004	Bug 4869737 Added a call to SET_ORG_ID to disable OSS for R12.
216   --gmaheswa      17-Jan-06        4938278: disable Business Events before starting bulk import process and enable after import.
217 ------------------------------------------------------------------
218     l_org_unit_array StrArray;
219     l_locations_array StrArray;
220     l_pgmtypes_array StrArray;
221     l_unitmd_array StrArray;
222     loc_prsnGrp_array StrArray;
223 
224     l_GrpId igs_pe_persid_group_v.group_id%TYPE;
225     l_User_Id NUMBER;
226     l_sec_User_id NUMBER;
227     l_rowId VARCHAR2(500);
228     l_DupId NUMBER;
229     l_user_name VARCHAR2(320);
230     l_sec_User_Name VARCHAR2(320);
231     l_return_Status VARCHAR2(10);
232     l_return_message VARCHAR2(500);
233     --l_role_id NUMBER;
234     l_role_name VARCHAR2(1000);
235     l_last_update_date Date := Sysdate;
236     l_Ret_Status VARCHAR2(100);
237     l_msg_count NUMBER;
238     l_msg_data VARCHAR2(500);
239     l_party_rel_id VARCHAR2(100);
240     l_party_id NUMBER;
241     l_party_number NUMBER;
242     l_object_version NUMBER;
243     L_select VARCHAR2(32767);
244     l_status VARCHAR2(1);
245     L_str VARCHAR2(32000);
246     l_Inf_date VARCHAR2(11);
247     l_user_roles_param VARCHAR2(4000);
248     l_group_type IGS_PE_PERSID_GROUP_V.group_type%TYPE;
249 
250 CURSOR Fnd_User_Check_C(Prsn_id	NUMBER)	IS
251 SELECT user_id,user_name, customer_id, employee_id
252 FROM FND_USER
253 WHERE Person_party_id = Prsn_id AND
254 SYSDATE BETWEEN START_DATE AND NVL(END_DATE,SYSDATE+1);
255 
256 CURSOR IGS_SC_DUP_C(prsnId NUMBER,usrAttrId NUMBER,usrAttrVal VARCHAR2) IS
257 SELECT 1
258 FROM IGS_SC_PER_ATTR_VALS
259 WHERE person_id = prsnId AND
260 user_attrib_id = usrAttrId AND
261 user_attrib_value = usrAttrVal;
262 
263 CURSOR DUP_ROLES_CHK_C(UserId NUMBER,RoleName VARCHAR2,RolrOrgSystem VARCHAR2,
264 		RoleOrgSysId NUMBER, UsrOrgSystem VARCHAR2,UsrName VARCHAR2) IS
265 SELECT 1, START_DATE /*while assigning roles check if person is associated with mul FND USER */
266 FROM WF_LOCAL_USER_ROLES
267 WHERE user_orig_system_id =UserId AND
268       user_name=UsrName AND
269       role_name= RoleName AND
270       user_orig_system = UsrOrgSystem AND
271       role_orig_system = RolrOrgSystem AND
272       role_orig_system_id = RoleOrgSysId; -- and partition_id IS NOT NULL
273 
274 CURSOR GET_ROLE_NAME_C(RoleId NUMBER) IS
275 SELECT NAME
276 FROM WF_LOCAL_ROLES
277 WHERE
278 ORIG_SYSTEM_ID = RoleId AND
279 ORIG_SYSTEM ='IGS'
280 AND partition_id=0 ;  -- non registered orig systems are stored in partion 0
281 
282 CURSOR DUP_ORGUNIT_CHECK_C(PrsnId NUMBER,OrgId NUMBER,RelCode VARCHAR2,DFLAG VARCHAR2) IS
283 Select 1
284 from HZ_RELATIONSHIPS
285 WHERE
286    SUBJECT_ID = PrsnId AND
287    OBJECT_ID = OrgId AND
288    object_type = 'ORGANIZATION' AND
289    subject_type = 'PERSON' AND
290    RELATIONSHIP_CODE = 'EMPLOYEE_OF'
291    AND SYSDATE BETWEEN START_DATE AND NVL(END_DATE,SYSDATE+1)
292    AND DIRECTIONAL_FLAG='F';
293 
294 CURSOR get_person_num (cp_prsnId NUMBER) IS
295 SELECT party_number
296 FROM hz_parties
297 WHERE party_id=cp_prsnId;
298 
299  TYPE cur_query IS REF CURSOR;
300  c_cur_query cur_query;
301 
302  TYPE rec_query IS RECORD (
303           person_id     NUMBER(30)
304           );
305 r_rec_query rec_query;
306 l_DupStartDate Date;
307 l_start_date Date;
308 l_cust_id number;
309 l_emp_id number;
310 l_sec_cust_id number;
311 l_sec_emp_id number;
312 l_role_exists varchar2(1);
313 --s binary_integer ;
314 l_roles WF_DIRECTORY.RoleTable ;
315 l_wf_orig_id number;
316 l_wf_orig_ref wf_local_roles.orig_system%type;
317 l_person_num igs_pe_person.person_number%type;
318 
319 BEGIN
320 
321 igs_ge_gen_003.set_org_id;
322 
323 --Disable Business Event before running Bulk Process
324 IGS_PE_GEN_003.TURNOFF_TCA_BE (
325       P_TURNOFF  => 'Y'
326 );
327 
328 	 /* Debug */
329 IF fnd_log.test(fnd_log.level_procedure,l_prog_label) THEN
330      l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
331      l_debug_str :=  'Entering assign_user_attributes parameter values:'||
332 		     'Org  Unit: '||P_ORGUNIT_STR||','||
333 		     'Location: '||P_LOCATIONS_STR||','||
334 		     'Program Type: '||P_PGMTYPES_STR||','||
335 		     'Unit Mode: '||P_UNITMODE_STR||','||
336 		     'User Roles Str1: '||P_USERROLES_STR_ONE||','||
337 		     'User Roles Str2: '||P_USERROLES_STR_TWO||','||
338 		     'Person Group: '||P_PRSNGRP_STR;
339      fnd_log.string_with_context( fnd_log.level_procedure,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
340   END IF;
341 
342 	RETCODE :=0;
343 	/* Now we have all the person Grp Code */
344 
345 	l_user_roles_param :=P_USERROLES_STR_ONE||P_USERROLES_STR_TWO;
346 	loc_prsnGrp_array := getTokens(P_PRSNGRP_STR);
347 
348 	IF P_ORGUNIT_STR IS NOT	NULL THEN
349 		l_org_unit_array := getTokens(P_ORGUNIT_STR);
350 	END IF;
351 
352 	IF P_LOCATIONS_STR IS NOT NULL THEN
353 		l_locations_array := getTokens(P_LOCATIONS_STR);
354 	END IF;
355 
356 	IF P_PGMTYPES_STR IS NOT NULL THEN
357 		l_pgmtypes_array := getTokens(P_PGMTYPES_STR);
358 	END IF;
359 
360 	IF P_UNITMODE_STR IS NOT NULL THEN
361 		l_unitmd_array := getTokens(P_UNITMODE_STR);
362 	END IF;
363 
364 	IF l_user_roles_param IS NOT NULL THEN
365 		l_usrroles_array := StrArray();
366 		l_startdate_array:= DateArray();
367 		l_enddate_array := DateArray();
368 		PopulateRolesArray(l_user_roles_param);
369 	END IF;
370 
371 
372 	FOR j IN 1..loc_prsnGrp_array.COUNT
373 	LOOP
374 		l_GrpId	:= loc_prsnGrp_array(j);
375 
376 		/* get the person id corresponding to user belonging to	the grp	and assigned them following attributes */
377 		l_select :=igs_pe_dynamic_persid_group.get_dynamic_sql(l_GrpId, l_status, l_group_type);
378 
379 		IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
380 		  l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
381 		  l_debug_str := 'Person Group Array. Dynamic Person Group select is '||l_select ;
382 		  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
383 		END IF;
384 
385 		IF l_status <> 'S' THEN
386 		    FND_MESSAGE.SET_NAME('IGF','IGF_AW_NO_QUERY');
387 		    FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
388 		    RAISE NO_DATA_FOUND;
389 		END IF;
390 
391 	--skpandey, Bug#4937960: Added logic as a part of Literal Fix
392 	   IF l_group_type = 'STATIC' THEN
393 	    OPEN c_cur_query FOR L_select USING l_GrpId;
394 	   ELSIF l_group_type = 'DYNAMIC' THEN
395 	    OPEN c_cur_query FOR L_select;
396 	   END IF;
397 		LOOP
398  		  FETCH c_cur_query INTO r_rec_query;
399 		  EXIT WHEN c_cur_query%NOTFOUND;
400 		 /* Check Whether user id FND USER otherwise put a error msg in	the error log and skip assignment */
401 		  OPEN Fnd_User_Check_C(r_rec_query.Person_id);
402 		  FETCH Fnd_User_Check_C INTO l_User_Id,l_user_name, l_cust_id, l_emp_id;
403 
404 		  IF Fnd_User_Check_C%FOUND THEN
405 			/* IF User is a	FND USER then carry out	the assignment*/
406 
407 			--IMP logic --simran.
408 			IF l_emp_id IS NOT NULL and l_cust_id IS NULL THEN
409 			   l_wf_orig_id := l_emp_id;
410 			   l_wf_orig_ref:= 'PER';
411 			ELSIF    l_cust_id IS NOT NULL and (l_cust_id = r_rec_query.Person_id) THEN
412 			   l_wf_orig_id := l_User_Id;
413 			   l_wf_orig_ref:= 'FND_USR';
414 			END IF;
415 
416 			IF l_org_unit_array IS NOT NULL THEN
417 
418   			  /*Now iterate through the array to insert record into HZ_RELATIONSHIP */
419 			  FOR i IN 1..l_org_unit_array.COUNT
420 			  LOOP
421 
422 			    /* First check whether this attribute already exist */
423 			    OPEN DUP_ORGUNIT_CHECK_C(r_rec_query.Person_id,l_org_unit_array(i),'EMPLOYEE_OF','F');
424 			    FETCH DUP_ORGUNIT_CHECK_C INTO l_DupId;
425 
426 			    IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
427 				  l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
428 				  l_debug_str := 'Inside assign_user_attributes. l_org_unit_array(i) is '||l_org_unit_array(i) ;
429 				  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
430 			     END IF;
431 
432 			    IF DUP_ORGUNIT_CHECK_C%NOTFOUND THEN
433 
434 				IGS_PE_RELATIONSHIPS_PKG.CREATUPDATE_PARTY_RELATIONSHIP(
435 				   p_action  				=> 'INSERT',
436 				   p_subject_id				=> r_rec_query.Person_id,
437 				   p_object_id				=> l_org_unit_array(i),
438 				   p_party_relationship_type		=> 'EMPLOYMENT',
439 				   p_relationship_code		=> 'EMPLOYEE_OF',
440 				   p_comments				=> NULL,
441 				   p_start_date				=> trunc(SYSDATE),
442 				   p_end_date				=> null,
443 				   p_last_update_date		=> l_last_update_date,
444 				   p_return_status			=> l_Ret_Status,
445 				   p_msg_count				=> l_msg_count,
446 				   p_msg_data				=> l_msg_data,
447 				   p_party_relationship_id	=> l_party_rel_id,
448 				   p_party_id				=> l_party_id,
449 				   p_party_number			=> l_party_number,
450 				   p_caller				    => 'NOT_FAMILY',
451 				   P_Object_Version_Number	=> l_object_version,
452 				   P_Primary				=> null,
453 				   P_Secondary				=> null,
454 				   P_Joint_Salutation		=> null,
455 				   P_Next_To_Kin			=> null,
456 				   P_Rep_Faculty			=> null,
457 				   P_Rep_Staff				=> null,
458 				   P_Rep_Student			=> null,
459 				   P_Rep_Alumni				=> null,
460 				   p_directional_flag		=> 'F');
461 
462     				IF l_return_status IN ('E' , 'U') THEN
463 					FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
464 					RAISE NO_DATA_FOUND;
465 				END IF;
466 
467 			    END IF;  -- DUP_ORGUNIT_CHECK_C%NOTFOUND
468 			    CLOSE DUP_ORGUNIT_CHECK_C;
469 		          END LOOP;  -- l_org_unit_array.COUNT
470    		        END IF; -- l_org_unit_array
471 
472 		        IF l_locations_array IS NOT NULL THEN
473 
474 				/*Now iterate through Locations array to insert record into igs_sc_per_attr_vals */
475 			  FOR i IN 1..l_locations_array.COUNT
476 			  LOOP
477 				/* First check that user does not have this attribute already assigned */
478 				OPEN IGS_SC_DUP_C(r_rec_query.Person_id,6,l_locations_array(i));
479 				FETCH IGS_SC_DUP_C INTO l_DupId;
480 
481 				 IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
482 				  l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
483 				  l_debug_str := 'Inside assign_user_attributes. l_locations_array(i) is '||l_locations_array(i) ;
484 				  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
485 				END IF;
486 
487 				IF IGS_SC_DUP_C%NOTFOUND THEN
488 				   IGS_SC_PER_ATTR_VALS_PKG.INSERT_ROW(
489 					    x_rowid => l_rowId,
490 					    x_person_id =>r_rec_query.Person_id,
491 					    x_user_attrib_id => 6,
492 					    x_user_attrib_value => l_locations_array(i)
493 					   );
494 				END IF;
495 				CLOSE IGS_SC_DUP_C;
496 			  END LOOP;
497 		        END IF;  -- l_locations_array
498 
499 			IF l_pgmtypes_array IS NOT NULL THEN
500 				/*Now iterate through PgmTypes array to insert record into igs_sc_per_attr_vals */
501 				for i IN 1..l_pgmtypes_array.COUNT
502 				LOOP
503 				   OPEN IGS_SC_DUP_C(r_rec_query.Person_id,7,l_pgmtypes_array(i));
504 				   FETCH IGS_SC_DUP_C INTO l_DupId;
505 
506 				   IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
507 					  l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
508 					  l_debug_str := 'Inside assign_user_attributes. l_pgmtypes_array(i) is '||l_pgmtypes_array(i) ;
509 					  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
510 				   END IF;
511 
512 				   IF IGS_SC_DUP_C%NOTFOUND THEN
513 					IGS_SC_PER_ATTR_VALS_PKG.INSERT_ROW(
514 					    x_rowid => l_rowId,
515 					    x_person_id =>r_rec_query.Person_id,
516 					    x_user_attrib_id => 7,
517 					    x_user_attrib_value => l_pgmtypes_array(i)
518 					   );
519 				   END IF;
520 				   CLOSE IGS_SC_DUP_C;
521                			END LOOP;
522 			END IF; -- l_pgmtypes_array
523 
524 			IF l_unitmd_array IS NOT NULL THEN
525 				/*Now iterate through Unit Md array to insert record into igs_sc_per_attr_vals */
526 				FOR i IN 1..l_unitmd_array.COUNT
527 				LOOP
528 				   OPEN IGS_SC_DUP_C(r_rec_query.Person_id,8,l_unitmd_array(i));
529 				   FETCH IGS_SC_DUP_C INTO l_DupId;
530 
531 				   IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
532 					  l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
533 					  l_debug_str := 'Inside assign_user_attributes. l_unitmd_array(i) is '||l_unitmd_array(i) ;
534 					  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
535 				   END IF;
536 
537 				   IF IGS_SC_DUP_C%NOTFOUND THEN
538 					IGS_SC_PER_ATTR_VALS_PKG.INSERT_ROW(
539 					    x_rowid => l_rowId,
540 					    x_person_id =>r_rec_query.Person_id,
541 					    x_user_attrib_id => 8,
542 					    x_user_attrib_value => l_unitmd_array(i)
543 					   );
544 				   END IF;
545 				   CLOSE IGS_SC_DUP_C;
546 				END LOOP;
547 			END IF;
548 
549 			IF l_usrroles_array IS NOT NULL THEN
550 			/*First check if the user has multiple FND USer associated since cursor is already open-refetch it. */
551 			FETCH Fnd_User_Check_C INTO l_sec_User_Id,l_sec_User_Name,l_sec_cust_id, l_sec_emp_id;
552 
553                         --skpandey.Bug: 4583789
554 			IF Fnd_User_Check_C%FOUND THEN
555 			    OPEN get_person_num (r_rec_query.Person_Id);
556 			    FETCH get_person_num INTO l_person_num;
557 			    CLOSE get_person_num;
558          		    FND_MESSAGE.SET_NAME('IGS','IGS_SC_MUL_FND_USER');
559 			    FND_MESSAGE.SET_TOKEN('PERS_NUM',l_person_num);
560 	        	    FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
561 			ELSE
562 
563 			/*Now iterate through UserRoles array to insert record into wf_local_user_roles */
564 			FOR i IN 1..l_usrroles_array.COUNT
565 			LOOP
566 				IF l_enddate_array(i) IS NULL THEN
567 					l_Inf_date := null ;  --remove the logic for infinite date.
568 				--l_Inf_date := igs_ge_date.igsdate(igs_ge_date.igschar('4712/12/31')) ; -- cannonical format is rrrr/mm/dd ;
569 				ELSE
570 					l_Inf_date :=igs_ge_date.igsdate((l_enddate_array(i) ));
571 				END IF;
572 
573 				IF l_enddate_array(i) IS NOT NULL THEN
574 					l_start_date:=igs_ge_date.igsdate((l_startdate_array(i) ));
575 				END IF;
576 
577 				-- IMP: FND_USER has cust_id , person_party_id and emp_id. If person is from HZ the cust = pp_id
578 				-- If person is from HR then cust is null and emp_id is not null
579 				-- User WF APIs to verify if the user has any roles. First Check if user already has this role associated
580 				-- get the role name, note its an igs role, so partion would be 0.
581 
582 				OPEN GET_ROLE_NAME_C(l_usrroles_array(i));
583 				FETCH GET_ROLE_NAME_C INTO l_role_name;
584 
585 				IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
586 				  l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
587 				  l_debug_str := 'Inside assign_user_attributes. l_usrroles_array(i) is '||l_usrroles_array(i) ;
588 				  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
589 				END IF;
590 
591 				CLOSE GET_ROLE_NAME_C;
592 
593 				l_role_exists :=  'N';
594 				WF_DIRECTORY.GetUserRoles( l_user_name, l_roles) ;
595 				FOR s in 1..l_roles.count LOOP
596 				    IF l_roles(s) = l_role_name THEN
597 				       l_role_exists := 'Y' ;
598 				    END IF;
599 				END LOOP;
600 
601 
602 				IF  l_role_exists = 'Y' THEN
603 				/*Role is already assigned Update the end_date */
604 
605 
606 					IGS_SC_DATA_SEC_APIS_PKG.Update_Local_User_Role(
607 						 p_api_version         => 1.0,
608 						 p_user_name           => l_user_name,
609 						 p_role_name           => l_role_name,
610 						 p_user_orig_system    => l_wf_orig_ref,
611 						 p_user_orig_system_id => l_wf_orig_id,
612 						 p_role_orig_system    => 'IGS',
613 						 p_role_orig_system_id => l_usrroles_array(i),
614 						 p_start_date          => NVL(l_DupStartDate,TRUNC(SYSDATE)),
615 						 p_expiration_date     => l_Inf_date,
616 						 p_security_group_id   => 0,
617 						 x_return_status       => l_return_status,
618 						 x_return_message      => l_return_message);
619 					IF l_return_status IN ('E' , 'U') THEN
620 
621 						FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
622 
623 					END IF;
624 
625 				ELSE
626 
627 					IGS_SC_DATA_SEC_APIS_PKG.Insert_Local_User_Role(
628 						     p_api_version         => 1.0,
629 						     p_user_name           => l_user_name,
630 						     p_role_name           => l_role_name,
631 						     p_user_orig_system    => l_wf_orig_ref,
632 						     p_user_orig_system_id => l_wf_orig_id,
633 						     p_role_orig_system    => 'IGS',
634 						     p_role_orig_system_id => l_usrroles_array(i),
635 						     p_start_date          => trunc(SYSDATE), --sysdate, --l_startdate_array(i),
636 						     p_expiration_date     => l_Inf_date , --sysdate+2, --l_enddate_array(i),
637 						     p_security_group_id   => 0,
638 						     x_return_status       => l_return_status,
639 						     x_return_message      => l_return_message);
640 
641 					IF l_return_status IN ('E' , 'U') THEN
642 
643 						FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
644 						--RAISE NO_DATA_FOUND;
645 					END IF;
646 				END IF;  -- DUP_ROLES_CHK_C%FOUND
647 
648 
649 				--CLOSE DUP_ROLES_CHK_C;
650 			END LOOP;  -- l_usrroles_array
651 			END IF;  -- Fnd_User_Check_C%FOUND
652 		        END IF; -- l_usrroles_array
653 		  ELSE  -- Fnd_User_Check_C%FOUND
654   		        OPEN get_person_num (r_rec_query.Person_Id);
655 		        FETCH get_person_num INTO l_person_num;
656 		        CLOSE get_person_num;
657 		        FND_MESSAGE.SET_NAME('IGS','IGS_SC_NO_FND_USER');
658  		        FND_MESSAGE.SET_TOKEN('PERS_NUM',l_person_num);
659 	        	FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
660 		  END IF; /*END of IF of FND_USER */
661    		  CLOSE Fnd_User_Check_C;
662 
663 		END LOOP; -- c_cur_query
664 	CLOSE c_cur_query;
665 	END LOOP;
666 	/* Debug */
667 	IF fnd_log.test(fnd_log.level_procedure,l_prog_label) THEN
668 	  l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
669 	  l_debug_str := 'Exiting assign_user_attributes.';
670 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
671 	END IF;
672 
673 	--Enable Business Event before quiting Bulk Process
674 	IGS_PE_GEN_003.TURNOFF_TCA_BE (
675              P_TURNOFF  => 'N'
676         );
677 EXCEPTION
678 	WHEN NO_DATA_FOUND THEN
679 	    /* Debug */
680 	      IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
681 		l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
682 		l_debug_str := 'NO_DATA_FOUND exception in assign_user_attributes.'||SQLERRM;
683 		fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
684 	      END IF;
685               --Enable Business Event before quiting Bulk Process
686 	      IGS_PE_GEN_003.TURNOFF_TCA_BE (
687                   P_TURNOFF  => 'N'
688               );
689 	    ROLLBACK;
690 	    retcode := 2;
691 	    errbuf  := FND_MESSAGE.GET_STRING('IGS','IGS_GE_UNHANDLED_EXCEPTION');
692 	    IGS_GE_MSG_STACK.CONC_EXCEPTION_HNDL;
693 
694 	    IF Fnd_User_Check_C%isopen then
695 		     CLOSE Fnd_User_Check_C;
696             END IF;
697 
698 	    IF GET_ROLE_NAME_C%isopen then
699 		     CLOSE GET_ROLE_NAME_C;
700             END IF;
701             IF IGS_SC_DUP_C%isopen then
702 		     CLOSE IGS_SC_DUP_C;
703             END IF;
704 
705 	WHEN OTHERS THEN
706 	    /* Debug */
707 	      IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
708 		l_label := 'igs.plsql.igs_sc_bulk_assign.assign_user_attributes';
709 		l_debug_str := 'Exception in assign_user_attributes.'||SQLERRM;
710 		fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,NULL);
711 	      END IF;
712 
713 	      --Enable Business Event before quiting Bulk Process
714 	      IGS_PE_GEN_003.TURNOFF_TCA_BE (
715                   P_TURNOFF  => 'N'
716               );
717 	    ROLLBACK;
718 	    retcode := 2;
719 	    errbuf  := FND_MESSAGE.GET_STRING('IGS','IGS_GE_UNHANDLED_EXCEPTION');
720 	    IGS_GE_MSG_STACK.CONC_EXCEPTION_HNDL;
721 
722 	    IF Fnd_User_Check_C%isopen then
723 		     CLOSE Fnd_User_Check_C;
724             END IF;
725 
726 	    IF GET_ROLE_NAME_C%isopen then
727 		     CLOSE GET_ROLE_NAME_C;
728             END IF;
729             IF IGS_SC_DUP_C%isopen then
730 		     CLOSE IGS_SC_DUP_C;
731             END IF;
732 
733 END Assign_User_attributes;
734 
735 END IGS_SC_BULK_ASSIGN;
736