DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_CA_VAL_QLITY

Source


1 PACKAGE BODY IGS_CA_VAL_QLITY AS
2 /* $Header: IGSCA14B.pls 120.4 2005/09/28 06:22:43 appldev ship $ */
3 
4   ------------------------------------------------------------------
5   --Change History:
6   --Who            When            What
7   --skpandey    27-SEP-2005        Bug: 4036104
8   --                               Description: Modified the cursor c_chk_enr_ci definition to select only those enrolment
9   --                               calendars (output from cursor c_chk_acad_ci) which have subordinates of any type
10   --                               Description: Modified the cursor c_chk_acad_ci to select only those records which are of
11   --                               Enrollment type and are subordinate of Academic cal instance.
12   --				   c_chk_tch_ci_aus changed to use get_within_ci = 'Y' rather than N.
13   --npalanis    16-JAN-2003        Bug : 2739139
14   --                               Check for  all Academic Term (Load) period should have one
15   --                               superior fee periods is removed
16   -- npalanis   23-DEC-2002        Bug : 2694794
17   --                               new cursor added in CALP_VAL_ADM_CI to check that only one load calendar instance is attached
18   --                               as a subordinate calendar under an admission calendar instance.
19   -- npalanis   16-dec-2002        Bug:2697221 . check is added for calculating load apportionment for teaching calendars which are active
20   --smadathi    11-sep-2002        Bug 2086177. Modified the procedure CALP_VAL_LOAD_CI, CALP_VAL_ADM_CI.Added
21   --                               procedure calp_val_award_ci
22   --sarakshi    19-Aug-2002        Bug#2518938,modified the cursor  c_chk_acad_fee_ci removed the cartesian join in the not exists clause
23   --                               as functionally it was redundant, in the process resolved the  bug also
24   --vchappid    11-Jun-2002        Bug#2384110, Progression Calendar is a mandatory superior calendar for the Teaching Calendar
25   --                               implemented this constraint in the procedure calp_val_teach_ci
26   --schodava    17-Apr-2002        Bug #2279265
27   --                               Modified procedure CALP_VAL_LOAD_CI
28   -- nsidana    7/30/2004          Bug : 3736551 : Added check to verify that load calenders do not overlap within a same academic calender.
29   ------------------------------------------------------------------
30 
31   -- forward declaration of the procedure
32   PROCEDURE calp_val_award_ci( p_c_acad_cal_type        IN igs_ca_inst_all.cal_type%TYPE,
33                                p_n_acad_sequence_number IN igs_ca_inst_all.sequence_number%TYPE,
34                                p_c_s_log_type           IN VARCHAR2 ,
35                                p_d_log_creation_dt      IN DATE
36 		             );
37 
38   PROCEDURE CHK_ONE_PER_CAL(p_acad_cal_type        IN VARCHAR2,
39                             p_acad_sequence_number IN NUMBER,
40                             p_cal_cat              IN VARCHAR2,
41                             p_s_log_type           IN VARCHAR2,
42                             p_log_creation_dt      IN DATE)
43   AS
44 
45 -- Picks with a cal cat
46 CURSOR get_all_sda(cp_cal_cat VARCHAR2) IS
47 SELECT DISTINCT sys_date_type,date_alias
48 FROM
49 (SELECT sys_date_type,date_alias
50   FROM   igs_ca_Da_configs
51   WHERE  (res_cal_cat1    = cp_cal_cat OR
52           res_cal_cat2    = cp_cal_cat) AND
53 	 one_per_cal_flag = 'Y'
54   UNION ALL
55   SELECT a.sys_date_type,b.date_alias
56   FROM   igs_ca_Da_ovd_vals b,igs_ca_Da_configs a
57   WHERE  a.sys_date_type = b.sys_date_type
58   AND  a.one_per_cal_flag = 'Y'
59   AND  (  a.res_cal_cat1    =cp_cal_cat OR
60           a.res_cal_cat2    =cp_cal_cat)
61 );
62 
63 -- Picks without a cal cat
64   CURSOR get_all_sda_with_no_cal_cat IS
65   SELECT distinct sys_date_type,date_alias
66   FROM
67   (SELECT sys_date_type,date_alias
68    FROM   igs_ca_Da_configs
69    WHERE  one_per_cal_flag = 'Y'
70   UNION ALL
71     SELECT a.sys_date_type,b.date_alias
72    FROM   igs_ca_Da_ovd_vals b,
73    igs_ca_Da_configs a
74    WHERE  a.sys_date_type = b.sys_date_type
75    AND  a.one_per_cal_flag = 'Y'
76    );
77 
78   CURSOR get_cal_desc(cp_cal_type VARCHAR2, cp_seq_num NUMBER)
79   IS
80   SELECT description
81   FROM   igs_ca_inst
82   WHERE  cal_type        = cp_cal_type AND
83          sequence_number = cp_seq_num;
84 
85   -- Count the instances of the DA in the CI.
86   CURSOR chk_one_per_cal(cp_dt_alias VARCHAR2, cp_cal_type VARCHAR2,cp_seq_num NUMBER)
87   IS
88   SELECT count(*)
89   FROM   igs_ca_da_inst
90   WHERE  dt_alias           = cp_dt_alias AND
91          cal_type           = cp_cal_type AND
92 	 ci_sequence_number = cp_seq_num;
93 
94   l_cal_desc VARCHAR2(80);
95   l_count NUMBER;
96 
97   BEGIN
98 
99   OPEN get_cal_desc(p_acad_cal_type,p_acad_sequence_number);
100   FETCH get_cal_desc INTO l_cal_desc;
101   CLOSE get_cal_desc;
102 
103   IF (p_cal_cat = 'ALL' OR p_cal_cat = 'DATES')
104   THEN
105     -- Open cursor without any restriction on the cal category and run the loop.
106     FOR get_all_sda_rec IN get_all_sda_with_no_cal_cat
107     LOOP
108       l_count := 0;
109       OPEN chk_one_per_cal(get_all_sda_rec.date_alias,p_acad_cal_type,p_acad_sequence_number);
110       FETCH chk_one_per_cal INTO l_count;
111       CLOSE chk_one_per_cal;
112       IF (l_count > 1)
113       THEN
114         -- Log an entry in the LOG table.
115         fnd_message.Set_Name('IGS','IGS_CA_GR_ONE_DAI_CI');
116         fnd_message.set_token('DA',get_all_sda_rec.date_alias);
117         fnd_message.set_token('CAL_DESC',l_cal_desc);
118         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (p_s_log_type,
119 			                 p_log_creation_dt,
120  			                 'DATES' || ',' || p_acad_cal_type || ',' ||TO_CHAR (p_acad_sequence_number),
121  	 		                 NULL,
122  	 		                 fnd_message.get);
123        END IF;
124     END LOOP;
125   ELSE
126     -- Open cursor with the restrictions on the cal category and run the loop.
127     FOR get_all_sda_rec IN get_all_sda(p_cal_cat)
128     LOOP
129       l_count := 0;
130       OPEN chk_one_per_cal(get_all_sda_rec.date_alias,p_acad_cal_type,p_acad_sequence_number);
131       FETCH chk_one_per_cal INTO l_count;
132       CLOSE chk_one_per_cal;
133       IF (l_count > 1)
134       THEN
135         -- Log an entry in the LOG table.
136         fnd_message.Set_Name('IGS','IGS_CA_GR_ONE_DAI_CI');
137         fnd_message.set_token('DA',get_all_sda_rec.date_alias);
138         fnd_message.set_token('CAL_DESC',l_cal_desc);
139         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (p_s_log_type,
140 			                 p_log_creation_dt,
141  			                 p_cal_cat || ',' || p_acad_cal_type || ',' ||TO_CHAR (p_acad_sequence_number),
142  	 		                 NULL,
143  	 		                 fnd_message.get);
144        END IF;
145     END LOOP;
146   END IF;
147 
148   END chk_one_per_cal;
149 
150   -- To validate research calendar instance (part of the quality check)
151   PROCEDURE CALP_VAL_RESEARCH_CI(
152   p_acad_cal_type IN VARCHAR2 ,
153   p_acad_sequence_number IN NUMBER ,
154   p_s_log_type IN VARCHAR2 ,
155   p_log_creation_dt IN DATE )
156   AS
157   ------------------------------------------------------------------
158   --Change History:
159   --Who            When            What
160   --
161   --sarakshi    13-Jul-2004        Bug#3729462, Added predicate DELETE_FLAG='N' to the cursor c_uop_uv .
162   --smadathi    16-sep-2002        Bug 2086177. Included getching of Planned calendars
163   --                               along with the Active ones
164   ------------------------------------------------------------------
165         lv_param_values                 VARCHAR2(1080);
166         gv_other_detail         VARCHAR2(255);
167   BEGIN -- calp_val_research_ci
168         -- Quality check calendar structures related to research teaching calendars.
169         -- The checks include:
170         -- 1. Should only be specified against the teaching periods.
171         -- 2. Should only be specified against teaching periods with a single census
172         --    date.
173         -- 3. A teaching period should only have a single start/end date.
174         -- 4. If a teaching period has a start/end date then it must have the
175         --    corresponding end/start date.
176         -- 5. All teaching periods with 'research' units should have these dates
177         --    (warning!).
178         -- 6. Effective periods should not overlap.
179         -- 7. Effective start date should be before effective end date.
180         -- 8. Effective periods should not have gaps in days between periods (or
181         --    between academic periods.
182         -- 9. Multiple teaching periods which have effective periods defined (ie.
183         --    research calendars) cannot be linked to the same load calendar within
184         --    an academic period.
185         -- EFTSU Load Determination
186         -- *  Percentages specified in calendar instance relationships between
187         --    academic and load calendars should total 100%.
188   DECLARE
189 
190         cst_active      CONSTANT        VARCHAR2(10) := 'ACTIVE';
191         cst_planned     CONSTANT        VARCHAR2(10) := 'PLANNED';
192         cst_teaching    CONSTANT        VARCHAR2(10) := 'TEACHING';
193         cst_load        CONSTANT        VARCHAR2(10) := 'LOAD';
194         v_effective_strt_dt_alias       IGS_RE_S_RES_CAL_CON.effective_strt_dt_alias%TYPE;
195         v_effective_end_dt_alias        IGS_RE_S_RES_CAL_CON.effective_end_dt_alias%TYPE;
196         v_last_alias_val                IGS_CA_DA_INST.absolute_val%TYPE;
197         v_last_alias_type               IGS_RE_S_RES_CAL_CON.effective_strt_dt_alias%TYPE;
198         v_last_cal_type                 IGS_CA_DA_INST.CAL_TYPE%TYPE;
199         v_last_ci_sequence_number       IGS_CA_DA_INST.ci_sequence_number%TYPE;
200         v_unit_cd                       IGS_PS_UNIT_VER.unit_cd%TYPE;
201         v_out_of_order                  BOOLEAN;
202         v_strt_counter                  NUMBER;
203         v_end_counter                   NUMBER;
204         v_total_perc                    NUMBER;
205         v_count                         NUMBER;
206         v_dummy                         VARCHAR2(1);
207         CURSOR c_srcc IS
208                 SELECT  srcc.effective_strt_dt_alias,
209                         srcc.effective_end_dt_alias
210                 FROM    IGS_RE_S_RES_CAL_CON                    srcc
211                 WHERE   s_control_num                   = 1;
212         CURSOR c_dai_cat (
213                 cp_effective_strt_dt_alias      IGS_RE_S_RES_CAL_CON.effective_strt_dt_alias%TYPE,
214                 cp_effective_end_dt_alias       IGS_RE_S_RES_CAL_CON.effective_end_dt_alias%TYPE) IS
215                 SELECT  dai.CAL_TYPE,
216                         cat.S_CAL_CAT
217                 FROM    IGS_CA_DA_INST          dai,
218                         IGS_CA_TYPE                     cat
219                 WHERE   dai.DT_ALIAS                    IN (
220                                                         cp_effective_strt_dt_alias,
221                                                         cp_effective_end_dt_alias) AND
222                         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI (
223                                         p_acad_cal_type,
224                                         p_acad_sequence_number,
225                                         dai.CAL_TYPE,
226                                         dai.ci_sequence_number, 'N') = 'Y' AND
227                         cat.CAL_TYPE                    = dai.CAL_TYPE AND
228                         cat.S_CAL_CAT                   <> cst_teaching;
229         CURSOR c_ci_cs_cat IS
230                 SELECT  ci.CAL_TYPE,
231                         ci.sequence_number
232                 FROM    IGS_CA_INST                     ci,
233                         IGS_CA_STAT                     cs,
234                         IGS_CA_TYPE                     cat
235                 WHERE   IGS_EN_GEN_014.ENRS_GET_WITHIN_CI (
236                                         p_acad_cal_type,
237                                         p_acad_sequence_number,
238                                         ci.CAL_TYPE,
239                                         ci.sequence_number, 'Y') = 'Y' AND
240                         cs.CAL_STATUS                   = ci.CAL_STATUS AND
241                         cs.s_cal_status                 IN (cst_active,cst_planned) AND
242                         cat.CAL_TYPE                    = ci.CAL_TYPE AND
243                         cat.S_CAL_CAT                   = cst_teaching;
244         CURSOR c_dai (
245                 cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
246                 cp_sequence_number              IGS_CA_INST.sequence_number%TYPE,
247                 cp_effective_strt_dt_alias      IGS_RE_S_RES_CAL_CON.effective_strt_dt_alias%TYPE,
248                 cp_effective_end_dt_alias       IGS_RE_S_RES_CAL_CON.effective_end_dt_alias%TYPE) IS
249                 SELECT  NVL (
250                                 dai.absolute_val,
251                                 IGS_CA_GEN_001.CALP_GET_ALIAS_VAL (
252                                                 dai.DT_ALIAS,
253                                                 dai.sequence_number,
254                                                 dai.CAL_TYPE,
255                                                 dai.ci_sequence_number)) AS alias_val,
256                         dai.DT_ALIAS
257                 FROM    IGS_CA_DA_INST          dai
258                 WHERE   dai.CAL_TYPE                    = cp_cal_type AND
259                         dai.ci_sequence_number          = cp_sequence_number AND
260                         dai.DT_ALIAS                    IN (
261                                                         cp_effective_strt_dt_alias,
262                                                         cp_effective_end_dt_alias)
263                 ORDER BY alias_val ASC;
264         CURSOR c_dai_sgcc (
265                 cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
266                 cp_sequence_number              IGS_CA_INST.sequence_number%TYPE) IS
267                 SELECT  count(*)
268                 FROM    IGS_GE_S_GEN_CAL_CON                    sgcc,
269                         IGS_CA_DA_INST          dai
270                 WHERE   dai.CAL_TYPE                    = cp_cal_type AND
271                         dai.ci_sequence_number          = cp_sequence_number AND
272                         dai.DT_ALIAS                    = sgcc.census_dt_alias AND
273                         sgcc.s_control_num              = 1;
274         CURSOR c_uop_uv (
275                 cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
276                 cp_sequence_number              IGS_CA_INST.sequence_number%TYPE) IS
277                 SELECT  uop.unit_cd
278                 FROM    IGS_PS_UNIT_OFR_PAT             uop,
279                         IGS_PS_UNIT_VER                         uv
280                 WHERE   uop.CAL_TYPE                    = cp_cal_type AND
281                         uop.ci_sequence_number          = cp_sequence_number AND
282                         uv.unit_cd                      = uop.unit_cd AND
283                         uv.version_number               = uop.version_number AND
284                         uv.research_unit_ind            = 'Y' AND
285 			uop.delete_flag = 'N';
286         CURSOR c_dai_ci_cs_cat (
287                 cp_effective_strt_dt_alias      IGS_RE_S_RES_CAL_CON.effective_strt_dt_alias%TYPE,
288                 cp_effective_end_dt_alias       IGS_RE_S_RES_CAL_CON.effective_end_dt_alias%TYPE) IS
289                 SELECT  NVL (
290                                 dai.absolute_val,
291                                 IGS_CA_GEN_001.CALP_GET_ALIAS_VAL(
292                                                 dai.DT_ALIAS,
293                                                 dai.sequence_number,
294                                                 dai.CAL_TYPE,
295                                                 dai.ci_sequence_number)) AS alias_val,
296                         dai.DT_ALIAS,
297                         dai.CAL_TYPE,
298                         dai.ci_sequence_number
299                 FROM    IGS_CA_DA_INST          dai,
300                         IGS_CA_INST                     ci,
301                         IGS_CA_STAT                     cs,
302                         IGS_CA_TYPE                     cat
303                 WHERE   dai.DT_ALIAS                    IN (
304                                                         cp_effective_strt_dt_alias,
305                                                         cp_effective_end_dt_alias) AND
309                         cs.s_cal_status                 IN (cst_active,cst_planned) AND
306                         ci.CAL_TYPE                     = dai.CAL_TYPE AND
307                         ci.sequence_number              = dai.ci_sequence_number AND
308                         cs.CAL_STATUS                   = ci.CAL_STATUS AND
310                         cat.CAL_TYPE                    = ci.CAL_TYPE AND
311                         cat.S_CAL_CAT                   = cst_teaching
312                 ORDER BY ci.start_dt ASC,
313                         ci.end_dt ASC,
314                         DECODE (
315                                 dai.DT_ALIAS,   cp_effective_strt_dt_alias, 1,
316                                                 cp_effective_end_dt_alias, 2);
317         CURSOR c_cir_cat_ci_cs IS
318                 SELECT  ci.CAL_TYPE,
319                         ci.sequence_number
320                 FROM    IGS_CA_INST_REL cir,
321                         IGS_CA_TYPE                     cat,
322                         IGS_CA_INST                     ci,
323                         IGS_CA_STAT                     cs
324                 WHERE   cir.sup_cal_type                = p_acad_cal_type AND
325                         cir.sup_ci_sequence_number      = p_acad_sequence_number AND
326                         cat.CAL_TYPE                    = cir.sub_cal_type AND
327                         cat.S_CAL_CAT                   = cst_load AND
328                         ci.CAL_TYPE                     = cir.sub_cal_type AND
329                         ci.sequence_number              = cir.sub_ci_sequence_number AND
330                         cs.CAL_STATUS                   = ci.CAL_STATUS AND
331                         cs.s_cal_status                 IN (cst_active,cst_planned);
332         CURSOR c_dla_cir_ci_cs (
333                 cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
334                 cp_sequence_number              IGS_CA_INST.sequence_number%TYPE) IS
335                 SELECT  'X'
336                 FROM    IGS_ST_DFT_LOAD_APPO            dla,
337                         IGS_CA_INST_REL         cir,
338                         IGS_CA_INST                     ci,
339                         IGS_CA_STAT                     cs
340                 WHERE   dla.CAL_TYPE                    = cp_cal_type AND
341                         dla.ci_sequence_number          = cp_sequence_number AND
342                         cir.sup_cal_type                = p_acad_cal_type AND
343                         cir.sup_ci_sequence_number      = p_acad_sequence_number AND
344                         cir.sub_cal_type                = dla.teach_cal_type AND
345                         ci.CAL_TYPE                     = cir.sub_cal_type AND
346                         ci.sequence_number              = cir.sub_ci_sequence_number AND
347                         cs.CAL_STATUS                   = ci.CAL_STATUS AND
348                         cs.s_cal_status                 IN (cst_active,cst_planned) AND
349                         EXISTS  (
350                                 SELECT  'X'
351                                 FROM    IGS_RE_S_RES_CAL_CON            srcc,
352                                         IGS_CA_DA_INST  dai
353                                 WHERE   srcc.s_control_num      = 1 AND
354                                         dai.CAL_TYPE            = ci.CAL_TYPE AND
355                                         dai.ci_sequence_number  = ci.sequence_number AND
356                                         dai.DT_ALIAS            IN (
357                                                                 srcc.effective_strt_dt_alias,
358                                                                 srcc.effective_end_dt_alias));
359         CURSOR c_cir_ci_cs_cat IS
360                 SELECT  SUM(NVL(cir.load_research_percentage, 0))
361                 FROM    IGS_CA_INST_REL         cir,
362                         IGS_CA_INST                     ci,
363                         IGS_CA_STAT                     cs,
364                         IGS_CA_TYPE                     cat
365                 WHERE   cir.sup_cal_type                = p_acad_cal_type AND
366                         cir.sup_ci_sequence_number      = p_acad_sequence_number AND
367                         ci.CAL_TYPE                     = cir.sub_cal_type AND
368                         ci.sequence_number              = cir.sub_ci_sequence_number AND
369                         cs.CAL_STATUS                   = ci.CAL_STATUS AND
370                         cs.s_cal_status                 IN (cst_active,cst_planned) AND
371                         cat.CAL_TYPE                    = ci.CAL_TYPE AND
372                         cat.S_CAL_CAT                   = cst_load;
373   BEGIN
374         -- Load the research calendar configuration
375         OPEN c_srcc;
376         FETCH c_srcc INTO
377                         v_effective_strt_dt_alias,
378                         v_effective_end_dt_alias;
379         IF c_srcc%NOTFOUND OR
380                         v_effective_strt_dt_alias IS NULL OR
381                         v_effective_end_dt_alias IS NULL THEN
382                 CLOSE c_srcc;
383 
384 
385                 --- added by syam
386                 Fnd_Message.Set_Name('IGS', 'IGS_CA_NO_RES_EFF_DT');
387                 --- added by syam
388 
389   --- added by syam
390                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
391                                 p_s_log_type,
392                                 p_log_creation_dt,
393                                 'DATES' || ',' ||
394                                 p_acad_cal_type || ',' ||
395                                 TO_CHAR(p_acad_sequence_number),
396                                 NULL,
400 
397                                 fnd_message.get);
398   --- added by syam
399 
401 
402                 RETURN;
403         END IF;
404 
405         CLOSE c_srcc;
406         -- Check whether research effective dates are linked to calendars of types
407         -- other than TEACHING
408         FOR v_dai_cat_rec IN c_dai_cat (
409                         v_effective_strt_dt_alias,
410                         v_effective_end_dt_alias) LOOP
411 
412                 --- added by syam
413                 Fnd_Message.Set_Name('IGS', 'IGS_CA_RES_EFF_IN_CAL');
414                 fnd_message.set_token('TOKEN1',v_dai_cat_rec.CAL_TYPE || ',' ||v_dai_cat_rec.S_CAL_CAT);
415 
416                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
417                                         p_s_log_type,
418                                         p_log_creation_dt,
419                                         'DATES' || ',' ||
420                                         p_acad_cal_type || ',' ||
421                                         TO_CHAR(p_acad_sequence_number),
422                                         NULL,
423                                         fnd_message.get);
424         --- added by syam
425 
426 
427 
428         END LOOP;
429         -- Perform date alias checks within teaching calendars in the academic year
430         FOR v_ci_cs_cat_rec IN c_ci_cs_cat LOOP
431                 v_last_alias_val := NULL;
432                 v_last_alias_type := NULL;
433                 v_out_of_order := FALSE;
434                 v_strt_counter := 0;
435                 v_end_counter := 0;
436 
437 
438         -- Check one per cal for SDAs.
439          CHK_ONE_PER_CAL(v_ci_cs_cat_rec.cal_type,       -- will check for fee cal instance.
440 	                 v_ci_cs_cat_rec.sequence_number,
441 			 'DATES',
442 			 p_s_log_type,
443 			 p_log_creation_dt);
444 
445                 FOR v_dai_rec IN c_dai (
446                                         v_ci_cs_cat_rec.CAL_TYPE,
447                                         v_ci_cs_cat_rec.sequence_number,
448                                         v_effective_strt_dt_alias,
449                                         v_effective_end_dt_alias) LOOP
450                         IF v_last_alias_val IS NOT NULL THEN
451                                 -- If the last date was not a start date, or the current date is not
452                                 -- an end date then the order is incorrect.
453                                 IF v_last_alias_type <> v_effective_strt_dt_alias OR
454                                                 v_dai_rec.DT_ALIAS <> v_effective_end_dt_alias THEN
455                                         v_out_of_order := TRUE;
456                                 END IF;
457                         END IF;
458                         -- Increment counters for number of start/end dates
459                         IF v_dai_rec.DT_ALIAS = v_effective_strt_dt_alias THEN
460                                 v_strt_counter := v_strt_counter + 1;
461                         ELSE
462                                 v_end_counter := v_end_counter + 1;
463                         END IF;
464                         v_last_alias_val := v_dai_rec.alias_val;
465                         v_last_alias_type := v_dai_rec.DT_ALIAS;
466                 END LOOP;
467                 IF v_strt_counter > 1 OR
468                                 v_end_counter > 1 OR
469                                 (v_strt_counter = 0 AND
470                                 v_end_counter = 1) OR
471                                 (v_end_counter = 0 AND
472                                 v_strt_counter = 1) THEN
473 
474                         --- added by syam
475                         Fnd_Message.Set_Name('IGS', 'IGS_CA_EFF_START_END');
476 
477                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
478                                                         p_s_log_type,
479                                                         p_log_creation_dt,
480                                                         'RESEARCH' || ',' ||
481                                                         v_ci_cs_cat_rec.CAL_TYPE || ',' ||
482                                                         TO_CHAR(v_ci_cs_cat_rec.sequence_number),
483                                                         NULL,
484                                                         fnd_message.get);
485                         --- added by syam
486 
487 
488                 ELSE
489                         IF v_out_of_order THEN
490 
491                         --- added by syam
492                             Fnd_Message.Set_Name('IGS', 'IGS_CA_EFF_DATES_OUT_OF_ORDER');
493 
494                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
495                                                         p_s_log_type,
496                                                         p_log_creation_dt,
497                                                         'RESEARCH' || ',' ||
498                                                         v_ci_cs_cat_rec.CAL_TYPE || ',' ||
499                                                         TO_CHAR(v_ci_cs_cat_rec.sequence_number),
500                                                         NULL,
501                                                         fnd_message.get);
502 
503                          --- added by syam
504 
505 
506                         END IF;
507                 END IF;
508                 -- If valid research dates perform further checks
509                 IF v_strt_counter = 1 AND
513                                         v_ci_cs_cat_rec.sequence_number);
510                                 v_end_counter = 1 THEN
511                         OPEN c_dai_sgcc (
512                                         v_ci_cs_cat_rec.CAL_TYPE,
514                         FETCH c_dai_sgcc INTO v_count;
515                         CLOSE c_dai_sgcc;
516                         IF v_count > 1 THEN
517 
518                         --- added by syam
519                             Fnd_Message.Set_Name('IGS', 'IGS_CA_TPERIOD_SINGLE_CENS');
520 
521                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
522                                                 p_s_log_type,
523                                                 p_log_creation_dt,
524                                                 'RESEARCH' || ',' ||
525                                                 v_ci_cs_cat_rec.CAL_TYPE || ',' ||
526                                                 TO_CHAR(v_ci_cs_cat_rec.sequence_number),
527                                                 NULL,
528                                                 fnd_message.get);
529                          --- added by syam
530 
531                         END IF;
532                 END IF;
533                 -- If not a research teaching period, warn against research units being
534                 -- offered within it
535                 IF v_strt_counter = 0 AND
536                                 v_end_counter = 0 THEN
537                         OPEN c_uop_uv (
538                                         v_ci_cs_cat_rec.CAL_TYPE,
539                                         v_ci_cs_cat_rec.sequence_number);
540                         FETCH c_uop_uv INTO v_unit_cd;
541                         IF c_uop_uv%FOUND THEN
542                                 CLOSE c_uop_uv;
543                         --- added by syam
544                             Fnd_Message.Set_Name('IGS', 'IGS_CA_NORMAL_TP_STD_EFTSU_USE');
545                             fnd_message.set_token('TOKEN1',v_unit_cd);
546 
547                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
548                                                 p_s_log_type,
549                                                 p_log_creation_dt,
550                                                 'RESEARCH' || ',' ||
551                                                 v_ci_cs_cat_rec.CAL_TYPE || ',' ||
552                                                 TO_CHAR(v_ci_cs_cat_rec.sequence_number),
553                                                 NULL,
554                                                 fnd_message.get);
555 
556                         --- added by syam
557 
558                         ELSE
559                                 CLOSE c_uop_uv;
560                         END IF;
561                 END IF;
562         END LOOP;
563         -- Check for gaps or overlaps in effective research dates ; only report on
564         -- logical periods which overlap the context academic period
565         v_last_alias_val := NULL;
566         v_last_alias_type := NULL;
567         v_last_cal_type := NULL;
568         v_last_ci_sequence_number := NULL;
569         FOR v_dai_ci_cs_cat_rec IN c_dai_ci_cs_cat (
570                                                 v_effective_strt_dt_alias,
571                                                 v_effective_end_dt_alias) LOOP
572 
573 
574         -- Check one per cal for SDAs.
575          CHK_ONE_PER_CAL(v_dai_ci_cs_cat_rec.cal_type,       -- will check for fee cal instance.
576 	                 v_dai_ci_cs_cat_rec.ci_sequence_number,
577 			 'RESEARCH',
578 			 p_s_log_type,
579 			 p_log_creation_dt);
580 
581                 IF c_dai_ci_cs_cat%ROWCOUNT > 1 AND
582                                 v_dai_ci_cs_cat_rec.DT_ALIAS = v_effective_strt_dt_alias THEN
583                         IF v_dai_ci_cs_cat_rec.alias_val <= v_last_alias_val THEN
584                                 IF IGS_EN_GEN_014.ENRS_GET_WITHIN_CI (
585                                                         p_acad_cal_type,
586                                                         p_acad_sequence_number,
587                                                         v_dai_ci_cs_cat_rec.CAL_TYPE,
588                                                         v_dai_ci_cs_cat_rec.ci_sequence_number,
589                                                         'Y') = 'Y' OR
590                                                 IGS_EN_GEN_014.ENRS_GET_WITHIN_CI (
591                                                                 p_acad_cal_type,
592                                                                 p_acad_sequence_number,
593                                                                 v_last_cal_type,
594                                                                 v_last_ci_sequence_number,
595                                                                 'Y') = 'Y' THEN
596 
597 
598 
599 
600                         --- added by syam
601                             Fnd_Message.Set_Name('IGS', 'IGS_CA_RES_EFF_DATES_OVERLAP');
602                             fnd_message.set_token('TOKEN1',v_dai_ci_cs_cat_rec.DT_ALIAS||':'|| IGS_GE_DATE.IGSCHAR(v_dai_ci_cs_cat_rec.alias_val)|| ', '||v_last_alias_type||':'||IGS_GE_DATE.IGSCHAR(v_last_alias_val));
603                         --- added by syam
604 
605 
606                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
607                                                         p_s_log_type,
608                                                         p_log_creation_dt,
612                                                         NULL,
609                                                         'RESEARCH' || ',' ||
610                                                         p_acad_cal_type || ',' ||
611                                                         TO_CHAR(p_acad_sequence_number),
613                                                         fnd_message.get);
614                         --- added by syam
615 
616 
617 
618 
619                                 END IF;
620                         ELSIF v_dai_ci_cs_cat_rec.alias_val > (v_last_alias_val + 1) THEN
621                                 IF IGS_EN_GEN_014.ENRS_GET_WITHIN_CI (
622                                                         p_acad_cal_type,
623                                                         p_acad_sequence_number,
624                                                         v_dai_ci_cs_cat_rec.CAL_TYPE,
625                                                         v_dai_ci_cs_cat_rec.ci_sequence_number,
626                                                         'Y') = 'Y' OR
627                                                 IGS_EN_GEN_014.ENRS_GET_WITHIN_CI (
628                                                                 p_acad_cal_type,
629                                                                 p_acad_sequence_number,
630                                                                 v_last_cal_type,
631                                                                 v_last_ci_sequence_number,
632                                                                 'Y') = 'Y' THEN
633 
634                                 --- added by syam
635                                 Fnd_Message.Set_Name('IGS', 'IGS_CA_GAP_BTW_EFF_PERIODS');
636                                 fnd_message.set_token('TOKEN1',v_dai_ci_cs_cat_rec.DT_ALIAS||':'||IGS_GE_DATE.IGSCHAR(v_dai_ci_cs_cat_rec.alias_val)||', '||v_last_alias_type||':'||IGS_GE_DATE.IGSCHAR(v_last_alias_val));
637 
638                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
639                                                         p_s_log_type,
640                                                         p_log_creation_dt,
641                                                         'RESEARCH' || ',' ||
642                                                         p_acad_cal_type || ',' ||
643                                                         TO_CHAR(p_acad_sequence_number),
644                                                         NULL,
645                                                         fnd_message.get);
646                                 --- added by syam
647 
648 
649 
650                                 END IF;
651                         END IF;
652                 END IF;
653                 v_last_alias_val := v_dai_ci_cs_cat_rec.alias_val;
654                 v_last_alias_type := v_dai_ci_cs_cat_rec.DT_ALIAS;
655                 v_last_cal_type := v_dai_ci_cs_cat_rec.CAL_TYPE;
656                 v_last_ci_sequence_number := v_dai_ci_cs_cat_rec.ci_sequence_number;
657         END LOOP;
658         -- Check that the research teaching periods are linked to only a single load
659         -- calendar within the academic calendar
660         FOR v_cir_cat_ci_cs_rec IN c_cir_cat_ci_cs LOOP
661 
662         -- Check one per cal for SDAs.
663          CHK_ONE_PER_CAL(v_cir_cat_ci_cs_rec.cal_type,       -- will check for fee cal instance.
664 	                 v_cir_cat_ci_cs_rec.sequence_number,
665 			 'RESEARCH',
666 			 p_s_log_type,
667 			 p_log_creation_dt);
668 
669                 FOR v_dla_cir_ci_cs_rec IN c_dla_cir_ci_cs (
670                                                         v_cir_cat_ci_cs_rec.CAL_TYPE,
671                                                         v_cir_cat_ci_cs_rec.sequence_number) LOOP
672                         IF c_dla_cir_ci_cs%ROWCOUNT > 1 THEN
673 
674                                 --- added by syam
675                                 Fnd_Message.Set_Name('IGS','IGS_CA_MULT_TP_SINGLE_CAL');
676                                 fnd_message.set_token('TOKEN1',v_cir_cat_ci_cs_rec.CAL_TYPE);
677 
678                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
679                                                 p_s_log_type,
680                                                 p_log_creation_dt,
681                                                 'RESEARCH' || ',' ||
682                                                 p_acad_cal_type || ',' ||
683                                                 TO_CHAR(p_acad_sequence_number),
684                                                 NULL,
685                                                 fnd_message.get);
686                                 ---added by syam
687 
688 
689 
690                                 EXIT;
691                         END IF;
692                 END LOOP;
693         END LOOP;
694         -- Check that the research percentage adds up to 100% for the academic period
695         OPEN c_cir_ci_cs_cat;
696         FETCH c_cir_ci_cs_cat INTO v_total_perc;
697         CLOSE c_cir_ci_cs_cat;
698         IF v_total_perc <> 100 THEN
699 
700                         --- added by syam
701                                 Fnd_Message.Set_Name('IGS','IGS_CA_RES_PERCENT_NOT_100');
702 
703                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
704                                         p_s_log_type,
705                                         p_log_creation_dt,
706                                         'RESEARCH' || ',' ||
707                                         p_acad_cal_type || ',' ||
711                 --- added by syam
708                                         TO_CHAR(p_acad_sequence_number),
709                                         NULL,
710                                         fnd_message.get);
712 
713         END IF;
714   EXCEPTION
715         WHEN OTHERS THEN
716                 IF c_srcc%ISOPEN THEN
717                         CLOSE c_srcc;
718                 END IF;
719                 IF c_dai_cat%ISOPEN THEN
720                         CLOSE c_dai_cat;
721                 END IF;
722                 IF c_ci_cs_cat%ISOPEN THEN
723                         CLOSE c_ci_cs_cat;
724                 END IF;
725                 IF c_dai%ISOPEN THEN
726                         CLOSE c_dai;
727                 END IF;
728                 IF c_dai_sgcc%ISOPEN THEN
729                         CLOSE c_dai_sgcc;
730                 END IF;
731                 IF c_uop_uv%ISOPEN THEN
732                         CLOSE c_uop_uv;
733                 END IF;
734                 IF c_dai_ci_cs_cat%ISOPEN THEN
735                         CLOSE c_dai_ci_cs_cat;
736                 END IF;
737                 IF c_cir_cat_ci_cs%ISOPEN THEN
738                         CLOSE c_cir_cat_ci_cs;
739                 END IF;
740                 IF c_dla_cir_ci_cs%ISOPEN THEN
741                         CLOSE c_dla_cir_ci_cs;
742                 END IF;
743                 IF c_cir_ci_cs_cat%ISOPEN THEN
744                         CLOSE c_cir_ci_cs_cat;
745                 END IF;
746                 App_Exception.Raise_Exception;
747   END;
748   EXCEPTION
749         WHEN OTHERS THEN
750                 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
751                 FND_MESSAGE.SET_TOKEN('NAME','IGS_CA_VAL_QLITY.calp_val_research_ci');
752                 IGS_GE_MSG_STACK.ADD;
753                 lv_param_values:=p_acad_cal_type||','||(to_char(p_acad_sequence_number));
754                 Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
755                 FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
756                 IGS_GE_MSG_STACK.ADD;
757                 lv_param_values:=p_s_log_type ||','||(to_char(p_log_creation_dt));
758                 Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
759                 FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
760                 IGS_GE_MSG_STACK.ADD;
761                 App_Exception.Raise_Exception;
762   END calp_val_research_ci;
763   --
764   -- To quality check admission calendar instances
765   PROCEDURE CALP_VAL_ADM_CI(
766   p_acad_cal_type IN VARCHAR2 ,
767   p_acad_sequence_number IN NUMBER ,
768   p_s_log_type IN VARCHAR2 ,
769   p_log_creation_dt IN DATE )
770   AS
771   ------------------------------------------------------------------
772   --
773   --Change History:
774   --Who         When            What
775   --smadathi    11-Sep-2002     Bug 2086177. Added new cursor c_cir_5 and
776   --                            associated logic to Check that all admission periods have
777   --                            at least one direct subordinate Load calendar instance.
778   --skpandey    25-AUG-2005     BUG 4036104
779   --                            Added a condition in where clause of cursor c_cict to select only those records which are of Admission type and are subordinate of Academic cal instance.
780   -------------------------------------------------------------------
781           lv_param_values                       VARCHAR2(1080);
782         gv_other_detail                 VARCHAR2(255);
783   BEGIN         -- calp_val_adm_ci
784         -- Validate that the admission calendar instance has links to the
785         -- appropriate calendars.
786         -- This routine will the called as part of the calendar quality check.
787   DECLARE
788 
789         cst_admission                   CONSTANT        VARCHAR2(9) := 'ADMISSION';
790         cst_admission2                  CONSTANT        VARCHAR2(10) := 'ADMISSION,';
791         cst_academic                    CONSTANT        VARCHAR2(8) := 'ACADEMIC';
792         cst_teaching                    CONSTANT        VARCHAR2(8) := 'TEACHING';
793         cst_active                      CONSTANT        VARCHAR2(6) := 'ACTIVE';
794         cst_planned                     CONSTANT        VARCHAR2(7) := 'PLANNED';
795         cst_enrolment                   CONSTANT        VARCHAR2(9) := 'ENROLMENT';
796         cst_load                        CONSTANT        VARCHAR2(10) := 'LOAD';
797         v_aal_rec_found                 BOOLEAN         := FALSE;
798         v_cir_1_rec_found               BOOLEAN         := FALSE;
799         v_cir_4_rec_found               BOOLEAN         := FALSE;
800         v_daiv_1_rec_found              BOOLEAN         := FALSE;
801         v_daiv_2_rec_found              BOOLEAN         := FALSE;
802         v_daiv_3_rec_found              BOOLEAN         := FALSE;
803         v_cir2_sub_cal_type             IGS_CA_INST_REL.sub_cal_type%TYPE;
804         v_cir2_sub_ci_sequence_number   IGS_CA_INST_REL.sub_ci_sequence_number%TYPE;
805         v_cal_type                      IGS_CA_INST.CAL_TYPE%TYPE;
806         v_sequence_number               IGS_CA_INST.sequence_number%TYPE;
807         v_dummy                                         VARCHAR2(1);
808         v_count                                         NUMBER;
809         CURSOR c_cict   IS
810                 SELECT  ci.CAL_TYPE,
811                         ci.sequence_number
812                 FROM    IGS_CA_INST     ci,
813                         IGS_CA_STAT     cs,
814                         IGS_CA_TYPE     cat
818                                         ci.CAL_TYPE,
815                 WHERE   IGS_EN_GEN_014.ENRS_GET_WITHIN_CI (
816                                         p_acad_cal_type,
817                                         p_acad_sequence_number,
819                                         ci.sequence_number, 'N') = 'Y' AND
820                         cat.S_CAL_CAT   = cst_admission AND
821                         cs.s_cal_status IN (cst_active, cst_planned) AND
822                         ci.CAL_TYPE     = cat.CAL_TYPE AND
823                         ci.CAL_STATUS   = cs.CAL_STATUS;
824         CURSOR c_cir_1 (
825                         cp_sub_cal_type         IGS_CA_INST.CAL_TYPE%TYPE,
826                         cp_sub_sequence_number  IGS_CA_INST.sequence_number%TYPE) IS
827                 SELECT  cir.sup_cal_type,
828                         cir.sup_ci_sequence_number
829                 FROM    IGS_CA_INST_REL cir,
830                         IGS_CA_TYPE                     cat
831                 WHERE   cir.sub_cal_type                = cp_sub_cal_type AND
832                         cir.sub_ci_sequence_number      = cp_sub_sequence_number AND
833                         cat.S_CAL_CAT                   = cst_academic AND
834                         cir.sup_cal_type                = cat.CAL_TYPE;
835         CURSOR c_cat_cir2 (
836                         cp_sub_cal_type                 IGS_CA_INST.CAL_TYPE%TYPE,
837                         cp_sub_sequence_number          IGS_CA_INST.sequence_number%TYPE) IS
838                 SELECT  cir2.sub_cal_type,
839                         cir2.sub_ci_sequence_number
840                 FROM    IGS_CA_INST_REL cir2,
841                         IGS_CA_TYPE cat
842                 WHERE   cir2.sup_cal_type               = cp_sub_cal_type AND
843                         cir2.sup_ci_sequence_number     = cp_sub_sequence_number AND
844                         cat.S_CAL_CAT                   = cst_enrolment AND
845                         cir2.sub_cal_type               = cat.CAL_TYPE;
846         CURSOR c_cir_2 (
847                         cp_sub_cal_type                 IGS_CA_INST.CAL_TYPE%TYPE,
848                         cp_sub_sequence_number          IGS_CA_INST.sequence_number%TYPE,
849                         cp_acad_cal_type                IGS_CA_INST.CAL_TYPE%TYPE,
850                         cp_acad_sequence_number         IGS_CA_INST.sequence_number%TYPE) IS
851                 SELECT  'x'
852                 FROM    IGS_CA_INST_REL cir
853                 WHERE   cir.sub_cal_type                = cp_sub_cal_type AND
854                         cir.sub_ci_sequence_number      = cp_sub_sequence_number AND
855                         cir.sup_cal_type                = cp_acad_cal_type AND
856                         cir.sup_ci_sequence_number      = cp_acad_sequence_number;
857         CURSOR c_cir_3 (
858                         cp_sub_cal_type                 IGS_CA_INST.CAL_TYPE%TYPE,
859                         cp_sub_sequence_number          IGS_CA_INST.sequence_number%TYPE,
860                         cp_acad_cal_type                IGS_CA_INST.CAL_TYPE%TYPE,
861                         cp_acad_sequence_number         IGS_CA_INST.sequence_number%TYPE) IS
862                 SELECT  'x'
863                 FROM    IGS_CA_INST_REL cir
864                 WHERE   cir.sub_cal_type                = cp_sub_cal_type AND
865                         cir.sub_ci_sequence_number      = cp_sub_sequence_number AND
866                         cir.sup_cal_type                = cp_acad_cal_type AND
867                         cir.sup_ci_sequence_number      <> cp_acad_sequence_number;
868         CURSOR c_cir_4 (
869                         cp_sub_cal_type                 IGS_CA_INST.CAL_TYPE%TYPE,
870                         cp_sub_sequence_number          IGS_CA_INST.sequence_number%TYPE) IS
871                 SELECT  cir.sup_cal_type,
872                         cir.sup_ci_sequence_number
873                 FROM    IGS_CA_INST_REL cir,
874                         IGS_CA_TYPE                     cat
875                 WHERE   cir.sub_cal_type                = cp_sub_cal_type AND
876                         cir.sub_ci_sequence_number      = cp_sub_sequence_number AND
877                         cat.S_CAL_CAT                   = cst_teaching AND
878                         cir.sup_cal_type                = cat.CAL_TYPE;
879         CURSOR c_aal (
880                         cp_adm_cal_type                 IGS_AD_PERD_AD_CAT.adm_cal_type%TYPE,
881                         cp_adm_ci_sequence_number
882                                                         IGS_AD_PERD_AD_CAT.adm_ci_sequence_number%TYPE) IS
883                 SELECT  'x'
884                 FROM    IGS_AD_PERD_AD_CAT              apac
885                 WHERE   apac.adm_cal_type               = cp_adm_cal_type AND
886                         apac.adm_ci_sequence_number     = cp_adm_ci_sequence_number;
887         CURSOR c_daiv_1 (
888                         cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
889                         cp_ci_sequence_number           IGS_CA_INST.sequence_number%TYPE) IS
890                 SELECT  'x'
891                 FROM    IGS_CA_DA_INST_V                daiv,
892                         IGS_AD_CAL_CONF                 sacc
893                 WHERE   daiv.CAL_TYPE                   = cp_cal_type AND
894                         daiv.ci_sequence_number         = cp_ci_sequence_number AND
895                         daiv.DT_ALIAS                   = sacc.initialise_adm_perd_dt_alias AND
896                         sacc.s_control_num              = 1;
897         CURSOR c_daiv_2 (
898                         cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
899                         cp_ci_sequence_number           IGS_CA_INST.sequence_number%TYPE) IS
903                 WHERE   daiv.CAL_TYPE                   = cp_cal_type AND
900                 SELECT  'x'
901                 FROM    IGS_CA_DA_INST_V                daiv,
902                         IGS_AD_CAL_CONF                 sacc
904                         daiv.ci_sequence_number         = cp_ci_sequence_number AND
905                         daiv.DT_ALIAS                   = sacc.adm_appl_encmb_chk_dt_alias AND
906                         sacc.s_control_num              = 1;
907         CURSOR c_daiv_3 (
908                         cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
909                         cp_ci_sequence_number           IGS_CA_INST.sequence_number%TYPE) IS
910                 SELECT  'x'
911                 FROM    IGS_CA_DA_INST_V                daiv,
912                         IGS_AD_CAL_CONF                 sacc
913                 WHERE   daiv.CAL_TYPE                   = cp_cal_type AND
914                         daiv.ci_sequence_number         = cp_ci_sequence_number AND
915                         daiv.DT_ALIAS                   = sacc.adm_appl_course_strt_dt_alias AND
916                         sacc.s_control_num              = 1;
917         CURSOR c_daiv_4 (
918                         cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
919                         cp_ci_sequence_number           IGS_CA_INST.sequence_number%TYPE) IS
920                 SELECT  COUNT(*)
921                 FROM    IGS_CA_DA_INST_V                daiv,
922                         IGS_AD_CAL_CONF                 sacc
923                 WHERE   daiv.CAL_TYPE                   = cp_cal_type AND
924                         daiv.ci_sequence_number         = cp_ci_sequence_number AND
925                         daiv.DT_ALIAS                   = sacc.adm_appl_due_dt_alias AND
926                         sacc.s_control_num              = 1 AND
927                         NOT EXISTS      (
928                                 SELECT  'x'
929                                 FROM    IGS_AD_PECRS_OFOP_DT    apcood
930                                 WHERE   apcood.adm_cal_type             = cp_cal_type AND
931                                         apcood.adm_ci_sequence_number   = cp_ci_sequence_number AND
932                                         apcood.DT_ALIAS                 = daiv.CAL_TYPE AND
933                                         apcood.dai_sequence_number      = daiv.sequence_number);
934         CURSOR c_daiv_5 (
935                         cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
936                         cp_ci_sequence_number           IGS_CA_INST.sequence_number%TYPE) IS
937                 SELECT  COUNT(*)
938                 FROM    IGS_CA_DA_INST_V                daiv,
939                         IGS_AD_CAL_CONF                 sacc
940                 WHERE   daiv.CAL_TYPE                   = cp_cal_type AND
941                         daiv.ci_sequence_number         = cp_ci_sequence_number AND
942                         daiv.DT_ALIAS                   = sacc.adm_appl_final_dt_alias AND
943                         sacc.s_control_num              = 1 AND
944                         NOT EXISTS      (
945                                 SELECT  'x'
946                                 FROM    IGS_AD_PECRS_OFOP_DT    apcood
947                                 WHERE   apcood.adm_cal_type             = cp_cal_type AND
948                                         apcood.adm_ci_sequence_number   = cp_ci_sequence_number AND
949                                         apcood.DT_ALIAS                 = daiv.CAL_TYPE AND
950                                         apcood.dai_sequence_number      = daiv.sequence_number);
951         CURSOR c_daiv_6 (
952                         cp_cal_type                     IGS_CA_INST.CAL_TYPE%TYPE,
953                         cp_ci_sequence_number           IGS_CA_INST.sequence_number%TYPE) IS
954                 SELECT  COUNT(*)
955                 FROM    IGS_CA_DA_INST_V                daiv,
956                         IGS_AD_CAL_CONF                 sacc
957                 WHERE   daiv.CAL_TYPE                   = cp_cal_type AND
958                         daiv.ci_sequence_number         = cp_ci_sequence_number AND
959                         daiv.DT_ALIAS                   = sacc.adm_appl_offer_resp_dt_alias AND
960                         sacc.s_control_num              = 1 AND
961                         NOT EXISTS      (
962                                 SELECT  'x'
963                                 FROM    IGS_AD_PECRS_OFOP_DT    apcood
964                                 WHERE   apcood.adm_cal_type             = cp_cal_type AND
965                                         apcood.adm_ci_sequence_number   = cp_ci_sequence_number AND
966                                         apcood.DT_ALIAS                 = daiv.CAL_TYPE AND
967                                         apcood.dai_sequence_number      = daiv.sequence_number);
968 
969         -- Cursor to Check that all admission periods have
970 	-- at least one direct subordinate Load calendar instance
971 
972         CURSOR  c_cir_5 ( cp_c_sup_cal_type        igs_ca_inst.cal_type%TYPE,
973                           cp_n_sup_sequence_number igs_ca_inst.sequence_number%TYPE
974                         ) IS
975         SELECT  cir5.sub_cal_type,
976                 cir5.sub_ci_sequence_number
977         FROM    igs_ca_inst_rel cir5,
978                 igs_ca_type cat
979         WHERE   cir5.sup_cal_type               = cp_c_sup_cal_type
980 	AND     cir5.sup_ci_sequence_number     = cp_n_sup_sequence_number
981 	AND     cat.s_cal_cat                   = cst_load
982 	AND     cir5.sub_cal_type               = cat.cal_type;
983 
984         -- Bug : 2694794
985         -- cursor to check that only one load calendar instance is attached
989                      p_sequence_number igs_ca_inst_all.sequence_number%TYPE ) IS
986         -- as a subordinate calendar under an admission calendar instance
987 
988         CURSOR ad_rel_load(p_cal_type igs_ca_inst_all.cal_type%TYPE,
990         SELECT count(car.sub_ci_sequence_number)
991         FROM   igs_ca_inst_rel car,
992                igs_ca_inst_all ca,
993                igs_ca_type cat
994         WHERE
995               car.SUP_CI_SEQUENCE_NUMBER= p_sequence_number AND
996               car.SUP_CAL_type = p_cal_type AND
997               ca.cal_type = car.sub_cal_type AND
998               ca.sequence_number = car.sub_ci_sequence_number AND
999               ca.cal_type = cat.cal_type AND
1000               cat.s_cal_cat = 'LOAD' ;
1001 
1002 	rec_c_cir_5 c_cir_5%ROWTYPE;
1003   BEGIN
1004 	-- Select admission periods
1005         FOR v_cict_rec IN c_cict LOOP
1006                 -- Check that all admission period have at least one direct superior
1007                 -- academic period.
1008                 v_cal_type := v_cict_rec.CAL_TYPE;
1009                 v_sequence_number := v_cict_rec.sequence_number;
1010 		-- Check one per cal for SDAs.
1011 		CHK_ONE_PER_CAL(v_cal_type,       -- will check for acad cal instance.
1012 				v_sequence_number,
1013 				cst_admission2,
1014 				p_s_log_type,
1015 				p_log_creation_dt);
1016 
1017                 FOR v_cir_1_rec IN c_cir_1(
1018                                         v_cal_type,
1019                                         v_sequence_number) LOOP
1020                         v_cir_1_rec_found := TRUE;
1021                         -- Only check admission period for the academic period parameter
1022                         OPEN c_cir_2(
1023                                 v_cal_type,
1024                                 v_sequence_number,
1025                                 p_acad_cal_type,
1026                                 p_acad_sequence_number);
1027                         FETCH   c_cir_2 INTO v_dummy;
1028                         IF(c_cir_2%FOUND) THEN
1029                                 CLOSE c_cir_2;
1030                                 -- Identify if admission period is linked to another academic period
1031                                 -- of the same academic calendar type
1032                                 FOR v_cir_3_rec IN c_cir_3(
1033                                                         v_cal_type,
1034                                                         v_sequence_number,
1035                                                         p_acad_cal_type,
1036                                                         p_acad_sequence_number) LOOP
1037 
1038 
1039                         --- added by syam
1040                                 Fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_ONLY_1_ACADCAL');
1041 
1042                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1043                                                 p_s_log_type,
1044                                                 p_log_creation_dt,
1045                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1046                                                 NULL,
1047                                                 fnd_message.get);
1048 
1049 
1050                                 END LOOP;
1051                                 --Check that all admission periods have at least one direct
1052                                 --subordinate enrolment period
1053                                 OPEN c_cat_cir2(
1054                                         v_cal_type,
1055                                         v_sequence_number);
1056                                 FETCH c_cat_cir2 INTO   v_cir2_sub_cal_type,
1057                                                         v_cir2_sub_ci_sequence_number;
1058                                 IF c_cat_cir2%NOTFOUND THEN
1059                                         CLOSE c_cat_cir2;
1060 
1061                                 --- added by syam
1062                                 Fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_HAVE_1_ENROLCAL');
1063 
1064                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1065                                                                                 p_s_log_type,
1066                                                                                 p_log_creation_dt,
1067                                                                                 cst_admission2|| v_cal_type ||',' || TO_CHAR(v_sequence_number),
1068                                                                                 NULL,
1069                                                                                 fnd_message.get);
1070                                 --- added by syam
1071 
1072 
1073                                 ELSE
1074                                         CLOSE c_cat_cir2;
1075                                 END IF;
1076 
1077                                 --Check that all admission periods have at least one
1078                                 --subordinate Academic Term (Load) period
1079                                 OPEN c_cir_5 ( cp_c_sup_cal_type        => v_cal_type,
1080                                                cp_n_sup_sequence_number => v_sequence_number
1081 					      );
1082 		                FETCH c_cir_5 INTO rec_c_cir_5;
1083 				IF c_cir_5%NOTFOUND THEN
1084 				  FND_MESSAGE.SET_NAME('IGS','IGS_CA_ADMCAL_HAVE_1_LOAD');
1085                                   igs_ge_gen_003.genp_ins_log_entry( p_s_log_type,
1086                                                                      p_log_creation_dt,
1090 								    );
1087                                                                      cst_admission2|| v_cal_type ||',' || TO_CHAR(v_sequence_number),
1088                                                                      NULL,
1089                                                                      fnd_message.get
1091 				END IF;
1092 				CLOSE c_cir_5;
1093 
1094                                 -- Bug : 2694794
1095                                 -- check that only one load calendar instance is attached under an admission calendar
1096                                 -- as subordinate calendar
1097                                 OPEN ad_rel_load(v_cal_type,v_sequence_number);
1098                                 FETCH ad_rel_load INTO v_count;
1099                                 IF v_count > 1 THEN
1100                                   FND_MESSAGE.SET_NAME('IGS','IGS_CA_ADM_CAL_SUB_LOAD');
1101                                   igs_ge_gen_003.genp_ins_log_entry( p_s_log_type,
1102                                                                      p_log_creation_dt,
1103                                                                      cst_admission2|| v_cal_type ||',' || TO_CHAR(v_sequence_number),
1104                                                                      NULL,
1105                                                                      fnd_message.get
1106 								    );
1107                                 END IF;
1108                                 CLOSE ad_rel_load;
1109 
1110 
1111                                 -- Check that the admission period in the academic period has at least one
1112                                 -- direct superior teaching period
1113                                 FOR v_cir_4_rec IN c_cir_4(
1114                                                         v_cal_type,
1115                                                         v_sequence_number) LOOP
1116                                         v_cir_4_rec_found := TRUE;
1117                                 END LOOP;
1118                                 IF(v_cir_4_rec_found = FALSE) THEN
1119 
1120                                 --- added by syam
1121                                 Fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_HAVE_1_TEACHCAL');
1122                                 --- added by syam
1123 
1124                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1125                                                 p_s_log_type,
1126                                                 p_log_creation_dt,
1127                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1128                                                 NULL,
1129                                                 fnd_message.get);
1130                                  --- added by syam
1131 
1132                                 ELSE
1133                                         v_cir_4_rec_found := FALSE;
1134                                 END IF;
1135                                 -- Check that the admission period is defined by an admission category
1136                                 FOR v_aal_rec IN c_aal(
1137                                                         v_cal_type,
1138                                                         v_sequence_number) LOOP
1139                                         v_aal_rec_found := TRUE;
1140                                 END LOOP;
1141                                 IF(v_aal_rec_found = FALSE) THEN
1142 
1143                                 --- added by syam
1144                                 Fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_DEFINE_1_ADMCAT');
1145 
1146                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1147                                                 p_s_log_type,
1148                                                 p_log_creation_dt,
1149                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1150                                                 NULL,
1151                                                 fnd_message.get);
1152                                 --- added by syam
1153 
1154 
1155                                 ELSE
1156                                         v_aal_rec_found := FALSE;
1157                                 END IF;
1158                                 -- Validate that important dates exist in admission period
1159                                 FOR v_daiv_1_rec IN c_daiv_1(
1160                                                         v_cal_type,
1161                                                         v_sequence_number) LOOP
1162                                         v_daiv_1_rec_found := TRUE;
1163                                 END LOOP;
1164                                 IF(v_daiv_1_rec_found = FALSE) THEN
1165 
1166                                 --- added by syam
1167                                 fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_NO_INIT_DATE');
1168 
1169                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1170                                                 p_s_log_type,
1171                                                 p_log_creation_dt,
1172                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1173                                                 NULL,
1174                                                 fnd_message.get);
1175                                 --- added by syam
1176 
1177                                 ELSE
1178                                         v_daiv_1_rec_found := FALSE;
1179                                 END IF;
1180                                 FOR v_daiv_2_rec IN c_daiv_2(
1184                                 END LOOP;
1181                                                         v_cal_type,
1182                                                         v_sequence_number) LOOP
1183                                         v_daiv_2_rec_found := TRUE;
1185                                 IF(v_daiv_2_rec_found = FALSE) THEN
1186 
1187 
1188                                 --- added by syam
1189                                 fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_NO_ENCUMB_DATE');
1190 
1191                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1192                                                 p_s_log_type,
1193                                                 p_log_creation_dt,
1194                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1195                                                 NULL,
1196                                                 fnd_message.get);
1197 
1198 
1199                                 ELSE
1200                                         v_daiv_2_rec_found := FALSE;
1201                                 END IF;
1202                                 FOR v_daiv_3_rec IN c_daiv_3(
1203                                                         v_cal_type,
1204                                                         v_sequence_number) LOOP
1205                                         v_daiv_3_rec_found := TRUE;
1206                                 END LOOP;
1207                                 IF(v_daiv_3_rec_found = FALSE) THEN
1208 
1209 
1210                                 --- added by syam
1211                                   fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_NO_PSCOURSE_DATE');
1212                                 --- added by syam
1213 
1214                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1215                                                 p_s_log_type,
1216                                                 p_log_creation_dt,
1217                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1218                                                 NULL,
1219                                                 fnd_message.get);
1220 
1221                                 ELSE
1222                                         v_daiv_3_rec_found := FALSE;
1223                                 END IF;
1224                                 -- Check that for date aliases that can be attached to admission period
1225                                 -- IGS_PS_COURSE
1226                                 -- offering option override, only one date value in the admission must
1227                                 -- not be  linked to IGS_AD_PECRS_OFOP_DT
1228                                 OPEN    c_daiv_4(
1229                                                 v_cal_type,
1230                                                 v_sequence_number);
1231                                 FETCH   c_daiv_4 INTO v_count;
1232                                 CLOSE   c_daiv_4;
1233                                 IF(v_count > 1) THEN
1234 
1235 
1236                                  --- added by syam
1237                                   fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_THAN_1_DUEDATE');
1238 
1239                                 --- added by syam
1240 
1241                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1242                                                 p_s_log_type,
1243                                                 p_log_creation_dt,
1244                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1245                                                 NULL,
1246                                                 fnd_message.get);
1247 
1248 
1249                                 END IF;
1250                                 OPEN    c_daiv_5(
1251                                                 v_cal_type,
1252                                                 v_sequence_number);
1253                                 FETCH   c_daiv_5 INTO v_count;
1254                                 CLOSE   c_daiv_5;
1255                                 IF(v_count > 1) THEN
1256 
1257 
1258                                  --- added by syam
1259                                   fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_THAN_1_APPLDATE');
1260                                   --- added by syam
1261 
1262                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1263                                                 p_s_log_type,
1264                                                 p_log_creation_dt,
1265                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1266                                                 NULL,
1267                                                 fnd_Message.get);
1268 
1269                                 END IF;
1270                                 OPEN    c_daiv_6(
1271                                                 v_cal_type,
1272                                                 v_sequence_number);
1273                                 FETCH   c_daiv_6 INTO v_count;
1274                                 CLOSE   c_daiv_6;
1275                                 IF(v_count > 1) THEN
1276 
1277                                 --- added by syam
1278                                   fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_THAN_1_OFRDATE');
1279 
1280                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1281                                                 p_s_log_type,
1285                                                 fnd_message.get);
1282                                                 p_log_creation_dt,
1283                                                 cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1284                                                 NULL,
1286                                   --- added by syam
1287 
1288                                 END IF;
1289                         ELSE
1290                                 CLOSE c_cir_2;
1291                         END IF; -- (c_cir_2%FOUND)
1292                 END LOOP; -- c_cir_1
1293                 IF(v_cir_1_rec_found = FALSE) THEN
1294 
1295                 --- added by syam
1296                   fnd_Message.Set_Name('IGS','IGS_CA_ADMCAL_HAVE_1_ACADCAL');
1297 
1298                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1299                                                         p_s_log_type,
1300                                                         p_log_creation_dt,
1301                                                         cst_admission2 || v_cal_type || ',' || TO_CHAR(v_sequence_number),
1302                                                         NULL,
1303                                                         fnd_message.get);
1304 
1305                 --- added by syam
1306 
1307                 ELSE
1308                         v_cir_1_rec_found := FALSE;
1309                 END IF;
1310         END LOOP; -- c_cict
1311         RETURN;
1312   EXCEPTION
1313         WHEN OTHERS THEN
1314                 IF c_cict%ISOPEN THEN
1315                         CLOSE c_cict;
1316                 END IF;
1317                 IF c_cir_1%ISOPEN THEN
1318                         CLOSE c_cir_1;
1319                 END IF;
1320                 IF c_cat_cir2%ISOPEN THEN
1321                         CLOSE c_cat_cir2;
1322                 END IF;
1323                 IF c_cir_2%ISOPEN THEN
1324                         CLOSE c_cir_2;
1325                 END IF;
1326                 IF c_cir_3%ISOPEN THEN
1327                         CLOSE c_cir_3;
1328                 END IF;
1329                 IF c_cir_4%ISOPEN THEN
1330                         CLOSE c_cir_4;
1331                 END IF;
1332                 IF c_aal%ISOPEN THEN
1333                         CLOSE c_aal;
1334                 END IF;
1335                 IF c_daiv_1%ISOPEN THEN
1336                         CLOSE c_daiv_1;
1337                 END IF;
1338                 IF c_daiv_2%ISOPEN THEN
1339                         CLOSE c_daiv_2;
1340                 END IF;
1341                 IF c_daiv_3%ISOPEN THEN
1342                         CLOSE c_daiv_3;
1343                 END IF;
1344                 IF c_daiv_4%ISOPEN THEN
1345                         CLOSE c_daiv_4;
1346                 END IF;
1347                 IF c_daiv_5%ISOPEN THEN
1348                         CLOSE c_daiv_5;
1349                 END IF;
1350                 IF c_daiv_6%ISOPEN THEN
1351                         CLOSE c_daiv_6;
1352                 END IF;
1353 		IF c_cir_5%ISOPEN THEN
1354 		  CLOSE c_cir_5;
1355 		END IF;
1356                 App_Exception.Raise_Exception;
1357   END;
1358   EXCEPTION
1359         WHEN OTHERS THEN
1360                 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
1361                 FND_MESSAGE.SET_TOKEN('NAME','IGS_CA_VAL_QLITY.calp_val_adm_ci');
1362                 IGS_GE_MSG_STACK.ADD;
1363                 lv_param_values:=p_acad_cal_type||','||(to_char(p_acad_sequence_number));
1364                  Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
1365                  FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
1366                  IGS_GE_MSG_STACK.ADD;
1367                 lv_param_values:=p_s_log_type||','||(to_char(p_log_creation_dt));
1368                  Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
1369                  FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
1370                  IGS_GE_MSG_STACK.ADD;
1371                 App_Exception.Raise_Exception;
1372   END calp_val_adm_ci;
1373 
1374   --
1375   -- To quality check calendar data structures
1376   -- Bug # 2279265
1377   -- Update to Calendar Quality Check report
1378   -- This function is called from the report IGSCAS01
1379   FUNCTION CALP_VAL_QUAL_CHK(
1380   p_acad_cal_type IN VARCHAR2 ,
1381   p_acad_sequence_number IN NUMBER ,
1382   p_calendar_category IN VARCHAR2 )
1383   RETURN DATE AS
1384         lv_param_values                 VARCHAR2(1080);
1385         gv_other_detail         VARCHAR2(255);
1386   BEGIN
1387   DECLARE
1388 
1389         cst_all         CONSTANT        VARCHAR2(3) := 'ALL';
1390         cst_load        CONSTANT        VARCHAR2(4) := 'LOAD';
1391         cst_dates       CONSTANT        VARCHAR2(5) := 'DATES';
1392         cst_teaching    CONSTANT        VARCHAR2(8) := 'TEACHING';
1393         cst_enrolment   CONSTANT        VARCHAR2(9) := 'ENROLMENT';
1394         cst_admission   CONSTANT        VARCHAR2(9) := 'ADMISSION';
1395         cst_research    CONSTANT        VARCHAR2(8) := 'RESEARCH';
1396         cst_calquality  CONSTANT        VARCHAR2(10) := 'CALQUALITY';
1397         v_creation_dt   DATE;
1398   BEGIN -- calp_val_qual_chk
1399         -- Calendar quality check module
1400         -- This routine is triggered from a Report and calls the required dbase
1401         -- routines to perform  a quality check of the calendar structures
1402         IGS_GE_GEN_003.GENP_INS_LOG(cst_calquality,
1406 	-- Call the procedure to check if the DA used in SDAs have more than 1 instance in the Calendar for which the report is run.
1403                      p_acad_cal_type || ',' || TO_CHAR(p_acad_sequence_number),
1404                      v_creation_dt);
1405         IGS_CA_VAL_QLITY.g_cal_cat := p_calendar_category;
1407         CHK_ONE_PER_CAL(p_acad_cal_type,p_acad_sequence_number,'ALL',cst_calquality,v_creation_dt);  -- will check for ACAD cal instance.
1408         -- Process TEACHING calendars
1409         IF p_calendar_category = cst_all OR
1410                         p_calendar_category = cst_teaching THEN
1411                 IGS_CA_VAL_QLITY.calp_val_teach_ci(
1412                                         p_acad_cal_type,
1413                                         p_acad_sequence_number,
1414                                         cst_calquality,
1415                                         v_creation_dt);
1416         END IF;
1417         -- Process LOAD calendars
1418         IF p_calendar_category = cst_all OR
1419                         p_calendar_category = cst_load THEN
1420                 IGS_CA_VAL_QLITY.calp_val_load_ci(
1421                                 p_acad_cal_type,
1422                                 p_acad_sequence_number,
1423                                 cst_calquality,
1424                                 v_creation_dt);
1425         END IF;
1426         -- Process ENROLMENT calendars
1427         IF p_calendar_category = cst_all OR
1428                         p_calendar_category = cst_enrolment THEN
1429                 IGS_CA_VAL_QLITY.calp_val_enrol_ci(
1430                                 p_acad_cal_type,
1431                                 p_acad_sequence_number,
1432                                 cst_calquality,
1433                                 v_creation_dt);
1434         END IF;
1435         -- Process ADMISSION calendars
1436         IF p_calendar_category = cst_all OR
1437                         p_calendar_category = cst_admission THEN
1438                 IGS_CA_VAL_QLITY.calp_val_adm_ci(
1439                                 p_acad_cal_type,
1440                                 p_acad_sequence_number,
1441                                 cst_calquality,
1442                                 v_creation_dt);
1443         END IF;
1444         -- Process DATES calendars
1445         IF p_calendar_category = cst_all OR
1446                         p_calendar_category = cst_dates THEN
1447                 IGS_CA_VAL_QLITY.calp_val_dates_ci(
1448                                 p_acad_cal_type,
1449                                 p_acad_sequence_number,
1450                                 cst_calquality,
1451                                 v_creation_dt);
1452         END IF;
1453 
1454         IF p_calendar_category = cst_all OR
1455                         p_calendar_category = cst_research THEN
1456                 IGS_CA_VAL_QLITY.calp_val_research_ci(
1457                                 p_acad_cal_type,
1458                                 p_acad_sequence_number,
1459                                 cst_calquality,
1460                                 v_creation_dt);
1461         END IF;
1462 
1463         -- Process Award calendars
1464         -- The Award calendars selected should be ones that overlap with
1465         -- the Academic Calendar selected in the CM parameters.
1466 
1467 	IF p_calendar_category = cst_all THEN
1468             calp_val_award_ci( p_c_acad_cal_type        => p_acad_cal_type,
1469                                p_n_acad_sequence_number => p_acad_sequence_number,
1470                                p_c_s_log_type           => cst_calquality ,
1471                                p_d_log_creation_dt      => v_creation_dt
1472 		             );
1473 
1474 
1475 	END IF;
1476 
1477 
1478         COMMIT;
1479         RETURN v_creation_dt;
1480   END;
1481   EXCEPTION
1482         WHEN OTHERS THEN
1483                 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
1484                 FND_MESSAGE.SET_TOKEN('NAME','IGS_CA_VAL_QLITY.calp_val_qual_chk');
1485                 IGS_GE_MSG_STACK.ADD;
1486                 lv_param_values:=  p_acad_cal_type||','||(to_char(p_acad_sequence_number)) ;
1487                  Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
1488                  FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
1489                  IGS_GE_MSG_STACK.ADD;
1490                 lv_param_values:=  p_calendar_category ;
1491                  Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
1492                  FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
1493                  IGS_GE_MSG_STACK.ADD;
1494                 App_Exception.Raise_Exception;
1495   END calp_val_qual_chk;
1496   --
1497   -- To quality check system control dates within calendar instances.
1498   PROCEDURE CALP_VAL_DATES_CI(
1499   p_acad_cal_type IN VARCHAR2 ,
1500   p_acad_sequence_number IN NUMBER ,
1501   p_s_log_type IN VARCHAR2 ,
1502   p_log_creation_dt IN DATE )
1503   AS
1504        lv_param_values          VARCHAR2(1080);
1505         cst_load                        constant IGS_CA_TYPE.S_CAL_CAT%TYPE := 'LOAD';
1506         cst_academic                    constant IGS_CA_TYPE.S_CAL_CAT%TYPE := 'ACADEMIC';
1507         cst_teaching                    constant IGS_CA_TYPE.S_CAL_CAT%TYPE := 'TEACHING';
1508         cst_enrolment                   constant IGS_CA_TYPE.S_CAL_CAT%TYPE := 'ENROLMENT';
1509         gv_other_detail         VARCHAR2(255);
1510   BEGIN
1511   DECLARE
1512         CURSOR c_chk_dt_aliases IS
1513                 SELECT  load_effect_dt_alias,
1514                         commencement_dt_alias,
1518                         effect_enr_strt_dt_alias
1515                         commence_cutoff_dt_alias,
1516                         enr_form_due_dt_alias,
1517                         enr_pckg_prod_dt_alias,
1519                 FROM    IGS_EN_CAL_CONF
1520                 WHERE   s_control_num = 1;
1521         CURSOR c_chk_da_exists (
1522                 cp_dt_alias             IGS_EN_CAL_CONF.load_effect_dt_alias%TYPE,
1523                 cp_s_cal_cat            IGS_CA_TYPE.S_CAL_CAT%TYPE ) IS
1524                 SELECT  'x'
1525                 FROM    IGS_CA_DA_INST_V daiv,
1526                         IGS_CA_TYPE ct
1527                 WHERE   daiv.DT_ALIAS = cp_dt_alias                             AND
1528                         daiv.CAL_TYPE = ct.CAL_TYPE                             AND
1529                         ct.S_CAL_CAT <> cp_s_cal_cat;
1530         CURSOR c_chk_da_exists1 (
1531                 cp_dt_alias             IGS_EN_CAL_CONF.load_effect_dt_alias%TYPE,
1532                 cp_s_cal_cat            IGS_CA_TYPE.S_CAL_CAT%TYPE ,
1533                 cp_s_cal_cat1           IGS_CA_TYPE.S_CAL_CAT%TYPE) IS
1534                 SELECT  'x'
1535                 FROM    IGS_CA_DA_INST_V daiv,
1536                         IGS_CA_TYPE ct
1537                 WHERE   daiv.DT_ALIAS = cp_dt_alias                             AND
1538                         daiv.CAL_TYPE = ct.CAL_TYPE                             AND
1539                         ct.S_CAL_CAT <> cp_s_cal_cat                            AND
1540                         ct.S_CAL_CAT <> cp_s_cal_cat1;
1541         v_load_effect_dt_alias          IGS_EN_CAL_CONF.load_effect_dt_alias%TYPE;
1542         v_commencement_dt_alias         IGS_EN_CAL_CONF.commencement_dt_alias%TYPE;
1543         v_commence_cutoff_dt_alias      IGS_EN_CAL_CONF.commence_cutoff_dt_alias%TYPE;
1544         v_enr_form_due_dt_alias         IGS_EN_CAL_CONF.enr_form_due_dt_alias%TYPE;
1545         v_enr_pckg_prod_dt_alias        IGS_EN_CAL_CONF.enr_pckg_prod_dt_alias%TYPE;
1546         v_effect_enr_strt_dt_alias      IGS_EN_CAL_CONF.effect_enr_strt_dt_alias%TYPE;
1547         v_check_dt_alias_flag   CHAR;
1548 
1549         v_test_flag             BOOLEAN := FALSE;
1550   BEGIN
1551         -- Check optional enrolment date aliases from the IGS_EN_CAL_CONF table
1552         OPEN c_chk_dt_aliases;
1553         FETCH c_chk_dt_aliases INTO
1554                 v_load_effect_dt_alias,
1555                 v_commencement_dt_alias,
1556                 v_commence_cutoff_dt_alias,
1557                 v_enr_form_due_dt_alias,
1558                 v_enr_pckg_prod_dt_alias,
1559                 v_effect_enr_strt_dt_alias;
1560         CLOSE c_chk_dt_aliases;
1561         OPEN c_chk_da_exists( v_load_effect_dt_alias, cst_load );
1562         FETCH c_chk_da_exists INTO v_check_dt_alias_flag;
1563         IF c_chk_da_exists%FOUND THEN
1564 
1565                                 --- added by syam
1566                                           fnd_Message.Set_Name('IGS','IGS_CA_LODEFFDT_WITHIN_CALINS');
1567                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1568                                 p_s_log_type,
1569                                 p_log_creation_dt,
1570                                 'DATES' || ',' || p_acad_cal_type || ',' || TO_CHAR(p_acad_sequence_number),
1571                                 NULL,
1572                                 fnd_message.get);
1573 
1574                                 --- added by syam
1575         END IF;
1576         CLOSE c_chk_da_exists;
1577         IF v_commencement_dt_alias IS NOT NULL THEN
1578                 OPEN c_chk_da_exists( v_commencement_dt_alias, cst_academic );
1579                 FETCH c_chk_da_exists INTO v_check_dt_alias_flag;
1580                 IF c_chk_da_exists%FOUND THEN
1581 
1582 
1583                                 --- added by syam
1584                                           fnd_Message.Set_Name('IGS','IGS_CA_COMMDT_WITHIN_CALINS');
1585                                 --- added by syam
1586 
1587                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1588                                                 p_s_log_type,
1589                                                 p_log_creation_dt,
1590                                                 'DATES' || ',' || p_acad_cal_type || ',' || TO_CHAR(p_acad_sequence_number),
1591                                                 NULL,
1592                                                 fnd_message.get);
1593 
1594                 END IF;
1595                 CLOSE c_chk_da_exists;
1596         END IF;
1597         IF v_commence_cutoff_dt_alias IS NOT NULL THEN
1598                 OPEN c_chk_da_exists( v_commence_cutoff_dt_alias, cst_teaching );
1599                 FETCH c_chk_da_exists INTO v_check_dt_alias_flag;
1600                 IF c_chk_da_exists%FOUND THEN
1601 
1602                                 --- added by syam
1603                                   fnd_Message.Set_Name('IGS','IGS_CA_COMCUTOF_WITHIN_CALINS');
1604                                 --- added by syam
1605                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1606                                                 p_s_log_type,
1607                                                 p_log_creation_dt,
1608                                                 'DATES' || ',' || p_acad_cal_type || ',' || TO_CHAR(p_acad_sequence_number),
1609                                                 NULL,
1610                                                 fnd_message.get);
1611 
1612                 END IF;
1613                 CLOSE c_chk_da_exists;
1614         END IF;
1615         IF v_enr_form_due_dt_alias IS NOT NULL THEN
1616                 OPEN c_chk_da_exists1( v_enr_form_due_dt_alias, cst_academic, cst_enrolment );
1620                                   fnd_Message.Set_Name('IGS','IGS_CA_ENRDUEDT_WITHIN_CALINS');
1617                 FETCH c_chk_da_exists1 INTO v_check_dt_alias_flag;
1618                 IF c_chk_da_exists1%FOUND THEN
1619                                 --- added by syam
1621                                 --- added by syam
1622 
1623                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1624                                 p_s_log_type,
1625                                 p_log_creation_dt,
1626                                 'DATES' || ',' || p_acad_cal_type || ',' || TO_CHAR(p_acad_sequence_number),
1627                                 NULL,
1628                                 fnd_message.get);
1629 
1630 
1631                 END IF;
1632                 CLOSE c_chk_da_exists1;
1633         END IF;
1634         IF v_enr_pckg_prod_dt_alias IS NOT NULL THEN
1635                 OPEN c_chk_da_exists1( v_enr_pckg_prod_dt_alias, cst_academic,
1636                                                  cst_enrolment);
1637                 FETCH c_chk_da_exists1 INTO v_check_dt_alias_flag;
1638                 IF c_chk_da_exists1%FOUND THEN
1639 
1640                                 --- added by syam
1641                                                   fnd_Message.Set_Name('IGS','IGS_CA_ENRPKGDT_WITHIN_CALINS');
1642                                 --- added by syam
1643 
1644 
1645                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1646                                                 p_s_log_type,
1647                                                 p_log_creation_dt,
1648                                                 'DATES' || ',' || p_acad_cal_type || ',' || TO_CHAR(p_acad_sequence_number),
1649                                                 NULL,
1650                                                 fnd_message.get);
1651 
1652 
1653                 END IF;
1654                 CLOSE c_chk_da_exists1;
1655         END IF;
1656   END;
1657   EXCEPTION
1658         WHEN OTHERS THEN
1659                 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
1660                 FND_MESSAGE.SET_TOKEN('NAME','IGS_CA_VAL_QLITY.calp_val_dates_ci');
1661                 IGS_GE_MSG_STACK.ADD;
1662                 lv_param_values:= p_acad_cal_type||','||(to_char(p_acad_sequence_number));
1663                  Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
1664                  FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
1665                  IGS_GE_MSG_STACK.ADD;
1666                 lv_param_values:= p_s_log_type ||','||(to_char(p_log_creation_dt));
1667                  Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
1668                  FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
1669                  IGS_GE_MSG_STACK.ADD;
1670                 App_Exception.Raise_Exception;
1671   END calp_val_dates_ci;
1672   --
1673   -- To quality check enrolment calendar instances
1674   PROCEDURE CALP_VAL_ENROL_CI(
1675   p_acad_cal_type IN VARCHAR2 ,
1676   p_acad_sequence_number IN NUMBER ,
1677   p_s_log_type IN VARCHAR2 ,
1678   p_log_creation_dt IN DATE )
1679   AS
1680   ------------------------------------------------------------------
1681   --Change History:
1682   --Who            When            What
1683   --smadathi    16-sep-2002        Bug 2086177. Included Fetching of Planned calendars
1684   --                               along with the Active ones
1685   --skpandey    23-SEP-2005        BUG 4036104
1686   --                               Description: Modified the cursor c_chk_acad_ci to select only those records which are of Enrollment type and are subordinate of Academic cal instance.
1687   --skpandey    27-SEP-2005        Bug: 4036104
1688   --                               Description: Modified the cursor c_chk_enr_ci definition to select only those enrolment calendars (from cursor c_chk_acad_ci) which have subordinates of any type
1689   ------------------------------------------------------------------
1690         gv_other_detail         VARCHAR2(255);
1691 
1692   BEGIN
1693   DECLARE
1694         cst_academic            CONSTANT IGS_CA_TYPE.S_CAL_CAT%TYPE := 'ACADEMIC';
1695         cst_admission           CONSTANT IGS_CA_TYPE.S_CAL_CAT%TYPE := 'ADMISSION';
1696         cst_enrolment           CONSTANT IGS_CA_TYPE.S_CAL_CAT%TYPE := 'ENROLMENT';
1697         cst_active              CONSTANT IGS_CA_STAT.s_cal_status%TYPE := 'ACTIVE';
1698         cst_planned             CONSTANT IGS_CA_STAT.s_cal_status%TYPE := 'PLANNED';
1699         CURSOR c_chk_acad_ci IS
1700                 SELECT  ci.cal_type, ci.sequence_number, ct.S_CAL_CAT
1701                 FROM    IGS_CA_INST ci,
1702                         IGS_CA_TYPE ct,
1703                         IGS_CA_STAT cs
1704                 WHERE   IGS_EN_GEN_014.ENRS_GET_WITHIN_CI (
1705                                         p_acad_cal_type,
1706                                         p_acad_sequence_number,
1707                                         ci.CAL_TYPE,
1708                                         ci.sequence_number, 'N') = 'Y'  AND
1709                         cs.s_cal_status IN (cst_active,cst_planned)     AND
1710                         ct.S_CAL_CAT = cst_enrolment                   AND
1711                         cs.CAL_STATUS = ci.CAL_STATUS                   AND
1712                         ct.CAL_TYPE = ci.CAL_TYPE;
1713 
1714         CURSOR c_chk_enr_ci (cp_cal_type IGS_CA_INST.cal_type%type, cp_sequence_number IGS_CA_INST.sequence_number%type) IS
1715                 SELECT  cir.sup_cal_type, cir.sup_ci_sequence_number, ct2.S_CAL_CAT
1716                 FROM    IGS_CA_INST ci,
1717                         IGS_CA_TYPE ct,
1718                         IGS_CA_TYPE ct2,
1719                         IGS_CA_STAT cs,
1720                         IGS_CA_INST_REL cir
1724                         cs.CAL_STATUS = ci.CAL_STATUS                   AND
1721                 WHERE   cs.s_cal_status IN (cst_active,cst_planned)     AND
1722                         ct.S_CAL_CAT = cst_enrolment                    AND
1723                         ci.CAL_TYPE = ct.CAL_TYPE                       AND
1725                         cir.sup_cal_type = cp_cal_type                  AND
1726                         cir.sup_ci_sequence_number = cp_sequence_number AND
1727                         ct2.CAL_TYPE = cir.sub_cal_type;
1728   BEGIN
1729         --- Check that enrolment calendars are only linked to academic superior
1730         --- calendar instances.
1731         FOR v_chk_acad_ci IN c_chk_acad_ci LOOP
1732 
1733         --------
1734                 --- added by syam
1735                   fnd_Message.Set_Name('IGS','IGS_CA_ENRCAL_ONLY_ACADMCAL');
1736                   fnd_message.set_token('TOKEN1',v_chk_acad_ci.S_CAL_CAT);
1737 
1738 
1739                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY( p_s_log_type,
1740                                 p_log_creation_dt,
1741                                 'ENROLMENT,' || v_chk_acad_ci.cal_type || ',' ||
1742                                                  TO_CHAR(v_chk_acad_ci.sequence_number),
1743                                 NULL,
1744                                 fnd_message.get);
1745                 --- added by syam
1746 
1747         --- Select enrolment calendars which have subordinates of any type
1748         -- skpandey changed for loop position, earlier it was an independent loop
1749                  FOR v_chk_enr_ci IN c_chk_enr_ci(v_chk_acad_ci.cal_type, v_chk_acad_ci.sequence_number) LOOP
1750 
1751                      --- added by syam
1752                        fnd_Message.Set_Name('IGS','IGS_CA_ENRCAL_NO_SUBORCAL');
1753                        fnd_message.set_token('TOKEN1',v_chk_enr_ci.S_CAL_CAT);
1754                      --- added by syam
1755 
1756 
1757                        IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1758                                    p_s_log_type,
1759                                    p_log_creation_dt,
1760                                    'ENROLMENT,' || v_chk_enr_ci.sup_cal_type || ',' ||
1761                                                 TO_CHAR(v_chk_enr_ci.sup_ci_sequence_number),
1762                                    NULL,
1763                                    fnd_message.get);
1764 
1765                 END LOOP;
1766 
1767         END LOOP;
1768 
1769   END;
1770   EXCEPTION
1771         WHEN OTHERS THEN
1772                 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
1773                 FND_MESSAGE.SET_TOKEN('NAME','IGS_CA_VAL_QLITY.calp_val_enrol_ci');
1774                 IGS_GE_MSG_STACK.ADD;
1775                 App_Exception.Raise_Exception;
1776   END calp_val_enrol_ci;
1777   --
1778   -- To quality check load calendar instances
1779   PROCEDURE CALP_VAL_LOAD_CI(
1780   p_acad_cal_type IN VARCHAR2 ,
1781   p_acad_sequence_number IN NUMBER ,
1782   p_s_log_type IN VARCHAR2 ,
1783   p_log_creation_dt IN DATE )
1784   AS
1785   ------------------------------------------------------------------
1786   --Change History:
1787   --Who            When            What
1788   --smadathi     11-Sep-2002       Bug 2086177. Modified code logic to define
1789   --                               Award and Admission calendar categories as
1790   --                               superior to the 'LOAD' category.
1791   --                               Included Fetching of Planned calendars
1792   --                               along with the Active ones.
1793   --                               A mandatory relationship between award,fee and Load
1794   --                               calendars established
1795   --schodava     17-Apr-2002       Bug #2279265
1796   --                               Added 'FEE' and 'PROGRESS' calendar categories
1797   --                               to the list of calendar categories
1798   --                               allowed to be superior to the 'LOAD' category
1799   -- nsidana    7/30/2004          Bug : 3736551 : Added check to verify that load calenders
1800   --                               do not overlap within a same academic calender.
1801   --
1802   ------------------------------------------------------------------
1803 
1804          lv_param_values                        VARCHAR2(1080);
1805         gv_other_detail         VARCHAR2(255);
1806   BEGIN
1807   DECLARE
1808 
1809         v_sub_cal_type                  IGS_CA_INST_REL.sub_cal_type%TYPE;
1810         v_cal_type                      IGS_EN_ATD_TYPE_LOAD.CAL_TYPE%TYPE;
1811         v_key                           VARCHAR2(50);
1812         v_warning_msg                   VARCHAR2(2000);
1813         v_last_upper                    IGS_EN_ATD_TYPE_LOAD.upper_enr_load_range%TYPE;
1814         v_count                         NUMBER;
1815 
1816         -- 1. Select load calendars which have superior
1817         -- relationships to parents other than academic,fee,award,admission and progress
1818         CURSOR c_ci_cat_cs IS
1819                 SELECT  ci.CAL_TYPE,
1820                         ci.sequence_number
1821                 FROM    IGS_CA_INST                     ci,
1822                         IGS_CA_TYPE                     cat,
1823                         IGS_CA_STAT                     cs
1824                 WHERE   cs.s_cal_status IN ('ACTIVE','PLANNED') AND
1825                         cat.S_CAL_CAT = 'LOAD' AND
1826                         cat.CAL_TYPE = ci.CAL_TYPE AND
1827                         cs.CAL_STATUS = ci.CAL_STATUS;
1828         CURSOR c_cir_ci_cat (
1829                 cp_sub_cal_type                 IGS_CA_INST_REL.sub_cal_type%TYPE,
1833                 FROM    IGS_CA_INST_REL cir,
1830                 cp_sub_ci_sequence_number
1831                         IGS_CA_INST_REL.sub_ci_sequence_number%TYPE) IS
1832                 SELECT  cat.S_CAL_CAT
1834                         IGS_CA_INST                     ci,
1835                         IGS_CA_TYPE                     cat
1836                 WHERE   cir.sub_cal_type = cp_sub_cal_type AND
1837                         cir.sub_ci_sequence_number = cp_sub_ci_sequence_number AND
1838                         ci.CAL_TYPE = cir.sup_cal_type AND
1839                         ci.sequence_number = cir.sup_ci_sequence_number AND
1840                         cat.CAL_TYPE = ci.CAL_TYPE;
1841         -- 2. Loop through all load calendars in the specified
1842         -- academic year and check for valid links
1843         CURSOR c_load_calendars IS
1844                 SELECT  ci.CAL_TYPE,
1845                         ci.sequence_number
1846                 FROM    IGS_CA_INST     ci,
1847                         IGS_CA_TYPE     cat,
1848                         IGS_CA_STAT     cs
1849                 WHERE   cs.s_cal_status IN ('ACTIVE','PLANNED') AND
1850                         cat.S_CAL_CAT = 'LOAD' AND
1851                         cs.CAL_STATUS = ci.CAL_STATUS AND
1852                         cat.CAL_TYPE = ci.CAL_TYPE AND
1853                         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
1854                                         p_acad_cal_type,
1855                                         p_acad_sequence_number,
1856                                         ci.CAL_TYPE,
1857                                         ci.sequence_number,
1858                                         'N') = 'Y';
1859         -- 2.1 Check for overlapping load calenders.
1860 
1861         CURSOR c_chk_overlap(cp_cal_type igs_ca_inst.cal_type%TYPE,cp_seq_num igs_ca_inst.sequence_number%TYPE)
1862 	IS
1863 	  SELECT  ci.alternate_code,ci.description,ci.start_dt,ci.end_dt
1864  	  FROM    IGS_CA_INST     ci,
1865 	          IGS_CA_INST     ci2,
1866 		  IGS_CA_TYPE     cat,
1867 		  IGS_CA_STAT     cs,
1868 		  IGS_CA_INST_REL car
1869 	  WHERE
1870 		  ci2.cal_type        = cp_cal_type AND
1871 		  ci2.sequence_number = cp_seq_num AND
1872 	  	  cs.s_cal_status IN ('ACTIVE','PLANNED') AND
1873 		  cat.S_CAL_CAT = 'LOAD' AND
1874 		  cs.CAL_STATUS = ci.CAL_STATUS AND
1875 		  cat.CAL_TYPE = ci.CAL_TYPE AND
1876 		  car.SUP_CAL_TYPE           = p_acad_cal_type AND
1877 		  car.SUP_CI_SEQUENCE_NUMBER = p_acad_sequence_number AND
1878 		  car.SUB_CAL_TYPE           = ci.CAL_TYPE AND
1879 		  car.SUB_CI_SEQUENCE_NUMBER = ci.sequence_number AND
1880 		  (ci.rowid <> ci2.rowid) AND
1881 		  (
1882 		   (ci2.start_dt BETWEEN ci.start_dt AND ci.end_dt) OR
1883 		   (ci2.end_dt BETWEEN ci.start_dt AND ci.end_dt) OR
1884 		   (ci2.start_dt <=  ci.start_dt AND ci2.end_dt >= ci.end_dt)
1885   	          );
1886 
1887         -- 3. Select load calendars which have subordinates of any type
1888         CURSOR c_cir (
1889                         cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE,
1890                         cp_sequence_number      IGS_CA_INST.sequence_number%TYPE) IS
1891                 SELECT  cir.sub_cal_type
1892                 FROM    IGS_CA_INST_REL cir
1893                 WHERE   cir.sup_cal_type = cp_cal_type AND
1894                         cir.sup_ci_sequence_number = cp_sequence_number;
1895         -- 4. Check that the load calendar is not linked to
1896         -- other academic calendar instances.
1897         CURSOR c_cir2 (
1898                         cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE,
1899                         cp_sequence_number      IGS_CA_INST.sequence_number%TYPE) IS
1900                 SELECT  cir.sub_cal_type
1901                 FROM    IGS_CA_INST_REL cir,
1902                         IGS_CA_TYPE                     cat
1903                 WHERE   cir.sub_cal_type = cp_cal_type AND
1904                         cir.sub_ci_sequence_number = cp_sequence_number AND
1905                         (cir.sup_cal_type <> p_acad_cal_type OR
1906                         cir.sup_ci_sequence_number <> p_acad_sequence_number) AND
1907                         cat.CAL_TYPE = cir.sup_cal_type AND
1908                         cat.S_CAL_CAT = 'ACADEMIC';
1909         -- 5. Check that one and only one 'load effect date' alias
1910         -- instance exists within the calendar instance.
1911         CURSOR c_secc_dai (
1912                         cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE,
1913                         cp_sequence_number      IGS_CA_INST.sequence_number%TYPE) IS
1914                 SELECT  count(*)
1915                 FROM    IGS_EN_CAL_CONF         secc,
1916                         IGS_CA_DA_INST  dai
1917                 WHERE   secc.s_control_num = 1 AND
1918                         dai.CAL_TYPE = cp_cal_type AND
1919                         dai.ci_sequence_number = cp_sequence_number AND
1920                         dai.DT_ALIAS = secc.load_effect_dt_alias;
1921         -- 6. Checks related to default load apportion entries
1922         CURSOR c_dla (
1923                         cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE,
1924                         cp_sequence_number      IGS_CA_INST.sequence_number%TYPE) IS
1925                 SELECT  dla.teach_cal_type,
1926                         dla.second_percentage
1927                 FROM    IGS_ST_DFT_LOAD_APPO    dla
1928                 WHERE   dla.CAL_TYPE = cp_cal_type AND
1929                         dla.ci_sequence_number = cp_sequence_number;
1930         -- 7. Validate that teaching period is linked to the same academic period.
1931         CURSOR c_ci_cs (
1932                         cp_teach_cal_type       IGS_ST_DFT_LOAD_APPO.teach_cal_type%TYPE) IS
1936                 WHERE   CAL_TYPE = cp_teach_cal_type AND
1933                 SELECT  count(*)
1934                 FROM    IGS_CA_INST     ci,
1935                         IGS_CA_STAT     cs
1937                         cs.s_cal_status IN ('ACTIVE','PLANNED') AND
1938                         ci.CAL_STATUS = cs.CAL_STATUS AND
1939                         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
1940                                         p_acad_cal_type,
1941                                         p_acad_sequence_number,
1942                                         ci.CAL_TYPE,
1943                                         ci.sequence_number,
1944                                         'N') = 'Y';
1945         -- 8. Validate that attendance type load records exist for all load calendars
1946         CURSOR c_att IS
1947                 SELECT  att.ATTENDANCE_TYPE
1948                 FROM    IGS_EN_ATD_TYPE att
1949                 WHERE   att.closed_ind = 'N' AND
1950                         ((att.lower_enr_load_range IS NOT NULL AND
1951                         att.lower_enr_load_range <> 0) OR
1952                         (att.upper_enr_load_range IS NOT NULL AND
1953                         att.upper_enr_load_range <> 0));
1954         CURSOR c_atl (
1955                         cp_attendance_type      IGS_EN_ATD_TYPE.ATTENDANCE_TYPE%TYPE,
1956                         cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE) IS
1957                 SELECT  atl.CAL_TYPE                    -- not used
1958                 FROM    IGS_EN_ATD_TYPE_LOAD    atl
1959                 WHERE   atl.ATTENDANCE_TYPE = cp_attendance_type AND
1960                         atl.CAL_TYPE = cp_cal_type;
1961         -- 9. Validate that the attendance type load records for all
1962         -- attendance types cover the entire range of EFTSU. (ie. there are no gaps)
1963         CURSOR c_atl_att (
1964                         cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE) IS
1965                 SELECT  atl.lower_enr_load_range,
1966                         atl.upper_enr_load_range
1967                 FROM    IGS_EN_ATD_TYPE_LOAD    atl,
1968                         IGS_EN_ATD_TYPE         att
1969                 WHERE   atl.CAL_TYPE = cp_cal_type AND
1970                         att.closed_ind = 'N' AND
1971                         att.ATTENDANCE_TYPE = atl.ATTENDANCE_TYPE
1972                 ORDER BY att.lower_enr_load_range;
1973 
1974         -- Cursor to Check that award calendar should have
1975 	-- at least one direct subordinate Load calendar instance
1976 
1977         CURSOR  c_cir_6 ( cp_c_sub_cal_type        igs_ca_inst.cal_type%TYPE,
1978                           cp_n_sub_sequence_number igs_ca_inst.sequence_number%TYPE
1979                         ) IS
1980         SELECT  cir6.sup_cal_type,
1981                 cir6.sup_ci_sequence_number
1982         FROM    igs_ca_inst_rel cir6,
1983                 igs_ca_type cat
1984         WHERE   cir6.sub_cal_type               = cp_c_sub_cal_type
1985 	AND     cir6.sub_ci_sequence_number     = cp_n_sub_sequence_number
1986 	AND     cat.S_CAL_CAT                   = 'AWARD'
1987 	AND     cir6.sup_cal_type               = cat.cal_type;
1988 
1989 	rec_c_cir_6 c_cir_6%ROWTYPE;
1990 
1991         CURSOR  c_cir_9 ( cp_c_sub_cal_type        igs_ca_inst.cal_type%TYPE,
1992                           cp_n_sub_sequence_number igs_ca_inst.sequence_number%TYPE
1993                         ) IS
1994         SELECT  cir9.sup_cal_type,
1995                 cir9.sup_ci_sequence_number
1996         FROM    igs_ca_inst_rel cir9,
1997                 igs_ca_type cat
1998         WHERE   cir9.sub_cal_type               = cp_c_sub_cal_type
1999 	AND     cir9.sub_ci_sequence_number     = cp_n_sub_sequence_number
2000 	AND     cat.S_CAL_CAT                   = 'ADMISSION'
2001 	AND     cir9.sup_cal_type               = cat.cal_type;
2002 
2003 	rec_c_cir_9 c_cir_9%ROWTYPE;
2004 	l_overlap c_chk_overlap%ROWTYPE;
2005 
2006   BEGIN
2007         -- Quality check of calendar data structures related to Load Calendars.
2008         -- Checks Include:
2009         -- 1. Must always be linked to a single academic calendar instance
2010         -- 2. Bug #2279265 : Modified the comment
2011         --    Should only be a subordinate to academic, Fee and Progress calendars
2012         -- 3. Has no logical subordinate calendar categories
2013         -- 4. Must have one load effect date alias instance
2014         -- 5. Default load apportion should only link to teaching period
2015         --    calendar types which are offered in the related academic calendar
2016         -- 6. Attendance Type Load structure should exist for all derivable
2017         --    attendance types covering the total applicable load
2018         -----------------------------------------------------------
2019         -- Select load calendars which have superior relationships
2020         -- to parents other than academic, fee ,progress, award and Admission
2021         FOR v_ci_cat_cs_rec IN c_ci_cat_cs LOOP
2022                 FOR v_cir_ci_cat_rec IN c_cir_ci_cat(
2023                                                         v_ci_cat_cs_rec.CAL_TYPE,
2024                                                         v_ci_cat_cs_rec.sequence_number) LOOP
2025                         IF (v_cir_ci_cat_rec.S_CAL_CAT NOT IN ('ACADEMIC','FEE','PROGRESS','ADMISSION','AWARD')) THEN
2026                                 -- Raise Warning
2027                                 v_key :=        'LOAD,' ||
2028                                                 v_ci_cat_cs_rec.CAL_TYPE || ',' ||
2029                                                 v_ci_cat_cs_rec.sequence_number;
2030                 --- added by syam
2034                 --- added by syam
2031                   fnd_Message.Set_Name('IGS','IGS_CA_LODCAL_ONLY_ACADMCAL');
2032                   fnd_message.set_token('TOKEN1',v_cir_ci_cat_rec.S_CAL_CAT);
2033                   v_warning_msg := fnd_message.get;
2035 
2036 
2037                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2038                                                 p_s_log_type,
2039                                                 p_log_creation_dt,
2040                                                 v_key,
2041                                                 NULL,
2042                                                 v_warning_msg);
2043                                 EXIT;
2044                         END IF;
2045                 END LOOP;
2046         END LOOP;
2047         -- Loop through all load calendars in the specified academic year and
2048         -- check for valid links.
2049         FOR v_load_calendars IN c_load_calendars LOOP
2050 
2051 	        -- Check one per cal for SDAs.
2052          CHK_ONE_PER_CAL(v_load_calendars.cal_type,       -- will check for load cal instance.
2053 	                 v_load_calendars.sequence_number,
2054 			 'LOAD',
2055 			 p_s_log_type,
2056 			 p_log_creation_dt);
2057 
2058 	-- Check if the load calender overlaps with another one in the system. Check if there are any overlapping calenders, if yes, run a loop and record all of them in the LOG table.
2059 
2060        l_overlap.alternate_code := null;
2061 
2062        FOR l_overlap IN c_chk_overlap(v_load_calendars.cal_type,v_load_calendars.sequence_number)
2063        LOOP
2064 
2065 	 v_key := 'LOAD,' || v_load_calendars.CAL_TYPE || ',' || v_load_calendars.sequence_number || ',' || l_overlap.alternate_code ;  -- key for the log table.
2066 
2067 	 fnd_Message.Set_Name('IGS','IGS_CA_OVERLAP_LOAD_CAL');  -- new message for this check.
2068 	 fnd_message.set_token('TOKEN1',l_overlap.alternate_code);
2069 	 fnd_message.set_token('TOKEN2',l_overlap.description);
2070 	 fnd_message.set_token('TOKEN3',l_overlap.start_dt);
2071 	 fnd_message.set_token('TOKEN4',l_overlap.end_dt);
2072 	 v_warning_msg := fnd_message.get;
2073 
2074 	 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(p_s_log_type,
2075                                 	   p_log_creation_dt,
2076  	                                   v_key,
2077  	                                   NULL,
2078  	                                   v_warning_msg);
2079        END LOOP;
2080 
2081        IF (c_chk_overlap%ISOPEN)
2082        THEN
2083          CLOSE c_chk_overlap;
2084        END IF;
2085 
2086             -- Check that the load calendar is not linked to another other
2087                 -- academic calendar instances.
2088                 OPEN c_cir(
2089                         v_load_calendars.CAL_TYPE,
2090                         v_load_calendars.sequence_number);
2091                 FETCH c_cir INTO v_sub_cal_type;
2092                 IF (c_cir%FOUND) THEN
2093                         -- Raise warning
2094                         v_key :=        'LOAD,' ||
2095                                         v_load_calendars.CAL_TYPE || ',' ||
2096                                         v_load_calendars.sequence_number;
2097 
2098 
2099                         --- added by syam
2100                                           fnd_Message.Set_Name('IGS','IGS_CA_LODCAL_NO_SUBORCAL');
2101                                           fnd_message.set_token('TOKEN1',v_sub_cal_type);
2102                                           v_warning_msg := fnd_message.get;
2103                         --- added by syam
2104 
2105 
2106                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2107                                         p_s_log_type,
2108                                         p_log_creation_dt,
2109                                         v_key,
2110                                         NULL,
2111                                         v_warning_msg);
2112                 END IF;
2113                 CLOSE c_cir;
2114                 -- Check that the load calendar is not linked to
2115                 -- other academic calendar instance.
2116                 OPEN c_cir2(
2117                         v_load_calendars.CAL_TYPE,
2118                         v_load_calendars.sequence_number);
2119                 FETCH c_cir2 INTO v_sub_cal_type;
2120                 IF (c_cir2%FOUND) THEN
2121                         -- Raise warning
2122                         v_key :=        'LOAD,' ||
2123                                         v_load_calendars.CAL_TYPE || ',' ||
2124                                         v_load_calendars.sequence_number;
2125 
2126                         --- added by syam
2127                                   fnd_Message.Set_Name('IGS','IGS_CA_LODCAL_SUB_TO_1_CALINS');
2128                                   v_warning_msg := fnd_message.get;
2129                         --- added by syam
2130 
2131                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2132                                         p_s_log_type,
2133                                         p_log_creation_dt,
2134                                         v_key,
2135                                         NULL,
2136                                         v_warning_msg);
2137 
2138                 END IF;
2139                 CLOSE c_cir2;
2140 
2141                /**This section covers validating the mandatory relation between admission, award , fee  and Academic Term (Load) period **/
2142 
2143                --Check that all Academic Term (Load) period have at least one
2144                --superior award periods
2148 	       FETCH c_cir_6 INTO rec_c_cir_6;
2145                OPEN c_cir_6 ( cp_c_sub_cal_type        => v_load_calendars.cal_type,
2146                               cp_n_sub_sequence_number => v_load_calendars.sequence_number
2147 	                    );
2149 	       IF c_cir_6%NOTFOUND THEN
2150 		  FND_MESSAGE.SET_NAME('IGS','IGS_CA_LOAD_HAVE_1_AWDCAL');
2151                   igs_ge_gen_003.genp_ins_log_entry( p_s_log_type,
2152                                                      p_log_creation_dt,
2153                                                      'LOAD,'|| v_load_calendars.cal_type ||',' ||v_load_calendars.sequence_number,
2154                                                      NULL,
2155                                                      fnd_message.get
2156 						    );
2157 		END IF;
2158 		CLOSE c_cir_6;
2159 
2160                --Check that all Academic Term (Load) period have at least one
2161                --superior admission periods
2162                OPEN c_cir_9 ( cp_c_sub_cal_type        => v_load_calendars.cal_type,
2163                               cp_n_sub_sequence_number => v_load_calendars.sequence_number
2164 	                    );
2165 	       FETCH c_cir_9 INTO rec_c_cir_9;
2166 	       IF c_cir_9%NOTFOUND THEN
2167 		  FND_MESSAGE.SET_NAME('IGS','IGS_CA_LOAD_HAVE_1_ADMCAL');
2168                   igs_ge_gen_003.genp_ins_log_entry( p_s_log_type,
2169                                                      p_log_creation_dt,
2170                                                      'LOAD,'|| v_load_calendars.cal_type ||',' ||v_load_calendars.sequence_number,
2171                                                      NULL,
2172                                                      fnd_message.get
2173 						    );
2174 		END IF;
2175 		CLOSE c_cir_9;
2176 
2177 	       /**End of this section **/
2178 
2179                 -- Check that one and only one load effect date alias
2180                 -- instance exists within the calendar instance
2181                 OPEN c_secc_dai(
2182                                 v_load_calendars.CAL_TYPE,
2183                                 v_load_calendars.sequence_number);
2184                 FETCH c_secc_dai INTO v_count;
2185                 CLOSE c_secc_dai;
2186                 IF (v_count <> 1) THEN
2187                         -- Raise warning
2188                         v_key :=        'LOAD,' ||
2189                                         v_load_calendars.CAL_TYPE || ',' ||
2190                                         v_load_calendars.sequence_number;
2191 
2192                         --- added by syam
2193                           fnd_Message.Set_Name('IGS','IGS_CA_LDCLINS_1_EFFDTALIAS');
2194                           v_warning_msg := fnd_message.get;
2195                         --- added by syam
2196 
2197                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2198                                         p_s_log_type,
2199                                         p_log_creation_dt,
2200                                         v_key,
2201                                         NULL,
2202                                         v_warning_msg);
2203                 END IF;
2204                 -- Checks related to default load apportion entries
2205                 FOR v_dla_rec IN c_dla(
2206                                         v_load_calendars.CAL_TYPE,
2207                                         v_load_calendars.sequence_number) LOOP
2208                         -- Validate that teaching period is linked to the same academic period.
2209                         OPEN c_ci_cs(v_dla_rec.teach_cal_type);
2210                         FETCH c_ci_cs INTO v_count;
2211                         CLOSE c_ci_cs;
2212                         IF (v_count = 0) THEN
2213                                 -- Raise warning
2214                                 v_key :=        'LOAD,' ||
2215                                                 v_load_calendars.CAL_TYPE || ',' ||
2216                                                 v_load_calendars.sequence_number;
2217 
2218 
2219                         --- added by syam
2220                           fnd_Message.Set_Name('IGS','IGS_CA_CALTYPE_NO_INSACAD');
2221                           fnd_message.set_token('TOKEN1',v_dla_rec.teach_cal_type);
2222                           v_warning_msg := fnd_message.get;
2223                         --- added by syam
2224 
2225                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2226                                                 p_s_log_type,
2227                                                 p_log_creation_dt,
2228                                                 v_key,
2229                                                 NULL,
2230                                                 v_warning_msg);
2231 
2232 
2233                         END IF;
2234                         -- If the second percentage is set, check
2235                         -- that there is need for it
2236                         IF (v_dla_rec.second_percentage IS NOT NULL AND
2237                                         v_count = 1) THEN
2238                                 -- Raise warning
2239                                 v_key :=        'LOAD,' ||
2240                                                 v_load_calendars.CAL_TYPE || ',' ||
2241                                                 v_load_calendars.sequence_number;
2242 
2243 
2244                         --- added by syam
2245                           fnd_Message.Set_Name('IGS','IGS_CA_TEACHCAL_1_INSACAD');
2246                           fnd_message.set_token('TOKEN1',v_dla_rec.teach_cal_type);
2247                           v_warning_msg := fnd_message.get;
2248                         --- added by syam
2249 
2253                                                 v_key,
2250                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2251                                                 p_s_log_type,
2252                                                 p_log_creation_dt,
2254                                                 NULL,
2255                                                 v_warning_msg);
2256                         END IF;
2257                 END LOOP; -- (dlft_load_apportion)
2258                 -- Validate that the attendance type load records exist
2259                 -- for all load calendars
2260                 FOR v_att_rec IN c_att LOOP
2261                         OPEN c_atl(
2262                                 v_att_rec.ATTENDANCE_TYPE,
2263                                 v_load_calendars.CAL_TYPE);
2264                         FETCH c_atl INTO v_cal_type;
2265                         IF (c_atl%NOTFOUND) THEN
2266                                 -- Raise warning
2267                                 v_key :=        'LOAD,' ||
2268                                                 v_load_calendars.CAL_TYPE || ',' ||
2269                                                 v_load_calendars.sequence_number;
2270 
2271                         --- added by syam
2272                           fnd_Message.Set_Name('IGS','IGS_CA_ATTYPE_NO_LODDTL');
2273                           fnd_message.set_token('TOKEN1',v_att_rec.ATTENDANCE_TYPE);
2274                           v_warning_msg := fnd_message.get;
2275                         --- added by syam
2276 
2277                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2278                                                 p_s_log_type,
2279                                                 p_log_creation_dt,
2280                                                 v_key,
2281                                                 NULL,
2282                                                 v_warning_msg);
2283                         END IF;
2284                         CLOSE c_atl;
2285                 END LOOP;
2286                 -- Validate that the attendance type load records for all
2287                 -- attendance types cover the entire of EFTSU.
2288                 -- ie. There are no gaps
2289                 v_last_upper := 0.00;
2290                 FOR v_atl_att_rec IN c_atl_att(v_load_calendars.CAL_TYPE) LOOP
2291                         IF ((v_atl_att_rec.lower_enr_load_range - v_last_upper) > .001) THEN
2292                                 -- Raise warning
2293                                 v_key :=        'LOAD,' ||
2294                                                 v_load_calendars.CAL_TYPE || ',' ||
2295                                                 v_load_calendars.sequence_number;
2296 
2297 
2298                                 --- added by syam
2299                                                   fnd_Message.Set_Name('IGS','IGS_CA_GAP_BW_ATTYPE_LODRNGES');
2300                                                   v_warning_msg := fnd_message.get;
2301                                 --- added by syam
2302 
2303 
2304                                 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2305                                                 p_s_log_type,
2306                                                 p_log_creation_dt,
2307                                                 v_key,
2308                                                 NULL,
2309                                                 v_warning_msg);
2310 
2311                                 -- exit the v_atl_att_rec loop because we only want to
2312                                 -- insert the one record, even if more gaps exists.
2313                                 EXIT;
2314                         END IF;
2315                         v_last_upper := v_atl_att_rec.upper_enr_load_range;
2316                 END LOOP; -- (IGS_EN_ATD_TYPE_LOAD)
2317         END LOOP; -- (IGS_CA_INST)
2318   END;
2319   EXCEPTION
2320         WHEN OTHERS THEN
2321                 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
2322                 FND_MESSAGE.SET_TOKEN('NAME','IGA_CA_VAL_QLITY.calp_val_load_ci');
2323                 IGS_GE_MSG_STACK.ADD;
2324                 lv_param_values:= p_acad_cal_type ||','||(to_char(p_acad_sequence_number))||','||p_s_log_type||','||(to_char(p_log_creation_dt));
2325                  Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
2326                  FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
2327                  IGS_GE_MSG_STACK.ADD;
2328                 App_Exception.Raise_Exception;
2329   END calp_val_load_ci;
2330   --
2331   -- To quality check teaching calendar instances
2332   PROCEDURE CALP_VAL_TEACH_CI(
2333   p_acad_cal_type IN VARCHAR2 ,
2334   p_acad_sequence_number IN NUMBER ,
2335   p_s_log_type IN VARCHAR2 ,
2336   p_log_creation_dt IN DATE )
2337   AS
2338   ------------------------------------------------------------------
2339   --Change History:
2340   --Who            When            What
2341   --smadathi    16-sep-2002        Bug 2086177. Included Fetching of Planned calendars
2342   --                               along with the Active ones
2343   ------------------------------------------------------------------
2344         lv_param_values         VARCHAR2(1080);
2345         gv_other_detail         VARCHAR2(255);
2346   BEGIN -- The checks include:
2347         -- 1.  Must always be linked to at least one academic calendar
2348         -- 2.  Should only have superiors of Academic or Fee calendars.
2349         -- 3.  Should not have any subordinate calendars other than ADMISSION,
2350         --     and should be linked to at least ONE admission calendar.
2354         -- 6.  Administrative IGS_PS_UNIT status load structure must be defined for
2351         -- 4.  The total apportionment to load calendars must equal 100%
2352         -- 5.  Second percentage field is only required when linked to more
2353         --     than one instance of a load calendar type.
2355         --     all applicable load calendars for any administrative IGS_PS_UNIT
2356         --     statuses which can be used in the teaching period.
2357   DECLARE
2358 
2359         cst_academic            CONSTANT IGS_CA_TYPE.S_CAL_CAT%TYPE     := 'ACADEMIC';
2360         cst_fee                 CONSTANT IGS_CA_TYPE.S_CAL_CAT%TYPE     := 'FEE';
2361         cst_exam                CONSTANT IGS_CA_TYPE.S_CAL_CAT%TYPE     := 'EXAM';
2362         cst_assessment          CONSTANT IGS_CA_TYPE.S_CAL_CAT%TYPE     := 'ASSESSMENT';
2363         cst_teaching            CONSTANT IGS_CA_TYPE.S_CAL_CAT%TYPE     := 'TEACHING';
2364         cst_progress            CONSTANT igs_ca_type.s_cal_cat%TYPE := 'PROGRESS';
2365         cst_active              CONSTANT IGS_CA_STAT.s_cal_status%TYPE  := 'ACTIVE';
2366         cst_planned             CONSTANT IGS_CA_STAT.s_cal_status%TYPE  := 'PLANNED';
2367         cst_admission           CONSTANT IGS_CA_STAT.s_cal_status%TYPE  := 'ADMISSION';
2368 
2369         v_exists_flag   CHAR;
2370         v_dummy         VARCHAR2(10);
2371         v_message_name   VARCHAR2(30);
2372         v_total_percentage      IGS_ST_DFT_LOAD_APPO.percentage%TYPE;
2373         v_acad_cal_type         IGS_CA_INST.CAL_TYPE%TYPE;
2374         v_acad_sequence_number  IGS_CA_INST.sequence_number%TYPE;
2375         v_acad_start_dt         IGS_CA_INST.start_dt%TYPE;
2376         v_acad_end_dt           IGS_CA_INST.end_dt%TYPE;
2377         v_p_acad_start_dt       IGS_CA_INST.start_dt%TYPE;
2378         v_p_acad_end_dt         IGS_CA_INST.end_dt%TYPE;
2379         v_chk_tch_sub_cal_type  IGS_CA_INST_REL.sub_cal_type%TYPE;
2380         v_sub_not_admission     BOOLEAN := FALSE;
2381         v_chk_tch_sub_rec_found BOOLEAN := FALSE;
2382         CURSOR c_acad_dates (
2383                 cp_acad_cal_type                IGS_CA_INST.CAL_TYPE%TYPE,
2384                 cp_acad_sequence_number IGS_CA_INST.sequence_number%TYPE) IS
2385                 SELECT  start_dt,
2386                         end_dt
2387                 FROM    IGS_CA_INST
2388                 WHERE   CAL_TYPE = cp_acad_cal_type AND
2389                         sequence_number = cp_acad_sequence_number;
2390         CURSOR  c_chk_acad_fee_ci IS
2391                 SELECT  cir.sub_cal_type, cir.sub_ci_sequence_number, ct1.S_CAL_CAT
2392                 FROM    IGS_CA_INST ci,
2393                         IGS_CA_TYPE ct1,
2394                         IGS_CA_TYPE ct2,
2395                         IGS_CA_STAT cs,
2396                         IGS_CA_INST_REL cir
2397                 WHERE   cs.s_cal_status IN (cst_active,cst_planned)    AND
2398                         ct2.S_CAL_CAT = cst_teaching                    AND
2399                         cs.CAL_STATUS = ci.CAL_STATUS                   AND
2400                         cir.sub_cal_type = ci.CAL_TYPE                  AND
2401                         cir.sub_ci_sequence_number = ci.sequence_number AND
2402                         cir.sup_cal_type = ct1.CAL_TYPE                 AND
2403                         ct2.CAL_TYPE = ci.CAL_TYPE                      AND
2404                         ct1.S_CAL_CAT NOT IN ( cst_academic )   AND
2405                         (IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(     p_acad_cal_type,
2406                                                 p_acad_sequence_number,
2407                                                 ci.CAL_TYPE,
2408                                                 ci.sequence_number,
2409                                                 'Y') = 'Y'  OR
2410                         NOT EXISTS (
2411                                     SELECT 'x'
2412                                     FROM    IGS_CA_INST_REL cir,
2413                                             IGS_CA_INST ci,
2414                                             IGS_CA_TYPE cat
2415                                     WHERE   cir.sub_cal_type                = ci.CAL_TYPE AND
2416                                             cir.sub_ci_sequence_number      = ci.sequence_number AND
2417                                             cir.sup_cal_type                = ci.CAL_TYPE  AND
2418                                             cir.sup_ci_sequence_number      = ci.sequence_number AND
2419                                             ci.CAL_TYPE                     = cat.CAL_TYPE AND
2420                                             cat.S_CAL_CAT                   = 'ACADEMIC' ));
2421 
2422 
2423 
2424         CURSOR c_chk_teach_ci IS
2425                 SELECT  ci.CAL_TYPE,
2426                         ci.sequence_number,
2427                         cs.s_cal_status -- Bug:2697221 cal status selected to check whether
2428                                         -- the status is planned or active for calculating load apportionment
2429                 FROM    IGS_CA_INST ci,
2430                         IGS_CA_TYPE ct,
2431                         IGS_CA_STAT cs
2432                 WHERE   cs.s_cal_status IN (cst_active,cst_planned) AND
2433                         cs.CAL_STATUS   = ci.CAL_STATUS         AND
2434                         ct.S_CAL_CAT    = cst_teaching          AND
2435                         ct.CAL_TYPE     = ci.CAL_TYPE           AND
2436                         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
2437                                 p_acad_cal_type,
2438                                 p_acad_sequence_number,
2439                                 ci.CAL_TYPE,
2440                                 ci.sequence_number,
2441                                 'Y' ) = 'Y';
2442         CURSOR c_chk_tch_sub (
2446                         cat2.S_CAL_CAT
2443                 cp_cal_type             IGS_CA_INST_REL.sup_cal_type%TYPE,
2444                 cp_sequence_number      IGS_CA_INST_REL.sup_ci_sequence_number%TYPE ) IS
2445                 SELECT  cir.sub_cal_type,
2447                 FROM    IGS_CA_INST_REL cir,
2448                         IGS_CA_TYPE cat1,
2449                         IGS_CA_TYPE cat2
2450                 WHERE   cir.sup_cal_type                = cat1.CAL_TYPE         AND
2451                         cir.sub_cal_type                = cat2.CAL_TYPE         AND
2452                         cir.sup_cal_type                = cp_cal_type           AND
2453                         cir.sup_ci_sequence_number      = cp_sequence_number;
2454         CURSOR c_chk_census_dt (
2455                 cp_cal_type             IGS_CA_DA_INST_V.CAL_TYPE%TYPE,
2456                 cp_sequence_number      IGS_CA_DA_INST_V.sequence_number%TYPE,
2457                 cp_acad_start_dt        DATE,
2458                 cp_acad_end_dt          DATE ) IS
2459                 SELECT  'x'
2460                 FROM    dual
2461                 WHERE   EXISTS (
2462                                 SELECT  *
2463                                 FROM    IGS_GE_S_GEN_CAL_CON sgcc,
2464                                         IGS_CA_DA_INST_V daiv
2465                                 WHERE   sgcc.s_control_num = 1                          AND
2466                                         daiv.CAL_TYPE = cp_cal_type                     AND
2467                                         daiv.ci_sequence_number = cp_sequence_number    AND
2468                                         daiv.DT_ALIAS = sgcc.census_dt_alias    AND
2469                                         daiv.alias_val BETWEEN cp_acad_start_dt AND cp_acad_end_dt);
2470         CURSOR c_chk_acad_pct (
2471                 cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE,
2472                 cp_sequence_number      IGS_CA_INST.sequence_number%TYPE ) IS
2473                 SELECT  ci.*
2474                 FROM    IGS_CA_INST ci,
2475                         IGS_CA_TYPE ct,
2476                         IGS_CA_STAT cs
2477                 WHERE   cs.s_cal_status IN (cst_active,cst_planned)   AND
2478                         ct.S_CAL_CAT    = cst_academic          AND
2479                         ci.CAL_TYPE     = ct.CAL_TYPE           AND
2480                         cs.CAL_STATUS   = ci.CAL_STATUS         AND
2481                         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
2482                                 ci.CAL_TYPE,
2483                                 ci.sequence_number,
2484                                 cp_cal_type,
2485                                 cp_sequence_number,
2486                                 'Y' ) = 'Y';
2487         CURSOR c_chk_dla (
2488                 cp_teach_cal_type               IGS_ST_DFT_LOAD_APPO.teach_cal_type%TYPE,
2489                 cp_acad_cal_type                IGS_CA_INST.CAL_TYPE%TYPE,
2490                 cp_acad_ci_sequence_number      IGS_CA_INST.sequence_number%TYPE) IS
2491                 SELECT  dla.*
2492                 FROM    IGS_ST_DFT_LOAD_APPO dla
2493                 WHERE   teach_cal_type = cp_teach_cal_type AND
2494                         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
2495                                 cp_acad_cal_type,
2496                                 cp_acad_ci_sequence_number,
2497                                 dla.CAL_TYPE,
2498                                 dla.ci_sequence_number,
2499                                 'Y' ) = 'Y';
2500         CURSOR c_chk_tch_ci_aus IS
2501                 SELECT  ci.CAL_TYPE,
2502                         ci.sequence_number
2503                 FROM    IGS_CA_INST ci,
2504                         IGS_CA_TYPE ct,
2505                         IGS_CA_STAT cs
2506                 WHERE   cs.s_cal_status IN (cst_active,cst_planned) AND
2507                         ci.CAL_STATUS   = cs.CAL_STATUS         AND
2508                         ct.S_CAL_CAT    = cst_teaching          AND
2509                         ct.CAL_TYPE     = ci.CAL_TYPE           AND
2510                         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
2511                                 p_acad_cal_type,
2512                                 p_acad_sequence_number,
2513                                 ci.CAL_TYPE,
2514                                 ci.sequence_number,
2515                                 'Y') = 'Y';  --'N';  ssawhney. this should never be N.
2516         CURSOR c_chk_aus (
2517                 cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE,
2518                 cp_sequence_number      IGS_CA_INST.sequence_number%TYPE ) IS
2519                 SELECT  DISTINCT ADMINISTRATIVE_UNIT_STATUS
2520                 FROM    IGS_CA_DA_INST_V daiv,
2521                         IGS_PS_UNIT_DISC_CRT uddc
2522                 WHERE   daiv.CAL_TYPE           = cp_cal_type                   AND
2523                         ci_sequence_number      = cp_sequence_number            AND
2524                         daiv.DT_ALIAS           = uddc.unit_discont_dt_alias    AND
2525                         uddc.delete_ind         = 'N';
2526         CURSOR c_chk_load_ci (
2527                 cp_cal_type             IGS_CA_INST.CAL_TYPE%TYPE ) IS
2528                 SELECT  ci.CAL_TYPE,
2529                         ci.sequence_number
2530                 FROM    IGS_ST_DFT_LOAD_APPO dla,
2531                         IGS_CA_INST ci
2532                 WHERE   teach_cal_type          = cp_cal_type                   AND
2533                         ci.CAL_TYPE             = dla.CAL_TYPE                  AND
2534                         ci.sequence_number      = dla.ci_sequence_number        AND
2535                         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
2536                                 p_acad_cal_type,
2540                                 'N') = 'Y';
2537                                 p_acad_sequence_number,
2538                                 ci.CAL_TYPE,
2539                                 ci.sequence_number,
2541         CURSOR c_chk_ausl (
2542                 cp_uddc_aus                     IGS_PS_UNIT_DISC_CRT.ADMINISTRATIVE_UNIT_STATUS%TYPE,
2543                 cp_load_ci_cal_type             IGS_CA_INST.CAL_TYPE%TYPE,
2544                 cp_load_ci_sequence_number      IGS_CA_INST.sequence_number%TYPE,
2545                 cp_teach_ci_cal_type            IGS_CA_INST.CAL_TYPE%TYPE ) IS
2546                 SELECT  'x'
2547                 FROM    dual
2548                 WHERE   EXISTS (
2549                         SELECT  *
2550                         FROM    IGS_AD_ADM_UT_STT_LD
2551                         WHERE   ADMINISTRATIVE_UNIT_STATUS      = cp_uddc_aus           AND
2552                                 CAL_TYPE                        = cp_load_ci_cal_type   AND
2553                                 ci_sequence_number              = cp_load_ci_sequence_number    AND
2554                                 teach_cal_type                  = cp_teach_ci_cal_type);
2555   BEGIN
2556         -- Select parameter calendar start date/end date into variables for later use.
2557         OPEN c_acad_dates (
2558                         p_acad_cal_type,
2559                         p_acad_sequence_number);
2560         FETCH c_acad_dates INTO v_p_acad_start_dt,
2561                                 v_p_acad_end_dt;
2562         IF c_acad_dates%NOTFOUND THEN
2563                 CLOSE c_acad_dates;
2564                 RETURN;
2565         END IF;
2566         CLOSE c_acad_dates;
2567         -- Check for teaching calendar instances which have superior calendars of a
2568         --  category other than ACADEMIC or FEE.
2569         --  Only consider calendars which are children of the academic calendar
2570         --  parameter  or which don't have any superior academic calendar.
2571         --  Bug 2384110, Progression Calendar is a mandatory superior calendar for the Teaching Calendar
2572         FOR v_chk_acad_fee_ci_rec IN c_chk_acad_fee_ci LOOP
2573                 IF v_chk_acad_fee_ci_rec.s_cal_cat NOT IN (cst_academic, cst_exam,
2574                                                  cst_assessment, cst_progress) THEN
2575 
2576                 --- added by syam
2577                           fnd_Message.set_name('IGS','IGS_CA_TEACHCAL_SUP_ACEXASCAL');
2578                           fnd_message.set_token('TOKEN1',v_chk_acad_fee_ci_rec.s_cal_cat);
2579                 --- added by syam
2580 
2581 
2582                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2583                                                 p_s_log_type,
2584                                                 p_log_creation_dt,
2585                                                 'TEACHING,' || v_chk_acad_fee_ci_rec.sub_cal_type || ',' ||
2586                                                 TO_CHAR(v_chk_acad_fee_ci_rec.sub_ci_sequence_number),
2587                                                 NULL,
2588                                                 fnd_message.get);
2589 
2590                 END IF;
2591 
2592         -- Check one per cal for SDAs.
2593          CHK_ONE_PER_CAL(v_chk_acad_fee_ci_rec.sub_cal_type,       -- will check for fee cal instance.
2594 	                 v_chk_acad_fee_ci_rec.sub_ci_sequence_number,
2595 			 'TEACHING',
2596 			 p_s_log_type,
2597 			 p_log_creation_dt);
2598 
2599         END LOOP;
2600         --- Loop through all teaching calendar instances related to the academic period
2601         FOR v_chk_teach_ci_rec IN c_chk_teach_ci LOOP
2602 
2603 		-- Check one per cal for SDAs.
2604 		 CHK_ONE_PER_CAL(v_chk_teach_ci_rec.CAL_TYPE,       -- will check for teach cal instance.
2605 				 v_chk_teach_ci_rec.sequence_number,
2606 				 'TEACHING',
2607 				 p_s_log_type,
2608 				 p_log_creation_dt);
2609 
2610 		-- Select teaching calendars which have subordinates of any type
2611                 FOR v_chk_tch_sub_rec IN c_chk_tch_sub(
2612                                                 v_chk_teach_ci_rec.CAL_TYPE,
2613                                                 v_chk_teach_ci_rec.sequence_number ) LOOP
2614                         v_chk_tch_sub_rec_found := TRUE;
2615                         v_chk_tch_sub_cal_type := v_chk_tch_sub_rec.sub_cal_type;
2616                         IF v_chk_tch_sub_rec.S_CAL_CAT <> cst_admission THEN
2617                                 v_sub_not_admission := TRUE;
2618                                 EXIT;
2619                         END IF;
2620                 END LOOP; -- c_chk_tch_sub
2621                 IF v_sub_not_admission = TRUE THEN
2622 
2623                 --- added by syam
2624                           fnd_Message.Set_Name('IGS','IGS_CA_TEACHCAL_SUB_ADMCAL');
2625                           fnd_message.set_token('TOKEN1',v_chk_tch_sub_cal_type);
2626                 --- added by syam
2627 
2628                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2629                                                 p_s_log_type,
2630                                                 p_log_creation_dt,
2631                                                 'TEACHING,' || v_chk_teach_ci_rec.CAL_TYPE || ',' ||
2632                                                 TO_CHAR(v_chk_teach_ci_rec.sequence_number),
2633                                                 NULL,
2634                                                 fnd_message.get);
2635 
2636                 END IF;
2637                 IF v_chk_tch_sub_rec_found = FALSE THEN
2638 
2639                         fnd_message.set_name('IGS','IGS_CA_TEACHCAL_HAVE_1_ADM');
2640 			fnd_message.set_token('CAL_TYPE',v_chk_tch_sub_cal_type);
2641 
2642                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2643                                 p_s_log_type,
2644                                 p_log_creation_dt,
2645                                 'TEACHING,' || v_chk_teach_ci_rec.CAL_TYPE || ',' ||
2646                                 TO_CHAR(v_chk_teach_ci_rec.sequence_number),
2647                                 NULL,
2648                                 fnd_message.get);
2649                 END IF;
2650                 v_total_percentage := 0;
2651                 --- Check that the calendar instance has at least 1 census date.
2652                 OPEN c_chk_census_dt(
2653                                 v_chk_teach_ci_rec.CAL_TYPE,
2654                                 v_chk_teach_ci_rec.sequence_number,
2655                                 v_p_acad_start_dt,
2656                                 v_p_acad_end_dt );
2657                 FETCH c_chk_census_dt INTO v_exists_flag;
2658                 IF c_chk_census_dt%NOTFOUND THEN
2659 
2660                 --- added by syam
2661                           fnd_Message.Set_Name('IGS','IGS_CA_TEACHCAL_1_CENSUSALIAS');
2662                 --- added by syam
2663 
2664 
2665                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2666                                                 p_s_log_type,
2667                                                 p_log_creation_dt,
2668                                                 'TEACHING,' || v_chk_teach_ci_rec.CAL_TYPE || ',' ||
2669                                                 TO_CHAR(v_chk_teach_ci_rec.sequence_number),
2670                                                 NULL,
2674                 CLOSE c_chk_census_dt;
2671                                                 fnd_message.get);
2672 
2673                 END IF;
2675                 --- Loop through all apportionments that the teaching period has to load
2676                 --- calendars and sum the percentages; they must equal 100.
2677                 IF v_chk_teach_ci_rec.s_cal_status = cst_active THEN -- Bug:2697221 check added to avoid
2678                                                                      -- calculating load apportionment for planned calendar
2679                   FOR v_chk_acad_pct_rec IN c_chk_acad_pct(
2680                                  v_chk_teach_ci_rec.CAL_TYPE,
2681                                  v_chk_teach_ci_rec.sequence_number ) LOOP
2682 
2683 		 CHK_ONE_PER_CAL(v_chk_acad_pct_rec.cal_type,       -- will check for apportionments that the teaching period has to "acad"
2684 				 v_chk_acad_pct_rec.sequence_number,
2685 				 'TEACHING',
2686 				 p_s_log_type,
2687 				 p_log_creation_dt);
2688 
2689                         FOR v_chk_dla_rec IN c_chk_dla(
2690                                         v_chk_teach_ci_rec.CAL_TYPE,
2691                                         v_chk_acad_pct_rec.CAL_TYPE,
2692                                         v_chk_acad_pct_rec.sequence_number) LOOP
2693                                 -- Total the percentages from all load calendars instances within academic
2694                                 --  years to which the teaching period is related.
2695                                 -- Select all of the load calendars within the academic year that match
2696                                 -- the default load apportionment record.
2697                                 IF IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
2698                                         v_chk_acad_pct_rec.CAL_TYPE,
2699                                         v_chk_acad_pct_rec.sequence_number,
2700                                         v_chk_dla_rec.CAL_TYPE,
2701                                         v_chk_dla_rec.ci_sequence_number,
2702                                         'N' ) = 'Y' THEN
2703                                         IF v_chk_dla_rec.second_percentage IS NOT NULL THEN
2704                                                         v_dummy := IGS_EN_GEN_002.ENRP_GET_ACAD_ALT_CD(
2705                                                                 v_chk_teach_ci_rec.CAL_TYPE,
2706                                                                 v_chk_teach_ci_rec.sequence_number,
2707                                                                 v_acad_cal_type,
2708                                                                 v_acad_sequence_number,
2709                                                                 v_acad_start_dt,
2710                                                                 v_acad_end_dt,
2711                                                                 v_message_name);
2712                                                 IF v_acad_cal_type <> v_chk_acad_pct_rec.CAL_TYPE OR
2713                                                         v_acad_sequence_number <> v_chk_acad_pct_rec.sequence_number THEN
2714                                                         v_total_percentage := v_total_percentage +
2715                                                                          v_chk_dla_rec.second_percentage;
2716                                                 ELSE
2717                                                         v_total_percentage := v_total_percentage + v_chk_dla_rec.percentage;
2718                                                 END IF;
2719                                         ELSE
2720                                                 v_total_percentage := v_total_percentage + v_chk_dla_rec.percentage;
2721                                         END IF;
2722                                 END IF; -- IGS_EN_GEN_014.ENRS_GET_WITHIN_CI
2723                         END LOOP; --- c_chk_dla
2724                   END LOOP; --- c_chk_acad_pct
2725                   IF v_total_percentage <> 100 THEN
2726 
2727                   --- added by syam
2728                           fnd_Message.Set_Name('IGS','IGS_CA_TOTLODAPPORTION_NOT_100');
2729                   --- added by syam
2730                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2731                                                 p_s_log_type,
2732                                                 p_log_creation_dt,
2733                                                 'TEACHING,' || v_chk_teach_ci_rec.CAL_TYPE || ',' ||
2734                                                 TO_CHAR(v_chk_teach_ci_rec.sequence_number),
2735                                                 NULL,
2736                                                 fnd_message.get);
2737 
2738                   END IF;
2739                 END IF; ---- Bug:2697221 end of check added to avoid calculating load apportionment for planned calendar
2740         END LOOP; -- c_chk_teach_ci
2741         -- Validate that the administrative IGS_PS_UNIT statuses are correctly linked to all
2742         -- appropriate load calendar instances.
2743         FOR v_chk_tch_ci_aus_rec IN c_chk_tch_ci_aus LOOP
2744 
2745 		--SIMRAN get all teaching period under the passed acad cal.
2746                 --- Select the administrative IGS_PS_UNIT statuses for all date aliases within the
2747                 --- teaching calendar which are discontinuation date criteria aliases.
2748                 FOR v_chk_aus_rec IN c_chk_aus(
2749                                                 v_chk_tch_ci_aus_rec.CAL_TYPE,
2750                                                 v_chk_tch_ci_aus_rec.sequence_number ) LOOP
2751                         --- Select all load calendars to which the teaching calendar is linked
2752                         --- within the parameter academic period.
2753                         --  SIMRAN Change this to use TEACH_TO_LOAD_V
2754 			FOR v_chk_load_ci_rec IN c_chk_load_ci(
2755                                                 v_chk_tch_ci_aus_rec.CAL_TYPE ) LOOP
2756                                 OPEN c_chk_ausl(
2757                                         v_chk_aus_rec.ADMINISTRATIVE_UNIT_STATUS,
2758                                         v_chk_load_ci_rec.CAL_TYPE,
2762                                 IF c_chk_ausl%NOTFOUND THEN
2759                                         v_chk_load_ci_rec.sequence_number,
2760                                         v_chk_tch_ci_aus_rec.CAL_TYPE );
2761                                 FETCH c_chk_ausl INTO v_exists_flag;
2763 
2764                                 --- added by syam
2765                                   fnd_Message.Set_Name('IGS','IGS_CA_ADMIN_STATUS_LNK_LODCAL');
2766                                   fnd_message.set_token('TOKEN1',v_chk_aus_rec.ADMINISTRATIVE_UNIT_STATUS);
2767                                 --- added by syam
2768 
2769 
2770                                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
2771                                                  p_s_log_type,
2772                                                  p_log_creation_dt,
2773                                                 'TEACHING,' || v_chk_tch_ci_aus_rec.CAL_TYPE || ',' ||
2774                                                  TO_CHAR(v_chk_tch_ci_aus_rec.sequence_number),
2775                                                  NULL,
2776                                                  fnd_message.get);
2777 
2778 
2779                                 END IF;
2780                                 CLOSE c_chk_ausl;
2781                         END LOOP; -- c_chk_load_ci
2782                 END LOOP; -- c_chk_aus
2783         END LOOP; -- c_chk_tch_ci_aus
2784   EXCEPTION
2785         WHEN OTHERS THEN
2786                 IF c_acad_dates%ISOPEN THEN
2787                         CLOSE c_acad_dates;
2788                 END IF;
2789                 IF c_chk_acad_fee_ci%ISOPEN THEN
2790                         CLOSE c_chk_acad_fee_ci;
2791                 END IF;
2792                 IF c_chk_teach_ci%ISOPEN THEN
2793                         CLOSE c_chk_teach_ci;
2794                 END IF;
2795                 IF c_chk_tch_sub%ISOPEN THEN
2796                         CLOSE c_chk_tch_sub;
2797                 END IF;
2798                 IF c_chk_census_dt%ISOPEN THEN
2799                         CLOSE c_chk_census_dt;
2800                 END IF;
2801                 IF c_chk_acad_pct%ISOPEN THEN
2802                         CLOSE c_chk_acad_pct;
2803                 END IF;
2804                 IF c_chk_dla%ISOPEN THEN
2805                         CLOSE c_chk_dla;
2806                 END IF;
2807                 IF c_chk_tch_ci_aus%ISOPEN THEN
2808                         CLOSE c_chk_tch_ci_aus;
2809                 END IF;
2810                 IF c_chk_aus%ISOPEN THEN
2811                         CLOSE c_chk_aus;
2812                 END IF;
2813                 IF c_chk_load_ci%ISOPEN THEN
2814                         CLOSE c_chk_load_ci;
2815                 END IF;
2816                 IF c_chk_ausl%ISOPEN THEN
2817                         CLOSE c_chk_ausl;
2818                 END IF;
2819                 App_Exception.Raise_Exception;
2820   END;
2821   EXCEPTION
2822         WHEN OTHERS THEN
2823                 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
2824                 FND_MESSAGE.SET_TOKEN('NAME','IGS_CA_VAL_QLITY.calp_val_teach_ci');
2825                 IGS_GE_MSG_STACK.ADD;
2826                 lv_param_values:= p_acad_cal_type||','||(to_char(p_acad_sequence_number))||','||p_s_log_type||','||(to_char(p_log_creation_dt));
2827                  Fnd_Message.Set_Name('IGS','IGS_GE_PARAMETERS');
2828                  FND_MESSAGE.SET_TOKEN('VALUE',lv_param_values);
2829                  IGS_GE_MSG_STACK.ADD;
2830                 App_Exception.Raise_Exception;
2831   END calp_val_teach_ci;
2832 
2833   PROCEDURE calp_val_award_ci( p_c_acad_cal_type        IN igs_ca_inst_all.cal_type%TYPE,
2834                                p_n_acad_sequence_number IN igs_ca_inst_all.sequence_number%TYPE,
2835                                p_c_s_log_type           IN VARCHAR2 ,
2836                                p_d_log_creation_dt      IN DATE
2837 		             ) IS
2838   ------------------------------------------------------------------
2839   --Created by  : Sanil Madathil, Oracle IDC
2840   --Date created: 17 Sep 2002
2841   --
2842   --Purpose: This procedure is private to this package body .
2843   --         The Award calendars selected should be ones that overlap with
2844   --         the Academic Calendar selected in the CM parameters.
2845   --
2846   --
2847   --Known limitations/enhancements and/or remarks:
2848   --
2849   --Change History:
2850   --Who         When            What
2851   -------------------------------------------------------------------
2852 
2853   CURSOR  c_ca_inst_acad   IS
2854   SELECT  ci.cal_type,
2855           ci.sequence_number,
2856 	  ci.start_dt,
2857 	  ci.end_dt
2858   FROM    igs_ca_inst     ci
2859   WHERE   ci.cal_type     = p_c_acad_cal_type
2860   AND     ci.sequence_number = p_n_acad_sequence_number;
2861 
2862   rec_c_ca_inst_acad c_ca_inst_acad%ROWTYPE;
2863 
2864   CURSOR  c_ca_inst_awd (p_d_start_dt igs_ca_inst.start_dt%TYPE,
2865                          p_d_end_dt   igs_ca_inst.end_dt%TYPE
2866 			) IS
2867   SELECT  ci.cal_type,
2868           ci.sequence_number
2869   FROM    igs_ca_inst     ci,
2870           igs_ca_stat     cs,
2871           igs_ca_type     cat
2872   WHERE   cat.s_cal_cat   = 'AWARD'
2873   AND     cs.s_cal_status IN ('ACTIVE','PLANNED')
2874   AND     ci.cal_type     = cat.cal_type
2875   AND     ci.cal_status   = cs.cal_status
2876   AND     (TRUNC(ci.start_dt) >= TRUNC(p_d_start_dt)  OR
2877            TRUNC(ci.end_dt) <= TRUNC(p_d_end_dt)) ;
2878 
2879   rec_c_ca_inst_awd c_ca_inst_awd%ROWTYPE;
2880 
2881   -- Cursor to Check that all Award periods have
2882   -- at least one direct subordinate Load calendar instance
2883 
2884   CURSOR  c_cir_8 ( cp_c_sup_cal_type        igs_ca_inst.cal_type%TYPE,
2885                     cp_n_sup_sequence_number igs_ca_inst.sequence_number%TYPE
2886                   ) IS
2887   SELECT  cir8.sub_cal_type,
2888           cir8.sub_ci_sequence_number
2889   FROM    igs_ca_inst_rel cir8,
2890           igs_ca_type cat
2891   WHERE   cir8.sup_cal_type               = cp_c_sup_cal_type
2892   AND     cir8.sup_ci_sequence_number     = cp_n_sup_sequence_number
2893   AND     cat.s_cal_cat                   = 'LOAD'
2894   AND     cir8.sub_cal_type               = cat.cal_type;
2895 
2896   rec_c_cir_8 c_cir_8%ROWTYPE;
2897 
2898 
2899   BEGIN
2900     FOR rec_c_ca_inst_acad IN c_ca_inst_acad
2901     LOOP
2902       FOR rec_c_ca_inst_awd IN c_ca_inst_awd (rec_c_ca_inst_acad.start_dt,
2903                                               rec_c_ca_inst_acad.end_dt
2904 					     )
2905       LOOP
2906 
2907               -- Check one per cal for SDAs.
2908          CHK_ONE_PER_CAL(rec_c_ca_inst_awd.cal_type,       -- will check for fee cal instance.
2909 	                 rec_c_ca_inst_awd.sequence_number,
2910 			 'LOAD',
2911 			 p_c_s_log_type,
2912 			 p_d_log_creation_dt);
2913 
2914         --Check that all award periods have at least one
2915         --subordinate Academic Term (Load) period
2916         OPEN c_cir_8 ( cp_c_sup_cal_type        => rec_c_ca_inst_awd.cal_type,
2917                        cp_n_sup_sequence_number => rec_c_ca_inst_awd.sequence_number
2918 	             );
2919 	FETCH c_cir_8 INTO rec_c_cir_8;
2920 	IF c_cir_8%NOTFOUND THEN
2921 	   FND_MESSAGE.SET_NAME('IGS','IGS_CA_AWDCAL_HAVE_1_LOAD');
2922            igs_ge_gen_003.genp_ins_log_entry( p_c_s_log_type,
2923                                               p_d_log_creation_dt,
2924                                               'LOAD,'|| rec_c_ca_inst_awd.cal_type ||',' ||rec_c_ca_inst_awd.sequence_number,
2925                                               NULL,
2926                                               fnd_message.get
2927 					     );
2928 	END IF;
2929 	CLOSE c_cir_8;
2930       END LOOP;
2931     END LOOP;
2932 
2933   END calp_val_award_ci;
2934 
2935 END IGS_CA_VAL_QLITY;