DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSM_UTIL_PKG

Source


1 PACKAGE BODY CSM_UTIL_PKG AS
2 /* $Header: csmeutlb.pls 120.16 2008/02/21 09:02:34 trajasek ship $ */
3 error EXCEPTION;
4 g_invalid_argument_exception exception;
5 g_null_primary_key_exception exception;
6 g_element_not_found_exception exception;
7 
8 g_debug_level    NUMBER;  -- variable containing debug level
9 g_object_name    VARCHAR(255):= 'CSM_UTIL_PKG';
10 
11 g_initialize_log BOOLEAN := FALSE;
12 
13 --Table to contain information regarding the master tables to be updated
14 --either thru concurrent job or workflow activities.
15 g_acc_refresh_desc_tbl Acc_Refresh_Desc_Tbl_Type := Acc_Refresh_Desc_Tbl_Type();
16 
17 --a null list
18 g_null_user_list asg_download.user_list;
19 
20 --g_buffer varchar(1024);
21 
22 /***
23   Function that returns debug level.
24   0 = No debug
25   1 = Log errors
26   2 = Log errors and functional messages
27   3 = Log errors, functional messages and SQL statements
28   4 = Full Debug
29 ***/
30 FUNCTION Get_Debug_Level RETURN NUMBER
31 IS
32 BEGIN
33   /*** has debug mode already been retrieved ***/
34   IF g_debug_level IS NULL THEN
35     /*** no -> get it from profile ***/
36     g_debug_level := FND_PROFILE.VALUE( 'JTM_DEBUG_LEVEL');
37   END IF;
38   RETURN g_debug_level;
39 END Get_Debug_Level;
40 
41 
42 /**
43  Paramaters:
44    mesg: The message to be logged
45 */
46 procedure pvt_log (mesg varchar2)
47 IS
48 BEGIN
49  NULL;
50 END;
51 
52 
53 /* logs messages using the JTT framework */
54 /* log_level: fnd_log.statement, fnd_log.procedure, fnd_log.event, fnd_log.exception, fnd_log.error */
55 PROCEDURE LOG(message IN VARCHAR2,
56               module IN VARCHAR2 DEFAULT 'CSM',
57               log_level IN NUMBER DEFAULT FND_LOG.LEVEL_STATEMENT)
58 IS
59 l_message VARCHAR2(4000);
60 BEGIN
61   l_message := message;
62   IF g_initialize_log = TRUE THEN
63      IF (log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
64         FND_LOG.STRING(log_level, module, l_message);
65      END IF;
66   ELSE
67      fnd_log_repository.init();
68      g_initialize_log := TRUE;
69      IF (log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
70         fnd_log.string(log_level, module, l_message);
71      END IF;
72   END IF;
73 END LOG;
74 
75 /**
76   Initializes g_acc_refresh_desc_tbl with the informatoin pertaining to
77   master tables to be updated
78   either through concurrent job or workflow activities.
79 */
80 procedure initialize_g_table_desc_tbl
81 IS
82 i NUMBER := 0;
83 BEGIN
84   IF (g_acc_refresh_desc_tbl IS NULL OR g_acc_refresh_desc_tbl.COUNT = 0) THEN
85 
86 /*    -- CSM_TXN_SUB_TYPES
87     i := i +1;
88     g_acc_refresh_desc_tbl.EXTEND;
89     g_acc_refresh_desc_tbl(i).BACKEND_TABLE_NAME    := 'CSI_IB_TXN_TYPES';
90     g_acc_refresh_desc_tbl(i).ACC_TABLE_NAME        := 'CSM_IB_TXN_TYPES_ACC';
91     g_acc_refresh_desc_tbl(i).ACC_SEQUENCE_NAME     := 'CSM_IB_TXN_TYPES_ACC_S';
92     g_acc_refresh_desc_tbl(i).PRIMARY_KEY_COLUMN    := 'SUB_TYPE_ID';
93     g_acc_refresh_desc_tbl(i).PUBLICATION_ITEM_NAME := 'CSF_M_TXN_SUB_TYPES';
94     g_acc_refresh_desc_tbl(i).ACCESS_QUERY :=
95         'select cit.sub_type_id
96          from
97            csi_ib_txn_types cit,
98            csi_source_ib_types cst,
99            csi_txn_types ctt,
100            csi_instance_statuses cis
101         where  cst.sub_type_id = cit.sub_type_id
102           and    cst.transaction_type_id = ctt.transaction_type_id
103           and    cit.src_return_reqd = ''N''
104           and    cit.non_src_reference_reqd = ''N''
105           and    ctt.source_transaction_type = ''FIELD_SERVICE_REPORT''
106           and    ctt.source_application_id = 513
107           and    cis.instance_status_id(+) = cit.src_status_id
108           and    cis.terminated_flag(+) <> ''Y''';
109 */
110 
111     --CSM_OBJECT_MAPPINGS
112     i := i +1;
113     g_acc_refresh_desc_tbl.EXTEND;
114     g_acc_refresh_desc_tbl(i).BACKEND_TABLE_NAME    := 'JTF_OBJECT_MAPPINGS';
115     g_acc_refresh_desc_tbl(i).ACC_TABLE_NAME        := 'CSM_OBJECT_MAPPINGS_ACC';
116     g_acc_refresh_desc_tbl(i).ACC_SEQUENCE_NAME     := 'CSM_OBJECT_MAPPINGS_ACC_S';
117     g_acc_refresh_desc_tbl(i).PRIMARY_KEY_COLUMN    := 'MAPPING_ID';
118     g_acc_refresh_desc_tbl(i).PUBLICATION_ITEM_NAME := 'CSF_M_OBJECT_MAPPINGS';
119     g_acc_refresh_desc_tbl(i).ACCESS_QUERY :=
120        'select jom.mapping_id
121         from jtf_object_mappings jom
122         WHERE jom.source_object_code IN (''PARTY'', ''TASK'', ''SR'', ''CP'',''OKS_COV_NOTE'',''SD'')
123         AND NVL(jom.end_date, SYSDATE) >= SYSDATE';
124 
125  END IF;
126 NULL;
127 END initialize_g_table_desc_tbl;
128 
129 
130 /**
131  Returns the record representing the information needed
132  to refresh/sync an acc table with backend
133 
134  Arguments:
135    p_acc_table_name : the ACC table name for which the refresh information
136      is to be retrieved
137 
138  Return Value: the record representing the information needed
139  to refresh/sync an acc table with backend
140  */
141 function get_Acc_Refresh_Desc_Rec(p_acc_table_name varchar2)
142 return Acc_Refresh_Desc_Rec_Type
143 IS
144 BEGIN
145 
146 FOR i IN 1 .. g_acc_refresh_desc_tbl.COUNT LOOP
147   IF (g_acc_refresh_desc_tbl(i).ACC_TABLE_NAME = p_acc_table_name) THEN
148     RETURN g_acc_refresh_desc_tbl(i);
149   END IF;
150 END LOOP;
151 
152 RAISE g_element_not_found_exception;
153 
154 END get_Acc_Refresh_Desc_Rec;
155 
156 
157 FUNCTION get_all_omfs_palm_user_list RETURN asg_download.user_list
158 IS
159 i NUMBER;
160 l_all_omfs_palm_users_list asg_download.user_list;
161 
162   CURSOR l_omfs_palm_users_csr
163   IS
164   SELECT usr.USER_ID
165   FROM   asg_user_pub_resps		pubresp
166    ,     asg_user               usr
167   WHERE  usr.enabled = 'Y'
168   AND    pubresp.user_name = usr.user_name
169   AND	 pubresp.pub_name ='SERVICEP';
170   --Cursor when data routed to owner profile is set
171   CURSOR l_route_omfs_palm_users_csr
172   IS
173   SELECT usr.USER_ID
174   FROM   asg_user_pub_resps		pubresp
175    ,     asg_user               usr
176   WHERE  usr.enabled = 'Y'
177   AND    pubresp.user_name = usr.user_name
178   AND	 pubresp.pub_name ='SERVICEP'
179   AND    usr.USER_ID = usr.OWNER_ID;
180 BEGIN
181   i := 0;
182   IF csm_profile_pkg.Get_Route_Data_To_Owner ='Y' THEN
183     FOR r_omfs_palm_users_rec IN l_route_omfs_palm_users_csr LOOP
184                   i := i + 1;
185                   l_all_omfs_palm_users_list(i) := r_omfs_palm_users_rec.user_id;
186     END LOOP;
187   ELSE
188     FOR r_omfs_palm_users_rec IN l_omfs_palm_users_csr LOOP
189                   i := i + 1;
190                   l_all_omfs_palm_users_list(i) := r_omfs_palm_users_rec.user_id;
191     END LOOP;
192   END IF;
193 
194 RETURN l_all_omfs_palm_users_list;
195 
196 END get_all_omfs_palm_user_list;
197 
198 /**
199  Returns the list containing the RESOURCE_ID of all the OMFS Palm Users
200  */
201 FUNCTION get_all_omfs_palm_res_list RETURN asg_download.user_list
202 IS
203 i NUMBER;
204 l_all_omfs_palm_resource_list asg_download.user_list;
205 
206 CURSOR l_omfs_palm_resources_csr
207 IS
208 SELECT usr.resource_id
209 FROM   asg_user_pub_resps	pubresp
210  ,     asg_user             usr
211 WHERE  usr.enabled 			= 'Y'
212 AND    pubresp.user_name 	= usr.user_name
213 AND	   pubresp.pub_name 	= 'SERVICEP';
214 
215 CURSOR l_route_omfs_palm_res_csr
216 IS
217 SELECT usr.resource_id
218 FROM   asg_user_pub_resps	pubresp
219  ,     asg_user             usr
220 WHERE  usr.enabled 			= 'Y'
221 AND    pubresp.user_name 	= usr.user_name
222 AND    pubresp.pub_name 	= 'SERVICEP'
223 AND    usr.USER_ID = usr.OWNER_ID;
224 
225 BEGIN
226   i := 0;
227   IF csm_profile_pkg.Get_Route_Data_To_Owner ='Y' THEN
228       FOR r_omfs_palm_resource_rec IN l_route_omfs_palm_res_csr LOOP
229                     i := i + 1;
230                     l_all_omfs_palm_resource_list(i) := r_omfs_palm_resource_rec.resource_id;
231       END LOOP;
232   ELSE
233       FOR r_omfs_palm_resource_rec IN l_omfs_palm_resources_csr LOOP
234                     i := i + 1;
235                     l_all_omfs_palm_resource_list(i) := r_omfs_palm_resource_rec.resource_id;
236       END LOOP;
237   END IF;
238 
239 RETURN l_all_omfs_palm_resource_list;
240 
241 END get_all_omfs_palm_res_list;
242 
243 
244 Function GetLocalTime(p_server_time date, p_userid number)
245 return date
246 is
247 v_client_timezone varchar2(100);
248 v_server_timezone varchar2(100);
249 client_time date;
250 
251 begin
252 v_client_timezone := FND_PROFILE.VALUE_SPECIFIC('HZ_CLIENT_TIMEZONE',p_userid,NULL,170);
253 
254 
255 v_server_timezone := FND_PROFILE.VALUE_SPECIFIC('HZ_SERVER_TIMEZONE',NULL,NULL,170);
256 
257 
258 if v_client_timezone is null
259 or v_server_timezone is null
260 then
261 return p_server_time;
262 
263 else
264 
265 client_time := p_server_time - (v_server_timezone - v_client_timezone);
266 
267 END if;
268 
269 return client_time;
270 
271    -- Enter further code below as specified in the Package spec.
272 END GetLocalTime;
273 
274 Function GetLocalTime(p_server_time date, p_user_name varchar2)
275 return date
276 is
277 cursor c_user_id (p_user_name varchar2)
278 is
279   select user_id
280   from asg_user
281   where user_name = p_user_name;
282 
283 l_user_id asg_user.user_id%TYPE;
284 
285 begin
286 
287 --select user_id into l_user_id
288 --from asg_user
289 --where user_name = p_user_name;
290 
291 OPEN c_user_id(p_user_name);
292 FETCH c_user_id INTO l_user_id;
293 CLOSE c_user_id;
294 
295 return GetLocalTime(p_server_time, l_user_id);
296 
297 END GetLocalTime;
298 
299 Function GetServerTime(p_client_time date, p_user_name varchar2)
300 return date
301 is
302 cursor c_user_id (p_user_name varchar2)
303 is
304   select user_id
305   from asg_user
306   where user_name = p_user_name;
307 
308 l_user_id asg_user.user_id%TYPE;
309 
310 v_client_timezone varchar2(100);
311 v_server_timezone varchar2(100);
312 l_server_time date;
313 
314 begin
315 
316 --select user_id into l_user_id
317 --from asg_user
318 --where user_name = p_user_name;
319 
320 OPEN c_user_id(p_user_name);
321 FETCH c_user_id INTO l_user_id;
322 CLOSE c_user_id;
323 
324 v_client_timezone := FND_PROFILE.VALUE_SPECIFIC('HZ_CLIENT_TIMEZONE',l_user_id,NULL,170);
325 
326 
327 v_server_timezone := FND_PROFILE.VALUE_SPECIFIC('HZ_SERVER_TIMEZONE',NULL,NULL,170);
328 
329 
330 if v_client_timezone is null
331 or v_server_timezone is null
332 then
333 return p_client_time;
334 
335 else
336 
337 l_server_time := p_client_time - (v_client_timezone - v_server_timezone);
338 
339 END if;
340 
341 return l_server_time;
342 
343 END GetServerTime;
344 
345 
346 
347 Function Get_Responsibility_ID(p_userid in number)
348 RETURN NUMBER
349 IS
350 /********************************************************
351  Name:
352    GET_RESPONSIBILITY_ID
353 
354  Purpose:
355    Get the responsibility id to determine the rule_id for
356    the state_transitions
357 
358  Arguments:
359 
360  Known Limitations:
361    - Because we check on rule_id this function is only usable
362      for jtf_state_transitions
363 
364  Notes:
365    Following rules are implemented:
366    1 ) User has no responsibility
367        - Get the profile value
368 
369    2) User has one responsibility with a matching rule_id:
370       - Use this responsibility_id
371 
372    3) User has multiple responsibilities:
373       - Check if all responsibilities have the same set of rules,
374       a) if this is the case then use one of these responsibilities,
375          when a responisibility has no rules we don't count this
376       b) if not, use the profile
377 
378 
379 ********************************************************/
380 
381   l_resp_id NUMBER;
382   l_rule_id NUMBER;
383 
384   l_cnt_resp NUMBER;
385   l_cnt_rule NUMBER;
386 
387   l_responsibility_id NUMBER;
388   l_diff BOOLEAN;
389   l_last_rec BOOLEAN;
390 
391   TYPE RULE_TABLE_TYPE IS TABLE OF NUMBER
392     INDEX BY BINARY_INTEGER;
393   RULE_TABLE RULE_TABLE_TYPE;
394 
395 CURSOR C_USER_RESP ( p_user_id NUMBER ) IS
396  SELECT RESPONSIBILITY_ID
397  FROM   FND_USER_RESP_GROUPS
398  WHERE  NVL( START_DATE , SYSDATE) <= SYSDATE
399  AND    NVL( END_DATE ,   SYSDATE) >= SYSDATE
400  AND    USER_ID = p_user_id;
401 
402 CURSOR C_STATE_RULE ( p_resp_id NUMBER ) IS
403  SELECT RULE_ID
404  FROM JTF_STATE_RESPONSIBILITIES
405  WHERE RESPONSIBILITY_ID = p_resp_id ;
406 
407 BEGIN
408   l_cnt_resp := 0;
409   l_diff := FALSE;
410   l_responsibility_id := NULL;
411   /* Fetch all responsibility ids */
412   FOR r_resp_record  IN C_USER_RESP( p_userid) LOOP
413     l_resp_id := r_resp_record.RESPONSIBILITY_ID;
414     l_cnt_resp := l_cnt_resp + 1;
415     /*Check if the responsibility has state rules*/
416     l_last_rec := FALSE;
417     l_cnt_rule := 0;
418     OPEN C_STATE_RULE( p_resp_id => l_resp_id );
419     WHILE l_diff <> TRUE AND l_last_rec <> TRUE LOOP
420       FETCH C_STATE_RULE INTO l_rule_id;
421       IF C_STATE_RULE%NOTFOUND THEN
422         l_last_rec := TRUE;
423       ELSE
424        l_cnt_rule := l_cnt_rule + 1;
425        /* Check if this is the first time we check/ fill the pl/sql table */
426        IF RULE_TABLE.EXISTS( 1 ) AND l_responsibility_id IS NOT NULL THEN
427          /* Pl/sql table already filled, compare rule id with table value */
428          /* Because we sort this is ok */
429          /* First check if our current record set isn't larger than the table record set */
430         /* RAVIR Added for loop as sort by is removed Jan 6, 2003 */
431 	FOR i in 1..l_cnt_rule LOOP
432          IF RULE_TABLE.EXISTS( i ) THEN
433            IF RULE_TABLE(i) <> l_rule_id THEN
434              /* ids are different, so use the profile */
435              l_diff := TRUE;
436            END IF;
437          --ELSE
438           -- l_diff := TRUE;
439          END IF;
440        END LOOP ;
441        ELSE
442 	 /* First time, so fill the Pl/sql table */
443          RULE_TABLE(l_cnt_rule) := l_rule_id;
444        END IF;
445       END IF;
446     END LOOP;
447     CLOSE C_STATE_RULE;
448     IF l_cnt_rule <> 0 THEN
449      /* Set l_responsibility_id, we have a valid responsibility id with state rule(s)*/
450      l_responsibility_id := l_resp_id;
451     END IF;
452   END LOOP;
453   IF l_diff = TRUE OR l_responsibility_id IS NULL THEN
454     /* No responsibility found or rules per responisibilities are different, get profileval */
455     l_responsibility_id := CSM_PROFILE_PKG.GetDefaultStatusResponsibility(p_userid);
456   END IF;
457   return l_responsibility_id;
458 END GET_RESPONSIBILITY_ID;
459 
460 
461 /*
462   Modified by :
463   Ravi Ranjan 06/19/2002:
464 
465   l_value := wf_engine.GetActivityAttrNumber(..)
466 
467   Replaced By:
468   l_value := wf_engine.GetActivityAttrText(..)
469 */
470 
471 Function MakeDirtyForUser ( p_publication_item in varchar2,
472 							p_accessList in number,  --1 access_id
473 							p_resourceList in number,  --1 user_id
474 							p_dmlList in char,
475 							p_timestamp in date)
476 return boolean
477 is
478 l_markdirty	boolean;
479 l_resourcelist number;
480 
481 cursor l_rs_resource_extns_csr (p_user_id fnd_user.user_id%type) is
482 select resource_id
483 from  jtf_rs_resource_extns
484 where user_id = p_user_id
485 AND   SYSDATE BETWEEN NVL(start_date_active, SYSDATE)
486 AND   NVL(end_date_active, SYSDATE)
487 ;
488 
489 begin
490 	 -- getthe resource_id, since make dirty requires resource_id
491 	open l_rs_resource_extns_csr(p_resourcelist);
492 	fetch l_rs_resource_extns_csr into l_resourcelist;
493 	close l_rs_resource_extns_csr;
494 	l_markdirty := asg_download.MarkDirty(p_publication_item,
495 										  p_accesslist,
496 										  l_resourcelist,
497 										  p_dmllist,
498 										  p_timestamp);
499 	return l_markdirty;
500 end;
501 
502 Function MakeDirtyForUser ( p_publication_item in varchar2,
503 							p_accessList in asg_download.access_list,
504 							p_resourceList in asg_download.user_list,
505 							p_dmlList in asg_download.dml_list,
506 							p_timestamp in date)
507 return boolean
508 is
509 l_markdirty	boolean;
510 l_resourcelist asg_download.user_list;
511 
512 cursor l_rs_resource_extns_csr (p_user_id fnd_user.user_id%type) is
513 select resource_id
514 from jtf_rs_resource_extns
515 where user_id = p_user_id
516 AND SYSDATE BETWEEN NVL(start_date_active, SYSDATE)
517 AND NVL(end_date_active, SYSDATE)
518 ;
519 
520 begin
521 
522 
523 	if p_resourcelist.count > 0 then
524 	   for l_ind in 1..p_resourcelist.count loop
525 	   	 -- getthe resource_id, since make dirty requires resource_id
526 		 	open l_rs_resource_extns_csr(p_resourcelist(l_ind));
527 			fetch l_rs_resource_extns_csr into l_resourcelist(l_ind);
528 			close l_rs_resource_extns_csr;
529 	   end loop;
530     end if;
531 
532 	l_markdirty := asg_download.MarkDirty(p_publication_item,
533 										  p_accesslist,
534 										  l_resourcelist,
535 										  p_dmllist,
536 										  p_timestamp);
537 
538 	return l_markdirty;
539 
540 end;
541 
542 
543 Function MakeDirtyForUser ( p_publication_item in varchar2,
544 							p_accessList in asg_download.access_list,
545 							p_resourceList in asg_download.user_list,
546 							p_dmlList in char,
547 							p_timestamp in date)
548 return boolean
549 is
550 l_markdirty	boolean;
551 l_resourcelist asg_download.user_list;
552 
553 cursor l_rs_resource_extns_csr (p_user_id fnd_user.user_id%type) is
554 select resource_id
555 from jtf_rs_resource_extns
556 where user_id = p_user_id
557 AND SYSDATE BETWEEN NVL(start_date_active, SYSDATE)
558 AND NVL(end_date_active, SYSDATE)
559 ;
560 
561 BEGIN
562 	if p_accesslist.count > 0 THEN
563 	   for l_ind in 1..p_resourcelist.count LOOP
564 	   	 -- getthe resource_id, since make dirty requires resource_id
565 		 	open l_rs_resource_extns_csr(p_resourcelist(l_ind));
566  			fetch l_rs_resource_extns_csr into l_resourcelist(l_ind);
567 	 		close l_rs_resource_extns_csr;
568 	   end loop;
569  end if;
570 
571 --logm('Before markdirty:' || 'pub:' || p_publication_item || 'access_id:' || p_accesslist(0) || ' ' || l_resourcelist(0) );
572 
573 IF p_accesslist.count > 0 THEN
574 	l_markdirty := asg_download.MarkDirty(p_publication_item,
575 										  p_accesslist,
576 										  l_resourcelist,
577 										  p_dmllist,
578 										  p_timestamp);
579 	return l_markdirty;
580 
581 END IF;
582 end;
583 
584 FUNCTION MakeDirtyForUser(p_publication_item in varchar2,
585 							    p_accessList in number,
586 							    p_resourceList in number,
587 							    p_dmlList in char,
588 							    p_timestamp in date,
589            p_pkvalueslist IN asg_download.pk_list)
590 RETURN BOOLEAN
591 IS
592 l_markdirty	boolean;
593 l_resourcelist number;
594 
595 cursor l_rs_resource_extns_csr (p_user_id fnd_user.user_id%type) is
596 select resource_id
597 from jtf_rs_resource_extns
598 where user_id = p_user_id
599 AND SYSDATE BETWEEN NVL(start_date_active, SYSDATE)
600 AND NVL(end_date_active, SYSDATE);
601 
602 BEGIN
603 	 -- getthe resource_id, since make dirty requires resource_id
604 	open l_rs_resource_extns_csr(p_resourcelist);
605 	fetch l_rs_resource_extns_csr into l_resourcelist;
606 	close l_rs_resource_extns_csr;
607 
608 	l_markdirty := asg_download.MarkDirty(p_publication_item,
609 										  p_accesslist,
610 										  l_resourcelist,
611 										  p_dmllist,
612 										  p_timestamp,
613             p_pkvalueslist);
614 	return l_markdirty;
615 
616 END MakeDirtyForUser;
617 
618 
619 Function MakeDirtyForResource ( p_publication_item in varchar2,
620 							    p_accessList in asg_download.access_list,
621 							    p_resourceList in asg_download.user_list,
622 							    p_dmlList in char,
623 							    p_timestamp in date)
624 return boolean
625 is
626 l_markdirty	boolean;
627 
628 begin
629 
630 	l_markdirty := asg_download.MarkDirty(p_publication_item,
631 										  p_accesslist,
632 										  p_resourcelist,
633 										  p_dmllist,
634 										  p_timestamp);
635 	return l_markdirty;
636 
637 end MakeDirtyForResource;
638 
639 Function MakeDirtyForResource ( p_publication_item in varchar2,
640 							    p_accessList in number,
641 							    p_resourceList in number,
642 							    p_dmlList in char,
643 							    p_timestamp in date)
644 return boolean
645 is
646 l_markdirty	boolean;
647 
648 begin
649 
650 	l_markdirty := asg_download.MarkDirty(p_publication_item,
651 										  p_accesslist,
652 										  p_resourcelist,
653 										  p_dmllist,
654 										  p_timestamp);
655 	return l_markdirty;
656 
657 end MakeDirtyForResource;
658 
659 FUNCTION MakeDirtyForResource(p_publication_item in varchar2,
660 							    p_accessList in number,
661 							    p_resourceList in number,
662 							    p_dmlList in char,
663 							    p_timestamp in date,
664            p_pkvalueslist IN asg_download.pk_list)
665 RETURN BOOLEAN
666 IS
667 l_markdirty	boolean;
668 
669 BEGIN
670 	l_markdirty := asg_download.MarkDirty(p_publication_item,
671 										  p_accesslist,
672 										  p_resourcelist,
673 										  p_dmllist,
674 										  p_timestamp,
675             p_pkvalueslist);
676 
677  	return l_markdirty;
678 
679 END MakeDirtyForResource;
680 
681 
682 FUNCTION GetAsgDmlConstant( p_dml in char)
683 return char
684 is
685 /********************************************************
686  Name:
687    GetAsgDmlConstant
688 
689  Purpose:
690    Converts the DML constants defined in Workflows to the ones
691    understood by ASG. Presently, both the constant sets are same.
692 
693  Arguments:
694    p_dml: DML constant defined in WorkFlow
695 
696  Returns:
697    DML constant understood by ASG
698 
699  Exceptions:
700    g_invalid_argument_exception:
701      In case the passed parameter dml type is not in ('I', 'U', 'D')
702 
703 *********************************************************/
704 begin
705   --convert the passed parameter to one of the ASG constants
706   if (p_dml = 'I') then
707       return ASG_DOWNLOAD.INS;
708   elsif (p_dml = 'U') then
709       return ASG_DOWNLOAD.UPD;
710   elsif (p_dml = 'D') then
711       return ASG_DOWNLOAD.DEL;
712   --In case the passed parameter dml type is not in ('I', 'U', 'D')
713   --throw invalid argument exception
714   else raise g_invalid_argument_exception;
715   end if;
716 end;
717 
718 /**
719 *  Check if the passed resource is a palm resource
720 */
721 
722 FUNCTION is_palm_resource(p_resource_id IN NUMBER)
723 RETURN BOOLEAN
724 IS
725 CURSOR l_is_palm_resource_csr(p_resource_id IN jtf_rs_resource_extns.resource_id%TYPE)
726 IS--R12 on multiple responsibility
727 SELECT 1
728 FROM   asg_user_pub_resps	pubresp
729  ,     asg_user             usr
730 WHERE  usr.enabled 			= 'Y'
731 AND    pubresp.user_name 	= usr.user_name
732 AND	   pubresp.pub_name 	= 'SERVICEP'
733 AND    usr.resource_id 		= p_resource_id;
734 
735 /*CURSOR l_is_palm_resource_csr(p_resource_id IN jtf_rs_resource_extns.resource_id%type)
736 IS
737   select  fnd_user_resp.user_id
738   from    asg_pub_responsibility   asg_resp,
739           asg_pub,
740           fnd_user_resp_groups  fnd_user_resp,
741           fnd_application  fnd_app,
742           jtf_rs_resource_extns  res
743   where   asg_resp.pub_id = asg_pub.pub_id
744   and     asg_pub.name = 'SERVICEP'
745   and     asg_resp.responsibility_id =  fnd_user_resp.responsibility_id
746   and     fnd_app.application_id = fnd_user_resp.responsibility_application_id
747   and     fnd_user_resp.user_id = res.user_id
748   AND     SYSDATE BETWEEN nvl(fnd_user_resp.start_date, sysdate) AND nvl(fnd_user_resp.end_date, sysdate)
749   and     fnd_app.application_short_name = 'CSM'
750   and     res.resource_id = p_resource_id;
751 */
752 l_is_palm_resource_rec l_is_palm_resource_csr%ROWTYPE;
753 
754 BEGIN
755    OPEN l_is_palm_resource_csr(p_resource_id);
756    FETCH l_is_palm_resource_csr INTO l_is_palm_resource_rec;
757    IF l_is_palm_resource_csr%FOUND THEN
758       CLOSE l_is_palm_resource_csr;
759       RETURN TRUE;
760    ELSE
761       CLOSE l_is_palm_resource_csr;
762       RETURN FALSE;
763    END IF;
764 
765 EXCEPTION
766   WHEN OTHERS THEN
767    IF l_is_palm_resource_csr%ISOPEN THEN
768       CLOSE l_is_palm_resource_csr;
769    END IF;
770 END is_palm_resource;
771 
772 FUNCTION is_palm_user(p_user_id IN NUMBER)
773 RETURN BOOLEAN
774 IS
775 CURSOR l_responsibilities_csr (b_user_id NUMBER)--R12 For multiple responsibility
776 IS
777 SELECT 1
778 FROM   asg_user_pub_resps	pubresp
779  ,     asg_user             usr
780 WHERE  usr.enabled 			= 'Y'
781 AND    pubresp.user_name 	= usr.user_name
782 AND	   pubresp.pub_name 	= 'SERVICEP'
783 AND    usr.user_id 			= b_user_id;
784 
785 
786 /*  cursor l_responsibilities_csr (b_user_id number) is
787     select    fnd_user_resp.user_id
788     from    asg_pub_responsibility   asg_resp,
789           asg_pub,
790           fnd_user_resp_groups  fnd_user_resp,
791           fnd_application  fnd_app
792     where   asg_resp.pub_id = asg_pub.pub_id
793       and     asg_pub.name = 'SERVICEP'
794       and     asg_resp.responsibility_id =  fnd_user_resp.responsibility_id
795       and     fnd_app.application_id = fnd_user_resp.responsibility_application_id
796       and     fnd_app.application_short_name = 'CSM'
797       and     fnd_user_resp.user_id = p_user_id
798       AND     SYSDATE BETWEEN nvl(fnd_user_resp.start_date, sysdate) AND nvl(fnd_user_resp.end_date, sysdate)
799   ;
800 */
801   l_responsibilities_rec l_responsibilities_csr%ROWTYPE;
802 BEGIN
803     open l_responsibilities_csr (p_user_id);
804     fetch l_responsibilities_csr into l_responsibilities_rec;
805     if (l_responsibilities_csr%notfound) then
806       close l_responsibilities_csr;
807       RETURN FALSE;
808     else --intersection is non-void
809       close l_responsibilities_csr;
810       RETURN TRUE;
811     end if;
812     --close the cursor
813 EXCEPTION
814    WHEN OTHERS THEN
815      --close the cursor if open
816      if (l_responsibilities_csr%isopen) then
817        close l_responsibilities_csr;
818      end if;
819      RAISE;
820 END is_palm_user;
821 
822 function get_tl_omfs_palm_users(p_language varchar2)
823   return asg_download.user_list
824 AS
825 
826 l_tl_omfs_palm_users_list asg_download.user_list;
827 i NUMBER;
828 
829 CURSOR l_tl_omfs_palm_users_csr is
830 --R12 For multiple responsibility
831    select usr.USER_ID
832    FROM  asg_user_pub_resps		pubresp
833    ,     asg_user               usr
834    WHERE usr.LANGUAGE = p_language
835    AND   usr.enabled = 'Y'
836    AND   pubresp.user_name = usr.user_name
837    AND	 pubresp.pub_name ='SERVICEP';
838 
839 CURSOR l_route_tl_omfs_palm_users_csr is
840 --R12 For multiple responsibility
841    select usr.USER_ID
842    FROM  asg_user_pub_resps		pubresp
843    ,     asg_user               usr
844    WHERE usr.LANGUAGE = p_language
845    AND   usr.enabled = 'Y'
846    AND   pubresp.user_name = usr.user_name
847    AND	 pubresp.pub_name ='SERVICEP'
848    AND   usr.USER_ID = usr.OWNER_ID;
849 BEGIN
850   i := 0;
851   IF csm_profile_pkg.Get_Route_Data_To_Owner ='Y' THEN
852       FOR r_tl_omfs_palm_users_rec in l_route_tl_omfs_palm_users_csr LOOP
853                     i := i + 1;
854                     l_tl_omfs_palm_users_list(i) := r_tl_omfs_palm_users_rec.user_id;
855       END LOOP;
856   ELSE
857       FOR r_tl_omfs_palm_users_rec in l_tl_omfs_palm_users_csr LOOP
858                     i := i + 1;
859                     l_tl_omfs_palm_users_list(i) := r_tl_omfs_palm_users_rec.user_id;
860       END LOOP;
861   END IF;
862   return l_tl_omfs_palm_users_list;
863 
864 END get_tl_omfs_palm_users;
865 
866 function get_tl_omfs_palm_resources(p_language varchar2)
867   return asg_download.user_list
868 AS
869 
870 l_tl_omfs_palm_resource_list asg_download.user_list;
871 i NUMBER;
872 
873 CURSOR l_tl_omfs_palm_resources_csr is
874 --R12 For multiple responsibility
875    select usr.RESOURCE_ID
876    FROM  asg_user_pub_resps		pubresp
877    ,     asg_user               usr
878    WHERE usr.LANGUAGE = p_language
879    AND   usr.enabled = 'Y'
880    AND   pubresp.user_name = usr.user_name
881    AND	 pubresp.pub_name ='SERVICEP';
882 
883 CURSOR l_route_tl_omfs_palm_res_csr is
884 --R12 For multiple responsibility
885    select usr.RESOURCE_ID
886    FROM  asg_user_pub_resps		pubresp
887    ,     asg_user               usr
888    WHERE usr.LANGUAGE = p_language
889    AND   usr.enabled = 'Y'
890    AND   pubresp.user_name = usr.user_name
891    AND	 pubresp.pub_name ='SERVICEP'
892    AND   usr.USER_ID = usr.OWNER_ID;
893 BEGIN
894   i := 0;
895   IF csm_profile_pkg.Get_Route_Data_To_Owner ='Y' THEN
896       FOR r_tl_omfs_palm_resource_rec in l_route_tl_omfs_palm_res_csr LOOP
897                     i := i + 1;
898                     l_tl_omfs_palm_resource_list(i) := r_tl_omfs_palm_resource_rec.resource_id;
899       END LOOP;
900   ELSE
901       FOR r_tl_omfs_palm_resource_rec in l_tl_omfs_palm_resources_csr LOOP
902                     i := i + 1;
903                     l_tl_omfs_palm_resource_list(i) := r_tl_omfs_palm_resource_rec.resource_id;
904       END LOOP;
905   END IF;
906 
907   return l_tl_omfs_palm_resource_list;
908 
909 END get_tl_omfs_palm_resources;
910 
911 /* get language for the specified user_id */
912 FUNCTION get_user_language(p_user_id IN NUMBER)
913 return VARCHAR2
914 IS
915 CURSOR c_language_csr(p_user_id number) IS
916 SELECT language
917 FROM asg_user
918 WHERE user_id = p_user_id;
919 
920 l_language asg_user.language%TYPE;
921 
922 BEGIN
923    OPEN c_language_csr(p_user_id);
924    FETCH c_language_csr INTO l_language;
925    CLOSE c_language_csr;
926 
927    RETURN l_language;
928 
929 END get_user_language;
930 
931 FUNCTION get_user_name(p_user_id IN number)
932 RETURN varchar2
933 IS
934 l_user_name asg_user.user_name%TYPE;
935 
936 CURSOR l_get_user_name(p_user_id IN number)
937 IS
938 SELECT user_name
939 FROM asg_user
940 WHERE user_id = p_user_id;
941 
942 BEGIN
943   OPEN l_get_user_name(p_user_id);
944   FETCH l_get_user_name INTO l_user_name;
945   CLOSE l_get_user_name;
946 
947   RETURN l_user_name;
948 END get_user_name;
949 
950 /**
951    Refreshes the specified application level ACC tables
952    Also adds the entries in the System Dirty Queue for all the
953    OMFS Palm users if the entry gets updated, deleted or inserted in the ACC table
954 */
955 PROCEDURE refresh_app_level_acc (
956   p_backend_table_name varchar2,
957   p_primary_key_column varchar2,
958   p_acc_table_name varchar2,
959   p_acc_sequence_name varchar2,
960   p_tl_table_name varchar2,
961   p_publication_item_name varchar2,
962   p_access_query varchar2,
963   p_primary_key_value number)
964 
965 IS
966 l_access_id number;
967 l_pk_value  number;
968 l_last_update_date date;
969 l_prev_language varchar2(24);
970 l_language varchar2(24);
971 
972 l_sqlerrno varchar2(20);
973 l_sqlerrmsg varchar2(2000);
974 l_acc_table_name varchar2(30);
975 l_acc_sequence_name varchar2(50);
976 l_backend_table_name varchar2(30);
977 l_tl_table_name varchar2(30);
978 l_primary_key_column varchar2(30);
979 l_publication_item_name varchar2(30);
980 l_access_query varchar2(2048);
981 l_primary_key_value number;
982 
983 l_dsql varchar2(2048);
984 l_upd_dsql varchar2(1024);
985 l_cursorid NUMBER;
986 l_result NUMBER;
987 
988 l_changed_records_cur Changed_Records_Cur_Type;
989 
990 l_tl_omfs_palm_resource_list asg_download.user_list;
991 l_all_omfs_palm_resource_list asg_download.user_list;
992 --contains the same access ID n times (where n = number of users for which
993 --to insert into SDQ)
994 l_single_access_id_list asg_download.access_list;
995 --a null list
996 l_null_access_list asg_download.access_list;
997 
998 i NUMBER;
999 l_mark_dirty BOOLEAN;
1000 
1001 begin --refresh_app_level_acc
1002     l_backend_table_name    := p_backend_table_name;
1003     l_primary_key_column    := p_primary_key_column;
1004     l_acc_table_name        := p_acc_table_name;
1005     l_acc_sequence_name     := p_acc_sequence_name;
1006     l_tl_table_name         := p_tl_table_name;
1007     l_publication_item_name := p_publication_item_name;
1008     l_access_query          := p_access_query;
1009     l_primary_key_value     := p_primary_key_value;
1010 
1011     --initialize the list of all omfs palm resources
1012     l_all_omfs_palm_resource_list := get_all_omfs_palm_res_list;
1013 
1014 
1015     /********** DELETES *****************/
1016    --Delete deleted entries in backend from the ACC
1017 
1018  IF l_primary_key_value IS NULL THEN
1019    -- Mark Dirty 'D' the SDQ
1020     l_dsql :=
1021          ' SELECT access_id '
1022       ||   ' FROM '
1023       ||   l_acc_table_name
1024       ||   ' WHERE '
1025       ||       l_primary_key_column
1026       ||       ' not in ( '
1027       ||           l_access_query
1028       ||   ' )';
1029 
1030       open l_changed_records_cur for l_dsql;
1031 
1032       LOOP
1033         FETCH l_changed_records_cur INTO l_access_id;
1034         EXIT WHEN l_changed_records_cur%NOTFOUND;
1035         -- process data record
1036         --add for all the users into the SDQ
1037         --nullify the access list
1038         l_single_access_id_list := l_null_access_list;
1039         i := 0;
1040 
1041         FOR i in 1 .. l_all_omfs_palm_resource_list.COUNT LOOP
1042           l_single_access_id_list(i) := l_access_id;
1043         END LOOP;
1044         --mark dirty the SDQ
1045         l_mark_dirty := MakeDirtyForResource(l_publication_item_name,
1046                          l_single_access_id_list,
1047                          l_all_omfs_palm_resource_list,
1048                          ASG_DOWNLOAD.DEL,
1049                          sysdate);
1050       END LOOP;
1051 
1052 
1053    --generate the sql for deleting removed values from ACC table
1054    l_dsql :=
1055          'DELETE FROM '
1056       || l_acc_table_name
1057       || ' WHERE access_id '
1058       || ' IN
1059          ( '
1060       || l_dsql
1061       ||   ' )';
1062 
1063    --open database cursor
1064    l_cursorid := DBMS_SQL.open_cursor;
1065    --parse and execute the sql
1066    DBMS_SQL.parse(l_cursorid, l_dsql, DBMS_SQL.v7);
1067    l_result := DBMS_SQL.execute(l_cursorid);
1068    DBMS_SQL.close_cursor (l_cursorid);
1069 
1070  END IF;   --END l_primary_key_value IS NULL (for delete case)
1071 
1072    /********** END DELETES **************/
1073 
1074 
1075    /******* UPDATES *********/
1076    -- a) Updates to non TL table
1077 
1078    l_dsql :=
1079          ' SELECT '
1080       ||   ' acc.access_id'
1081       ||   ' AS ACCESS_ID, b.'
1082       ||     l_primary_key_column
1083       ||     ' , b.LAST_UPDATE_DATE
1084            FROM '
1085       ||     l_backend_table_name
1086       ||   ' b ,'
1087       ||     l_acc_table_name
1088       ||   ' acc
1089            WHERE
1090               b.'
1091       ||      l_primary_key_column
1092       ||    ' = acc.'
1093       ||      l_primary_key_column
1094       ||    ' AND
1095               b.LAST_UPDATE_DATE > acc.LAST_UPDATE_DATE'
1096       ;
1097 
1098      IF l_primary_key_value IS NOT NULL THEN
1099         l_dsql := l_dsql || ' AND b.' ||  l_primary_key_column || ' = '
1100             || l_primary_key_value;
1101      END IF;
1102 
1103       open l_changed_records_cur for l_dsql;
1104 
1105       LOOP
1106         FETCH l_changed_records_cur INTO l_access_id, l_pk_value, l_last_update_date;
1107         EXIT WHEN l_changed_records_cur%NOTFOUND;
1108         -- process data record
1109         --get the users with this language
1110         l_tl_omfs_palm_resource_list := get_tl_omfs_palm_resources(l_language);
1111 
1112         --add for all the users into the SDQ
1113         --nullify the access list
1114         l_single_access_id_list := l_null_access_list;
1115 
1116         FOR i in 1 .. l_all_omfs_palm_resource_list.COUNT LOOP
1117           l_single_access_id_list(i) := l_access_id;
1118         END LOOP;
1119         --mark dirty the SDQ
1120         l_mark_dirty := MakeDirtyForResource(l_publication_item_name,
1121                          l_single_access_id_list,
1122                          l_all_omfs_palm_resource_list,
1123                          ASG_DOWNLOAD.UPD,
1124                          sysdate);
1125 
1126         --update the ACC table
1127         l_upd_dsql := 'UPDATE ' || l_acc_table_name
1128             || ' SET LAST_UPDATE_DATE = (SELECT LAST_UPDATE_DATE FROM '
1129             || l_backend_table_name
1130             || ' WHERE ' || l_primary_key_column || ' = ' || l_pk_value
1131             || '), LAST_UPDATED_BY = fnd_global.user_id WHERE '
1132             ||  ' access_id  = ' || l_access_id;
1133 
1134         --open database cursor
1135         l_cursorid := DBMS_SQL.open_cursor;
1136         --parse and execute the sql
1137         DBMS_SQL.parse(l_cursorid, l_upd_dsql, DBMS_SQL.v7);
1138         l_result := DBMS_SQL.execute(l_cursorid);
1139         DBMS_SQL.close_cursor (l_cursorid);
1140 
1141       END LOOP;
1142     -- END Updates to non TL table
1143 
1144 
1145    -- b) Updates to TL table
1146 
1147    IF ( l_tl_table_name IS NOT NULL ) THEN
1148 
1149      l_dsql :=
1150          ' SELECT acc.access_id, '
1151       ||   ' b.'
1152       ||     l_primary_key_column
1153       ||   ' , b.LAST_UPDATE_DATE, b.LANGUAGE
1154            FROM '
1155       ||     l_tl_table_name
1156       ||   ' b ,'
1157       ||     l_acc_table_name
1158       ||   ' acc
1159            WHERE
1160               b.'
1161       ||      l_primary_key_column
1162       ||    ' = acc.'
1163       ||      l_primary_key_column
1164       ||    ' AND
1165               b.LAST_UPDATE_DATE > acc.LAST_UPDATE_DATE'
1166       ;
1167 
1168       IF l_primary_key_value IS NOT NULL THEN
1169         l_dsql := l_dsql || ' AND b.' ||  l_primary_key_column || ' = '
1170             || l_primary_key_value;
1171       END IF;
1172 
1173       open l_changed_records_cur for l_dsql;
1174 
1175       LOOP
1176         FETCH l_changed_records_cur INTO l_access_id, l_pk_value, l_last_update_date, l_language;
1177         EXIT WHEN l_changed_records_cur%NOTFOUND;
1178         -- process data record
1179         --add for the users with same language as the language in TL into the SDQ
1180         l_tl_omfs_palm_resource_list := get_tl_omfs_palm_resources (l_language);
1181         --nullify the access list
1182         l_single_access_id_list := l_null_access_list;
1183         FOR i in 1 .. l_tl_omfs_palm_resource_list.COUNT LOOP
1184           l_single_access_id_list(i) := l_access_id;
1185         END LOOP;
1186         --mark dirty the SDQ
1187         l_mark_dirty := MakeDirtyForResource(l_publication_item_name,
1188                          l_single_access_id_list,
1189                          l_tl_omfs_palm_resource_list,
1190                          ASG_DOWNLOAD.UPD,
1191                          sysdate);
1192 
1193         --update the ACC table
1194         l_upd_dsql := 'UPDATE ' || l_acc_table_name
1195             || ' SET LAST_UPDATE_DATE = (SELECT LAST_UPDATE_DATE FROM '
1196             || l_tl_table_name
1197             || ' WHERE ' || l_primary_key_column || ' = ' || l_pk_value
1198             || '), LAST_UPDATED_BY = fnd_global.user_id WHERE '
1199             || ' access_id = ' || l_access_id;
1200 
1201         --open database cursor
1202         l_cursorid := DBMS_SQL.open_cursor;
1203         --parse and execute the sql
1204         DBMS_SQL.parse(l_cursorid, l_upd_dsql, DBMS_SQL.v7);
1205         l_result := DBMS_SQL.execute(l_cursorid);
1206         DBMS_SQL.close_cursor (l_cursorid);
1207 
1208       END LOOP;
1209 
1210    END IF; --END IF l_tl_table_name is not null
1211 
1212    /******* END UPDATES ****/
1213 
1214    /******* INSERTS *******/
1215     --Insert new entries in backend to the SDQ and ACC
1216 
1217     -- Mark Dirty 'I' the SDQ
1218     l_dsql :=
1219          ' SELECT '
1220       ||     l_acc_sequence_name || '.nextval, '
1221       ||     l_primary_key_column
1222       ||   ' FROM '
1223       ||       l_backend_table_name
1224       ||   ' WHERE '
1225       ||       l_primary_key_column
1226       ||       ' in ( '
1227       ||       l_access_query
1228       ||       ' ) AND '
1229       ||       l_primary_key_column
1230       ||       ' not in
1231                ( SELECT '
1232       ||           l_primary_key_column
1233       ||       ' FROM '
1234       ||           l_acc_table_name
1235       ||   ' )';
1236 
1237 
1238       IF l_primary_key_value IS NOT NULL THEN
1239         l_dsql := l_dsql || ' AND ' ||  l_primary_key_column || ' = '
1240             || l_primary_key_value;
1241      END IF;
1242 
1243       open l_changed_records_cur for l_dsql;
1244 
1245       LOOP
1246         FETCH l_changed_records_cur INTO l_access_id, l_pk_value;
1247         EXIT WHEN l_changed_records_cur%NOTFOUND;
1248         -- process data record
1249         --add for all the users into the SDQ
1250         --nullify the access list
1251         l_single_access_id_list := l_null_access_list;
1252         i := 0;
1253         FOR i in 1 .. l_all_omfs_palm_resource_list.COUNT LOOP
1254           l_single_access_id_list(i) := l_access_id;
1255         END LOOP;
1256 
1257         --mark dirty the SDQ
1258         l_mark_dirty := MakeDirtyForResource(
1259             p_publication_item     => l_publication_item_name,
1260             p_accessList           => l_single_access_id_list,
1261             p_resourceList         => l_all_omfs_palm_resource_list,
1262             p_dmlList             => ASG_DOWNLOAD.INS,
1263             p_timestamp            => sysdate);
1264 
1265     --generate the sql for inserting new values into ACC table
1266     l_dsql :=
1267          'INSERT INTO '
1268       || l_acc_table_name
1269       || ' ( access_id, '
1270       || l_primary_key_column
1271       || ', CREATED_BY,
1272             CREATION_DATE,
1273             LAST_UPDATED_BY,
1274             LAST_UPDATE_DATE,
1275             LAST_UPDATE_LOGIN)
1276          SELECT ' || l_access_id || ', b.'
1277       ||   l_primary_key_column
1278       ||   ', fnd_global.user_id,
1279            sysdate,
1280            fnd_global.user_id,
1281            NVL(b.LAST_UPDATE_DATE, sysdate),
1282            fnd_global.user_id
1283          FROM '
1284       ||   l_backend_table_name
1285       ||   ' b '
1286       ||   ' WHERE '
1287       ||       l_primary_key_column
1288       ||       ' = '
1289       ||       l_pk_value
1290       ||       ' AND '
1291       ||       l_primary_key_column
1292       ||       ' not in
1293                ( SELECT '
1294       ||           l_primary_key_column
1295       ||       ' FROM '
1296       ||           l_acc_table_name
1297       ||   ' )';
1298 
1299 
1300      IF l_primary_key_value IS NOT NULL THEN
1301         l_dsql := l_dsql || ' AND ' ||  l_primary_key_column || ' = '
1302             || l_primary_key_value;
1303      END IF;
1304 
1305    --open database cursor
1306    l_cursorid := DBMS_SQL.open_cursor;
1307    --parse and execute the sql
1308    DBMS_SQL.parse(l_cursorid, l_dsql, DBMS_SQL.v7);
1309    l_result := DBMS_SQL.execute(l_cursorid);
1310    DBMS_SQL.close_cursor (l_cursorid);
1311 
1312    /********** END INSERTS **************/
1313 
1314    END LOOP;
1315 
1316    EXCEPTION
1317     WHEN others THEN
1318       l_sqlerrno := to_char(SQLCODE);
1319       l_sqlerrmsg := substr(SQLERRM, 1,2000);
1320       csm_util_pkg.log('Error in refresh_app_level_acc:' || l_sqlerrno || ':' ||  l_sqlerrmsg);
1321 END refresh_app_level_acc;
1322 
1323 /**
1324    Refreshes all the application level ACC tables
1325    Also adds the entries in the System Dirty Queue for all the
1326    OMFS Palm users if the entry gets updated, deleted or inserted in the ACC table
1327 */
1328 PROCEDURE refresh_all_app_level_acc(p_status OUT NOCOPY VARCHAR2,
1329                        p_message OUT NOCOPY VARCHAR2)
1330 IS
1331 PRAGMA AUTONOMOUS_TRANSACTION;
1332 l_sqlerrno varchar2(20);
1333 l_sqlerrmsg varchar2(2000);
1334 l_dummy number;
1335 l_last_run_date date;
1336 
1337 CURSOR l_upd_last_run_date_csr
1338 IS
1339 SELECT 1
1340 FROM jtm_con_request_data
1341 WHERE product_code = 'CSM'
1342 AND package_name = 'CSM_UTIL_PKG'
1343 AND procedure_name = 'REFRESH_ALL_APP_LEVEL_ACC'
1344 FOR UPDATE OF last_run_date NOWAIT
1345 ;
1346 
1347 BEGIN
1348   l_last_run_date := SYSDATE;
1349   --initialize the table information descriptions
1350   initialize_g_table_desc_tbl;
1351 
1352   --iterate over all the tables to be refreshed
1353   FOR i in 1 .. g_acc_refresh_desc_tbl.COUNT LOOP
1354     refresh_app_level_acc (
1355       p_backend_table_name => g_acc_refresh_desc_tbl(i).BACKEND_TABLE_NAME,
1356       p_primary_key_column => g_acc_refresh_desc_tbl(i).PRIMARY_KEY_COLUMN,
1357       p_acc_table_name => g_acc_refresh_desc_tbl(i).ACC_TABLE_NAME,
1358       p_acc_sequence_name => g_acc_refresh_desc_tbl(i).ACC_SEQUENCE_NAME,
1359       p_tl_table_name => g_acc_refresh_desc_tbl(i).TL_TABLE_NAME,
1360       p_publication_item_name => g_acc_refresh_desc_tbl(i).PUBLICATION_ITEM_NAME,
1361       p_access_query => g_acc_refresh_desc_tbl(i).ACCESS_QUERY,
1362       p_primary_key_value => null
1363       );
1364   END LOOP;
1365 
1366   -- update last_run_date
1367   OPEN l_upd_last_run_date_csr;
1368   FETCH l_upd_last_run_date_csr INTO l_dummy;
1369   IF l_upd_last_run_date_csr%FOUND THEN
1370     UPDATE jtm_con_request_data
1371     SET last_run_date = l_last_run_date
1372     WHERE CURRENT OF l_upd_last_run_date_csr;
1373   END IF;
1374   CLOSE l_upd_last_run_date_csr;
1375 
1376  COMMIT;
1377 
1378   p_status := 'FINE';
1379   p_message :=  'CSM_UTIL_PKG.refresh_all_app_level_acc Executed successfully';
1380 
1381  EXCEPTION
1382   WHEN others THEN
1383      l_sqlerrno := to_char(SQLCODE);
1384      l_sqlerrmsg := substr(SQLERRM, 1,2000);
1385      p_status := 'ERROR';
1386      p_message :=  'Error in CSM_UTIL_PKG.refresh_all_app_level_acc :' || l_sqlerrno || ':' || l_sqlerrmsg;
1387      ROLLBACK;
1388      csm_util_pkg.log('CSM_UTIL_PKG.REFRESH_ALL_APP_LEVEL_ACC ERROR : ' || l_sqlerrno || ':' || l_sqlerrmsg);
1389 END refresh_all_app_level_acc;
1390 
1391 /***
1392   This function returns a translated error message string. If p_api_error is FALSE, it gets
1393   message with MESSAGE_NAME = p_message from FND_NEW_MESSAGES and replaces any tokens with
1394   the supplied token values. If p_api_error is TRUE, it just returns the api error in the
1395   FND_MSG_PUB message stack.
1396 ***/
1397 FUNCTION GET_ERROR_MESSAGE_TEXT
1398          (
1399            p_api_error      IN BOOLEAN  DEFAULT FALSE
1400          , p_message        IN FND_NEW_MESSAGES.MESSAGE_NAME%TYPE DEFAULT NULL
1401          , p_token_name1    IN VARCHAR2 DEFAULT NULL
1402          , p_token_value1   IN VARCHAR2 DEFAULT NULL
1403          , p_token_name2    IN VARCHAR2 DEFAULT NULL
1404          , p_token_value2   IN VARCHAR2 DEFAULT NULL
1405          , p_token_name3    IN VARCHAR2 DEFAULT NULL
1406          , p_token_value3   IN VARCHAR2 DEFAULT NULL
1407          )
1408 RETURN VARCHAR2 IS
1409   l_fnd_message VARCHAR2(4000);
1410   l_counter     NUMBER;
1411   l_msg_data    VARCHAR2(2000);
1412   l_msg_dummy   NUMBER;
1413 BEGIN
1414   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1415     log ( 'CSM_UTIL_PKG.Get_error_message_text' );
1416   END IF;
1417 
1418   /*** Is this an API error? ***/
1419   IF NOT p_api_error THEN
1420     /*** no -> retrieve error message p_message and replace tokens ***/
1421     FND_MESSAGE.Set_Name
1422       ( application => 'CSL'
1423       , name        => p_message
1424       );
1425     IF p_token_name1 IS NOT NULL
1426     THEN
1427      FND_MESSAGE.Set_Token
1428        ( token => p_token_name1
1429        , value => p_token_value1
1430        );
1431     END IF;
1432     IF p_token_name2 IS NOT NULL
1433     THEN
1434       FND_MESSAGE.Set_Token
1435         ( token => p_token_name2
1436         , value => p_token_value2
1437         );
1438     END IF;
1439     IF p_token_name3 IS NOT NULL
1440     THEN
1441      FND_MESSAGE.Set_Token
1442        ( token => p_token_name3
1443        , value => p_token_value3
1444        );
1445     END IF;
1446 
1447     l_fnd_message := FND_MESSAGE.Get;
1448   ELSE
1449     /*** API error -> retrieve error from message stack ***/
1450     IF FND_MSG_PUB.Count_Msg > 0 THEN
1451       FND_MSG_PUB.Get
1452         ( p_msg_index     => 1
1453         , p_encoded       => FND_API.G_FALSE
1454         , p_data          => l_msg_data
1455         , p_msg_index_out => l_msg_dummy
1456         );
1457       l_fnd_message := l_msg_data;
1458       FOR l_counter
1459       IN 2 .. FND_MSG_PUB.Count_Msg
1460       LOOP
1461         FND_MSG_PUB.Get
1462           ( p_msg_index     => l_counter
1463           , p_encoded       => FND_API.G_FALSE
1464           , p_data          => l_msg_data
1465           , p_msg_index_out => l_msg_dummy
1466           );
1467         l_fnd_message := l_fnd_message || FND_GLOBAL.Newline || l_msg_data;
1468       END LOOP;
1469     END IF;
1470   END IF;
1471 
1472   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1473     log
1474     ( 'Leaving CSM_UTIL_PKG.Get_error_message_text'
1475     );
1476   END IF;
1477   RETURN l_fnd_message;
1478 EXCEPTION WHEN OTHERS THEN
1479 
1480   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1481     log
1482     ( 'Exception occurred in CSM_UTIL_PKG.Get_error_message_text:' || ' ' || sqlerrm);
1483   END IF;
1484 
1485   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1486     log
1487     ( 'Leaving CSM_UTIL_PKG.Get_error_message_text');
1488   END IF;
1489 
1490   RETURN l_fnd_message;
1491 END GET_ERROR_MESSAGE_TEXT;
1492 
1493 /***
1494   This procedure is called by APPLY_CLIENT_CHANGES wrapper procedure when a record was successfully
1495   applied and needs to be deleted from the in-queue.
1496 ***/
1497 PROCEDURE DELETE_RECORD
1498          (
1499            p_user_name     IN VARCHAR2,
1500            p_tranid        IN NUMBER,
1501            p_seqno         IN NUMBER,
1502            p_pk            IN VARCHAR2,
1503            p_object_name   IN VARCHAR2,
1504            p_pub_name      IN VARCHAR2,
1505            p_error_msg     OUT NOCOPY VARCHAR2,
1506            x_return_status IN OUT NOCOPY VARCHAR2
1507          ) IS
1508 BEGIN
1509   x_return_status := FND_API.G_RET_STS_SUCCESS;
1510 
1511   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1512     log
1513     ( 'Entering  DELETE_RECORD');
1514   END IF;
1515 
1516   asg_apply.delete_row(p_user_name,
1517                        p_tranid,
1518                        p_pub_name,
1519                        p_seqno,
1520                        x_return_status);
1521 
1522   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1523     /*** error occurred ***/
1524     fnd_msg_pub.Add_Exc_Msg( g_object_name, 'DELETE_RECORD', 'Unknown error');
1525     p_error_msg := GET_ERROR_MESSAGE_TEXT
1526       (
1527         p_api_error      => TRUE
1528       );
1529   END IF;
1530 
1531   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1532     log
1533     (  'Leaving DELETE_RECORD');
1534   END IF;
1535 
1536 EXCEPTION WHEN OTHERS THEN
1537   IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1538     log
1539     ( 'Exception occurred in DELETE_RECORD:' || ' ' || sqlerrm);
1540   END IF;
1541 
1542   fnd_msg_pub.Add_Exc_Msg( g_object_name, 'DELETE_RECORD', sqlerrm);
1543   p_error_msg := GET_ERROR_MESSAGE_TEXT
1544     (
1545       p_api_error      => TRUE
1546     );
1547 
1548   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1549     log
1550     ( 'Leaving DELETE_RECORD');
1551   END IF;
1552   x_return_status := FND_API.G_RET_STS_ERROR;
1553 END DELETE_RECORD;
1554 
1555 /***
1556   This procedure is called by APPLY_CLIENT_CHANGES wrapper procedure
1557   when a record failed to be processed and needs to be deferred and rejected from mobile.
1558 ***/
1559 PROCEDURE DEFER_RECORD
1560          (
1561            p_user_name     IN VARCHAR2,
1562            p_tranid        IN NUMBER,
1563            p_seqno         IN NUMBER,
1564            p_pk            IN VARCHAR2,
1565            p_object_name   IN VARCHAR2,
1566            p_pub_name      IN VARCHAR2,
1567            p_error_msg     IN VARCHAR2,
1568            x_return_status IN OUT NOCOPY VARCHAR2,
1569            p_dml_type      IN VARCHAR2
1570          ) IS
1571 BEGIN
1572   x_return_status := FND_API.G_RET_STS_SUCCESS;
1573 
1574   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1575     log
1576     ( 'Entering DEFER_RECORD');
1577   END IF;
1578 
1579   asg_defer.defer_row(p_user_name,
1580                       p_tranid,
1581                       p_pub_name,
1582                       p_seqno,
1583                       p_error_msg,
1584                       x_return_status);
1585   /*** check if defer was successfull ***/
1586   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1587     /*** no -> log and return error  ***/
1588     IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1589       log
1590       ( 'asg_defer.defer_row failed:' || ' ' || p_error_msg
1591       );
1592     END IF;
1593 
1594     IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1595       log
1596       ( 'Leaving DEFER_RECORD');
1597     END IF;
1598     RETURN;
1599   END IF;
1600 
1601   -- ANURAG
1602   /*** defer successful -> reject record only for inserts ***/
1603   IF p_dml_type = 'I' THEN
1604   IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM THEN
1605     log
1606     ( 'Rejecting record');
1607   END IF;
1608 
1609   asg_defer.reject_row(p_user_name,
1610                        p_tranid,
1611                        p_pub_name,
1612                        p_seqno,
1613                        p_error_msg,
1614                        x_return_status);
1615   /*** check if reject was successfull ***/
1616   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1617     /*** no -> log error  ***/
1618     IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1619       log
1620       ( 'asg_defer.reject_row failed:' || ' ' || p_error_msg);
1621     END IF;
1622   END IF;
1623   END IF; --end DML = 'I'
1624 
1625   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1626     log
1627     ( 'Leaving DEFER_RECORD');
1628   END IF;
1629 EXCEPTION WHEN OTHERS THEN
1630   IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1631     log
1632     ( 'Exception occurred in DEFER_RECORD:' || ' ' || sqlerrm);
1633   END IF;
1634 
1635   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1636     log
1637     ( 'Leaving DEFER_RECORD');
1638   END IF;
1639 
1640   x_return_status := FND_API.G_RET_STS_ERROR;
1641 END DEFER_RECORD;
1642 
1643 /***
1644   This procedure is called by APPLY_CLIENT_CHANGES wrapper procedure
1645   when the PK of the inserted record is created in the API.
1646   We need to remove the local PK from local
1647 ***/
1648 PROCEDURE REJECT_RECORD
1649          (
1650            p_user_name     IN VARCHAR2,
1651            p_tranid        IN NUMBER,
1652            p_seqno         IN NUMBER,
1653            p_pk            IN VARCHAR2,
1654            p_object_name   IN VARCHAR2,
1655            p_pub_name      IN VARCHAR2,
1656            p_error_msg     IN VARCHAR2,
1657            x_return_status IN OUT NOCOPY VARCHAR2
1658          ) IS
1659 BEGIN
1660   x_return_status := FND_API.G_RET_STS_SUCCESS;
1661 
1662   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1663     log
1664     ( 'Entering REJECT_RECORD');
1665   END IF;
1666 
1667   asg_defer.reject_row(p_user_name,
1668                        p_tranid,
1669                        p_pub_name,
1670                        p_seqno,
1671                        p_error_msg,
1672                        x_return_status);
1673   /*** check if reject was successfull ***/
1674   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1675     /*** no -> log error  ***/
1676     IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1677       log
1678       ( 'asg_defer.reject_row failed:' || ' ' || p_error_msg);
1679     END IF;
1680   END IF;
1681 
1682   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1683     log
1684     ( 'Leaving REJECT_RECORD');
1685   END IF;
1686 EXCEPTION WHEN OTHERS THEN
1687   IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1688     log
1689     ( 'Exception occurred in REJECT_RECORD:' || ' ' || sqlerrm);
1690   END IF;
1691 
1692   IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1693     log
1694     ( 'Leaving REJECT_RECORD');
1695   END IF;
1696 
1697   x_return_status := FND_API.G_RET_STS_ERROR;
1698 END REJECT_RECORD;
1699 
1700 /* Two functions to check if field service palm is enabled. */
1701 
1702 FUNCTION IS_FIELD_SERVICE_PALM_ENABLED
1703 RETURN BOOLEAN
1704 IS
1705   l_option_value VARCHAR2(1);
1706   l_responsibility_id NUMBER;
1707   l_application_id  NUMBER;
1708 
1709  CURSOR l_get_resp_id IS
1710   SELECT resp.APPLICATION_ID, resp.RESPONSIBILITY_ID
1711   FROM FND_RESPONSIBILITY resp, fnd_application app
1712   WHERE resp.RESPONSIBILITY_KEY = 'OMFS_PALM'
1713   AND SYSDATE BETWEEN nvl(resp.start_date, sysdate) AND nvl(resp.end_date, sysdate)
1714   AND app.application_id = resp.application_id
1715   AND app.application_short_name = 'CSM';
1716 
1717 BEGIN
1718   OPEN l_get_resp_id;
1719   FETCH l_get_resp_id INTO l_application_id, l_responsibility_id;
1720   CLOSE l_get_resp_id;
1721 
1722   l_option_value := fnd_profile.value_specific('JTM_MOB_APPS_ENABLED', null,
1723                                      l_responsibility_id, l_application_id);
1724 
1725 --  CSM_UTIL_PKG.LOG('YL: IS_FIELD_SERVICE_PALM_ENABLED = ' || l_option_value);
1726 
1727   IF ( l_option_value = 'Y' ) THEN
1728     RETURN TRUE;
1729   END IF;
1730 
1731   RETURN FALSE;
1732 EXCEPTION
1733   WHEN NO_DATA_FOUND THEN
1734 --    CSM_UTIL_PKG.LOG('YL: IS_FIELD_SERVICE_PALM_ENABLED EXCEPTION ');
1735     RETURN FALSE;
1736   WHEN OTHERS THEN
1737 --    CSM_UTIL_PKG.LOG('YL: IS_FIELD_SERVICE_PALM_ENABLED EXCEPTION ');
1738     RAISE;
1739 END IS_FIELD_SERVICE_PALM_ENABLED;
1740 
1741   /* GET_TASK_ESC_LEVEL
1742   */
1743   FUNCTION GET_TASK_ESC_LEVEL( p_task_id IN NUMBER) RETURN VARCHAR2
1744   IS
1745     CURSOR l_esc_csr (b_task_id NUMBER) IS
1746       SELECT esc.escalation_level
1747       FROM jtf_tasks_b tasks,
1748          jtf_task_references_vl ref,
1749          jtf_tasks_b esc
1750       WHERE ref.object_id = tasks.task_id
1751          and ref.object_type_code = 'TASK'
1752          and ref.reference_code = 'ESC'
1753          and ref.task_id = esc.task_id
1754          and esc.source_object_type_code = 'ESC'
1755          and tasks.task_id = b_task_id;
1756     l_esc VARCHAR2(30) := NULL;
1757   BEGIN
1758     OPEN l_esc_csr (p_task_id);
1759     FETCH l_esc_csr INTO l_esc;
1760     IF (l_esc_csr%NOTFOUND) THEN
1761        l_esc := NULL;
1762     END IF;
1763     CLOSE l_esc_csr;
1764     RETURN l_esc;
1765   EXCEPTION
1766     WHEN OTHERS THEN
1767       CLOSE l_esc_csr;
1768       RETURN NULL;
1769   END GET_TASK_ESC_LEVEL;
1770 
1771 FUNCTION item_name(p_item_name IN varchar2)
1772 RETURN varchar2
1773 IS
1774 BEGIN
1775   RETURN p_item_name;
1776 END item_name;
1777 
1778 FUNCTION is_flow_history(p_flowtype IN VARCHAR2)
1779 RETURN BOOLEAN
1780 IS
1781 l_err_msg VARCHAR2(4000);
1782 
1783 BEGIN
1784    IF p_flowtype = 'HISTORY' THEN
1785          RETURN TRUE;
1786    ELSE
1787          RETURN FALSE;
1788    END IF ;
1789 
1790 EXCEPTION
1791    WHEN OTHERS THEN
1792      l_err_msg := 'Failed csm_util_pkg.is_flow_history : ' || p_flowtype;
1793      CSM_UTIL_PKG.LOG(l_err_msg, 'CSM_UTIL_PKG.IS_FLOW_HISTORY', FND_LOG.LEVEL_ERROR);
1794      RETURN FALSE;
1795 END is_flow_history;
1796 
1797 FUNCTION get_debrief_header_id(p_debrief_header_id in CSF_DEBRIEF_HEADERS.DEBRIEF_HEADER_ID%TYPE)
1798 RETURN NUMBER
1799 IS
1800 BEGIN
1801    RETURN p_debrief_header_id;
1802 END get_debrief_header_id;
1803 
1804 
1805 /*R12-Function to return nullable number type for not null numbers*/
1806 FUNCTION get_number(p_number IN NUMBER)
1807 RETURN NUMBER
1808 IS
1809 BEGIN
1810    RETURN p_number;
1811 END get_number;
1812 
1813 /*R12-Function to return nullable varchar type for not null varchar2*/
1814 FUNCTION get_varchar(p_varchar IN VARCHAR2)
1815 RETURN VARCHAR2
1816 IS
1817 BEGIN
1818    RETURN p_varchar;
1819 END get_varchar;
1820 
1821 /*R12-Function to return nullable date type for not null date*/
1822 FUNCTION get_date(p_date IN DATE)
1823 RETURN DATE
1824 IS
1825 BEGIN
1826    RETURN p_date;
1827 END get_date;
1828 
1829 /*R12-Function to get owner's full/group name*/
1830 FUNCTION get_owner_name(p_owner_type_code IN VARCHAR2,p_owner_id IN NUMBER,p_language IN VARCHAR2)
1831 RETURN VARCHAR2
1832 IS
1833 
1834  CURSOR c_grp_name(b_grp_id NUMBER,b_lang VARCHAR2) IS
1835   SELECT TL.GROUP_NAME
1836   FROM  JTF_RS_GROUPS_B B,
1837         JTF_RS_GROUPS_TL TL
1838   WHERE B.GROUP_ID = b_grp_id
1839   AND   B.GROUP_ID = TL.GROUP_ID
1840   AND   TL.LANGUAGE=b_lang;
1841 
1842  CURSOR c_owner_name(b_owner_id NUMBER) IS
1843   SELECT PF.FULL_NAME
1844   FROM   JTF_RS_RESOURCE_EXTNS RES,
1845          PER_ALL_PEOPLE_F PF
1846   WHERE  RES.resource_id = b_owner_id
1847   AND    RES.SOURCE_ID=PF.PERSON_ID;
1848 
1849 l_name JTF_RS_RESOURCE_EXTNS.SOURCE_NAME%TYPE := NULL;
1850 
1851 BEGIN
1852  IF NVL(p_owner_type_code,'NULL')='RS_GROUP' THEN
1853    OPEN c_grp_name(p_owner_id,p_language);
1854    FETCH c_grp_name INTO l_name;
1855    CLOSE c_grp_name;
1856  ELSIF NVL(p_owner_type_code,'NULL')='RS_EMPLOYEE' THEN
1857    OPEN c_owner_name(p_owner_id);
1858    FETCH c_owner_name INTO l_name;
1859    CLOSE c_owner_name;
1860  END IF;
1861 
1862  RETURN l_name;
1863 
1864 END get_owner_name;
1865 
1866 /*to return the notification's Text attribute ignoring if the attribute doesn't exist*/
1867 FUNCTION get_wf_attrText(p_notification_id IN NUMBER,p_attribute IN VARCHAR2)
1868 RETURN VARCHAR2
1869 IS
1870 BEGIN
1871  RETURN  wf_notification.getAttrText(p_notification_id,p_attribute,true);
1872 END;
1873 
1874 FUNCTION Get_Datediff_For_Req_UOM(
1875 							 p_start_date	IN DATE,
1876 							 p_end_date 	IN DATE,
1877 							 p_class    	IN MTL_UNITS_OF_MEASURE.UOM_CLASS%TYPE,
1878 							 p_to_uom  		IN CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE,
1879 							 p_min_uom  	IN CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE
1880 							 )
1881 RETURN NUMBER
1882 IS
1883 l_datediffmin	  NUMBER;
1884 l_converted_value NUMBER;
1885 l_conversion_rate NUMBER;
1886 l_base_value      NUMBER;
1887 l_actual_value    NUMBER;
1888 l_uom_min		  CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE;
1889 l_base_uom  	  CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE;
1890 l_base_conversion_rate NUMBER;
1891 
1892 --Cursor Declarations
1893 CURSOR c_base_uom(c_uom_class MTL_UNITS_OF_MEASURE.UOM_CLASS%TYPE)
1894 IS
1895 SELECT UOM_CODE
1896 FROM   MTL_UNITS_OF_MEASURE
1897 WHERE  UOM_CLASS     = c_uom_class
1898 AND    base_uom_flag = 'Y';
1899 
1900 CURSOR c_actual_conversion(c_uom_class MTL_UNITS_OF_MEASURE.UOM_CLASS%TYPE,
1901 						   c_convert_to_uom  CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE)
1902 IS
1903 SELECT	conversion_rate
1904 FROM    MTL_UOM_CONVERSIONS
1905 WHERE   UOM_CLASS = c_uom_class
1906 AND		UOM_CODE  = c_convert_to_uom
1907 AND     inventory_item_id = 0;
1908 
1909 CURSOR c_base_conversion(c_uom_class MTL_UNITS_OF_MEASURE.UOM_CLASS%TYPE,
1910 						   c_convert_to_uom  CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE)
1911 IS
1912 SELECT	conversion_rate
1913 FROM    MTL_UOM_CONVERSIONS
1914 WHERE   UOM_CLASS = c_uom_class
1915 AND		UOM_CODE  = c_convert_to_uom
1916 AND     inventory_item_id = 0;
1917 
1918 BEGIN
1919 	--Get the difference in Minutes
1920 	l_datediffmin :=((p_end_date-p_start_date)*24*60);
1921 
1922 	OPEN  c_base_uom(p_class);
1923 	FETCH c_base_uom INTO l_base_uom;
1924 	CLOSE c_base_uom;
1925 
1926 	OPEN  c_base_conversion(p_class,p_min_uom);
1927 	FETCH c_base_conversion INTO l_base_conversion_rate;
1928 	CLOSE c_base_conversion;
1929 
1930 	OPEN  c_actual_conversion(p_class,p_to_uom);
1931 	FETCH c_actual_conversion INTO l_conversion_rate;
1932 	CLOSE c_actual_conversion;
1933 
1934 	--converting to base uom
1935 	l_base_value   := l_base_conversion_rate * l_datediffmin;
1936 	--converting to actual uom required
1937 	l_actual_value := l_base_value / l_conversion_rate ;
1938 
1939 	RETURN(ROUND(l_actual_value,2));
1940 
1941 EXCEPTION
1942   	WHEN OTHERS THEN
1943 	IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1944     	log 	( 'Exception occurred in Get_Datediff_For_Req_UOM :' || ' ' || sqlerrm);
1945   	END IF;
1946 
1947    	RAISE;
1948 
1949 END Get_Datediff_For_Req_UOM;
1950 
1951 --12.1
1952 FUNCTION is_mfs_group(p_group_id NUMBER) RETURN BOOLEAN
1953 IS
1954 CURSOR c_mfs_group(b_group_id NUMBER) IS
1955   SELECT 1
1956   FROM ASG_USER
1957   WHERE GROUP_ID=b_group_id;
1958 
1959 l_mfs_grp  NUMBER:=0;
1960 BEGIN
1961 
1962 OPEN c_mfs_group(p_group_id);
1963 FETCH c_mfs_group INTO l_mfs_grp;
1964 CLOSE c_mfs_group;
1965 
1966 IF l_mfs_grp=1 THEN
1967  RETURN TRUE;
1968 END IF;
1969 
1970 RETURN FALSE;
1971 END is_mfs_group;
1972 
1973 --12.1
1974 FUNCTION get_group_owner(p_group_id NUMBER) RETURN NUMBER
1975 IS
1976 CURSOR c_group_owner(b_group_id NUMBER) IS
1977  	SELECT USER_ID
1978 	FROM ASG_USER
1979 	WHERE OWNER_ID=USER_ID
1980 	AND GROUP_ID=b_group_id;
1981 
1982 /*
1983 CURSOR c_group_owner(b_group_id NUMBER) IS
1984  	SELECT USER_ID
1985 	FROM ASG_USER
1986 	WHERE ROLE_CODE  = 'MFS_OWNER'
1987 	AND GROUP_ID=b_group_id;*/
1988 
1989 l_grp_owner  NUMBER;
1990 BEGIN
1991 
1992 OPEN c_group_owner(p_group_id);
1993 FETCH c_group_owner INTO l_grp_owner;
1994 CLOSE c_group_owner;
1995 
1996 RETURN NVL(l_grp_owner,-1);
1997 
1998 END get_group_owner;
1999 
2000 --12.1
2001 FUNCTION from_same_group(p_member1_resource_id NUMBER,p_member2_resource_id NUMBER) RETURN BOOLEAN
2002 IS
2003 CURSOR c_from_same_group(b_owner NUMBER,b_member NUMBER)
2004 IS
2005 SELECT 1
2006 FROM JTF_RS_GROUP_MEMBERS memG
2007 WHERE RESOURCE_ID = b_member
2008 AND EXISTS (SELECT 1 FROM JTF_RS_GROUP_MEMBERS ownG
2009             WHERE ownG.GROUP_ID=memG.GROUP_ID
2010             AND ownG.RESOURCE_ID=b_owner);
2011 
2012 l_temp NUMBER :=0;
2013 BEGIN
2014 
2015  OPEN c_from_same_group(p_member1_resource_id,p_member2_resource_id);
2016  FETCH c_from_same_group INTO l_temp;
2017  CLOSE c_from_same_group;
2018 
2019  IF l_temp=1 THEN
2020   RETURN TRUE;
2021  END IF;
2022 
2023  RETURN FALSE;
2024 END from_same_group;
2025 
2026 --function to get owner id for any user
2027 FUNCTION get_owner(p_user_id NUMBER) RETURN NUMBER
2028 IS
2029  CURSOR c_get_owner(b_user_id NUMBER)
2030  IS
2031  SELECT OWNER_ID
2032  FROM   ASG_USER
2033  WHERE  USER_ID= p_user_id;
2034 
2035  l_owner_id  NUMBER;
2036 BEGIN
2037 
2038  OPEN c_get_owner(p_user_id);
2039  FETCH c_get_owner INTO l_owner_id;
2040  CLOSE c_get_owner;
2041 
2042  RETURN NVL(l_owner_id,-1);
2043 
2044 END get_owner;
2045 
2046 --12.1 function to get Group name for a group
2047 FUNCTION get_group_name(p_group_id NUMBER, p_language VARCHAR2) RETURN VARCHAR2
2048 IS
2049  CURSOR c_get_group_name(b_group_id NUMBER, b_language VARCHAR2)
2050  IS
2051  SELECT GROUP_NAME--group_desc is a nullable column hence group_name is selected
2052  FROM   jtf_rs_groups_tl
2053  WHERE  GROUP_ID = b_group_id
2054  AND    LANGUAGE = b_language;
2055 
2056  l_group_name  VARCHAR2(60) := NULL;
2057 BEGIN
2058 
2059   IF p_group_id IS NOT NULL THEN
2060     OPEN  c_get_group_name(p_group_id,p_language);
2061     FETCH c_get_group_name INTO l_group_name;
2062     CLOSE c_get_group_name;
2063   END IF;
2064 
2065  RETURN l_group_name;
2066 
2067 END get_group_name;
2068 
2069 END CSM_UTIL_PKG;