1 PACKAGE BODY CSM_UTIL_PKG AS
2 /* $Header: csmeutlb.pls 120.22.12020000.3 2013/04/18 07:59:54 avitiwar 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 -- csm_saj_log_pkg.log(module,message);
62 l_message := message;
63 IF g_initialize_log = TRUE THEN
64 IF (log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
65 FND_LOG.STRING(log_level, module, l_message);
66 END IF;
67 ELSE
68 fnd_log_repository.init();
69 g_initialize_log := TRUE;
70 IF (log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
71 fnd_log.string(log_level, module, l_message);
72 END IF;
73 END IF;
74 END LOG;
75
76 /**
77 Initializes g_acc_refresh_desc_tbl with the informatoin pertaining to
78 master tables to be updated
79 either through concurrent job or workflow activities.
80 */
81 procedure initialize_g_table_desc_tbl
82 IS
83 i NUMBER := 0;
84 BEGIN
85 IF (g_acc_refresh_desc_tbl IS NULL OR g_acc_refresh_desc_tbl.COUNT = 0) THEN
86
87 /* -- CSM_TXN_SUB_TYPES
88 i := i +1;
89 g_acc_refresh_desc_tbl.EXTEND;
90 g_acc_refresh_desc_tbl(i).BACKEND_TABLE_NAME := 'CSI_IB_TXN_TYPES';
91 g_acc_refresh_desc_tbl(i).ACC_TABLE_NAME := 'CSM_IB_TXN_TYPES_ACC';
92 g_acc_refresh_desc_tbl(i).ACC_SEQUENCE_NAME := 'CSM_IB_TXN_TYPES_ACC_S';
93 g_acc_refresh_desc_tbl(i).PRIMARY_KEY_COLUMN := 'SUB_TYPE_ID';
94 g_acc_refresh_desc_tbl(i).PUBLICATION_ITEM_NAME := 'CSF_M_TXN_SUB_TYPES';
95 g_acc_refresh_desc_tbl(i).ACCESS_QUERY :=
96 'select cit.sub_type_id
97 from
98 csi_ib_txn_types cit,
99 csi_source_ib_types cst,
100 csi_txn_types ctt,
101 csi_instance_statuses cis
102 where cst.sub_type_id = cit.sub_type_id
103 and cst.transaction_type_id = ctt.transaction_type_id
104 and cit.src_return_reqd = ''N''
105 and cit.non_src_reference_reqd = ''N''
106 and ctt.source_transaction_type = ''FIELD_SERVICE_REPORT''
107 and ctt.source_application_id = 513
108 and cis.instance_status_id(+) = cit.src_status_id
109 and cis.terminated_flag(+) <> ''Y''';
110 */
111
112 --CSM_OBJECT_MAPPINGS
113 i := i +1;
114 g_acc_refresh_desc_tbl.EXTEND;
115 g_acc_refresh_desc_tbl(i).BACKEND_TABLE_NAME := 'JTF_OBJECT_MAPPINGS';
116 g_acc_refresh_desc_tbl(i).ACC_TABLE_NAME := 'CSM_OBJECT_MAPPINGS_ACC';
117 g_acc_refresh_desc_tbl(i).ACC_SEQUENCE_NAME := 'CSM_OBJECT_MAPPINGS_ACC_S';
118 g_acc_refresh_desc_tbl(i).PRIMARY_KEY_COLUMN := 'MAPPING_ID';
119 g_acc_refresh_desc_tbl(i).PUBLICATION_ITEM_NAME := 'CSF_M_OBJECT_MAPPINGS';
120 g_acc_refresh_desc_tbl(i).ACCESS_QUERY :=
121 'select jom.mapping_id
122 from jtf_object_mappings jom
123 WHERE jom.source_object_code IN (''PARTY'', ''TASK'', ''SR'', ''CP'',''OKS_COV_NOTE'',''SD'')';
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 l_tracking_id NUMBER;
1509 BEGIN
1510 x_return_status := FND_API.G_RET_STS_SUCCESS;
1511
1512 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1513 log
1514 ( 'Entering DELETE_RECORD');
1515 log
1516 ( 'Check and clear TRACKING deferred record');
1517 END IF;
1518
1519 -- Remove tracking table record if this record is deferred.
1520 -- reqd if tracking records are reapplied via MFS Admin pages
1521 IF asg_defer.is_deferred(p_user_name, p_tranid,p_pub_name, p_seqno)=FND_API.G_TRUE THEN
1522 BEGIN
1523 SELECT TRACKING_ID INTO l_tracking_id
1524 FROM CSM_DEFERRED_NFN_INFO
1525 WHERE DEFERRED_TRAN_ID=p_tranid
1526 AND CLIENT_ID=p_user_name
1527 AND SEQUENCE = p_seqno
1528 AND OBJECT_NAME=p_pub_name
1529 AND OBJECT_ID=p_pk;
1530
1531 CSM_ACC_PKG.Delete_Acc
1532 ( P_PUBLICATION_ITEM_NAMES => CSM_ACC_PKG.t_publication_item_list('CSM_DEFERRED_TRANSACTIONS')
1533 ,P_ACC_TABLE_NAME => 'CSM_DEFERRED_TRANSACTIONS_ACC'
1534 ,P_PK1_NAME => 'TRACKING_ID'
1535 ,P_PK1_NUM_VALUE => l_tracking_id
1536 ,P_USER_ID => asg_base.get_user_id(p_user_name)
1537 );
1538 DELETE FROM CSM_DEFERRED_NFN_INFO
1539 WHERE TRACKING_ID=l_tracking_id;
1540 EXCEPTION
1541 WHEN OTHERS THEN
1542 NULL;
1543 END;
1544 END IF;
1545
1546 asg_apply.delete_row(p_user_name,
1547 p_tranid,
1548 p_pub_name,
1549 p_seqno,
1550 x_return_status);
1551
1552
1553 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1554 log( 'ASG Delete row unsuccessful');
1555
1556 /*** error occurred ***/
1557 fnd_msg_pub.Add_Exc_Msg( g_object_name, 'DELETE_RECORD', 'Unknown error');
1558 p_error_msg := GET_ERROR_MESSAGE_TEXT
1559 (
1560 p_api_error => TRUE
1561 );
1562 ELSE
1563 DELETE FROM CSM_HTML5_PARSED_DATA WHERE SESSION_ID= p_tranid AND SEQUENCE=p_seqno;
1564 END IF;
1565
1566 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1567 log
1568 ( 'Leaving DELETE_RECORD');
1569 END IF;
1570
1571 EXCEPTION WHEN OTHERS THEN
1572 IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1573 log
1574 ( 'Exception occurred in DELETE_RECORD:' || ' ' || sqlerrm);
1575 END IF;
1576
1577 fnd_msg_pub.Add_Exc_Msg( g_object_name, 'DELETE_RECORD', sqlerrm);
1578 p_error_msg := GET_ERROR_MESSAGE_TEXT
1579 (
1580 p_api_error => TRUE
1581 );
1582
1583 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1584 log
1585 ( 'Leaving DELETE_RECORD');
1586 END IF;
1587 x_return_status := FND_API.G_RET_STS_ERROR;
1588 END DELETE_RECORD;
1589
1590 /***
1591 This procedure is called by APPLY_CLIENT_CHANGES wrapper procedure
1592 when a record failed to be processed and needs to be deferred and rejected from mobile.
1593 ***/
1594 PROCEDURE DEFER_RECORD
1595 (
1596 p_user_name IN VARCHAR2,
1597 p_tranid IN NUMBER,
1598 p_seqno IN NUMBER,
1599 p_pk IN VARCHAR2,
1600 p_object_name IN VARCHAR2,
1601 p_pub_name IN VARCHAR2,
1602 p_error_msg IN VARCHAR2,
1603 x_return_status IN OUT NOCOPY VARCHAR2,
1604 p_dml_type IN VARCHAR2
1605 ) IS
1606
1607 CURSOR c_err_msg
1608 IS
1609 SELECT ERROR_DESCRIPTION FROM ASG_DEFERRED_TRANINFO
1610 WHERE DEVICE_USER_NAME = p_user_name
1611 AND DEFERRED_TRAN_ID = p_tranid
1612 AND OBJECT_NAME = p_pub_name
1613 AND SEQUENCE = p_seqno;
1614
1615 l_error_msg VARCHAR2(4000);
1616 l_t VARCHAR2(1);
1617
1618 BEGIN
1619 x_return_status := FND_API.G_RET_STS_SUCCESS;
1620
1621 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1622 log
1623 ( 'Entering DEFER_RECORD');
1624 END IF;
1625
1626 asg_defer.defer_row(p_user_name,
1627 p_tranid,
1628 p_pub_name,
1629 p_seqno,
1630 p_error_msg,
1631 x_return_status);
1632
1633
1634 /*** check if defer was successfull ***/
1635 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1636 /*** no -> log and return error ***/
1637
1638 log( 'asg_defer.defer_row failed:' || ' ' || p_error_msg);
1639
1640 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1641 log
1642 ( 'Leaving DEFER_RECORD');
1643 END IF;
1644 RETURN;
1645 END IF;
1646
1647 l_error_msg := p_error_msg;
1648
1649 IF ( p_error_msg IS NULL) THEN
1650 OPEN c_err_msg;
1651 FETCH c_err_msg INTO l_error_msg;
1652 CLOSE c_err_msg;
1653 END IF;
1654
1655 /*Removed reject row and replaced with deferred notification and tracking logic*/
1656 -- 12.1.3
1657 csm_notification_event_pkg.notify_deferred(p_user_name,p_tranid,
1658 p_pub_name,p_seqno, p_dml_type,p_pk,l_error_msg);
1659
1660
1661 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1662 log
1663 ( 'Leaving DEFER_RECORD');
1664 END IF;
1665 EXCEPTION WHEN OTHERS THEN
1666
1667 log( 'Exception occurred in DEFER_RECORD:' || ' ' || sqlerrm);
1668
1669
1670 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1671 log
1672 ( 'Leaving DEFER_RECORD');
1673 END IF;
1674
1675 x_return_status := FND_API.G_RET_STS_ERROR;
1676 END DEFER_RECORD;
1677
1678 /***
1679 This procedure is called by APPLY_CLIENT_CHANGES wrapper procedure
1680 when the PK of the inserted record is created in the API.
1681 We need to remove the local PK from local
1682 ***/
1683 PROCEDURE REJECT_RECORD
1684 (
1685 p_user_name IN VARCHAR2,
1686 p_tranid IN NUMBER,
1687 p_seqno IN NUMBER,
1688 p_pk IN VARCHAR2,
1689 p_object_name IN VARCHAR2,
1690 p_pub_name IN VARCHAR2,
1691 p_error_msg IN VARCHAR2,
1692 x_return_status IN OUT NOCOPY VARCHAR2
1693 ) IS
1694
1695 CURSOR c_acc_id
1696 IS
1697 SELECT PK_VALUE
1698 FROM CSM_HTML5_PARSED_DATA
1699 WHERE SESSION_ID=p_tranid
1700 AND SEQUENCE=p_seqno;
1701
1702 l_acc NUMBER;
1703
1704 BEGIN
1705 x_return_status := FND_API.G_RET_STS_SUCCESS;
1706
1707 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1708 log( 'Entering REJECT_RECORD');
1709 END IF;
1710
1711 asg_defer.reject_row(p_user_name,
1712 p_tranid,
1713 p_pub_name,
1714 p_seqno,
1715 p_error_msg,
1716 x_return_status);
1717
1718 /*** check if reject was successfull ***/
1719 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1720 log( 'asg_defer.reject_row failed:' || ' ' || p_error_msg);
1721 ELSIF IS_HTML5_USER(p_user_name) THEN --this is required since access_id will be different in client
1722 OPEN c_acc_id;
1723 FETCH c_acc_id INTO l_acc;
1724 CLOSE c_acc_id;
1725
1726 IF(l_acc IS NOT NULL) THEN
1727 UPDATE asg_system_dirty_queue a
1728 SET ACCESS_ID=l_acc
1729 WHERE PUB_ITEM=p_pub_name
1730 AND CLIENT_ID=p_user_name
1731 AND DML_TYPE=0
1732 AND EXISTS(SELECT 1 FROM ASG_DELETE_QUEUE b
1733 WHERE b.QID=a.QID
1734 AND b.ATTRIBUTE1=p_pk) ;
1735
1736 IF asg_defer.is_deferred(p_user_name, p_tranid,p_pub_name, p_seqno)=FND_API.G_FALSE THEN
1737 DELETE FROM CSM_HTML5_PARSED_DATA WHERE SESSION_ID=p_tranid AND SEQUENCE=p_seqno;
1738 END IF;
1739 END IF;
1740 END IF;
1741
1742 IF g_debug_level = CSM_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
1743 log( 'Leaving REJECT_RECORD');
1744 END IF;
1745 EXCEPTION WHEN OTHERS THEN
1746 log( 'Exception occurred in REJECT_RECORD:' || ' ' || sqlerrm);
1747 x_return_status := FND_API.G_RET_STS_ERROR;
1748 END REJECT_RECORD;
1749
1750
1751 /* Two functions to check if field service palm is enabled. */
1752
1753 FUNCTION IS_FIELD_SERVICE_PALM_ENABLED
1754 RETURN BOOLEAN
1755 IS
1756 l_option_value VARCHAR2(1);
1757 l_responsibility_id NUMBER;
1758 l_application_id NUMBER;
1759
1760 CURSOR l_get_resp_id IS
1761 SELECT resp.APPLICATION_ID, resp.RESPONSIBILITY_ID
1762 FROM FND_RESPONSIBILITY resp, fnd_application app
1763 WHERE resp.RESPONSIBILITY_KEY = 'OMFS_PALM'
1764 AND SYSDATE BETWEEN nvl(resp.start_date, sysdate) AND nvl(resp.end_date, sysdate)
1765 AND app.application_id = resp.application_id
1766 AND app.application_short_name = 'CSM';
1767
1768 BEGIN
1769 OPEN l_get_resp_id;
1770 FETCH l_get_resp_id INTO l_application_id, l_responsibility_id;
1771 CLOSE l_get_resp_id;
1772
1773 l_option_value := fnd_profile.value_specific('JTM_MOB_APPS_ENABLED', null,
1774 l_responsibility_id, l_application_id);
1775
1776 -- CSM_UTIL_PKG.LOG('YL: IS_FIELD_SERVICE_PALM_ENABLED = ' || l_option_value);
1777
1778 IF ( l_option_value = 'Y' ) THEN
1779 RETURN TRUE;
1780 END IF;
1781
1782 RETURN FALSE;
1783 EXCEPTION
1784 WHEN NO_DATA_FOUND THEN
1785 -- CSM_UTIL_PKG.LOG('YL: IS_FIELD_SERVICE_PALM_ENABLED EXCEPTION ');
1786 RETURN FALSE;
1787 WHEN OTHERS THEN
1788 -- CSM_UTIL_PKG.LOG('YL: IS_FIELD_SERVICE_PALM_ENABLED EXCEPTION ');
1789 RAISE;
1790 END IS_FIELD_SERVICE_PALM_ENABLED;
1791
1792 /* GET_TASK_ESC_LEVEL
1793 */
1794 FUNCTION GET_TASK_ESC_LEVEL( p_task_id IN NUMBER) RETURN VARCHAR2
1795 IS
1796 CURSOR l_esc_csr (b_task_id NUMBER) IS
1797 SELECT esc.escalation_level
1798 FROM jtf_tasks_b tasks,
1799 jtf_task_references_vl ref,
1800 jtf_tasks_b esc
1801 WHERE ref.object_id = tasks.task_id
1802 and ref.object_type_code = 'TASK'
1803 and ref.reference_code = 'ESC'
1804 and ref.task_id = esc.task_id
1805 and esc.source_object_type_code = 'ESC'
1806 and tasks.task_id = b_task_id;
1807 l_esc VARCHAR2(30) := NULL;
1808 BEGIN
1809 OPEN l_esc_csr (p_task_id);
1810 FETCH l_esc_csr INTO l_esc;
1811 IF (l_esc_csr%NOTFOUND) THEN
1812 l_esc := NULL;
1813 END IF;
1814 CLOSE l_esc_csr;
1815 RETURN l_esc;
1816 EXCEPTION
1817 WHEN OTHERS THEN
1818 CLOSE l_esc_csr;
1819 RETURN NULL;
1820 END GET_TASK_ESC_LEVEL;
1821
1822 FUNCTION item_name(p_item_name IN varchar2)
1823 RETURN varchar2
1824 IS
1825 BEGIN
1826 RETURN p_item_name;
1827 END item_name;
1828
1829 FUNCTION is_flow_history(p_flowtype IN VARCHAR2)
1830 RETURN BOOLEAN
1831 IS
1832 l_err_msg VARCHAR2(4000);
1833
1834 BEGIN
1835 IF p_flowtype = 'HISTORY' THEN
1836 RETURN TRUE;
1837 ELSE
1838 RETURN FALSE;
1839 END IF ;
1840
1841 EXCEPTION
1842 WHEN OTHERS THEN
1843 l_err_msg := 'Failed csm_util_pkg.is_flow_history : ' || p_flowtype;
1844 CSM_UTIL_PKG.LOG(l_err_msg, 'CSM_UTIL_PKG.IS_FLOW_HISTORY', FND_LOG.LEVEL_ERROR);
1845 RETURN FALSE;
1846 END is_flow_history;
1847
1848 FUNCTION get_debrief_header_id(p_debrief_header_id in CSF_DEBRIEF_HEADERS.DEBRIEF_HEADER_ID%TYPE)
1849 RETURN NUMBER
1850 IS
1851 BEGIN
1852 RETURN p_debrief_header_id;
1853 END get_debrief_header_id;
1854
1855
1856 /*R12-Function to return nullable number type for not null numbers*/
1857 FUNCTION get_number(p_number IN NUMBER)
1858 RETURN NUMBER
1859 IS
1860 BEGIN
1861 RETURN p_number;
1862 END get_number;
1863
1864 /*R12-Function to return nullable varchar type for not null varchar2*/
1865 FUNCTION get_varchar(p_varchar IN VARCHAR2)
1866 RETURN VARCHAR2
1867 IS
1868 BEGIN
1869 RETURN p_varchar;
1870 END get_varchar;
1871
1872 /*R12-Function to return nullable date type for not null date*/
1873 FUNCTION get_date(p_date IN DATE)
1874 RETURN DATE
1875 IS
1876 BEGIN
1877 RETURN p_date;
1878 END get_date;
1879
1880 /*R12-Function to get owner's full/group name*/
1881 FUNCTION get_owner_name(p_owner_type_code IN VARCHAR2,p_owner_id IN NUMBER,p_language IN VARCHAR2)
1882 RETURN VARCHAR2
1883 IS
1884
1885 CURSOR c_grp_name(b_grp_id NUMBER,b_lang VARCHAR2) IS
1886 SELECT TL.GROUP_NAME
1887 FROM JTF_RS_GROUPS_B B,
1888 JTF_RS_GROUPS_TL TL
1889 WHERE B.GROUP_ID = b_grp_id
1890 AND B.GROUP_ID = TL.GROUP_ID
1891 AND TL.LANGUAGE=b_lang;
1892
1893 CURSOR c_owner_name(b_owner_id NUMBER) IS
1894 SELECT PF.FULL_NAME
1895 FROM JTF_RS_RESOURCE_EXTNS RES,
1896 PER_ALL_PEOPLE_F PF
1897 WHERE RES.resource_id = b_owner_id
1898 AND RES.SOURCE_ID=PF.PERSON_ID;
1899
1900 l_name JTF_RS_RESOURCE_EXTNS.SOURCE_NAME%TYPE := NULL;
1901
1902 BEGIN
1903 IF NVL(p_owner_type_code,'NULL')='RS_GROUP' THEN
1904 OPEN c_grp_name(p_owner_id,p_language);
1905 FETCH c_grp_name INTO l_name;
1906 CLOSE c_grp_name;
1907 ELSIF NVL(p_owner_type_code,'NULL')='RS_EMPLOYEE' THEN
1908 OPEN c_owner_name(p_owner_id);
1909 FETCH c_owner_name INTO l_name;
1910 CLOSE c_owner_name;
1911 END IF;
1912
1913 RETURN l_name;
1914
1915 END get_owner_name;
1916
1917 /*to return the notification's Text attribute ignoring if the attribute doesn't exist*/
1918 FUNCTION get_wf_attrText(p_notification_id IN NUMBER,p_attribute IN VARCHAR2)
1919 RETURN VARCHAR2
1920 IS
1921 BEGIN
1922 RETURN wf_notification.getAttrText(p_notification_id,p_attribute,true);
1923 END;
1924
1925 FUNCTION Get_Datediff_For_Req_UOM(
1926 p_start_date IN DATE,
1927 p_end_date IN DATE,
1928 p_class IN MTL_UNITS_OF_MEASURE.UOM_CLASS%TYPE,
1929 p_to_uom IN CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE,
1930 p_min_uom IN CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE
1931 )
1932 RETURN NUMBER
1933 IS
1934 l_datediffmin NUMBER;
1935 l_converted_value NUMBER;
1936 l_conversion_rate NUMBER;
1937 l_base_value NUMBER;
1938 l_actual_value NUMBER;
1939 l_uom_min CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE;
1940 l_base_uom CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE;
1941 l_base_conversion_rate NUMBER;
1942
1943 --Cursor Declarations
1944 CURSOR c_base_uom(c_uom_class MTL_UNITS_OF_MEASURE.UOM_CLASS%TYPE)
1945 IS
1946 SELECT UOM_CODE
1947 FROM MTL_UNITS_OF_MEASURE
1948 WHERE UOM_CLASS = c_uom_class
1949 AND base_uom_flag = 'Y';
1950
1951 CURSOR c_actual_conversion(c_uom_class MTL_UNITS_OF_MEASURE.UOM_CLASS%TYPE,
1952 c_convert_to_uom CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE)
1953 IS
1954 SELECT conversion_rate
1955 FROM MTL_UOM_CONVERSIONS
1956 WHERE UOM_CLASS = c_uom_class
1957 AND UOM_CODE = c_convert_to_uom
1958 AND inventory_item_id = 0;
1959
1960 CURSOR c_base_conversion(c_uom_class MTL_UNITS_OF_MEASURE.UOM_CLASS%TYPE,
1961 c_convert_to_uom CSM_UNIT_OF_MEASURE_TL_ACC.UOM_CODE%TYPE)
1962 IS
1963 SELECT conversion_rate
1964 FROM MTL_UOM_CONVERSIONS
1965 WHERE UOM_CLASS = c_uom_class
1966 AND UOM_CODE = c_convert_to_uom
1967 AND inventory_item_id = 0;
1968
1969 BEGIN
1970 --Get the difference in Minutes
1971 l_datediffmin :=((p_end_date-p_start_date)*24*60);
1972
1973 OPEN c_base_uom(p_class);
1974 FETCH c_base_uom INTO l_base_uom;
1975 CLOSE c_base_uom;
1976
1977 OPEN c_base_conversion(p_class,p_min_uom);
1978 FETCH c_base_conversion INTO l_base_conversion_rate;
1979 CLOSE c_base_conversion;
1980
1981 OPEN c_actual_conversion(p_class,p_to_uom);
1982 FETCH c_actual_conversion INTO l_conversion_rate;
1983 CLOSE c_actual_conversion;
1984
1985 --converting to base uom
1986 l_base_value := l_base_conversion_rate * l_datediffmin;
1987 --converting to actual uom required
1988 l_actual_value := l_base_value / l_conversion_rate ;
1989
1990 RETURN(ROUND(l_actual_value,2));
1991
1992 EXCEPTION
1993 WHEN OTHERS THEN
1994 IF g_debug_level >= CSM_UTIL_PKG.G_DEBUG_LEVEL_ERROR THEN
1995 log ( 'Exception occurred in Get_Datediff_For_Req_UOM :' || ' ' || sqlerrm);
1996 END IF;
1997
1998 RAISE;
1999
2000 END Get_Datediff_For_Req_UOM;
2001
2002 --12.1
2003 FUNCTION is_mfs_group(p_group_id NUMBER) RETURN BOOLEAN
2004 IS
2005 CURSOR c_mfs_group(b_group_id NUMBER) IS
2006 SELECT 1
2007 FROM ASG_USER
2008 WHERE GROUP_ID=b_group_id;
2009
2010 l_mfs_grp NUMBER:=0;
2011 BEGIN
2012
2013 OPEN c_mfs_group(p_group_id);
2014 FETCH c_mfs_group INTO l_mfs_grp;
2015 CLOSE c_mfs_group;
2016
2017 IF l_mfs_grp=1 THEN
2018 RETURN TRUE;
2019 END IF;
2020
2021 RETURN FALSE;
2022 END is_mfs_group;
2023
2024 --12.1
2025 FUNCTION get_group_owner(p_group_id NUMBER) RETURN NUMBER
2026 IS
2027 CURSOR c_group_owner(b_group_id NUMBER) IS
2028 SELECT USER_ID
2029 FROM ASG_USER
2030 WHERE OWNER_ID=USER_ID
2031 AND GROUP_ID=b_group_id;
2032
2033 /*
2034 CURSOR c_group_owner(b_group_id NUMBER) IS
2035 SELECT USER_ID
2036 FROM ASG_USER
2037 WHERE ROLE_CODE = 'MFS_OWNER'
2038 AND GROUP_ID=b_group_id;*/
2039
2040 l_grp_owner NUMBER;
2041 BEGIN
2042
2043 OPEN c_group_owner(p_group_id);
2044 FETCH c_group_owner INTO l_grp_owner;
2045 CLOSE c_group_owner;
2046
2047 RETURN NVL(l_grp_owner,-1);
2048
2049 END get_group_owner;
2050
2051 --12.1
2052 FUNCTION from_same_group(p_member1_resource_id NUMBER,p_member2_resource_id NUMBER) RETURN BOOLEAN
2053 IS
2054 CURSOR c_from_same_group(b_owner NUMBER,b_member NUMBER)
2055 IS
2056 SELECT 1
2057 FROM JTF_RS_GROUP_MEMBERS memG
2058 WHERE RESOURCE_ID = b_member
2059 AND EXISTS (SELECT 1 FROM JTF_RS_GROUP_MEMBERS ownG
2060 WHERE ownG.GROUP_ID=memG.GROUP_ID
2061 AND ownG.RESOURCE_ID=b_owner);
2062
2063 l_temp NUMBER :=0;
2064 BEGIN
2065
2066 OPEN c_from_same_group(p_member1_resource_id,p_member2_resource_id);
2067 FETCH c_from_same_group INTO l_temp;
2068 CLOSE c_from_same_group;
2069
2070 IF l_temp=1 THEN
2071 RETURN TRUE;
2072 END IF;
2073
2074 RETURN FALSE;
2075 END from_same_group;
2076
2077 --function to get owner id for any user
2078 FUNCTION get_owner(p_user_id NUMBER) RETURN NUMBER
2079 IS
2080 CURSOR c_get_owner(b_user_id NUMBER)
2081 IS
2082 SELECT OWNER_ID
2083 FROM ASG_USER
2084 WHERE USER_ID= p_user_id;
2085
2086 l_owner_id NUMBER;
2087 BEGIN
2088
2089 OPEN c_get_owner(p_user_id);
2090 FETCH c_get_owner INTO l_owner_id;
2091 CLOSE c_get_owner;
2092
2093 RETURN NVL(l_owner_id,-1);
2094
2095 END get_owner;
2096
2097 --12.1 function to get Group name for a group
2098 FUNCTION get_group_name(p_group_id NUMBER, p_language VARCHAR2) RETURN VARCHAR2
2099 IS
2100 CURSOR c_get_group_name(b_group_id NUMBER, b_language VARCHAR2)
2101 IS
2102 SELECT GROUP_NAME--group_desc is a nullable column hence group_name is selected
2103 FROM jtf_rs_groups_tl
2104 WHERE GROUP_ID = b_group_id
2105 AND LANGUAGE = b_language;
2106
2107 l_group_name VARCHAR2(60) := NULL;
2108 BEGIN
2109
2110 IF p_group_id IS NOT NULL THEN
2111 OPEN c_get_group_name(p_group_id,p_language);
2112 FETCH c_get_group_name INTO l_group_name;
2113 CLOSE c_get_group_name;
2114 END IF;
2115
2116 RETURN l_group_name;
2117
2118 END get_group_name;
2119
2120 /*returns True if the asg user name passed is just/being created by mmu*/
2121 FUNCTION is_new_mmu_user(p_user_name IN VARCHAR2) RETURN BOOLEAN
2122 IS
2123 l_exists NUMBER;
2124 BEGIN
2125
2126 select 1 INTO l_exists
2127 from asg_user
2128 where cookie is not null --user has not synch'ed yet
2129 and enabled ='Y'
2130 and user_name = p_user_name;
2131
2132 select 1 INTO l_exists
2133 from asg_user_pub_resps ar, asg_user au
2134 where synch_disabled='N' -- is being created by MMU
2135 and ar.pub_name='SERVICEP'
2136 and au.useR_name=ar.user_name
2137 and au.user_name = p_user_name;
2138
2139 return false;
2140
2141 EXCEPTION
2142 WHEN Others THEN
2143 return true;
2144 END is_new_mmu_user;
2145
2146 FUNCTION is_html5_user(p_user_name IN VARCHAR2) RETURN BOOLEAN
2147 IS
2148 ln NUMBER;
2149 BEGIN
2150 SELECT 1 INTO ln FROM ASG_USER
2151 WHERE USER_NAME=p_user_name
2152 AND NVL(MULTI_PLATFORM,'N')='Y';
2153 RETURN TRUE;
2154 EXCEPTION WHEN OTHERS THEN
2155 RETURN FALSE;
2156 END is_html5_user;
2157
2158 FUNCTION is_html5_user(p_user_id IN NUMBER) RETURN BOOLEAN
2159 IS
2160 ln NUMBER;
2161 BEGIN
2162 SELECT 1 INTO ln FROM ASG_USER
2163 WHERE USER_ID=p_user_id
2164 AND NVL(MULTI_PLATFORM,'N')='Y';
2165 RETURN TRUE;
2166 EXCEPTION WHEN OTHERS THEN
2167 RETURN FALSE;
2168 END is_html5_user;
2169
2170 FUNCTION get_inq_tab(pi VARCHAR2) RETURN VARCHAR2
2171 IS
2172 l_t VARCHAR2(200);
2173 BEGIN
2174 SELECT INQ_NAME INTO l_t FROM ASG_PUB_ITEM WHERE ITEM_ID =pi;
2175 RETURN l_t;
2176 EXCEPTION
2177 WHEN OTHERS THEN
2178 RETURN NULL;
2179 END;
2180
2181 FUNCTION bool2yn(INP in boolean) return varchar2
2182 IS
2183 BEGIN
2184 IF(INP IS NULL OR NOT INP) THEN
2185 RETURN 'N';
2186 END IF;
2187 RETURN 'Y';
2188 END bool2yn;
2189
2190 FUNCTION get_String_fromList(tab in ASG_DOWNLOAD.ACCESS_LIST) return varchar2
2191 IS
2192 l_res VARCHAR2(4000):='-1';
2193 BEGIN
2194 FOR I in 1..tab.count
2195 LOOP
2196 IF I=1 THEN
2197 l_res:=to_char(tab(i));
2198 ELSE
2199 l_res:=l_res||','||to_char(tab(i));
2200 END IF;
2201 END LOOP;
2202 RETURN l_res;
2203 END get_String_fromList;
2204
2205 FUNCTION set_task_audit(p_new_val in varchar2,p_old_val in varchar2) RETURN VARCHAR2
2206 IS
2207 l_cur_val VARCHAR2(100);
2208 x boolean;
2209 BEGIN
2210 IF p_new_val='N' THEN
2211 l_cur_val:=upper(fnd_profile.value('JTF_TASK_ENABLE_AUDIT'));
2212 IF NVL(l_cur_val,'Y')='Y' THEN
2213 x:=fnd_profile.save('JTF_TASK_ENABLE_AUDIT','N','SITE');
2214 log('Turning Off Audit as Current Audit Profile Value:'||l_cur_val,'CSM_UTIL_PKG.set_task_audit');
2215 END IF;
2216 RETURN l_cur_val;
2217 ELSE
2218 IF p_old_val IS NULL THEN
2219 x:=fnd_profile.delete('JTF_TASK_ENABLE_AUDIT','SITE');
2220 log('Deleting Audit profile as it did not exist before','CSM_UTIL_PKG.set_task_audit');
2221 ELSIF p_old_val='Y' THEN
2222 x:=fnd_profile.save('JTF_TASK_ENABLE_AUDIT','Y','SITE');
2223 log('Re-enabling Audit profile','CSM_UTIL_PKG.set_task_audit');
2224 END IF;
2225 RETURN p_old_val;
2226 END IF;
2227 END set_task_audit;
2228
2229 /* returns user langauge at user level/site level */
2230 FUNCTION get_fnd_user_language( p_user_id fnd_user.user_id%TYPE)
2231 RETURN VARCHAR2
2232 IS
2233 l_profile_option_value VARCHAR2(255) := NULL;
2234 l_profile_option_name VARCHAR2(255) := 'ICX_LANGUAGE';
2235
2236 CURSOR c_get_user_value (c_user_id NUMBER)
2237 IS
2238 SELECT lang.LANGUAGE_CODE
2239 FROM FND_PROFILE_OPTION_VALUES val,
2240 FND_PROFILE_OPTIONS prf,
2241 FND_LANGUAGES lang
2242 WHERE prf.PROFILE_OPTION_ID = val.PROFILE_OPTION_ID
2243 AND prf.PROFILE_OPTION_NAME = l_profile_option_name
2244 AND LEVEL_ID = 10004
2245 AND LEVEL_VALUE = c_user_id
2246 AND val.PROFILE_OPTION_VALUE = lang.NLS_LANGUAGE;
2247
2248 CURSOR c_get_site_value
2249 IS
2250 SELECT lang.LANGUAGE_CODE
2251 FROM FND_PROFILE_OPTION_VALUES val,
2252 FND_PROFILE_OPTIONS prf,
2253 FND_LANGUAGES lang
2254 WHERE prf.PROFILE_OPTION_ID = val.PROFILE_OPTION_ID
2255 AND prf.PROFILE_OPTION_NAME = l_profile_option_name
2256 AND LEVEL_ID = 10001
2257 AND LEVEL_VALUE = 0
2258 AND val.PROFILE_OPTION_VALUE = lang.NLS_LANGUAGE;
2259
2260 BEGIN
2261
2262 IF p_user_id IS NOT NULL THEN
2263 OPEN c_get_user_value (p_user_id);
2264 FETCH c_get_user_value INTO l_profile_option_value;
2265 CLOSE c_get_user_value;
2266 END IF;
2267
2268 IF l_profile_option_value IS NULL THEN
2269 OPEN c_get_site_value;
2270 FETCH c_get_site_value INTO l_profile_option_value;
2271 CLOSE c_get_site_value;
2272 END IF;
2273
2274
2275
2276 -- if profile is not set then return Null
2277 RETURN l_profile_option_value;
2278
2279 EXCEPTION
2280 WHEN OTHERS THEN
2281 RETURN NULL;
2282 END get_fnd_user_language;
2283
2284 END CSM_UTIL_PKG;