DBA Data[Home] [Help]

PACKAGE BODY: APPS.WF_NOTIFICATION_UTIL

Source


1 package body WF_NOTIFICATION_UTIL as
2  /* $Header: wfntfb.pls 120.113.12020000.8 2013/03/20 04:46:53 alsosa ship $ */
3 
4   -- flag to initialize default NLS values
5   g_wfcore_nls_set boolean := false;
6 
7   -- logging variable
8   g_plsqlName varchar2(35) := 'wf.plsql.WF_NOTIFICATION_UTIL.';
9 
10   -- <7578908> to handle timestamp in getCalendarDate()
11   g_time_format varchar2(64) := ' HH24:MI:SS';
12 
13   -- SetAttrEvent  Bug# 2376197
14   --   Set the value of a event notification attribute.
15   --   Attribute must be a EVENT-type attribute.
16   -- IN:
17   --   nid - Notification id
18   --   aname - Attribute Name
19   --   avalue - New value for attribute
20   --
21   procedure SetAttrEvent (nid    in  number,
22                           aname  in  varchar2,
23                           avalue in  wf_event_t)
24   is
25   begin
26     if ((nid is null) or (aname is null)) then
27       wf_core.token('NID', to_char(nid));
28       wf_core.token('ANAME', aname);
29       wf_core.raise('WFSQL_ARGS');
30     end if;
31 
32     -- Update attribute value
33     update WF_NOTIFICATION_ATTRIBUTES
34     set    EVENT_VALUE = avalue
35     where  NOTIFICATION_ID = nid and NAME = aname;
36 
37     if (SQL%NOTFOUND) then
38       wf_core.token('NID', to_char(nid));
39       wf_core.token('ATTRIBUTE', aname);
40       wf_core.raise('WFNTF_ATTR');
41     end if;
42 
43   exception
44     when others then
45       wf_core.context('Wf_Notification_Util', 'SetAttrEvent', to_char(nid), aname);
46       raise;
47   end SetAttrEvent;
48 
49   -- GetAttrEvent  Bug# 2376197
50   --   Get the value of a event notification attribute.
51   --   Attribute must be a EVENT-type attribute.
52   -- IN:
53   --   nid - Notification id
54   --   aname - Attribute Name
55   -- RETURNS:
56   --   Attribute value
57 
58   function GetAttrEvent (nid   in  number,
59                          aname in  varchar2)
60   return wf_event_t is
61     lvalue wf_event_t;
62   begin
63     if ((nid is null) or (aname is null)) then
64       wf_core.token('NID', to_char(nid));
65       wf_core.token('ANAME', aname);
66       wf_core.raise('WFSQL_ARGS');
67     end if;
68 
69     begin
70       select WNA.EVENT_VALUE
71       into   lvalue
72       from   WF_NOTIFICATION_ATTRIBUTES WNA
73       where  WNA.NOTIFICATION_ID = nid and WNA.NAME = aname;
74     exception
75       when no_data_found then
76         wf_core.token('NID', to_char(nid));
77         wf_core.token('ATTRIBUTE', aname);
78         wf_core.raise('WFNTF_ATTR');
79     end;
80     return(lvalue);
81   exception
82     when others then
83       wf_core.context('Wf_Notification_Util', 'GetAttrEvent', to_char(nid), aname);
84       raise;
85   end GetAttrEvent;
86 
87 
88   --   denormalize_rf
89   --   Rule function to denormalize a notificaion
90   --
91   FUNCTION denormalize_rf(p_subscription_guid in     raw,
92                             p_event in out nocopy wf_event_t)
93   return varchar2
94   is
95     l_nid       number;
96     l_language  varchar2(64);
97     l_territory varchar2(64);
98     l_subject   varchar2(2000);
99     l_orig_lang varchar2(64);
100     l_orig_terr varchar2(64);
101     l_orig_chrs varchar2(64);
102     l_nls_date_format varchar2(64);
103     l_nls_date_language varchar2(64);
104     l_nls_calendar      varchar2(64);
105     l_nls_numeric_characters varchar2(64);
106     l_nls_sort   varchar2(64);
107     l_nls_currency   varchar2(64);
108     l_orig_date_format varchar2(64);
109     l_orig_date_language varchar2(64);
110     l_orig_calendar      varchar2(64);
111     l_orig_numeric_characters varchar2(64);
112     l_orig_sort   varchar2(64);
113     l_orig_currency   varchar2(64);
114     l_api varchar2(50):='wf.plsql.wf_notification_util.denormalize_rf';
115 
116   begin
117     if (wf_log_pkg.level_procedure>= fnd_log.g_current_runtime_level) then
118       wf_log_pkg.string(wf_log_pkg.level_procedure,l_api,'BEGIN, p_subscription_guid='||p_subscription_guid);
119     end if;
120     l_nid := p_event.GetValueForParameter('NOTIFICATION_ID');
121     l_language := p_event.GetValueForParameter('LANGUAGE');
122     l_territory := p_event.GetValueForParameter('TERRITORY');
123 
124     -- <7514495>
125     l_nls_date_format:=p_event.GetValueForParameter('NLS_DATE_FORMAT');
126     l_nls_date_language:=p_event.GetValueForParameter('NLS_DATE_LANGUAGE');
127     l_nls_calendar:=p_event.GetValueForParameter('NLS_CALENDAR');
128     l_nls_numeric_characters:= p_event.GetValueForParameter('NLS_NUMERIC_CHARACTERS');
129     l_nls_sort := p_event.GetValueForParameter('NLS_SORT');
130     l_nls_currency:= p_event.GetValueForParameter('NLS_CURRENCY'); -- </7514495>
131 
132     if (wf_log_pkg.level_statement >= fnd_log.g_current_runtime_level) then
133       wf_log_pkg.string(wf_log_pkg.level_statement,l_api,'Nid: '||l_nid);
134       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'Lang: '||l_language||' Territory: '||l_territory);
135       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,
136                      'nls_date_format: '||l_nls_date_format||', nls_date_language: '||l_nls_date_language);
137       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,
138                      'nls_calendar: '||l_nls_calendar||', nls_numeric_characters: '||l_nls_numeric_characters);
139       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,
140                      'nls_sort: '||l_nls_sort||', nls_currency: '||l_nls_currency);
141     end if;
142     -- <7514495>
143     -- Wf_Notification.GetNLSLanguage(l_orig_lang,l_orig_terr,l_orig_chrs); commenting out
144     wf_notification_util.getNLSContext(p_nlsLanguage=>l_orig_lang, p_nlsTerritory =>l_orig_terr,  p_nlsCode => l_orig_chrs,
145                          p_nlsDateFormat =>l_orig_date_format, p_nlsDateLanguage =>l_orig_date_language,
146                          p_nlsNumericCharacters =>l_orig_numeric_characters, p_nlsSort =>l_orig_sort,
147                          p_nlsCalendar =>l_orig_calendar);
148 
149     -- <7514495>
150     -- Wf_Notification.SetNLSLanguage(l_language,l_territory); commenting out
151     wf_notification_util.SetNLSContext(p_nid=> l_nid, p_nlsLanguage =>l_language, p_nlsTerritory =>l_territory,
152                         p_nlsDateFormat =>l_nls_date_format, p_nlsDateLanguage => l_nls_date_language,
153                         p_nlsNumericCharacters => l_nls_numeric_characters, p_nlsSort =>l_nls_sort,
154                         p_nlsCalendar => l_nls_calendar);
155 
156     g_allowDeferDenormalize:=false;
157     Wf_Notification.Denormalize_Notification(l_nid);
158 
159     -- reset the existing session language
160     -- WF_Notification.SetNLSLanguage(l_orig_lang,l_orig_terr); <7514495> commenting out
161     wf_notification_util.SetNLSContext(p_nlsLanguage =>l_orig_lang, p_nlsTerritory =>l_orig_terr,
162                         p_nlsDateFormat =>l_orig_date_format, p_nlsDateLanguage => l_orig_date_language,
163                         p_nlsNumericCharacters => l_orig_numeric_characters, p_nlsSort =>l_orig_sort,
164                         p_nlsCalendar => l_orig_calendar);
165 
166     if (wf_log_pkg.level_procedure>= fnd_log.g_current_runtime_level) then
167       wf_log_pkg.string(wf_log_pkg.level_procedure,l_api,'END');
168     end if;
169 
170     return 'SUCCESS';
171   exception
172     when others then
173       wf_core.context('Wf_Notification_util', 'Denormalize_Rf', to_char(l_nid));
174       wf_event.setErrorInfo(p_event, 'ERROR');
175       return 'ERROR';
176   end denormalize_rf;
177 
178   function CheckIllegalChar(bindparam  in  varchar2,
179                             raise_error in boolean)
180   return boolean
181   is
182   begin
183 
184 
185    --Check if the in parameter contains any of the illegal characters
186    --'(' , ')' or ';' which could supposedly lead to sql injection
187    --when binding.
188    if ((instr(bindparam,'(') > 0) OR (instr(bindparam,';') > 0)
189    OR (instr(bindparam,')')>0)) then
190      if (raise_error IS NULL or raise_error) then
191            --raise error
192            wf_core.token('PARAM',bindparam);
193            wf_core.raise('WFNTF_ILLEGAL_CHAR');
194 
195      else
196            --If u just want to check for illegal characters
197            --and not raise any exception
198            return false;
199      end if;
200    else
201      return true;
202    end if;
203   end CheckIllegalChar;
204 
205   -- getNLSContext
206   --   get the NLS session parameters from USER ENV.
207   --
208   -- OUT:
209   --   p_nlsLanguage     : a varchar2 of the NLS_LANGUAGE
210   --   p_nlsTerritory    : a varchar2 of the NLS_TERRITORY
211   --   p_nlsDateFormat   : a varchar2 of the NLS_DATE_FORMAT
212   --   p_nlsDateLanguage : a varchar2 of the NLS_DATE_LANGUAGE
213   --   p_nlsCalendar     :      -- not will be used as of now but for future
214   --   p_nlsNumericCharacters : a varchar2 of the nls numeric characters
215   --   p_nlsSort             : a varchar2 of the NLS_SORT
216   --
217   procedure getNLSContext( p_nlsLanguage out NOCOPY varchar2,
218                            p_nlsTerritory out NOCOPY varchar2,
219                            p_nlsCode       OUT NOCOPY varchar2,
220                            p_nlsDateFormat out NOCOPY varchar2,
221                            p_nlsDateLanguage out NOCOPY varchar2,
222                            p_nlsNumericCharacters out NOCOPY varchar2,
223                            p_nlsSort out NOCOPY varchar2,
224                            p_nlsCalendar out NOCOPY varchar2)
225   is
226     l_envLangTerritory           varchar2(240);
227     l_uPos     number;        -- position for '_'
228     l_dotPos   number;        -- position for '.'
229     l_api varchar2(50):='wf.plsql.wf_notification_util.getNLSContext';
230 
231   begin
232      -- ensure that wf_core NLS defaults are in fact set
233      if (g_wfcore_nls_set = false) then
234         wf_core.initializeNLSDefaults;
235         g_wfcore_nls_set := true;
236      end if;
237 
238      -- Get NLS param from USERENV namespace  or query v$nls_parameter
239      l_envLangTerritory :=  SYS_CONTEXT('USERENV', 'LANGUAGE');
240 
241      l_uPos := instr(l_envLangTerritory, '_');
242      l_dotPos := instr(l_envLangTerritory, '.');
243 
244      p_nlsLanguage  :=   substr(l_envLangTerritory, 1, l_uPos-1);
245      p_nlsTerritory :=   substr(l_envLangTerritory,  l_uPos + 1, l_dotPos - l_uPos -1);
246 
247      -- Code being used by Mailer at java layer
248      p_nlsCode    := substr(l_envLangTerritory, l_dotPos + 1);
249 
250      p_nlsDateFormat    := SYS_CONTEXT('USERENV', 'NLS_DATE_FORMAT');
251      p_nlsDateLanguage  := SYS_CONTEXT('USERENV', 'NLS_DATE_LANGUAGE');
252      p_nlsSort          := SYS_CONTEXT('USERENV', 'NLS_SORT');
253 
254      -- NLS_NUMERIC_CHARACTERS is not available in USERENV namespace.
255      SELECT value INTO  p_nlsNumericCharacters
256      from v$nls_parameters
257      where parameter = 'NLS_NUMERIC_CHARACTERS';
258 
259       p_nlsCalendar := GetCurrentCalendar;
260 
261     if (wf_log_pkg.level_statement >= fnd_log.g_current_runtime_level) then
262       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'Returning following values');
263       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'p_nlsLanguage: '||p_nlsLanguage||', p_nlsTerritory: '||p_nlsTerritory);
264       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'p_nlsCode: '||p_nlsCode||', p_nlsDateFormat: '||p_nlsDateFormat);
265       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'p_nlsDateLanguage: '||p_nlsDateLanguage||', p_nlsSort: '||p_nlsSort);
266       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'p_nlsNumericCharacters: '||p_nlsNumericCharacters||', p_nlsCalendar: '||p_nlsCalendar);
267     end if;
268   exception
269     WHEN OTHERS THEN
270       raise;
271   END getNLSContext;
272 
273 
274   --
275   -- SetNLSContext the NLS parameters like lang and territory of the current session
276   --
277   -- IN
278   --   p_nid             - a number of the notification id ( this only be used to store value
279   --                       in global session variable.)
280   --   p_nlsLanguage     - a varchar2 of the language code
281   --   p_nlsTerritory    - a varchar2 of the territory code.
282   --   p_nlsDateFormat   - a varchar2 of the nls_date_format
283   --   p_nlsDateLanguage - a varchar2 of the nls_date_language
284   --   p_nlsNumericCharacters - a varchar2 of the nls numeric characters
285   --   p_nlsSort              - a varchar2 of the NLS_SORT
286   --   p_nlsCalendar        - a varchar2 of the nls_calendar
287   --                       (only be used to store value in global session variable).
288   --
289   procedure SetNLSContext(p_nid  IN NUMBER DEFAULT null,
290                           p_nlsLanguage  in VARCHAR2  default null,
291                           p_nlsTerritory in VARCHAR2  default null,
292                           p_nlsDateFormat in VARCHAR2  default null,
293                           p_nlsDateLanguage in VARCHAR2  default null,
294                           p_nlsNumericCharacters in VARCHAR2  default null,
295                           p_nlsSort in VARCHAR2  default null,
296                           p_nlsCalendar in VARCHAR2  default null)
297   is
298 
299     -- dependes on NLS_LANGUAGE
300     l_nlsDateLanguage  v$nls_parameters.value%TYPE   := upper(p_nlsDateLanguage);
301     l_api varchar2(50):='wf.plsql.wf_notification_util.SetNLSContext';
302 
303   begin
304     if (wf_log_pkg.level_statement >= fnd_log.g_current_runtime_level) then
305       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'Parameters passed');
306       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'p_nlsLanguage: '||p_nlsLanguage||', p_nlsTerritory: '||p_nlsTerritory);
307       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'p_nid: '||p_nid||', p_nlsDateFormat: '||p_nlsDateFormat);
308       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'p_nlsDateLanguage: '||p_nlsDateLanguage||', p_nlsSort: '||p_nlsSort);
309       wf_log_pkg.string(wf_log_pkg.level_statement, l_api,'p_nlsNumericCharacters: '||p_nlsNumericCharacters||', p_nlsCalendar: '||p_nlsCalendar);
310     end if;
311      -- As nls_date_language may come as lang. code e.g. US, KO
312      if( (p_nlsDateLanguage IS NOT NULL)  ) then
313           if(isLanguageInstalled(p_nlsDateLanguage) = FALSE ) then
314              l_nlsDateLanguage := p_nlsLanguage;
315           end if;
316      end IF;
317 
318      -- Any one of them is not null
319      if( p_nlsLanguage          IS NOT NULL or
320          l_nlsDateLanguage   IS NOT NULL or
321          p_nlsSort           IS NOT NULL or
322          p_nlsTerritory      IS NOT NULL or
323          p_nlsDateFormat     IS NOT NULL or
324          p_nlsNumericCharacters IS NOT NULL ) THEN
325 
326          -- set context.
327          fnd_global.set_nls_context(p_nlsLanguage ,
328                                     p_nlsDateFormat,
329                                     l_nlsDateLanguage ,
330                                     p_nlsNumericCharacters,
331                                     p_nlsSort ,
332                                     p_nlsTerritory       ) ;
333 
334          -- set global variables
335           g_nls_language :=  p_nlsLanguage;
336           g_nls_territory := p_nlsTerritory;
337           g_nls_date_format  := p_nlsDateFormat;
338           g_nls_Date_Language := l_nlsDateLanguage;
339           g_nls_Sort         := p_nlsSort;
340           g_nls_Numeric_Characters := p_nlsNumericCharacters;
341 
342      END if;
343 
344      -- set Calendar value in global variable.
345      setCurrentCalendar (p_nlsCalendar);
346 
347      SetCurrentNID(p_nid);
348 
349   exception
350       when others then
351          wf_core.context('Wf_Notification_Util', 'SetNLSContext',
352                           p_nid,
353                           p_nlsLanguage  ,
354                           p_nlsTerritory ,
355                           p_nlsDateFormat ,
356                           p_nlsDateLanguage ,
357                           p_nlsCalendar ,
358                           p_nlsNumericCharacters ,
359                           p_nlsSort  );
360 
361 
362           -- WE May set default NLS settings here but what if partial NLS setting has
363           -- been done and fnd_global.set_nls_context failed in middle for a session?? .
364           -- Better to raise to caller so that source type ERROR
365           -- event would be raised.
366           --
367           raise;
368 
369   END SetNLSContext;
370 
371 
372 
373   --
374   --
375   -- setCurrentCalendar :
376   --       Sets NLS_CALENDAR parameter's value in global variables for fast accessing.
377   --       as this parameters may NOT be altered for a SESSION( Per IPG team : Database stores
378   --       all dates in Gregorian calendar)
379   --
380   -- in
381   --  p_nlsCalendar : varchar2
382   --
383   PROCEDURE setCurrentCalendar( p_nlsCalendar in varchar2)
384   is
385   begin
386       g_nls_Calendar := p_nlsCalendar;
387 
388   END setCurrentCalendar;
389 
390 
391   --
392   --
393   -- getGlobalCalendar :
394   --       Gets NLS_CALENDAR parameter's value from global variables
395   --
396   --
397   --
398   FUNCTION GetCurrentCalendar RETURN varchar2
399   is
400   begin
401 
402      RETURN g_nls_Calendar;
403 
404   END GetCurrentCalendar;
405 
406   --
407   --
408   -- setCurrentNID :
409   --       Sets notification id parameter's value from global variables for fast accessing
410   --
411   -- IN
412   --  p_nid - A number for notification id
413   --
414   PROCEDURE setCurrentNID( p_nid in number)
415   is
416   begin
417       g_nid:= p_nid;
418 
419   END setCurrentNID;
420 
421   --
422   --
423   -- getCurrentNID :
424   --       Gets NLS_CALENDAR parameter's value from global variables for fast accessing
425   --
426   -- OUT
427   --  p_nlsCalendar
428   FUNCTION getCurrentNID RETURN number
429   is
430   begin
431      RETURN g_nid;
432   END getCurrentNID;
433 
434   -- isLanguageInstalled
435   --   Checks if language is installed or not by querying on WF_LANGUAGE view.
436   -- IN
437   --   p_language : varchar2 The language to be checked.
438   -- RETURN
439   --   true if installed otherwise false
440   --
441   FUNCTION isLanguageInstalled( p_language IN VARCHAR2 DEFAULT null) RETURN boolean
442   is
443    l_installed_flag wf_languages.installed_flag%TYPE;
444   begin
445 
446        select installed_flag
447        into l_installed_flag
448        from wf_languages
449        where nls_language = p_language
450        and installed_flag = 'Y';
451 
452        -- if here, it means language installed
453        RETURN true;
454    exception
455      WHEN OTHERS then
456        -- Language is not installed.
457        RETURN false;
458 
459   END isLanguageInstalled;
460 
461 
462   function GetCalendarDate(p_nid number, p_date in date, p_date_format in varchar2, p_addTime in boolean) return varchar2
463   is
464     l_date_str     varchar2(100);
465     l_date_format  varchar2(100);
466     l_nls_calendar varchar2(100);
467     l_parTb wf_directory.wf_local_roles_tbl_type;
468     l_user varchar2(320);
469     p_mod       varchar2(100):=g_plsqlName|| 'GetCalendarDate()';
470     l_logPROC boolean;
471     l_logSTMT boolean;
472     l_timeFormat varchar2(64):=null;
473     l_err varchar2(3500);
474     l_errCode varchar2(30);
475     e_wrongNLSparam exception;
476     e_unrecognizedFormat exception;
477     e_numOrValueError exception;
478 
479     l_nls_language  varchar2(100);
480     l_nls_territory varchar2(100);
481 
482     l_ret_value varchar2(127) := null;
483 
484     pragma exception_init(e_wrongNLSparam, -12702);
485     pragma exception_init(e_unrecognizedFormat, -1821);
486     pragma exception_init(e_numOrValueError, -06502);
487 
488 
489   begin
490     l_logSTMT := WF_LOG_PKG.LEVEL_STATEMENT >= fnd_log.g_current_runtime_level;
491     l_logPROC := l_logSTMT or (WF_LOG_PKG.LEVEL_PROCEDURE >= fnd_log.g_current_runtime_level);
492 
493     if ( l_logPROC ) then
494       wf_log_pkg.String(wf_log_pkg.LEVEL_PROCEDURE, p_mod, 'BEGIN');
495     end if;
496 
497     -- if the call is from mailer, use the preferences from global variables
498     if (wf_notification_util.G_NID > 0 and wf_notification_util.G_NID = p_nid) then
499       l_date_format := wf_notification_util.G_NLS_DATE_FORMAT;
500       l_nls_calendar := wf_notification_util.G_NLS_CALENDAR;
501       -- <<bug 8430385 >>
502       l_nls_language := wf_notification_util.G_NLS_LANGUAGE;
503       l_nls_territory := wf_notification_util.G_NLS_TERRITORY;
504 
505     else
506       l_user := wfa_sec.GetUser();
507       if (l_user is null) then
508         -- use default values
509         l_date_format := wf_core.nls_date_format;
510         l_nls_calendar := wf_core.nls_calendar;
511 
512         l_nls_language := wf_core.nls_language;
513         l_nls_territory := wf_core.nls_territory;
514 
515       else
516 
517         wf_directory.GetRoleInfo2(Role => l_user, Role_Info_Tbl => l_parTb);
518 
519         l_date_format := l_parTb(1).NLS_DATE_FORMAT;
520         l_nls_calendar := l_parTb(1).NLS_CALENDAR;
521 
522         l_nls_language := l_parTb(1).LANGUAGE;
523         l_nls_territory := l_parTb(1).TERRITORY;
524       end if;
525 
526     end if;
527 
528     if ( l_logSTMT ) then
529       wf_log_pkg.String(wf_log_pkg.LEVEL_STATEMENT, p_mod, 'before conversion, p_date_format: '||p_date_format);
530       wf_log_pkg.String(wf_log_pkg.LEVEL_STATEMENT, p_mod, 'l_date_format (before adding tstamp): '||l_date_format);
531       wf_log_pkg.String(wf_log_pkg.LEVEL_STATEMENT, p_mod, 'l_nls_calendar: '||l_nls_calendar);
532       wf_log_pkg.String(wf_log_pkg.LEVEL_STATEMENT, p_mod, 'p_date: '||to_char(p_date,'DD-MON-RR HH24:MI:SS'));
533     end if;
534 
535     l_date_format := nvl(p_date_format, l_date_format);
536     if (p_addTime) and (instr(upper(l_date_format), 'HH') = 0) then
537       l_date_format := l_date_format|| g_time_format;
538 
539       if ( l_logSTMT ) then
540         wf_log_pkg.String(wf_log_pkg.LEVEL_STATEMENT, p_mod
541                     , 'l_date_format (after adding tstamp): '||l_date_format);
542       end if;
543     end if;
544 
545     --if (l_nls_calendar is not null) then
546     --  return to_char(p_date, l_date_format, 'NLS_CALENDAR = '''||l_nls_calendar||'''');
547     --else
548     --  return to_char(p_date, l_date_format);
549     --end if;
550 
551     -- <<sstomar>>: bug 8596153
552     --
553     -- NON-Gregorion calendar
554     -- CASE1: use NLS_CALENDAR
555     if (l_nls_calendar is not null and
556         upper(l_nls_calendar) <> 'GREGORIAN' ) then
557 
558       -- Bug 8872332: replacing the 'MON' string in date format with 'FMMON' to remove
559       -- trailing and leading spaces
560       -- Bug 9096378: changed the replacing string from 'FMMON' to 'FMMONFM' to disable 'FM' modifier
561       -- effects (removing the leading zeros) for the portion following its second occurence.
562       -- A FM modifier can appear in a format model more than once. In such a case,
563       -- each subsequent occurrence toggles the effects of the modifier. Its effects
564       -- are enabled for the portion of the model following its first occurrence, and
565       -- then disabled for the portion following its second occurrence.
566 
567       l_date_format := replace(l_date_format,'MON','FMMONFM');
568 
569       if ( l_logSTMT ) then
570         wf_log_pkg.String(wf_log_pkg.LEVEL_STATEMENT, p_mod
571             , 'returning to_char(to_date('''||to_char(p_date,'DD-MON-RRRR HH24:MI:SS')||
572              ''',''DD-MON-RRRR HH24:MI:SS''), '''||l_date_format||''', ''NLS_CALENDAR = '''''||
573              l_nls_calendar||'''''''); ');
574       end if;
575 
576       l_ret_value := to_char(p_date, l_date_format, 'NLS_CALENDAR = '''||l_nls_calendar||'''');
577 
578     -- CASE2: Use NLS_DATE_LANGUAGE
579     -- Bug 11897707: Use current session language instead of default application language in the below condition
580     elsif (sys_context('USERENV','LANG') = 'AR' and
581            l_nls_territory not in ('JORDAN', 'LEBANON', 'SYRIA', 'IRAQ')) then
582 
583       if ( l_logSTMT ) then
584        wf_log_pkg.String(wf_log_pkg.LEVEL_STATEMENT, p_mod
585             , 'returning to_char(to_date('''||to_char(p_date,'DD-MON-RRRR HH24:MI:SS')||
586             ''',''DD-MON-RRRR HH24:MI:SS''), '''||l_date_format||''', ''NLS_DATE_LANGUAGE='''''||
587              'EGYPTIAN''''''); ');
588       end if;
589 
590       l_ret_value := to_char(p_date, l_date_format, 'NLS_DATE_LANGUAGE = ''EGYPTIAN''');
591 
592     -- All Other CASES
593     else
594       if ( l_logSTMT ) then
595        wf_log_pkg.String(wf_log_pkg.LEVEL_STATEMENT, p_mod
596             , 'returning to_char(to_date('''||to_char(p_date,'DD-MON-RRRR HH24:MI:SS')||
597             ''',''DD-MON-RRRR HH24:MI:SS''), '''||l_date_format||''' );');
598       end if;
599 
600       l_ret_value := to_char(p_date, l_date_format);
601     end if;
602 
603     if ( l_logSTMT OR l_logPROC) then
604       wf_log_pkg.String(wf_log_pkg.LEVEL_PROCEDURE, p_mod, 'Returning value '|| l_ret_value );
605       wf_log_pkg.String(wf_log_pkg.LEVEL_PROCEDURE, p_mod, 'END');
606     end if;
607 
608     return l_ret_value;
609 
610   exception
611     when e_wrongNLSparam then
612      if (wf_log_pkg.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level) then
613       wf_log_pkg.String(wf_log_pkg.LEVEL_EXCEPTION, p_mod, 'EXCEPTION ora-12702!!');
614      end if;
615      return to_char(p_date, l_date_format);
616 
617     when e_unrecognizedFormat then
618      if (wf_log_pkg.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level) then
619       wf_log_pkg.String(wf_log_pkg.LEVEL_EXCEPTION, p_mod, 'EXCEPTION ora-1821!!');
620      end if;
621      return to_char(p_date, null, 'NLS_CALENDAR = '''||l_nls_calendar||'''');
622 
623     when e_numOrValueError then
624      if (wf_log_pkg.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level) then
625       wf_log_pkg.String(wf_log_pkg.LEVEL_EXCEPTION, p_mod, 'EXCEPTION ora-06502!!');
626      end if;
627      return to_char(p_date);
628 
629     when others then
630      l_errCode := SQLCODE;
631      l_err := substr(sqlerrm,1,3500);
632      if (wf_log_pkg.LEVEL_EXCEPTION >= fnd_log.g_current_runtime_level) then
633       wf_log_pkg.String(wf_log_pkg.LEVEL_EXCEPTION, p_mod, 'EXCEPTION '||l_errCode ||' - '|| l_err );
634      end if;
635      return to_char(p_date);
636   end GetCalendarDate;
637 
638   FUNCTION GetLocalDateTime(p_date in date) return date
639    IS
640    BEGIN
641      return fnd_timezones_pvt.adjust_datetime(p_date, fnd_timezones.get_server_timezone_code, fnd_timezones.get_client_timezone_code);
642    END GetLocalDateTime;
643 
644 
645 --
646 -- Complete_RF
647 --   ER 10177347: This is a custom rule function that calls the
648 --   Complete() API to execute the callback function in
649 --   COMPLETE mode to comeplete the notification activity
650 -- IN
651 --   p_subscription_guid Subscription GUID as a CLOB
652 --   p_event Event Message
653 -- OUT
654 --   Status as ERROR, SUCCESS, WARNING
655 function Complete_RF(p_subscription_guid in raw,
656                      p_event in out nocopy wf_event_t) return varchar2
657 is
658 
659    l_nid        number;
660    l_resp_found varchar2(10);
661 
662 begin
663 
664   l_nid := p_event.getValueForParameter('NOTIFICATION_ID');
665   l_resp_found := p_event.getValueForParameter('RESPONSE_FOUND');
666 
667   if (l_resp_found = 'TRUE') then
668       wf_notification.Complete(l_nid);
669   end if;
670 
671   return 'SUCCESS';
672 
673 exception
674   when others then
675     wf_core.context('WF_NOTIFICATION', 'COMPLETE_RF', p_event.getEventName(),
676                                                 p_subscription_guid);
677     wf_event.setErrorInfo(p_event, 'ERROR');
678     return 'ERROR';
679 
680 end Complete_RF;
681 
682 
683 -- package body end.
684 end WF_NOTIFICATION_UTIL;
685 
686 
687