DBA Data[Home] [Help]

PACKAGE BODY: APPS.BSC_PERIODS_UTILITY_PKG

Source


1 PACKAGE BODY BSC_PERIODS_UTILITY_PKG AS
2 /* $Header: BSCUPERB.pls 120.11 2006/06/27 08:43:13 adrao noship $ */
3 /*
4 REM +=======================================================================+
5 REM |    Copyright (c) 2002 Oracle Corporation, Redwood Shores, CA, USA     |
6 REM |                         All rights reserved.                          |
7 REM +=======================================================================+
8 REM | FILENAME                                                              |
9 REM |     BSCUPERB.pls                                                      |
10 REM |                                                                       |
11 REM | DESCRIPTION                                                           |
12 REM |     Module: Utility file for Calendar and Periodicities and TIME      |
13 REM |             integration modules  (designer)                           |
14 REM | NOTES                                                                 |
15 REM | 14-JUL-2005 Aditya Rao  Created.                                      |
16 REM | 25-AUG-2005 Aditya Rao  added API Get_Non_Rolling_Dim_Obj Bug#4566634 |
17 REM | 29-AUG-2005 Aditya Rao  Changed API Get_Cust_Per_Cnt_By_Calendar for  |
18 REM |                         Bug#4576424                                   |
19 REM | 29-AUG-2005 Aditya Rao  Added API Get_Periodicity_Name for Bug#4574115|
20 REM | 28-SEP-2005 akoduri     Bug#4626935 Get_Daily_Periodicity_Sht_Name API|
21 REM |                         is added                                      |
22 REM | 29-NOV-2005 kyadamak    Added APIs for Enhancement#4711274            |
23 REM | 16-FEB-2006 Aditya Rao  added ABS() to DBMS_UTILITY.GET_TIME for      |
24 REM |                         Bug#5039894                                   |
25 REM | 22-JUN-2006 Aditya Rao  Added API Get_Quarter_Date_Label as requested |
26 REM |                         by PMV Bug#4767731                            |
27 REM +=======================================================================+
28 */
29 
30 G_PKG_NAME CONSTANT VARCHAR2(30):='BSC_PERIODS_UTILITY_PKG';
31 
32 -- Checks if the Periodicity Name is unique to the calendar or not.
33 FUNCTION get_Next_Alias
34 (
35   p_Alias        IN   VARCHAR2
36 ) RETURN VARCHAR2
37 IS
38   l_alias     VARCHAR2(4);
39   l_return    VARCHAR2(4);
40   l_count     NUMBER;
41 BEGIN
42   IF (p_Alias IS NULL) THEN
43     l_return :=  'A';
44   ELSE
45     l_count := LENGTH(p_Alias);
46     IF (l_count = 1) THEN
47       l_return   := 'A0';
48     ELSIF (l_count > 1) THEN
49       l_alias     :=  SUBSTR(p_Alias, 2);
50       l_count     :=  TO_NUMBER(l_alias)+1;
51       l_return    :=  SUBSTR(p_Alias, 1, 1)||TO_CHAR(l_count);
52     END IF;
53   END IF;
54   RETURN l_return;
55 END get_Next_Alias;
56 
57 FUNCTION Is_Period_Name_Unique (
58       p_Calendar_Id      IN NUMBER
59     , p_Periodicity_Name IN VARCHAR2
60 ) RETURN VARCHAR2 IS
61     l_Count NUMBER;
62 BEGIN
63     l_Count := 0;
64 
65     SELECT COUNT(1) INTO l_Count
66     FROM   BSC_SYS_PERIODICITIES_VL P
67     WHERE  P.CALENDAR_ID = p_Calendar_Id
68     AND    UPPER(P.NAME) = UPPER(p_Periodicity_Name);
69 
70 
71     IF (l_Count <> 0) THEN
72         RETURN FND_API.G_FALSE;
73     END IF;
74 
75     RETURN FND_API.G_TRUE;
76 
77 EXCEPTION
78     WHEN OTHERS THEN
79         RETURN FND_API.G_FALSE;
80 END Is_Period_Name_Unique;
81 
82 -- Gets the Calendar Name from the CALENDAR_ID
83 FUNCTION Get_Calendar_Name (
84     p_Calendar_Id IN NUMBER
85 ) RETURN VARCHAR2 IS
86     l_Calendar_Name  BSC_SYS_CALENDARS_TL.NAME%TYPE;
87 BEGIN
88 
89     SELECT C.NAME
90     INTO   l_Calendar_Name
91     FROM   BSC_SYS_CALENDARS_VL C
92     WHERE  C.CALENDAR_ID = p_Calendar_Id;
93 
94     RETURN l_Calendar_Name;
95 
96 EXCEPTION
97     WHEN OTHERS THEN
98         RETURN NULL;
99 END Get_Calendar_Name;
100 
101 -- Returns the calendar short_name.
102 FUNCTION Get_Calendar_Short_Name (
103     p_Calendar_Id IN NUMBER
104 ) RETURN VARCHAR2
105 IS
106     l_Calendar_Short_Name  BSC_SYS_CALENDARS_B.SHORT_NAME%TYPE;
107 BEGIN
108 
109     SELECT C.SHORT_NAME
110     INTO   l_Calendar_Short_Name
111     FROM   BSC_SYS_CALENDARS_B C
112     WHERE  C.CALENDAR_ID = p_Calendar_Id;
113 
114     RETURN l_Calendar_Short_Name;
115 
116 EXCEPTION
117     WHEN OTHERS THEN
118         RETURN NULL;
119 END Get_Calendar_Short_Name;
120 
121 
122 -- Get the number of custom periodicities by Calendar.
123 -- Changed condition for Bug#4576424
124 FUNCTION Get_Cust_Per_Cnt_By_Calendar (
125     p_Calendar_Id IN NUMBER
126 ) RETURN VARCHAR2 IS
127     l_Count NUMBER;
128 BEGIN
129     SELECT COUNT(1)
130     INTO   l_Count
131     FROM   BSC_SYS_PERIODICITIES P
132     WHERE  P.CALENDAR_ID = p_Calendar_Id
133     AND    P.CUSTOM_CODE <> BSC_PERIODS_UTILITY_PKG.C_BASE_PERIODICITY_TYPE;
134 
135     RETURN  l_Count;
136 EXCEPTION
137     WHEN OTHERS THEN
138         RETURN BSC_PERIODS_UTILITY_PKG.C_NON_CUSTOM_PERIODICITY_CODE;
139 END Get_Cust_Per_Cnt_By_Calendar;
140 
141 -- Returns the next custom DB Column name
142 FUNCTION Get_Next_Cust_Period_DB_Column (
143     p_Calendar_Id IN NUMBER
144 ) RETURN VARCHAR2 IS
145     l_Max_Custom_Id    NUMBER;
146     l_Custom_DB_Column BSC_SYS_PERIODICITIES.DB_COLUMN_NAME%TYPE;
147 BEGIN
148     SELECT NVL(MAX(TO_NUMBER(SUBSTR(P.DB_COLUMN_NAME, LENGTH(C_CUSTOM_DB_COL_PREFIX)+1))), 0)
149     INTO   l_Max_Custom_Id
150     FROM   BSC_SYS_PERIODICITIES P
151     WHERE  P.CUSTOM_CODE > 0
152     AND    P.CALENDAR_ID = P_CALENDAR_ID;
153 
154     l_Custom_DB_Column := C_CUSTOM_DB_COL_PREFIX || (l_Max_Custom_Id+1);
155 
156     RETURN l_Custom_DB_Column;
157 
158 EXCEPTION
159     WHEN OTHERS THEN
160         RETURN NULL;
161 END Get_Next_Cust_Period_DB_Column;
162 
163 
164 -- Gets the next PERIODICITY_ID from sequence BSC_SYS_PERIODICITY_ID_S
165 FUNCTION Get_Next_Periodicity_Id
166 RETURN NUMBER IS
167     l_Next_Number NUMBER;
168 BEGIN
169 
170     SELECT BSC_SYS_PERIODICITY_ID_S.NEXTVAL
171     INTO   l_Next_Number
172     FROM   DUAL;
173 
174     RETURN l_Next_Number;
175 EXCEPTION
176     WHEN OTHERS THEN
177         SELECT NVL(MAX(P.PERIODICITY_ID)+1, 0)
178         INTO   l_Next_Number
179         FROM   BSC_SYS_PERIODICITIES P;
180 
181         RETURN l_Next_Number;
182 END Get_Next_Periodicity_Id;
183 
184 FUNCTION Get_Next_Calendar_Id
185 RETURN NUMBER IS
186     l_Next_Number NUMBER;
187 BEGIN
188 
189     SELECT BSC_SYS_CALENDAR_ID_S.NEXTVAL
190     INTO   l_Next_Number
191     FROM   DUAL;
192 
193     RETURN l_Next_Number;
194 EXCEPTION
195     WHEN OTHERS THEN
196         SELECT NVL(MAX(P.calendar_id)+1, 0)
197         INTO   l_Next_Number
198         FROM   bsc_sys_calendars_b P;
199 
200         RETURN l_Next_Number;
201 END Get_Next_Calendar_Id;
202 
203 
204 --Checks if a given periodicity belongs to a calendar.
205 FUNCTION Is_Periodicity_In_Calendar (
206             p_Calendar_Id    IN NUMBER
207           , p_Periodicity_Id IN NUMBER
208 ) RETURN VARCHAR2
209 IS
210     l_Count NUMBER;
211 BEGIN
212     SELECT COUNT(1)
213     INTO   l_Count
214     FROM   BSC_SYS_PERIODICITIES B
215     WHERE  B.PERIODICITY_ID = p_Periodicity_Id
216     AND    B.CALENDAR_ID    = p_Calendar_Id;
217 
218     IF (l_Count = 1) THEN
219         RETURN FND_API.G_TRUE;
220     END IF;
221 
222     RETURN FND_API.G_FALSE;
223 
224 EXCEPTION
225     WHEN OTHERS THEN
226         RETURN FND_API.G_FALSE;
227 END Is_Periodicity_In_Calendar;
228 
229 
230 FUNCTION Get_Periodicity_Source (
231     p_Periodicity_Id IN NUMBER
232 ) RETURN VARCHAR2
233 IS
234     l_Source_Column BSC_SYS_PERIODICITIES.SOURCE%TYPE;
235 BEGIN
236     SELECT B.SOURCE
237     INTO   l_Source_Column
238     FROM   BSC_SYS_PERIODICITIES B
239     WHERE  B.PERIODICITY_ID = p_Periodicity_Id;
240 
241     RETURN l_Source_Column;
242 
243 EXCEPTION
244     WHEN OTHERS THEN
245         RETURN NULL;
246 END Get_Periodicity_Source;
247 
248 
249 -- Get unique periodicity short_name
250 FUNCTION Get_Unique_Short_Name RETURN VARCHAR2
251 IS
252     l_Return_Short_Name VARCHAR2(30);
253 BEGIN
254     RETURN C_PERIOD_SHORT_NAME_PREFIX||TO_CHAR(SYSDATE,'J')||ABS(DBMS_UTILITY.GET_TIME);
255 EXCEPTION
256     WHEN OTHERS THEN
257         RETURN NULL;
258 END Get_Unique_Short_Name;
259 
260 
261 PROCEDURE Print_Period_Metadata (
262       p_Debug_Flag VARCHAR2
263     , p_Periodicities_Rec_Type IN BSC_PERIODICITIES_PUB.Periodicities_Rec_Type
264 ) IS
265 BEGIN
266     NULL;
267 /*
268     DBMS_OUTPUT.PUT_LINE('p_Debug_Flag - ' || p_Debug_Flag);
269     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Periodicity_Id           ' ||   p_Periodicities_Rec_Type.Periodicity_Id     );
270     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Num_Of_Periods           ' ||   p_Periodicities_Rec_Type.Num_Of_Periods     );
271     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Source                   ' ||   p_Periodicities_Rec_Type.Source             );
272     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Base_Periodicity_Id      ' ||   p_Periodicities_Rec_Type.Base_Periodicity_Id);
273     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Num_Of_Subperiods        ' ||   p_Periodicities_Rec_Type.Num_Of_Subperiods  );
274     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Period_Col_Name          ' ||   p_Periodicities_Rec_Type.Period_Col_Name    );
275     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Subperiod_Col_Name       ' ||   p_Periodicities_Rec_Type.Subperiod_Col_Name );
276     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Yearly_Flag              ' ||   p_Periodicities_Rec_Type.Yearly_Flag        );
277     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Edw_Flag                 ' ||   p_Periodicities_Rec_Type.Edw_Flag           );
278     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Calendar_Id              ' ||   p_Periodicities_Rec_Type.Calendar_Id        );
279     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Edw_Periodicity_Id       ' ||   p_Periodicities_Rec_Type.Edw_Periodicity_Id );
280     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Custom_Code              ' ||   p_Periodicities_Rec_Type.Custom_Code        );
281     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Db_Column_Name           ' ||   p_Periodicities_Rec_Type.Db_Column_Name     );
282     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Periodicity_Type         ' ||   p_Periodicities_Rec_Type.Periodicity_Type   );
283     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Period_Type_Id           ' ||   p_Periodicities_Rec_Type.Period_Type_Id     );
284     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Record_Type_Id           ' ||   p_Periodicities_Rec_Type.Record_Type_Id     );
285     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Xtd_Pattern              ' ||   p_Periodicities_Rec_Type.Xtd_Pattern        );
286     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Short_Name               ' ||   p_Periodicities_Rec_Type.Short_Name         );
287     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Name                     ' ||   p_Periodicities_Rec_Type.Name               );
288     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Created_By               ' ||   p_Periodicities_Rec_Type.Created_By         );
289     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Creation_Date            ' ||   p_Periodicities_Rec_Type.Creation_Date      );
290     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Last_Updated_By          ' ||   p_Periodicities_Rec_Type.Last_Updated_By    );
291     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Last_Update_Date         ' ||   p_Periodicities_Rec_Type.Last_Update_Date   );
292     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Last_Update_Login        ' ||   p_Periodicities_Rec_Type.Last_Update_Login  );
293     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Application_id           ' ||   p_Periodicities_Rec_Type.Application_id     );
294     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Period_Year              ' ||   p_Periodicities_Rec_Type.Period_Year        );
295     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Start_Period             ' ||   p_Periodicities_Rec_Type.Start_Period       );
296     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.End_Period               ' ||   p_Periodicities_Rec_Type.End_Period         );
297     DBMS_OUTPUT.PUT_LINE('p_Periodicities_Rec_Type.Period_IDs               ' ||   p_Periodicities_Rec_Type.Period_IDs         );
298 */
299 END Print_Period_Metadata;
300 
301 
302 FUNCTION Check_Error_Message(p_Error_Message IN VARCHAR2)
303 RETURN BOOLEAN IS
304 l_error_message   bsc_message_logs.message%TYPE;
305 l_Is_Error        BOOLEAN;
306 
307 CURSOR C_ERROR(l_source VARCHAR2) IS
308   SELECT message
309   INTO   l_error_message
310   FROM   bsc_message_logs
311   WHERE  type = 0
312   AND    UPPER(SOURCE) = UPPER(l_source)
313   AND    LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID;
314 
315 BEGIN
316   l_Is_Error := FALSE;
317   IF(C_ERROR%ISOPEN) THEN
318     CLOSE C_ERROR;
319   END IF;
320 
321   OPEN C_ERROR(p_Error_Message);
322   FETCH C_ERROR INTO l_error_message;
323   CLOSE C_ERROR;
324 
325   IF(LENGTH(l_error_message) > 0 ) THEN
326     l_Is_Error := TRUE;
327   END IF;
328 
329   RETURN l_Is_Error;
330 
331 END Check_Error_Message;
332 
333 FUNCTION Get_FiscalYear_By_Calendar(p_Calendar_Id NUMBER)
334 RETURN NUMBER IS
335 l_Fiscal_Year BSC_SYS_CALENDARS_B.FISCAL_YEAR%TYPE;
336 BEGIN
337   SELECT FISCAL_YEAR
338   INTO   l_Fiscal_Year
339   FROM   BSC_SYS_CALENDARS_B
340   WHERE  CALENDAR_ID = p_Calendar_Id;
341 
342   RETURN l_Fiscal_Year;
343 
344 END Get_FiscalYear_By_Calendar;
345 
346 -- added exception for Bug#4626530
347 FUNCTION Is_Base_Periodicity_Daily(p_Base_Periodicity_Id NUMBER)
348 RETURN BOOLEAN IS
349 l_Is_Daily          BOOLEAN := FALSE;
350 l_Periodicity_Id    NUMBER;
351 BEGIN
352   SELECT periodicity_type
353   INTO   l_Periodicity_Id
354   FROM   bsc_sys_periodicities
355   WHERE  periodicity_id = p_Base_Periodicity_Id;
356 
357   IF(l_Periodicity_Id = 9) THEN
358     l_Is_Daily := TRUE;
359   END IF;
360 
361   RETURN l_Is_Daily;
362 EXCEPTION
363     WHEN OTHERS THEN
364         RETURN FALSE;
365 END Is_Base_Periodicity_Daily;
366 
367 FUNCTION Get_Periodicity_Short_Name (
368             p_Periodicity_Id IN NUMBER
369 ) RETURN VARCHAR2 IS
370     l_Short_Name  BSC_SYS_PERIODICITIES.SHORT_NAME%TYPE;
371 BEGIN
372     SELECT P.SHORT_NAME INTO l_Short_Name
373     FROM   BSC_SYS_PERIODICITIES P
374     WHERE  P.PERIODICITY_ID = p_Periodicity_Id;
375 
376     RETURN l_Short_Name;
377 
378 EXCEPTION
379 WHEN OTHERS THEN
380     RETURN NULL;
381 END Get_Periodicity_Short_Name;
382 
383 -- added exception for Bug#4626530
384 FUNCTION Get_Periods_In_Base_Period (
385     p_Base_Periodicity_Id IN NUMBER
386 ) RETURN NUMBER
387 IS
388     l_no_Periods  NUMBER;
389 BEGIN
390     SELECT NUM_OF_PERIODS
391     INTO   l_No_Periods
392     FROM   BSC_SYS_PERIODICITIES
393     WHERE  PERIODICITY_ID = p_Base_Periodicity_Id;
394 
395     RETURN l_No_Periods;
396 EXCEPTION
397     WHEN OTHERS THEN
398         RETURN 0;
399 END Get_Periods_In_Base_Period;
400 
401 
402 PROCEDURE Rollback_API (
403   p_In_String               IN          VARCHAR2
404  ,p_ErrorOut                IN          VARCHAR2
405  ,x_Return_Status           OUT NOCOPY  VARCHAR2
406  ,x_Msg_Count               OUT NOCOPY  NUMBER
407  ,x_Msg_Data                OUT NOCOPY  VARCHAR2
408 ) IS
409 BEGIN
410     SAVEPOINT RollbackAPIPUB;
411 
412     FND_MSG_PUB.Initialize;
413     x_Return_Status := FND_API.G_RET_STS_SUCCESS;
414 
415     IF (p_ErrorOut = FND_API.G_TRUE) THEN
416         FND_MESSAGE.SET_NAME('BSC','BSC_ERROR_MESSAGE');
417         FND_MSG_PUB.ADD;
418         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
419     END IF;
420 
421 EXCEPTION
422     WHEN OTHERS THEN
423         ROLLBACK TO RollbackAPIPUB;
424         IF (x_msg_data IS NULL) THEN
425             FND_MSG_PUB.Count_And_Get
426             (      p_encoded   =>  FND_API.G_FALSE
427                ,   p_count     =>  x_msg_count
428                ,   p_data      =>  x_msg_data
429             );
430         END IF;
431         x_Return_Status := FND_API.G_RET_STS_UNEXP_ERROR;
432 END Rollback_API;
433 
434 -- Added APIs to get View START_DATE and END_DATE
435 -- A typical usage example is
436 -- BSC_PERIODS_UTILITY_PKG.Get_Start_Period_Date (424, 1569, 2, 2005);
437 
438 FUNCTION Get_Start_Period_Date (
439     p_Calendar_Id    IN NUMBER
440   , p_Periodicity_Id IN NUMBER
441   , p_Period_id      IN NUMBER
442   , p_Year           IN NUMBER
443 ) RETURN DATE IS
444     l_Sql           VARCHAR2(1000);
445     l_Period_DB_Col BSC_SYS_PERIODICITIES.DB_COLUMN_NAME%TYPE;
446     l_Date          DATE;
447     l_Cal_Yr        BSC_DB_CALENDAR.CALENDAR_YEAR%TYPE;
448     l_Cal_Mn        BSC_DB_CALENDAR.CALENDAR_MONTH%TYPE;
449     l_Cal_Dy        BSC_DB_CALENDAR.CALENDAR_DAY%TYPE;
450     l_Sep           VARCHAR2(1);
451 BEGIN
452     l_Period_DB_Col := BSC_PERIODS_UTILITY_PKG.Get_Periodicity_Db_Col(p_Periodicity_Id);
453 
454 
455     l_Sql :=  ' SELECT A.CALENDAR_DAY, A.CALENDAR_MONTH, A.CALENDAR_YEAR FROM (' ||
456               '  SELECT CALENDAR_DAY, CALENDAR_MONTH, CALENDAR_YEAR,  ' ||
457               '  (DAY365 - MIN(DAY365) OVER (PARTITION BY '||l_Period_DB_Col||')) SORT_DATE  ' ||
458               '  FROM BSC_DB_CALENDAR  ' ||
459               '  WHERE CALENDAR_ID = :1 AND YEAR = :2 AND '||l_Period_DB_Col||' = :3) A ' ||
460               ' WHERE A.SORT_DATE = 0 ';
461 
462 
463     l_Sep := '/';
464 
465     EXECUTE IMMEDIATE l_Sql
466     INTO l_Cal_Dy, l_Cal_Mn, l_Cal_Yr
467     USING p_Calendar_Id, p_Year, p_Period_id;
468 
469     -- to avoid false postives (need to use direct values)
470     RETURN TO_DATE(l_Cal_Mn||l_Sep||l_Cal_Dy||l_Sep||l_Cal_Yr, 'mm/dd/yyyy');
471 
472 EXCEPTION
473     WHEN OTHERS THEN
474         RETURN NULL;
475 END Get_Start_Period_Date;
476 
477 
478 FUNCTION Get_End_Period_Date (
479     p_Calendar_Id    IN NUMBER
480   , p_Periodicity_Id IN NUMBER
481   , p_Period_id      IN NUMBER
482   , p_Year           IN NUMBER
483 ) RETURN DATE IS
484     l_Sql           VARCHAR2(1000);
485     l_Period_DB_Col BSC_SYS_PERIODICITIES.DB_COLUMN_NAME%TYPE;
486     l_Date          DATE;
487     l_Cal_Yr        BSC_DB_CALENDAR.CALENDAR_YEAR%TYPE;
488     l_Cal_Mn        BSC_DB_CALENDAR.CALENDAR_MONTH%TYPE;
489     l_Cal_Dy        BSC_DB_CALENDAR.CALENDAR_DAY%TYPE;
490     l_Sep           VARCHAR2(1);
491 BEGIN
492     l_Period_DB_Col := BSC_PERIODS_UTILITY_PKG.Get_Periodicity_Db_Col(p_Periodicity_Id);
493 
494 
495     l_Sql :=  ' SELECT A.CALENDAR_DAY, A.CALENDAR_MONTH, A.CALENDAR_YEAR FROM (' ||
496               '  SELECT CALENDAR_DAY, CALENDAR_MONTH, CALENDAR_YEAR,  ' ||
497               '  (MAX(DAY365) OVER (PARTITION BY '||l_Period_DB_Col||')-DAY365) SORT_DATE  ' ||
498               '  FROM BSC_DB_CALENDAR  ' ||
499               '  WHERE CALENDAR_ID = :1 AND YEAR = :2 AND '||l_Period_DB_Col||' = :3) A ' ||
500               ' WHERE A.SORT_DATE = 0 ';
501 
502     l_Sep := '/';
503 
504     EXECUTE IMMEDIATE l_Sql
505     INTO l_Cal_Dy, l_Cal_Mn, l_Cal_Yr
506     USING p_Calendar_Id, p_Year, p_Period_id;
507 
508     --to avoid false postives (need to use direct values)
509     RETURN TO_DATE(l_Cal_Mn||l_Sep||l_Cal_Dy||l_Sep||l_Cal_Yr, 'mm/dd/yyyy');
510 
511 EXCEPTION
512     WHEN OTHERS THEN
513         RETURN NULL;
514 END Get_End_Period_Date;
515 
516 
517 FUNCTION Get_Periodicity_Db_Col (
518     p_Periodicity_Id IN NUMBER
519 ) RETURN VARCHAR2 IS
520     l_Period_DB_Col BSC_SYS_PERIODICITIES.DB_COLUMN_NAME%TYPE;
521 BEGIN
522     SELECT P.DB_COLUMN_NAME
523     INTO   l_Period_Db_Col
524     FROM   BSC_SYS_PERIODICITIES P
525     WHERE  P.PERIODICITY_ID = p_Periodicity_Id;
526 
527     RETURN l_Period_Db_Col;
528 
529 EXCEPTION
530     WHEN OTHERS THEN
531         RETURN NULL;
532 END Get_Periodicity_Db_Col;
533 
534 
535 -- Added API for Bug#4566634
536 -- This API returns the correspoding Enterprise Period when a
537 -- Rolling Period is passed to the API
538 FUNCTION Get_Non_Rolling_Dim_Obj (
539     p_Short_Name IN VARCHAR2
540 )  RETURN VARCHAR2 IS
541 BEGIN
542 
543     IF (p_Short_Name = C_FII_ROLLING_QTR) THEN
544         RETURN C_FII_TIME_ENT_QTR;
545     ELSIF (p_Short_Name = C_FII_ROLLING_WEEK) THEN
546         RETURN C_FII_TIME_WEEK;
547     ELSIF (p_Short_Name = C_FII_ROLLING_MONTH) THEN
548         RETURN C_FII_TIME_ENT_PERIOD;
549     ELSIF (p_Short_Name = C_FII_ROLLING_YEAR) THEN
550         RETURN C_FII_TIME_ENT_YEAR;
551     END IF;
552 
553     RETURN p_Short_Name;
554 
555 EXCEPTION
556     WHEN OTHERS THEN
557         RETURN p_Short_Name;
558 END Get_Non_Rolling_Dim_Obj;
559 
560 -- added for Bug#4574115
561 FUNCTION Get_Periodicity_Name (
562     p_Periodicity_Id IN NUMBER
563 ) RETURN VARCHAR2 IS
564     l_Name BSC_SYS_PERIODICITIES_VL.NAME%TYPE;
565 BEGIN
566     SELECT B.NAME
567     INTO   l_Name
568     FROM   BSC_SYS_PERIODICITIES_VL B
569     WHERE  B.PERIODICITY_ID = p_Periodicity_Id;
570 
571     RETURN l_Name;
572 
573 EXCEPTION
574     WHEN OTHERS THEN
575         RETURN NULL;
576 END Get_Periodicity_Name;
577 
578 FUNCTION Get_Daily_Periodicity_Sht_Name(
579   p_Calendar_Id IN NUMBER
580 ) RETURN VARCHAR2 IS
581   l_Periodicity_Short_Name BSC_SYS_PERIODICITIES_VL.SHORT_NAME%TYPE;
582 
583   CURSOR c_CalendarPeriodicities IS
584     SELECT PERIODICITY_ID,
585            SHORT_NAME
586     FROM   BSC_SYS_PERIODICITIES_VL
587     WHERE  CALENDAR_id = p_Calendar_Id;
588 
589 BEGIN
590    FOR prdcty IN c_CalendarPeriodicities LOOP
591      IF (Is_Base_Periodicity_Daily(prdcty.PERIODICITY_ID)) THEN
592        l_Periodicity_Short_Name := prdcty.SHORT_NAME;
593      END IF;
594    END LOOP;
595 
596    RETURN l_Periodicity_Short_Name;
597 EXCEPTION
598   WHEN OTHERS THEN
599     RETURN l_Periodicity_Short_Name;
600 END Get_Daily_Periodicity_Sht_Name;
601 
602 
603 
604 /**************************************************************************
605    Function Name :- generate_Period_Short_Name
606    Description   :- generates period short Name  as Below
607                     BSC_PER_CALx_PERy  where x = calendarId and y = periodId
608    Parameters    :-
609       p_Calendar_Id  :- Id of the calendar.
610       p_Period_Id    :- periodicity Id of the period
611 *****************************************************************************/
612 FUNCTION generate_Period_Short_Name (
613          p_Calendar_Id   IN  NUMBER
614         ,p_Period_Id     IN  NUMBER
615 )RETURN VARCHAR2 IS
616 l_Short_Name      BSC_SYS_PERIODICITIES.SHORT_NAME%TYPE;
617 l_Flag           BOOLEAN;
618 l_Temp_Var       BIS_LEVELS.SHORT_NAME%TYPE;
619 l_Count          NUMBER;
620 l_alias                 VARCHAR2(4);
621 
622 BEGIN
623   l_Short_Name := BSC_PERIODS_UTILITY_PKG.C_PERIOD_SHORT_NAME_PREFIX||C_CALNEDAR_SHORT_PREFIX||p_Calendar_Id||
624                 C_UNDER_SCORE||C_PERIOD_SHORT_PREFIX||p_Period_Id;
625 
626   l_Flag     := TRUE;
627   l_alias    := NULL;
628   l_Temp_Var := l_Short_Name;
629 
630   WHILE (l_flag) LOOP
631     SELECT COUNT(1)
632     INTO   l_Count
633     FROM   BIS_LEVELS_VL
634     WHERE  UPPER(Short_Name) = UPPER(l_temp_var);
635 
636     IF (l_Count = 0) THEN
637         l_flag            :=  FALSE;
638         l_Short_Name      :=  l_temp_var;
639     END IF;
640       l_alias     :=  get_Next_Alias(l_alias);
641       l_temp_var  :=  l_Short_Name||l_alias;
642   END LOOP;
643 
644   RETURN l_Short_Name;
645 
646 EXCEPTION
647  WHEN OTHERS THEN
648  RETURN NULL;
649 END generate_Period_Short_Name;
650 /**************************************************************************
651    Function Name :- get_Dimobj_Name_From_period
652    Description   :- Makes the name of period dimension object from calendar name and period name
653                     BSC_PER_CALx_PERy  where x = calendarId and y = periodId
654    Parameters    :-
655       p_Calendar_Id         :- Id of the calendar.
656       p_Periodicity_Name    :- Name of the period
657 *****************************************************************************/
658 
659 FUNCTION get_Dimobj_Name_From_period (
660   p_Calendar_Id      IN NUMBER
661 , p_Periodicity_Name IN VARCHAR2
662 ) RETURN VARCHAR2 IS
663 l_Count          NUMBER;
664 l_Calendar_Name  BSC_SYS_CALENDARS_TL.NAME%TYPE;
665 l_Return_Name    BIS_LEVELS_TL.NAME%TYPE;
666 l_Flag           BOOLEAN;
667 l_Sequence       NUMBER;
668 l_Temp_Var       BIS_LEVELS_TL.NAME%TYPE;
669 BEGIN
670   SELECT name
671   INTO   l_Calendar_Name
672   FROM   bsc_sys_calendars_vl
673   WHERE  calendar_id = p_Calendar_Id;
674 
675   l_Return_Name := SUBSTR(l_Calendar_Name,1,254-LENGTH(p_Periodicity_Name))|| BSC_PERIODS_UTILITY_PKG.C_HYPHEN || p_Periodicity_Name;
676 
677   l_Sequence := 0;
678   l_Flag := TRUE;
679   l_Temp_Var := l_Return_Name;
680   WHILE(l_Flag) LOOP
681     SELECT COUNT(1)
682     INTO   l_Count
683     FROM   bis_levels_vl
684     WHERE  UPPER(name) = UPPER(l_Temp_Var);
685 
686     IF(l_Count = 0 ) THEN
687       l_Flag := FALSE;
688       l_Return_Name := l_Temp_Var;
689     END IF;
690     l_Sequence := l_Sequence + 1;
691     l_Temp_Var := SUBSTR(l_Calendar_Name,1,250-LENGTH(p_Periodicity_Name))||l_Sequence ||BSC_PERIODS_UTILITY_PKG.C_HYPHEN || p_Periodicity_Name;
692 
693   END LOOP;
694   RETURN l_Return_Name;
695 EXCEPTION
696   WHEN OTHERS THEN
697     RETURN NULL;
698 END get_Dimobj_Name_From_period;
699 
700 /**************************************************************************
701    Function Name :- Get_Bsc_Periodicity
702    Description   :- First checks if Period is Roling type. (Picks corresponding level id for rolilng type)
703                     Then calls BSC_DBI_CALENDAR.Get_Bsc_Periodicity to get the Periodicity corresponding to level.
704    Parameters    :-
705       x_time_level_name   :- takes the level Short_Name and returns corresponding short_name (short_name will change for rolling type)
706       x_periodicity_id    :- returns periodicity id corresponding to period
707       x_calendar_id       :- returns calendar_id it is associated to.
708       x_message           :- Message returned from API.
709 *****************************************************************************/
710 FUNCTION Get_Bsc_Periodicity(
711     x_time_level_name    IN OUT NOCOPY VARCHAR2
712   , x_periodicity_id     OUT    NOCOPY NUMBER
713   , x_calendar_id        OUT    NOCOPY NUMBER
714   , x_message            OUT    NOCOPY VARCHAR2
715 )RETURN BOOLEAN IS
716 BEGIN
717   IF(BIS_UTILITIES_PVT.Is_Rolling_Period_Level(x_time_level_name) = 1) THEN
718     x_time_level_name := BSC_PERIODS_UTILITY_PKG.Get_Non_Rolling_Dim_Obj(x_time_level_name);
719   END IF;
720 
721   RETURN BSC_DBI_CALENDAR.Get_Bsc_Periodicity(
722      p_time_level_name    => x_time_level_name
723     ,x_periodicity_id     => x_periodicity_id
724     ,x_calendar_id        => x_calendar_id
725     ,x_message            => x_message
726   );
727 END Get_Bsc_Periodicity;
728 
729 /*************************************************************************************************************
730 API NAME : Get_Quarter_Date_Label
731 FUNCTIONALITY : This API takes the as of date value and the
732 time dimension object under consideration and returns in the
733 Quarter date format, for example
734 
735 SQL> select BSC_PERIODS_UTILITY_PKG.Get_Quarter_Date_Format('28-JUN-02', 'BSC_PER_2453567477645868') from dual
736 
737 Q2 FY02 Day -2
738 
739 NOTE 1: That this API should be used only with Custom Periodicities and
740 this will behave unexpectedly by returning null in case of DBI Periodicities
741 
742 NOTE 2: The API will return the message error text in case of date errors
743 
744 NOTE 3: Appropriate ORA errors will be returned, for example
745 
746 SQL> select BSC_PERIODS_UTILITY_PKG.Get_Quarter_Date_Format('28-JUN-03', 'BSC_PER_2453567477645868') from dual
747 
748 ORA-01403: no data found
749 
750 SQL> select BSC_PERIODS_UTILITY_PKG.Get_Quarter_Date_Format('30-FEB-03', 'BSC_PER_2453567477645868') from dual
751 
752 ORA-01839: date not valid for month specified
753 *************************************************************************************************************/
754 
755 FUNCTION Get_Quarter_Date_Label(
756   p_As_Of_date                   IN VARCHAR2,
757   p_Dimension_Object_Short_Name  IN VARCHAR2
758 ) RETURN VARCHAR2 IS
759 
760   l_Calendar_Id NUMBER;
761   l_Day         NUMBER;
762   l_Month       NUMBER;
763   l_Year        NUMBER;
764   l_YY          VARCHAR2(2);
765   l_Quarter     NUMBER;
766 
767   l_Last_Day_Count    NUMBER;
768   l_Current_Day_Count NUMBER;
769   l_Days_Left         NUMBER;
770 
771   l_Data_Label  VARCHAR2(100);
772 
773   CURSOR c_Get_Calendar_ID IS
774     SELECT P.CALENDAR_ID
775     FROM BSC_SYS_PERIODICITIES_VL P
776     WHERE P.SHORT_NAME = p_Dimension_Object_Short_Name;
777 
778 BEGIN
779 
780   l_Calendar_Id := NULL;
781 
782   FOR cGC IN c_Get_Calendar_ID LOOP
783     l_Calendar_Id := cGC.CALENDAR_ID;
784   END LOOP;
785 
786   IF (l_Calendar_Id IS NULL) THEN
787     RETURN NULL;
788   END IF;
789 
790   IF (p_As_Of_date IS NULL) THEN
791     RETURN NULL;
792   END IF;
793 
794   SELECT TO_NUMBER(TO_CHAR(TO_DATE(p_As_Of_date, 'DD/MM/YYYY'), 'DD')),
795          TO_NUMBER(TO_CHAR(TO_DATE(p_As_Of_date, 'DD/MM/YYYY'), 'MM')),
796          TO_NUMBER(TO_CHAR(TO_DATE(p_As_Of_date, 'DD/MM/YYYY'), 'YYYY')),
797          TO_CHAR(TO_DATE(p_As_Of_date, 'DD/MM/YYYY'), 'YY')
798   INTO   l_Day, l_Month, l_Year, l_YY
799   FROM   DUAL;
800 
801   SELECT C.QUARTER, C.DAY365
802   INTO   l_Quarter, l_Current_Day_Count
803   FROM   BSC_DB_CALENDAR C
804   WHERE  C.CALENDAR_YEAR  = l_Year
805   AND    C.CALENDAR_MONTH = l_Month
806   AND    C.CALENDAR_DAY   = l_Day
807   AND    C.CALENDAR_ID    = l_Calendar_Id;
808 
809   -- Get the last day count for the current quarter.
810 
811   SELECT MAX(C.DAY365) INTO l_Last_Day_Count
812   FROM   BSC_DB_CALENDAR C
813   WHERE  C.CALENDAR_ID    = l_Calendar_Id
814   AND    C.CALENDAR_YEAR  = l_Year
815   AND    C.QUARTER        = l_Quarter;
816 
817 
818   l_Days_Left := (l_Last_Day_Count - l_Current_Day_Count);
819 
820   -- Q&QUARTER_NUMBER FY&YEAR_NUMBER Day -&DAY_NUMBER
821   FND_MESSAGE.SET_NAME('BSC', 'BSC_DATE_LABEL');
822   FND_MESSAGE.SET_TOKEN('DAY_NUMBER', l_Days_Left, FALSE);
823   FND_MESSAGE.SET_TOKEN('QUARTER_NUMBER', l_Quarter, FALSE);
824   FND_MESSAGE.SET_TOKEN('YEAR_NUMBER',l_YY, FALSE);
825 
826   l_Data_Label := FND_MESSAGE.GET;
827 
828   RETURN l_Data_Label;
829 EXCEPTION
830   WHEN OTHERS THEN
831     RETURN SQLERRM;
832 END Get_Quarter_Date_Label;
833 
834 
835 END BSC_PERIODS_UTILITY_PKG;