DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_CA_COMPUTE_DA_VAL_PKG

Source


1 PACKAGE BODY  IGS_CA_COMPUTE_DA_VAL_PKG
2 /* $Header: IGSCA15B.pls 120.1 2005/08/16 22:19:44 appldev noship $ */
3 /*****************************************************
4 ||  Created By :  Navin Sidana
5 ||  Created On : 10/13/2004
6 ||  Purpose : Package for computing date alias values.
7 ||  Known limitations, enhancements or remarks :
8 ||  Change History :
9 ||  Who             When            What
10 || nsidana          10/13/2004       Created
11 *****************************************************/
12 AS
13 
14 FUNCTION cal_da_elt_val(p_sys_date_type    IN VARCHAR2,
15 		        p_cal_type         IN VARCHAR2,
16 		        p_seq_number       IN NUMBER,
17 	  	        p_org_unit         IN VARCHAR2,
18 		        p_prog_type        IN VARCHAR2,
19 		        p_prog_ver         IN VARCHAR2,
20 			p_app_type         IN VARCHAR2
21 		       ) RETURN DATE
22 /*****************************************************
23 ||  Created By :  Navin Sidana
24 ||  Created On : 10/13/2004
25 ||  Purpose : Main proc to compute the date alias value.
26 ||  Known limitations, enhancements or remarks :
27 ||  Change History :
28 ||  Who             When            What
29 || nsidana          10/13/2004       Created
30 *****************************************************/
31 IS
32 
33   CURSOR get_site_da(cp_sys_date VARCHAR2)
34   IS
35   SELECT date_alias
36   FROM   IGS_CA_DA_CONFIGS
37   WHERE  sys_date_type = cp_sys_date;
38 
39   l_org_unit VARCHAR2(30) := NULL;
40   l_prg_type VARCHAR2(30) := NULL;
41   l_prd_cd   VARCHAR2(30) := NULL;
42   l_app_type VARCHAR2(30) := NULL;
43   l_dt_alias VARCHAR2(30) := NULL;
44   l_dt_val   DATE         := NULL;
45   l_found    BOOLEAN      := FALSE;
46   l_prog_label  VARCHAR2(100);
47   l_label  VARCHAR2(500);
48   l_debug_str VARCHAR2(4000);
49   l_seq_num NUMBER;
50 
51   FUNCTION chk_da_ovrd(p_sys_date_type IN VARCHAR2,
52                        p_elt_level     IN VARCHAR2,
53                        p_elt_code      IN VARCHAR2,
54 		       p_dt_alias      OUT NOCOPY VARCHAR2) RETURN BOOLEAN
55   /*****************************************************
56   ||  Created By :  Navin Sidana
57   ||  Created On : 10/13/2004
58   ||  Purpose : Local function to check if the DA has been
59   ||            overridden at a level.
60   ||  Known limitations, enhancements or remarks :
61   ||  Change History :
62   ||  Who             When            What
63   || nsidana          10/13/2004       Created
64   *****************************************************/
65   IS
66 
67     CURSOR cur_da_ovrd(cp_sys_date_type VARCHAR2,cp_elt_level VARCHAR2,cp_elt_code VARCHAR2)
68     IS
69     SELECT date_alias
70     FROM   IGS_CA_DA_OVD_VALS
71     WHERE  sys_date_type       = cp_sys_date_type AND
72            element_code        = cp_elt_level AND
73            element_code_value  = cp_elt_code;
74 
75     l_dt_alias VARCHAR2(30) := NULL;
76 
77   BEGIN
78 
79     OPEN cur_da_ovrd(p_sys_date_type,p_elt_level,p_elt_code);
80     FETCH cur_da_ovrd INTO l_dt_alias;
81     CLOSE cur_da_ovrd;
82 
83     IF (l_dt_alias IS NOT NULL)
84     THEN
85       p_dt_alias := l_dt_alias;
86       RETURN TRUE;
87     ELSE
88       p_dt_alias := null;
89       RETURN FALSE;
90     END IF;
91   END chk_da_ovrd;
92 
93   FUNCTION get_da_inst(p_dt_alias    IN VARCHAR2,
94                        p_cal_type    IN VARCHAR2,
95                        p_seq_num     IN NUMBER,
96 		       p_da_inst_val OUT NOCOPY DATE) RETURN BOOLEAN
97   /*****************************************************
98   ||  Created By :  Navin Sidana
99   ||  Created On : 10/13/2004
100   ||  Purpose : Local function to compute the DAI in a
101   ||            calendar instance.
102   ||  Known limitations, enhancements or remarks :
103   ||  Change History :
104   ||  Who             When            What
105   ||  nsidana         10/13/2004      Created
106   ||  skpandey        17-AUG-2005     Bug:4356272
107   ||                                  Added an additional level "APP_TYPE" to find the next available DA value
108   *****************************************************/
109   IS
110 
111     CURSOR count_dai_in_ci(cp_dt_alias VARCHAR2, cp_cal_type VARCHAR2, cp_seq_num NUMBER)
112     IS
113     SELECT count(*)
114     FROM   IGS_CA_DA_INST
115     WHERE  dt_alias           = cp_dt_alias AND
116            cal_type           = cp_cal_type AND
117            ci_sequence_number = cp_seq_num;
118 
119 
120     CURSOR get_da_inst_val(cp_dt_alias VARCHAR2, cp_cal_type VARCHAR2, cp_seq_num NUMBER)
121     IS
122     SELECT alias_val
123     FROM   IGS_CA_DA_INST_V
124     WHERE  dt_alias           = cp_dt_alias AND
125            cal_type           = cp_cal_type AND
126            ci_sequence_number = cp_seq_num;
127 
128      l_count              NUMBER;
129      l_da_inst_val        DATE;
130 
131   BEGIN
132      l_count              := 0;
133 
134     OPEN count_dai_in_ci(p_dt_alias,p_cal_type,p_seq_num);
135     FETCH count_dai_in_ci INTO l_count;
136     CLOSE count_dai_in_ci;
137 
138     IF (l_count > 1) OR (l_count = 0)
139     THEN
140       p_da_inst_val := NULL;
141       RETURN FALSE;    -- As multiple DAI exists in the CI and we are not sure which one to return back.
142     ELSE
143       -- One instance exists, return that.
144 
145       OPEN get_da_inst_val(p_dt_alias,p_cal_type,p_seq_num);
146       FETCH get_da_inst_val INTO l_da_inst_val;
147       CLOSE get_da_inst_val;
148 
149       IF (l_da_inst_val IS NOT NULL)
150       THEN
151         p_da_inst_val := l_da_inst_val;
152         RETURN TRUE;
153       ELSE
154         p_da_inst_val := NULL;
155         RETURN FALSE;
156       END IF;
157     END IF;
158   END get_da_inst; -- <End of local function.>
159 
160 BEGIN /* Main Procedure begins here */
161 
162   l_prog_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val';
163   l_label      := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.start';
164 
165   l_org_unit   := p_org_unit;
166   l_prg_type   := p_prog_type;
167   l_prd_cd     := p_prog_ver;
168   l_app_type   := p_app_type;
169 
170   IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
171     l_debug_str := 'Starting values : Sys Date Type ='||p_sys_date_type||'Cal Type =' || p_cal_type || 'Seq Num ='||p_seq_number ||
172                    'Org Unit ='|| l_org_unit||'Prog Type ='||l_prg_type || 'Prog Ver ='||l_prd_cd || 'App_Type = '|| l_app_type;
173     fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
174   END IF;
175 
176 
177 IF ((l_app_type IS NOT NULL) AND (NOT l_found))
178   THEN
179      l_dt_alias := NULL;
180 
181     IF chk_da_ovrd(p_sys_date_type,'APP_TYPE',l_app_type,l_dt_alias)
182     THEN
183       l_found := TRUE;
184       l_dt_val := NULL;
185 
186       IF  get_da_inst(l_dt_alias,p_cal_type,p_seq_number,l_dt_val)
187       THEN
188         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
189 	  l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_found_for_overd_DA_at_app_type_lvl';
190 	  l_debug_str := 'Computed DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
191 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
192 	END IF;
193 	RETURN l_dt_val;
194       ELSE
195         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
196 	  l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_not_found_for_overd_DA_at_prog_type_lvl';
197 	  l_debug_str := 'Tried computing DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
198 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
199 	END IF;
200         l_found   := FALSE;  -- Go up the heirarchy and try to find the next available DA value.
201       END IF;
202     END IF;
203   END IF;
204 
205 
206   IF ((l_prd_cd IS NOT NULL) AND (NOT l_found))
207   THEN
208      l_dt_alias := NULL;
209 
210     IF chk_da_ovrd(p_sys_date_type,'PRG_VER',l_prd_cd,l_dt_alias)
211     THEN
212       l_found   := TRUE;
213       l_dt_val  := NULL;
214 
215       IF get_da_inst(l_dt_alias,p_cal_type,p_seq_number,l_dt_val)
216       THEN
217         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
218 	  l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_found_for_overd_DA_at_prog_ver_lvl';
219 	  l_debug_str := 'Computed DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
220 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
221 	END IF;
222 	RETURN l_dt_val;
223       ELSE
224         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
225 	  l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_not_found_for_overd_DA_at_prog_ver_lvl';
226 	  l_debug_str := 'Tried computing DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
227 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
228 	END IF;
229         l_found   := FALSE;  -- Go up the heirarchy and try to find the next available DA value.
230       END IF;
231     END IF;
232   END IF;
233 
234   IF ((l_prg_type IS NOT NULL) AND (NOT l_found))
235   THEN
236      l_dt_alias := NULL;
237 
238     IF chk_da_ovrd(p_sys_date_type,'PRG_TYPE',l_prg_type,l_dt_alias)
239     THEN
240       l_found := TRUE;
241       l_dt_val := NULL;
242 
243       IF  get_da_inst(l_dt_alias,p_cal_type,p_seq_number,l_dt_val)
244       THEN
245         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
246 	  l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_found_for_overd_DA_at_prog_type_lvl';
247 	  l_debug_str := 'Computed DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
248 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
249 	END IF;
250 	RETURN l_dt_val;
251       ELSE
252         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
253 	  l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_not_found_for_overd_DA_at_prog_type_lvl';
254 	  l_debug_str := 'Tried computing DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
255 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
256 	END IF;
257         l_found   := FALSE;  -- Go up the heirarchy and try to find the next available DA value.
258       END IF;
259     END IF;
260   END IF;
261 
262   IF ((l_org_unit IS NOT NULL) AND (NOT l_found))
263   THEN
264      l_dt_alias := NULL;
265 
266     IF chk_da_ovrd(p_sys_date_type,'ORG_UNIT',l_org_unit,l_dt_alias)
267     THEN
268       l_found := TRUE;
269       l_dt_val := NULL;
270 
271       IF  get_da_inst(l_dt_alias,p_cal_type,p_seq_number,l_dt_val)
272       THEN
273         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
274 	  l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_found_for_overd_DA_at_org_unit_lvl';
275 	  l_debug_str := 'Computed DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
276 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
277 	END IF;
278 	RETURN l_dt_val;
279       ELSE
280         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
281 	  l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_not_found_for_overd_DA_at_org_unit_lvl';
282 	  l_debug_str := 'Tried computing DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
286       END IF;
283 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
284 	END IF;
285         l_found   := FALSE;  -- Go up the heirarchy and try to find the next available DA value.
287     END IF;
288   END IF;
289 
290   IF (NOT l_found)
291   THEN
292      -- Get the SITE level default DA for the SDA.
293     l_dt_alias := NULL;
294     OPEN get_site_da(p_sys_date_type);
295     FETCH get_site_da INTO l_dt_alias;
296     CLOSE get_site_da;
297 
298     IF (l_dt_alias IS NOT NULL)
299     THEN
300       l_dt_val := NULL;
301 
302       IF  get_da_inst(l_dt_alias,p_cal_type,p_seq_number,l_dt_val)
303       THEN
304         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
305 	  l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_found_for_default_DA_at_site_lvl';
306 	  l_debug_str := 'Computed DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
307 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
308 	END IF;
309  	RETURN l_dt_val;
310       ELSE
311         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
312 	  l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.DAI_not_found_for_default_DA_at_site_lvl';
313 	  l_debug_str := 'Tried computing DAI for values : Date Alias ='||l_dt_alias||' Cal Type ='||p_cal_type||' Seq Num ='||p_seq_number;
314 	  fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
315 	END IF;
316         RETURN NULL;   -- NO DAI could be found out. Return NULL;
317       END IF;
318     ELSE
319       IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
320         l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.No_default_DA_found_at_site_lvl';
321 	l_debug_str :=  null;
322 	fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
323       END IF;
324       RETURN NULL;
325     END IF;
326   END IF;
327 EXCEPTION
328 WHEN OTHERS THEN
329   IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
330     l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_val.exception_occured';
331     l_debug_str :=  sqlerrm;
332     fnd_log.string_with_context( fnd_log.level_exception,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
333   END IF;
334 END cal_da_elt_val;
335 
336 FUNCTION cal_da_elt_ofst_val(p_dt_alias     IN  VARCHAR2,
337 			     p_da_seq_num   IN NUMBER,
338 			     p_cal_type     IN  VARCHAR2,
339 			     p_seq_number   IN  NUMBER,
340 			     p_org_unit     IN VARCHAR2,
341 			     p_prog_type    IN VARCHAR2,
342 			     p_prog_ver     IN VARCHAR2,
343 			     p_app_type     IN VARCHAR2
344 			     ) RETURN DATE
345 /*****************************************************
346 ||  Created By :  Navin Sidana
347 ||  Created On : 10/13/2004
348 ||  Purpose : Main proc to compute the date alias value
349 ||            for FA module, considering offsets.
350 ||  Known limitations, enhancements or remarks :
351 ||  Change History :
352 ||  Who             When            What
353 || nsidana          10/15/2004       Created
354 *****************************************************/
355 IS
356 
357   CURSOR cp_get_ofst_dt(cp_dt_alias VARCHAR2,cp_da_seq_num NUMBER,cp_cal_type VARCHAR2,cp_seq_num NUMBER) IS
358   SELECT offset_dt_alias,offset_dai_sequence_number,offset_cal_type,offset_ci_sequence_number,ofst_override
359   FROM   IGS_CA_DA_INST_OFST
360   WHERE  dt_alias            = cp_dt_alias AND
361          dai_sequence_number = cp_da_seq_num AND
362          cal_type            = cp_cal_type AND
363          ci_sequence_number  = cp_seq_num;
364 
365   l_da_ofst_level_rec	t_ofst_rec;
366   l_dt_alias		VARCHAR2(30);
367   l_cal_type		VARCHAR2(30);
368   l_seq_num		NUMBER;
369   l_da_used		VARCHAR2(30);
370   l_err_msg		VARCHAR2(30);
371   l_dai_val		DATE := NULL;
372   l_da_seq_num		NUMBER;
373   l_msg			VARCHAR2(30);
374   l_final_val		DATE;
375   l_org_unit		VARCHAR2(30);
376   l_prog_type		VARCHAR2(30);
377   l_prog_ver		VARCHAR2(30);
378   l_app_type		VARCHAR2(30);
379   l_prog_label		VARCHAR2(100);
380   l_label		VARCHAR2(500);
381   l_debug_str		VARCHAR2(4000);
382   cp_get_ofst_dt_rec	cp_get_ofst_dt%ROWTYPE;
383 
384 FUNCTION chk_da_ofst_lvl(p_dt_alias VARCHAR2,
385 			 p_da_seq_num NUMBER,
386                          p_cal_type VARCHAR2,
387 			 p_seq_num  NUMBER) RETURN t_ofst_rec
388 /*****************************************************
389 ||  Created By :  Navin Sidana
390 ||  Created On : 10/13/2004
391 ||  Purpose : Checks the level at which the DA has an offset.
392 ||            Return values : 'DATE_ALIAS_INST' -- Date Alias Instance.
393 ||                            'DATE_ALIAS'      -- Date Alais.
394 ||                            NULL -- no offset defined.
395 ||
396 ||  Known limitations, enhancements or remarks :
397 ||  Change History :
398 ||  Who             When            What
399 || nsidana          10/15/2004       Created
400 *****************************************************/
401 IS
402 
403 -- Cursor to check if the DAI has an offset.
404 CURSOR chk_dai_ofst(cp_dt_alias VARCHAR2,cp_da_seq_num NUMBER,cp_cal_type VARCHAR2,cp_seq_num NUMBER)
405 IS
406 SELECT offset_dt_alias,offset_dai_sequence_number,offset_cal_type,offset_ci_sequence_number,day_offset,week_offset,month_offset,year_offset,ofst_override
407 FROM   IGS_CA_DA_INST_OFST
408 WHERE  dt_alias            = cp_dt_alias AND
409        dai_sequence_number = cp_da_seq_num AND
410        cal_type            = cp_cal_type AND
411        ci_sequence_number  = cp_seq_num;
412 
413 -- Cursor to check if the DA has an offset.
417 FROM   IGS_CA_DA_OFST
414 CURSOR chk_da_ofst(cp_dt_alias VARCHAR2)
415 IS
416 SELECT offset_dt_alias,day_offset,week_offset,month_offset,year_offset
418 WHERE  dt_alias = cp_dt_alias;
419 
420   chk_dai_ofst_rec     chk_dai_ofst%ROWTYPE := NULL;
421   chk_da_ofst_rec      chk_da_ofst%ROWTYPE  := NULL ;
422   l_da_ofst_level_rec  t_ofst_rec;
423 
424 BEGIN
425   OPEN chk_dai_ofst(p_dt_alias,p_da_seq_num,p_cal_type,p_seq_num);
426   FETCH chk_dai_ofst INTO chk_dai_ofst_rec;
427 
428   IF (chk_dai_ofst%FOUND)
429   THEN
430     -- Offset found at DAI level. Record the offset relationship.
431     l_da_ofst_level_rec.ofst_lvl                   := 'DATE_ALIAS_INST';
432     l_da_ofst_level_rec.dt_alias		   := chk_dai_ofst_rec.offset_dt_alias;
433     l_da_ofst_level_rec.da_seq_num		   := chk_dai_ofst_rec.offset_dai_sequence_number;
434     l_da_ofst_level_rec.offset_cal_type            := chk_dai_ofst_rec.offset_cal_type;
435     l_da_ofst_level_rec.offset_ci_sequence_number  := chk_dai_ofst_rec.offset_ci_sequence_number;
436     l_da_ofst_level_rec.day_offset		   := chk_dai_ofst_rec.day_offset;
437     l_da_ofst_level_rec.week_offset		   := chk_dai_ofst_rec.week_offset;
438     l_da_ofst_level_rec.month_offset		   := chk_dai_ofst_rec.month_offset;
439     l_da_ofst_level_rec.year_offset		   := chk_dai_ofst_rec.year_offset;
440     l_da_ofst_level_rec.ofst_override		   := chk_dai_ofst_rec.ofst_override;
441   ELSE
442     OPEN chk_da_ofst(p_dt_alias);
443     FETCH chk_da_ofst INTO chk_da_ofst_rec;
444 
445     IF (chk_da_ofst%FOUND)
446     THEN
447     -- Offset found at DA level. Record the offset relationship.
448       l_da_ofst_level_rec.ofst_lvl		     := 'DATE_ALIAS';
449       l_da_ofst_level_rec.dt_alias		     := chk_da_ofst_rec.offset_dt_alias;
450 --      l_da_ofst_level_rec.da_seq_num		     := chk_da_ofst_rec.offset_dai_sequence_number;
451     --  l_da_ofst_level_rec.offset_cal_type            := chk_da_ofst_rec.offset_cal_type;
452      -- l_da_ofst_level_rec.offset_ci_sequence_number  := chk_da_ofst_rec.offset_ci_sequence_number;
453       l_da_ofst_level_rec.day_offset		     := chk_da_ofst_rec.day_offset;
454       l_da_ofst_level_rec.week_offset		     := chk_da_ofst_rec.week_offset;
455       l_da_ofst_level_rec.month_offset		     := chk_da_ofst_rec.month_offset;
456       l_da_ofst_level_rec.year_offset		     := chk_da_ofst_rec.year_offset;
457       l_da_ofst_level_rec.ofst_override		     := null;
458     ELSE
459     -- No offset found at any level.
460       l_da_ofst_level_rec.ofst_lvl                   := null;
461       l_da_ofst_level_rec.dt_alias                   := null;
462       l_da_ofst_level_rec.da_seq_num		     := null;
463       l_da_ofst_level_rec.offset_cal_type            := null;
464       l_da_ofst_level_rec.offset_ci_sequence_number  := null;
465       l_da_ofst_level_rec.day_offset                 := null;
466       l_da_ofst_level_rec.week_offset                := null;
467       l_da_ofst_level_rec.month_offset               := null;
468       l_da_ofst_level_rec.year_offset                := null;
469       l_da_ofst_level_rec.ofst_override              := null;
470     END IF;
471   END IF;
472 
473     IF (chk_dai_ofst%ISOPEN) THEN
474       CLOSE chk_dai_ofst;
475     END IF;
476     IF (chk_da_ofst%ISOPEN) THEN
477 	CLOSE chk_da_ofst;
478     END IF;
479     RETURN l_da_ofst_level_rec;
480 END chk_da_ofst_lvl;
481 
482 FUNCTION chk_da_alias_used_sda(p_dt_alias IN VARCHAR2) RETURN VARCHAR2
483 /*****************************************************
484 ||  Created By :  Navin Sidana
485 ||  Created On : 10/13/2004
486 ||  Purpose : Checks if the DA has been used in a SDA setup.
487 ||            Return values : 'USED_MORE_THAN_ONE' -- DA used in more than one SDA.
488 ||                            'NOT_USED_AT_ALL'    -- DA not used in any SDA.
489 ||                            l_sys_dt_type        -- SDA for which the DA is used in setup.
490 ||
491 ||  Known limitations, enhancements or remarks :
492 ||  Change History :
493 ||  Who             When            What
494 || nsidana          10/15/2004       Created
495 *****************************************************/
496 AS
497   CURSOR get_sda(cp_dt_alias VARCHAR2)
498   IS
499   SELECT sys_date_type
500   FROM   IGS_CA_DA_CONFIGS
501   WHERE  date_alias = cp_dt_alias;
502 
503   CURSOR get_count(cp_dt_alias VARCHAR2)
504   IS
505   SELECT count(*)
506   FROM IGS_CA_DA_CONFIGS
507   WHERE  date_alias = cp_dt_alias;
508 
509   l_sys_dt_type VARCHAR2(30);
510   l_count       NUMBER;
511 
512 BEGIN
513   l_count := 0;
514   OPEN  get_count(p_dt_alias);
515   FETCH get_count INTO l_count;
516   CLOSE get_count;
517   IF (l_count = 1)
518   THEN
519     OPEN  get_sda(p_dt_alias);
520     FETCH get_sda INTO l_sys_dt_type;
521     CLOSE get_sda;
522     RETURN l_sys_dt_type;
523   ELSIF(l_count = 0)
524   THEN
525     RETURN 'NOT_USED_AT_ALL';
526   ELSE
527     RETURN 'USED_MORE_THAN_ONE';
528   END IF;
529 END chk_da_alias_used_sda;
530 
531 FUNCTION add_offset(p_dai_val           IN DATE,
532                     l_da_ofst_level_rec IN t_ofst_rec) RETURN DATE
533 /*****************************************************
534 ||  Created By :  Navin Sidana
535 ||  Created On : 10/13/2004
536 ||  Purpose : Function to add offsets to a DATE.
537 ||
538 ||  Known limitations, enhancements or remarks :
539 ||  Change History :
540 ||  Who             When            What
541 || nsidana          10/15/2004       Created
542 *****************************************************/
543 IS
544  l_ret_date DATE := NULL;
545 BEGIN
546    l_ret_date := p_dai_val;
547 
548   IF (NVL(l_da_ofst_level_rec.year_offset,0) <> 0)
549   THEN
553   IF (NVL(l_da_ofst_level_rec.month_offset,0) <> 0)
550   	l_ret_date := add_months(l_ret_date, (l_da_ofst_level_rec.year_offset * 12));
551   END IF;
552 
554   THEN
555 	l_ret_date := add_months(l_ret_date, l_da_ofst_level_rec.month_offset);
556   END IF;
557 
558   IF (NVL(l_da_ofst_level_rec.week_offset,0) <> 0)
559   THEN
560 	l_ret_date := l_ret_date + (l_da_ofst_level_rec.week_offset * 7);
561   END IF;
562 
563   IF (NVL(l_da_ofst_level_rec.day_offset,0) <> 0)
564   THEN
565 	l_ret_date := l_ret_date + l_da_ofst_level_rec.day_offset;
566   END IF;
567 
568   RETURN l_ret_date;
569 END;
570 
571 BEGIN /* Main */
572 
573   l_prog_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val';
574   l_label      := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.start';
575 
576   l_dt_alias    :=  p_dt_alias;
577   l_da_seq_num  :=  p_da_seq_num;
578   l_cal_type    :=  p_cal_type;
579   l_seq_num     :=  p_seq_number;
580   l_org_unit    :=  p_org_unit;
581   l_prog_type   :=  p_prog_type;
582   l_prog_ver    :=  p_prog_ver;
583   l_app_type    :=  p_app_type;
584   l_dai_val     :=  NULL;                -- To be returned by the function call.
585 
586   IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
587     l_debug_str := 'Starting values : Date Alias ='||l_dt_alias||' DAI seq num ='||l_da_seq_num||' Cal Type ='||l_cal_type||' Seq Num ='||l_seq_num||
588                    ' Org Unit ='||l_org_unit||' Prog Type ='||l_prog_type||' Prog Ver ='||l_prog_ver || ' App_Type = '|| l_app_type;
589     fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
590   END IF;
591 
592   l_da_ofst_level_rec := chk_da_ofst_lvl(l_dt_alias,l_da_seq_num,l_cal_type,l_seq_num);
593 
594   IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
595     l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.offset_level_info';
596     l_debug_str := 'Offset Level ='||l_da_ofst_level_rec.ofst_lvl    ||
597 		    'Offset DA =   '||l_da_ofst_level_rec.dt_alias||
598 		    'Offset DAI Seq num ='||l_da_ofst_level_rec.da_seq_num	||
599 		    'Offset DA Cal Type ='||l_da_ofst_level_rec.offset_cal_type ||
600 		    'Offset DA Seq Num ='||l_da_ofst_level_rec.offset_ci_sequence_number ||
601 		    'Day Offset ='||l_da_ofst_level_rec.day_offset	  ||
602 		    'Week Offset ='||l_da_ofst_level_rec.week_offset||
603 		    'Month Offset ='||l_da_ofst_level_rec.month_offset||
604 		    'Year Offset ='||l_da_ofst_level_rec.year_offset ||
605 		   'Offset override flag ='||l_da_ofst_level_rec.ofst_override;
606     fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
607   END IF;
608 
609   IF (l_da_ofst_level_rec.ofst_lvl IS NULL)
610   THEN
611      -- No offset defined at any level.
612     l_da_used     := chk_da_alias_used_sda(l_dt_alias);
613 
614     IF (l_da_used = 'NOT_USED_AT_ALL')
615     THEN
616  	-- Call old API directly and return the value of the DAI.
617 	l_dai_val := IGS_CA_GEN_001.calp_get_alias_val(l_dt_alias,l_da_seq_num,l_cal_type,l_seq_num);
618         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
619           l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.DA_not_used_in_SDA';
620           l_debug_str :=  'Computing DAI using values : Date Alias ='||l_dt_alias||' DAI Seq num ='||l_da_seq_num||' Cal Type ='||l_cal_type||' Seq num ='||l_seq_num;
621           fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
622         END IF;
623         RETURN l_dai_val;
624     ELSIF (l_da_used = 'USED_MORE_THAN_ONE')
625     THEN
626  	-- Call old API directly and return the value of the DAI.
627 	l_dai_val := IGS_CA_GEN_001.calp_get_alias_val(l_dt_alias,l_da_seq_num,l_cal_type,l_seq_num);
628 
629 	IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
630         l_label       := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.DA_used_in_more_than_one_SDA';
631           l_debug_str :=  'Computing DAI for original DAI : Date Alias ='||l_dt_alias||' DAI Seq num ='||l_da_seq_num||' Cal Type ='||l_cal_type||' Seq num ='||l_seq_num;
632         fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
633       END IF;
634 
635       RETURN l_dai_val;
636     ELSE
637       IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
638        l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.DA_used_in_single_SDA';
639        l_debug_str := 'Calling generic function with values : Sys Date Type ='||l_da_used||
640 	              'Cal Type ='||l_cal_type||' Seq Num ='||l_seq_num||' Org Unit ='||l_org_unit||' Prog Type ='||l_prog_type||' Prog Ver ='||l_prog_ver || ' App_Type = '|| l_app_type;
641        fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
642       END IF;
643       l_dai_val := cal_da_elt_val(l_da_used,l_cal_type,l_seq_num,l_org_unit,l_prog_type,l_prog_ver, l_app_type);
644       IF (l_dai_val IS NOT NULL)
645       THEN
646         RETURN l_dai_val;
647       ELSE
648         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
649           l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.No_value_returned_by_generic_function ';
650           fnd_log.string_with_context( fnd_log.level_statement,l_label,null, NULL,NULL,NULL,NULL,NULL,null);
651         END IF;
652         RETURN null;
653       END IF;
654     END IF;
655   ELSIF (l_da_ofst_level_rec.ofst_lvl = 'DATE_ALIAS') OR (l_da_ofst_level_rec.ofst_lvl = 'DATE_ALIAS_INST')
656   THEN
657      IF ((l_da_ofst_level_rec.ofst_lvl = 'DATE_ALIAS_INST')  AND (l_da_ofst_level_rec.ofst_override = 'N' ))
658     THEN
662        l_debug_str := 'Using : Ofst DA ='||l_da_ofst_level_rec.dt_alias||' Ofst DA seq num ='||l_da_ofst_level_rec.da_seq_num||
659       -- Override flag set to 'N', compute the DAI for the offset DA and add the offset and return the value.
660       IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
661        l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.ofst_ovrd_uncheck_computing_DAI_value_for_passed_DA';
663                       'Ofst Cal Type ='||l_da_ofst_level_rec.offset_cal_type||' Ofst CI seq num ='||l_da_ofst_level_rec.offset_ci_sequence_number;
664        fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
665       END IF;
666       l_dai_val   := IGS_CA_GEN_001.calp_get_alias_val(l_da_ofst_level_rec.dt_alias,l_da_ofst_level_rec.da_seq_num,l_da_ofst_level_rec.offset_cal_type,l_da_ofst_level_rec.offset_ci_sequence_number);
667       l_dai_val   := add_offset(l_dai_val,l_da_ofst_level_rec);
668 
669       -- Last step : resolve constraints if any, using IGS_CA_GEN_002.calp_clc_daio_cnstrt.
670 
671       l_msg := NULL;
672 
673       IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
674        l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.resolving_constraints';
675        l_debug_str := 'Resolving cnstrt on : Date Alias ='||l_dt_alias||'Date Alias seq num ='||l_da_seq_num||'Cal type ='||l_cal_type||'Seq num ='||l_seq_num||'DAI value ='||l_dai_val;
676        fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
677       END IF;
678 
679       l_final_val := IGS_CA_GEN_002.calp_clc_daio_cnstrt(l_dt_alias,
680 				                         l_da_seq_num,
681 							 l_cal_type,
682 						         l_seq_num,
683 						         l_dai_val,
684 						         l_msg);
685      IF (l_msg IS NOT NULL)
686      THEN
687        -- Could not resolve constrints, return the computed date value with the constraints unresolved.
688         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
689           l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.constraints_not_resolved_returning_unresolved';
690           l_debug_str :=  l_msg;
691           fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
692         END IF;
693        RETURN l_dai_val;
694      ELSE
695         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
696           l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.constraints_resolved_returning_value';
697           fnd_log.string_with_context( fnd_log.level_statement,l_label,null, NULL,NULL,NULL,NULL,NULL,null);
698         END IF;
699        RETURN l_final_val;
700      END IF;
701     END IF;
702 
703     -- Offset override is 'Y'. Go for the element level override logic.
704 
705     l_da_used := chk_da_alias_used_sda(l_da_ofst_level_rec.dt_alias);
706 
707     IF (l_da_used = 'NOT_USED_AT_ALL')
708     THEN
709       -- DA not used in any SDA, return the value for the initial DAI passsed.
710         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
711           l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.ovrd_DA_not_used_in_sda';
712           l_debug_str :=  'Computing DAI for initial values : Date Alias ='||l_dt_alias||'Seq num ='|| l_da_seq_num || ' Cal Type ='||l_cal_type || ' Seq num ='||l_seq_num;
713           fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
714         END IF;
715 
716       l_dai_val := IGS_CA_GEN_001.calp_get_alias_val(l_dt_alias,l_da_seq_num,l_cal_type,l_seq_num);
717       RETURN l_dai_val;
718     ELSIF (l_da_used = 'USED_MORE_THAN_ONE')
719     THEN
720        -- DA not used in any SDA, return the value for the initial DAI passsed.
721       IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
722         l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.ovrd_DA_used_in_more_than_one_SDA';
723         l_debug_str :=  'Returning DAI for original values : Date Alias ='||l_dt_alias||'Seq num ='|| l_da_seq_num || ' Cal Type ='||l_cal_type || ' Seq num ='||l_seq_num;
724         fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
725       END IF;
726       l_dai_val := IGS_CA_GEN_001.calp_get_alias_val(l_dt_alias,l_da_seq_num,l_cal_type,l_seq_num);
727       RETURN l_dai_val;
728     ELSE
729        -- Call generic to return the date value. If it returns add the offset and return.
730       IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
731         l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.ovrd_DA_used_in_single_SDA';
732         l_debug_str :=  'Calling generic function with values : Date Alias ='||l_da_used|| ' Cal Type ='||l_cal_type||' Seq num ='||l_seq_num|| ' Org Unit ='||l_org_unit||
733                         'Prog Type ='||l_prog_type||' Prog Ver ='||l_prog_ver||' App Type ='||l_app_type;
734         fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
735       END IF;
736 
737       l_dai_val  := cal_da_elt_val(l_da_used,l_cal_type,l_seq_num,l_org_unit,l_prog_type,l_prog_ver, l_app_type);
738 
739       IF (l_dai_val IS NULL)
740       THEN
741         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
742           l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.generic_function_returned_null';
743           l_debug_str :=  null;
744           fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
745         END IF;
746         RETURN null;
747       ELSE
748          l_dai_val := add_offset(l_dai_val,l_da_ofst_level_rec);
749  	 l_msg := NULL;
750 
751         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
752          l_label     := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.got_DAI_resolving_constraints';
753          l_debug_str := 'Resolving cnstrt on : Date Alias ='||l_dt_alias||'Date Alias seq num ='||l_da_seq_num||'Cal type ='||l_cal_type||'Seq num ='||l_seq_num||'DAI value ='||l_dai_val;
754          fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
755         END IF;
756         l_final_val := IGS_CA_GEN_002.calp_clc_daio_cnstrt(l_dt_alias,
757 				                            l_da_seq_num,
758 							    l_cal_type,
759 						            l_seq_num,
760 						            l_dai_val,
761 						            l_msg);
762         IF (l_msg IS NOT NULL)
763         THEN
764           -- Could not resolve constrints, return the computed date value with the constraints unresolved.
765         IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
766           l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.constraints_not_resolved_returning_unresolved';
767           l_debug_str :=  l_msg;
768           fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
769         END IF;
770            RETURN l_dai_val;
771         ELSE
772           IF fnd_log.test(fnd_log.level_statement,l_prog_label) THEN
773             l_label := 'igs.plsql.igs_ca_compute_da_val_pkg.cal_da_elt_ofst_val.constraints_resolved';
774             l_debug_str :=  null;
775             fnd_log.string_with_context( fnd_log.level_statement,l_label,l_debug_str, NULL,NULL,NULL,NULL,NULL,null);
776           END IF;
777           RETURN l_final_val;
778         END IF;
779       END IF;
780     END IF;
781   END IF;
782 END cal_da_elt_ofst_val;
783 END IGS_CA_COMPUTE_DA_VAL_PKG;