DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_EN_TRANSFER_APIS

Source


1 PACKAGE BODY IGS_EN_TRANSFER_APIS AS
2 /* $Header: IGSEN82B.pls 120.18 2006/09/15 09:00:19 bdeviset noship $ */
3 /*-------------------------------------------------------------------------------------------
4    Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
5 
6   --Change History:
7   --Who         When            What
8   --ckasu     20-Nov-2004       modifed cleanup_job by changing order of parameters passed.
9   --ckasu     02-DEC-2004       created as a part of Bug #4044329
10   --bdeviset  02-DEC-2004       Bug# 4044319.Modified validate_src_prgm_unt_attempts.
11   --stutta    10-DEC-2004       Bug#4046782. Removed procedure chk_set_prm_prg_for_src_career
12   --ckasu     11-Dec-2004      modified file as a part of bug# 4061818,4061914
13   --ckasu     20-Dec-2004      modified file as a part of bug# 4063726
14   --bdeviset  22-Dec-2004      Modifed program_transfer_api  as part Bug#4083015.
15   --smaddali  21-dec-04        Modified procedure validate_src_prgm_unt_attempts for bug#4083358
16   --amuthu    23-DEC-2004      Modified the program_transfer_api, to add two validation in career mode
17   -- smaddali 5-jan-2005       Modified procedure program_transfer_api for bug#4103437
18   -- ckasu    07-JAN-2005      Modified code inorder to include person holds and person step
19   --                           validations as a part of bug# 4083552
20   -- bdeviset 21-Mar-2005      Modified update_destination_program procedure for Bug# 4248338, 4248367
21   -- sgurusam 17-Jun-2005      Modified validate_person_steps procedure for EN317FD
22   -- bdeviset 20-OCT-2005      Modified validate_src_prgm_unt_attempts procedure for bug# 4691498
23   -- stutta   26-Nov-2005      Created procedure val_unchk_sub_units and added call. Bug #4763202
24   -- ckasu    08-DEC-2005     passed SYSDATE for update_source instead of p_actual_date param
25   --                           as part of bug#4869869
26   -- ckasu    17-JAN-2006     Added igs_ge_gen_003.set_org_id(NULL) in CLEANUP_JOB procedure
27   --                          as a part of bug#4958173
28   -- ckasu     06-MAR-2006     added new cursor c_get_enr_method_type as a part of bug#5070732 in
29   --                           validate_prgm_attend_type_step Procedure
30 
31   -------------------------------------------------------------------------------------------*/
32 
33 
34    g_pkg_name    CONSTANT VARCHAR2(30) := 'IGS_EN_TRANSFER_APIS';
35    g_debug_level CONSTANT NUMBER  := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
36    g_transfer_dt  DATE;
37   FUNCTION is_career_model_enabled RETURN BOOLEAN AS
38   -------------------------------------------------------------------------------------------
39   --Created by  : Chandrasekhar Kasu, Oracle IDC
40   --Date created: 20-Nov-2004
41   -- Purpose : returns True when Career model  is  enabled  else False.
42   --Change History:
43   --Who         When            What
44 
45   -------------------------------------------------------------------------------------------
46   BEGIN
47 
48     IF NVL(FND_PROFILE.VALUE('CAREER_MODEL_ENABLED'),'N') =  'Y' THEN
49       RETURN TRUE;
50     ELSE
51       RETURN FALSE;
52     END IF;
53 
54   END is_career_model_enabled;
55 
56   PROCEDURE parse_messages( p_message_names IN VARCHAR2) AS
57 
58     l_strtpoint_msg NUMBER;
59     l_endpoint_msg  NUMBER;
60     l_cindex_msg    NUMBER;
61     l_pre_cindex_msg NUMBER;
62     l_nth_occurence_msg NUMBER;
63     l_messages_str  VARCHAR2(2000);
64     l_message_name  VARCHAR2(100);
65     l_messg_and_unitcd_sep NUMBER;
66     l_unit_cd       VARCHAR2(100);
67 
68   BEGIN
69 
70     l_strtpoint_msg      :=  0;
71     l_pre_cindex_msg     :=  0;
72     l_nth_occurence_msg  :=  1;
73     l_messages_str := p_message_names||';';
74     l_cindex_msg := INSTR(l_messages_str,';',1,l_nth_occurence_msg);
75 
76     WHILE (l_cindex_msg <> 0 )  LOOP
77 
78         l_strtpoint_msg  :=  l_pre_cindex_msg + 1;
79         l_endpoint_msg   :=  l_cindex_msg - l_strtpoint_msg;
80         l_pre_cindex_msg :=  l_cindex_msg;
81         l_message_name := substr(l_messages_str,l_strtpoint_msg,l_endpoint_msg);
82         l_messg_and_unitcd_sep := INSTR(l_message_name,'*',1,1);
83 
84         IF l_messg_and_unitcd_sep <> 0 THEN
85            l_unit_cd      := substr(l_message_name,l_messg_and_unitcd_sep + 1,(l_cindex_msg-l_messg_and_unitcd_sep-1));
86                l_message_name := substr(l_message_name,1,l_messg_and_unitcd_sep - 1);
87                FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
88                FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_cd);
89            FND_MSG_PUB.ADD;
90         ELSE
91            FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
92            FND_MSG_PUB.ADD;
93         END IF;
94 
95         l_nth_occurence_msg := l_nth_occurence_msg + 1;
96         l_cindex_msg := INSTR(l_messages_str,';',1,l_nth_occurence_msg);
97 
98     END LOOP; -- end of l_cindex_msg <> 0  LOOP
99 
100   END parse_messages;
101 
102   PROCEDURE is_destn_prgm_att_discon(
103       p_person_id               IN   NUMBER,
104       p_dest_program_cd         IN   VARCHAR2,
105       p_dest_prog_ver           IN   NUMBER,
106       p_status                  OUT  NOCOPY BOOLEAN
107   ) AS
108 
109   -------------------------------------------------------------------------------------------
110   --Created by  : Chandrasekhar Kasu, Oracle IDC
111   --Date created: 20-Nov-2004
112   -- Purpose : Returns True when destination Program attempt is discontinued else False
113   --Change History:
114   --Who         When            What
115 
116   -------------------------------------------------------------------------------------------
117 
118     l_val  VARCHAR2(10);
119     CURSOR c_get_prgm_att_status IS
120        Select 'Y'
121        From   IGS_EN_STDNT_PS_ATT_ALL
122        Where  person_id = p_person_id and
123               course_cd =  p_dest_program_cd and
124               version_number =  p_dest_prog_ver and
125               course_attempt_status  = 'DISCONTIN';
126 
127     BEGIN
128      OPEN c_get_prgm_att_status;
129      FETCH c_get_prgm_att_status  INTO l_val;
130      IF (c_get_prgm_att_status%FOUND) THEN
131        CLOSE c_get_prgm_att_status;
132        p_status := TRUE;
133      ELSE
134        CLOSE c_get_prgm_att_status;
135        p_status := FALSE;
136      END IF;
137 
138   END is_destn_prgm_att_discon;
139 
140 
141   PROCEDURE update_destination_prgm(
142     p_person_id              IN   NUMBER,
143     p_src_course_cd          IN   VARCHAR2,
144     p_course_cd              IN   VARCHAR2,
145     p_new_dest_key_flag      IN OUT NOCOPY  VARCHAR2,
146     p_stdnt_confrm_ind       IN   VARCHAR2,
147     p_dest_fut_dt_trans_flag IN   VARCHAR2,
148     p_dest_commence_dt       IN   DATE,
149     p_tran_across_careers    IN   BOOLEAN,
150     p_term_cal_type           IN   VARCHAR2,
151     p_term_seq_num            IN   NUMBER
152   ) AS
153   -------------------------------------------------------------------------------------------
154   --Created by  : Chandrasekhar Kasu, Oracle IDC
155   --Date created: 20-Nov-2004
156   -- Purpose : This Procedure is used to update the destination program  during transfer
157   --Change History:
158   --Who         When            What
159   --stutta    10-DEC-2004   Removed setting/unsetting of global. It is set in program_trasfer
160   --                        _api, before the call to this procedure. Calculating the program
161   --                        attempt status and sending it in all ps_att update row call. Bug #4046782
162  -- bdeviset 21-Mar-2005    Modified update_destination_program procedure for Bug# 4248338, 4248367.
163  --                         As start date is disabled in transfer page assinging the dest program
164  --                         comm dt to src program comm dt so that the user encounters no errors
165  --                         while transferring units from src to dest.
166  -- stutta  26-Sep-2005     Added call to create_update_term_rec for bug 4588264
167   --------------------------------------------------------------------------------------------
168     CURSOR c_get_stdnt_ps_att_dtls IS
169        SELECT *
170        FROM IGS_EN_STDNT_PS_ATT
171        WHERE person_id = p_person_id AND
172              course_cd = p_course_cd;
173 
174     CURSOR c_get_discont_reason IS
175        SELECT discontinuation_reason_cd
176        FROM IGS_EN_DCNT_REASONCD
177        WHERE  dcnt_program_ind = 'Y' AND
178               closed_ind   = 'N'     AND
179                   sys_dflt_ind = 'Y'     AND
180               s_discontinuation_reason_type = 'TRANSFER';
181 
182     CURSOR c_get_comm_dt_of_src_prg IS
183        SELECT commencement_dt
184        FROM IGS_EN_STDNT_PS_ATT
185        WHERE person_id = p_person_id AND
186             course_cd = p_src_course_cd;
187 
188     l_src_commence_dt           IGS_EN_STDNT_PS_ATT.COMMENCEMENT_DT%TYPE;
189     l_course_attempt_status  IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
190     l_discont_reason_code         IGS_EN_DCNT_REASONCD.discontinuation_reason_cd%TYPE;
191     l_stdnt_ps_attempt_dtls_rec  c_get_stdnt_ps_att_dtls%ROWTYPE;
192 	l_key_program_flag      igs_en_spa_terms.key_program_flag%TYPE := FND_API.G_MISS_CHAR;
193 	l_message_name VARCHAR2(2000);
194   BEGIN
195     OPEN  c_get_stdnt_ps_att_dtls;
196     FETCH c_get_stdnt_ps_att_dtls INTO l_stdnt_ps_attempt_dtls_rec;
197     IF (c_get_stdnt_ps_att_dtls%FOUND) THEN
198         IF (p_new_dest_key_flag <> l_stdnt_ps_attempt_dtls_rec.key_program AND p_new_dest_key_flag = 'Y') THEN
199 					l_key_program_flag := p_new_dest_key_flag;
200 	    END IF;
201         IF p_dest_fut_dt_trans_flag = 'S'   THEN
202            -- if it is an immediate transfer then make the dest as primary and key if source is key
203            -- else if source is non key p_new_dest_key_flag contains the old value of destination program
204            l_stdnt_ps_attempt_dtls_rec.key_program := p_new_dest_key_flag;
205            IF is_career_model_enabled THEN
206                 l_stdnt_ps_attempt_dtls_rec.primary_program_type := 'PRIMARY';
207            END IF;
208         ELSIF (p_stdnt_confrm_ind = 'Y' AND l_stdnt_ps_attempt_dtls_rec.student_confirmed_ind = 'N' AND is_career_model_enabled) THEN
209        -- this is to avoid a null value for primary program type when a unconfirmed program attempt
210        -- is the destination program in future dated transfer
211                l_stdnt_ps_attempt_dtls_rec.primary_program_type := 'SECONDARY';
212         END IF;
213 
214         IF p_stdnt_confrm_ind = 'Y' AND l_stdnt_ps_attempt_dtls_rec.commencement_dt IS NULL THEN
215            OPEN c_get_comm_dt_of_src_prg;
216            FETCH c_get_comm_dt_of_src_prg INTO l_src_commence_dt;
217            CLOSE c_get_comm_dt_of_src_prg;
218            l_stdnt_ps_attempt_dtls_rec.commencement_dt := NVL(p_dest_commence_dt,l_src_commence_dt);
219         END IF;
220 
221         l_stdnt_ps_attempt_dtls_rec.course_attempt_status :=
222             igs_en_gen_006.Enrp_Get_Sca_Status(
223                     p_person_id => l_stdnt_ps_attempt_dtls_rec.PERSON_ID,
224                     p_course_cd =>  l_stdnt_ps_attempt_dtls_rec.COURSE_CD,
225                     p_course_attempt_status => l_stdnt_ps_attempt_dtls_rec.course_attempt_status,
226                     p_student_confirmed_ind => p_stdnt_confrm_ind,
227                     p_discontinued_dt => NULL,
228                     p_lapsed_dt => l_stdnt_ps_attempt_dtls_rec.LAPSED_DT,
229                     p_course_rqrmnt_complete_ind => l_stdnt_ps_attempt_dtls_rec.COURSE_RQRMNT_COMPLETE_IND,
230                     p_logical_delete_dt => l_stdnt_ps_attempt_dtls_rec.logical_delete_dt );
231         igs_en_spa_terms_api.set_spa_term_cal_type(P_TERM_CAL_TYPE);
232 		igs_en_spa_terms_api.set_spa_term_sequence_number (p_term_seq_num);
233         IGS_EN_STDNT_PS_ATT_PKG.UPDATE_ROW(
234                       X_ROWID                               => l_stdnt_ps_attempt_dtls_rec.row_id,
235                       X_PERSON_ID                           => l_stdnt_ps_attempt_dtls_rec.PERSON_ID,
236                       X_COURSE_CD                           => l_stdnt_ps_attempt_dtls_rec.COURSE_CD,
237                       X_ADVANCED_STANDING_IND               => l_stdnt_ps_attempt_dtls_rec.ADVANCED_STANDING_IND,
238                       X_FEE_CAT                             => l_stdnt_ps_attempt_dtls_rec.fee_cat,
239                       X_CORRESPONDENCE_CAT                  => l_stdnt_ps_attempt_dtls_rec.correspondence_cat,
240                       X_SELF_HELP_GROUP_IND                 => l_stdnt_ps_attempt_dtls_rec.SELF_HELP_GROUP_IND,
241                       X_LOGICAL_DELETE_DT                   => l_stdnt_ps_attempt_dtls_rec.logical_delete_dt,
242                       X_ADM_ADMISSION_APPL_NUMBER           => l_stdnt_ps_attempt_dtls_rec.adm_admission_appl_number,
243                       X_ADM_NOMINATED_COURSE_CD             => l_stdnt_ps_attempt_dtls_rec.adm_nominated_course_cd,
244                       X_ADM_SEQUENCE_NUMBER                 => l_stdnt_ps_attempt_dtls_rec.adm_sequence_number,
245                       X_VERSION_NUMBER                      => l_stdnt_ps_attempt_dtls_rec.version_number,
246                       X_CAL_TYPE                            => l_stdnt_ps_attempt_dtls_rec.cal_type,
247                       X_LOCATION_CD                         => l_stdnt_ps_attempt_dtls_rec.location_cd,
248                       X_ATTENDANCE_MODE                     => l_stdnt_ps_attempt_dtls_rec.attendance_mode,
249                       X_ATTENDANCE_TYPE                     => l_stdnt_ps_attempt_dtls_rec.attendance_type,
250                       X_COO_ID                              => l_stdnt_ps_attempt_dtls_rec.coo_id,
251                       X_STUDENT_CONFIRMED_IND               => p_stdnt_confrm_ind,
252                       X_COMMENCEMENT_DT                     =>  l_stdnt_ps_attempt_dtls_rec.commencement_dt,
253                       X_COURSE_ATTEMPT_STATUS               => l_stdnt_ps_attempt_dtls_rec.course_attempt_status,
254                       X_PROGRESSION_STATUS                  => l_stdnt_ps_attempt_dtls_rec.PROGRESSION_STATUS,
255                       X_DERIVED_ATT_TYPE                    => l_stdnt_ps_attempt_dtls_rec.DERIVED_ATT_TYPE,
256                       X_DERIVED_ATT_MODE                    => l_stdnt_ps_attempt_dtls_rec.DERIVED_ATT_MODE,
257                       X_PROVISIONAL_IND                     => l_stdnt_ps_attempt_dtls_rec.provisional_ind,
258                       X_DISCONTINUED_DT                     => NULL,
259                       X_DISCONTINUATION_REASON_CD           => NULL,
260                       X_LAPSED_DT                           => l_stdnt_ps_attempt_dtls_rec.LAPSED_DT,
261                       X_FUNDING_SOURCE                      => l_stdnt_ps_attempt_dtls_rec.funding_source,
262                       X_EXAM_LOCATION_CD                    => l_stdnt_ps_attempt_dtls_rec.EXAM_LOCATION_CD,
263                       X_DERIVED_COMPLETION_YR               => l_stdnt_ps_attempt_dtls_rec.DERIVED_COMPLETION_YR,
264                       X_DERIVED_COMPLETION_PERD             => l_stdnt_ps_attempt_dtls_rec.DERIVED_COMPLETION_PERD,
265                       X_NOMINATED_COMPLETION_YR             => l_stdnt_ps_attempt_dtls_rec.nominated_completion_yr,
266                       X_NOMINATED_COMPLETION_PERD           => l_stdnt_ps_attempt_dtls_rec.NOMINATED_COMPLETION_PERD,
267                       X_RULE_CHECK_IND                      => l_stdnt_ps_attempt_dtls_rec.RULE_CHECK_IND,
268                       X_WAIVE_OPTION_CHECK_IND              => l_stdnt_ps_attempt_dtls_rec.WAIVE_OPTION_CHECK_IND,
269                       X_LAST_RULE_CHECK_DT                  => l_stdnt_ps_attempt_dtls_rec.LAST_RULE_CHECK_DT,
270                       X_PUBLISH_OUTCOMES_IND                => l_stdnt_ps_attempt_dtls_rec.PUBLISH_OUTCOMES_IND,
271                       X_COURSE_RQRMNT_COMPLETE_IND          => l_stdnt_ps_attempt_dtls_rec.COURSE_RQRMNT_COMPLETE_IND,
272                       X_COURSE_RQRMNTS_COMPLETE_DT          => l_stdnt_ps_attempt_dtls_rec.COURSE_RQRMNTS_COMPLETE_DT,
273                       X_S_COMPLETED_SOURCE_TYPE             => l_stdnt_ps_attempt_dtls_rec.S_COMPLETED_SOURCE_TYPE,
274                       X_OVERRIDE_TIME_LIMITATION            => l_stdnt_ps_attempt_dtls_rec.OVERRIDE_TIME_LIMITATION,
275                       x_last_date_of_attendance             => l_stdnt_ps_attempt_dtls_rec.last_date_of_attendance,
276                       x_dropped_by                          => l_stdnt_ps_attempt_dtls_rec.dropped_by,
277                       X_IGS_PR_CLASS_STD_ID                 => l_stdnt_ps_attempt_dtls_rec.igs_pr_class_std_id,
278                       x_primary_program_type                => l_stdnt_ps_attempt_dtls_rec.primary_program_type,
279                       x_primary_prog_type_source            => l_stdnt_ps_attempt_dtls_rec.primary_prog_type_source,
280                       x_catalog_cal_type                    => l_stdnt_ps_attempt_dtls_rec.catalog_cal_type,
281                       x_catalog_seq_num                     => l_stdnt_ps_attempt_dtls_rec.catalog_seq_num,
282                       x_key_program                         => l_stdnt_ps_attempt_dtls_rec.key_program,
283                       x_override_cmpl_dt                    => l_stdnt_ps_attempt_dtls_rec.override_cmpl_dt,
284                       x_manual_ovr_cmpl_dt_ind              => l_stdnt_ps_attempt_dtls_rec.manual_ovr_cmpl_dt_ind,
285                       X_MODE                                =>  'R',
286                       X_ATTRIBUTE_CATEGORY                  => l_stdnt_ps_attempt_dtls_rec.attribute_category,
287                       X_ATTRIBUTE1                          => l_stdnt_ps_attempt_dtls_rec.attribute1,
288                       X_ATTRIBUTE2                          => l_stdnt_ps_attempt_dtls_rec.attribute2,
289                       X_ATTRIBUTE3                          => l_stdnt_ps_attempt_dtls_rec.attribute3,
290                       X_ATTRIBUTE4                          => l_stdnt_ps_attempt_dtls_rec.attribute4,
291                       X_ATTRIBUTE5                          => l_stdnt_ps_attempt_dtls_rec.attribute5,
292                       X_ATTRIBUTE6                          => l_stdnt_ps_attempt_dtls_rec.attribute6,
293                       X_ATTRIBUTE7                          => l_stdnt_ps_attempt_dtls_rec.attribute7,
294                       X_ATTRIBUTE8                          => l_stdnt_ps_attempt_dtls_rec.attribute8,
295                       X_ATTRIBUTE9                          => l_stdnt_ps_attempt_dtls_rec.attribute9,
296                       X_ATTRIBUTE10                         => l_stdnt_ps_attempt_dtls_rec.attribute10,
297                       X_ATTRIBUTE11                         => l_stdnt_ps_attempt_dtls_rec.attribute11,
298                       X_ATTRIBUTE12                         => l_stdnt_ps_attempt_dtls_rec.attribute12,
299                       X_ATTRIBUTE13                         => l_stdnt_ps_attempt_dtls_rec.attribute13,
300                       X_ATTRIBUTE14                         => l_stdnt_ps_attempt_dtls_rec.attribute14,
301                       X_ATTRIBUTE15                         => l_stdnt_ps_attempt_dtls_rec.attribute15,
302                       X_ATTRIBUTE16                         => l_stdnt_ps_attempt_dtls_rec.attribute16,
303                       X_ATTRIBUTE17                         => l_stdnt_ps_attempt_dtls_rec.attribute17,
304                       X_ATTRIBUTE18                         => l_stdnt_ps_attempt_dtls_rec.attribute18,
305                       X_ATTRIBUTE19                         => l_stdnt_ps_attempt_dtls_rec.attribute19,
306                       X_ATTRIBUTE20                         => l_stdnt_ps_attempt_dtls_rec.attribute20,
307                       X_FUTURE_DATED_TRANS_FLAG             => p_dest_fut_dt_trans_flag);
308 		      igs_en_spa_terms_api.set_spa_term_cal_type(NULL);
309 		      igs_en_spa_terms_api.set_spa_term_sequence_number (NULL);
310                       IF p_dest_fut_dt_trans_flag = 'S'   THEN
311                                 igs_en_spa_terms_api.create_update_term_rec(p_person_id => l_stdnt_ps_attempt_dtls_rec.PERSON_ID,
312                                                           p_program_cd => l_stdnt_ps_attempt_dtls_rec.COURSE_CD,
313                                                           p_term_cal_type => P_TERM_CAL_TYPE,
314                                                           p_term_sequence_number => p_term_seq_num,
315                                                           p_key_program_flag => l_key_program_flag,
316                                                           p_program_changed => TRUE,
317                                                           p_ripple_frwrd => TRUE,
318                                                           p_message_name => l_message_name,
319                                                           p_update_rec => TRUE);
320                      END IF;
321 
322 
323         END IF; -- end of c_get_stdnt_ps_att_dtls%FOUND)
324 
325     CLOSE c_get_stdnt_ps_att_dtls;
326 
327     EXCEPTION
328 
329        WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
330             --allow calls before dml and after dml to this package from igs_en_stdnt_ps_att_pkg to fire
331             IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml :=  FALSE ;
332             igs_en_spa_terms_api.set_spa_term_cal_type(NULL);
333             igs_en_spa_terms_api.set_spa_term_sequence_number (NULL);
334             RAISE;
335        WHEN FND_API.G_EXC_ERROR THEN
336             IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml :=  FALSE ;
337 	    igs_en_spa_terms_api.set_spa_term_cal_type(NULL);
338 	    igs_en_spa_terms_api.set_spa_term_sequence_number (NULL);
339 
340             RAISE;
341        WHEN OTHERS THEN
342             --allow calls before dml and after dml to this package from igs_en_stdnt_ps_att_pkg to fire
343             IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml :=  FALSE ;
344 	    igs_en_spa_terms_api.set_spa_term_cal_type(NULL);
345 	    igs_en_spa_terms_api.set_spa_term_sequence_number (NULL);
346             Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
347             FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.update_destination_prgm');
348             IGS_GE_MSG_STACK.ADD;
349             IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
350                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.update_destination_prgm :',SQLERRM);
351             END IF;
352             App_Exception.Raise_Exception;
353 
354   END update_destination_prgm;
355 
356 
357   PROCEDURE set_dest_prgm_att_params(
358      p_person_id              IN   NUMBER,
359      p_src_program_cd         IN   VARCHAR2,
360      p_term_cal_type          IN   VARCHAR2,
361      p_term_seq_num           IN   NUMBER,
362      p_dest_primary_prg_type  IN OUT NOCOPY VARCHAR2,
363      p_dest_key_prgm_flag     IN OUT NOCOPY VARCHAR2,
364      p_dest_commence_dt       IN OUT NOCOPY DATE,
365      p_dest_fut_dt_trans_flag IN OUT NOCOPY VARCHAR2,
366      p_transfer_re            IN   VARCHAR2
367 
368     )AS
369   -------------------------------------------------------------------------------------------
370   --Created by  : Chandrasekhar Kasu, Oracle IDC
371   --Date created: 20-Nov-2004
372   -- Purpose : This procedure is used to set the destination program attempt key program
373   --           parameter and future dated transfer flag respectively.
374   --Change History:
375   --Who         When            What
376   --somasekar   13-apr-2005     bug# 4179106 modified to set the future date
377   --                                 transfer sucessful to 'S'
378   -------------------------------------------------------------------------------------------
379 
380    /*  This function sets the Destination Program Key Program value, future date
381        transfer flag and destination Primary program Type.
382        In Career mode    destination Primary program Type = 'Y' and key program = Y
383        when source key program = 'Y' else set destination program  key program = Y
384 
385    */
386 
387     l_begin_trans_dt_alias      IGS_EN_CAL_CONF.BEGIN_TRANS_DT_ALIAS%TYPE;
388     l_begin_trans_dt_alias_val  DATE;
389     l_src_key_prgm              IGS_EN_STDNT_PS_ATT.KEY_PROGRAM%TYPE;
390     l_src_commence_dt           IGS_EN_STDNT_PS_ATT.COMMENCEMENT_DT%TYPE;
391     CURSOR c_get_key_val_frm_src_prg IS
392        SELECT key_program,commencement_dt
393        FROM IGS_EN_STDNT_PS_ATT
394        WHERE person_id = p_person_id AND
395             course_cd = p_src_program_cd;
396     CURSOR c_get_begin_trans_dt_alias IS
397        SELECT begin_trans_dt_alias
398        FROM IGS_EN_CAL_CONF
399        WHERE s_control_num = 1;
400     CURSOR c_get_begin_trans_dt_alias_val(c_begin_dt_alias IGS_EN_CAL_CONF.BEGIN_TRANS_DT_ALIAS%TYPE) IS
401        SELECT ALIAS_VAL
402        FROM IGS_CA_DA_INST_V
403        WHERE dt_alias =  c_begin_dt_alias AND
404             cal_type = p_term_cal_type AND
405             ci_sequence_number = p_term_seq_num;
406 
407 
408   BEGIN
409 
410     IF (is_career_model_enabled) THEN
411         p_dest_primary_prg_type := 'PRIMARY';
412     END IF;
413     OPEN c_get_key_val_frm_src_prg;
414     FETCH c_get_key_val_frm_src_prg INTO l_src_key_prgm,l_src_commence_dt;
415     CLOSE c_get_key_val_frm_src_prg;
416 
417     IF l_src_key_prgm = 'Y' THEN
418           p_dest_key_prgm_flag := 'Y';
419     END IF;
420 
421     IF p_transfer_re = 'Y' THEN
422        IF p_dest_commence_dt <> l_src_commence_dt  THEN
423           p_dest_commence_dt := l_src_commence_dt;
424        END IF;
425     END IF;-- end of p_transfer_re = Y IF THEN
426 
427     OPEN c_get_begin_trans_dt_alias;
428     FETCH c_get_begin_trans_dt_alias INTO l_begin_trans_dt_alias;
429     IF c_get_begin_trans_dt_alias%FOUND AND  l_begin_trans_dt_alias IS NOT NULL  THEN
430        CLOSE c_get_begin_trans_dt_alias;
431        OPEN c_get_begin_trans_dt_alias_val(l_begin_trans_dt_alias);
432        FETCH c_get_begin_trans_dt_alias_val INTO l_begin_trans_dt_alias_val;
433        CLOSE c_get_begin_trans_dt_alias_val;
434        IF l_begin_trans_dt_alias_val > TRUNC(SYSDATE) THEN
435           p_dest_fut_dt_trans_flag := 'Y';
436        ELSIF l_begin_trans_dt_alias_val <= TRUNC(SYSDATE) THEN
437              p_dest_fut_dt_trans_flag := 'S';
438        ELSIF l_begin_trans_dt_alias_val IS NULL THEN
439              p_dest_fut_dt_trans_flag := 'S';
440        END IF;
441        RETURN;
442     ELSE
443       CLOSE c_get_begin_trans_dt_alias;
444       p_dest_fut_dt_trans_flag := 'S';
445       RETURN;
446     END IF;
447 
448    EXCEPTION
449       WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
450            RAISE;
451       WHEN FND_API.G_EXC_ERROR THEN
452            RAISE;
453       WHEN OTHERS THEN
454            Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
455            FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.set_dest_prgm_att_params');
456            IGS_GE_MSG_STACK.ADD;
457            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
458                FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.set_dest_prgm_att_params :',SQLERRM);
459            END IF;
460            App_Exception.Raise_Exception;
461 
462   END set_dest_prgm_att_params;
463 
464    PROCEDURE create_prgm_admin_record (
465      p_person_id              IN   NUMBER,
466      p_src_program_cd         IN   VARCHAR2,
467      p_dest_program_cd        IN   VARCHAR2,
468      p_acad_cal_type          IN   VARCHAR2,
469      p_acad_seq_num           IN   NUMBER
470     ) AS
471   -------------------------------------------------------------------------------------------
472   --Created by  : Chandrasekhar Kasu, Oracle IDC
473   --Date created: 20-Nov-2004
474   -- Purpose : This procedure creates program administration record
475   --Change History:
476   --Who         When            What
477 
478   -------------------------------------------------------------------------------------------
479 
480    l_enr_cal_type    IGS_AS_SC_ATMPT_ENR.CAL_TYPE%TYPE;
481    l_enr_seq_num     IGS_AS_SC_ATMPT_ENR.CI_SEQUENCE_NUMBER%TYPE;
482    l_enr_category    IGS_AS_SC_ATMPT_ENR.ENROLMENT_CAT%TYPE;
483    l_sub_ci_seq_num  IGS_CA_INST_REL.SUB_CI_SEQUENCE_NUMBER%TYPE;
484    l_return_value    BOOLEAN;
485    l_message_name    FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
486 
487    CURSOR c_get_enrolment_cal_type IS
488       SELECT scae.cal_type, scae.ci_sequence_number, scae.enrolment_cat
489       FROM   IGS_AS_SC_ATMPT_ENR scae, IGS_CA_INST ci
490       WHERE  scae.person_id = p_person_id  AND
491                  scae.course_cd = p_src_program_cd AND
492                  ci.cal_type = scae.cal_type AND
493                  ci.sequence_number = scae.ci_sequence_number
494       ORDER BY ci.start_dt DESC;
495 
496   CURSOR c_get_cal_rel_dtl_for_enr_cal (c_enr_cal_type IGS_CA_INST_REL.sub_cal_type%TYPE) IS
497      SELECT cir.sub_ci_sequence_number
498      FROM   IGS_CA_INST_REL cir
499      WHERE  cir.sup_cal_type     = p_acad_cal_type AND
500             cir.sup_ci_sequence_number = p_acad_seq_num AND
501             cir.sub_cal_type     =   c_enr_cal_type;
502 
503   BEGIN
504 
505    OPEN c_get_enrolment_cal_type;
506    FETCH c_get_enrolment_cal_type INTO l_enr_cal_type,l_enr_seq_num,l_enr_category;
507 
508    IF (c_get_enrolment_cal_type%FOUND) THEN
509       CLOSE c_get_enrolment_cal_type;
510       OPEN   c_get_cal_rel_dtl_for_enr_cal(l_enr_cal_type);
511       FETCH  c_get_cal_rel_dtl_for_enr_cal INTO l_sub_ci_seq_num;
512 
513       IF (c_get_cal_rel_dtl_for_enr_cal%FOUND) THEN
514           CLOSE c_get_cal_rel_dtl_for_enr_cal;
515           l_return_value := IGS_EN_GEN_009.ENRP_INS_SCAE_TRNSFR(p_person_id,
516                                                                 p_dest_program_cd,
517                                                                 l_enr_cal_type,
518                                                                 l_sub_ci_seq_num,
519                                                                 l_enr_category,
520                                                                 l_message_name);
521       ELSE
522          CLOSE c_get_cal_rel_dtl_for_enr_cal;
523       END IF;
524    ELSE
525       CLOSE c_get_enrolment_cal_type;
526    END IF; -- end of c_get_enrolment_cal_type%FOUND IF THEN
527 
528    EXCEPTION
529       WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
530            RAISE;
531       WHEN FND_API.G_EXC_ERROR THEN
532            RAISE;
533       WHEN OTHERS THEN
534            Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
535            FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.validate_src_prgm_unt_set_att');
536            IGS_GE_MSG_STACK.ADD;
537            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
538                FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.create_prgm_admin_record :',SQLERRM);
539            END IF;
540            App_Exception.Raise_Exception;
541 
542   END create_prgm_admin_record;
543 
544 
545   PROCEDURE check_is_dest_prgm_actv_confrm (
546    p_person_id               IN   NUMBER,
547    p_source_program_cd       IN   VARCHAR2,
548    p_acad_cal_type           IN   VARCHAR2,
549    p_acad_seq_num            IN   NUMBER,
550    p_dest_program_cd         IN   VARCHAR2,
551    p_show_warning            IN   VARCHAR2,
552    p_dest_confirmed_ind      IN OUT  NOCOPY VARCHAR2
553   ) AS
554    -------------------------------------------------------------------------------------------
555   --Created by  : Chandrasekhar Kasu, Oracle IDC
556   --Date created: 20-Nov-2004
557   -- Purpose : This program check whether destination program  student confirm indicator is
558   --           active or not and confirms it if it passed validations.
559   --Change History:
560   --Who         When            What
561 
562   -------------------------------------------------------------------------------------------
563 
564 
565    CURSOR c_get_dest_prg_dtls(c_person_id IGS_EN_STDNT_PS_ATT.PERSON_ID%TYPE,c_program_cd IGS_EN_STDNT_PS_ATT.COURSE_CD%TYPE) IS
566       SELECT *
567       FROM IGS_EN_STDNT_PS_ATT
568       WHERE person_id = c_person_id AND
569             course_cd = c_program_cd;
570    l_val_sca_confrm_status   BOOLEAN;
571    l_val_sca_elgbl_status    BOOLEAN;
572    l_message_name            FND_NEW_MESSAGES.MESSAGE_TEXT%TYPE;
573    l_message_name1            FND_NEW_MESSAGES.MESSAGE_TEXT%TYPE;
574    l_dest_sca_rec            c_get_dest_prg_dtls%ROWTYPE;
575 
576   BEGIN
577 
578     OPEN   c_get_dest_prg_dtls(p_person_id,p_dest_program_cd);
579     FETCH  c_get_dest_prg_dtls INTO l_dest_sca_rec;
580     CLOSE  c_get_dest_prg_dtls;
581     l_val_sca_confrm_status :=  IGS_EN_VAL_SCA.enrp_val_sca_confirm(p_person_id,
582                                                                     p_dest_program_cd,
583                                                                     l_dest_sca_rec.adm_admission_appl_number,
584                                                                     l_dest_sca_rec.adm_nominated_course_cd,
585                                                                     l_dest_sca_rec.adm_sequence_number,
586                                                                     l_dest_sca_rec.student_confirmed_ind,
587                                                                     l_dest_sca_rec.course_attempt_status,
588                                                                     l_message_name);
589     IF l_val_sca_confrm_status = FALSE THEN
590        IF l_message_name IN ('IGS_EN_ASSOCIATE_ADMPRG_APPL') AND p_show_warning = 'Y' THEN
591           FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
592           FND_MSG_PUB.ADD;
593        END IF;
594        IF l_message_name IN ('IGS_EN_PRG_ATT_CONF_ENR','IGS_EN_CONF_IND_ONLY_BE_CHANG') THEN
595           FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
596           FND_MSG_PUB.ADD;
597           RAISE FND_API.G_EXC_ERROR;
598        END IF;
599     END IF;-- end of l_val_sca_confrm_status = FALSE  IF THEN
600 
601     l_val_sca_elgbl_status := IGS_EN_GEN_006.ENRP_GET_SCA_ELGBL(p_person_id,
602                                                                 p_dest_program_cd,
603                                                                 'RETURN',
604                                                                 p_acad_cal_type,
605                                                                 p_acad_seq_num,
606                                                                 'Y',
607                                                                 l_message_name1);
608 
609     IF l_val_sca_elgbl_status = FALSE THEN
610        IF l_message_name1 NOT IN ('IGS_EN_STUD_INELIG_TO_RE_ENR','IGS_EN_INELIGBLE_DUE_TO_LAPSE',
611                                   'IGS_EN_STUD_INELIGIBLE_RE_ENR','IGS_EN_STUD_NOT_HAVE_CURR_AFF',
612                                   'IGS_EN_INTERM_DOES_NOT_END', 'IGS_RE_SUPERV_%_MUST_TOT_100')  THEN
613            FND_MESSAGE.SET_NAME( 'IGS' , l_message_name1);
614            FND_MSG_PUB.ADD;
615            RAISE FND_API.G_EXC_ERROR;
616        END IF;
617     END IF;-- end of l_val_sca_elgbl_status = FALSE  IF THEN
618 
619     p_dest_confirmed_ind := 'Y';
620 
621     EXCEPTION
622 
623       WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
624            RAISE;
625       WHEN FND_API.G_EXC_ERROR THEN
626            RAISE;
627       WHEN OTHERS THEN
628            Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
629            FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.check_is_dest_prgm_actv_confrm');
630            IGS_GE_MSG_STACK.ADD;
631            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
632                FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.check_is_dest_prgm_actv_confrm :',SQLERRM);
633            END IF;
634            App_Exception.Raise_Exception;
635 
636   END check_is_dest_prgm_actv_confrm;
637 
638 
639   PROCEDURE check_for_debt(
640     p_person_id               IN   NUMBER,
641     p_source_program_cd       IN   VARCHAR2,
642     p_message_name            OUT NOCOPY VARCHAR2
643   ) AS
644   -------------------------------------------------------------------------------------------
645   --Created by  : Chandrasekhar Kasu, Oracle IDC
646   --Date created: 20-Nov-2004
647   -- Purpose : This procedure checks for the debt
648   --Change History:
649   --Who         When            What
650   --bdeviset    08-APR-2005     Changed cursors c_get_debt_for_src_prgm_att and c_get_debt_for_src_prgm_att
651         --                            tp access data from igs_fi_inv_int instead of IGS_FI_FEE_AS for bug#4177199
652   -------------------------------------------------------------------------------------------
653    l_debt_exists     IGS_FI_FEE_AS.person_id%TYPE;
654    CURSOR c_get_debt_for_src_prgm_att IS
655       SELECT person_id
656       FROM igs_fi_inv_int
657                         WHERE person_id = p_person_id
658                         AND course_cd = p_source_program_cd
659                         AND transaction_type IN ('ASSESSMENT', 'RETENTION', 'SPECIAL')
660                         AND invoice_amount_due > 0;
661 
662    CURSOR c_getdebt_for_all_prgms IS
663                         SELECT person_id
664                         FROM igs_fi_inv_int
665                         WHERE person_id = p_person_id
666                         AND course_cd IS NULL
667                         AND invoice_amount_due > 0;
668 
669   BEGIN
670     OPEN c_get_debt_for_src_prgm_att;
671     FETCH c_get_debt_for_src_prgm_att INTO l_debt_exists;
672     IF ( c_get_debt_for_src_prgm_att%FOUND ) THEN
673         p_message_name := 'IGS_EN_STUD_EXIST_DEBT_PRG';
674         CLOSE c_get_debt_for_src_prgm_att;
675         RETURN;
676     ELSE
677         CLOSE c_get_debt_for_src_prgm_att;
678     END IF;
679 
680     OPEN  c_getdebt_for_all_prgms;
681     FETCH c_getdebt_for_all_prgms INTO l_debt_exists;
682     IF ( c_getdebt_for_all_prgms%FOUND ) THEN
683         p_message_name := 'IGS_EN_PRSN_EXISTING_DEBT';
684         CLOSE c_getdebt_for_all_prgms;
685         RETURN;
686     ELSE
687         CLOSE c_getdebt_for_all_prgms;
688     END IF;
689 
690     EXCEPTION
691        WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
692             RAISE;
693        WHEN FND_API.G_EXC_ERROR THEN
694            RAISE;
695        WHEN OTHERS THEN
696             Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
697             FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.check_for_debt');
698             IGS_GE_MSG_STACK.ADD;
699             IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
700                FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.check_for_debt :',SQLERRM);
701             END IF;
702             App_Exception.Raise_Exception;
703 
704   END check_for_debt;
705 
706  PROCEDURE check_for_holds(
707     p_person_id               IN   NUMBER,
708     p_dest_program_cd         IN   VARCHAR2,
709     p_term_cal_type           IN   VARCHAR2,
710     p_term_seq_num            IN   NUMBER,
711     p_person_type             IN   VARCHAR2,
712     p_return_status           IN OUT NOCOPY  VARCHAR2,
713     p_show_warning            IN   VARCHAR2
714    )AS
715   -------------------------------------------------------------------------------------------
716   --Created by  : Chandrasekhar Kasu, Oracle IDC
717   --Date created: 20-Nov-2004
718   -- Purpose : This procedure checks for the holds
719   --Change History:
720   --Who         When            What
721   -- ckasu    07-JAN-2005      Modified code inorder to include check for deny all enrollment
722   --                           activity as a part of bug# 4083552
723 
724   -------------------------------------------------------------------------------------------
725     l_deny_warn      VARCHAR2(100);
726     l_message_name   FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
727     l_hold_status    BOOLEAN;
728 
729     v_message_name          varchar2(30);
730     v_message_name2         varchar2(30);
731     v_first_message_name    varchar2(30);
732     v_first_message_name2   varchar2(30);
733     v_return_type           VARCHAR2(1);
734     v_attendance_types      VARCHAR2(100);
735     v_encmb_fail            BOOLEAN;
736 
737 
738   BEGIN
739 
740     -- checks whether Student is excluded from the  Admission or Enrolment of destination course or not
741 
742     l_hold_status := IGS_EN_VAL_ENCMB.enrp_val_excld_crs(p_person_id,
743                                                          p_dest_program_cd,
744                                                          SYSDATE,
745                                                          l_message_name
746                                                          );
747     IF l_hold_status = FALSE THEN
748 
749        IF p_show_warning = 'Y'  THEN
750 
751          FND_MESSAGE.SET_NAME( 'IGS' , 'IGS_EN_NOTTRNS_NOMINATED_PRG');
752          FND_MSG_PUB.ADD;
753          FND_MESSAGE.SET_NAME( 'IGS' , 'IGS_EN_PERS_ENCUMB_SYS');
754          FND_MSG_PUB.ADD;
755        END IF;
756 
757     END IF;
758 
759 
760     IF IGS_EN_VAL_ENCMB.enrp_val_enr_encmb( -- -- calling with census date
761                         p_person_id,
762                         p_dest_program_cd,
763                         p_term_cal_type,
764                         p_term_seq_num,
765                         v_message_name,
766                         v_message_name2,
767                         v_return_type,
768                         SYSDATE
769                         ) = FALSE THEN
770 
771                         IF p_show_warning = 'Y' AND (l_message_name <>   NVL(v_message_name,v_message_name2))  THEN
772 
773                                  -- log the warning message here
774 
775                                  FND_MESSAGE.SET_NAME( 'IGS' ,NVL(v_message_name,v_message_name2));
776                                  FND_MSG_PUB.ADD;
777 
778                                  FND_MESSAGE.SET_NAME( 'IGS' ,'IGS_EN_PERS_ENCUMB_SYS');
779                                  FND_MSG_PUB.ADD;
780 
781                         END IF;
782 
783      END IF; -- end of IF enrp_val_enr_encmb_pt(
784 
785 
786   -- check whether a hold with Deny All Enrollment acticity effect
787   -- exists for the student or not
788 
789      igs_en_elgbl_person.eval_ss_deny_all_hold (
790                                                    p_person_id     => p_person_id,
791                                                    p_person_type   => p_person_type,
792                                                    p_course_cd     => p_dest_program_cd,
793                                                    p_load_calendar_type => p_term_cal_type,
794                                                    p_load_cal_sequence_number => p_term_seq_num,
795                                                    p_status        => l_deny_warn,
796                                                    p_message       => l_message_name);
797 
798      IF l_deny_warn = 'E'  THEN
799           IF l_message_name IS NOT NULL THEN
800              FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
801              FND_MSG_PUB.ADD;
802              p_return_status := FND_API.G_RET_STS_ERROR;
803              RAISE FND_API.G_EXC_ERROR;
804           END IF;
805      END IF;-- end of l_deny_warn = 'E' IF THEN
806 
807 
808 
809     EXCEPTION
810       WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
811            RAISE;
812       WHEN FND_API.G_EXC_ERROR THEN
813             RAISE;
814       WHEN OTHERS THEN
815            Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
816            FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.check_for_holds');
817            IGS_GE_MSG_STACK.ADD;
818            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
819                FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.check_for_holds :',SQLERRM);
820            END IF;
821            App_Exception.Raise_Exception;
822 
823   END check_for_holds;
824 
825   FUNCTION enrp_val_excld_unit_pt(
826   p_person_id IN NUMBER ,
827   p_course_cd IN VARCHAR2 ,
828   p_unit_cd IN VARCHAR2 ,
829   p_effective_dt IN DATE ,
830   p_message_name OUT NOCOPY VARCHAR2)
831   RETURN BOOLEAN AS
832 
833   BEGIN
834   DECLARE
835         v_pue_start_dt          IGS_PE_PERS_UNT_EXCL.pue_start_dt%TYPE;
836         v_expiry_dt             IGS_PE_PERS_UNT_EXCL.expiry_dt%TYPE;
837         CURSOR c_psd_ed IS
838                 SELECT  pue.pue_start_dt,
839                         pue.expiry_dt
840                 FROM    IGS_PE_PERSENC_EFFCT    pee,
841                         IGS_PE_PERS_UNT_EXCL            pue
842                 WHERE   pee.person_id = p_person_id AND
843                         pee.s_encmb_effect_type = 'EXC_CRS_U' AND
844                         pee.course_cd = p_course_cd AND
845                         pue.person_id = pee.person_id AND
846                         pue.encumbrance_type = pee.encumbrance_type AND
847                         pue.pen_start_dt = pee.pen_start_dt AND
848                         pue.s_encmb_effect_type = pee.s_encmb_effect_type AND
849                         pue.pee_start_dt = pee.pee_start_dt AND
850                         pue.pee_sequence_number = pee.sequence_number AND
851                         pue.unit_cd = p_unit_cd;
852   BEGIN
853         -- This function validates whether or not a IGS_PE_PERSON is
854         -- excluded from admission or enrolment in a specific IGS_PS_UNIT.
855         p_message_name := null;
856         -- Validate the input parameters
857         IF p_person_id IS NULL OR
858                         p_course_cd IS NULL OR
859                         p_unit_cd IS NULL OR
860                         p_effective_dt IS NULL THEN
861                 p_message_name := null;
862                 RETURN TRUE;
863         END IF;
864 
865         --Validate for an exclusion from a specific IGS_PS_UNIT.
866         OPEN    c_psd_ed;
867         LOOP
868                 FETCH   c_psd_ed        INTO    v_pue_start_dt,
869                                                 v_expiry_dt;
870                 EXIT WHEN c_psd_ed%NOTFOUND;
871                 --Validate if the dates of a returned record overlap with the effective date.
872                 IF v_expiry_dt IS NULL THEN
873                         IF v_pue_start_dt <= p_effective_dt THEN
874                                 CLOSE c_psd_ed;
875                                 p_message_name := 'IGS_EN_PRSN_ENCUMB_EXC_ENR';
876                                 RETURN FALSE;
877                         END IF;
878                 ELSE
879                         IF p_effective_dt BETWEEN v_pue_start_dt AND (v_expiry_dt - 1) THEN
880                                 CLOSE c_psd_ed;
881                                 p_message_name := 'IGS_EN_PRSN_ENCUMB_EXC_ENR';
882                                 RETURN FALSE;
883                         END IF;
884                 END IF;
885         END LOOP;
886         CLOSE   c_psd_ed;
887         --- Return the default value
888         p_message_name := null;
889         RETURN TRUE;
890   END;
891   EXCEPTION
892       WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
893            RAISE;
894       WHEN FND_API.G_EXC_ERROR THEN
895            RAISE;
896       WHEN OTHERS THEN
897                 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
898                 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.enrp_val_excld_unit_pt');
899                 IGS_GE_MSG_STACK.ADD;
900            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
901                FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.enrp_val_excld_unit_pt :',SQLERRM);
902            END IF;
903            App_Exception.Raise_Exception;
904 
905   END enrp_val_excld_unit_pt;
906 
907 
908   PROCEDURE upd_or_create_dest_term_rec(
909      p_person_id               IN   NUMBER,
910      p_dest_program_cd         IN   VARCHAR2,
911      p_term_cal_type           IN   VARCHAR2,
912      p_term_seq_num            IN   NUMBER,
913      p_key_program_flag        IN   VARCHAR2,
914      p_message_name            OUT NOCOPY VARCHAR2,
915      p_dest_fut_dt_trans_flag IN   VARCHAR2
916 
917   ) AS
918 
919   -------------------------------------------------------------------------------------------
920   --Created by  : Chandrasekhar Kasu, Oracle IDC
921   --Date created: 20-Nov-2004
922   -- Purpose : this function is used to create or update destination program attempt
923   --Change History:
924   --Who         When            What
925  -- stutta  26-Sep-2005     Added call to create_update_term_rec for bug 4588264
926   -------------------------------------------------------------------------------------------
927 
928    l_key_program_flag      igs_en_spa_terms.key_program_flag%TYPE;
929   BEGIN
930 
931        IF p_dest_fut_dt_trans_flag = 'Y' THEN
932           -- delete the global table before populating it
933 
934 		  l_key_program_flag := FND_API.G_MISS_CHAR;
935 		  IF p_key_program_flag = 'Y' THEN
936 			l_key_program_flag := p_key_program_flag;
937 		  END IF;
938           igs_en_spa_terms_api.create_update_term_rec(p_person_id         => p_person_id,
939                                                p_program_cd             => p_dest_program_cd,
940                                                p_term_cal_type          => p_term_cal_type,
941                                                p_term_sequence_NUMBER   => p_term_seq_num,
942                                                p_key_program_flag       => l_key_program_flag,
943                                                p_ripple_frwrd           => TRUE,
944                                                p_program_changed        => TRUE,
945                                                p_message_name           => p_message_name,
946                                                p_update_rec             => TRUE);
947 
948 
949       END IF;
950 
951    EXCEPTION
952       WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
953            RAISE;
954       WHEN FND_API.G_EXC_ERROR THEN
955            RAISE;
956       WHEN OTHERS THEN
957            Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
958            FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.upd_or_create_dest_term_rec');
959            IGS_GE_MSG_STACK.ADD;
960            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
961                FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.upd_or_create_dest_term_rec :',SQLERRM);
962            END IF;
963            App_Exception.Raise_Exception;
964 
965   END upd_or_create_dest_term_rec;
966 
967   FUNCTION is_tranfer_across_careers(
968     p_src_program_cd       IN   VARCHAR2,
969     p_src_progam_ver       IN   NUMBER,
970     p_dest_program_cd      IN   VARCHAR2,
971     p_dest_prog_ver        IN   NUMBER,
972     p_src_career_type      OUT  NOCOPY VARCHAR2
973   ) RETURN BOOLEAN AS
974 
975   -------------------------------------------------------------------------------------------
976   --Created by  : Chandrasekhar Kasu, Oracle IDC
977   --Date created: 20-Nov-2004
978   -- Purpose : This function returns when Transfer is across careers and
979   --           false when transfer is with in the careers
980   --Change History:
981   --Who         When            What
982 
983   -------------------------------------------------------------------------------------------
984 
985     CURSOR c_get_career_type(c_program_cd IGS_PS_VER.course_cd%TYPE,c_program_ver IGS_PS_VER.version_number%TYPE) IS
986        SELECT course_type
987        FROM   IGS_PS_VER
988        WHERE  course_cd =  c_program_cd AND
989               version_number = c_program_ver;
990     l_src_prgm_career    IGS_PS_VER.COURSE_TYPE%TYPE;
991     l_dest_prgm_career    IGS_PS_VER.COURSE_TYPE%TYPE;
992 
993   BEGIN
994 
995     OPEN c_get_career_type(p_src_program_cd,p_src_progam_ver);
996     FETCH c_get_career_type INTO l_src_prgm_career;
997     CLOSE c_get_career_type;
998     OPEN c_get_career_type(p_dest_program_cd,p_dest_prog_ver);
999     FETCH c_get_career_type INTO l_dest_prgm_career;
1000     CLOSE c_get_career_type;
1001     IF (l_src_prgm_career <> l_dest_prgm_career) THEN
1002         p_src_career_type := l_src_prgm_career;
1003         RETURN TRUE;
1004     ELSE
1005         RETURN FALSE;
1006     END IF;
1007 
1008   END is_tranfer_across_careers;
1009 
1010 
1011   PROCEDURE getunits_in_src_notin_dest_prg(
1012     p_person_id               IN   NUMBER,
1013     p_source_program_cd       IN   VARCHAR2,
1014     p_dest_program_cd         IN   VARCHAR2,
1015     p_uoo_ids_transfered      IN   VARCHAR2,
1016     p_drop                    IN   BOOLEAN,
1017     p_show_warning            IN   VARCHAR2
1018   ) AS
1019   -------------------------------------------------------------------------------------------
1020   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
1021   -- Purpose : returns all units in sorce that are not in destination
1022   --Change History:
1023   --Who         When            What
1024 
1025   --------------------------------------------------------------------------------------------
1026     l_unit_not_in_dest_prgm BOOLEAN;
1027     l_uooid   NUMBER;
1028     l_unchk_units_in_src  VARCHAR2(2000);
1029 
1030     CURSOR c_get_all_enr_waitlstd_units IS
1031        SELECT unit_cd,uoo_id
1032        FROM IGS_EN_SU_ATTEMPT
1033        WHERE person_id = p_person_id  AND
1034              course_cd = p_source_program_cd AND
1035              unit_attempt_status IN ('ENROLLED','WAITLISTED','INVALID');
1036      l_cindex      NUMBER;
1037      l_temp_uoo_ids    VARCHAR2(1000);
1038 
1039   BEGIN
1040 
1041         l_temp_uoo_ids := ',' || p_uoo_ids_transfered || ',' ;
1042        -- getting all unchecked/unselected units in Source whose status is Enrolled or Waitlisted
1043        -- or Invalid during Transfer.
1044 
1045        FOR l_all_units_in_src_prgm_rec IN   c_get_all_enr_waitlstd_units LOOP
1046 
1047            l_cindex := INSTR(l_temp_uoo_ids,','||l_all_units_in_src_prgm_rec.uoo_id||',',1,1);
1048            IF  l_cindex = 0 THEN
1049               IF l_unchk_units_in_src IS NULL THEN
1050                  l_unchk_units_in_src := l_all_units_in_src_prgm_rec.unit_cd ;
1051               ELSE
1052                  l_unchk_units_in_src := l_unchk_units_in_src || ' , '|| l_all_units_in_src_prgm_rec.unit_cd ;
1053               END IF;
1054            END IF;-- end of  l_cindex <> 0 IF THEN
1055        END LOOP;--end of units in src Prgm Loop
1056 
1057        -- when these units are being dropped in the immediate transfer then show the message
1058        IF p_show_warning = 'Y' AND l_unchk_units_in_src IS NOT NULL  AND p_drop  THEN
1059           FND_MESSAGE.SET_NAME('IGS','IGS_EN_TRN_EN_WL_U_NO_SEL');
1060           FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unchk_units_in_src);
1061           FND_MSG_PUB.ADD;
1062        END IF;
1063 
1064        EXCEPTION
1065           WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
1066                RAISE;
1067           WHEN FND_API.G_EXC_ERROR THEN
1068                RAISE;
1069           WHEN OTHERS THEN
1070                Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1071                FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.getunits_in_src_notin_dest_prg');
1072                IGS_GE_MSG_STACK.ADD;
1073                IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
1074                    FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.getunits_in_src_notin_dest_prg :',SQLERRM);
1075                END IF;
1076                App_Exception.Raise_Exception;
1077 
1078   END getunits_in_src_notin_dest_prg;
1079 
1080 
1081 PROCEDURE val_unchk_sub_units(
1082     p_person_id               IN   NUMBER,
1083     p_source_program_cd       IN   VARCHAR2,
1084     p_uoo_ids_transfered      IN OUT NOCOPY VARCHAR2,
1085     p_drop                    IN   BOOLEAN,
1086     p_show_warning            IN   VARCHAR2
1087 
1088   ) AS
1089   -------------------------------------------------------------------------------------------
1090   -- Created by  : Susmitha Tutta, Oracle Student Systems Oracle IDC
1091   -- Purpose : Throws warning if a superior is checked and subordinate unchecked for transfer
1092   -- and unchecked source units are not to be dropped.
1093   --Change History:
1094   --Who         When            What
1095 
1096   --------------------------------------------------------------------------------------------
1097     l_unit_not_in_dest_prgm BOOLEAN;
1098     l_uooid   NUMBER;
1099     l_unchk_units_in_src  VARCHAR2(2000);
1100 
1101     CURSOR c_get_all_src_units IS
1102        SELECT sua.unit_cd,sua.uoo_id, uoo.sup_uoo_id
1103        FROM IGS_EN_SU_ATTEMPT sua, IGS_PS_UNIT_OFR_OPT uoo
1104        WHERE person_id = p_person_id  AND
1105              course_cd = p_source_program_cd AND
1106 	     uoo.uoo_id = sua.uoo_id AND
1107 	     uoo.sup_uoo_id IS NOT NULL AND
1108 	     sua.unit_attempt_status <> 'DROPPED';
1109      l_cindex      NUMBER;
1110      l_temp_uoo_ids    VARCHAR2(1000);
1111      l_sub_not_selected BOOLEAN := FALSE;
1112 BEGIN
1113 
1114        l_temp_uoo_ids := ',' || p_uoo_ids_transfered || ',' ;
1115 
1116        FOR l_all_src_units_rec IN   c_get_all_src_units LOOP
1117 
1118            IF  (INSTR(l_temp_uoo_ids,','||l_all_src_units_rec.sup_uoo_id||',',1,1) <>0
1119            AND INSTR (l_temp_uoo_ids,','||l_all_src_units_rec.uoo_id||',',1,1) = 0) THEN
1120 	      p_uoo_ids_transfered := p_uoo_ids_transfered||','||l_all_src_units_rec.uoo_id;
1121 	      l_sub_not_selected := TRUE;
1122 	   END IF;
1123        END LOOP;
1124 
1125        -- when these units are being dropped in the immediate transfer then show the message
1126        IF p_show_warning = 'Y' AND l_sub_not_selected  AND NOT p_drop  THEN
1127           FND_MESSAGE.SET_NAME('IGS','IGS_EN_TRN_SUB_NO_SEL_DROP'); -- subordinates units of all superiors unit selected for transfer will be dropped.
1128           FND_MSG_PUB.ADD;
1129        END IF;
1130 
1131 EXCEPTION
1132   WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
1133        RAISE;
1134   WHEN FND_API.G_EXC_ERROR THEN
1135        RAISE;
1136   WHEN OTHERS THEN
1137        Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1138        FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.val_unchk_sub_units');
1139        IGS_GE_MSG_STACK.ADD;
1140        IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
1141 	   FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.val_unchk_sub_units :',SQLERRM);
1142        END IF;
1143        App_Exception.Raise_Exception;
1144 
1145 END val_unchk_sub_units;
1146 
1147 
1148   PROCEDURE validate_person_steps(
1149      p_person_id               IN   NUMBER,
1150      p_dest_program_cd         IN   VARCHAR2,
1151      p_dest_prog_ver           IN   NUMBER,
1152      p_term_cal_type           IN   VARCHAR2,
1153      p_term_seq_num            IN   NUMBER,
1154      p_acad_cal_type           IN   VARCHAR2,
1155      p_acad_seq_num            IN   NUMBER,
1156      p_person_type             IN   VARCHAR2,
1157      p_show_warning            IN   VARCHAR2,
1158      p_return_status           IN OUT NOCOPY  VARCHAR2
1159    ) AS
1160 
1161   -------------------------------------------------------------------------------------------
1162   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
1163   -- Purpose : this procedure validate all Person steps during program transfer
1164   --Change History:
1165   --Who         When            What
1166 
1167   --------------------------------------------------------------------------------------------
1168 
1169     l_deny_warn                     VARCHAR2(100);
1170     l_message_name                  VARCHAR2(4000);
1171     l_enrolment_cat                 IGS_PS_TYPE.ENROLMENT_CAT%TYPE;
1172     l_en_cal_type                   IGS_CA_INST.CAL_TYPE%TYPE;
1173     l_en_ci_seq_num                 IGS_CA_INST.SEQUENCE_NUMBER%TYPE;
1174     l_commencement_type             VARCHAR2(20);
1175     l_dummy                         VARCHAR2(100);
1176     l_enroll_mtd_type               IGS_EN_METHOD_TYPE.ENR_METHOD_TYPE%TYPE;
1177     l_personsteps_vald_status       BOOLEAN;
1178 
1179     CURSOR c_get_enr_method_type IS
1180        SELECT enr_method_type
1181        FROM  IGS_EN_METHOD_TYPE
1182        WHERE transfer_flag = 'Y' AND
1183              closed_ind ='N';
1184 
1185   BEGIN
1186 
1187        l_commencement_type := NULL;
1188 
1189        l_enrolment_cat := IGS_EN_GEN_003.Enrp_Get_Enr_Cat(p_person_id                =>p_person_id,
1190                                                           p_course_cd                =>p_dest_program_cd,
1191                                                           p_cal_type                 =>p_acad_cal_type,
1192                                                           p_ci_sequence_number       =>p_acad_seq_num,
1193                                                           p_session_enrolment_cat    =>NULL,
1194                                                           p_enrol_cal_type           =>l_en_cal_type,
1195                                                           p_enrol_ci_sequence_number =>l_en_ci_seq_num,
1196                                                           p_commencement_type        =>l_commencement_type,
1197                                                           p_enr_categories           =>l_dummy);
1198 
1199        OPEN  c_get_enr_method_type;
1200        FETCH c_get_enr_method_type INTO l_enroll_mtd_type;
1201        CLOSE c_get_enr_method_type;
1202 
1203 
1204        l_personsteps_vald_status := igs_en_elgbl_person.eval_person_steps(
1205                                               p_person_id                 =>p_person_id,
1206                                               p_person_type               =>p_person_type,
1207                                               p_load_calendar_type        =>p_term_cal_type,
1208                                               p_load_cal_sequence_number  =>p_term_seq_num,
1209                                               p_program_cd                =>p_dest_program_cd,
1210                                               p_program_version           =>p_dest_prog_ver,
1211                                               p_enrollment_category       =>l_enrolment_cat,
1212                                               p_comm_type                 =>l_commencement_type,
1213                                               p_enrl_method               =>l_enroll_mtd_type,
1214                                               p_message                   =>l_message_name,
1215                                               p_deny_warn                 =>l_deny_warn,
1216                                               p_calling_obj               =>'JOB',
1217                                               p_create_warning            =>'N'
1218                                               );
1219 
1220 
1221        IF l_personsteps_vald_status  AND l_deny_warn = 'WARN' THEN
1222 
1223               IF l_message_name IS NOT NULL AND  p_show_warning = 'Y' THEN
1224                 parse_messages( l_message_name);
1225               END IF;
1226 
1227        END IF; -- end of l_personsteps_vald_status = 'FALSE' AND l_deny_warn = 'WARN'  IF THEN
1228 
1229        IF NOT l_personsteps_vald_status AND l_deny_warn = 'DENY' THEN
1230 
1231               IF l_message_name IS NOT NULL AND  p_show_warning = 'Y' THEN
1232                  parse_messages( l_message_name );
1233                  p_return_status := FND_API.G_RET_STS_ERROR;
1234               END IF;
1235 
1236               IF l_message_name IS NOT NULL AND  p_show_warning = 'N' THEN
1237                  parse_messages( l_message_name );
1238                  p_return_status := FND_API.G_RET_STS_ERROR;
1239                  RAISE FND_API.G_EXC_ERROR;
1240               END IF;
1241 
1242        END IF; -- end of  l_personsteps_vald_status = 'FALSE' AND l_deny_warn = 'DENY'  IF THEN
1243 
1244 
1245     EXCEPTION
1246        WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
1247             RAISE;
1248        WHEN FND_API.G_EXC_ERROR THEN
1249             RAISE;
1250        WHEN OTHERS THEN
1251             FND_MESSAGE.SET_NAME('IGS','IGS_GE_UNHANDLED_EXP');
1252             FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.validate_person_steps');
1253             IGS_GE_MSG_STACK.ADD;
1254             IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
1255                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.validate_person_steps :',SQLERRM);
1256             END IF;
1257             App_Exception.Raise_Exception;
1258 
1259   END validate_person_steps;
1260 
1261 
1262   PROCEDURE validate_candidacy_tran_dtls(
1263      p_person_id               IN   NUMBER,
1264      p_source_program_cd       IN   VARCHAR2,
1265      p_source_prog_ver         IN   NUMBER,
1266      p_dest_program_cd         IN   VARCHAR2,
1267      p_dest_prog_ver           IN   NUMBER,
1268      p_show_warning            IN   VARCHAR2,
1269      p_return_status           IN OUT   NOCOPY VARCHAR2
1270   ) AS
1271 
1272   -------------------------------------------------------------------------------------------
1273   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
1274   -- Purpose : This procedure validates Candidacy transfer details
1275   --Change History:
1276   --Who         When            What
1277   --stutta   13-DEC-2004    Donot validate research candidacy before updating destination program
1278   --                        if the destination program attempt is discontinued, validate it after
1279   --                        updating destination program. Bug #4048290
1280   --------------------------------------------------------------------------------------------
1281 
1282      l_candidacy_tran_status    BOOLEAN;
1283      l_res_elgbl_status         BOOLEAN;
1284      l_message_name FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
1285      l_elgbl_message_name FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
1286 
1287   BEGIN
1288 
1289      l_candidacy_tran_status := IGS_RE_VAL_CA.resp_val_ca_sca(p_person_id,
1290                                                               NULL, -- sequence number not known
1291                                                               NULL, -- old course code does not apply
1292                                                               p_dest_program_cd,
1293                                                               NULL,
1294                                                               NULL,
1295                                                               NULL, -- admission details does not apply
1296                                                               l_message_name);
1297 
1298      IF (l_candidacy_tran_status = FALSE AND  p_show_warning = 'Y') THEN
1299          FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
1300          FND_MSG_PUB.ADD;
1301          p_return_status := FND_API.G_RET_STS_ERROR;
1302      END IF;
1303 
1304      IF (l_candidacy_tran_status = FALSE AND  p_show_warning = 'N') THEN
1305          FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
1306          FND_MSG_PUB.ADD;
1307          RAISE FND_API.G_EXC_ERROR;
1308      END IF;
1309 
1310      l_candidacy_tran_status := IGS_EN_INS_CA_TRNSFR.enrp_ins_ca_trnsfr(p_person_id,
1311                                                                         p_dest_program_cd,
1312                                                                         NULL,
1313                                                                         NULL,
1314                                                                         NULL,
1315                                                                         p_source_program_cd,
1316                                                                         'SCA',
1317                                                                         l_message_name);
1318 
1319      IF (l_candidacy_tran_status = FALSE AND  p_show_warning = 'Y') THEN
1320          FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
1321          FND_MSG_PUB.ADD;
1322          p_return_status := FND_API.G_RET_STS_ERROR;
1323      END IF;
1324 
1325      IF (l_candidacy_tran_status = FALSE AND  p_show_warning = 'N') THEN
1326          FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
1327          FND_MSG_PUB.ADD;
1328          RAISE FND_API.G_EXC_ERROR;
1329      END IF;
1330 
1331      l_res_elgbl_status := IGS_EN_VAL_SCA.enrp_val_res_elgbl(p_person_id,
1332                                                              p_dest_program_cd,
1333                                                              p_dest_prog_ver,
1334                                                              l_elgbl_message_name);
1335 
1336      IF  (l_elgbl_message_name IS NOT NULL AND p_show_warning = 'Y') THEN
1337        IF l_elgbl_message_name NOT IN ('IGS_RE_SUPERV_%_MUST_TOT_100') THEN
1338           FND_MESSAGE.SET_NAME( 'IGS' , l_elgbl_message_name);
1339           FND_MSG_PUB.ADD;
1340           p_return_status := FND_API.G_RET_STS_ERROR;
1341        END IF;
1342      END IF;
1343 
1344 
1345      IF  (l_elgbl_message_name IS NOT NULL AND p_show_warning = 'N') THEN
1346        IF l_elgbl_message_name NOT IN ('IGS_RE_SUPERV_%_MUST_TOT_100') THEN
1347           FND_MESSAGE.SET_NAME( 'IGS' , l_elgbl_message_name);
1348           FND_MSG_PUB.ADD;
1349           RAISE FND_API.G_EXC_ERROR;
1350        END IF;
1351      END IF;
1352 
1353      EXCEPTION
1354         WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
1355              RAISE;
1356         WHEN FND_API.G_EXC_ERROR THEN
1357              RAISE;
1358         WHEN OTHERS THEN
1359              Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1360              FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.validate_candidacy_tran_dtls');
1361              IGS_GE_MSG_STACK.ADD;
1362              IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
1363                  FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.validate_candidacy_tran_dtls :',SQLERRM);
1364              END IF;
1365              App_Exception.Raise_Exception;
1366 
1367    END validate_candidacy_tran_dtls;
1368 
1369 
1370   PROCEDURE validate_advance_st_tran_dtls(
1371      p_person_id               IN   NUMBER,
1372      p_source_program_cd       IN   VARCHAR2,
1373      p_source_prog_ver         IN   NUMBER,
1374      p_dest_program_cd         IN   VARCHAR2,
1375      p_dest_prog_ver           IN   NUMBER,
1376      p_show_warning            IN   VARCHAR2
1377    ) AS
1378 
1379   -------------------------------------------------------------------------------------------
1380   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
1381   -- Purpose : This procedure validates Advance Standing  details that are
1382   --           to be transfered is exists for source program.
1383   --Change History:
1384   --Who         When            What
1385   --bdeviset    06-SEP-2006    Bug# 5525374.The message retunred from IGS_EN_GEN_010.adv_stand_trans (IGS_EN_STDNT_ADV_STND_EXIST)
1386   --                           is a warning message and should be added to the stack only when p_show_warning is passed as 'Y'
1387   -------------------------------------------------------------------------------------------
1388 
1389      l_val  VARCHAR2(1);
1390      l_message_name      FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
1391 
1392      CURSOR c_is_adv_st_exists(c_person_id IGS_AV_ADV_STANDING.PERSON_ID%TYPE,
1393                                c_source_program_cd IGS_AV_ADV_STANDING.COURSE_CD%TYPE,
1394                                c_source_prog_ver IGS_AV_ADV_STANDING.VERSION_NUMBER%TYPE )IS
1395         SELECT 'x'
1396         FROM IGS_AV_ADV_STANDING
1397         WHERE person_id = c_person_id AND
1398               course_cd = c_source_program_cd AND
1399               version_number = c_source_prog_ver;
1400 
1401 
1402   BEGIN
1403 
1404     OPEN c_is_adv_st_exists(p_person_id,p_source_program_cd,p_source_prog_ver);
1405     FETCH c_is_adv_st_exists INTO l_val;
1406     IF (c_is_adv_st_exists%FOUND) THEN
1407         CLOSE c_is_adv_st_exists;
1408         IGS_EN_GEN_010.adv_stand_trans(p_person_id           => p_person_id,
1409                                       p_course_cd            => p_source_program_cd,
1410                                       p_version_number       => p_source_prog_ver,
1411                                       p_course_cd_new        => p_dest_program_cd,
1412                                       p_version_number_new   => p_dest_prog_ver,
1413                                       p_message_name         => l_message_name);
1414     ELSE
1415        CLOSE c_is_adv_st_exists;
1416     END IF; -- end of IF THEN ELSE
1417 
1418     IF p_show_warning = 'Y' AND l_message_name IS NOT NULL THEN
1419        FND_MESSAGE.SET_NAME( 'IGS' ,l_message_name);
1420        FND_MSG_PUB.ADD;
1421     END IF;-- end of l_message_name IF THEN
1422 
1423     EXCEPTION
1424        WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
1425             RAISE;
1426        WHEN FND_API.G_EXC_ERROR THEN
1427             RAISE;
1428        WHEN OTHERS THEN
1429             FND_MESSAGE.SET_NAME('IGS','IGS_GE_UNHANDLED_EXP');
1430             FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.validate_advance_st_tran_dtls');
1431             IGS_GE_MSG_STACK.ADD;
1432             IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
1433                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.validate_advance_st_tran_dtls :',SQLERRM);
1434             END IF;
1435             App_Exception.Raise_Exception;
1436 
1437   END validate_advance_st_tran_dtls;
1438 
1439   FUNCTION is_sua_enroll_eff_fut_term( p_person_id       IN NUMBER,
1440                                        p_dest_program_cd IN VARCHAR2,
1441                                        p_term_cal_type   IN VARCHAR2,
1442                                        p_term_seq_num    IN NUMBER)
1443   RETURN BOOLEAN AS
1444 
1445   -------------------------------------------------------------------------------------------
1446   -- Created by  : bdeviset, Oracle Student Systems Oracle IDC
1447   -- Purpose : Checks if there are any enrolled/waitlisted/invalid unit attempts in the
1448   -- effective and future terms.If so returns true else false.
1449   --Change History:
1450   --Who         When            What
1451 
1452   -------------------------------------------------------------------------------------------
1453 
1454    -- cursor to get all the enrolled unit attempts uooid against destination program
1455   CURSOR c_enroll_sua (cp_person_id     igs_en_stdnt_ps_att.person_id%TYPE,
1456                        cp_course_cd     igs_en_stdnt_ps_att.course_cd%TYPE) IS
1457 
1458     SELECT  uoo_id
1459     FROM  IGS_EN_SU_ATTEMPT sua
1460     WHERE sua.person_id = cp_person_id
1461     AND   sua.course_cd = cp_course_cd
1462     AND   sua.unit_attempt_status IN ('ENROLLED','WAITLISTED','INVALID');
1463 
1464     l_unit_exists BOOLEAN;
1465 
1466   BEGIN
1467 
1468     l_unit_exists := FALSE;
1469     FOR c_enroll_sua_rec IN c_enroll_sua(p_person_id,p_dest_program_cd) LOOP
1470 
1471      -- For each enrolled/waitlisted/invalid unit ateempt check whether it is in
1472      -- effective and future terms
1473      -- if so set the flag to true and exit
1474        IF  IGS_EN_GEN_010.unit_effect_or_future_term(
1475                                          p_person_id => p_person_id,
1476                                          p_dest_course_cd => p_dest_program_cd,
1477                                          p_uoo_id  => c_enroll_sua_rec.uoo_id,
1478                                          p_term_cal_type => p_term_cal_type ,
1479                                          p_term_seq_num => p_term_seq_num) THEN
1480 
1481 
1482             l_unit_exists := TRUE;
1483             EXIT;
1484 
1485        END IF;
1486 
1487     END LOOP;
1488 
1489     RETURN l_unit_exists;
1490 
1491 
1492   END is_sua_enroll_eff_fut_term;
1493 
1494   FUNCTION  is_unit_rel_dest_acad_cal (p_person_id      IN   NUMBER,
1495                               p_source_program_cd       IN   VARCHAR2,
1496                               p_dest_program_cd         IN   VARCHAR2,
1497                               p_uoo_id                  IN NUMBER,
1498                               p_message_name            OUT NOCOPY VARCHAR2)
1499   RETURN BOOLEAN AS
1500     CURSOR c_sca_detls (cp_person_id igs_en_stdnt_ps_att.person_id%TYPE,
1501                         cp_course_cd  igs_en_stdnt_ps_att.course_cd%TYPE) IS
1502   SELECT cal_type
1503   FROM igs_en_stdnt_ps_att
1504   WHERE person_id = cp_person_id AND
1505         course_cd = cp_course_cd ;
1506   l_old_cal_type  igs_en_stdnt_ps_att.cal_type%TYPE;
1507   l_new_cal_type  igs_en_stdnt_ps_att.cal_type%TYPE;
1508   BEGIN
1509            -- get source acad cal type
1510            OPEN c_sca_detls(p_person_id, p_source_program_cd );
1511            FETCH c_sca_detls INTO l_old_cal_type;
1512            CLOSE c_sca_detls;
1513            -- get dest cal type
1514            OPEN c_sca_detls(p_person_id, p_dest_program_cd );
1515            FETCH c_sca_detls INTO l_new_cal_type;
1516            CLOSE c_sca_detls;
1517 
1518            IF l_old_cal_type <> l_new_cal_type  THEN
1519                 IF IGS_EN_VAL_SCT.enrp_val_sua_acad (p_person_id,
1520                            p_source_program_cd,
1521                            p_uoo_id,
1522                            l_new_cal_type,
1523                            p_message_name) = FALSE THEN
1524                     RETURN FALSE;
1525                 END IF;
1526            END IF;
1527 
1528            RETURN TRUE;
1529 
1530   END is_unit_rel_dest_acad_cal;
1531 
1532 
1533   PROCEDURE validate_src_prgm_unt_attempts(
1534       p_person_id               IN   NUMBER,
1535       p_source_program_cd       IN   VARCHAR2,
1536       p_source_prog_ver         IN   NUMBER,
1537       p_term_cal_type           IN   VARCHAR2,
1538       p_term_seq_num            IN   NUMBER,
1539       p_acad_cal_type           IN   VARCHAR2,
1540       p_acad_seq_num            IN   NUMBER,
1541       p_trans_approval_dt       IN   DATE,
1542       p_trans_actual_dt         IN   DATE,
1543       p_dest_program_cd         IN   VARCHAR2,
1544       p_dest_prog_ver           IN   NUMBER,
1545       p_dest_coo_id             IN   NUMBER,
1546       p_uoo_ids_to_transfer     IN   VARCHAR2, -- concatenation of selected uoo_id,core_ind; coming from page
1547       p_uoo_ids_passed_transfer OUT   NOCOPY VARCHAR2, --  units which were successfully transfered among the selected ones from the page
1548       p_uoo_ids_having_errors   OUT NOCOPY VARCHAR2,
1549       p_uooids_str              OUT NOCOPY VARCHAR2, -- all selected uoo_ids passed from the page in format uoo_id1,uoo_id2
1550       p_dest_fut_dt_trans_flag  IN   VARCHAR2,
1551       p_show_warning            IN   VARCHAR2,
1552       p_drop                    IN   BOOLEAN,
1553       p_return_status           IN OUT NOCOPY  VARCHAR2
1554       ) AS
1555 
1556   -------------------------------------------------------------------------------------------
1557   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
1558   -- Purpose : This procedure validates and transfers unit attempts in source program to the
1559   --           destination program.
1560   --Change History:
1561   --Who         When            What
1562   --ckasu     02-DEC-2004     modified as a part of Bug#4044329
1563   -- smaddali  16-dec-04      Modified for bug#4063726
1564   -- bdeviset  21-Mar-2006    After calling enrp_val_sua_cnfrm_p,while setting message
1565   --                          used nvl(l_message_name1,l_message_name2) instead of l_message_name1
1566   --                          as we need to consider l_message_name2 if l_message_name1 is null
1567   --                          Bug# 5070403
1568   -------------------------------------------------------------------------------------------
1569 
1570      l_strtpoint NUMBER;
1571      l_endpoint  NUMBER;
1572      l_cindex    NUMBER;
1573      l_pre_cindex NUMBER;
1574      l_nth_occurence NUMBER;
1575      l_uooid_coreind_sep_index NUMBER;
1576      l_uooid_and_coreind VARCHAR2(300);
1577      l_coreind  VARCHAR2(30);
1578      l_uooid  NUMBER;
1579      l_uoo_ids_to_transfer VARCHAR2(3000);
1580      l_enrp_sua_trans_status  BOOLEAN;
1581      l_message_name FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
1582      l_unit_outcome  IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
1583      l_is_val_sua_trans BOOLEAN;
1584      l_temp         VARCHAR2(1);
1585      l_unt_att_status   IGS_EN_SU_ATTEMPT.UNIT_ATTEMPT_STATUS%TYPE;
1586      l_proceed_aftr_res_val BOOLEAN;
1587      l_sut_status   BOOLEAN;
1588      l_sua_trans_status  BOOLEAN;
1589      l_return_type VARCHAR2(200);
1590      l_sua_confrm_status  BOOLEAN;
1591      l_fail_type    VARCHAR2(100);
1592      l_message_name1  FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
1593      l_message_name2  FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
1594      l_return_message FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
1595      l_del_sua_tran_status  BOOLEAN;
1596      l_del_all_sua_status   BOOLEAN;
1597      l_teach_cal_desc    IGS_CA_INST.description%TYPE;
1598      l_uooids_str  VARCHAR2(1000);
1599      l_message_name3   FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
1600      l_error_occured BOOLEAN;
1601 
1602 
1603      CURSOR c_get_unit_dtls(c_uoo_id IGS_EN_SU_ATTEMPT.uoo_id%TYPE) Is
1604         SELECT *
1605         FROM IGS_EN_SU_ATTEMPT
1606         WHERE person_id = p_person_id AND
1607               course_cd = p_source_program_cd AND
1608               uoo_id = c_uoo_id ;
1609 
1610      CURSOR c_get_research_dtls(c_unit_cd IGS_EN_SU_ATTEMPT.unit_cd%TYPE,c_unit_version_number IGS_EN_SU_ATTEMPT.version_number%TYPE) IS
1611         SELECT 'x'
1612         FROM   IGS_PS_UNIT_VER uv
1613         WHERE  uv.unit_cd = c_unit_cd AND
1614                uv.version_number = c_unit_version_number AND
1615                uv.research_unit_ind = 'Y';
1616 
1617      CURSOR c_get_teach_cal_dec(c_teach_cal_type IGS_CA_INST.cal_type%TYPE,c_teach_cal_seq_num IGS_CA_INST.sequence_number%TYPE) IS
1618          SELECT description
1619          FROM igs_ca_inst
1620          WHERE cal_type = c_teach_cal_type AND
1621                sequence_number = c_teach_cal_seq_num ;
1622       l_unit_dtls_rec  c_get_unit_dtls%ROWTYPE;
1623 
1624       cst_enrolled  CONSTANT  VARCHAR2(10) := 'ENROLLED';
1625       cst_waitlist  CONSTANT  VARCHAR2(10) := 'WAITLISTED';
1626       cst_invalid  CONSTANT  VARCHAR2(10) := 'INVALID';
1627       l_src_crs_type  igs_ps_ver.course_type%TYPE;
1628   BEGIN
1629 
1630         l_strtpoint      :=  0;
1631         l_pre_cindex     :=  0;
1632         l_nth_occurence  :=  1;
1633         l_uoo_ids_to_transfer := p_uoo_ids_to_transfer ;
1634         l_cindex := INSTR(l_uoo_ids_to_transfer,';',1,l_nth_occurence);
1635         p_uoo_ids_having_errors := null;
1636         l_uooids_str := null;
1637 
1638         WHILE (l_cindex <> 0 )  LOOP
1639 
1640               SAVEPOINT SP_TRANSFER_SUA;
1641               l_error_occured := FALSE;
1642               l_strtpoint  :=  l_pre_cindex + 1;
1643               l_endpoint   :=  l_cindex - l_strtpoint;
1644               l_pre_cindex :=  l_cindex;
1645               l_uooid_and_coreind := substr(l_uoo_ids_to_transfer,l_strtpoint,l_endpoint);
1646               l_uooid_coreind_sep_index := INSTR(l_uooid_and_coreind,',',1);
1647               l_uooid :=   TO_NUMBER(SUBSTR(l_uooid_and_coreind,1,l_uooid_coreind_sep_index - 1));
1648               l_coreind := SUBSTR(l_uooid_and_coreind,l_uooid_coreind_sep_index + 1);
1649 
1650               OPEN c_get_unit_dtls(l_uooid);
1651               FETCH c_get_unit_dtls INTO l_unit_dtls_rec ;
1652               CLOSE c_get_unit_dtls;
1653 
1654 
1655                 IF  l_uooids_str IS NULL THEN
1656                     l_uooids_str := l_uooid;
1657                 ELSE
1658                     l_uooids_str := l_uooids_str||','||l_uooid;
1659                 END IF;
1660 
1661                 l_is_val_sua_trans := TRUE;
1662                 l_proceed_aftr_res_val := TRUE;
1663 
1664 
1665                 OPEN c_get_teach_cal_dec(l_unit_dtls_rec.cal_type,l_unit_dtls_rec.ci_sequence_number);
1666                 FETCH c_get_teach_cal_dec INTO l_teach_cal_desc;
1667                 CLOSE c_get_teach_cal_dec;
1668 
1669                -- If we are transfering from one academic calendar to different academic calendar then
1670                -- Units cannot be transfered if no academic calendar link exists.
1671                IF NOT is_unit_rel_dest_acad_cal(p_person_id,p_source_program_cd,p_dest_program_cd,l_uooid,l_return_message)  THEN
1672                                 -- if transfer of unit failed then show warning and skip current unit attempt
1673                                 IF p_show_warning = 'Y' THEN
1674                                      IF NOT l_error_occured THEN
1675                                            l_error_occured := TRUE;
1676                                            IF p_uoo_ids_having_errors IS NULL THEN
1677                                               p_uoo_ids_having_errors := l_uooid;
1678                                            ELSE
1679                                               p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1680                                            END IF;
1681                                            FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_UNIT_TRN');
1682                                            FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1683                                            FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1684                                            FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1685                                            FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1686                                            FND_MSG_PUB.ADD;
1687                                      END IF;-- end of NOT l_error_occured IF THEN
1688                                      FND_MESSAGE.SET_NAME( 'IGS' , l_return_message);
1689                                      FND_MSG_PUB.ADD;
1690                                      p_return_status := FND_API.G_RET_STS_ERROR;
1691                                 END IF;
1692                                 IF p_show_warning = 'N' THEN
1693                                    IF NOT l_error_occured THEN
1694                                            l_error_occured := TRUE;
1695                                        IF p_uoo_ids_having_errors IS NULL THEN
1696                                           p_uoo_ids_having_errors := l_uooid;
1697                                        ELSE
1698                                           p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1699                                        END IF;
1700                                        FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_UNIT_TRN');
1701                                        FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1702                                        FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1703                                        FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1704                                        FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1705                                        FND_MSG_PUB.ADD;
1706                                    END IF;-- end of NOT l_error_occured IF THEN
1707                                    FND_MESSAGE.SET_NAME( 'IGS' , l_return_message);
1708                                    FND_MSG_PUB.ADD;
1709                                    RAISE FND_API.G_EXC_ERROR;
1710                              END IF;
1711 
1712                ELSE
1713 
1714                     l_enrp_sua_trans_status := IGS_EN_VAL_SCT.enrp_val_sua_trnsfr(p_person_id,
1715                                                                                   p_source_program_cd,
1716                                                                                   l_unit_dtls_rec.unit_cd ,
1717                                                                                   l_unit_dtls_rec.cal_type,
1718                                                                                   l_unit_dtls_rec.ci_sequence_number,
1719                                                                                   l_unit_dtls_rec.unit_attempt_status ,
1720                                                                                   l_message_name,
1721                                                                                   l_uooid,
1722                                                                                   l_unit_outcome );
1723                     -- if above validation failed then log error message and skip this unit attempt
1724                     IF  NOT l_enrp_sua_trans_status THEN
1725                         IF NOT l_error_occured THEN
1726                             l_error_occured := TRUE;
1727                             IF p_uoo_ids_having_errors IS NULL THEN
1728                                p_uoo_ids_having_errors := l_uooid;
1729                             ELSE
1730                                p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1731                             END IF;
1732                             FND_MESSAGE.SET_NAME('IGS','IGS_EN_WARN_UNIT_TRN');
1733                             FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1734                             FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1735                             FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1736                             FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1737                             FND_MSG_PUB.ADD;
1738                          END IF;-- end of NOT l_error_occured IF THEN
1739                          FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
1740                          FND_MSG_PUB.ADD;
1741 
1742                     -- if IGS_EN_VAL_SCT.enrp_val_sua_trnsfr validation passed then proceed
1743                     ELSE
1744                        -- for completed and discontinued unit attempts perform the 2 validations
1745                        IF l_unit_dtls_rec.unit_attempt_status IN ('COMPLETED','DISCONTIN') THEN
1746                             -- if unit attempt is failed then show a warning to the user and proceed
1747                             IF  l_unit_outcome = 'FAIL' AND p_show_warning = 'Y' THEN
1748                                   IF NOT l_error_occured THEN
1749                                      l_error_occured := TRUE;
1750                                     IF p_uoo_ids_having_errors IS NULL THEN
1751                                        p_uoo_ids_having_errors := l_uooid;
1752                                     ELSE
1753                                        p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1754                                     END IF;
1755                                     FND_MESSAGE.SET_NAME('IGS','IGS_EN_WARN_UNIT_TRN');
1756                                     FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1757                                     FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1758                                     FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1759                                     FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1760                                     FND_MSG_PUB.ADD;
1761                                   END IF;-- end of NOT l_error_occured IF THEN
1762                                   FND_MESSAGE.SET_NAME( 'IGS' , 'IGS_EN_UNATT_PROCEED_TRN_UN');
1763                                   FND_MSG_PUB.ADD;
1764                             END IF;
1765 
1766                        END IF; -- end of  ('COMPLETED','DISCONTIN')
1767 
1768 
1769                        IF l_proceed_aftr_res_val THEN
1770 
1771                               --- continue Logic
1772                                -- if enrolled unit attempt belongs to a past term then show warning that it will not be transfered
1773                                -- but will be dropped from source.
1774                                -- donot transfer enrolled/invalid/waitlisted unit attempts belonging to a past term
1775                                -- compared to the effective term
1776                                IF l_unit_dtls_rec.unit_attempt_status  IN ( cst_enrolled,cst_invalid,cst_waitlist ) AND
1777                                     NOT igs_en_gen_010.unit_effect_or_future_term(p_person_id,p_dest_program_cd,l_unit_dtls_rec.uoo_id,p_term_cal_type,p_term_seq_num) THEN
1778                                                 --  skip current unit attempt from transfer
1779                                                 --  show warning when unit attempt is not transfered but will be dropped. i.e in intra career transfer
1780                                                 IF p_show_warning = 'Y' THEN
1781                                                      FND_MESSAGE.SET_NAME('IGS','IGS_EN_WARN_UNIT_TRN');
1782                                                      FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1783                                                      FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1784                                                      FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1785                                                      FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1786                                                      FND_MSG_PUB.ADD;
1787                                                      -- if intra career transfer, warn that unit will not be transfered and will be dropped from source
1788                                                      IF is_career_model_enabled AND
1789                                                      NOT is_tranfer_across_careers(p_source_program_cd,p_source_prog_ver,p_dest_program_cd,p_dest_prog_ver,l_src_crs_type) THEN
1790                                                         FND_MESSAGE.SET_NAME( 'IGS' , 'IGS_EN_PAST_UNT_NOTTRN_DRP');
1791                                                         FND_MSG_PUB.ADD;
1792                                                      -- if program mode or inter career transfer then warn that unit will not be transfered
1793                                                      ELSE
1794                                                         FND_MESSAGE.SET_NAME( 'IGS' , 'IGS_EN_PAST_UNT_NOTTRN');
1795                                                         FND_MSG_PUB.ADD;
1796                                                      END IF;
1797                                                 END IF;
1798                                ELSE
1799                                    -- create unit transfer record with the same transfer date as the parent program transfer record
1800                                    -- smaddali modified the logic to create unit transfer records for bug#4063726
1801                                       l_sut_status := IGS_EN_GEN_010.ENRP_INS_SUT_TRNSFR(p_person_id,
1802                                                                                          p_dest_program_cd,
1803                                                                                          p_source_program_cd,
1804                                                                                          p_trans_actual_dt,
1805                                                                                          l_unit_dtls_rec.unit_cd ,
1806                                                                                          l_unit_dtls_rec.cal_type,
1807                                                                                          l_unit_dtls_rec.ci_sequence_number,
1808                                                                                          l_message_name,
1809                                                                                          l_uooid);
1810 
1811                                        -- these uoo_id string will be used only in validate_prgm_attend_type_step procedure and not anywhere else
1812                                        -- this is to not validate program steps for units which were selected but not tranfered successfully
1813                                        IF p_uoo_ids_passed_transfer IS NULL THEN
1814                                          p_uoo_ids_passed_transfer := l_uooid;
1815                                        ELSE
1816                                          p_uoo_ids_passed_transfer := p_uoo_ids_passed_transfer ||','|| l_uooid ;
1817                                        END IF;
1818 
1819                                        -- checking for unit exclusions before transferring.
1820                                       IF enrp_val_excld_unit_pt (
1821                                                                 p_person_id,
1822                                                                 p_dest_program_cd,
1823                                                                 l_unit_dtls_rec.unit_cd,
1824                                                                 SYSDATE,
1825                                                                 l_message_name) = FALSE THEN
1826                                          IF  p_show_warning = 'Y' THEN
1827                                                IF NOT l_error_occured THEN
1828                                                   l_error_occured := TRUE;
1829                                                  IF p_uoo_ids_having_errors IS NULL THEN
1830                                                     p_uoo_ids_having_errors := l_uooid;
1831                                                  ELSE
1832                                                     p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1833                                                  END IF;
1834                                                  FND_MESSAGE.SET_NAME('IGS','IGS_EN_WARN_UNIT_TRN');
1835                                                  FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1836                                                  FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1837                                                  FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1838                                                  FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1839                                                  FND_MSG_PUB.ADD;
1840                                                END IF;-- end of NOT l_error_occured IF THEN
1841                                                FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
1842                                                FND_MSG_PUB.ADD;
1843                                                FND_MESSAGE.SET_NAME( 'IGS' , 'IGS_EN_PERS_ENCUMB_SYS');
1844                                                FND_MSG_PUB.ADD;
1845 
1846                                          END IF;
1847 
1848                                       END IF;
1849 
1850 
1851                                        -- calling API to Perform actual unit of Transfer from src to dest Prgm
1852                                        l_sua_trans_status := igs_en_gen_010.enrp_Ins_Sua_Trnsfr(p_person_id,
1853                                                                                                 p_source_program_cd,
1854                                                                                                 p_dest_program_cd,
1855                                                                                                 p_dest_coo_id,
1856                                                                                                 l_unit_dtls_rec.unit_cd,
1857                                                                                                 l_unit_dtls_rec.version_number,
1858                                                                                                 l_unit_dtls_rec.cal_type,
1859                                                                                                 l_unit_dtls_rec.ci_sequence_number,
1860                                                                                                 l_return_type,
1861                                                                                                 l_message_name,
1862                                                                                                 l_uooid,
1863                                                                                                 l_coreind,
1864                                                                                                 p_term_cal_type,
1865                                                                                                 p_term_seq_num);
1866 
1867                                        IF NOT l_sua_trans_status THEN
1868                                                -- if transfer of unit failed then show warning and skip current unit attempt
1869                                                 IF p_show_warning = 'Y' THEN
1870                                                      IF NOT l_error_occured THEN
1871                                                            l_error_occured := TRUE;
1872                                                            IF p_uoo_ids_having_errors IS NULL THEN
1873                                                               p_uoo_ids_having_errors := l_uooid;
1874                                                            ELSE
1875                                                               p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1876                                                            END IF;
1877                                                            FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_UNIT_TRN');
1878                                                            FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1879                                                            FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1880                                                            FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1881                                                            FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1882                                                            FND_MSG_PUB.ADD;
1883                                                      END IF;-- end of NOT l_error_occured IF THEN
1884                                                      FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
1885                                                      FND_MSG_PUB.ADD;
1886                                                      p_return_status := FND_API.G_RET_STS_ERROR;
1887                                                 END IF;
1888                                                 IF p_show_warning = 'N' THEN
1889                                                    IF NOT l_error_occured THEN
1890                                                            l_error_occured := TRUE;
1891                                                        IF p_uoo_ids_having_errors IS NULL THEN
1892                                                           p_uoo_ids_having_errors := l_uooid;
1893                                                        ELSE
1894                                                           p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1895                                                        END IF;
1896                                                        FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_UNIT_TRN');
1897                                                        FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1898                                                        FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1899                                                        FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1900                                                        FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1901                                                        FND_MSG_PUB.ADD;
1902                                                    END IF;-- end of NOT l_error_occured IF THEN
1903                                                    FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
1904                                                    FND_MSG_PUB.ADD;
1905                                                    RAISE FND_API.G_EXC_ERROR;
1906                                              END IF;
1907 
1908                                        ELSE -- if l_sua_trans_status THEN
1909 
1910 
1911                                          l_sua_confrm_status :=  IGS_EN_VAL_SUA.enrp_val_sua_cnfrm_p (p_person_id,
1912                                                                                                       p_dest_program_cd,
1913                                                                                                       p_dest_prog_ver,
1914                                                                                                       p_dest_coo_id,
1915                                                                                                       p_acad_cal_type,
1916                                                                                                       p_acad_seq_num,
1917                                                                                                       l_uooid,
1918                                                                                                       l_fail_type,
1919                                                                                                       l_message_name1,
1920                                                                                                       l_message_name2);
1921 
1922                                           IF NOT l_sua_confrm_status THEN
1923 
1924                                                  ROLLBACK TO SP_TRANSFER_SUA;
1925                                                  IF  p_show_warning = 'Y' THEN
1926                                                      IF NOT l_error_occured THEN
1927                                                            l_error_occured := TRUE;
1928                                                            IF p_uoo_ids_having_errors IS NULL THEN
1929                                                               p_uoo_ids_having_errors := l_uooid;
1930                                                            ELSE
1931                                                                p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1932                                                            END IF;
1933                                                            FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_UNIT_TRN');
1934                                                            FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1935                                                            FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1936                                                            FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1937                                                            FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1938                                                            FND_MSG_PUB.ADD;
1939                                                      END IF;-- end of NOT l_error_occured IF THEN
1940                                                      FND_MESSAGE.SET_NAME( 'IGS' ,nvl(l_message_name1,l_message_name2));
1941                                                      FND_MSG_PUB.ADD;
1942                                                      p_return_status := FND_API.G_RET_STS_ERROR;
1943                                                  ELSIF p_show_warning = 'N' THEN
1944                                                      IF NOT l_error_occured THEN
1945                                                            l_error_occured := TRUE;
1946                                                            IF p_uoo_ids_having_errors IS NULL THEN
1947                                                               p_uoo_ids_having_errors := l_uooid;
1948                                                            ELSE
1949                                                                p_uoo_ids_having_errors := p_uoo_ids_having_errors ||','||l_uooid;
1950                                                            END IF;
1951                                                            FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_UNIT_TRN');
1952                                                            FND_MESSAGE.SET_TOKEN('UNIT_CD',l_unit_dtls_rec.unit_cd);
1953                                                            FND_MESSAGE.SET_TOKEN('LOCATION_CD',l_unit_dtls_rec.location_cd);
1954                                                            FND_MESSAGE.SET_TOKEN('SECTION',l_unit_dtls_rec.unit_class);
1955                                                            FND_MESSAGE.SET_TOKEN('TEACH_CAL_DESC',l_teach_cal_desc);
1956                                                            FND_MSG_PUB.ADD;
1957                                                      END IF;-- end of NOT l_error_occured IF THEN
1958                                                      FND_MESSAGE.SET_NAME( 'IGS' ,nvl(l_message_name1,l_message_name2));
1959                                                      FND_MSG_PUB.ADD;
1960                                                      RAISE FND_API.G_EXC_ERROR;
1961                                                  END IF; -- end of  p_show_warning = 'Y'
1962 
1963                                           END IF; -- end of  NOT l_sua_confrm_status IF THEN
1964 
1965                                        END IF; --end of l_sua_trans_status IF THEN
1966                             END IF; -- end of enrolled unit in past term
1967 
1968                         END IF; -- end of l_proceed_aftr_res_val IF THEN
1969 
1970                   END IF; -- end of l_is_val_sua_trans IF THEN
1971 
1972               END IF ; -- end of NOT is_unit_rel_dest_acad_cal
1973               l_nth_occurence := l_nth_occurence + 1;
1974               l_cindex := INSTR(l_uoo_ids_to_transfer,';',1,l_nth_occurence);
1975 
1976         END LOOP;-- end of WHILE LOOP
1977 
1978         -- p_uoo_ids_string consists of concatenated uoo_ids  seperated by comma
1979         p_uooids_str := l_uooids_str;
1980 
1981         -- Listing all Enrolled/Waitlisted units that need to be droped that are present in Source but not
1982         -- in Destination
1983         getunits_in_src_notin_dest_prg(p_person_id,
1984                                    p_source_program_cd,
1985                                    p_dest_program_cd,
1986                                    l_uooids_str,
1987                                    p_drop,
1988                                    p_show_warning);
1989         val_unchk_sub_units(p_person_id,
1990                                    p_source_program_cd,
1991                                    l_uooids_str,  -- add subordinate units also when superior is selected.
1992                                    p_drop,
1993                                    p_show_warning);
1994 
1995         l_del_all_sua_status :=   IGS_EN_GEN_010.Enrp_del_all_Sua_Trnsfr(p_person_id,
1996                                                                          p_source_program_cd,
1997                                                                          p_dest_program_cd,
1998                                                                          l_uooids_str,
1999                                                                          p_term_cal_type,
2000                                                                          p_term_seq_num,
2001                                                                          p_drop,
2002                                                                          l_message_name3);
2003 
2004         IF  l_del_all_sua_status =  FALSE THEN
2005             IF p_show_warning = 'Y' THEN
2006                FND_MESSAGE.SET_NAME( 'IGS' , l_message_name3);
2007                FND_MSG_PUB.ADD;
2008                p_return_status := FND_API.G_RET_STS_ERROR;
2009             END IF;
2010             IF p_show_warning = 'N' THEN
2011                FND_MESSAGE.SET_NAME( 'IGS' , l_message_name3);
2012                FND_MSG_PUB.ADD;
2013                RAISE FND_API.G_EXC_ERROR;
2014             END IF;
2015 
2016         END IF; -- end of  l_del_all_sua_status =  FALSE
2017 
2018 
2019 
2020       EXCEPTION
2021          WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
2022               RAISE;
2023          WHEN FND_API.G_EXC_ERROR THEN
2024               RAISE;
2025          WHEN OTHERS THEN
2026               Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2027               FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.validate_src_prgm_unt_attempts');
2028               IGS_GE_MSG_STACK.ADD;
2029               IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
2030                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.validate_src_prgm_unt_attempts :',SQLERRM);
2031               END IF;
2032               App_Exception.Raise_Exception;
2033 
2034    END validate_src_prgm_unt_attempts;
2035 
2036 
2037    PROCEDURE validate_prgm_attend_type_step(
2038       p_person_id               IN   NUMBER,
2039       p_dest_program_cd         IN   VARCHAR2,
2040       p_uooids_str              IN   VARCHAR2,
2041       p_show_warning            IN   VARCHAR2,
2042       p_return_status           IN OUT NOCOPY  VARCHAR2
2043    ) AS
2044   -------------------------------------------------------------------------------------------
2045   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
2046   -- Purpose : This procedure validates attendance Type validation for the destination program.
2047   --Change History:
2048   --Who         When            What
2049   -- ckasu     06-MAR-2006     added new cursor c_get_enr_method_type as a part of bug#5070732
2050   -- ckasu created this procedure for bug#4063726
2051   -------------------------------------------------------------------------------------------
2052 
2053      CURSOR c_get_unit_dtls(cp_uoo_id IGS_EN_SU_ATTEMPT.UOO_ID%TYPE) IS
2054         SELECT cal_type,ci_sequence_number
2055         FROM IGS_PS_UNIT_OFR_OPT
2056         WHERE uoo_id = cp_uoo_id;
2057 
2058      CURSOR c_get_earliest_load_cal_dtls(cp_teach_cal_type IGS_CA_TEACH_TO_LOAD_V.TEACH_CAL_TYPE%TYPE,
2059                                          cp_teach_cal_seq_no IGS_CA_TEACH_TO_LOAD_V.TEACH_CI_SEQUENCE_NUMBER%TYPE) IS
2060 
2061         SELECT load_cal_type,load_ci_sequence_number
2062         FROM IGS_CA_TEACH_TO_LOAD_V
2063         WHERE teach_cal_type = cp_teach_cal_type AND
2064               teach_ci_sequence_number = cp_teach_cal_seq_no
2065         ORDER BY LOAD_START_DT;
2066 
2067      -- added by ckasu as a part of bug#5070732
2068      CURSOR c_get_enr_method_type IS
2069      SELECT enr_method_type
2070      FROM  IGS_EN_METHOD_TYPE
2071      WHERE transfer_flag = 'Y'
2072      AND   closed_ind ='N';
2073 
2074 
2075      l_strtpoint NUMBER;
2076      l_endpoint  NUMBER;
2077      l_cindex    NUMBER;
2078      l_pre_cindex NUMBER;
2079      l_nth_occurence NUMBER;
2080      l_uooid      NUMBER;
2081      l_uooids_str VARCHAR2(1000);
2082      l_cal_type   IGS_PS_UNIT_OFR_OPT.CAL_TYPE%TYPE;
2083      l_ci_sequence_number  IGS_PS_UNIT_OFR_OPT.CI_SEQUENCE_NUMBER%TYPE;
2084      l_load_cal_type IGS_CA_TEACH_TO_LOAD_V.LOAD_CAL_TYPE%TYPE;
2085      l_load_ci_sequence_number  IGS_CA_TEACH_TO_LOAD_V.LOAD_CI_SEQUENCE_NUMBER%TYPE;
2086 
2087      l_enr_method  igs_en_cat_prc_dtl.enr_method_type%TYPE;
2088      l_message_name1    VARCHAR2(4000);
2089      l_message_name2    VARCHAR2(4000);
2090      l_deny_warn        VARCHAR2(10);
2091      l_return_status    VARCHAR2(30);
2092 
2093 
2094 
2095 
2096      BEGIN
2097 
2098         l_strtpoint      :=  0;
2099         l_pre_cindex     :=  0;
2100         l_nth_occurence  :=  1;
2101         l_uooids_str := p_uooids_str||',';
2102         l_cindex := INSTR(l_uooids_str,',',1,l_nth_occurence);
2103 
2104         OPEN c_get_enr_method_type;
2105         FETCH c_get_enr_method_type INTO l_enr_method;
2106         CLOSE c_get_enr_method_type;
2107 
2108 
2109         WHILE (l_cindex <> 0 )  LOOP
2110 
2111               l_strtpoint  :=  l_pre_cindex + 1;
2112               l_endpoint   :=  l_cindex - l_strtpoint;
2113               l_pre_cindex :=  l_cindex;
2114               l_uooid := TO_NUMBER(substr(l_uooids_str,l_strtpoint,l_endpoint));
2115               l_message_name2 := NULL;
2116               l_deny_warn     := NULL;
2117               l_return_status := NULL;
2118               l_cal_type      := NULL;
2119               l_ci_sequence_number := NULL;
2120               l_load_cal_type := NULL;
2121               l_load_ci_sequence_number := NULL;
2122 
2123               OPEN c_get_unit_dtls(l_uooid);
2124               FETCH  c_get_unit_dtls INTO l_cal_type,l_ci_sequence_number;
2125               CLOSE c_get_unit_dtls;
2126 
2127               OPEN c_get_earliest_load_cal_dtls(l_cal_type,l_ci_sequence_number);
2128               FETCH c_get_earliest_load_cal_dtls INTO l_load_cal_type,l_load_ci_sequence_number;
2129               CLOSE c_get_earliest_load_cal_dtls;
2130               -- check for Max cp by passing the null value to credit points
2131               --so that the default calculation are done for the CP of this unit section
2132               igs_en_enroll_wlst.ss_eval_min_or_max_cp(p_person_id               => p_person_id,
2133                                                        p_load_cal_type           => l_load_cal_type,
2134                                                        p_load_ci_sequence_number => l_load_ci_sequence_number,
2135                                                        p_uoo_id                  => l_uooid,
2136                                                        p_program_cd              => p_dest_program_cd,
2137                                                        p_step_type               => 'FMAX_CRDT',
2138                                                        p_credit_points           => NULL, -- deliberately passing null, this value will be internally calculated
2139                                                        p_message_name            => l_message_name2,
2140                                                        p_deny_warn               => l_deny_warn,
2141                                                        p_return_status           => l_return_status,
2142                                                        p_enr_method              => l_enr_method);
2143 
2144 
2145             IF l_return_status = 'FALSE' AND l_deny_warn = 'WARN' THEN
2146 
2147               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'Y' THEN
2148                  FND_MESSAGE.SET_NAME( 'IGS' , l_message_name2);
2149                  FND_MSG_PUB.ADD;
2150               END IF;
2151 
2152             END IF; -- show warning message when rule failed in warn
2153 
2154 
2155             IF l_return_status = 'FALSE' AND l_deny_warn = 'DENY' THEN
2156 
2157               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'Y' THEN
2158                  FND_MESSAGE.SET_NAME( 'IGS' , l_message_name2);
2159                  FND_MSG_PUB.ADD;
2160                  p_return_status := FND_API.G_RET_STS_ERROR;
2161               END IF;
2162 
2163               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'N' THEN
2164                  FND_MESSAGE.SET_NAME( 'IGS' , l_message_name2);
2165                  FND_MSG_PUB.ADD;
2166                  p_return_status := FND_API.G_RET_STS_ERROR;
2167                  RAISE FND_API.G_EXC_ERROR;
2168               END IF;
2169 
2170             END IF; -- show warning/error message when rule failed in deny
2171 
2172             l_nth_occurence := l_nth_occurence + 1;
2173             l_cindex := INSTR(l_uooids_str,',',1,l_nth_occurence);
2174 
2175         END LOOP;-- end of WHILE LOOP for Max Cp Validation
2176 
2177         -- Validation for Min CP
2178         l_strtpoint      :=  0;
2179         l_pre_cindex     :=  0;
2180         l_nth_occurence  :=  1;
2181         l_cindex := INSTR(l_uooids_str,',',1,l_nth_occurence);
2182 
2183         WHILE (l_cindex <> 0 )  LOOP
2184 
2185               l_strtpoint  :=  l_pre_cindex + 1;
2186               l_endpoint   :=  l_cindex - l_strtpoint;
2187               l_pre_cindex :=  l_cindex;
2188               l_uooid := TO_NUMBER(substr(l_uooids_str,l_strtpoint,l_endpoint));
2189               l_message_name2 := NULL;
2190               l_deny_warn     := NULL;
2191               l_return_status := NULL;
2192               l_cal_type      := NULL;
2193               l_ci_sequence_number := NULL;
2194               l_load_cal_type := NULL;
2195               l_load_ci_sequence_number := NULL;
2196 
2197               OPEN c_get_unit_dtls(l_uooid);
2198               FETCH  c_get_unit_dtls INTO l_cal_type,l_ci_sequence_number;
2199               CLOSE c_get_unit_dtls;
2200 
2201               OPEN c_get_earliest_load_cal_dtls(l_cal_type,l_ci_sequence_number);
2202               FETCH c_get_earliest_load_cal_dtls INTO l_load_cal_type,l_load_ci_sequence_number;
2203               CLOSE c_get_earliest_load_cal_dtls;
2204                -- call the procedure to evaluate the Min CP by passing ZERO to the
2205                -- credit points parameter
2206               igs_en_enroll_wlst.ss_eval_min_or_max_cp(p_person_id               => p_person_id,
2207                                                        p_load_cal_type           => l_load_cal_type,
2208                                                        p_load_ci_sequence_number => l_load_ci_sequence_number,
2209                                                        p_uoo_id                  => l_uooid,
2210                                                        p_program_cd              => p_dest_program_cd,
2211                                                        p_step_type               => 'FMIN_CRDT',
2212                                                        p_credit_points           => 0.0, -- deliberately passing null, this value will be internally calculated
2213                                                        p_message_name            => l_message_name2,
2214                                                        p_deny_warn               => l_deny_warn,
2215                                                        p_return_status           => l_return_status,
2216                                                        p_enr_method              => l_enr_method);
2217 
2218 
2219             IF l_return_status = 'FALSE' AND l_deny_warn = 'WARN' THEN
2220 
2221               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'Y' THEN
2222                  FND_MESSAGE.SET_NAME( 'IGS' , l_message_name2);
2223                  FND_MSG_PUB.ADD;
2224               END IF;
2225 
2226             END IF; -- end of  l_return_status = 'FALSE' AND l_deny_warn = 'WARN'  IF THEN
2227 
2228             IF l_return_status = 'FALSE' AND l_deny_warn = 'DENY' THEN
2229 
2230               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'Y' THEN
2231                  FND_MESSAGE.SET_NAME( 'IGS' , l_message_name2);
2232                  FND_MSG_PUB.ADD;
2233                  p_return_status := FND_API.G_RET_STS_ERROR;
2234               END IF;
2235 
2236               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'N' THEN
2237                  FND_MESSAGE.SET_NAME( 'IGS' , l_message_name2);
2238                  FND_MSG_PUB.ADD;
2239                  p_return_status := FND_API.G_RET_STS_ERROR;
2240                  RAISE FND_API.G_EXC_ERROR;
2241               END IF;
2242 
2243             END IF; -- end of  l_return_status = 'FALSE' AND l_deny_warn = 'DENY'  IF THEN
2244 
2245 
2246             l_nth_occurence := l_nth_occurence + 1;
2247             l_cindex := INSTR(l_uooids_str,',',1,l_nth_occurence);
2248 
2249         END LOOP;-- end of WHILE LOOP for Min Cp Validation
2250 
2251         -- Evaluating all person steps except Min cp and Max cp
2252         l_strtpoint      :=  0;
2253         l_pre_cindex     :=  0;
2254         l_nth_occurence  :=  1;
2255         l_cindex := INSTR(l_uooids_str,',',1,l_nth_occurence);
2256 
2257         WHILE (l_cindex <> 0 )  LOOP
2258 
2259               l_strtpoint  :=  l_pre_cindex + 1;
2260               l_endpoint   :=  l_cindex - l_strtpoint;
2261               l_pre_cindex :=  l_cindex;
2262               l_uooid := TO_NUMBER(substr(l_uooids_str,l_strtpoint,l_endpoint));
2263               l_message_name2 := NULL;
2264               l_deny_warn     := NULL;
2265               l_return_status := NULL;
2266               l_cal_type      := NULL;
2267               l_ci_sequence_number := NULL;
2268               l_load_cal_type := NULL;
2269               l_load_ci_sequence_number := NULL;
2270 
2271 
2272               OPEN c_get_unit_dtls(l_uooid);
2273               FETCH  c_get_unit_dtls INTO l_cal_type,l_ci_sequence_number;
2274               CLOSE c_get_unit_dtls;
2275 
2276               OPEN c_get_earliest_load_cal_dtls(l_cal_type,l_ci_sequence_number);
2277               FETCH c_get_earliest_load_cal_dtls INTO l_load_cal_type,l_load_ci_sequence_number;
2278               CLOSE c_get_earliest_load_cal_dtls;
2279                -- call the procedure to evaluate the Min CP by passing ZERO to the
2280                -- credit points parameter
2281               IF igs_en_enroll_wlst.validate_prog (
2282                                          p_person_id          => p_person_id,
2283                                          p_cal_type           => l_load_cal_type,
2284                                          p_ci_sequence_number => l_load_ci_sequence_number,
2285                                          p_uoo_id             => l_uooid,
2286                                          p_course_cd          => p_dest_program_cd,
2287                                          p_enr_method_type    => l_enr_method,
2288                                          p_message_name       => l_message_name2,
2289                                          p_deny_warn          => l_deny_warn) THEN
2290                  l_return_status := 'TRUE';
2291               ELSE
2292                  l_return_status := 'FALSE';
2293               END IF;
2294 
2295              IF l_return_status = 'FALSE' AND l_deny_warn = 'WARN' THEN
2296 
2297               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'Y' THEN
2298                  -- l_message_name2 contains appended message names, hence parse and add to fnd_message pub
2299                  parse_messages( l_message_name2);
2300               END IF;
2301 
2302              END IF; -- end of  l_return_status = 'FALSE' AND l_deny_warn = 'WARN'  IF THEN
2303 
2304 
2305 
2306              IF l_return_status = 'FALSE' AND l_deny_warn = 'DENY' THEN
2307 
2308               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'Y' THEN
2309                  -- l_message_name2 contains appended message names, hence parse and add to fnd_message pub
2310                  parse_messages( l_message_name2);
2311                  p_return_status := FND_API.G_RET_STS_ERROR;
2312               END IF;
2313 
2314               IF l_message_name2 IS NOT NULL AND  p_show_warning = 'N' THEN
2315                  -- l_message_name2 contains appended message names, hence parse and add to fnd_message pub
2316                  parse_messages( l_message_name2);
2317                  p_return_status := FND_API.G_RET_STS_ERROR;
2318                  RAISE FND_API.G_EXC_ERROR;
2319               END IF;
2320 
2321              END IF; -- end of  l_return_status = 'FALSE' AND l_deny_warn = 'DENY'  IF THEN
2322 
2323             l_nth_occurence := l_nth_occurence + 1;
2324             l_cindex := INSTR(l_uooids_str,',',1,l_nth_occurence);
2325 
2326         END LOOP;-- end of WHILE LOOP for Min Cp Validation
2327 
2328 
2329 
2330     EXCEPTION
2331          WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
2332               RAISE;
2333          WHEN FND_API.G_EXC_ERROR THEN
2334               RAISE;
2335          WHEN OTHERS THEN
2336               Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2337               FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.validate_prgm_attend_type_step');
2338               IGS_GE_MSG_STACK.ADD;
2339               IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
2340                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.validate_prgm_attend_type_step :',SQLERRM);
2341               END IF;
2342               App_Exception.Raise_Exception;
2343    END validate_prgm_attend_type_step;
2344 
2345    PROCEDURE validate_src_prgm_unt_set_att(
2346       p_person_id               IN   NUMBER,
2347       p_source_program_cd       IN   VARCHAR2,
2348       p_source_prog_ver         IN   NUMBER,
2349       p_term_cal_type           IN   VARCHAR2,
2350       p_term_seq_num            IN   NUMBER,
2351       p_acad_cal_type           IN   VARCHAR2,
2352       p_acad_seq_num            IN   NUMBER,
2353       p_trans_approval_dt       IN   DATE,
2354       p_dest_program_cd         IN   VARCHAR2,
2355       p_dest_prog_ver           IN   NUMBER,
2356       p_dest_coo_id             IN   NUMBER,
2357       p_unit_sets_to_transfer   IN   VARCHAR2,
2358       p_unit_sets_not_selected  IN   VARCHAR2,
2359       p_unit_sets_having_errors OUT NOCOPY  VARCHAR2,
2360       p_show_warning            IN   VARCHAR2,
2361       p_return_status           IN OUT NOCOPY  VARCHAR2
2362    ) AS
2363   -------------------------------------------------------------------------------------------
2364   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
2365   -- Purpose : This procedure validates and transfers the unitsets againts the source program
2366   --           to the destination program.
2367   --Change History:
2368   --Who         When            What
2369 
2370   -------------------------------------------------------------------------------------------
2371 
2372        l_strtpoint NUMBER;
2373        l_endpoint  NUMBER;
2374        l_cindex    NUMBER;
2375        l_pre_cindex NUMBER;
2376        l_nth_occurence NUMBER;
2377        l_unitset_seqno_sep_index NUMBER;
2378        l_seqno_prmind_sep_index NUMBER;
2379        l_unitset_seqno_and_prmind VARCHAR2(300);
2380        l_unitset  VARCHAR2(50);
2381        l_seqno  NUMBER;
2382        l_prmind VARCHAR2(3);
2383        l_unitsets_to_transfer VARCHAR2(3000);
2384        l_unitset_append_count NUMBER;
2385 
2386        l_unitset_att_exists   BOOLEAN;
2387        l_val_susa_status      BOOLEAN;
2388        l_message_name         FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2389        l_message_name1         FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2390        l_message_name2         FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2391        l_message_name3         FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2392        l_message_name4         FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2393        l_message_text         VARCHAR2(1000);
2394        l_val_susa_tran        BOOLEAN;
2395        l_susa_cousr_status    BOOLEAN;
2396        l_status               BOOLEAN;
2397        l_status1               BOOLEAN;
2398        l_status2               BOOLEAN;
2399        l_error_occured BOOLEAN;
2400        CURSOR c_get_dest_unitset_att (c_person_id     IN     IGS_AS_SU_SETATMPT.person_id%TYPE,
2401                                       c_course_cd     IN     IGS_AS_SU_SETATMPT.course_cd%TYPE,
2402                                       c_unit_set_cd   IN     IGS_AS_SU_SETATMPT.unit_set_cd%TYPE) IS
2403            SELECT *
2404            FROM   IGS_AS_SU_SETATMPT
2405            WHERE  person_id = c_person_id   AND
2406                   course_cd = c_course_cd   AND
2407                   unit_set_cd = c_unit_set_cd;
2408        CURSOR c_get_unitset_att ( c_person_id         IN     IGS_AS_SU_SETATMPT.person_id%TYPE,
2409                                   c_course_cd         IN     IGS_AS_SU_SETATMPT.course_cd%TYPE,
2410                                   c_unit_set_cd       IN     IGS_AS_SU_SETATMPT.unit_set_cd%TYPE,
2411                                   c_sequence_number   IN     IGS_AS_SU_SETATMPT.sequence_number%TYPE) IS
2412            SELECT *
2413            FROM   IGS_AS_SU_SETATMPT
2414            WHERE  person_id = c_person_id   AND
2415                   course_cd = c_course_cd   AND
2416                   unit_set_cd = c_unit_set_cd AND
2417                   sequence_number = c_sequence_number ;
2418        l_dest_unitset_att_rec c_get_dest_unitset_att%ROWTYPE;
2419        l_unitset_att_rec      c_get_unitset_att%ROWTYPE;
2420 
2421   BEGIN
2422 
2423         l_strtpoint      :=  0;
2424         l_pre_cindex     :=  0;
2425         l_nth_occurence  :=  1;
2426         l_unitset_append_count := 1;
2427         l_unitsets_to_transfer := p_unit_sets_to_transfer ;
2428         l_cindex := INSTR(l_unitsets_to_transfer,';',1,l_nth_occurence);
2429         p_unit_sets_having_errors := null;
2430 
2431         WHILE (l_cindex <> 0 )  LOOP
2432               l_error_occured := FALSE;
2433               l_strtpoint  :=  l_pre_cindex + 1;
2434               l_endpoint   :=  l_cindex - l_strtpoint;
2435               l_pre_cindex :=  l_cindex;
2436               l_unitset_seqno_and_prmind := substr(l_unitsets_to_transfer,l_strtpoint,l_endpoint);
2437               l_unitset_seqno_sep_index  := INSTR(l_unitset_seqno_and_prmind,',',1);
2438               l_seqno_prmind_sep_index   := INSTR(l_unitset_seqno_and_prmind,',',1,2);
2439               l_unitset   :=   SUBSTR(l_unitset_seqno_and_prmind,1,l_unitset_seqno_sep_index - 1);
2440               l_seqno     :=   TO_NUMBER(SUBSTR(l_unitset_seqno_and_prmind,l_unitset_seqno_sep_index+1,l_seqno_prmind_sep_index -(l_unitset_seqno_sep_index+1)));
2441               l_prmind    :=   SUBSTR(l_unitset_seqno_and_prmind,l_seqno_prmind_sep_index + 1);
2442               l_unitset_att_exists := FALSE;
2443               l_val_susa_tran  := TRUE;
2444 
2445               OPEN c_get_dest_unitset_att(p_person_id,p_dest_program_cd,l_unitset);
2446               FETCH c_get_dest_unitset_att INTO l_dest_unitset_att_rec;
2447               IF (c_get_dest_unitset_att%FOUND) THEN
2448                CLOSE c_get_dest_unitset_att;
2449                l_unitset_att_exists := TRUE;
2450               ELSE
2451                CLOSE c_get_dest_unitset_att;
2452               END IF;
2453 
2454               IF NOT l_unitset_att_exists THEN
2455                  OPEN c_get_unitset_att(p_person_id,p_source_program_cd,l_unitset,l_seqno);
2456                  FETCH c_get_unitset_att INTO l_unitset_att_rec;
2457                  CLOSE c_get_unitset_att;
2458                  l_val_susa_status := IGS_EN_VAL_SUSA.ENRP_VAL_SUSA( p_person_id,
2459                                                                      p_dest_program_cd ,
2460                                                                      l_unitset,
2461                                                                      l_unitset_att_rec.sequence_number  ,
2462                                                                      l_unitset_att_rec.us_version_number ,
2463                                                                      l_unitset_att_rec.selection_dt ,
2464                                                                      l_unitset_att_rec.student_confirmed_ind ,
2465                                                                      l_unitset_att_rec.end_dt ,
2466                                                                      l_unitset_att_rec.parent_unit_set_cd ,
2467                                                                      l_unitset_att_rec.parent_sequence_number ,
2468                                                                      l_unitset_att_rec.primary_set_ind ,
2469                                                                      l_unitset_att_rec.voluntary_end_ind,
2470                                                                      l_unitset_att_rec.authorised_person_id ,
2471                                                                      l_unitset_att_rec.authorised_on,
2472                                                                      l_unitset_att_rec.override_title,
2473                                                                      l_unitset_att_rec.rqrmnts_complete_ind,
2474                                                                      l_unitset_att_rec.rqrmnts_complete_dt,
2475                                                                      l_unitset_att_rec.s_completed_source_type,
2476                                                                      'INSERT',
2477                                                                      l_message_name,
2478                                                                      l_message_text);
2479 
2480                IF  ( l_val_susa_status = FALSE AND  l_message_name IS NOT NULL ) THEN
2481 
2482                      IF l_message_name IN ('IGS_EN_UNIT_SET_PARENT_UNITSE',
2483                                            'IGS_EN_UNIT_SET_RELATIONSHIP','IGS_EN_UNITSET_HAVE_ONE_PAREN',
2484                                            'IGS_EN_UNIT_SET_NOTBE_PARENT','IGS_EN_UNIT_SET_NOT_ENDDT',
2485                                            'IGS_EN_INVALID_RELATIONSHIP','IGS_EN_UNIT_SET_PARENTSET_CON') THEN
2486                                    null;
2487                      ELSIF (p_show_warning = 'N' ) THEN
2488                             IF l_unitset_append_count = 1 THEN
2489                                p_unit_sets_having_errors := l_unitset_seqno_and_prmind || ';' ;
2490                             ELSE
2491                                p_unit_sets_having_errors := p_unit_sets_having_errors || l_unitset_seqno_and_prmind || ';' ;
2492                             END IF;
2493                             l_unitset_append_count := l_unitset_append_count + 1;
2494                             FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_US_TRN');
2495                             FND_MESSAGE.SET_TOKEN('UNIT_SET_CD',l_unitset);
2496                             FND_MESSAGE.SET_TOKEN('US_VERSION_NUMBER',l_unitset_att_rec.us_version_number);
2497                             FND_MSG_PUB.ADD;
2498                             FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
2499                             FND_MSG_PUB.ADD;
2500                             RAISE FND_API.G_EXC_ERROR;
2501                      ELSIF (p_show_warning = 'Y' ) THEN
2502                         -- if error occured for the first time for this unit set then log the heading and
2503                         -- increment the count and append to out param. Ignore this logic when further errors occur
2504                         IF NOT l_error_occured THEN
2505                             l_error_occured := TRUE;
2506                             IF l_unitset_append_count = 1 THEN
2507                                p_unit_sets_having_errors := l_unitset_seqno_and_prmind || ';' ;
2508                             ELSE
2509                                p_unit_sets_having_errors := p_unit_sets_having_errors || l_unitset_seqno_and_prmind || ';' ;
2510                             END IF;
2511                             l_unitset_append_count := l_unitset_append_count + 1;
2512                             FND_MESSAGE.SET_NAME('IGS','IGS_EN_WARN_US_TRN');
2513                             FND_MESSAGE.SET_TOKEN('UNIT_SET_CD',l_unitset);
2514                             FND_MESSAGE.SET_TOKEN('US_VERSION_NUMBER',l_unitset_att_rec.us_version_number);
2515                             FND_MSG_PUB.ADD;
2516                         END IF;
2517                         FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
2518                         FND_MSG_PUB.ADD;
2519                         p_return_status := FND_API.G_RET_STS_ERROR;
2520                         l_val_susa_tran  := FALSE;
2521 
2522                      END IF;-- end of    l_message_name IN IF THEN
2523 
2524                  END IF;--end of l_val_susa_status = FALSE
2525 
2526                  IF l_val_susa_tran THEN
2527                     IF IGS_EN_GEN_010.ENRP_INS_SUSA_TRNSFR (p_person_id,
2528                                                             p_source_program_cd,
2529                                                             p_dest_program_cd,
2530                                                             l_unitset,
2531                                                             l_unitset_att_rec.us_version_number,
2532                                                             l_unitset_att_rec.sequence_number,
2533                                                             l_unitset_att_rec.primary_set_ind ,
2534                                                             l_message_name) = FALSE THEN
2535                         IF l_message_name  IN ('IGS_EN_UNITSET_REQ_AUTHORISAT',
2536                                                'IGS_EN_UNITSET_HAVE_ONE_PAREN') THEN
2537                            null;
2538                         ELSIF  l_message_name IN ('IGS_EN_SUA_SET_ATT_TRNS_EXIST','IGS_GE_INVALID_VALUE','IGS_EN_PRIMARY_INDICATOR_NOT',
2539                                                  'IGS_EN_PRIMARY_IND_NOT_SET','IGS_EN_UNIT_SET_SPA_ENR_INACT','IGS_EN_UNIT_SET_UNCONF_REQ',
2540                                                  'IGS_EN_UNIT_SET_UNCONF_ENDDT','IGS_EN_UNIT_SET_PARENTSET_CON','IGS_EN_NOTDEL_UNITSET_COMPL',
2541                                                  'IGS_EN_UNITSET_REQ_ENDED','IGS_EN_UNIT_SET_NO_OPEN','IGS_EN_UNIT_SET_EXISTS',
2542                                                  'IGS_EN_INVALID_RELATIONSHIP', 'IGS_EN_UNIT_SET_NOT_ENDDT','IGS_EN_UNIT_SET_NOT_PARENT_EX',
2543                                                  'IGS_EN_UNIT_SET_NOTBE_PARENT', 'IGS_EN_UNIT_SET_PARENT_UNITSE','IGS_EN_UNIT_SET_RELATIONSHIP',
2544                                                  'IGS_EN_UNIT_SETST_ACTIVE', 'IGS_EN_UNIT_SET_EXPDT_NOTSET','IGS_EN_UNIT_SET_REQ_AUTHORISA',
2545                                                  'IGS_EN_NOTDEL_UNITSET_COND', 'IGS_EN_NOTDEL_UNITSET_PARENT','IGS_EN_NOTDEL_UNITSET_ENDED',
2546                                                  'IGS_EN_VOLUNTARY_END_INDICATO','IGS_EN_UNIT_SET_UNCONF_SETDT','IGS_EN_UNIT_SET_UNCONF_NOTSET',
2547                                                  'IGS_EN_ENDDT_NOTBE_EARLIER_DT','IGS_EN_ENDDT_COMPLDT_NOTSET','IGS_EN_SELDT_LE_CURR_DT',
2548                                                  'IGS_EN_ENDDT_LE_CURR_DT','IGS_EN_COMPLDT_LE_CURR_DT','IGS_EN_COMPLDT_GE_CURR_DT',
2549                                                  'IGS_EN_SYS_COMPL_SRCTYPE_SET','IGS_EN_COMPL_DT_SET_COMPL_IND','IGS_EN_COMPLDT_NOTBE_SET_COMP',
2550                                                  'IGS_EN_SU_SET_MUSTBE_CONFIRME','IGS_EN_AUTHORISED_PRSN_NOT','IGS_EN_AUTHDT_AUTHPRSN_SET',
2551                                                  'IGS_EN_AUTHDT_NOTBE_AUTHPRSN','IGS_EN_AUTHDT_MUSTBE_SET','IGS_EN_UNIT_SETNOT_PERMITTED',
2552                                                  'IGS_EN_STUD_COMPL_UNITSET','IGS_EN_SUA_NOT_CREATED','IGS_EN_PERS_EXL_ENRL_UNT_SET'
2553                                                  ,'IGS_EN_PRSN_ENCUMB_REVOKING','IGS_EN_PERS_HAS_ENCUMB') THEN
2554                                  IF (p_show_warning = 'N' ) THEN
2555                                      IF l_unitset_append_count = 1 THEN
2556                                          p_unit_sets_having_errors := l_unitset_seqno_and_prmind || ';' ;
2557                                       ELSE
2558                                          p_unit_sets_having_errors := p_unit_sets_having_errors || l_unitset_seqno_and_prmind || ';' ;
2559                                       END IF;
2560                                       l_unitset_append_count := l_unitset_append_count + 1;
2561                                       FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_US_TRN');
2562                                       FND_MESSAGE.SET_TOKEN('UNIT_SET_CD',l_unitset);
2563                                       FND_MESSAGE.SET_TOKEN('US_VERSION_NUMBER',l_unitset_att_rec.us_version_number);
2564                                       FND_MSG_PUB.ADD;
2565                                       FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
2566                                       FND_MSG_PUB.ADD;
2567                                       RAISE FND_API.G_EXC_ERROR;
2568                                  ELSIF (p_show_warning = 'Y' ) THEN
2569                                     -- if error occured for the first time for this unit set then log the heading and
2570                                     -- increment the count and append to out param. Ignore this logic when further errors occur
2571                                     IF NOT l_error_occured THEN
2572                                       l_error_occured := TRUE;
2573                                       IF l_unitset_append_count = 1 THEN
2574                                          p_unit_sets_having_errors := l_unitset_seqno_and_prmind || ';' ;
2575                                       ELSE
2576                                          p_unit_sets_having_errors := p_unit_sets_having_errors || l_unitset_seqno_and_prmind || ';' ;
2577                                       END IF;
2578                                       l_unitset_append_count := l_unitset_append_count + 1;
2579                                       FND_MESSAGE.SET_NAME('IGS','IGS_EN_WARN_US_TRN');
2580                                       FND_MESSAGE.SET_TOKEN('UNIT_SET_CD',l_unitset);
2581                                       FND_MESSAGE.SET_TOKEN('US_VERSION_NUMBER',l_unitset_att_rec.us_version_number);
2582                                       FND_MSG_PUB.ADD;
2583                                     END IF;
2584                                     FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
2585                                     FND_MSG_PUB.ADD;
2586                                     p_return_status := FND_API.G_RET_STS_ERROR;
2587                                  END IF;-- end of   p_show_warning  = 'N'   IF THEN
2588 
2589                         END IF;-- END OF    l_message_name
2590 
2591 
2592                     END IF; -- END OF    IGS_EN_GEN_010.ENRP_INS_SUSA_TRNSFR IF THEN
2593 
2594                     OPEN c_get_dest_unitset_att(p_person_id,p_dest_program_cd,l_unitset);
2595                     FETCH c_get_dest_unitset_att INTO l_dest_unitset_att_rec;
2596                     CLOSE c_get_dest_unitset_att;
2597                     IF (l_dest_unitset_att_rec.primary_set_ind = 'Y') THEN
2598                         l_susa_cousr_status := IGS_EN_VAL_SUSA.enrp_val_susa_cousr(p_person_id,
2599                                                                                     p_dest_program_cd,
2600                                                                                     l_unitset,
2601                                                                                     l_dest_unitset_att_rec.us_version_number,
2602                                                                                     l_dest_unitset_att_rec.parent_unit_set_cd,
2603                                                                                     l_dest_unitset_att_rec.parent_sequence_number,
2604                                                                                     'E',
2605                                                                                     l_message_name1,
2606                                                                                     'Y');
2607                          IF (l_susa_cousr_status = FALSE ) THEN
2608                              l_status := IGS_EN_GEN_001.ENRP_DEL_SUSA_TRNSFR(p_person_id,
2609                                                                              p_dest_program_cd,
2610                                                                              l_unitset,
2611                                                                              l_dest_unitset_att_rec.us_version_number,
2612                                                                              l_message_name2);
2613                                 IF (p_show_warning = 'N' ) THEN
2614                                      IF l_unitset_append_count = 1 THEN
2615                                         p_unit_sets_having_errors := l_unitset_seqno_and_prmind || ';' ;
2616                                      ELSE
2617                                         p_unit_sets_having_errors := p_unit_sets_having_errors || l_unitset_seqno_and_prmind || ';' ;
2618                                      END IF;
2619                                      l_unitset_append_count := l_unitset_append_count + 1;
2620                                      FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_US_TRN');
2621                                      FND_MESSAGE.SET_TOKEN('UNIT_SET_CD',l_unitset);
2622                                      FND_MESSAGE.SET_TOKEN('US_VERSION_NUMBER',l_unitset_att_rec.us_version_number);
2623                                      FND_MSG_PUB.ADD;
2624                                      FND_MESSAGE.SET_NAME( 'IGS' , l_message_name1);
2625                                      FND_MSG_PUB.ADD;
2626                                      IF l_message_name2 IS NOT NULL THEN
2627                                         FND_MESSAGE.SET_NAME( 'IGS' , l_message_name2);
2628                                         FND_MSG_PUB.ADD;
2629                                      END IF;
2630                                      RAISE FND_API.G_EXC_ERROR;
2631                                 ELSIF (p_show_warning = 'Y' ) THEN
2632                                     -- if error occured for the first time for this unit set then log the heading and
2633                                     -- increment the count and append to out param. Ignore this logic when further errors occur
2634                                     IF NOT l_error_occured THEN
2635                                          l_error_occured := TRUE;
2636                                          IF l_unitset_append_count = 1 THEN
2637                                             p_unit_sets_having_errors := l_unitset_seqno_and_prmind || ';' ;
2638                                          ELSE
2639                                             p_unit_sets_having_errors := p_unit_sets_having_errors || l_unitset_seqno_and_prmind || ';' ;
2640                                          END IF;
2641                                          l_unitset_append_count := l_unitset_append_count + 1;
2642                                          FND_MESSAGE.SET_NAME('IGS','IGS_EN_WARN_US_TRN');
2643                                          FND_MESSAGE.SET_TOKEN('UNIT_SET_CD',l_unitset);
2644                                          FND_MESSAGE.SET_TOKEN('US_VERSION_NUMBER',l_unitset_att_rec.us_version_number);
2645                                          FND_MSG_PUB.ADD;
2646                                      END IF;
2647                                      FND_MESSAGE.SET_NAME( 'IGS' , l_message_name1);
2648                                      FND_MSG_PUB.ADD;
2649                                      IF l_message_name2 IS NOT NULL THEN
2650                                         FND_MESSAGE.SET_NAME( 'IGS' , l_message_name2);
2651                                         FND_MSG_PUB.ADD;
2652                                      END IF;
2653                                      p_return_status := FND_API.G_RET_STS_ERROR;
2654                                 END IF;-- end of   p_show_warning  = 'N'   IF THEN
2655 
2656                          ELSIF (l_susa_cousr_status = TRUE ) THEN
2657                                l_status :=  IGS_EN_VAL_SUSA.enrp_val_susa_parent(p_person_id,
2658                                                                                  p_dest_program_cd,
2659                                                                                  l_unitset,
2660                                                                                  l_dest_unitset_att_rec.sequence_number,
2661                                                                                  l_dest_unitset_att_rec.parent_unit_set_cd,
2662                                                                                  l_dest_unitset_att_rec.parent_sequence_number,
2663                                                                                  l_dest_unitset_att_rec.student_confirmed_ind,
2664                                                                                  l_message_name3,
2665                                                                                  'N');
2666                                IF (l_status = FALSE) THEN
2667                                    l_status1 := IGS_EN_GEN_001.ENRP_DEL_SUSA_TRNSFR(p_person_id,
2668                                                                              p_dest_program_cd,
2669                                                                              l_unitset,
2670                                                                              l_dest_unitset_att_rec.us_version_number,
2671                                                                              l_message_name4);
2672 
2673                                        IF (p_show_warning = 'N' ) THEN
2674                                            IF l_unitset_append_count = 1 THEN
2675                                               p_unit_sets_having_errors := l_unitset_seqno_and_prmind || ';' ;
2676                                            ELSE
2677                                               p_unit_sets_having_errors := p_unit_sets_having_errors || l_unitset_seqno_and_prmind || ';' ;
2678                                            END IF;
2679                                            l_unitset_append_count := l_unitset_append_count + 1;
2680                                            FND_MESSAGE.SET_NAME('IGS','IGS_EN_ERR_US_TRN');
2681                                            FND_MESSAGE.SET_TOKEN('UNIT_SET_CD',l_unitset);
2682                                            FND_MESSAGE.SET_TOKEN('US_VERSION_NUMBER',l_unitset_att_rec.us_version_number);
2683                                            FND_MSG_PUB.ADD;
2684                                            FND_MESSAGE.SET_NAME( 'IGS' , l_message_name3);
2685                                            FND_MSG_PUB.ADD;
2686                                            IF l_message_name2 IS NOT NULL THEN
2687                                                 FND_MESSAGE.SET_NAME( 'IGS' , l_message_name4);
2688                                                 FND_MSG_PUB.ADD;
2689                                            END IF;
2690                                            RAISE FND_API.G_EXC_ERROR;
2691                                        ELSIF (p_show_warning = 'Y' ) THEN
2692                                          -- if error occured for the first time for this unit set then log the heading and
2693                                          -- increment the count and append to out param. Ignore this logic when further errors occur
2694                                          IF NOT l_error_occured THEN
2695                                            l_error_occured := TRUE;
2696 
2697                                            IF l_unitset_append_count = 1 THEN
2698                                               p_unit_sets_having_errors := l_unitset_seqno_and_prmind || ';' ;
2699                                            ELSE
2700                                               p_unit_sets_having_errors := p_unit_sets_having_errors || l_unitset_seqno_and_prmind || ';' ;
2701                                            END IF;
2702                                            l_unitset_append_count := l_unitset_append_count + 1;
2703                                            FND_MESSAGE.SET_NAME('IGS','IGS_EN_WARN_US_TRN');
2704                                            FND_MESSAGE.SET_TOKEN('UNIT_SET_CD',l_unitset);
2705                                            FND_MESSAGE.SET_TOKEN('US_VERSION_NUMBER',l_unitset_att_rec.us_version_number);
2706                                            FND_MSG_PUB.ADD;
2707                                          END IF;
2708                                          FND_MESSAGE.SET_NAME( 'IGS' , l_message_name3);
2709                                          FND_MSG_PUB.ADD;
2710                                          IF l_message_name2 IS NOT NULL THEN
2711                                                 FND_MESSAGE.SET_NAME( 'IGS' , l_message_name4);
2712                                                 FND_MSG_PUB.ADD;
2713                                          END IF;
2714                                          p_return_status := FND_API.G_RET_STS_ERROR;
2715                                        END IF;-- end of   p_show_warning  = 'Y'   IF THEN
2716 
2717                                END IF;-- end of l_status = FALSE
2718 
2719                          END IF;-- end of l_susa_cousr_status = FALSE  IF THEN
2720 
2721                     END IF;--end of l_dest_unitset_att_rec.primary_set_ind = 'Y' IF THEN
2722 
2723                  END IF;--end of l_val_susa_tran IF THEN
2724 
2725               END IF;-- end of l_unitset_att_exists IF THEN
2726 
2727               l_nth_occurence := l_nth_occurence + 1;
2728               l_cindex := INSTR(l_unitsets_to_transfer,';',1,l_nth_occurence);
2729 
2730         END LOOP;-- end of WHILE LOOP
2731 
2732     EXCEPTION
2733        WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
2734             RAISE;
2735        WHEN FND_API.G_EXC_ERROR THEN
2736             RAISE;
2737        WHEN OTHERS THEN
2738             Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2739             FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.validate_src_prgm_unt_set_att');
2740             IGS_GE_MSG_STACK.ADD;
2741             IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
2742                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.validate_src_prgm_unt_set_att :',SQLERRM);
2743             END IF;
2744             App_Exception.Raise_Exception;
2745 
2746    END validate_src_prgm_unt_set_att;
2747 
2748    PROCEDURE update_source_prgm (
2749     p_person_id               IN   NUMBER,
2750     p_source_program_cd       IN   VARCHAR2,
2751     p_source_prog_ver         IN   NUMBER,
2752     p_dest_program_cd         IN   VARCHAR2,
2753     p_trans_approval_dt       IN   DATE,
2754     p_trans_actual_dt         IN   DATE,
2755     p_dest_fut_dt_trans_flag  IN   VARCHAR2,
2756     p_discontinue_source      IN   VARCHAR2,
2757     p_tran_across_careers     IN BOOLEAN,
2758     p_src_career_type         IN VARCHAR2
2759     ) AS
2760 
2761   -------------------------------------------------------------------------------------------
2762   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
2763   -- Purpose : This procedure updated the source program when it passes all validations
2764   --Change History:
2765   --Who         When            What
2766   --stutta    10-DEC-2004   Unsetting skip_before_after_dml( allowing recurrsion) if discontinue_source
2767   --                        is Y for a immediate transfer. This is the only case when skip_before_after
2768   --                        _dml is unset during the entire process of program transfer. Calculate
2769   --                        program attempt status depending on whether source is becoming PRIMARY/SECONDARY.
2770   --                        Pass the program attempt status to update row call. Bug#4046782
2771   --somasekar   13-apr-2005     bug# 4179106 modified to check the transfer status with 'S'
2772   --                                  instead of 'N'
2773   -------------------------------------------------------------------------------------------
2774 
2775 
2776     l_course_attempt_status  IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
2777     l_commencement_dt        IGS_EN_STDNT_PS_ATT.commencement_dt%TYPE;
2778     l_discont_reason_code         IGS_EN_DCNT_REASONCD.discontinuation_reason_cd%TYPE;
2779     l_status        BOOLEAN;
2780     l_message_name    FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2781     CURSOR c_course_type IS
2782     SELECT course_type
2783     FROM IGS_PS_VER
2784     WHERE COURSE_CD = p_source_program_cd
2785     AND VERSION_NUMBER  = p_source_prog_ver;
2786     CURSOR c_get_stdnt_ps_att_dtls IS
2787        SELECT *
2788        FROM IGS_EN_STDNT_PS_ATT
2789        WHERE person_id = p_person_id AND
2790              course_cd = p_source_program_cd;
2791     l_stdnt_ps_attempt_dtls_rec  c_get_stdnt_ps_att_dtls%ROWTYPE;
2792 
2793        CURSOR c_get_discont_reason IS
2794        SELECT discontinuation_reason_cd
2795        FROM IGS_EN_DCNT_REASONCD
2796        WHERE  dcnt_program_ind = 'Y' AND
2797               closed_ind   = 'N'     AND
2798                   sys_dflt_ind = 'Y'     AND
2799               s_discontinuation_reason_type = 'TRANSFER';
2800        -- check if any other active program exists in the source career other than the source program
2801        CURSOR c_act_src_prg_exists_as_prmy IS
2802        SELECT 'x'
2803        FROM IGS_EN_STDNT_PS_ATT sca,
2804             IGS_PS_VER pv
2805        WHERE sca.person_id   = p_person_id AND
2806              sca.course_cd = pv.course_cd AND
2807              sca.version_number = pv.version_number AND
2808              pv.course_type =  p_src_career_type AND
2809             sca.course_cd   <> p_source_program_cd AND
2810             sca.course_attempt_status IN ('ENROLLED','INACTIVE','LAPSED','INTERMIT');
2811     l_act_src_exist_across_career  c_act_src_prg_exists_as_prmy%ROWTYPE;
2812     l_course_type igs_ps_ver.course_type%TYPE;
2813    BEGIN
2814 
2815     OPEN c_get_stdnt_ps_att_dtls;
2816     FETCH c_get_stdnt_ps_att_dtls INTO l_stdnt_ps_attempt_dtls_rec;
2817     CLOSE c_get_stdnt_ps_att_dtls;
2818     IF  p_discontinue_source = 'Y' AND p_dest_fut_dt_trans_flag = 'S' THEN
2819        -- discontinue source and any enrolled unit attempts left in it
2820        -- this procedure will automatically make the source secondary and make some other program in that career primary
2821         OPEN c_get_discont_reason;
2822         FETCH c_get_discont_reason INTO l_discont_reason_code;
2823         CLOSE c_get_discont_reason;
2824         IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml := FALSE;
2825          -- discontinue the source program attempt on the same date as the program ransfer record was created
2826          l_status :=   IGS_EN_GEN_012.ENRP_UPD_SCA_DISCONT (
2827                                                  p_person_id,
2828                                                  p_source_program_cd,
2829                                                  p_source_prog_ver,
2830                                                  l_stdnt_ps_attempt_dtls_rec.course_attempt_status,
2831                                                  l_stdnt_ps_attempt_dtls_rec.commencement_dt,
2832                                                  p_trans_actual_dt,
2833                                                  l_discont_reason_code,
2834                                                  l_message_name,
2835                                                  'PROGRAM_TRANSFER' ,
2836                                                   p_dest_program_cd
2837                                                  );
2838 
2839          IF l_status = FALSE THEN
2840             FND_MESSAGE.SET_NAME('IGS',l_message_name);
2841             FND_MSG_PUB.ADD;
2842             FND_MESSAGE.SET_NAME('IGS', 'IGS_EN_UNABLE_DISCONT_FROM');
2843             FND_MSG_PUB.ADD;
2844             RAISE FND_API.G_EXC_ERROR;
2845          END IF;
2846     ELSIF  p_discontinue_source = 'N'  AND p_dest_fut_dt_trans_flag = 'S' THEN
2847           -- if source is key then make it non key because destination is already being made key in this case
2848           IF l_stdnt_ps_attempt_dtls_rec.key_program = 'Y' THEN
2849              l_stdnt_ps_attempt_dtls_rec.key_program := 'N';
2850           END IF;
2851 
2852 
2853           -- set the primary program type of the source as appropriate
2854           IF NOT p_tran_across_careers AND is_career_model_enabled THEN
2855                 -- for transfers within career immediate transfers always make source secondary even when source is not discontinued
2856                   l_stdnt_ps_attempt_dtls_rec.primary_program_type := 'SECONDARY';
2857           END IF;
2858 
2859           -- DERIVE THE STATUS OF THE SOURCE PROGRAM ATTEMPT
2860           IF l_stdnt_ps_attempt_dtls_rec.primary_program_type = 'PRIMARY' OR NOT is_career_model_enabled THEN
2861              -- the source program is a primary or this is program mode, so derive proper status
2862                     l_stdnt_ps_attempt_dtls_rec.course_attempt_status :=
2863                             igs_en_gen_006.Enrp_Get_Sca_Status(
2864                                 p_person_id => l_stdnt_ps_attempt_dtls_rec.person_id,
2865                                 p_course_cd =>  l_stdnt_ps_attempt_dtls_rec.course_cd,
2866                                 p_course_attempt_status => l_stdnt_ps_attempt_dtls_rec.course_attempt_status,
2867                                 p_student_confirmed_ind => l_stdnt_ps_attempt_dtls_rec.student_confirmed_ind,
2868                                 p_discontinued_dt => NULL,
2869                                 p_lapsed_dt => l_stdnt_ps_attempt_dtls_rec.lapsed_dt,
2870                                 p_course_rqrmnt_complete_ind => l_stdnt_ps_attempt_dtls_rec.course_rqrmnt_complete_ind,
2871                                 p_logical_delete_dt => l_stdnt_ps_attempt_dtls_rec.logical_delete_dt );
2872           ELSE
2873                   OPEN c_course_type;
2874                   FETCH c_course_type INTO l_course_type;
2875                   CLOSE c_course_type;
2876               -- the source program is a secondary, so derive proper status
2877                 l_stdnt_ps_attempt_dtls_rec.course_attempt_status :=
2878                     igs_en_career_model.enrp_get_sec_sca_status( l_stdnt_ps_attempt_dtls_rec.person_id ,
2879                                   l_stdnt_ps_attempt_dtls_rec.course_cd ,
2880                                   l_stdnt_ps_attempt_dtls_rec.course_attempt_status,
2881                                   l_stdnt_ps_attempt_dtls_rec.primary_program_type ,
2882                                   l_stdnt_ps_attempt_dtls_rec.primary_prog_type_source,
2883                                   l_course_type ,
2884                                   p_dest_program_cd);
2885           END IF;
2886 
2887               IGS_EN_STDNT_PS_ATT_PKG.UPDATE_ROW(
2888                       X_ROWID                               => l_stdnt_ps_attempt_dtls_rec.row_id,
2889                       X_PERSON_ID                           => l_stdnt_ps_attempt_dtls_rec.PERSON_ID,
2890                       X_COURSE_CD                           => l_stdnt_ps_attempt_dtls_rec.COURSE_CD,
2891                       X_ADVANCED_STANDING_IND       => l_stdnt_ps_attempt_dtls_rec.ADVANCED_STANDING_IND,
2892                       X_FEE_CAT                             => l_stdnt_ps_attempt_dtls_rec.fee_cat,
2893                       X_CORRESPONDENCE_CAT              => l_stdnt_ps_attempt_dtls_rec.correspondence_cat,
2894                       X_SELF_HELP_GROUP_IND             => l_stdnt_ps_attempt_dtls_rec.SELF_HELP_GROUP_IND,
2895                       X_LOGICAL_DELETE_DT               => l_stdnt_ps_attempt_dtls_rec.logical_delete_dt,
2896                       X_ADM_ADMISSION_APPL_NUMBER       => l_stdnt_ps_attempt_dtls_rec.adm_admission_appl_number,
2897                       X_ADM_NOMINATED_COURSE_CD         => l_stdnt_ps_attempt_dtls_rec.adm_nominated_course_cd,
2898                       X_ADM_SEQUENCE_NUMBER                     => l_stdnt_ps_attempt_dtls_rec.adm_sequence_number,
2899                       X_VERSION_NUMBER                          => l_stdnt_ps_attempt_dtls_rec.version_number,
2900                       X_CAL_TYPE                                        => l_stdnt_ps_attempt_dtls_rec.cal_type,
2901                       X_LOCATION_CD                                     => l_stdnt_ps_attempt_dtls_rec.location_cd,
2902                       X_ATTENDANCE_MODE                         => l_stdnt_ps_attempt_dtls_rec.attendance_mode,
2903                       X_ATTENDANCE_TYPE                         => l_stdnt_ps_attempt_dtls_rec.attendance_type,
2904                       X_COO_ID                                          => l_stdnt_ps_attempt_dtls_rec.coo_id,
2905                       X_STUDENT_CONFIRMED_IND           => l_stdnt_ps_attempt_dtls_rec.student_confirmed_ind,
2906                       X_COMMENCEMENT_DT                         => l_stdnt_ps_attempt_dtls_rec.commencement_dt,
2907                       X_COURSE_ATTEMPT_STATUS           => l_stdnt_ps_attempt_dtls_rec.course_attempt_status,
2908                       X_PROGRESSION_STATUS                      => l_stdnt_ps_attempt_dtls_rec.PROGRESSION_STATUS,
2909                       X_DERIVED_ATT_TYPE                        => l_stdnt_ps_attempt_dtls_rec.DERIVED_ATT_TYPE,
2910                       X_DERIVED_ATT_MODE                        => l_stdnt_ps_attempt_dtls_rec.DERIVED_ATT_MODE,
2911                       X_PROVISIONAL_IND                         => l_stdnt_ps_attempt_dtls_rec.provisional_ind,
2912                       X_DISCONTINUED_DT                         => l_stdnt_ps_attempt_dtls_rec.discontinued_dt,
2913                       X_DISCONTINUATION_REASON_CD       => l_stdnt_ps_attempt_dtls_rec.discontinuation_reason_cd,
2914                       X_LAPSED_DT                               => l_stdnt_ps_attempt_dtls_rec.LAPSED_DT,
2915                       X_FUNDING_SOURCE                      => l_stdnt_ps_attempt_dtls_rec.funding_source,
2916                       X_EXAM_LOCATION_CD                    => l_stdnt_ps_attempt_dtls_rec.EXAM_LOCATION_CD,
2917                       X_DERIVED_COMPLETION_YR           => l_stdnt_ps_attempt_dtls_rec.DERIVED_COMPLETION_YR,
2918                       X_DERIVED_COMPLETION_PERD         => l_stdnt_ps_attempt_dtls_rec.DERIVED_COMPLETION_PERD,
2919                       X_NOMINATED_COMPLETION_YR         => l_stdnt_ps_attempt_dtls_rec.nominated_completion_yr,
2920                       X_NOMINATED_COMPLETION_PERD       => l_stdnt_ps_attempt_dtls_rec.NOMINATED_COMPLETION_PERD,
2921                       X_RULE_CHECK_IND                      => l_stdnt_ps_attempt_dtls_rec.RULE_CHECK_IND,
2922                       X_WAIVE_OPTION_CHECK_IND          => l_stdnt_ps_attempt_dtls_rec.WAIVE_OPTION_CHECK_IND,
2923                       X_LAST_RULE_CHECK_DT                  => l_stdnt_ps_attempt_dtls_rec.LAST_RULE_CHECK_DT,
2924                       X_PUBLISH_OUTCOMES_IND            => l_stdnt_ps_attempt_dtls_rec.PUBLISH_OUTCOMES_IND,
2925                       X_COURSE_RQRMNT_COMPLETE_IND      => l_stdnt_ps_attempt_dtls_rec.COURSE_RQRMNT_COMPLETE_IND,
2926                       X_COURSE_RQRMNTS_COMPLETE_DT      => l_stdnt_ps_attempt_dtls_rec.COURSE_RQRMNTS_COMPLETE_DT,
2927                       X_S_COMPLETED_SOURCE_TYPE     => l_stdnt_ps_attempt_dtls_rec.S_COMPLETED_SOURCE_TYPE,
2928                       X_OVERRIDE_TIME_LIMITATION    => l_stdnt_ps_attempt_dtls_rec.OVERRIDE_TIME_LIMITATION,
2929                       x_last_date_of_attendance     => l_stdnt_ps_attempt_dtls_rec.last_date_of_attendance,
2930                       x_dropped_by                          => l_stdnt_ps_attempt_dtls_rec.dropped_by,
2931                       X_IGS_PR_CLASS_STD_ID             => l_stdnt_ps_attempt_dtls_rec.igs_pr_class_std_id,
2932                       x_primary_program_type        => l_stdnt_ps_attempt_dtls_rec.primary_program_type,
2933                       x_primary_prog_type_source    => l_stdnt_ps_attempt_dtls_rec.primary_prog_type_source,
2934                       x_catalog_cal_type            => l_stdnt_ps_attempt_dtls_rec.catalog_cal_type,
2935                       x_catalog_seq_num             => l_stdnt_ps_attempt_dtls_rec.catalog_seq_num,
2936                       x_key_program                 => l_stdnt_ps_attempt_dtls_rec.key_program,
2937                       x_override_cmpl_dt            => l_stdnt_ps_attempt_dtls_rec.override_cmpl_dt,
2938                       x_manual_ovr_cmpl_dt_ind      => l_stdnt_ps_attempt_dtls_rec.manual_ovr_cmpl_dt_ind,
2939                       X_MODE                                =>  'R',
2940                       X_ATTRIBUTE_CATEGORY          => l_stdnt_ps_attempt_dtls_rec.attribute_category,
2941                       X_ATTRIBUTE1                  => l_stdnt_ps_attempt_dtls_rec.attribute1,
2942                       X_ATTRIBUTE2                  => l_stdnt_ps_attempt_dtls_rec.attribute2,
2943                       X_ATTRIBUTE3                  => l_stdnt_ps_attempt_dtls_rec.attribute3,
2944                       X_ATTRIBUTE4                  => l_stdnt_ps_attempt_dtls_rec.attribute4,
2945                       X_ATTRIBUTE5                  => l_stdnt_ps_attempt_dtls_rec.attribute5,
2946                       X_ATTRIBUTE6                  => l_stdnt_ps_attempt_dtls_rec.attribute6,
2947                       X_ATTRIBUTE7                  => l_stdnt_ps_attempt_dtls_rec.attribute7,
2948                       X_ATTRIBUTE8                  => l_stdnt_ps_attempt_dtls_rec.attribute8,
2949                       X_ATTRIBUTE9                  => l_stdnt_ps_attempt_dtls_rec.attribute9,
2950                       X_ATTRIBUTE10                 => l_stdnt_ps_attempt_dtls_rec.attribute10,
2951                       X_ATTRIBUTE11                 => l_stdnt_ps_attempt_dtls_rec.attribute11,
2952                       X_ATTRIBUTE12                 => l_stdnt_ps_attempt_dtls_rec.attribute12,
2953                       X_ATTRIBUTE13                 => l_stdnt_ps_attempt_dtls_rec.attribute13,
2954                       X_ATTRIBUTE14                 => l_stdnt_ps_attempt_dtls_rec.attribute14,
2955                       X_ATTRIBUTE15                 => l_stdnt_ps_attempt_dtls_rec.attribute15,
2956                       X_ATTRIBUTE16                 => l_stdnt_ps_attempt_dtls_rec.attribute16,
2957                       X_ATTRIBUTE17                 => l_stdnt_ps_attempt_dtls_rec.attribute17,
2958                       X_ATTRIBUTE18                 => l_stdnt_ps_attempt_dtls_rec.attribute18,
2959                       X_ATTRIBUTE19                 => l_stdnt_ps_attempt_dtls_rec.attribute19,
2960                       X_ATTRIBUTE20                 => l_stdnt_ps_attempt_dtls_rec.attribute20,
2961                       X_FUTURE_DATED_TRANS_FLAG     => l_stdnt_ps_attempt_dtls_rec.future_dated_trans_flag);
2962 
2963 
2964 
2965 
2966     END IF;-- end of  p_discontinue_source = 'Y' AND p_dest_fut_dt_trans_flag = 'N' IF THEN
2967 
2968     EXCEPTION
2969       WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
2970            IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml :=  FALSE ;
2971            RAISE;
2972       WHEN FND_API.G_EXC_ERROR THEN
2973            IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml :=  FALSE ;
2974            RAISE;
2975       WHEN OTHERS THEN
2976            IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml :=  FALSE ;
2977            Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2978            FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_TRANSFER_APIS.update_source_prgm');
2979            IGS_GE_MSG_STACK.ADD;
2980            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
2981                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.update_source_prgm :',SQLERRM);
2982            END IF;
2983            App_Exception.Raise_Exception;
2984 
2985   END update_source_prgm;
2986 
2987 
2988   PROCEDURE program_transfer_api(
2989       p_person_id               IN   NUMBER,
2990       p_source_program_cd       IN   VARCHAR2,
2991       p_source_prog_ver         IN   NUMBER,
2992       p_term_cal_type           IN   VARCHAR2,
2993       p_term_seq_num            IN   NUMBER,
2994       p_acad_cal_type           IN   VARCHAR2,
2995       p_acad_seq_num            IN   NUMBER,
2996       p_trans_approval_dt       IN   DATE,
2997       p_trans_actual_dt         IN   DATE,
2998       p_dest_program_cd         IN   VARCHAR2,
2999       p_dest_prog_ver           IN   NUMBER,
3000       p_dest_coo_id             IN   NUMBER,
3001       p_uoo_ids_to_transfer     IN   VARCHAR2,
3002       p_uoo_ids_not_selected    IN   VARCHAR2,
3003       p_uoo_ids_having_errors   OUT NOCOPY  VARCHAR2,
3004       p_unit_sets_to_transfer   IN   VARCHAR2,
3005       p_unit_sets_not_selected  IN   VARCHAR2,
3006       p_unit_sets_having_errors OUT NOCOPY VARCHAR2,
3007       p_transfer_av             IN   VARCHAR2,
3008       p_transfer_re             IN   VARCHAR2 ,
3009       p_discontinue_source      IN   VARCHAR2 ,
3010       p_show_warning            IN   VARCHAR2,
3011       p_call_from               IN   VARCHAR2,
3012       p_process_mode            IN   VARCHAR2,
3013       p_return_status           OUT NOCOPY  VARCHAR2,
3014       p_msg_data                OUT NOCOPY VARCHAR2,
3015       p_msg_count               OUT NOCOPY NUMBER
3016     ) AS
3017 
3018   -- NOTE: Parameters p_unit_sets_not_selected, p_uoo_ids_not_selected are not being used at the moment.
3019   -- they had been introduced earlier but are not being removed in anticipation of future need.
3020 
3021      -------------------------------------------------------------------------------------------
3022   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
3023   -- Purpose : This procedure validates holds,debt ,unit attempt transfer,unit set transfer by
3024   --           invoking appropriate procedures and  updates the source and destination program
3025   --           respectively
3026   --Change History:
3027   --Who         When            What
3028   --ckasu     02-DEC-2004     modified as a part of Bug#4044329
3029   --stutta    10-DEC-2004     Setting global skip_before_after_dml to TRUE before update
3030   --                          update destination, and unsetting it after update source. Bug #4046782
3031   -- smaddali  16-dec-04  modified for  bug#4063726
3032   --bdeviset  22-Dec-2004      Modifed so as to update the transfer record when the transfer deatils
3033   --                           are modified and added extra params status_date and status_flag for inserting
3034   --                           transfer record as part Bug#4083015.
3035   --amuthu    23-DEC-2004      In the career mode if the source program of a transfer is secondary
3036   --                           then an error message would be shown to the user.
3037   --                           If the source program is primary and unconfrimed then it can be transfered
3038   --                           only within the career, otherwise an error message would be shown.
3039   --bdeviset   31-DEC-2004      Bug# 4097481.Added a call to is_sua_enroll_eff_fut_term.
3040   --smaddali    5-jan-05        Bug#4103437 , modified logic for updating program transfer record
3041   --somasekar   13-apr-2005     bug# 4179106 modified to check the transfer status with 'S'
3042   --                                  instead of 'N'
3043   -- ckasu     08-DEC-2005     passed SYSDATE for update_source instead of p_actual_date param
3044   --                           as part of bug#4869869
3045 
3046   -------------------------------------------------------------------------------------------
3047 
3048     l_api_name                   CONSTANT    VARCHAR2(30) := 'PROGRAM_TRANSFER_APIS';
3049     l_discon_reason_code         IGS_EN_STDNT_PS_ATT.DISCONTINUED_DT%TYPE ;
3050     l_discon_dt                  IGS_EN_STDNT_PS_ATT.DISCONTINUATION_REASON_CD%TYPE ;
3051     l_status                     BOOLEAN;
3052     l_return_value               BOOLEAN;
3053     l_career_model_enabled       BOOLEAN;
3054     l_tran_across_careers        BOOLEAN;
3055     l_drop                       BOOLEAN;
3056     l_sct_tran_status            BOOLEAN;
3057     l_src_career_type            IGS_PS_VER.COURSE_TYPE%TYPE;
3058     l_message_name               FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
3059     l_debt_message_name          FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
3060     l_hold_status                BOOLEAN;
3061 
3062     l_person_type                   IGS_PE_PERSON_TYPES.person_type_code%TYPE;
3063     l_src_primary_prg_type    IGS_EN_STDNT_PS_ATT.PRIMARY_PROGRAM_TYPE%TYPE;
3064     l_src_key_prgm            IGS_EN_STDNT_PS_ATT.KEY_PROGRAM%TYPE;
3065     l_src_std_confrm_ind      IGS_EN_STDNT_PS_ATT.STUDENT_CONFIRMED_IND%TYPE;
3066     l_src_prg_reasearch_ind   IGS_PS_TYPE.research_type_ind%TYPE;
3067 
3068     l_dest_primary_prg_type    IGS_EN_STDNT_PS_ATT.PRIMARY_PROGRAM_TYPE%TYPE;
3069     l_old_dest_key_prgm_flag   IGS_EN_STDNT_PS_ATT.KEY_PROGRAM%TYPE;
3070     l_new_dest_key_prgm_flag   IGS_EN_STDNT_PS_ATT.KEY_PROGRAM%TYPE;
3071     l_dest_commence_dt         IGS_EN_STDNT_PS_ATT.COMMENCEMENT_DT%TYPE;
3072     l_dest_prg_reasearch_ind   IGS_PS_TYPE.research_type_ind%TYPE;
3073     l_dest_fut_dt_trans_flag   IGS_EN_STDNT_PS_ATT.FUTURE_DATED_TRANS_FLAG%TYPE;
3074     l_dest_std_confrm_ind      IGS_EN_STDNT_PS_ATT.STUDENT_CONFIRMED_IND%TYPE;
3075     l_course_attempt_status    IGS_EN_STDNT_PS_ATT.COURSE_ATTEMPT_STATUS%TYPE;
3076     l_status_date              CONSTANT DATE := SYSDATE;
3077     l_trans_rowid              VARCHAR2(25);
3078     l_trans_comments           igs_ps_stdnt_trn.comments%TYPE;
3079     l_trans_date               igs_ps_stdnt_trn.transfer_dt%TYPE;
3080     l_trans_status             igs_ps_stdnt_trn.status_flag%TYPE;
3081     l_unit_sets_to_transfer     VARCHAR2(4000);
3082 
3083     CURSOR c_get_key_val_frm_prg(c_person_id IGS_EN_STDNT_PS_ATT.PERSON_ID%TYPE,c_program_cd IGS_EN_STDNT_PS_ATT.COURSE_CD%TYPE) IS
3084        SELECT key_program ,student_confirmed_ind,commencement_dt, course_attempt_status
3085        FROM IGS_EN_STDNT_PS_ATT
3086        WHERE person_id = c_person_id and
3087             course_cd = c_program_cd;
3088 
3089     CURSOR c_get_std_course_ind_of_src (c_person_id IGS_EN_STDNT_PS_ATT.PERSON_ID%TYPE,c_program_cd IGS_EN_STDNT_PS_ATT.COURSE_CD%TYPE) IS
3090        SELECT student_confirmed_ind, primary_program_type
3091        FROM IGS_EN_STDNT_PS_ATT
3092        WHERE person_id = c_person_id and
3093             course_cd = c_program_cd;
3094     CURSOR c_get_progam_type(c_course_cd IGS_PS_VER.course_cd%TYPE,c_course_ver IGS_PS_VER.version_number%TYPE)  IS
3095        SELECT cty.research_type_ind
3096        FROM   IGS_PS_VER crv,
3097              IGS_PS_TYPE cty
3098        WHERE  crv.course_cd      = c_course_cd  AND
3099              crv.version_number = c_course_ver AND
3100              crv.course_type    = cty.course_type ;
3101 
3102     -- select any UNPROCESSED transfer record for the student with the same source and destination combo
3103     CURSOR c_chk_trans_rec (c_person_id igs_ps_stdnt_trn.person_id%TYPE,
3104                             c_course_cd igs_ps_stdnt_trn.course_cd%TYPE,
3105                             c_transfer_course_cd igs_ps_stdnt_trn.transfer_course_cd%TYPE) IS
3106      SELECT rowid, transfer_dt, comments
3107      FROM igs_ps_stdnt_trn
3108      WHERE person_id = c_person_id
3109      AND course_cd = c_course_cd
3110      AND transfer_course_cd = c_transfer_course_cd
3111      AND STATUS_FLAG = 'U';
3112 
3113    l_uooids_str  VARCHAR2(2000) ;
3114    l_uoo_ids_passed_transfer  VARCHAR2(4000);
3115 
3116 
3117     -- smaddali added the following cursors for bug#4085979
3118    -- Fetch the relevant admissions course transfer record.
3119    CURSOR c_act (  cp_person_id  IN     IGS_AD_PS_APPL.person_id%TYPE,
3120               cp_course_cd  IN     IGS_AD_PS_APPL.nominated_course_cd%TYPE,
3121               cp_transfer_course_cd       IN IGS_AD_PS_APPL.transfer_course_cd%TYPE) IS
3122               SELECT transfer_course_cd
3123               FROM   IGS_AD_PS_APPL
3124               WHERE  person_id = cp_person_id
3125               AND    nominated_course_cd = cp_course_cd
3126               AND    transfer_course_cd = cp_transfer_course_cd;
3127 
3128     -- check if a transfer record exists for the passed source and destination or not
3129     CURSOR c_trans_exists (c_person_id igs_ps_stdnt_trn.person_id%TYPE,
3130                             c_course_cd igs_ps_stdnt_trn.course_cd%TYPE,
3131                             c_transfer_course_cd igs_ps_stdnt_trn.transfer_course_cd%TYPE) IS
3132      SELECT  transfer_dt
3133      FROM igs_ps_stdnt_trn
3134      WHERE person_id = c_person_id
3135      AND course_cd = c_course_cd
3136      AND transfer_course_cd = c_transfer_course_cd
3137      AND status_flag <> 'C';
3138      l_trans_exists_rec c_trans_exists%ROWTYPE;
3139 
3140     l_adm_course_cd IGS_AD_PS_APPL.transfer_course_cd%TYPE;
3141     l_adm_transfer BOOLEAN;
3142 	l_key_program IGS_EN_SPA_TERMS.key_program_flag%TYPE;
3143   BEGIN
3144      SAVEPOINT TRANSFER_PRGM;
3145      FND_MSG_PUB.INITIALIZE;
3146      IF is_career_model_enabled THEN
3147        l_career_model_enabled := TRUE;
3148      ELSE
3149       l_career_model_enabled := FALSE;
3150      END IF;
3151      p_return_status := FND_API.G_RET_STS_SUCCESS;
3152      -- getting student confirmed indicator for source program
3153      OPEN c_get_std_course_ind_of_src(p_person_id,p_source_program_cd);
3154      FETCH c_get_std_course_ind_of_src INTO l_src_std_confrm_ind, l_src_primary_prg_type;
3155      CLOSE c_get_std_course_ind_of_src;
3156 
3157      IF l_career_model_enabled AND l_src_primary_prg_type = 'SECONDARY' THEN
3158        FND_MESSAGE.SET_NAME('IGS', 'IGS_EN_SEC_CANT_BE_SRC');
3159        FND_MSG_PUB.ADD;
3160        RAISE FND_API.G_EXC_ERROR;
3161      END IF;
3162 
3163      -- getting destination program key flag ,student confirmed
3164      -- indicator and destination commencement date values
3165      OPEN c_get_key_val_frm_prg(p_person_id,p_dest_program_cd);
3166      FETCH c_get_key_val_frm_prg INTO l_old_dest_key_prgm_flag,l_dest_std_confrm_ind,l_dest_commence_dt, l_course_attempt_status;
3167      CLOSE c_get_key_val_frm_prg;
3168 
3169      -- l_tran_across_careers is assigned with TRUE when transfer is across career else FALSE.
3170      IF  l_career_model_enabled THEN
3171              l_tran_across_careers := is_tranfer_across_careers(p_source_program_cd,
3172                                                           p_source_prog_ver,
3173                                                           p_dest_program_cd,
3174                                                           p_dest_prog_ver,
3175                                                           l_src_career_type);
3176              IF l_src_std_confrm_ind = 'N' AND l_tran_across_careers THEN
3177                FND_MESSAGE.SET_NAME('IGS', 'IGS_EN_UN_SRC_ONLY_INTRA');
3178                FND_MSG_PUB.ADD;
3179                RAISE FND_API.G_EXC_ERROR;
3180              END IF;
3181      END IF;
3182 
3183      l_new_dest_key_prgm_flag := l_old_dest_key_prgm_flag;
3184      l_uooids_str := NULL;
3185      l_adm_transfer := FALSE;
3186 
3187      l_person_type := Igs_En_Gen_008.enrp_get_person_type(p_course_cd =>NULL);
3188 
3189      -- this procedure validates the Holds
3190      check_for_holds(p_person_id,
3191                      p_dest_program_cd,
3192                      p_term_cal_type,
3193                      p_term_seq_num,
3194                      l_person_type,
3195                      p_return_status,
3196                      p_show_warning);
3197 
3198      -- this procedure validates the person steps
3199      validate_person_steps(p_person_id,
3200                            p_dest_program_cd,
3201                            p_dest_prog_ver,
3202                            p_term_cal_type,
3203                            p_term_seq_num,
3204                            p_acad_cal_type,
3205                            p_acad_seq_num,
3206                            l_person_type,
3207                            p_show_warning,
3208                            p_return_status);
3209 
3210         -- added for bug #4747585 by chanchal
3211        IF p_unit_sets_to_transfer IS NOT NULL THEN
3212 
3213           l_unit_sets_to_transfer := arrange_selected_unitsets(p_person_id,
3214                                                                p_source_program_cd,
3215                                                                p_unit_sets_to_transfer);
3216 
3217        END IF;
3218 
3219 
3220    -- This part need not be processed in case the stored future dated transfer records are being procesed for transfer
3221    -- since the research candidacy records were copied to the destination when the future dated transfer was created
3222    -- also the destination program attempt status has already been validated in the process wrapped. hence that too
3223    -- can be skipped.
3224    IF p_call_from <> 'PROCESS' THEN
3225 
3226      -- validating and transfering research candidacy of  source program that need to be transfered to destination
3227      IF p_transfer_re = 'Y' THEN
3228            -- smaddali   Modified for bug#4063726, to disable transfers between research and non research programs
3229           -- getting research type indicator value for source program
3230           OPEN c_get_progam_type(p_source_program_cd,p_source_prog_ver);
3231           FETCH c_get_progam_type INTO l_src_prg_reasearch_ind;
3232           CLOSE c_get_progam_type;
3233 
3234           -- getting research type indicator value for destination program
3235           OPEN c_get_progam_type(p_dest_program_cd,p_dest_prog_ver);
3236           FETCH c_get_progam_type INTO l_dest_prg_reasearch_ind;
3237           CLOSE c_get_progam_type;
3238 
3239           -- cheking whether destination is an reasearch program or not when source program
3240           -- is an research program.
3241           IF l_src_prg_reasearch_ind = 'N' OR  l_dest_prg_reasearch_ind = 'N' THEN
3242 
3243                 FND_MESSAGE.SET_NAME('IGS', 'IGS_EN_NOT_TRN_RESCAND');
3244                 FND_MSG_PUB.ADD;
3245                 RAISE FND_API.G_EXC_ERROR;
3246 
3247           END IF;-- end of l_src_prg_reasearch_ind = 'Y' IF THEN
3248 
3249           -- validating and transfering candidacy details
3250           validate_candidacy_tran_dtls(p_person_id,
3251                                        p_source_program_cd,
3252                                        p_source_prog_ver,
3253                                        p_dest_program_cd,
3254                                        p_dest_prog_ver,
3255                                        p_show_warning,
3256                                        p_return_status);
3257      END IF;-- end of p_transfer_re IF THEN
3258 
3259      -- when destination program is not confirmed then validating inorder to make it confirm
3260      IF l_dest_std_confrm_ind = 'N' THEN
3261         check_is_dest_prgm_actv_confrm (p_person_id,
3262                                         p_source_program_cd,
3263                                         p_acad_cal_type,
3264                                         p_acad_seq_num,
3265                                         p_dest_program_cd,
3266                                         p_show_warning,
3267                                         l_dest_std_confrm_ind);
3268 
3269         -- smaddali added logic for bug# 4085979
3270         -- to create the program transfer record before destination is confirmed.
3271         -- if the program is created thru an admission transfer application then
3272         -- program transfer record should be created before confirming the destination
3273         -- because the program attempt cannot be confirmed without a transfer record in this case
3274 
3275         -- check if this program is created thru an admission program transfer application
3276         OPEN c_act (p_person_id, p_dest_program_cd, p_source_program_cd);
3277         FETCH c_act INTO l_adm_course_cd;
3278         IF c_act%FOUND THEN
3279             -- check if there is no existing trasnfer record from this source to this destination
3280             l_trans_exists_rec := NULL ;
3281             OPEN c_trans_exists (p_person_id, p_dest_program_cd, p_source_program_cd);
3282             FETCH c_trans_exists INTO l_trans_exists_rec;
3283             IF c_trans_exists%NOTFOUND THEN
3284                   -- set the flag to indicate that program transfer record should be created before
3285                   -- confirming the destination program attempt
3286                   l_adm_transfer := TRUE;
3287             END IF;
3288             CLOSE c_trans_exists;
3289         END IF;
3290         CLOSE c_act;
3291 
3292      END IF;  -- end of l_dest_std_confrm_ind = 'N'
3293 
3294      -- this checks whether destination program is discontinued or not.
3295      is_destn_prgm_att_discon(p_person_id,p_dest_program_cd,p_dest_prog_ver,l_status);
3296 
3297      -- validation to check when destination program is discontinued status.
3298      IF  l_status THEN
3299          l_return_value :=  IGS_EN_GEN_006.ENRP_GET_SCA_ELGBL(p_person_id,
3300                                                               p_dest_program_cd,
3301                                                               'RETURN',
3302                                                               p_acad_cal_type,
3303                                                               p_acad_seq_num,
3304                                                               'Y',
3305                                                               l_message_name);
3306          IF l_return_value = FALSE AND l_message_name NOT IN ('IGS_EN_STUD_INELIG_TO_RE_ENR','IGS_EN_INELIGBLE_DUE_TO_LAPSE',
3307                                                                'IGS_EN_STUD_INELIGIBLE_RE_ENR','IGS_EN_STUD_NOT_HAVE_CURR_AFF',
3308                                                                'IGS_EN_INTERM_DOES_NOT_END') THEN
3309              FND_MESSAGE.SET_NAME( 'IGS' , l_message_name);
3310              FND_MSG_PUB.ADD;
3311              RAISE FND_API.G_EXC_ERROR;
3312          END IF;
3313          l_discon_dt  := NULL;
3314          l_discon_reason_code := NULL;
3315      END IF;
3316    END IF;
3317    -- p_call_from=PROCESS
3318 
3319      -- set the values of parameters to be used for further processing
3320      set_dest_prgm_att_params(p_person_id,
3321                               p_source_program_cd,
3322                               p_term_cal_type,
3323                               p_term_seq_num,
3324                               l_dest_primary_prg_type,
3325                               l_new_dest_key_prgm_flag,
3326                               l_dest_commence_dt,
3327                               l_dest_fut_dt_trans_flag,
3328                               p_transfer_re);
3329 
3330         -- smaddali added logic for bug# 4085979
3331         -- if the destination is unconfirmed and is created from admission transfer application then
3332         -- create the program transfer record before confirming the destination
3333         IF  l_adm_transfer  THEN
3334               -- derive the transfer status flag value
3335               IF l_dest_fut_dt_trans_flag = 'S' THEN
3336                 l_trans_status := 'T';
3337               ELSE
3338                 l_trans_status := 'U';
3339               END IF;
3340                 -- insert the transfer record.
3341                 l_sct_tran_status := IGS_EN_GEN_009.Enrp_Ins_Sct_Trnsfr(p_person_id ,
3342                                                                p_dest_program_cd ,
3343                                                                p_source_program_cd ,
3344                                                                p_trans_actual_dt ,
3345                                                                l_message_name ,
3346                                                                p_trans_approval_dt,
3347                                                                p_term_cal_type ,
3348                                                                p_term_seq_num,
3349                                                                p_discontinue_source,
3350                                                                p_uoo_ids_to_transfer,
3351                                                                l_unit_sets_to_transfer,
3352                                                                p_transfer_av,
3353                                                                l_status_date,
3354                                                                l_trans_status
3355                                                                );
3356         END IF ;  -- end of l_adm_transfer
3357 
3358 
3359      -- Updating destination program attempt during transfer.
3360      -- in this case the setting global variable to skip auto calculations of primary/secondary
3361      -- since the rank calculations need not be done. The destination will always be primary.
3362        IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml :=  TRUE ;
3363        update_destination_prgm(p_person_id,
3364                              p_source_program_cd,
3365                              p_dest_program_cd,
3366                              l_new_dest_key_prgm_flag,
3367                              l_dest_std_confrm_ind,
3368                              l_dest_fut_dt_trans_flag,
3369                              l_dest_commence_dt,
3370                              l_tran_across_careers,
3371                              p_term_cal_type ,
3372                              p_term_seq_num);
3373 
3374      -- Creating Transfer Record
3375      -- store the transfer date so that the same date can be used for creating unit transer record
3376      -- and discontinue source program attempt
3377      -- Transfer records are created when either its immediate trasnfer or when the future dates transfer is stored
3378      -- they will exist when a future dated trasnfer is actually processed.
3379 
3380       IF l_dest_fut_dt_trans_flag = 'S' THEN
3381         l_trans_status := 'T';
3382       ELSE
3383         l_trans_status := 'U';
3384       END IF;
3385 
3386       -- get the row in case an UNPROCESSED transfer record exists for
3387       -- the same pair of SPAs.
3388       OPEN c_chk_trans_rec (p_person_id, p_dest_program_cd, p_source_program_cd);
3389       FETCH c_chk_trans_rec INTO l_trans_rowid,l_trans_date, l_trans_comments;
3390       CLOSE c_chk_trans_rec;
3391       -- added extra check for unconfirmed admission applications, buig#4103437
3392       IF l_trans_rowid IS NOT NULL AND NOT l_adm_transfer THEN
3393          -- If an UNPROCESSED trasnfer record exists for the same pair of program codes
3394          -- then this record needs to be updated with the new information
3395          -- NOTE: The transfer term calendar information should be same as the old
3396          --       else the logic would need to change to delete the old term calendars
3397          --       and create new ones.
3398 
3399              igs_ps_stdnt_trn_pkg.update_row(
3400                   x_rowid => l_trans_rowid,
3401                   x_person_id => p_person_id,
3402                   x_course_cd => p_dest_program_cd,
3403                   x_transfer_course_cd => p_source_program_cd,
3404                   x_TRANSFER_DT =>  l_trans_date,
3405                   x_COMMENTS => l_trans_comments,
3406                   X_APPROVED_DATE => p_trans_approval_dt,
3407                   X_EFFECTIVE_TERM_CAL_TYPE => p_term_cal_type,
3408                   X_EFFECTIVE_TERM_SEQUENCE_NUM => p_term_seq_num,
3409                   X_DISCONTINUE_SOURCE_FLAG => p_discontinue_source,
3410                   X_UOOIDS_TO_TRANSFER => p_uoo_ids_to_transfer,
3411                   X_SUSA_TO_TRANSFER => l_unit_sets_to_transfer,
3412                   X_TRANSFER_ADV_STAND_FLAG => p_transfer_av,
3413                   X_STATUS_DATE => l_status_date,
3414                   X_STATUS_FLAG => l_trans_status
3415                   );
3416       ELSE
3417 
3418          -- when a future dated transfer is created If their is a enrolled/waitlisted/invalid unit attempt
3419          -- in the effective and future terms against destination program then future dated transfer cannot be stored
3420          IF p_call_from <> 'PROCESS' AND l_dest_fut_dt_trans_flag = 'Y' THEN
3421 
3422            IF is_sua_enroll_eff_fut_term( p_person_id,
3423                                           p_dest_program_cd,
3424                                           p_term_cal_type,
3425                                           p_term_seq_num ) THEN
3426 
3427              FND_MESSAGE.SET_NAME( 'IGS' , 'IGS_EN_ENR_SUA_CUR_FUT_TERM');
3428              FND_MSG_PUB.ADD;
3429              RAISE FND_API.G_EXC_ERROR;
3430 
3431           END IF;
3432 
3433          END IF;
3434 
3435          -- smaddali added condition to create program transfer record if it hasn't been created before confirming destination
3436          -- due to l_adm_transfer flag for bug# 4085979
3437          IF NOT l_adm_transfer  THEN
3438             -- insert the transfer record.
3439             l_sct_tran_status := IGS_EN_GEN_009.Enrp_Ins_Sct_Trnsfr(p_person_id ,
3440                                                                p_dest_program_cd ,
3441                                                                p_source_program_cd ,
3442                                                                p_trans_actual_dt ,
3443                                                                l_message_name ,
3444                                                                p_trans_approval_dt,
3445                                                                p_term_cal_type ,
3446                                                                p_term_seq_num,
3447                                                                p_discontinue_source,
3448                                                                p_uoo_ids_to_transfer,
3449                                                                l_unit_sets_to_transfer,
3450                                                                p_transfer_av,
3451                                                                l_status_date,
3452                                                                l_trans_status
3453                                                                );
3454          END IF;
3455 
3456          -- Creating Program Administration Record
3457          create_prgm_admin_record (p_person_id ,
3458                                  p_source_program_cd,
3459                                  p_dest_program_cd,
3460                                  p_acad_cal_type,
3461                                  p_acad_seq_num );
3462 
3463           -- creating term record for destination program
3464 		   l_key_program := FND_API.G_MISS_CHAR;
3465 		  IF (l_old_dest_key_prgm_flag <> l_new_dest_key_prgm_flag AND l_new_dest_key_prgm_flag = 'Y') THEN
3466 			-- term api expects key_program_flag values only when key is changing to Y.
3467 			l_key_program := 'Y';
3468 		  END IF;
3469           upd_or_create_dest_term_rec(p_person_id,
3470                                       p_dest_program_cd,
3471                                       p_term_cal_type,
3472                                       p_term_seq_num,
3473                                       l_key_program,
3474                                       l_message_name,
3475                                       l_dest_fut_dt_trans_flag);
3476       END IF; -- END of IF l_trans_rowid IS NOT NULL
3477 
3478 
3479      -- checking for debt when show warning is Y
3480      IF p_show_warning = 'Y' THEN
3481         check_for_debt(p_person_id ,
3482                        p_source_program_cd,
3483                        l_debt_message_name);
3484         IF l_debt_message_name IS NOT NULL THEN
3485            FND_MESSAGE.SET_NAME( 'IGS' , l_debt_message_name);
3486            FND_MSG_PUB.ADD;
3487         END IF;
3488      END IF;
3489 
3490 
3491    IF l_dest_fut_dt_trans_flag = 'S' THEN
3492 
3493      -- Either if the source SPA is discontinued or the job is run in drop mode
3494      -- all the unit attempts have to be dropped
3495      IF p_discontinue_source = 'Y' OR p_process_mode = 'DROP' OR ( is_career_model_enabled AND l_tran_across_careers = FALSE ) THEN
3496         l_drop := TRUE;
3497      ELSE
3498         l_drop := FALSE;
3499      END IF;
3500 
3501      -- validating  and transfering units of source program that need to be transfered to destination
3502      validate_src_prgm_unt_attempts(p_person_id,
3503                                     p_source_program_cd,
3504                                     p_source_prog_ver,
3505                                     p_term_cal_type,
3506                                     p_term_seq_num ,
3507                                     p_acad_cal_type ,
3508                                     p_acad_seq_num ,
3509                                     p_trans_approval_dt,
3510                                     p_trans_actual_dt,
3511                                     p_dest_program_cd,
3512                                     p_dest_prog_ver,
3513                                     p_dest_coo_id ,
3514                                     p_uoo_ids_to_transfer,
3515                                     l_uoo_ids_passed_transfer,
3516                                     p_uoo_ids_having_errors,
3517                                     l_uooids_str,
3518                                     l_dest_fut_dt_trans_flag,
3519                                     p_show_warning,
3520                                     l_drop,
3521                                     p_return_status
3522                                     );
3523     -- validate the program step validations for destination program attempt if any of the unit attempts are being transfered
3524     -- added this validation as part of bug#4063726
3525     IF l_uoo_ids_passed_transfer IS NOT NULL THEN
3526       validate_prgm_attend_type_step(p_person_id,
3527                                      p_dest_program_cd,
3528                                      l_uoo_ids_passed_transfer,
3529                                      p_show_warning,
3530                                      p_return_status);
3531     END IF;
3532 
3533     -- validating and transfering unit sets of source program that need to be transfered to destination
3534     validate_src_prgm_unt_set_att(p_person_id,
3535                                   p_source_program_cd,
3536                                   p_source_prog_ver,
3537                                   p_term_cal_type,
3538                                   p_term_seq_num,
3539                                   p_acad_cal_type,
3540                                   p_acad_seq_num,
3541                                   p_trans_approval_dt,
3542                                   p_dest_program_cd,
3543                                   p_dest_prog_ver,
3544                                   p_dest_coo_id,
3545                                   l_unit_sets_to_transfer ,
3546                                   p_unit_sets_not_selected,
3547                                   p_unit_sets_having_errors,
3548                                   p_show_warning,
3549                                   p_return_status);
3550 
3551 
3552    -- validating and transfering Advance standing of  source program that need to be transfered to destination
3553    IF p_transfer_av = 'Y' THEN
3554       validate_advance_st_tran_dtls(p_person_id,
3555                                     p_source_program_cd,
3556                                     p_source_prog_ver,
3557                                     p_dest_program_cd,
3558                                     p_dest_prog_ver,
3559                                     p_show_warning);
3560    END IF; -- end of   p_transfer_av = 'Y'  IF THEN
3561 
3562    -- updating source program attempt status and other values during transfer
3563    update_source_prgm (p_person_id,
3564                        p_source_program_cd,
3565                        p_source_prog_ver,
3566                        p_dest_program_cd,
3567                        p_trans_approval_dt,
3568                        l_status_date,
3569                           -- passing l_status_date = SYSDATE to p_trans_actual_dt parameter.
3570                           -- This parameter is used while discontinuing the source program and has be >= Transfer date
3571                        l_dest_fut_dt_trans_flag,
3572                        p_discontinue_source,
3573                        l_tran_across_careers,
3574                        l_src_career_type);
3575    END IF;
3576    -- its an immediate transfer.
3577 
3578    IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml := FALSE;
3579    FND_MSG_PUB.COUNT_AND_GET( p_count   => p_msg_count,
3580                                p_data    => p_msg_data);
3581 
3582    IF p_show_warning = 'Y' AND p_msg_count > 0 THEN
3583       ROLLBACK TO TRANSFER_PRGM;
3584    END IF;
3585 
3586   EXCEPTION
3587       WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
3588            IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml := FALSE;
3589            p_return_status := FND_API.G_RET_STS_ERROR;
3590            FND_MESSAGE.SET_ENCODED(FND_MESSAGE.GET_ENCODED());
3591            FND_MSG_PUB.ADD;
3592            FND_MSG_PUB.COUNT_AND_GET( p_count          => p_msg_count,
3593                                      p_data           => p_msg_data);
3594            ROLLBACK TO TRANSFER_PRGM;
3595       WHEN FND_API.G_EXC_ERROR THEN
3596            IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml := FALSE;
3597            p_return_status := FND_API.G_RET_STS_ERROR;
3598            FND_MSG_PUB.COUNT_AND_GET( p_count          => p_msg_count,
3599                                      p_data           => p_msg_data);
3600            ROLLBACK TO TRANSFER_PRGM;
3601       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3602            IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml := FALSE;
3603            p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3604            FND_MSG_PUB.COUNT_AND_GET( p_count          => p_msg_count,
3605                                      p_data           => p_msg_data);
3606            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
3607                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.program_transfer_api :',SQLERRM);
3608            END IF;
3609            ROLLBACK TO TRANSFER_PRGM;
3610       WHEN OTHERS THEN
3611            IGS_EN_STDNT_PS_ATT_PKG.skip_before_after_dml := FALSE;
3612            p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3613            IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3614               FND_MSG_PUB.Add_Exc_Msg(g_pkg_name,
3615                                     l_api_name);
3616            END IF;
3617           FND_MSG_PUB.COUNT_AND_GET( p_count          => p_msg_count,
3618                                      p_data           => p_msg_data);
3619            IF (FND_LOG.LEVEL_UNEXPECTED >= g_debug_level ) THEN
3620                 FND_LOG.STRING(fnd_log.level_unexpected, 'igs.patch.115.sql.igs_en_program_transfer_apis.program_transfer_api :',SQLERRM);
3621            END IF;
3622            ROLLBACK TO TRANSFER_PRGM;
3623 
3624   END PROGRAM_TRANSFER_API;
3625 
3626   PROCEDURE log_err_messages(
3627     p_msg_count      IN NUMBER,
3628     p_msg_data       IN VARCHAR2,
3629     p_warn_and_err_msg OUT NOCOPY VARCHAR2
3630   ) AS
3631    -------------------------------------------------------------------------------------------
3632    -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
3633    -- purpose : this methos concatenates al the warning and error messages delimited by '<br>'
3634    --           that were recieved during program transfer.
3635    --Change History:
3636    --Who         When            What
3637 
3638    --------------------------------------------------------------------------------------------
3639 
3640 
3641     l_msg_count      NUMBER(4);
3642     l_msg_data       VARCHAR2(4000);
3643     l_enc_msg        VARCHAR2(2000);
3644     l_msg_index      NUMBER(4);
3645     l_msg_text       FND_NEW_MESSAGES.MESSAGE_TEXT%TYPE;
3646     l_warn_and_err_msg VARCHAR2(5000);
3647 
3648   BEGIN
3649 
3650     l_msg_count := p_msg_count;
3651     l_msg_data := p_msg_data;
3652     l_warn_and_err_msg := null;
3653 
3654     IF l_msg_count =1 THEN
3655       FND_MESSAGE.SET_ENCODED(l_msg_data);
3656       l_msg_text := FND_MESSAGE.GET;
3657       l_warn_and_err_msg := l_msg_text || '<br>';
3658     ELSIF l_msg_count > 1 THEN
3659       FOR l_index IN 1..NVL(l_msg_count,0)
3660       LOOP
3661             FND_MSG_PUB.GET(FND_MSG_PUB.G_FIRST,
3662                             FND_API.G_TRUE,
3663                             l_enc_msg,
3664                             l_msg_index);
3665             FND_MESSAGE.SET_ENCODED(l_enc_msg);
3666             l_msg_text := FND_MESSAGE.GET;
3667             l_warn_and_err_msg := l_warn_and_err_msg||l_msg_text || '<br>';
3668 
3669             FND_MSG_PUB.DELETE_MSG(l_msg_index);
3670 
3671       END LOOP;
3672     END IF;
3673     p_warn_and_err_msg := l_warn_and_err_msg;
3674 
3675   END log_err_messages;
3676 
3677 
3678   PROCEDURE cleanup_job(
3679      errbuf             OUT  NOCOPY   VARCHAR2,
3680      retcode            OUT   NOCOPY   NUMBER,
3681      p_term_cal_comb    IN   VARCHAR2,
3682      p_mode             IN   VARCHAR2,
3683      p_ignore_warnings  IN   VARCHAR2,
3684      p_drop_enrolled    IN   VARCHAR2
3685      ) AS
3686   -------------------------------------------------------------------------------------------
3687   -- Created by  : Chandrasekhar Kasu, Oracle Student Systems Oracle IDC
3688   --Change History:
3689   --Who         When            What
3690   --ckasu     20-Nov-2004     changed the order of parameters passed
3691   --ckasu     17-JAN-2006     Added igs_ge_gen_003.set_org_id(NULL) as a part of bug#4958173.
3692   --------------------------------------------------------------------------------------------
3693 
3694   BEGIN
3695 
3696       igs_ge_gen_003.set_org_id(NULL);
3697       IGS_EN_FUTURE_DT_TRANS.process_fut_dt_trans(errbuf,
3698                                                   retcode,
3699                                                   p_term_cal_comb,
3700                                                   p_mode,
3701                                                   p_ignore_warnings,
3702                                                   p_drop_enrolled);
3703 
3704   END CLEANUP_JOB;
3705 
3706     FUNCTION arrange_selected_unitsets(
3707          p_person_id               IN   NUMBER,
3708          p_program_cd       IN   VARCHAR2,
3709          p_unit_sets_to_transfer     IN   VARCHAR2
3710          ) RETURN VARCHAR2 IS
3711  -------------------------------------------------------------------------------------------
3712   -- Created by  : chanchal tyagi, Oracle Student Systems Oracle IDC
3713   --Change History:
3714   --Who         When            What
3715   --ctyagi     25-Nov-2005       changed the order of unitset_attempt string
3716   -------------------------------------------------------------------------------------------
3717 
3718     CURSOR c_parent_exist (c_person_id IGS_EN_STDNT_PS_ATT.PERSON_ID%TYPE,
3719                            c_program_cd IGS_EN_STDNT_PS_ATT.COURSE_CD%TYPE,
3720                            c_unitset_cd   IGS_AS_SU_SETATMPT.UNIT_SET_CD%TYPE,
3721                            c_seq_no       IGS_AS_SU_SETATMPT.SEQUENCE_NUMBER%TYPE)
3722            IS
3723                SELECT 'x' FROM igs_as_su_setatmpt
3724                WHERE person_id = c_person_id
3725                AND  COURSE_CD =  c_program_cd
3726                AND  UNIT_SET_CD =   c_unitset_cd
3727                AND  SEQUENCE_NUMBER= c_seq_no
3728                AND PARENT_UNIT_SET_CD IS NOT NULL;
3729 
3730     CURSOR c_get_child (c_person_id IGS_EN_STDNT_PS_ATT.PERSON_ID%TYPE,
3731                         c_program_cd IGS_EN_STDNT_PS_ATT.COURSE_CD%TYPE,
3732                         c_unitset_cd   IGS_AS_SU_SETATMPT.UNIT_SET_CD%TYPE,
3733                         c_seq_no       IGS_AS_SU_SETATMPT.SEQUENCE_NUMBER%TYPE)
3734     IS
3735       select  susa.unit_set_cd || ',' || susa.sequence_number  AS unitcd_seqno
3736        from igs_as_su_setatmpt susa
3737        where susa.person_id =  c_person_id
3738              AND SUSA.COURSE_CD= c_program_cd
3739              AND level >= 2
3740        START WITH
3741              susa.person_id		= c_person_id AND
3742              susa.course_cd		= c_program_cd AND
3743              susa.unit_set_cd		= c_unitset_cd AND
3744              susa.sequence_number	= c_seq_no
3745        CONNECT BY
3746        PRIOR susa.person_id			= susa.person_id AND
3747        PRIOR susa.course_cd			= susa.course_cd AND
3748        PRIOR susa.unit_set_cd = susa.parent_unit_set_cd AND
3749        PRIOR susa.sequence_number = susa.parent_sequence_number
3750     ORDER BY level;
3751 
3752     l_strtpoint NUMBER;
3753     l_endpoint  NUMBER;
3754     l_cindex    NUMBER;
3755     l_pre_cindex NUMBER;
3756     l_nth_occurence NUMBER;
3757     l_unitset_seqno_sep_index NUMBER;
3758     l_seqno_prmind_sep_index NUMBER;
3759     l_unitset_seqno_and_prmind VARCHAR2(4000);
3760     l_unitset  VARCHAR2(4000);
3761     l_seqno  NUMBER;
3762     l_prmind VARCHAR2(4000);
3763     l_unitsets_to_transfer VARCHAR2(4000);
3764 
3765 
3766     l_parent_unit_cd VARCHAR2(4000);
3767 
3768     l_sub_token1  NUMBER;
3769     l_sub_token2  NUMBER;
3770     l_count_token NUMBER;
3771 
3772     l_token_str  VARCHAR2(4000);
3773 
3774     l_dummy c_parent_exist%ROWTYPE;
3775     l_dummy_unitcd_seqno  c_get_child%ROWTYPE;
3776 
3777     l_final_selected_unitset VARCHAR2(4000);
3778 
3779 
3780  BEGIN
3781 
3782        IF  p_unit_sets_to_transfer IS NOT NULL THEN
3783 
3784            l_unitsets_to_transfer := p_unit_sets_to_transfer;
3785            l_count_token    :=  1;
3786            l_strtpoint      :=  0;
3787            l_pre_cindex     :=  0;
3788            l_nth_occurence  :=  1;
3789            l_cindex := INSTR(l_unitsets_to_transfer,';',1,l_nth_occurence);
3790 
3791            --single unit set attempt selected
3792            IF l_cindex = length(p_unit_sets_to_transfer) THEN
3793                return p_unit_sets_to_transfer ;
3794             END IF;
3795 
3796            -- loop to get uniset wihtout any parent unitset
3797            WHILE (l_cindex <> 0) LOOP
3798               l_strtpoint  :=  l_pre_cindex + 1;
3799               l_endpoint   :=  l_cindex - l_strtpoint;
3800               l_pre_cindex :=  l_cindex;
3801               l_unitset_seqno_and_prmind := substr(l_unitsets_to_transfer,l_strtpoint,l_endpoint);
3802               l_unitset_seqno_sep_index  := INSTR(l_unitset_seqno_and_prmind,',',1);
3803               l_seqno_prmind_sep_index   := INSTR(l_unitset_seqno_and_prmind,',',1,2);
3804               l_unitset   :=   SUBSTR(l_unitset_seqno_and_prmind,1,l_unitset_seqno_sep_index - 1);
3805               l_seqno     :=   TO_NUMBER(SUBSTR(l_unitset_seqno_and_prmind,l_unitset_seqno_sep_index+1,l_seqno_prmind_sep_index -(l_unitset_seqno_sep_index+1)));
3806               l_prmind    :=   SUBSTR(l_unitset_seqno_and_prmind,l_seqno_prmind_sep_index + 1);
3807 
3808 
3809 
3810                OPEN   c_parent_exist(p_person_id,p_program_cd,l_unitset,l_seqno);
3811                FETCH  c_parent_exist INTO l_dummy;
3812                 IF   c_parent_exist%NOTFOUND THEN
3813                       CLOSE  c_parent_exist;
3814                       l_final_selected_unitset := l_final_selected_unitset || l_unitset_seqno_and_prmind || ';'  ;
3815 
3816                       l_count_token :=  l_count_token+1;
3817                       l_nth_occurence := l_nth_occurence + 1;
3818                       l_cindex := INSTR(l_unitsets_to_transfer,';',1,l_nth_occurence);
3819                 ELSE
3820                 CLOSE  c_parent_exist;
3821                       EXIT ;
3822                 END IF;
3823 
3824            END LOOP;
3825 
3826 
3827 
3828            IF  l_cindex <   NVL(Length(l_unitsets_to_transfer),0) THEN
3829 
3830 
3831                  l_strtpoint      :=  0;
3832                  l_pre_cindex     :=  0;
3833                  l_nth_occurence  :=  1;
3834 
3835                  -- loop for all top parent and add the child record
3836                  WHILE  (l_count_token > 1 ) LOOP
3837                       l_cindex := INSTR(l_final_selected_unitset,';',1,l_nth_occurence);
3838                       l_strtpoint  :=  l_pre_cindex + 1;
3839                       l_endpoint   :=  l_cindex - l_strtpoint;
3840                       l_pre_cindex :=  l_cindex;
3841                       l_unitset_seqno_and_prmind := substr(l_unitsets_to_transfer,l_strtpoint,l_endpoint);
3842                       l_unitset_seqno_sep_index  := INSTR(l_unitset_seqno_and_prmind,',',1);
3843                       l_seqno_prmind_sep_index   := INSTR(l_unitset_seqno_and_prmind,',',1,2);
3844                       l_unitset   :=   SUBSTR(l_unitset_seqno_and_prmind,1,l_unitset_seqno_sep_index - 1);
3845                       l_seqno     :=   TO_NUMBER(SUBSTR(l_unitset_seqno_and_prmind,l_unitset_seqno_sep_index+1,l_seqno_prmind_sep_index -(l_unitset_seqno_sep_index+1)));
3846                       l_prmind    :=   SUBSTR(l_unitset_seqno_and_prmind,l_seqno_prmind_sep_index + 1);
3847 
3848                       FOR l_dummy_unitcd_seqno  IN   c_get_child(p_person_id,p_program_cd,l_unitset,l_seqno) LOOP
3849 
3850                               l_sub_token1 := InStr(p_unit_sets_to_transfer,l_dummy_unitcd_seqno.unitcd_seqno,1,1);
3851 
3852                               IF l_sub_token1 <> 0 THEN
3853                                 l_sub_token2 := InStr(p_unit_sets_to_transfer,';',l_sub_token1,1);
3854 
3855                                 l_token_str :=  SubStr(p_unit_sets_to_transfer,l_sub_token1,l_sub_token2-l_sub_token1);
3856 
3857                                 l_final_selected_unitset := l_final_selected_unitset || l_token_str || ';';
3858 
3859                               END IF;
3860                       END LOOP;
3861 
3862                       l_nth_occurence := l_nth_occurence + 1;
3863 
3864                       l_count_token := l_count_token -1 ;
3865                  END LOOP;
3866 
3867            END IF;
3868 
3869         --  check if more unitset attempt string are peresent than processed till now
3870            IF NVL (LENGTH(l_final_selected_unitset),0) < LENGTH(p_unit_sets_to_transfer) THEN
3871                l_strtpoint      :=  0;
3872                l_pre_cindex     :=  0;
3873                l_nth_occurence  :=  1;
3874 
3875                l_cindex := INSTR(p_unit_sets_to_transfer,';',1,l_nth_occurence);
3876 
3877                 WHILE (l_cindex <> 0) LOOP
3878                   l_strtpoint  :=  l_pre_cindex + 1;
3879                   l_endpoint   :=  l_cindex - l_strtpoint;
3880                   l_pre_cindex :=  l_cindex;
3881                   l_unitset_seqno_and_prmind := substr(p_unit_sets_to_transfer,l_strtpoint,l_endpoint);
3882 
3883                   l_sub_token1 := InStr(l_final_selected_unitset,l_unitset_seqno_and_prmind,1,1);
3884 
3885                   IF NVL(l_sub_token1,0) = 0 THEN
3886                       l_final_selected_unitset := l_final_selected_unitset || l_unitset_seqno_and_prmind || ';' ;
3887                   END IF;
3888 
3889                   IF NVL (LENGTH(l_final_selected_unitset),0) = LENGTH(p_unit_sets_to_transfer) THEN
3890                      exit ;
3891                   END IF;
3892                   l_nth_occurence := l_nth_occurence + 1;
3893                   l_cindex := INSTR(p_unit_sets_to_transfer,';',1,l_nth_occurence);
3894                 END LOOP;
3895 
3896 
3897            END IF;
3898 
3899        ELSE
3900             return p_unit_sets_to_transfer;
3901        END IF;
3902 
3903     return l_final_selected_unitset;
3904 
3905   END  arrange_selected_unitsets;
3906 
3907 
3908 
3909 END IGS_EN_TRANSFER_APIS;