DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_CA_GEN_001

Source


1 PACKAGE BODY IGS_CA_GEN_001 AS
2  /* $Header: IGSCA01B.pls 115.3 2002/11/28 22:56:08 nsidana ship $ */
3 FUNCTION calp_get_alias_val(
4   p_dt_alias IN IGS_CA_DA_INST.DT_ALIAS%TYPE ,
5   p_sequence_num  IGS_CA_DA_INST.sequence_number%TYPE ,
6   p_cal_type IN IGS_CA_DA_INST.CAL_TYPE%TYPE ,
7   p_ci_sequence_num IN IGS_CA_DA_INST.ci_sequence_number%TYPE )
8 RETURN DATE AS
9 BEGIN
10 DECLARE
11 	-- this cursor finds the alias value for a date alias instance
12 	CURSOR c_dai ( 	cp_dt_alias  IGS_CA_DA_INST.DT_ALIAS%TYPE,
13 			cp_sequence_num  IGS_CA_DA_INST.sequence_number%TYPE,
14 			cp_cal_type  IGS_CA_DA_INST.CAL_TYPE%TYPE,
15 			cp_ci_sequence_num IGS_CA_DA_INST.ci_sequence_number%TYPE) IS
16 	SELECT	absolute_val
17 	FROM 	IGS_CA_DA_INST
18 	WHERE	DT_ALIAS = cp_dt_alias AND
19 		sequence_number = cp_sequence_num AND
20 		CAL_TYPE = cp_cal_type AND
21 		ci_sequence_number = cp_ci_sequence_num;
22 	v_alias_val 	IGS_CA_DA_INST.absolute_val%TYPE;
23 	v_message_name	 varchar2(30);
24 BEGIN
25 	IF p_dt_alias IS NULL OR
26 		p_sequence_num IS NULL OR
27 		p_cal_type IS NULL OR
28 		p_ci_sequence_num IS NULL THEN
29 		RETURN NULL;
30 	END IF;
31 	OPEN c_dai(	p_dt_alias,
32 			p_sequence_num,
33 			p_cal_type,
34 			p_ci_sequence_num);
35 	FETCH c_dai INTO v_alias_val;
36 	IF (c_dai%NOTFOUND) THEN
37 		CLOSE c_dai;
38 		RETURN NULL;
39 	END IF;
40 	CLOSE c_dai;
41 	IF (v_alias_val IS NULL) THEN
42             -- alias defined by an offset dt alias instance
43             v_alias_val := IGS_CA_GEN_002.calp_clc_dt_from_dai(p_ci_sequence_num,
44 	 							p_cal_type,
45 								p_dt_alias,
46 								p_sequence_num,
47 								v_message_name);
48 	END IF;
49 	RETURN v_alias_val;
50 END;
51 END calp_get_alias_val;
52 --
53 FUNCTION CALP_GET_ALT_CD(
54   p_cal_type IN VARCHAR2 ,
55   p_sequence_number IN NUMBER )
56 RETURN VARCHAR2 AS
57 BEGIN
58 DECLARE
59 	CURSOR c_ci (
60 		cp_cal_type		IGS_CA_INST.CAL_TYPE%TYPE,
61 		cp_sequence_number 	IGS_CA_INST.sequence_number%TYPE) IS
62 		SELECT	ci.alternate_code
63 		FROM	IGS_CA_INST	ci
64 		WHERE	ci.CAL_TYPE = cp_cal_type AND
65 			ci.sequence_number = cp_sequence_number;
66 	v_alternate_code	IGS_CA_INST.alternate_code%TYPE;
67 BEGIN
68 	-- Load the start/end date from the source calendar instance.
69 	OPEN	c_ci(
70 			p_cal_type,
71 			p_sequence_number);
72 	FETCH	c_ci	INTO	v_alternate_code;
73 	IF (c_ci%NOTFOUND)THEN
74 		CLOSE	c_ci;
75 		RETURN NULL;
76 	END IF;
77 	CLOSE	c_ci;
78 	RETURN v_alternate_code;
79 END;
80 END calp_get_alt_cd;
81 --
82 FUNCTION calp_get_cat_closed(
83   p_cal_type IN VARCHAR2 ,
84   p_message_name OUT NOCOPY VARCHAR2 )
85 RETURN boolean AS
86 v_closed_ind	IGS_CA_TYPE.closed_ind%TYPE;
87 CURSOR 	c_cal_type IS
88 SELECT 	closed_ind
89 FROM	IGS_CA_TYPE
90 WHERE	CAL_TYPE = p_cal_type;
91 v_other_detail	VARCHAR2(255);
92 BEGIN
93 	p_message_name := null;
94 	OPEN 	c_cal_type;
95 	LOOP
96 		FETCH 	c_cal_type
97 		INTO	v_closed_ind;
98 		EXIT WHEN c_cal_type%NOTFOUND;
99 		IF (v_closed_ind = 'Y') THEN
100 			CLOSE c_cal_type;
101 			p_message_name := 'IGS_CA_CALTYPE_CLOSED';
102 			RETURN TRUE;
103 		ELSIF (v_closed_ind = 'N') THEN
104 			CLOSE c_cal_type;
105 			RETURN FALSE;
106 		END IF;
107 	END LOOP;
108 	CLOSE c_cal_type;
109 END calp_get_cat_closed;
110 --
111 PROCEDURE CALP_GET_CI_DATES(
112   p_cal_type IN VARCHAR2 ,
113   p_ci_sequence_number IN NUMBER ,
114   p_start_dt OUT NOCOPY DATE ,
115   p_end_dt OUT NOCOPY DATE )
116 AS
117 BEGIN	--calp_get_ci_dates
118 	--Module returns the start/end dates as output parameters for a nominated
119 	--calendar instance. This routine is used in triggers which have surrogate
120 	--start/end dates which should be populated automatically.
121 DECLARE
122 	v_ci_start_dt	IGS_CA_INST.start_dt%TYPE;
123 	v_ci_end_dt	IGS_CA_INST.end_dt%TYPE;
124 	CURSOR c_ci IS
125 		SELECT	ci.start_dt,
126 			ci.end_dt
127 		FROM	IGS_CA_INST ci
128 		WHERE	CAL_TYPE	= p_cal_type	AND
129 			sequence_number	= p_ci_sequence_number;
130 BEGIN
131 	--Validate parameters
132 	IF (p_cal_type IS NOT NULL AND
133 			p_ci_sequence_number IS NOT NULL) THEN
134 		--If record exists then set output params acordingly
135 		OPEN c_ci ;
136 		FETCH c_ci  INTO v_ci_start_dt,
137 				 v_ci_end_dt;
138 			IF (c_ci%FOUND) THEN
139 				p_start_dt	:= v_ci_start_dt;
140 				p_end_dt	:= v_ci_end_dt;
141 			ELSE
142 				p_start_dt	:= NULL;
143 				p_end_dt	:= NULL;
144 			END IF;
145 		CLOSE c_ci;
146 	ELSE
147 		p_start_dt	:= NULL;
148 		p_end_dt	:= NULL;
149 	END IF;
150 	RETURN;
151 END;
152 EXCEPTION
153 	WHEN OTHERS THEN
154 		    Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
155 		    FND_MESSAGE.SET_TOKEN('NAME','IGS_CA_GEN_001.calp_get_ci_dates');
156                     IGS_GE_MSG_STACK.ADD;
157 		    App_Exception.Raise_Exception;
158 
159 END calp_get_ci_dates;
160 --
161 FUNCTION calp_get_ci_start_dt(
162   p_cal_type IN VARCHAR2 ,
163   p_sequence_number IN NUMBER )
164 RETURN DATE AS
165 BEGIN	-- calp_get_ci_start_dt
166 	-- Return the calendar instance start date.
167 DECLARE
168 	v_start_dt	IGS_CA_INST.start_dt%TYPE;
169 	CURSOR	c_ci IS
170 		SELECT	ci.start_dt
171 		FROM	IGS_CA_INST	ci
172 		WHERE	ci.CAL_TYPE 	= p_cal_type 	AND
173 			sequence_number = p_sequence_number;
174 BEGIN
175 	OPEN c_ci;
176 	FETCH c_ci INTO v_start_dt;
177 	IF (c_ci%FOUND) THEN
178 		CLOSE c_ci;
179 		RETURN v_start_dt;
180 	ELSE
181 		CLOSE c_ci;
182 		RETURN NULL;
183 	END IF;
184 EXCEPTION
185 	WHEN OTHERS THEN
186 		IF (c_ci%ISOPEN) THEN
187 			CLOSE c_ci;
188 		END IF;
189 		RAISE;
190 END;
191 
192 END calp_get_ci_start_dt;
193 --
194 FUNCTION CALP_GET_RLTV_TIME(
195   p_source_cal_type IN VARCHAR2 ,
196   p_source_ci_sequence_number IN NUMBER ,
197   p_related_cal_type IN VARCHAR2 ,
198   p_related_ci_sequence_number IN NUMBER )
199 RETURN VARCHAR2 AS
200 BEGIN
201 DECLARE
202 	cst_before		CONSTANT VARCHAR2(8) := 'BEFORE';
203 	cst_current		CONSTANT VARCHAR2(8) := 'CURRENT';
204 	cst_after		CONSTANT VARCHAR2(8) := 'AFTER';
205 	cst_null		CONSTANT VARCHAR2(4) := 'NULL';
206 	v_census_dt_alias	IGS_GE_S_GEN_CAL_CON.census_dt_alias%TYPE;
207 	v_start_dt		IGS_CA_INST.start_dt%TYPE;
208 	v_end_dt		IGS_CA_INST.end_dt%TYPE;
209 	v_alias_val		IGS_CA_DA_INST_V.alias_val%TYPE;
210 	v_within		BOOLEAN;
211 	v_before		BOOLEAN;
212 	v_after			BOOLEAN;
213 	CURSOR c_sgcc IS
214 		SELECT	sgcc.census_dt_alias
215 		FROM	IGS_GE_S_GEN_CAL_CON 	sgcc
216 		WHERE	sgcc.s_control_num = 1;
217 	CURSOR c_ci (
218 		cp_source_cal_type		IGS_CA_INST.CAL_TYPE%TYPE,
219 		cp_source_ci_sequence_number 	IGS_CA_INST.sequence_number%TYPE) IS
220 		SELECT	ci.start_dt,
221 			ci.end_dt
222 		FROM	IGS_CA_INST	ci
223 		WHERE	ci.CAL_TYPE = cp_source_cal_type AND
224 			ci.sequence_number = cp_source_ci_sequence_number;
225 	CURSOR c_daiv (
226 		cp_related_cal_type		IGS_CA_INST.CAL_TYPE%TYPE,
227 		cp_related_ci_sequence_number	IGS_CA_INST.sequence_number%TYPE,
228 		cp_census_dt_alias		IGS_GE_S_GEN_CAL_CON.census_dt_alias%TYPE) IS
229 		SELECT	daiv.alias_val
230 		FROM	IGS_CA_DA_INST_V	daiv
231 		WHERE	daiv.CAL_TYPE = cp_related_cal_type AND
232 			daiv.ci_sequence_number = cp_related_ci_sequence_number AND
233 			daiv.DT_ALIAS = cp_census_dt_alias;
234 BEGIN
235 	-- This module gets the relative time period of a calendar
236 	-- instance in relation to another.
237 	-- Returns one of:
238 	--	BEFORE	- The related period is totally before the source period.
239 	--	CURRENT	- The related period overlaps the source period.
240 	-- 	AFTER	- The related period is totally after the source period.
241 	--		OR
242 	--	null	- When the time could not be determined. This should
243 	-- 		not happen in normal operation, but must be coded due to
244 	--		the flexibility of the calendar facility.
245 	-- An overlap is determined by checking whether any of the 'census date'
246 	-- date alias instances within the related period is within or outside
247 	-- the start/end date range of the source period. The assumption is being
248 	-- made that all teaching period calendar instances have cencus dates.
249 	-- Load the census date alias from the general calendar configuration table.
250 	OPEN	c_sgcc;
251 	FETCH	c_sgcc	INTO	v_census_dt_alias;
252 	IF (c_sgcc%NOTFOUND) THEN
253 		CLOSE	c_sgcc;
254 		RAISE NO_DATA_FOUND;
255 	END IF;
256 	CLOSE	c_sgcc;
257 	-- Load the start/end date from the source calendar instance.
258 	OPEN	c_ci(
259 			p_source_cal_type,
260 			p_source_ci_sequence_number);
261 	FETCH	c_ci	INTO	v_start_dt,
262 				v_end_dt;
263 	IF (c_ci%NOTFOUND)THEN
264 		CLOSE	c_ci;
265 		RETURN cst_null;
266 	END IF;
267 	CLOSE	c_ci;
268 	-- Search for census date within the calendar instance.
269 	v_within := FALSE;
270 	v_before := FALSE;
271 	v_after := FALSE;
272 	OPEN	c_daiv(
273 			p_related_cal_type,
274 			p_related_ci_sequence_number,
275 			v_census_dt_alias);
276 	FETCH	c_daiv	INTO	v_alias_val;
277 	IF (c_daiv%NOTFOUND) THEN
278 		CLOSE	c_daiv;
279 		RETURN cst_null;
280 	END IF;
281 	CLOSE 	c_daiv;
282 	FOR	v_daiv_row	IN	c_daiv(
283 						p_related_cal_type,
284 						p_related_ci_sequence_number,
285 						v_census_dt_alias) LOOP
286 		IF (v_daiv_row.alias_val < v_start_dt) THEN
287 			v_before := TRUE;
288 		ELSIF (v_daiv_row.alias_val > v_end_dt) THEN
289 			v_after := TRUE;
290 		ELSE
291 			v_within := TRUE;
292 		END IF;
293 	END LOOP;
294 	IF (v_within = TRUE) OR
295 			((v_before = TRUE) AND
296 			(v_after = TRUE)) THEN
297 		RETURN cst_current;
298 	ELSIF (v_before = TRUE) THEN
299 		RETURN cst_before;
300 	ELSIF (v_after = TRUE) THEN
301 		RETURN cst_after;
302 	END IF;
303 END;
304 END calp_get_rltv_time;
305 --
306 FUNCTION calp_get_sup_inst(
307   p_sup_cal_type IN VARCHAR2 ,
308   p_sub_cal_type IN VARCHAR2 ,
309   p_sub_ci_sequence_number IN NUMBER )
310 RETURN NUMBER AS
311 BEGIN	-- calp_get_sup_inst
312 	-- Return the superior calendar instance for a given calendar type and
313 	-- subordinate calendar instance.
314 DECLARE
315 	v_sup_ci_sequence_number
316 			IGS_CA_INST_REL.sup_ci_sequence_number%TYPE	DEFAULT NULL;
317 	CURSOR	c_cir IS
318 		SELECT	sup_ci_sequence_number
319 		FROM	IGS_CA_INST_REL
320 		WHERE	sub_cal_type 		= p_sub_cal_type 		AND
321 			sub_ci_sequence_number	= p_sub_ci_sequence_number 	AND
322 			sup_cal_type = p_sup_cal_type;
323 BEGIN
324 	-- Get the superior calendar instance.
325 	OPEN c_cir;
326 	FETCH c_cir INTO v_sup_ci_sequence_number;
327 	CLOSE c_cir;
328 	RETURN v_sup_ci_sequence_number;
329 END;
330 END calp_get_sup_inst;
331 --
332 FUNCTION calp_set_alias_value(
333   p_absolute_val IN DATE ,
334   p_derived_val IN DATE )
335 RETURN DATE AS
336 BEGIN
337 	IF p_absolute_val IS NULL THEN
338 		RETURN(p_derived_val);
339 	ELSE
340 		RETURN(p_absolute_val);
341 	END IF;
342 END calp_set_alias_value;
343 --
344 FUNCTION calp_set_alt_code(
345   p_cal_type IN VARCHAR2 ,
346   p_alternate_code IN VARCHAR2 ,
347   p_message_name OUT NOCOPY varchar2 )
348 RETURN VARCHAR2 AS
349 	cst_teaching_period	CONSTANT VARCHAR2(15) := 'TEACHING';
350 	cst_academic_period	 CONSTANT VARCHAR2(15) := 'ACADEMIC';
351 	v_s_cal_cat		IGS_CA_TYPE.S_CAL_CAT%TYPE;
352 	v_cal_instance_rec	IGS_CA_INST%ROWTYPE;
353 	v_other_detail		VARCHAR2(255);
354 	CURSOR c_cal_type IS
355 		SELECT S_CAL_CAT
356 		FROM IGS_CA_TYPE
357 		WHERE	CAL_TYPE = p_cal_type;
358 BEGIN
359 	OPEN c_cal_type;
360 	LOOP
361 	FETCH c_cal_type
362 		INTO v_s_cal_cat;
363 		EXIT WHEN c_cal_type%NOTFOUND;
364 		IF (v_s_cal_cat = cst_teaching_period) THEN
365 			IF (p_alternate_code IS NULL) THEN
366 				p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
367 			ELSE
368 				p_message_name := null;
369 			END IF;
370 			CLOSE c_cal_type;
371 			RETURN p_alternate_code;
372 		ELSIF (v_s_cal_cat = cst_academic_period) THEN
373 			IF (p_alternate_code IS NULL) THEN
374 				p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
375 			ELSE
376 				p_message_name := null;
377 			END IF;
378 			CLOSE c_cal_type;
379 			RETURN p_alternate_code;
380 		ELSE
381 			IF (p_alternate_code IS NULL) THEN
382 				p_message_name := null;
383 			ELSE
384 				p_message_name := 'IGS_CA_ENRALTCD_NOT_EXIST';
385 			END IF;
386 			CLOSE c_cal_type;
387 			RETURN NULL;
388 		END IF;
389 	END LOOP;
390 	CLOSE c_cal_type;
391 	RETURN NULL;
392 END calp_set_alt_code;
393 --
394 END IGS_CA_GEN_001;