1 package body CSM_HTML5_PKG as
2 /*$Header: csmhtm5b.pls 120.1.12020000.2 2013/04/09 06:24:47 saradhak noship $*/
3
4 -- DESCRIPTION
5 -- This package is used by CSM HTML5 MFS Application
6 --
7 -- HISTORY
8 -- 01-jun-2010 saradhak Created
9 -- 17-jan-2012 saradhak Added FND VAULT
10 -- 18-mar-2013 saradhak Added Conflict Resolution
11 g_current_tranid NUMBER;
12 G_SESSION_ID number;
13
14 G_CSM_SCHEMA VARCHAR2(5):='CSM';
15 G_APPS_SCHEMA VARCHAR2(5):='APPS';
16 g_pattern varchar2(2) :='/';
17
18 TYPE numtype IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
19 TYPE clobtype IS TABLE OF CLOB INDEX BY BINARY_INTEGER;
20 prime_list numtype;
21 prime_cnt NUMBER:=0;
22
23 g_e NUMBER :=17;
24 g_n NUMBER :=3233;
25 g_d NUMBER :=2753;
26
27 g_nl_chr VARCHAR2(10) :=fnd_global.local_chr(10);
28
29 CURSOR c_get_inq_Table(c_piv_name VARCHAR2)
30 IS SELECT INQ_NAME FROM ASG_PUB_ITEM WHERE ITEM_ID =C_PIV_NAME;
31
32 procedure set_context(context_name in varchar2, attr_name in varchar2,attr_value in varchar2)
33 is begin
34 dbms_session.set_context(context_name, attr_name, attr_value);
35 end set_context;
36
37 function handle_vault(l_mode in varchar2,key in varchar2,val in varchar2 DEFAULT NULL) return varchar2
38 is
39 x varchar2(100):='Done';
40 begin
41 set_context('CSM5_VAULT_NS', 'VAULT', 'Y');
42 IF(l_mode='GET') then x:=fnd_vault.get('CSM',key);
43 else fnd_vault.puts('CSM',key,val,'CSM5_VAULT_NS.VAULT'); end if;
44 set_context('CSM5_VAULT_NS', 'VAULT', 'N');
45 return x;
46 end handle_vault;
47
48 procedure dbms_clearAllContext
49 IS
50 BEGIN
51 DBMS_SESSION.CLEAR_ALL_CONTEXT('CSM5_VAULT_NS');
52 DBMS_SESSION.SET_CONTEXT ('CSM5_VAULT_NS','APPLICATION','STARTED');
53 END dbms_clearAllContext;
54
55 procedure dbms_createContext
56 IS
57 X VARCHAR2(100);
58 BEGIN
59 begin
60 select sys_context('CSM5_VAULT_NS', 'APPLICATION') into x from dual;
61 IF(x='STARTED') THEN
62 return;
63 END IF;
64 exception
65 when others then
66 null;
67 end;
68 EXECUTE IMMEDIATE 'create context CSM5_VAULT_NS using CSM_HTML5_PKG';
69 DBMS_SESSION.SET_CONTEXT ('CSM5_VAULT_NS','APPLICATION','STARTED');
70 END dbms_createContext;
71
72 PROCEDURE PARSE_XML(l_xml_clob_payload IN CLOB,
73 X_COL_NAME_LIST OUT NOCOPY CSM_VARCHAR_LIST,
74 X_COL_VALUE_LIST OUT NOCOPY CSM_VARCHAR_LIST,
75 X_COL_NAME_IDX OUT NOCOPY numtype,
76 X_COL_CLOB_LIST OUT NOCOPY clobtype,
77 p_fix_esc_chars IN BOOLEAN:=false)
78
79 AS
80
81 --l_xml_payload XMLTYPE;
82 --l_xml_clob_payload CLOB;
83
84 l_xml_doc xmldom.DOMDocument;
85 l_xml_parser xmlparser.Parser;
86 l_xml_node_list xmldom.DOMNodeList;
87 l_xml_node xmldom.DOMNode;
88 l_xml_node_len NUMBER;
89 len2 number;
90 l_COL_NAME_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
91 L_COL_VALUE_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
92
93 BEGIN
94 --Convert it to CLOB to parse it
95 /*l_xml_clob_payload := l_xml_payload.getCLOBVal();*/
96
97 --PARSE the XML
98 l_xml_parser := xmlparser.newParser;
99 xmlparser.parseClob(l_xml_parser, l_xml_clob_payload);
100 L_XML_DOC := XMLPARSER.GETDOCUMENT(L_XML_PARSER);
101 xmlparser.freeParser(l_xml_parser);
102 l_xml_node_list := xmldom.getElementsByTagName(l_xml_doc, '*');
103 L_XML_NODE_LEN := XMLDOM.GETLENGTH(L_XML_NODE_LIST);
104 L_COL_NAME_LIST.EXTEND(L_XML_NODE_LEN);
105 l_COL_VALUE_LIST.EXTEND(l_xml_node_len);
106 -- loop through elements
107 FOR I IN 2..L_XML_NODE_LEN-1 LOOP
108 l_xml_node := xmldom.item(l_xml_node_list, i);
109
110 l_COL_NAME_LIST(i-1) := xmldom.getNodeName(l_xml_node);
111 L_XML_NODE := XMLDOM.GETFIRSTCHILD(L_XML_NODE);
112 If xmldom.getNodeType(l_xml_node) = xmldom.TEXT_NODE THEN
113 BEGIN
114 l_COL_VALUE_LIST(i-1) := xmldom.getNodeValue(l_xml_node);
115 IF p_fix_esc_chars THEN
116 l_COL_VALUE_LIST(i-1):=replace(replace(replace(l_COL_VALUE_LIST(i-1),'%amp;',fnd_global.local_chr(38)),'%lt;','<'),'%gt;','>');
117 END IF;
118
119 EXCEPTION
120 WHEN OTHERS THEN
121 IF INSTR(TO_CHAR(SQLCODE),'6502')>0 THEN
122 X_COL_NAME_IDX(i-1):=99;
123 X_COL_CLOB_LIST(i-1):=xmldom.getNodeValue(l_xml_node);
124 IF p_fix_esc_chars THEN
125 X_COL_CLOB_LIST(i-1):=replace(replace(replace(X_COL_CLOB_LIST(i-1),'%amp;',fnd_global.local_chr(38)),'%lt;','<'),'%gt;','>');
126 END IF;
127 CSM_UTIL_PKG.LOG('Found clob data in column: '||l_COL_NAME_LIST(i-1), 'CSM_HTML5_PKG.PARSE_XML',FND_LOG.LEVEL_PROCEDURE);
128 ELSE
129 CSM_UTIL_PKG.LOG('Exception with error code :'||TO_CHAR(SQLCODE)||' and message:'||substr(sqlerrm,0,2000), 'CSM_HTML5_PKG.PARSE_XML',FND_LOG.LEVEL_PROCEDURE);
130 RAISE;
131 END IF;
132 END;
133 ELSE
134 l_COL_VALUE_LIST(i-1) := NULL;
135 END IF;
136
137 END LOOP;
138 x_COL_NAME_LIST := l_COL_NAME_LIST;
139 X_COL_VALUE_LIST := L_COL_VALUE_LIST;
140
141
142 EXCEPTION WHEN OTHERS THEN
143 CSM_UTIL_PKG.LOG('Exception :'||substr(sqlerrm,0,2000), 'CSM_HTML5_PKG.PARSE_XML', FND_LOG.LEVEL_PROCEDURE);
144 RAISE;
145 END PARSE_XML;
146
147
148 PROCEDURE GET_XML_PAYLOAD
149 ( p_TABLE_NAME IN VARCHAR2,
150 p_pk_name IN VARCHAR2,
151 p_pk_value IN VARCHAR2,
152 x_XML_PAYLOAD OUT NOCOPY CLOB
153 )
154 AS
155 l_QUERY_TEXT1 VARCHAR2(1000);
156 l_xml CLOB;
157 qrycontext DBMS_XMLGEN.ctxHandle;
158 BEGIN
159 /* Notes:
160 ======
161 1. getXml fails when chr(31) or chr(0) is encountered in any of the column data
162 */
163 /* This query is causing too much SQL Parse processing.
164 Switching to bind variable processing */
165 --l_QUERY_TEXT1 := 'SELECT * FROM ' || p_TABLE_NAME ||' WHERE '|| p_pk_name||'in ('||p_pk_value||')';
166
167
168 /* Works with single column PKs. OK for now as we use it with access_id only */
169 l_QUERY_TEXT1 := 'SELECT * FROM ' ||
170 p_TABLE_NAME ||
171 ' WHERE ' || p_pk_name || ' = :PK_VALUE';
172
173 --Execute the SQL query
174 qrycontext := DBMS_XMLGEN.newcontext(l_QUERY_TEXT1) ;
175 DBMS_XMLGEN.setBindValue(qrycontext, 'PK_VALUE', p_pk_value);
176 DBMS_XMLGEN.setnullhandling (qrycontext, DBMS_XMLGEN.empty_tag);
177
178 l_xml := DBMS_XMLGEN.getxml (qrycontext);
179 dbms_xmlgen.closeContext(qrycontext);
180 x_XML_PAYLOAD := l_xml;
181
182 EXCEPTION WHEN OTHERS THEN
183 CSM_UTIL_PKG.LOG('Exception for Query:'||l_QUERY_TEXT1, 'CSM_HTML5_PKG.GET_XML_PAYLOAD', FND_LOG.LEVEL_PROCEDURE);
184 raise;
185 END GET_XML_PAYLOAD;
186
187 -----------------START CACHE APIS---------------------------
188 PROCEDURE INSERT_CACHE(P_U IN VARCHAR2,PI IN VARCHAR2,P_D IN CLOB, P_CNT IN NUMBER)
189 IS
190 PRAGMA AUTONOMOUS_TRANSACTION;
191 BEGIN
192 /* Bug 16105095. Never cache csm_sequences data */
193 IF(PI = 'CSM_SEQUENCES' AND P_U <> 'CSM_CACHE_PVT') THEN
194 ROLLBACK;
195 RETURN ;
196 END IF;
197
198 IF P_D IS NOT NULL THEN
199 INSERT INTO CSM_HTML5_CACHE(USER_NAME,PI_NAME,DATA,REC_CNT,SESSION_ID) VALUES(P_U,PI,P_D,P_CNT,G_SESSION_ID);
200 END IF;
201 COMMIT;
202 EXCEPTION
203 WHEN OTHERS THEN --unique index violation can happen for DDL cache when processed concurrently and it is insignificant
204 CSM_UTIL_PKG.LOG('Unique index violation(Race): for user:'||P_U ||' in session:'||G_SESSION_ID, 'CSM_HTML5_PKG.GET_XML_PAYLOAD', FND_LOG.LEVEL_PROCEDURE);
205 ROLLBACK;
206 IF(P_U<>'CSM_CACHE_PVT') THEN
207 RAISE;
208 END IF;
209 END INSERT_CACHE;
210
211 PROCEDURE DELETE_CACHE(PI IN VARCHAR2,P_U IN VARCHAR2:=NULL)
212 IS
213 PRAGMA AUTONOMOUS_TRANSACTION;
214 BEGIN
215 IF P_U IS NULL THEN --always
216 DELETE FROM CSM_HTML5_CACHE WHERE PI_NAME=PI;
217 ELSE
218 DELETE FROM CSM_HTML5_CACHE WHERE PI_NAME=PI AND USER_NAME=P_U;
219 END IF;
220
221 COMMIT;
222 END DELETE_CACHE;
223
224 FUNCTION GET_CACHED(P_U IN VARCHAR2,PI IN VARCHAR2,X_DATA OUT NOCOPY CLOB,X_CNT OUT NOCOPY NUMBER) RETURN BOOLEAN
225 IS
226 BEGIN
227 /* Bug 16105095. Never cache csm_sequences data*/
228 IF(PI = 'CSM_SEQUENCES' AND P_U <> 'CSM_CACHE_PVT') THEN
229 RETURN FALSE;
230 END IF;
231
232 SELECT DATA,REC_CNT INTO X_DATA,X_CNT FROM CSM_HTML5_CACHE WHERE USER_NAME=P_U AND PI_NAME=PI;
233 CSM_UTIL_PKG.LOG(pi||' hit in '||p_u||' cache', 'CSM_HTML5_PKG.GET_CACHED', FND_LOG.LEVEL_PROCEDURE);
234 RETURN TRUE;
235 EXCEPTION
236 WHEN OTHERS THEN
237 RETURN FALSE;
238 END GET_CACHED;
239
240 PROCEDURE REMOVE_DIRTY_CACHE
241 IS
242 PRAGMA AUTONOMOUS_TRANSACTION;
243 BEGIN
244 DELETE FROM CSM_HTML5_CACHE B WHERE EXISTS(SELECT 1 FROM ASG_SYSTEM_DIRTY_QUEUE
245 WHERE CLIENT_ID=B.USER_NAME
246 AND PUB_ITEM=B.PI_NAME);
247 COMMIT;
248 END REMOVE_DIRTY_CACHE;
249
250 -----------------END CACHE APIs---------------------------
251
252 Procedure getPrimes
253 IS
254 prime boolean;
255 begin
256 if(prime_list.count > 0) then
257 return;
258 end if;
259
260 for i in reverse 3..200
261 loop
262 prime:=true;
263 for j in 2..sqrt(i)
264 loop
265 if (mod(i,j)=0) then prime:=false; exit;
266 end if;
267 end loop;
268
269 if(prime) then
270 prime_cnt:=prime_cnt+1;
271 prime_list(prime_cnt) := i;
272 end if;
273 end loop;
274 end getPrimes;
275
276 FUNCTION GCD(small number, big number) return NUMBER
277 IS
278 modl number;
279 begin
280 if(small > big) then return GCD(big,small); end if;
281
282 modl:= mod(big,small);
283 if( modl = 0) then return small;
284 else return GCD(modl,small);
285 end if;
286 end GCD;
287
288 FUNCTION isCoPrime(a in NUMBER, b in number) return boolean
289 IS
290 BEGIN
291 if(GCD(a,b)=1) then return true;
292 else return false; end if;
293 END isCoPrime;
294
295 FUNCTION nextInt (minN IN NUMBER, maxN IN number) RETURN NUMBER
296 IS
297 x NUMBER;
298 modl number;
299 BEGIN
300 x:= round(dbms_random.value*100000);
301
302 modl := mod(x,maxN);
303
304 IF (modl<minN) THEN RETURN nextInt(minN,maxN);
305 ELSE RETURN modl; END IF;
306
307 END nextInt;
308
309
310 FUNCTION generate_rsa_keys return VARCHAR2
311 IS
312 p number; i number; e number;
313 q number; k number; phi number;
314 r number; n number; d number;
315 BEGIN
316
317 if(prime_list.count = 0) then
318 getPrimes;
319 end if;
320
321 k:=ceil(prime_cnt/2);
322 i:=nextInt(1,k+1);
323 p:=prime_list(i);
324
325 i:=nextInt(k+1,prime_cnt-1);
326 q:=prime_list(i);
327
328 -- insert into csm_log values('Chosen Primes in '||prime_cnt||': p=' || p||' and q='||q ,sysdate);
329
330 phi :=(p-1)*(q-1);
331 n := p*q;
332
333 loop
334 e:=nextInt(2,phi+1);
335 exit when isCoPrime(e,phi);
336 end loop;
337
338 d:=phi;
339
340 loop
341 d:=d-1;
342 exit when ( d>1 and (mod((d*e),phi) = 1) );
343 if(d<0) then
344 return generate_rsa_keys;
345 end if;
346 end loop;
347
348 return e||':'||d||':'||n;
349 END generate_rsa_keys;
350
351 PROCEDURE set_rsa_keys(p_user_name IN VARCHAR2,x_e OUT NOCOPY NUMBER,x_d OUT NOCOPY NUMBER, x_n OUT NOCOPY NUMBER
352 ,p_in_prof IN VARCHAR2 :='RSA_KEY')
353 IS
354 l_str VARCHAR2(200);
355 l_t1 NUMBER;
356 l_t2 NUMBER;
357 BEGIN
358
359 IF p_in_prof='RSA_KEY' THEN
360 l_str:=handle_vault('GET','RSA_KEY_'||asg_base.get_user_id(p_user_name));
361 --CSM_UTIL_PKG.LOG('vault get:'||l_str, 'CSM_HTML5_PKG.set_rsa_keys', FND_LOG.LEVEL_PROCEDURE);
362 ELSE
363 select prf_value into l_str from csm_html5_clients_info where user_name=p_user_name and prf_name=p_in_prof;
364 END IF;
365
366 l_t1:=instr(l_str,':',1,1);
367 l_t2:=instr(l_str,':',1,2);
368 x_e:=to_number(substr(l_str,1,l_t1-1));
369 x_d:=to_number(substr(l_str,l_t1+1,l_t2-l_t1-1));
370 x_n:=to_number(substr(l_str,l_t2+1));
371 Exception
372 when others then
373 x_e:=g_e;
374 x_d:=g_d;
375 x_n:=g_n;
376 END set_rsa_keys;
377
378 function modPow(num in number,e in number,m in number) return NUMBER
379 IS
380 res NUMBER:=num;
381 BEGIN
382 for i in 2..e
383 loop
384 res:=mod((res *num),m);
385 end loop;
386 return res;
387 end modPow;
388
389 function decrypt(p_user_name IN VARCHAR2, input in varchar2) return varchar2
390 IS
391 crypted VARCHAR2(1000) :=input;
392
393 y number;
394 decrypted VARCHAR2(100) :='';
395 l_e NUMBER := g_e;
396 l_d NUMBER := g_d;
397 l_n NUMBER := g_n;
398
399 BEGIN
400
401 set_rsa_keys(p_user_name,l_e,l_d,l_n);
402
403 loop
404 exit when crypted is null or instr(crypted,g_pattern)=0 ;
405 y:=instr(crypted,g_pattern);
406 decrypted := decrypted || fnd_global.local_chr(modPow(substr(crypted,1,y-1), l_d,l_n));
407 crypted:=substr(crypted,y+length(g_pattern));
408 end loop;
409 return decrypted;
410 END decrypt;
411
412 function removeHex(input in varchar2) return varchar2
413 is
414 inp varchar2(1000):=input;
415 begin
416 for i in 97..102
417 loop
418 inp:=replace(inp,fnd_global.local_chr(i),i-87);
419 end loop;
420 return inp;
421 end removeHex;
422
423 function decode(p_input in varchar2) return varchar2
424 IS
425 input varchar2(1000) :=removeHex(p_input);
426 CNT NUMBER :=to_number(substr(input,-1));
427 INP VARCHAR2(1000) :=substr(input,1,length(input)-1);
428 places VARCHAR2(100);
429 a VARCHAR2(1000);
430 b VARCHAR2(1000);
431 BEGIN
432
433 cnt:= to_number(substr(inp, (-1 * cnt)));
434 inp:=substr(inp,1,length(inp)-length(to_char(cnt)));
435 places:= substr(inp, (-1 * cnt));
436 inp:=substr(inp,1,length(inp)-cnt-1); --last place append "/"
437
438 cnt:=0;
439 for i in 1..length(places)
440 LOOP
441 cnt:=cnt + to_number(substr(places,i,1));
442 a:=substr(inp,1,cnt-1);
443 b:=substr(inp,cnt+1);
444 inp:=a||g_pattern||b;
445 END LOOP;
446
447 return inp ||'/';
448
449 END decode;
450
451 Function encode(p_input IN VARCHAR2) return VARCHAR2
452 IS
453 k number; y number; a varchar2(2000); b varchar2(2000);
454 re VARCHAR2(4000):=p_input;
455 codedAt VARCHAR2(1000) :='';
456 str varchar2(100);
457 begin
458 k:=length(p_input);
459
460 while(instr(re,g_pattern) <> 0)
461 loop
462 y:=instr(re,g_pattern);
463 a:=substr(re,1,y-1);
464 b:=substr(re, (y+length(g_pattern)));
465 codedAt:=codedAt||to_char((k-nvl(length(b),0)));
466 k:=nvl(length(b),0);
467 re:=a||to_char( mod(to_number(substr(dbms_random.value,2,10)),10))||b;
468 end loop;
469
470 str:=to_char(length(codedAt)-1); --last / not reqd, omit
471 codedAt:=substr(codedAt,1,length(codedAt)-1)||str||length(str);
472 re := re||codedAt;
473 return re;
474 end encode;
475
476 function encrypt(p_input IN VARCHAR2,p_e IN NUMBER,p_n IN NUMBER) return varchar2
477 IS
478 crypted varchar2(4000):= '';
479 ch char(1);
480 begin
481 for i in 1..length(p_input)
482 loop
483 ch:=substr(p_input,i,1);
484 crypted := crypted || to_char(modPow(ascii(ch), p_e,p_n)) ||g_pattern;
485 end loop;
486
487 return crypted;
488 end;
489
490 procedure set_user_profile(p_uname IN VARCHAR2,pname IN VARCHAR2, pvalue IN VARCHAR2)
491 is PRAGMA AUTONOMOUS_TRANSACTION;
492 x varchar2(100);
493 begin
494
495 IF pname='RSA_KEY' THEN
496 x:=handle_vault('PUT','RSA_KEY_'||asg_base.get_user_id(p_uname),pvalue); --key size max is 30
497 --CSM_UTIL_PKG.LOG('vault put:'||x, 'CSM_HTML5_PKG.set_user_profile', FND_LOG.LEVEL_PROCEDURE);
498 ELSE
499 UPDATE csm_html5_clients_info SET PRF_VALUE=pvalue
500 WHERE PRF_NAME=pname AND USER_NAME=p_uname;
501
502 IF SQL%ROWCOUNT= 0 THEN
503 INSERT INTO csm_html5_clients_info(USER_NAME,PRF_NAME,PRF_VALUE) VALUES(p_uname,pname, pvalue);
504 END IF;
505
506 END IF;
507 COMMIT;
508 end set_user_profile;
509
510 function get_rsa_keys(x_e OUT NOCOPY NUMBER,x_d OUT NOCOPY NUMBER, x_n OUT NOCOPY NUMBER) return VARCHAR2
511 Is
512 l_str VARCHAR2(200);
513 l_t1 NUMBER;
514 l_t2 NUMBER;
515 BEGIN
516
517 l_str:=generate_rsa_keys;
518
519 l_t1:=instr(l_str,':',1,1);
520 l_t2:=instr(l_str,':',1,2);
521 x_e:=to_number(substr(l_str,1,l_t1-1));
522 x_d:=to_number(substr(l_str,l_t1+1,l_t2-l_t1-1));
523 x_n:=to_number(substr(l_str,l_t2+1));
524
525 return l_str;
526 end get_rsa_keys;
527
528 procedure MARK_ERROR(p_user_name IN VARCHAR2, p_PI_NAME IN VARCHAR2, p_pk_value IN VARCHAR2)
529 IS
530 l_temp VARCHAR2(4000);
531 l_t1 NUMBER;
532 l_t2 NUMBER;
533 found boolean:=false;
534 l_sub varchar2(4000);
535 l_sub2 varchar2(4000);
536 BEGIN
537 BEGIN
538 SELECT PRF_VALUE INTO l_temp FROM csm_html5_clients_info
539 WHERE USER_NAME=p_user_name
540 AND PRF_NAME='XML_ERROR';
541
542 IF length(l_temp)>3000 THEN
543 UPDATE csm_html5_clients_info
544 SET PRF_VALUE=l_temp||'.'
545 WHERE USER_NAME=p_user_name
546 AND PRF_NAME='XML_ERROR';
547 CSM_UTIL_PKG.LOG('No more space to MARK_ERROR' , 'CSM_HTML5_PKG.MARK_ERROR', FND_LOG.LEVEL_PROCEDURE);
548 RETURN;
549 END IF;
550
551 l_t1 := INSTR(l_temp,p_PI_NAME);
552
553 IF l_t1>0 THEN
554 l_t2:=INSTR(l_temp,';',l_t1);
555 l_t1:=length(p_PI_NAME)+1;
556 l_sub:=substr(l_temp,l_t1,l_t2-l_t1);
557 found := false;
558 LOOP
559 l_t1:=INSTR(l_sub,'-');
560 If l_t1>0 THEN
561 l_sub2:= substr(l_sub,1,l_t1-1);
562 l_sub:=substr(l_sub,l_t1+1);
563 ELSE
564 l_sub2 := l_sub;
565 l_sub:='';
566 END IF;
567 IF (l_sub2 = p_pk_value) THEN
568 found:=true;
569 END IF;
570 EXIT WHEN found OR l_t1<=0;
571 END LOOP;
572
573 IF found THEN
574 return;
575 END IF;
576
577 l_temp:=replace(l_temp,p_PI_NAME||':',p_PI_NAME||':'||p_pk_value||'-');
578 ELSE
579 l_temp:=l_temp||p_PI_NAME||':'||p_pk_value||';';
580 END IF;
581
582 UPDATE csm_html5_clients_info
583 SET PRF_VALUE=l_temp
584 WHERE USER_NAME=p_user_name
585 AND PRF_NAME='XML_ERROR';
586
587 EXCEPTION
588 WHEN no_data_found THEN
589 INSERT INTO csm_html5_clients_info(USER_NAME,PRF_NAME,PRF_VALUE) VALUES(p_user_name,'XML_ERROR',p_PI_NAME||':'||p_pk_value||';');
590 END;
591 EXCEPTION
592 WHEN OTHERS THEN
593 CSM_UTIL_PKG.LOG('Exception occurred in MARK_ERROR: ' || substr(sqlerrm,0,2000), 'CSM_HTML5_PKG.MARK_ERROR', FND_LOG.LEVEL_PROCEDURE);
594 END MARK_ERROR;
595
596
597 PROCEDURE set_indx_ref(p_idx IN VARCHAR2)
598 IS
599 BEGIN
600 FOR rec IN (SELECT USER_NAME FROM ASG_USER au WHERE ENABLED='Y' AND MULTI_PLATFORM='Y'
601 AND NOT EXISTS(SELECT 1 FROM CSM_HTML5_CLIENTS_INFO
602 WHERE USER_NAME=au.USER_NAME AND PRF_NAME='INDXREF' AND PRF_VALUE=p_idx)
603 AND EXISTS(SELECT 1 FROM CSM_HTML5_SYNC_INFO WHERE USER_NAME =au.USER_NAME)
604 )
605 LOOP
606 INSERT INTO CSM_HTML5_CLIENTS_INFO(USER_NAME,PRF_NAME,PRF_VALUE) VALUES(rec.USER_NAME,'INDXREF',p_idx);
607 END LOOP;
608
609 DELETE FROM CSM_HTML5_CACHE WHERE USER_NAME='APPLICATION' AND PI_NAME=(SELECT ITEM_ID FROM ASG_PUB_ITEM_INDEX WHERE INDEX_ID=p_idx) ;
610 END set_indx_ref;
611
612 PROCEDURE set_indx_ref(p_user_name IN VARCHAR2,p_idx IN VARCHAR2)
613 IS
614 BEGIN
615 FOR rec IN (SELECT USER_NAME FROM ASG_USER au WHERE ENABLED='Y' AND MULTI_PLATFORM='Y' AND USER_NAME=p_USER_NAME
616 AND NOT EXISTS(SELECT 1 FROM CSM_HTML5_CLIENTS_INFO
617 WHERE USER_NAME=au.USER_NAME AND PRF_NAME='INDXREF' AND PRF_VALUE=p_idx)
618 AND EXISTS(SELECT 1 FROM CSM_HTML5_SYNC_INFO WHERE USER_NAME =au.USER_NAME)
619 )
620 LOOP
621 INSERT INTO CSM_HTML5_CLIENTS_INFO(USER_NAME,PRF_NAME,PRF_VALUE) VALUES(rec.USER_NAME,'INDXREF',p_idx);
622 END LOOP;
623
624 DELETE FROM CSM_HTML5_CACHE WHERE USER_NAME='APPLICATION' AND PI_NAME=(SELECT ITEM_ID FROM ASG_PUB_ITEM_INDEX WHERE INDEX_ID=p_idx) ;
625 END set_indx_ref;
626
627 PROCEDURE remove_indx_ref(p_USER_NAME IN VARCHAR2)
628 IS
629 BEGIN
630 DELETE FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_USER_NAME AND PRF_NAME like 'INDXREF%';
631 END remove_indx_ref;
632
633 PROCEDURE remove_indx_ref(p_user_name IN VARCHAR2,p_pi IN VARCHAR2)
634 IS
635 BEGIN
636 IF p_user_name is NULL THEN
637 DELETE FROM CSM_HTML5_CLIENTS_INFO WHERE PRF_NAME='INDXREF' AND PRF_VALUE IN (SELECT INDEX_ID FROM ASG_PUB_ITEM_INDEX WHERE ITEM_ID=p_pi);
638 ELSE
639 DELETE FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_USER_NAME
640 AND PRF_NAME='INDXREF' AND PRF_VALUE IN (SELECT INDEX_ID FROM ASG_PUB_ITEM_INDEX WHERE ITEM_ID=p_pi);
641 END IF;
642 END remove_indx_ref;
643
644 PROCEDURE mark_pi_altered(p_pi IN VARCHAR2)
645 IS
646 BEGIN
647 DELETE FROM csm_html5_clients_info WHERE USER_NAME='APPLICATION' AND PRF_NAME='SCHEMA_REUSE';
648 csm_html5_pkg.set_comp_ref(p_pi);
649 DELETE_CACHE(p_pi);
650 END mark_pi_altered;
651
652 PROCEDURE set_comp_ref(p_pi IN VARCHAR2)
653 IS
654 BEGIN
655 FOR rec IN (SELECT USER_NAME FROM ASG_USER au WHERE ENABLED='Y' AND MULTI_PLATFORM='Y'
656 AND NOT EXISTS(SELECT 1 FROM CSM_HTML5_CLIENTS_INFO
657 WHERE USER_NAME=au.USER_NAME AND PRF_NAME='COMPREF' AND PRF_VALUE=p_pi)
658 AND NOT EXISTS(SELECT 1 FROM ASG_PURGE_SDQ WHERE USER_NAME =au.USER_NAME AND pub_name = 'SERVICEP' AND TRANSACTION_ID IS NULL)
659 )
660 LOOP
661 INSERT INTO CSM_HTML5_CLIENTS_INFO(USER_NAME,PRF_NAME,PRF_VALUE) VALUES(rec.USER_NAME,'COMPREF',p_pi);
662 END LOOP;
663 remove_indx_ref(null,p_pi);
664 END set_comp_ref;
665
666 PROCEDURE set_comp_ref(p_user_name IN VARCHAR2,p_pi IN VARCHAR2) --any arbitrary pi_name as well
667 IS
668 BEGIN
669 FOR rec IN (SELECT USER_NAME FROM ASG_USER au WHERE ENABLED='Y' AND MULTI_PLATFORM='Y' AND USER_NAME=p_user_name
670 AND MULTI_PLATFORM='Y' AND NOT EXISTS(SELECT 1 FROM CSM_HTML5_CLIENTS_INFO
671 WHERE USER_NAME=au.USER_NAME AND PRF_NAME='COMPREF' AND PRF_VALUE=p_pi))
672 LOOP
673 INSERT INTO CSM_HTML5_CLIENTS_INFO(USER_NAME,PRF_NAME,PRF_VALUE) VALUES(p_USER_NAME,'COMPREF',p_pi);
674 END LOOP;
675 remove_indx_ref(p_user_name,p_pi);
676 END set_comp_ref;
677
678 PROCEDURE remove_comp_ref(p_user_name IN VARCHAR2,p_pi IN VARCHAR2)
679 IS
680 BEGIN
681 DELETE FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_USER_NAME
682 AND PRF_NAME='COMPREF' AND PRF_VALUE=p_pi;
683 END remove_comp_ref;
684
685 PROCEDURE remove_comp_ref(p_user_name IN VARCHAR2)
686 IS
687 BEGIN
688 DELETE FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_USER_NAME AND PRF_NAME like 'COMPREF%';
689 remove_indx_ref(p_user_name);
690 END remove_comp_ref;
691
692 FUNCTION blob_to_clob (blob_in IN BLOB) RETURN CLOB
693 AS
694 v_clob CLOB;
695 v_varchar VARCHAR2(32767);
696 v_start PLS_INTEGER := 1;
697 v_buffer PLS_INTEGER := 32767;
698 BEGIN
699 DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
700
701 FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer)
702 LOOP
703 v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start));
704
705 DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
706
707 v_start := v_start + v_buffer;
708 END LOOP;
709
710 RETURN v_clob;
711
712 END blob_to_clob;
713
714 FUNCTION clob_to_blob (p_clob CLOB) return BLOB
715 as
716 l_blob blob;
717 l_dest_offset integer := 1;
718 l_source_offset integer := 1;
719 l_lang_context integer := DBMS_LOB.DEFAULT_LANG_CTX;
720 l_warning integer := DBMS_LOB.WARN_INCONVERTIBLE_CHAR;
721 BEGIN
722 DBMS_LOB.CREATETEMPORARY(l_blob, TRUE);
723 DBMS_LOB.CONVERTTOBLOB
724 (
725 dest_lob =>l_blob,
726 src_clob =>p_clob,
727 amount =>DBMS_LOB.LOBMAXSIZE,
728 dest_offset =>l_dest_offset,
729 src_offset =>l_source_offset,
730 blob_csid =>DBMS_LOB.DEFAULT_CSID,
731 lang_context=>l_lang_context,
732 warning =>l_warning
733 );
734 return l_blob;
735 END clob_to_blob;
736
737 FUNCTION get_index_refresh(p_user_name IN VARCHAR2) RETURN CLOB
738 IS
739 l_stmt CLOB:='';
740 BEGIN
741 FOR rec IN (SELECT item_id ,index_name,index_columns,enabled
742 FROM CSM_HTML5_CLIENTS_INFO a, ASG_PUB_ITEM_INDEX b
743 WHERE a.USER_NAME=p_user_name AND a.PRF_NAME='INDXREF'
744 AND a.PRF_VALUE=b.index_id)
745 LOOP
746 l_stmt:=l_stmt||'appsdb.doDDL("DROP INDEX '||rec.index_name||'",[],";",";");'||g_nl_chr;
747 IF rec.ENABLED='Y' THEN
748 IF(SUBSTR(rec.index_name,-2,1)='U') THEN --assumes only 9 indexes per table
749 l_stmt:=l_stmt||'appsdb.doDDL("CREATE UNIQUE INDEX IF NOT EXISTS '||rec.index_name||' ON '||rec.ITEM_ID||'('||rec.index_columns||')");'||g_nl_chr;
750 ELSE
751 l_stmt:=l_stmt||'appsdb.doDDL("CREATE INDEX IF NOT EXISTS '||rec.index_name||' ON '||rec.ITEM_ID||'('||rec.index_columns||')");'||g_nl_chr;
752 END IF;
753 END IF;
754 END LOOP;
755 return l_stmt;
756 END get_index_refresh ;
757
758 FUNCTION create_index_js( p_pi IN VARCHAR2) RETURN CLOB
759 IS
760 l_stmt CLOB:='';
761 BEGIN
762 FOR rec IN (select index_name,index_columns,enabled from ASG_PUB_ITEM_INDEX where item_id =p_pi)
763 LOOP
764 l_stmt:=l_stmt||'appsdb.doDDL("DROP INDEX '||rec.index_name||'",[],";",";");'||g_nl_chr;
765 IF rec.ENABLED='Y' THEN
766 IF(SUBSTR(rec.index_name,-2,1)='U') THEN --assumes only 9 indexes per table
767 l_stmt:=l_stmt||'appsdb.doDDL("CREATE UNIQUE INDEX IF NOT EXISTS '||rec.index_name||' ON '||p_pi||'('||rec.index_columns||')");'||g_nl_chr;
768 ELSE
769 l_stmt:=l_stmt||'appsdb.doDDL("CREATE INDEX IF NOT EXISTS '||rec.index_name||' ON '||p_pi||'('||rec.index_columns||')");'||g_nl_chr;
770 END IF;
771 END IF;
772 END LOOP;
773 return l_stmt;
774 END create_index_js;
775
776 FUNCTION create_table_js( p_pi IN VARCHAR2) RETURN CLOB
777 IS
778 TYPE l_type IS TABLE OF VARCHAR2(500) INDEX BY BINARY_INTEGER;
779 l_name_tab l_type; l_dtype_tab l_type;
780 l_stmt CLOB:=empty_clob();
781 l_pk_cols VARCHAR2(1000);
782 l_error_message varchar2(4000);
783 TYPE c_curtype is ref cursor;
784 c_cur c_curtype;
785 l_cached BOOLEAN:=false;
786 l_temp NUMBER;
787 BEGIN
788
789 l_cached:=GET_CACHED('CSM_CACHE_PVT',p_pi,l_stmt,l_temp);
790
791 IF NOT l_cached THEN
792 l_stmt:=g_nl_chr;
793 for rec in (select item_id,upper(base_object_name) piv,primary_key_column from asg_pub_item where item_id=p_pi and rownum=1) --only one record selected any way
794 loop
795 l_name_tab.DELETE;
796 l_dtype_tab.DELETE;
797 l_pk_cols:=rec.primary_key_column;
798
799 OPEN c_cur FOR 'select column_name,decode(data_type,''CLOB'',''TEXT'',''CHAR'',''TEXT'',''VARCHAR2'',''TEXT'',''DATE'',''TIME'',''NUMBER'',DECODE(NVL(DATA_SCALE,0),0,''INTEGER'',''REAL''),data_type)
800 from all_tab_columns where owner='''||G_APPS_SCHEMA||''' and table_name='''||rec.piv||''' order by column_id';
801 FETCH c_cur BULK COLLECT INTO l_name_tab,l_dtype_tab;
802 l_stmt:=l_stmt ||'appsdb.doDDL(';
803 l_stmt:=l_stmt||'''CREATE TABLE IF NOT EXISTS '||rec.item_id ||'(';
804 FOR I IN 1..l_name_tab.COUNT
805 LOOP
806 IF(I>1) THEN
807 l_stmt:=l_stmt||',';
808 END IF;
809 l_stmt:=l_stmt||l_name_tab(I)||' '||l_dtype_tab(I);
810 END LOOP;
811
812 l_stmt:=l_stmt||')'');'||g_nl_chr;
813
814 l_stmt:=l_stmt||'appsdb.doDDL("CREATE UNIQUE INDEX IF NOT EXISTS '||p_pi||'_U1_SYS ON '||p_pi||'(ACCESS_ID)");'||g_nl_chr
815 ||'appsdb.doDDL("CREATE UNIQUE INDEX IF NOT EXISTS '||p_pi||'_U2_SYS ON '||p_pi||'('||l_pk_cols||')");'||g_nl_chr;
816
817 CLOSE c_cur;
818 end loop;
819
820 l_stmt:='appsdb.doDDL("DROP INDEX '||p_pi||'_U1_SYS",[],";",";");'||g_nl_chr
821 ||'appsdb.doDDL("DROP INDEX '||p_pi||'_U2_SYS",[],";",";");'||g_nl_chr
822 ||'appsdb.doDDL("DROP TABLE '||p_pi||'",[],";",";");'||l_stmt;
823
824 l_stmt:=l_stmt||create_index_js(p_pi);
825
826 INSERT_CACHE('CSM_CACHE_PVT',p_pi,l_stmt,null);
827 END IF;
828
829 return l_stmt;
830
831 EXCEPTION
832 WHEN others THEN
833 CSM_UTIL_PKG.LOG('Exception occurred in create_table_js: ' || substr(sqlerrm,0,2000), 'CSM_HTML5_PKG.create_table_js', FND_LOG.LEVEL_PROCEDURE);
834 raise;
835 END create_table_js;
836
837 procedure query_get_schema_js(p_result OUT nocopy CLOB,
838 x_return_status OUT nocopy VARCHAR2,
839 x_error_message OUT nocopy VARCHAR2)
840 IS
841 l_stmt CLOB:=g_nl_chr;
842
843 BEGIN
844
845 x_return_status:=fnd_api.g_ret_sts_success;
846 x_error_message:='Success';
847
848 l_stmt := l_stmt ||'function create_mfs_schema(){ '||g_nl_chr;
849
850 for rec in (select item_id,query1 from asg_pub_item where pub_name='SERVICEP' and enabled='Y'
851 and nvl(html5_offline,'N')='Y')
852 loop
853 CSM_UTIL_PKG.LOG('Processing schema of '||rec.item_id,'CSM_HTML5_PKG.query_get_schema_js',FND_LOG.LEVEL_ERROR);
854 l_stmt := l_stmt||create_table_js(rec.item_id);
855 end loop;
856
857 l_stmt := l_stmt||'}'||g_nl_chr;
858 p_result:=l_stmt;
859 EXCEPTION
860 WHEN others THEN
861 x_return_status := fnd_api.g_ret_sts_error;
862 x_error_message := 'Exception occurred in query_get_schema_js: ' || substr(sqlerrm,0,2000);
863 CSM_UTIL_PKG.LOG(x_error_message, 'CSM_HTML5_PKG.query_get_schema_js', FND_LOG.LEVEL_PROCEDURE);
864 END query_get_schema_js;
865
866 procedure query_schema_js( p_user_name IN VARCHAR2,
867 p_result OUT nocopy CLOB,
868 x_return_status OUT nocopy VARCHAR2,
869 x_error_message OUT nocopy VARCHAR2)
870 IS
871
872 instId number:=-1; ret VARCHAR2(1); m varchar2(4000);
873 l_id CSM_INTEGER_LIST :=CSM_INTEGER_LIST();
874 l_ch CSM_VARCHAR_LIST:=CSM_VARCHAR_LIST();
875 l_dt CSM_DATE_LIST:=CSM_DATE_LIST();
876 l_blob BLOB:=empty_blob();
877
878 BEGIN
879
880 x_return_status:=fnd_api.g_ret_sts_success;
881 x_error_message:='Success';
882
883 BEGIN
884 SELECT to_number(PRF_VALUE) into instId FROM csm_html5_clients_info WHERE USER_NAME='APPLICATION' AND PRF_NAME='SCHEMA_REUSE';
885
886 select result into l_blob from csm_query_results_acc where instance_id = instId and query_id=5;
887 p_result:=blob_to_clob(l_blob);
888 CSM_UTIL_PKG.LOG('Schema Reused from instance:'||instId, 'CSM_HTML5_PKG.query_schema_js', FND_LOG.LEVEL_PROCEDURE);
889 RETURN;
890 EXCEPTION
891 WHEN Others THEN
892 instId:=-1;
893 END;
894
895 CSM_QUERY_PKG.INSERT_INSTANCE(asg_base.get_user_id(p_user_name), 5, NULL, 'REUSABLE_SCHEMA', l_id, l_ch, l_dt,NULL, instId, ret, m);
896
897 CSM_UTIL_PKG.LOG('Instance Insert Status:'||instId||':'||ret||':'||m, 'CSM_HTML5_PKG.query_schema_js', FND_LOG.LEVEL_PROCEDURE);
898
899 IF (ret=fnd_api.g_ret_sts_success) THEN
900 query_get_schema_js(p_result,ret,m);
901
902 IF (ret=fnd_api.g_ret_sts_success) THEN
903 l_blob:=clob_to_blob(p_result);
904 INSERT INTO CSM_QUERY_RESULTS_ACC(ACCESS_ID , USER_ID , QUERY_ID , INSTANCE_ID , LINE_ID,
905 RESULT ,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY, LAST_UPDATE_DATE,LAST_UPDATE_LOGIN)
906 VALUES (CSM_QUERY_RESULTS_ACC_S.NEXTVAL, asg_base.get_user_id(p_user_name), 5, instId, 1,
907 l_blob, fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE, fnd_global.login_id);
908
909 set_user_profile('APPLICATION','SCHEMA_REUSE',to_char(instId));
910 RETURN;
911 ELSE
912 CSM_UTIL_PKG.LOG(m, 'CSM_HTML5_PKG.query_schema_js', FND_LOG.LEVEL_PROCEDURE);
913 END IF;
914 END IF;
915
916 x_return_status:=ret;
917 x_error_message:=m;
918
919 END query_schema_js;
920
921 PROCEDURE create_ajax_session(p_user_name IN VARCHAR2,p_response IN VARCHAR2,p_sync_id IN NUMBER:=NULL)
922 IS
923 PRAGMA AUTONOMOUS_TRANSACTION;
924 BEGIN
925
926 INSERT INTO csm_html5_ajax_info(AJAX_SESSION_ID,USER_NAME,CREATION_DATE,SYNC_RESPONSE,SYNC_ID)
927 VALUES(csm_html5_ajax_s.NEXTVAL,p_user_name,SYSDATE,p_response,p_sync_id);
928
929 COMMIT;
930 END create_ajax_session;
931
932 FUNCTION create_session(p_user_name IN VARCHAR2,p_mode IN VARCHAR2,p_full_sync IN VARCHAR2 :='N') return NUMBER
933 IS
934 PRAGMA AUTONOMOUS_TRANSACTION;
935 l_session_id NUMBER;
936 l_instance NUMBER:=CSM_QUERY_PKG.G_INST_IN_PROCESS;
937 l_cnt NUMBER:=0;
938 BEGIN
939
940 SELECT csm_html5_sync_s.NEXTVAL INTO l_session_id FROM DUAL;
941
942 INSERT INTO csm_html5_sync_info(SESSION_ID,USER_NAME,START_DATE,FULL_SYNC,STATUS,STATUS_DESC,SYNC_TYPE,Q_INSTANCE_ID)
943 VALUES(l_session_id,p_user_name,SYSDATE,p_full_sync,'IN_PROGRESS','Sync has started successfuly',p_mode,l_instance);
944
945 create_ajax_session(p_user_name,'Sync thru Ajax succeeded',l_session_id);
946
947 COMMIT;
948 RETURN l_session_id;
949 END create_session;
950
951
952 procedure update_session_details(p_session_id IN NUMBER,p_pi IN VARCHAR2, p_count IN NUMBER,p_dummy IN OUT NOCOPY BOOLEAN,p_comp_ref IN VARCHAR2 :='N')
953 IS
954 PRAGMA AUTONOMOUS_TRANSACTION;
955 BEGIN
956
957 INSERT INTO csm_html5_sync_details(SESSION_ID, pi_name,record_count,comp_ref)
958 values(p_session_id,p_pi,p_count,p_comp_ref);
959
960 IF(p_dummy) THEN
961 p_dummy := false;
962 UPDATE csm_html5_sync_info SET STATUS_DESC=STATUS_DESC||' :Processed pi-s :'||p_pi
963 WHERE SESSION_ID=p_session_id;
964 ELSE
965 UPDATE csm_html5_sync_info SET STATUS_DESC=STATUS_DESC||' ,'||p_pi
966 WHERE SESSION_ID=p_session_id;
967 END IF;
968
969 COMMIT;
970 END update_session_details;
971
972 procedure end_session(p_session_id IN NUMBER,p_status IN VARCHAR2, p_status_desc IN VARCHAR2:=NULL)
973 IS
974 PRAGMA AUTONOMOUS_TRANSACTION;
975 BEGIN
976
977 UPDATE csm_html5_sync_info SET END_DATE=SYSDATE ,STATUS =p_status,STATUS_DESC=NVL(p_status_desc,STATUS_DESC||' : Sync Ended Successfully.')
978 WHERE SESSION_ID=p_session_id;
979
980 COMMIT;
981 END end_session;
982
983 FUNCTION hasHTML5Enabled(p_user_name IN VARCHAR2) return BOOLEAN
984 IS
985 x NUMBER;
986 BEGIN
987 SELECT USER_ID INTO x FROM ASG_USER
988 WHERE USER_NAME=p_user_name
989 AND ENABLED='Y'
990 AND MULTI_PLATFORM='Y';
991
992 RETURN TRUE;
993 EXCEPTION
994 WHEN OTHERS THEN
995 RETURN FALSE;
996 END hasHTML5Enabled;
997
998 FUNCTION authenticate(p_user_name IN VARCHAR2, p_password IN VARCHAR2) RETURN BOOLEAN
999 IS
1000 l_password VARCHAR2(200);
1001 l_b NUMBER;
1002 BEGIN
1003
1004 IF NOT hasHTML5Enabled(p_user_name) THEN
1005 RETURN FALSE;
1006 END IF;
1007
1008 l_password := decrypt(p_user_name,decode(p_password));
1009
1010 IF isOIDAuth(p_user_name) THEN
1011 --Bug 14057306
1012 /* RETURN FND_USER_PKG.ValidateSSOLogin(p_user_name,l_password); -- Some may not have applied FND pre-req, they shd use "/local" */
1013 execute immediate 'DECLARE x number:=0; BEGIN IF FND_USER_PKG.ValidateSSOLogin(:1,:2) THEN x:=1; END IF; :3:=x; END;' using p_user_name,l_password, out l_b;
1014
1015 if l_b<>0 then
1016 RETURN TRUE;
1017 else
1018 RETURN FALSE;
1019 end if;
1020 ELSE
1021 RETURN FND_USER_PKG.ValidateLogin(p_user_name,l_password);
1022 END IF;
1023 END authenticate;
1024
1025 procedure query_validate_user( p_user_name IN VARCHAR2,
1026 p_password IN VARCHAR2,
1027 p_result OUT nocopy CLOB,
1028 x_return_status OUT nocopy VARCHAR2,
1029 x_error_message OUT nocopy VARCHAR2)
1030 Is
1031 l_final CLOB:='';
1032 l_response VARCHAR2(200);
1033 l_str VARCHAR2(100);
1034 BEGIN
1035
1036 x_return_status:=fnd_api.g_ret_sts_success;
1037 x_error_message:='Success';
1038
1039 IF NOT isHTML5User(p_user_name) THEN
1040 CSM_UTIL_PKG.LOG('Reporting that '||p_user_name||' is not a HTML5 user', 'CSM_HTML5_PKG.query_validate_user', FND_LOG.LEVEL_PROCEDURE);
1041 l_final:=l_final||'reEnableSyncFunction("Sorry, '''||p_user_name||''' is not authorized to use this app."); ';
1042 l_response := 'query_validate_user: Not a mobile user';
1043 ELSE
1044 IF (authenticate(p_user_name,p_password)) THEN
1045 CSM_UTIL_PKG.LOG('Reporting that '||p_user_name||'-s password is valid', 'CSM_HTML5_PKG.query_validate_user', FND_LOG.LEVEL_PROCEDURE);
1046 l_final:=l_final||'setupMetaData();';
1047 l_response:='query_validate_user: Valid password';
1048 ELSE
1049 CSM_UTIL_PKG.LOG('Reporting that '||p_user_name||'-s password is incorrect', 'CSM_HTML5_PKG.query_validate_user', FND_LOG.LEVEL_PROCEDURE);
1050 l_final:=l_final||'reEnableSyncFunction("Sorry, the password entered is incorrect."); ';
1051 l_response:='query_validate_user: Invalid password';
1052 END IF;
1053 END IF;
1054
1055 create_ajax_session(p_user_name,l_response);
1056
1057 p_result:=l_final;
1058
1059 END query_validate_user;
1060
1061 FUNCTION translateString(p_input IN VARCHAR2) RETURN VARCHAR2
1062 IS
1063 BEGIN
1064 return replace(replace(replace(p_input,'\','\\'),'"','\"'), g_nl_chr, '\n');
1065 END translateString;
1066
1067 FUNCTION translateClobString(p_input IN CLOB) RETURN CLOB
1068 IS
1069 BEGIN
1070 return replace(replace(replace(p_input,'\','\\'),'"','\"'), g_nl_chr, '\n');
1071 END translateClobString;
1072
1073 FUNCTION get_base_object(pi IN VARCHAR2,piv IN VARCHAR2) RETURN VARCHAR2
1074 IS
1075 PRAGMA AUTONOMOUS_TRANSACTION;
1076 l_exists NUMBER;
1077 l_temp_tab VARCHAR2(100):= G_CSM_SCHEMA||'.CSM_5G_'||substr(pi,5);
1078 BEGIN
1079 BEGIN
1080 EXECUTE IMMEDIATE 'SELECT count(1) FROM '||l_temp_tab||' WHERE ROWNUM=1' INTO l_exists;
1081 EXCEPTION
1082 WHEN OTHERS THEN
1083 CSM_UTIL_PKG.LOG('Creating base object '||l_temp_tab, 'CSM_HTML5_PKG.get_base_object', FND_LOG.LEVEL_PROCEDURE);
1084 execute immediate 'CREATE GLOBAL TEMPORARY TABLE '||l_temp_tab||' ON COMMIT DELETE ROWS AS SELECT * FROM '||piv;
1085 END;
1086 COMMIT;
1087 RETURN l_temp_tab;
1088 END get_base_object;
1089
1090 FUNCTION set_base_object(pi IN VARCHAR2,piv IN VARCHAR2) RETURN VARCHAR2
1091 IS
1092 l_temp_object VARCHAR2(500);
1093 BEGIN
1094 IF(pi<>'CSM_MTL_SEC_INVENTORIES') THEN
1095 RETURN piv;
1096 END IF;
1097 l_temp_object:=get_base_object(pi,piv);
1098 CSM_UTIL_PKG.LOG('Processing from Temporary table:'||l_temp_object, 'CSM_HTML5_PKG.set_base_object', FND_LOG.LEVEL_PROCEDURE);
1099 execute immediate 'INSERT INTO '||l_temp_object||' SELECT * FROM '||piv;
1100 return l_temp_object;
1101 END set_base_object;
1102
1103
1104 procedure query_sync_data_js(
1105 p_user_name IN VARCHAR2,
1106 p_password IN VARCHAR2,
1107 p_result OUT nocopy CLOB,
1108 x_return_status OUT nocopy VARCHAR2,
1109 x_error_message OUT nocopy VARCHAR2,
1110 p_bypass_auth IN BOOLEAN DEFAULT FALSE
1111 )
1112 IS
1113 TYPE c_curtype is ref cursor;
1114 c_cur c_curtype;
1115 l_stmt CLOB;
1116 l_final CLOB:=g_nl_chr;
1117 l_pk_value VARCHAR2(200);
1118
1119 M Boolean :=false;
1120 l_AUTH Boolean :=false;
1121 l_cached boolean:=false;
1122 l_cache CLOB;
1123
1124 l_COL_NAME_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
1125 L_COL_VALUE_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
1126 l_COL_NAME_IDX numtype;
1127 l_COL_CLOB_LIST clobtype;
1128
1129 l_uname varchar2(200); l_lang varchar2(10);
1130 l_uid number; lrid number; l_app_id number; l_synch_date date;
1131 l_respid number;
1132 l_rec_count NUMBER;
1133 l_total_r_count NUMBER:=0;
1134
1135 l_warning boolean :=false;
1136 l_session_id NUMBER;
1137 l_dummy boolean:=true;
1138 l_e NUMBER;l_d NUMBER;l_n NUMBER;
1139 l_base_object VARCHAR2(500);
1140 BEGIN
1141 x_return_status:=fnd_api.g_ret_sts_success;
1142 x_error_message:='Success';
1143
1144 l_final := l_final ||'function mfs_synch_data(){ '||g_nl_chr;
1145
1146 IF (NOT p_bypass_auth) AND (NOT isHTML5User(p_user_name)) THEN
1147 CSM_UTIL_PKG.LOG('Quitting...since '||p_user_name||' is not an HTML5 user', 'CSM_HTML5_PKG.query_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1148 l_final:=l_final||' display_alert(''csm_mfs_error'',10); '||g_nl_chr||'}'||g_nl_chr;
1149 p_result:=l_final||g_nl_chr||' $("#mfs_sync").click(function(){ '||g_nl_chr
1150 || ' mfs_synch_data();'||g_nl_chr
1151 || ' var d=document.getElementById("mfs_sync_script"); var head= document.getElementsByTagName("head")[0]; '||g_nl_chr
1152 || ' if(d) { head.removeChild(d); delete(d);} delete_sync_element(true); }); '||g_nl_chr||g_nl_chr
1153 || ' $("#mfs_sync").trigger("click"); '||g_nl_chr;
1154
1155 CREATE_AJAX_SESSION(p_user_name,'csm_mfs_error: Not authorized HTML5 User');
1156 RETURN;
1157 END IF;
1158
1159 IF p_bypass_auth THEN
1160 l_AUTH := true;
1161 ELSE
1162 l_AUTH := authenticate(p_user_name,p_password) ;
1163 END IF;
1164
1165 IF l_AUTH THEN
1166
1167 set_user_profile(p_user_name,'REUSE_AUTH_6','SUCCESS');
1168
1169 l_session_id:=CREATE_SESSION(p_user_name,'DOWNLOAD','Y');
1170 G_SESSION_ID := l_session_id;
1171 REMOVE_DIRTY_CACHE;
1172
1173 query_schema_js(p_user_name,l_stmt,x_return_status,x_error_message);
1174
1175 IF(x_return_status = fnd_api.g_ret_sts_error) THEN
1176 CSM_UTIL_PKG.LOG(x_error_message, 'CSM_HTML5_PKG.query_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1177 delete from csm_html5_clients_info where user_name=p_user_name and prf_name='REUSE_AUTH_6';
1178 END_SESSION(l_session_id,'ERROR',x_error_message);
1179 RETURN;
1180 END IF;
1181
1182 l_final:= l_stmt||l_final||g_nl_chr;
1183
1184 l_final:=l_final||'createLocalSyncTables();create_mfs_schema();sync.session('||to_char(l_session_id)||');'||g_nl_chr||g_nl_chr;
1185
1186 --Config data setup -- start
1187 l_final:=l_final ||'var sqlS="";appsdb.delete_record("DELETE FROM CSM_CONFIG_DATA");'||g_nl_chr;
1188 l_final := l_final ||'sync.addConfig("V","'||get_app_revision||'");'||g_nl_chr;
1189 l_final := l_final ||'appsdb.v="'||get_app_revision||'";'||g_nl_chr;
1190 --Config data setup -- end
1191
1192 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''RRRR-MM-DD HH24:MI:SS''';
1193
1194 CSM_UTIL_PKG.LOG('Beginning PI download', 'CSM_HTML5_PKG.query_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1195
1196 select useR_name,language,resource_id,useR_id,responsibility_id,app_id,lasT_synch_date_end
1197 into l_uname,l_lang,lrid,l_uid,l_respid,l_app_id,l_synch_date from asg_user where user_name=upper(p_user_name);
1198 asg_base.init_debug(l_uname,l_lang,lrid,l_uid,l_respid,l_app_id,l_synch_date);
1199
1200
1201 for rec in (select item_id,base_objecT_name from asg_pub_item where pub_name='SERVICEP' and enabled='Y'
1202 and nvl(html5_offline,'N')='Y' order by item_id)
1203 LOOP
1204
1205 CSM_UTIL_PKG.LOG('Processing PI :'||rec.item_id, 'CSM_HTML5_PKG.query_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1206
1207 l_final:=l_final ||'appsdb.delete_record("DELETE FROM '||rec.item_id||'");'||g_nl_chr;
1208
1209 DELETE FROM ASG_SYSTEM_DIRTY_QUEUE WHERE CLIENT_ID=p_user_name AND PUB_ITEM=rec.item_id; --clear SDQ records here, so that new records inserted into sdq during this process
1210 --won't be missed. Confirmed that cursor resultSet is the one picked at the time of OPEN
1211 l_cached:=GET_CACHED (p_user_name,rec.item_id,l_stmt,l_rec_count);
1212
1213 IF NOT l_cached THEN
1214 l_rec_count :=0;
1215 l_cache:='';
1216
1217 l_base_object:=rec.base_objecT_name;
1218
1219 IF(rec.item_id='CSM_MTL_SEC_INVENTORIES') THEN
1220 l_base_object := set_base_object(rec.item_id,rec.base_objecT_name);
1221 END IF;
1222
1223 OPEN c_cur FOR 'SELECT ACCESS_ID from '||l_base_object|| ' where access_id is not null';
1224 LOOP
1225 FETCH c_cur into l_pk_value;
1226 EXIT WHEN c_cur%NOTFOUND;
1227
1228 l_rec_count:=l_rec_count+1;
1229 l_total_r_count := l_total_r_count+1;
1230
1231
1232 BEGIN
1233
1234 GET_XML_PAYLOAD(l_base_object,'ACCESS_ID',l_pk_value,l_stmt);
1235 l_COL_NAME_IDX.DELETE;l_COL_CLOB_LIST.DELETE;
1236 PARSE_XML(l_stmt,l_COL_NAME_LIST,L_COL_VALUE_LIST,l_COL_NAME_IDX,l_COL_CLOB_LIST);
1237
1238 IF(l_rec_count=1) THEN
1239 l_stmt :='sqlS="INSERT INTO '||rec.item_id||'('||l_COL_NAME_LIST(1);
1240 FOR j IN 2..l_COL_NAME_LIST.COUNT
1241 LOOP
1242 IF(l_COL_NAME_LIST(j) IS NOT NULL) THEN
1243 l_stmt := l_stmt||','||l_COL_NAME_LIST(j);
1244 END IF;
1245 END LOOP;
1246
1247 l_stmt:= l_stmt||') VALUES(?';
1248
1249 FOR j IN 2..l_COL_VALUE_LIST.COUNT
1250 LOOP
1251 IF(l_COL_NAME_LIST(j) IS NOT NULL) THEN
1252 l_stmt := l_stmt||',?';
1253 END IF;
1254 END LOOP;
1255 l_stmt:= l_stmt||');";'||g_nl_chr||'appsdb.add_record(sqlS,[';
1256 ELSE
1257 l_stmt:='appsdb.add_record(sqlS,[';
1258 END IF;
1259
1260 l_stmt:=l_stmt ||'"'||translateString(l_COL_VALUE_LIST(1))||'"';
1261
1262 FOR j IN 2..l_COL_VALUE_LIST.COUNT
1263 LOOP
1264 IF(l_COL_NAME_LIST(j) IS NOT NULL ) THEN
1265 IF (l_COL_NAME_IDX.EXISTS(j)) THEN
1266 l_stmt:=l_stmt ||',"'||translateClobString(l_COL_CLOB_LIST(J))||'"';
1267 ELSE
1268 IF l_COL_VALUE_LIST(j) IS NOT NULL THEN
1269 l_stmt:=l_stmt ||',"'||translateString(l_COL_VALUE_LIST(J))||'"';
1270 ELSE
1271 l_stmt:=l_stmt ||',null';
1272 END IF;
1273 END IF;
1274 END IF;
1275 END LOOP;
1276
1277
1278 IF(l_rec_count=1) THEN
1279 l_stmt:=l_stmt||'],"x3='''||rec.item_id||''';doProgress(++sqlR,x3);","SSEFN(++sqlR);");';
1280 ELSE
1281 l_stmt:=l_stmt||'],"doProgress(++sqlR,x3);","SSEFN(++sqlR);");';
1282 END IF;
1283
1284 l_final:=l_final||l_stmt||g_nl_chr;
1285 l_cache:=l_cache||l_stmt||g_nl_chr;
1286 EXCEPTION
1287 WHEN Others THEN
1288 CSM_UTIL_PKG.LOG('GET_XML_PAYLOAD failed.', 'CSM_HTML5_PKG.query_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1289 MARK_ERROR(p_user_name,rec.item_id,l_pk_value);
1290 l_warning:=true;
1291 l_rec_count:=l_rec_count-1;
1292 l_total_r_count:=l_total_r_count-1;
1293 END;
1294 END LOOP; --PI LEVEL LOOP
1295 CLOSE c_cur;
1296
1297 INSERT_CACHE(p_user_name,rec.item_id,l_cache,l_rec_count);
1298 ELSE
1299 l_final:=l_final||l_stmt||g_nl_chr;
1300 l_total_r_count := l_total_r_count+l_rec_count;
1301 END IF; --cache check
1302
1303 UPDATE_SESSION_DETAILS(l_session_id,rec.item_id,l_rec_count,l_dummy,'Y');
1304 l_final := l_final||'sync.logSyncedPIDetails('||to_char(l_session_id)||',"'||rec.item_id||'",'||to_char(l_rec_count)||',"Y");'||g_nl_chr;
1305
1306 END LOOP; --outermost loop
1307
1308 l_final := 'var tc='||to_char(l_total_r_count)||';var sqlR=0;var x3="";'||l_final||g_nl_chr||g_nl_chr;
1309
1310 /*Gone offline message + book keeping*/
1311
1312
1313 l_final:=l_final||' display_alert(''csm_fdata'',10);sync.goOffline();'||g_nl_chr;
1314 l_final:=l_final||' total_sync_rec_count= tc; sync.logSyncSession('||to_char(l_session_id)||',false,"Y");'||g_nl_chr;
1315
1316 l_final:=l_final||'}'||g_nl_chr;
1317 M:=true;
1318 ELSE
1319 M:=false;
1320 l_final:=l_final||' display_alert(''csm_auth_error'',10); '||g_nl_chr||'}'||g_nl_chr;
1321 CREATE_AJAX_SESSION(p_user_name,'csm_auth_error: Invalid password');
1322 delete from csm_html5_clients_info where user_name=p_user_name and prf_name='REUSE_AUTH_6';
1323 END IF;
1324
1325 l_final:=l_final||g_nl_chr||' $("#mfs_sync").click(function(){ '||g_nl_chr
1326 || ' mfs_synch_data();'||g_nl_chr
1327 || ' var d=document.getElementById("mfs_sync_script"); var head= document.getElementsByTagName("head")[0]; '||g_nl_chr
1328 || ' if(d) { head.removeChild(d); delete(d);} '
1329 ||' delete_sync_element(); }); ';
1330
1331 l_final:=l_final||g_nl_chr||g_nl_chr|| ' $("#mfs_sync").trigger("click"); '||g_nl_chr;
1332
1333 p_result:=l_final;
1334
1335 IF M THEN
1336 /* M:=asg_download.purgeSdq(p_user_name); -- Replaced with delete at PI processing*/
1337 UPDATE asg_purge_sdq set TRANSACTION_ID=NVL(l_session_id,1) WHERE user_name = p_user_name; --first sync over
1338 UPDATE asg_complete_refresh set synch_completed='Y' WHERE user_name = p_user_name;
1339 remove_comp_ref(p_user_name);
1340 DELETE FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_user_name AND PRF_NAME='APP_REVISION';
1341 IF l_warning THEN
1342 END_SESSION(l_session_id,'SUCCESS_W');
1343 ELSE
1344 END_SESSION(l_session_id,'SUCCESS');
1345 END IF;
1346 END IF;
1347
1348 EXCEPTION
1349 WHEN others THEN
1350 x_return_status := fnd_api.g_ret_sts_error;
1351 x_error_message := 'Exception occurred in query_sync_data_js: ' || substr(sqlerrm,1,3900);
1352 CSM_UTIL_PKG.LOG(x_error_message, 'CSM_HTML5_PKG.query_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1353 delete from csm_html5_clients_info where user_name=p_user_name and prf_name='REUSE_AUTH_6';
1354 END_SESSION(l_session_id,'ERROR',x_error_message);
1355 END query_sync_data_js;
1356
1357 FUNCTION is_complete_ref(p_user_name IN VARCHAR2,p_pi IN VARCHAR2) return BOOLEAN
1358 IS
1359 l_t VARCHAR2(100);
1360 BEGIN
1361 BEGIN
1362 SELECT PRF_VALUE INTO l_t FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_user_name
1363 AND PRF_NAME='COMPREF' AND PRF_VALUE=p_pi;
1364 RETURN TRUE;
1365 EXCEPTION
1366 WHEN Others THEN
1367 NULL;
1368 END;
1369 RETURN FALSE;
1370 END is_complete_ref;
1371
1372 FUNCTION complete_refresh(p_session_id IN NUMBER,p_user_name IN VARCHAR2,p_pi IN VARCHAR2,
1373 p_count IN OUT NOCOPY NUMBER,p_warning OUT NOCOPY BOOLEAN,p_dummy IN OUT NOCOPY BOOLEAN) return CLOB
1374 IS
1375 TYPE c_curtype is ref cursor;
1376 c_cur c_curtype;
1377 l_final CLOB := EMPTY_CLOB();
1378 l_pk_value VARCHAR2(200);
1379 l_COL_NAME_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
1380 L_COL_VALUE_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
1381 l_COL_NAME_IDX numtype;
1382 l_COL_CLOB_LIST clobtype;
1383 l_stmt CLOB:=NULL;
1384 l_rec_count NUMBER:=p_count;
1385 l_cached boolean:=false;
1386 l_cache CLOB;
1387 l_base_object VARCHAR2(500);
1388 BEGIN
1389
1390 CSM_UTIL_PKG.LOG('Processing Complete refresh of PI :'||p_pi, 'CSM_HTML5_PKG.complete_refresh', FND_LOG.LEVEL_PROCEDURE);
1391
1392
1393 --This api processes only one pi at a time though in loop: name=p_pi picks up one record
1394 for rec in (select item_id,base_objecT_name from asg_pub_item where pub_name='SERVICEP' and enabled='Y'
1395 and name=p_pi)
1396 LOOP
1397 l_final:=l_final || create_table_js(p_pi);
1398
1399 DELETE FROM ASG_SYSTEM_DIRTY_QUEUE WHERE CLIENT_ID=p_user_name AND PUB_ITEM=p_pi; --clear records here, so that new records inserted into sdq during this process
1400 --won't be missed. Confirmed that cursor resultSet is the one at the time of OPEN
1401
1402 l_cached:=GET_CACHED(p_user_name,p_pi,l_stmt,l_rec_count);
1403
1404 IF NOT l_cached THEN
1405 l_rec_count:=p_count;
1406 l_cache :='';
1407
1408 l_base_object:=rec.base_objecT_name;
1409
1410 IF(rec.item_id='CSM_MTL_SEC_INVENTORIES') THEN
1411 l_base_object := set_base_object(rec.item_id,rec.base_objecT_name);
1412 END IF;
1413
1414 OPEN c_cur FOR 'SELECT ACCESS_ID from '||l_base_object|| ' where access_id is not null';
1415 LOOP
1416
1417 FETCH c_cur into l_pk_value;
1418 EXIT WHEN c_cur%NOTFOUND;
1419
1420 l_rec_count:=l_rec_count+1;
1421
1422 BEGIN
1423 GET_XML_PAYLOAD(l_base_object,'ACCESS_ID',l_pk_value,l_stmt);
1424 l_COL_NAME_IDX.DELETE;l_COL_CLOB_LIST.DELETE;
1425 PARSE_XML(l_stmt,l_COL_NAME_LIST,L_COL_VALUE_LIST,l_COL_NAME_IDX,l_COL_CLOB_LIST);
1426
1427 IF (l_rec_count=p_count+1) THEN
1428 l_stmt := 'sqlS="INSERT INTO '||rec.item_id||'('||l_COL_NAME_LIST(1);
1429 FOR j IN 2..l_COL_NAME_LIST.COUNT
1430 LOOP
1431 IF(l_COL_NAME_LIST(j) IS NOT NULL) THEN
1432 l_stmt := l_stmt||','||l_COL_NAME_LIST(j);
1433 END IF;
1434 END LOOP;
1435
1436 l_stmt:= l_stmt||') VALUES(?';
1437
1438 FOR j IN 2..l_COL_VALUE_LIST.COUNT
1439 LOOP
1440 IF(l_COL_NAME_LIST(j) IS NOT NULL) THEN
1441 l_stmt := l_stmt||',?';
1442 END IF;
1443 END LOOP;
1444 l_stmt:= l_stmt||');";'||g_nl_chr||'appsdb.add_record(sqlS,[';
1445 ELSE
1446 l_stmt:='appsdb.add_record(sqlS,[';
1447 END IF;
1448
1449 l_stmt:=l_stmt ||'"'||translateString(l_COL_VALUE_LIST(1))||'"';
1450
1451
1452 FOR j IN 2..l_COL_VALUE_LIST.COUNT
1453 LOOP
1454 IF(l_COL_NAME_LIST(j) IS NOT NULL) THEN
1455 IF (l_COL_NAME_IDX.EXISTS(j)) THEN
1456 l_stmt:=l_stmt ||',"'||translateClobString(l_COL_CLOB_LIST(J))||'"';
1457 ELSE
1458 IF l_COL_VALUE_LIST(j) IS NOT NULL THEN
1459 l_stmt:=l_stmt ||',"'||translateString(l_COL_VALUE_LIST(J))||'"';
1460 ELSE
1461 l_stmt:=l_stmt ||',null';
1462 END IF;
1463 END IF;
1464 END IF;
1465 END LOOP;
1466
1467 IF (l_rec_count=p_count+1) THEN
1468 l_stmt:=l_stmt||'],"x3='''||rec.item_id||''';doProgress(++sqlR,x3);","SSEFN(++sqlR);");';
1469 ELSE
1470 l_stmt:=l_stmt||'],"doProgress(++sqlR,x3);","SSEFN(++sqlR);");';
1471 END IF;
1472
1473 l_final:=l_final||l_stmt||g_nl_chr;
1474 l_cache:=l_cache||l_stmt||g_nl_chr;
1475 EXCEPTION
1476 WHEN Others THEN
1477 CSM_UTIL_PKG.LOG('GET_XML_PAYLOAD failed.', 'CSM_HTML5_PKG.complete_refresh', FND_LOG.LEVEL_PROCEDURE);
1478 MARK_ERROR(p_user_name,rec.item_id,l_pk_value);
1479 l_rec_count:=l_rec_count-1;
1480 p_warning:=true;
1481 END;
1482 END LOOP;
1483 CLOSE c_cur;
1484 INSERT_CACHE(p_user_name,p_pi,l_cache,l_rec_count-p_count);
1485 ELSE
1486 l_rec_count:=l_rec_count+p_count;
1487 l_final:=l_final||l_stmt||g_nl_chr;
1488 END IF;
1489
1490 UPDATE_SESSION_DETAILS(p_session_id,rec.item_id,l_rec_count-p_count,p_dummy,'Y');
1491 l_final := l_final||'sync.logSyncedPIDetails('||to_char(p_session_id)||',"'||rec.item_id||'",'||to_char(l_rec_count-p_count)||',"Y");'||g_nl_chr;
1492 end loop;
1493
1494 --remove_comp_ref(p_user_name,p_pi); shd be done in next sync
1495
1496 p_count := l_rec_count;
1497 return l_final;
1498 END complete_refresh;
1499
1500 procedure q_inc_sync_cref_js(
1501 p_user_name IN VARCHAR2,
1502 p_password IN VARCHAR2,
1503 p_result OUT nocopy CLOB,
1504 x_return_status OUT nocopy VARCHAR2,
1505 x_error_message OUT nocopy VARCHAR2
1506 )
1507 IS
1508 BEGIN
1509 q_inc_sync_data_js(p_user_name,p_password,-1,p_result,x_return_status,x_error_message,true);
1510 END q_inc_sync_cref_js;
1511
1512 procedure q_inc_sync_data_js(
1513 p_user_name IN VARCHAR2,
1514 p_password IN VARCHAR2,
1515 p_tranid IN NUMBER,
1516 p_result OUT nocopy CLOB,
1517 x_return_status OUT nocopy VARCHAR2,
1518 x_error_message OUT nocopy VARCHAR2,
1519 p_refresh_all boolean :=false
1520 )
1521 IS
1522
1523 TYPE l_c_idx_list_t IS TABLE OF VARCHAR2(1000) INDEX BY VARCHAR2(200);
1524 TYPE l_n_idx_list_t IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER;
1525 l_comp_ref_list l_c_idx_list_t;
1526 l_insertDML_pk_list l_c_idx_list_t;
1527 l_insertDML_pi_list l_n_idx_list_t;
1528 l_pp_cnt NUMBER:=0;
1529
1530 l_idx NUMBER; M BOOLEAN:=false;
1531 AUTH BOOLEAN :=FALSE;
1532 K NUMBER;
1533 l_stmt CLOB;
1534 l_final CLOB:=NULL;
1535 l_pk_value VARCHAR2(200);
1536
1537 l_COL_NAME_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
1538 L_COL_VALUE_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
1539 l_COL_NAME_IDX numtype;
1540 l_COL_CLOB_LIST clobtype;
1541
1542 l_uname varchar2(200); l_lang varchar2(10);
1543 l_uid number; lrid number; l_app_id number; l_synch_date date;
1544 l_respid number;
1545
1546 l_rec_count NUMBER :=0;
1547 l_last_pi VARCHAR2(200):=NULL;
1548 l_insertDML_pi VARCHAR2(200):=NULL;
1549 l_insertpk_cols VARCHAR2(1000):=NULL;
1550 l_total_r_count NUMBER :=0;
1551 l_warning boolean:=false;
1552 l_session_id NUMBER;
1553 l_dummy boolean:= true;
1554 l_e NUMBER;l_d NUMBER;l_n NUMBER;
1555 l_str VARCHAR2(100);
1556 l_more_avl BOOLEAN:=false;
1557 l_refresh_all BOOLEAN :=p_refresh_all;
1558 BEGIN
1559 x_return_status:=fnd_api.g_ret_sts_success;
1560 x_error_message:='Success';
1561
1562 IF NOT isHTML5User(p_user_name) THEN
1563 CSM_UTIL_PKG.LOG('Quitting...since '||p_user_name||' is not an HTML5 user', 'CSM_HTML5_PKG.q_inc_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1564 l_final :=g_nl_chr||'function mfs_synch_data(){ '||g_nl_chr;
1565 l_final:=l_final||' display_alert(''csm_mfs_error'',10); '||g_nl_chr||'}'||g_nl_chr;
1566 p_result:=l_final||g_nl_chr||' $("#mfs_sync").click(function(){ '||g_nl_chr
1567 || ' mfs_synch_data();'||g_nl_chr
1568 || ' var d=document.getElementById("mfs_sync_script"); var head= document.getElementsByTagName("head")[0]; '||g_nl_chr
1569 || ' if(d) { head.removeChild(d); delete(d);} delete_sync_element(); }); '||g_nl_chr||g_nl_chr
1570 || ' $("#mfs_sync").trigger("click"); '||g_nl_chr;
1571 CREATE_AJAX_SESSION(p_user_name,'csm_mfs_error: Not authorized HTML5 user');
1572 RETURN;
1573 END IF;
1574
1575 AUTH := authenticate(p_user_name,p_password);
1576 IF AUTH THEN
1577
1578 l_session_id:=CREATE_SESSION(p_user_name,'DOWNLOAD');
1579
1580 IF IS_FIRST_SYNC(p_user_name) THEN
1581 CSM_UTIL_PKG.LOG(p_user_name||' has been dropped and recreated. Kicking off Full Refresh', 'CSM_HTML5_PKG.q_inc_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1582 UPDATE asg_purge_sdq set TRANSACTION_ID=NVL(l_session_id,1) WHERE user_name = p_user_name; --first sync over
1583 UPDATE asg_complete_refresh set synch_completed='Y' WHERE user_name = p_user_name;
1584 l_refresh_all:=TRUE;
1585 END IF;
1586
1587 IF l_refresh_all THEN
1588 set_user_profile(p_user_name,'REUSE_AUTH_9','SUCCESS');
1589 ELSE --purge old data if last sync is applied
1590
1591 /*****COMPLETE REFRESH***********/
1592 --if comp ref is also set in current TXN
1593 DELETE FROM CSM_HTML5_CLIENTS_INFO a WHERE USER_NAME=p_user_name
1594 AND PRF_NAME LIKE 'COMPREF-TID-%' AND EXISTS(SELECT 1 FROM CSM_HTML5_CLIENTS_INFO b WHERE a.USER_NAME=b.USER_NAME AND b.PRF_NAME='COMPREF' AND a.PRF_VALUE=b.PRF_VALUE) ;
1595
1596 --if last comp ref is successful
1597 DELETE FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_user_name
1598 AND PRF_NAME LIKE 'COMPREF-TID-%' AND TO_NUMBER(SUBSTR(PRF_NAME,13))<p_tranid;
1599
1600 --if last comp ref not successful
1601 UPDATE CSM_HTML5_CLIENTS_INFO SET PRF_NAME='COMPREF' WHERE USER_NAME=p_user_name
1602 AND PRF_NAME LIKE 'COMPREF-TID-%';
1603
1604
1605 /*****INDEX REFRESH***********/
1606 --if indx ref is also set in current TXN
1607 DELETE FROM CSM_HTML5_CLIENTS_INFO a WHERE USER_NAME=p_user_name
1608 AND PRF_NAME LIKE 'INDXREF-TID-%' AND EXISTS(SELECT 1 FROM CSM_HTML5_CLIENTS_INFO b WHERE a.USER_NAME=b.USER_NAME AND b.PRF_NAME='INDXREF' AND a.PRF_VALUE=b.PRF_VALUE) ;
1609
1610 --if last indx ref is successful
1611 DELETE FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_user_name
1612 AND PRF_NAME LIKE 'INDXREF-TID-%' AND TO_NUMBER(SUBSTR(PRF_NAME,13))<p_tranid;
1613
1614 --if last indx ref not successful
1615 UPDATE CSM_HTML5_CLIENTS_INFO SET PRF_NAME='INDXREF' WHERE USER_NAME=p_user_name
1616 AND PRF_NAME LIKE 'INDXREF-TID-%';
1617
1618
1619 /*****ASG SDQ***********/
1620 --remove successfully deleted DMLs from SDQ
1621 DELETE FROM asg_delete_queue
1622 WHERE qid IN (SELECT qid
1623 FROM asg_system_dirty_queue
1624 WHERE client_id = p_user_name AND
1625 (transaction_id < p_tranid OR pub_item in (SELECT NAME FROM ASG_PUB_ITEM WHERE nvl(html5_offline,'N')='N' AND PUB_NAME='SERVICEP')));
1626
1627 --remove successful DMLs from SDQ and unwanted PI-s
1628 DELETE FROM asg_system_dirty_queue
1629 WHERE client_id = p_user_name AND
1630 (transaction_id < p_tranid OR pub_item in (SELECT NAME FROM ASG_PUB_ITEM WHERE nvl(html5_offline,'N')='N' AND PUB_NAME='SERVICEP'));
1631
1632 --restore unsuccessful ones for current sync
1633 UPDATE asg_system_dirty_queue SET transaction_id=p_tranid
1634 WHERE client_id = p_user_name and rownum<=2000; --inc sync processes only max 2000 records(exclusive of comp ref) per sync
1635
1636 IF SQL%ROWCOUNT=2000 THEN
1637 l_more_avl := true;
1638 END IF;
1639 END IF;
1640
1641
1642 G_SESSION_ID := l_session_id;
1643 REMOVE_DIRTY_CACHE; --here bcoz it shd be after old SDQ records are cleared
1644
1645 IF l_refresh_all THEN
1646 CSM_UTIL_PKG.LOG('Refresh All is set', 'CSM_HTML5_PKG.q_inc_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1647 for pi in (SELECT NAME FROM ASG_PUB_ITEM WHERE nvl(html5_offline,'N')='Y')
1648 loop
1649 set_comp_ref(p_user_name,pi.name);
1650 end loop;
1651 END IF;
1652
1653 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''RRRR-MM-DD HH24:MI:SS''';
1654
1655 select useR_name,language,resource_id,useR_id,responsibility_id,app_id,lasT_synch_date_end
1656 into l_uname,l_lang,lrid,l_uid,l_respid,l_app_id,l_synch_date from asg_user where user_name=upper(p_user_name);
1657 asg_base.init_debug(l_uname,l_lang,lrid,l_uid,l_respid,l_app_id,l_synch_date);
1658
1659
1660 /*****COMPLETE REFRESH***********/
1661 for pi in (SELECT a.NAME FROM ASG_PUB_ITEM a,CSM_HTML5_CLIENTS_INFO b
1662 WHERE nvl(html5_offline,'N')='Y'
1663 AND PRF_NAME='COMPREF'
1664 AND PRF_VALUE=a.NAME
1665 AND b.USER_NAME=p_user_name ORDER BY a.NAME)
1666 loop
1667 l_final:=l_final||g_nl_chr||complete_refresh(l_session_id,p_user_name,pi.name,l_total_r_count,l_warning,l_dummy)||g_nl_chr;
1668
1669
1670 remove_indx_ref(p_user_name,pi.name);
1671
1672 UPDATE CSM_HTML5_CLIENTS_INFO SET PRF_NAME='COMPREF-TID-'||p_tranid
1673 WHERE USER_NAME=p_user_name AND PRF_NAME='COMPREF' AND PRF_VALUE= pi.name; --check and clear in next sync
1674
1675 l_comp_ref_list(pi.name):='1';
1676 end loop;
1677
1678
1679 /*****INDEX REFRESH***********/
1680 l_final:=l_final||get_index_refresh(p_user_name);
1681 UPDATE CSM_HTML5_CLIENTS_INFO
1682 SET PRF_NAME='INDXREF-TID-'||p_tranid
1683 WHERE USER_NAME=p_user_name AND PRF_NAME='INDXREF'; --check and clear in next sync
1684
1685
1686 /*****ASG SDQ PROCESSING***********/
1687 for rec in (select b.pub_item,b.access_id,b.dml_type,base_object_name,a.primary_key_column
1688 from asg_pub_item a,
1689 (select pub_item,access_id,client_id,min(dml_type) as dml_type
1690 from asG_system_dirty_queue
1691 where client_id=p_useR_name
1692 and transaction_id = p_tranid
1693 and nvl(download_flag,'Y')='Y' --Bug 16456574: process conflicts
1694 and pub_item in (SELECT NAME FROM ASG_PUB_ITEM WHERE nvl(html5_offline,'N')='Y')
1695 group by pub_item,access_id,client_id) b
1696 where b.pub_item=a.item_id
1697 order by b.pub_item)
1698 LOOP
1699
1700 CSM_UTIL_PKG.LOG('Found/Processing PI -'||rec.pub_item||' with access_id:'||rec.access_id, 'CSM_HTML5_PKG.q_inc_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1701
1702 IF(l_last_pi IS NULL OR l_last_pi <> rec.pub_item) THEN
1703 IF(l_last_pi IS NOT NULL) AND NOT l_comp_ref_list.exists(rec.pub_item) THEN
1704 UPDATE_SESSION_DETAILS(l_session_id,l_last_pi,l_rec_count,l_dummy);
1705 l_final := l_final||'sync.logSyncedPIDetails('||to_char(l_session_id)||',"'||l_last_pi||'",'||to_char(l_rec_count)||',"N");'||g_nl_chr;
1706 END IF;
1707 l_last_pi:=rec.pub_item;
1708 l_rec_count := 0;
1709 END IF;
1710
1711
1712 IF l_comp_ref_list.exists(rec.pub_item) THEN
1713 CSM_UTIL_PKG.LOG('Complete refresh is set for '||p_user_name||'-'||rec.pub_item, 'CSM_HTML5_PKG.q_inc_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1714 ELSE
1715 l_rec_count:= l_rec_count+1;
1716 l_total_r_count:=l_total_r_count+1;
1717
1718 If(rec.dml_type = 0) THEN
1719 l_final:=l_final ||'appsdb.delete_record("DELETE FROM '||rec.pub_item||' WHERE ACCESS_ID='||to_char(rec.access_id)||'",[],"doProgress(++sqlR,'''||rec.pub_item||''');");'||g_nl_chr;
1720 ELSE
1721
1722 BEGIN
1723 GET_XML_PAYLOAD(rec.base_objecT_name,'ACCESS_ID',rec.ACCESS_ID,l_stmt);
1724 EXCEPTION
1725 WHEN Others THEN
1726 CSM_UTIL_PKG.LOG('GET_XML_PAYLOAD failed.', 'CSM_HTML5_PKG.q_inc_sync_data_js', FND_LOG.LEVEL_PROCEDURE);
1727 MARK_ERROR(p_user_name,rec.pub_item,rec.ACCESS_ID);
1728 l_rec_count:= l_rec_count-1;
1729 l_total_r_count:=l_total_r_count-1;
1730 l_stmt := NULL;
1731 l_warning:=true;
1732 END;
1733
1734 IF l_stmt IS NOT NULL THEN
1735 l_COL_NAME_IDX.DELETE;l_COL_CLOB_LIST.DELETE;
1736 PARSE_XML(l_stmt,l_COL_NAME_LIST,L_COL_VALUE_LIST,l_COL_NAME_IDX,l_COL_CLOB_LIST);
1737
1738 IF (rec.dml_type = 1) THEN --INSERT dml
1739
1740 l_stmt:='';
1741
1742 IF NOT l_insertDML_pk_list.exists(rec.pub_item) THEN
1743 l_insertDML_pk_list(rec.pub_item):=rec.primary_key_column;
1744 l_pp_cnt:=l_pp_cnt+1;
1745 l_insertDML_pi_list(l_pp_cnt):=rec.pub_item;
1746 l_stmt:='appsdb.doDDL("DROP INDEX '||rec.pub_item||'_U2_SYS",[],";",";");'||g_nl_chr;
1747 END IF;
1748
1749 l_stmt :=l_stmt|| 'appsdb.add_record('||g_nl_chr
1750 ||'"INSERT INTO '||rec.pub_item||'('||l_COL_NAME_LIST(1);
1751 FOR j IN 2..l_COL_NAME_LIST.COUNT
1752 LOOP
1753 IF(l_COL_NAME_LIST(j) IS NOT NULL) THEN
1754 l_stmt := l_stmt||','||l_COL_NAME_LIST(j);
1755 END IF;
1756 END LOOP;
1757
1758 l_stmt:= l_stmt||') VALUES(?';
1759
1760 FOR j IN 2..l_COL_VALUE_LIST.COUNT
1761 LOOP
1762 IF(l_COL_NAME_LIST(j) IS NOT NULL) THEN
1763 l_stmt := l_stmt||',?';
1764 END IF;
1765 END LOOP;
1766
1767 l_stmt:= l_stmt||');",["'||translateString(l_COL_VALUE_LIST(1))||'"';
1768
1769 FOR j IN 2..l_COL_VALUE_LIST.COUNT
1770 LOOP
1771 IF(l_COL_NAME_LIST(j) IS NOT NULL) THEN
1772 IF (l_COL_NAME_IDX.EXISTS(j)) THEN
1773 l_stmt:=l_stmt ||',"'||translateClobString(l_COL_CLOB_LIST(J))||'"';
1774 ELSE
1775 IF l_COL_VALUE_LIST(j) IS NOT NULL THEN
1776 l_stmt:=l_stmt ||',"'||translateString(l_COL_VALUE_LIST(J))||'"';
1777 ELSE
1778 l_stmt:=l_stmt ||',null';
1779 END IF;
1780 END IF;
1781 END IF;
1782 END LOOP;
1783 l_stmt:=l_stmt||'],"doProgress(++sqlR,'''||rec.pub_item||''');");';
1784 l_final:=l_final||l_stmt||g_nl_chr;
1785
1786 ELSE --dml type=2
1787
1788
1789 l_stmt := 'appsdb.update_record("UPDATE '||rec.pub_item||' SET ';
1790 K:=0;
1791 FOR j IN 1..l_COL_NAME_LIST.COUNT
1792 LOOP
1793 IF l_COL_NAME_LIST(j)='ACCESS_ID' THEN
1794 l_idx:=j;
1795 END IF;
1796 IF(l_COL_NAME_LIST(j) IS NOT NULL AND l_COL_NAME_LIST(j)<>'ACCESS_ID' ) THEN
1797 K:=K+1;
1798 IF(K<>1) THEN
1799 l_stmt := l_stmt||',';
1800 END IF;
1801 l_stmt := l_stmt||l_COL_NAME_LIST(j)||'=?';
1802 END IF;
1803 END LOOP;
1804
1805 l_stmt:= l_stmt||' WHERE ACCESS_ID='||l_COL_VALUE_LIST(l_idx);
1806
1807
1808 l_stmt:= l_stmt||';",[';
1809 K:=0;
1810 FOR j IN 1..l_COL_VALUE_LIST.COUNT
1811 LOOP
1812 IF(l_COL_NAME_LIST(j) IS NOT NULL AND j<>l_idx) THEN
1813 K:=K+1;
1814 IF(K<>1) THEN
1815 l_stmt := l_stmt||',';
1816 END IF;
1817 IF (l_COL_NAME_IDX.EXISTS(j)) THEN
1818 l_stmt:=l_stmt ||'"'||translateClobString(l_COL_CLOB_LIST(J))||'"';
1819 ELSE
1820 IF l_COL_VALUE_LIST(j) IS NOT NULL THEN
1821 l_stmt:=l_stmt ||'"'||translateString(l_COL_VALUE_LIST(J))||'"';
1822 ELSE
1823 l_stmt:=l_stmt ||'null';
1824 END IF;
1825 END IF;
1826 END IF;
1827 END LOOP;
1828 l_stmt:=l_stmt||'],"doProgress(++sqlR,'''||rec.pub_item||''');");';
1829
1830 l_final:=l_final||l_stmt||g_nl_chr;
1831 END IF; --rec.dml_type = 1 check
1832 ELSE --l_stmt IS NULL - Else block
1833 l_rec_count:= l_rec_count-1;
1834 l_total_r_count:=l_total_r_count-1;
1835 END IF; --l_stmt IS NOT NULL
1836 END IF;--rec.dml_type = 0 check
1837 END IF;--is_complete_ref check
1838 END LOOP;
1839
1840
1841 IF l_final IS NULL THEN
1842 M:=true;
1843 ELSE
1844 FOR I IN 1..l_insertDML_pi_list.COUNT
1845 LOOP
1846 l_final:=l_final||'sync.clearOldInserts("'||l_insertDML_pi_list(I)||'","'||l_insertDML_pk_list(l_insertDML_pi_list(I))||'");'||g_nl_chr;
1847 END LOOP;
1848
1849 IF(l_last_pi IS NOT NULL) AND NOT l_comp_ref_list.exists(l_last_pi) THEN
1850 UPDATE_SESSION_DETAILS(l_session_id,l_last_pi,l_rec_count,l_dummy);
1851 l_final := l_final||'sync.logSyncedPIDetails('||to_char(l_session_id)||',"'||l_last_pi||'",'||to_char(l_rec_count)||',"N");'||g_nl_chr;
1852 END IF;
1853
1854 IF l_more_avl THEN
1855 l_final:=l_final||'sync.moreDataFound();'||g_nl_chr;
1856 END IF ;
1857 END IF;
1858
1859
1860 l_final :=g_nl_chr||'function mfs_synch_data(){ sync.session('||to_char(l_session_id)||');'||g_nl_chr || l_final ;
1861
1862 IF(M) THEN l_final :=l_final||' total_sync_rec_count= 0; ';
1863 ELSE
1864 l_final :=l_final||' total_sync_rec_count= tc; ';
1865 DELETE FROM csm_html5_clients_info WHERE USER_NAME=p_user_name AND PRF_NAME like 'REUSABLE%';
1866 END IF;
1867
1868 IF (l_refresh_all) THEN l_final :=l_final||' sync.logSyncSession('||to_char(l_session_id)||',false,"Y"); ' ||g_nl_chr;
1869 ELSE l_final :=l_final||' sync.logSyncSession('||to_char(l_session_id)||',false,"N"); ' ||g_nl_chr;
1870 END IF;
1871
1872 IF M THEN
1873 l_final:=l_final||' display_alert("csm_no_sdata",10);'||g_nl_chr||'}'||g_nl_chr;
1874 ELSE
1875 l_final := 'var tc='||to_char(l_total_r_count)||';var sqlR=0;'||g_nl_chr||l_final||g_nl_chr;
1876 l_final:=l_final||' display_alert("csm_sdata",10); '||g_nl_chr;
1877 l_final:=l_final||'}'||g_nl_chr;
1878 END IF;
1879
1880 ELSE
1881 l_final:=l_final||' display_alert("csm_pass_chg");'||g_nl_chr;
1882 l_final :=g_nl_chr||'function mfs_synch_data(){ '||g_nl_chr || l_final||' }' ||g_nl_chr;
1883 M:=true; --to avoid get Tasks
1884 CREATE_AJAX_SESSION(p_user_name,'csm_auth_error: Invalid password');
1885 IF l_refresh_all THEN --case of plsql exception followed by call to query Id 9 with wrong password
1886 delete from csm_html5_clients_info where user_name=p_user_name and prf_name='REUSE_AUTH_9';
1887 END IF;
1888 END IF;
1889
1890 l_final:=l_final||g_nl_chr||' $("#mfs_sync").click(function(){ '||g_nl_chr
1891 || ' mfs_synch_data();'||g_nl_chr;
1892 l_final:=l_final||'var d=document.getElementById("mfs_sync_script"); var head= document.getElementsByTagName("head")[0]; '||g_nl_chr
1893 || ' if(d) { head.removeChild(d); delete(d);} delete_sync_element(); }); '||g_nl_chr||g_nl_chr
1894 || ' $("#mfs_sync").trigger("click"); '||g_nl_chr;
1895
1896
1897 p_result:=l_final;
1898
1899 IF AUTH THEN
1900
1901 IF(l_refresh_all) THEN
1902 M:=asg_download.purgeSdq(p_user_name);
1903 END IF;
1904 IF(l_warning) THEN
1905 END_SESSION(l_session_id,'SUCCESS_W');
1906 ELSE
1907 END_SESSION(l_session_id,'SUCCESS');
1908 END IF;
1909 END IF;
1910
1911 EXCEPTION
1912 WHEN others THEN
1913 x_return_status := fnd_api.g_ret_sts_error;
1914 x_error_message := 'Exception occurred in q_inc_sync_data_js: '||length(l_final)||'::'|| substr(sqlerrm,0,2000);
1915 CSM_UTIL_PKG.LOG( x_error_message,'CSM_HTML5_PKG.q_inc_sync_data_js',FND_LOG.LEVEL_PROCEDURE);
1916 IF l_refresh_all THEN
1917 delete from csm_html5_clients_info where user_name=p_user_name and prf_name='REUSE_AUTH_9';
1918 END IF;
1919 END_SESSION(l_session_id,'ERROR',x_error_message);
1920 END q_inc_sync_data_js;
1921
1922 FUNCTION get_MD5_hash (p_input IN VARCHAR2)
1923 RETURN VARCHAR2
1924 IS
1925 BEGIN
1926 --RETURN lower(RAWTOHEX(UTL_RAW.cast_to_raw(dbms_obfuscation_toolkit.MD5(input_string=>p_input))));
1927 RETURN 'Deprecated';
1928 END get_MD5_hash;
1929
1930 PROCEDURE enable_pi(p_pi IN VARCHAR2)
1931 IS
1932 BEGIN
1933 UPDATE ASG_PUB_ITEM SET HTML5_OFFLINE='Y' WHERE ITEM_ID=p_pi;
1934 set_comp_ref(p_pi);
1935 DELETE FROM csm_html5_clients_info WHERE PRF_NAME like 'REUSABLE%' OR PRF_NAME like 'SCHEMA%REUSE%';
1936 END enable_pi;
1937
1938 PROCEDURE disable_pi(p_pi IN VARCHAR2)
1939 IS
1940 BEGIN
1941 UPDATE ASG_PUB_ITEM SET HTML5_OFFLINE='N' WHERE ITEM_ID=p_pi;
1942 DELETE FROM csm_html5_clients_info WHERE PRF_NAME like 'REUSABLE%';
1943 remove_comp_ref(p_pi);
1944 END disable_pi;
1945
1946 PROCEDURE PURGE_HTML5_DATA(p_status OUT NOCOPY VARCHAR2, p_message OUT NOCOPY VARCHAR2)
1947 IS
1948 PRAGMA AUTONOMOUS_TRANSACTION; --required for asg_defer to work as it's a pragma-a-t and not finding inq info data
1949 l_sqlerrno VARCHAR2(20);
1950 l_sqlerrmsg VARCHAR2(4000);
1951 l_error_msg VARCHAR2(4000);
1952 l_return_status VARCHAR2(2000);
1953 l_last_run_date DATE;
1954 l_dummy NUMBER;
1955
1956
1957 CURSOR l_upd_last_run_date_csr
1958 IS
1959 SELECT 1
1960 FROM jtm_con_request_data
1961 WHERE product_code = 'CSM'
1962 AND package_name = 'CSM_HTML5_PKG'
1963 AND procedure_name = 'PURGE_HTML5_DATA'
1964 FOR UPDATE OF last_run_date NOWAIT;
1965
1966 CURSOR c_purge_days IS
1967 select profile_option_value from fnd_profile_option_values where profile_option_id in
1968 (select profile_option_id from fnd_profile_options where profile_option_name='CSM_PURGE_INTERVAL')
1969 and level_id=10001;
1970
1971 l_days NUMBER;
1972
1973 BEGIN
1974
1975 l_last_run_date := SYSDATE;
1976
1977 DELETE FROM CSM_HTML5_CLIENTS_INFO a WHERE USER_NAME<>'APPLICATION' AND NOT EXISTS (SELECT 1 FROM ASG_USER au WHERE au.USER_NAME=a.USER_NAME);
1978
1979 OPEN c_purge_days;
1980 FETCH c_purge_days INTO l_days;
1981 IF c_purge_days%FOUND AND l_days IS NOT NULL AND l_days>0 THEN
1982 delete from csm_html5_ajax_info where creation_date < (sysdate-l_days);
1983 delete from csm_html5_sync_info where start_date < (sysdate-l_days);
1984 delete from csm_html5_sync_details a where not exists(select 1 from csm_html5_sync_info b where a.session_id=b.session_id);
1985 delete from csm_query_instances_acc
1986 where creation_date < (sysdate-l_days)
1987 and query_id between 1 and 99
1988 and instance_id not in (select to_number(prf_value) from csm_html5_clients_info WHERE PRF_NAME='SCHEMA_REUSE' OR PRF_NAME like 'REUSABLE%' OR PRF_NAME LIKE 'USER_CREAT%')
1989 and not exists (select 1 from csm_html5_sync_info where instance_id=q_instance_id);
1990 delete from csm_query_results_acc where instance_id not in ( select instance_id from csm_query_instances_acc where query_id between 1 and 99 );
1991 END IF;
1992 CLOSE c_purge_days;
1993
1994
1995 -- update last_run_date
1996 OPEN l_upd_last_run_date_csr;
1997 FETCH l_upd_last_run_date_csr INTO l_dummy;
1998 IF l_upd_last_run_date_csr%FOUND THEN
1999 UPDATE jtm_con_request_data
2000 SET last_run_date = l_last_run_date
2001 WHERE CURRENT OF l_upd_last_run_date_csr;
2002 END IF;
2003 CLOSE l_upd_last_run_date_csr;
2004 COMMIT;
2005
2006 p_status := 'SUCCESS';
2007 p_message := 'CSM_HTML5_PKG.PURGE_HTML5_DATA Executed successfully';
2008
2009 EXCEPTION
2010 WHEN OTHERS THEN
2011 l_sqlerrno := TO_CHAR(SQLCODE);
2012 l_sqlerrmsg := SUBSTR(SQLERRM, 1,2000);
2013 ROLLBACK;
2014 l_error_msg := ' Exception in PURGE_HTML5_DATA:' || l_sqlerrno || ':' || l_sqlerrmsg;
2015 CSM_UTIL_PKG.LOG(l_error_msg, 'CSM_HTML5_PKG.PURGE_HTML5_DATA',FND_LOG.LEVEL_EVENT);
2016 p_status := 'ERROR';
2017 p_message := 'Error in CSM_HTML5_PKG.PURGE_HTML5_DATA: ' || l_error_msg;
2018 END PURGE_HTML5_DATA;
2019
2020 FUNCTION isHTML5User(p_user_name IN VARCHAR2) return BOOLEAN
2021 Is
2022 x NUMBER;
2023 BEGIN
2024 SELECT USER_ID INTO x FROM ASG_USER
2025 WHERE USER_NAME=p_user_name
2026 AND ENABLED='Y'
2027 AND MULTI_PLATFORM='Y';
2028
2029 RETURN CSM_UTIL_PKG.is_palm_user(x);
2030 EXCEPTION
2031 WHEN Others THEN
2032 return FALSE;
2033 END isHTML5User;
2034
2035 PROCEDURE process_sequences(p_user_name IN VARCHAR2,p_inp IN CLOB)
2036 IS
2037 l_seq_name VARCHAR2(30);
2038 l_curr_val NUMBER(38);
2039 l_client_num NUMBER;
2040 TYPE l_type IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
2041 seq l_type; cval l_type; inp clob:=p_inp;
2042 l number; sub varchar2(500);
2043 cnt number:=1;n number;
2044 BEGIN
2045
2046 if(inp is null) then return; end if;
2047
2048 LOOP
2049 l:=instr(inp,',');
2050 exit when l is null or l=0;
2051 sub:=substr(inp,1,l-1);
2052 inp:=substr(inp,l+1);
2053 n:=instr(sub,':'); seq(cnt):=substr(sub,1,n-1); cval(cnt):=substr(sub,n+1);cnt:=cnt+1;
2054 END LOOP;
2055
2056 if(l is null or l=0) then
2057 sub:=inp; n:=instr(sub,':'); seq(cnt):=substr(sub,1,n-1); cval(cnt):=substr(sub,n+1);
2058 end if;
2059
2060 SELECT client_number INTO l_client_num
2061 FROM asg_user
2062 WHERE user_name = p_user_name;
2063
2064 FOR i in 1..cnt
2065 loop
2066 l_seq_name:=seq(i);
2067 l_curr_val:=cval(i);
2068
2069 IF(MOD(l_curr_val, 1000000) = l_client_num) THEN
2070 UPDATE asg_sequence_partitions SET curr_val = l_curr_val
2071 WHERE CLIENTID = p_user_name
2072 AND name = l_seq_name
2073 AND curr_val < l_curr_val;
2074
2075 CSM_UTIL_PKG.log ('Updated sequence for user: ' || p_user_name ||'\n sequence: ' || l_seq_name || '\n Seq value: ' || l_curr_val, 'CSM_HTML5_PKG.process_sequences',FND_LOG.LEVEL_PROCEDURE);
2076 ELSE
2077 CSM_UTIL_PKG.log('Users sequence mismatch! Sequence Name: ' || l_seq_name
2078 ||' \nSequence Value: ' ||l_curr_val || '\n Client_Number: ' || l_client_num, 'CSM_HTML5_PKG.process_sequences',FND_LOG.LEVEL_PROCEDURE);
2079 END IF;
2080 end loop;
2081 END process_sequences;
2082
2083 PROCEDURE process_pubitem_conflicts(p_user_name IN VARCHAR2,
2084 p_upload_tranid IN NUMBER,
2085 p_pubitem IN VARCHAR2)
2086 IS
2087 CURSOR c_conf_rows (p_user_name VARCHAR2,
2088 p_upload_tranid NUMBER,
2089 p_pubitem VARCHAR2) IS
2090 SELECT sequence
2091 FROM asg_conf_info
2092 WHERE user_name = p_user_name AND
2093 transaction_id = p_upload_tranid AND
2094 pub_item = p_pubitem AND
2095 sequence IS NOT NULL;
2096 l_client_wins VARCHAR2(1);
2097 l_server_wins VARCHAR2(1);
2098 l_conf_resolution VARCHAR2(1);
2099 l_conflict_callout VARCHAR2(100);
2100 l_sequence NUMBER;
2101 l_conf_count NUMBER;
2102 l_query_string VARCHAR2(2000);
2103 BEGIN
2104
2105
2106 SELECT conflict_callout INTO l_conflict_callout
2107 FROM asg_pub_item WHERE name = p_pubitem;
2108
2109 l_client_wins := asg_base.G_CLIENT_WINS;
2110 l_server_wins := asg_base.G_SERVER_WINS;
2111
2112 -- Get the access_id of updated DMLs
2113 insert into asg_conf_info (user_name,
2114 pub_item,
2115 transaction_id,
2116 access_id,
2117 sequence,
2118 resolution,
2119 creation_date,
2120 created_by,
2121 last_update_date,
2122 last_updated_by)
2123 SELECT p_user_name, p_pubitem, p_upload_tranid, access_id,b.sequence, l_client_wins,
2124 sysdate, 1, sysdate, 1
2125 FROM asg_system_dirty_queue a, CSM_HTML5_PARSED_DATA b
2126 WHERE client_id = p_user_name AND pub_item = p_pubitem AND
2127 transaction_id is NULL AND a.dml_type = 2
2128 AND b.session_id=p_upload_tranid AND b.piv_name=a.pub_item AND a.access_id=b.pk_value AND b.dml_type='U'
2129 AND NOT EXISTS(SELECT 1 FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME=p_user_name AND PRF_NAME='COMPREF' AND PRF_VALUE=p_pubitem);
2130
2131 l_conf_count := SQL%ROWCOUNT;
2132
2133 CSM_UTIL_PKG.LOG('Number of possible conflicts: ' || l_conf_count
2134 ,'CSM_HTML5_PKG.process_pubitem_conflicts', FND_LOG.LEVEL_PROCEDURE);
2135
2136 IF (l_conf_count = 0) THEN
2137 CSM_UTIL_PKG.LOG('Leaving as No conflicts exist.' ,'CSM_HTML5_PKG.process_pubitem_conflicts', FND_LOG.LEVEL_PROCEDURE);
2138 RETURN;
2139 END IF;
2140
2141 -- Ready to call the pubitem callback
2142 -- If conflict callout is not specified client wins
2143 IF (l_conflict_callout IS NOT NULL) THEN
2144 FOR ccr in c_conf_rows(p_user_name, p_upload_tranid, p_pubitem) LOOP
2145 l_sequence := ccr.sequence;
2146
2147 l_query_string := 'SELECT ' || l_conflict_callout ||'(:1,:2,:3) from dual';
2148
2149 CSM_UTIL_PKG.LOG('SQL Command: ' || replace(l_query_string,'''','''''') ,'CSM_HTML5_PKG.process_pubitem_conflicts', FND_LOG.LEVEL_PROCEDURE);
2150
2151 BEGIN
2152 l_conf_resolution := l_client_wins;
2153 EXECUTE IMMEDIATE l_query_string INTO l_conf_resolution USING p_user_name,p_upload_tranid,l_sequence ;
2154 EXCEPTION
2155 WHEN OTHERS THEN
2156 CSM_UTIL_PKG.LOG('Exception in pub item level callback. ' || sqlerrm ,'CSM_HTML5_PKG.process_pubitem_conflicts', FND_LOG.LEVEL_PROCEDURE);
2157 END;
2158 IF (l_conf_resolution = l_server_wins) THEN
2159 UPDATE asg_conf_info
2160 SET resolution = l_conf_resolution
2161 WHERE user_name = p_user_name AND
2162 transaction_id = p_upload_tranid AND
2163 pub_item = p_pubitem AND
2164 sequence = l_sequence;
2165 END IF;
2166 END LOOP;
2167 END IF;
2168
2169 -- Ok, all the conflict rows are processed. We need to
2170 -- reset download flag for those rows where client wins applies
2171 UPDATE asg_system_dirty_queue
2172 SET download_flag = 'N'
2173 WHERE client_id = p_user_name AND
2174 pub_item = p_pubitem AND
2175 transaction_id is NULL AND
2176 dml_type = 2 AND
2177 access_id in (select access_id
2178 FROM asg_conf_info
2179 WHERE user_name = p_user_name AND
2180 transaction_id = p_upload_tranid AND
2181 pub_item = p_pubitem AND
2182 sequence IS NOT NULL AND
2183 resolution = l_client_wins);
2184 END process_pubitem_conflicts;
2185
2186 PROCEDURE process_conflicts(p_user_name IN VARCHAR2,p_upload_tran_id IN NUMBER)
2187 IS
2188 BEGIN
2189
2190 CSM_UTIL_PKG.LOG('Entered Process Conflicts for tranid: '||p_upload_tran_id, 'CSM_HTML5_PKG.process_conflicts', FND_LOG.LEVEL_PROCEDURE);
2191
2192 FOR rec IN (SELECT api.item_id
2193 FROM csm_html5_inq ci, asg_pub_item api
2194 WHERE ci.user_name = p_user_name
2195 AND ci.sync_id = p_upload_tran_id
2196 AND ci.pi_name = api.name
2197 AND api.detect_conflict = 'Y')
2198 LOOP
2199 CSM_UTIL_PKG.LOG('Processing ' ||rec.item_id || ' for conflicts.', 'CSM_HTML5_PKG.process_conflicts', FND_LOG.LEVEL_PROCEDURE);
2200
2201 process_pubitem_conflicts(p_user_name, p_upload_tran_id, rec.item_id);
2202
2203 CSM_UTIL_PKG.LOG('Done Processing ' ||rec.item_id || ' for conflicts.', 'CSM_HTML5_PKG.process_conflicts', FND_LOG.LEVEL_PROCEDURE);
2204 END LOOP;
2205
2206 CSM_UTIL_PKG.LOG('Leaving Process Conflicts ', 'CSM_HTML5_PKG.process_conflicts', FND_LOG.LEVEL_PROCEDURE);
2207 EXCEPTION
2208 WHEN OTHERS THEN
2209 CSM_UTIL_PKG.LOG('Exception when processing for conflicts. '|| substr(sqlerrm,1,2000), 'CSM_HTML5_PKG.process_conflicts', FND_LOG.LEVEL_PROCEDURE);
2210
2211 END process_conflicts;
2212
2213 --queryId=16
2214 PROCEDURE query_parse_upload(p_user_name IN VARCHAR2,p_session_id IN NUMBER,
2215 p_result OUT nocopy CLOB,
2216 x_return_status OUT nocopy VARCHAR2,
2217 x_error_message OUT nocopy VARCHAR2)
2218 IS
2219 cnt number:=0;
2220 trnid VARCHAR2(4000):='';
2221 BEGIN
2222 For rec IN (select a.session_id from csm_html5_upload_data a, csm_html5_sync_info c
2223 where a.status<>'PARSED' and a.session_id=c.session_id
2224 and c.useR_name=p_user_name order by session_id asc)
2225 loop
2226 CSM_HTML5_PKG.HTML5_PARSE_XML(rec.SESSION_ID,x_return_status,x_error_message);
2227 IF x_return_status=FND_API.G_RET_STS_ERROR THEN
2228 cnt:=cnt+1;
2229 trnid:=rec.session_id;
2230 CSM_UTIL_PKG.LOG( 'Exception while parsing upload data in tran_id:'||rec.session_id||' for user:'||p_user_name||' with error:'||substr(x_error_message,1,1000),'CSM_HTML5_PKG.query_parse_upload', FND_LOG.LEVEL_PROCEDURE);
2231 UPDATE CSM_HTML5_UPLOAD_DATA
2232 SET LAST_UPDATE_DATE = SYSDATE,
2233 LAST_UPDATED_BY = 1,
2234 STATUS = 'PARSE_ERROR',
2235 COMMENTS = x_error_message
2236 WHERE SESSION_ID = rec.SESSION_ID;
2237 EXIT;
2238 END IF;
2239 end loop;
2240
2241 CSM_HTML5_PKG.process_upload(p_user_name);
2242
2243 IF cnt>0 THEN
2244 p_result := 'sync.upload_complete(true,"w:'||trnid||'");'; --synchronous uploaded, warnings txn
2245 END_SESSION(p_session_id,'SUCCESS_W');
2246 ELSE
2247 p_result := 'sync.upload_complete(true,"s");';
2248 END_SESSION(p_session_id,'SUCCESS');
2249 END IF ;
2250 x_return_status := fnd_api.g_ret_sts_success;
2251 EXCEPTION
2252 WHEN OTHERS THEN
2253 x_return_status := fnd_api.g_ret_sts_error;
2254 x_error_message := 'Exception occurred in query_parse_upload: ' || substr(sqlerrm,1,3900);
2255 CSM_UTIL_PKG.LOG(x_error_message, 'CSM_HTML5_PKG.query_parse_upload', FND_LOG.LEVEL_PROCEDURE);
2256 p_result := 'handle_sync_exception("'||translateString(x_error_message)||'");';
2257 END_SESSION(p_session_id,'ERROR',x_error_message);
2258 END query_parse_upload;
2259
2260
2261 FUNCTION uploadData(p_user_name IN VARCHAR2,
2262 p_password IN VARCHAR2,
2263 p_sync_data IN CLOB,
2264 p_seq_data IN CLOB,
2265 p_result OUT nocopy VARCHAR2) RETURN NUMBER
2266 IS
2267
2268 l_session_id NUMBER;
2269 l_final VARCHAR2(4000);
2270 is_synchronous boolean :=false;
2271
2272 l_app_id NUMBER:=883;
2273 l_resp_id NUMBER:=23675;
2274 l_user_id NUMBER;
2275 instId number:=-1; ret VARCHAR2(1); m varchar2(4000);
2276 l_id CSM_INTEGER_LIST :=CSM_INTEGER_LIST();
2277 l_ch CSM_VARCHAR_LIST:=CSM_VARCHAR_LIST();
2278 l_dt CSM_DATE_LIST:=CSM_DATE_LIST();
2279 req_id number:=0;
2280 l_ret VARCHAR2(100);
2281 l_err varchar2(4000);
2282 l_dummy boolean :=true;
2283 BEGIN
2284
2285 l_final := empty_clob();
2286
2287 IF NOT isHTML5User(p_user_name) THEN
2288 CSM_UTIL_PKG.LOG('Quitting...since '||p_user_name||' is not an HTML5 user', 'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2289 CREATE_AJAX_SESSION(p_user_name,'csm_mfs_error: Not authorized HTML5 user');
2290 l_final := 'display_alert("csm_mfs_error")';
2291 p_result :=l_final;
2292 RETURN -1;
2293 END IF;
2294
2295 IF NOT authenticate(p_user_name,p_password) THEN
2296 CSM_UTIL_PKG.LOG('Auth failed for USER: ' || p_user_name,'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2297 CREATE_AJAX_SESSION(p_user_name,'csm_auth_error: Invalid password');
2298 l_final := 'display_alert("csm_pass_chg");';
2299 p_result :=l_final;
2300 RETURN -1;
2301 END IF;
2302
2303 CSM_UTIL_PKG.LOG('Dumping Uploaded data for USER: ' || p_user_name,'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2304
2305
2306 SELECT USER_ID,RESPONSIBILITY_ID,APP_ID INTO l_user_id,l_resp_id,l_app_id FROM ASG_USER WHERE USER_NAME=p_user_name;
2307
2308 IF fnd_profile.value_specific('ASG_SYNCHRONOUS_UPLOAD',l_user_id,l_resp_id,l_app_id)='Y' THEN
2309 is_synchronous:=true;
2310 END IF;
2311
2312 l_session_id:=CREATE_SESSION(p_user_name,'UPLOAD');
2313
2314 IF p_seq_data IS NOT NULL THEN
2315 process_sequences(p_user_name,p_seq_data);
2316 END IF;
2317
2318 INSERT INTO CSM_HTML5_UPLOAD_DATA(SESSION_ID,STATUS,COMMENTS,UPLOADED_PAYLOAD,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE)
2319 VALUES(l_session_id,'RECEIVED','Sync successfully dumped the data',p_sync_data,l_user_id,SYSDATE,l_user_id,SYSDATE);
2320
2321 --Bug 16456574
2322 CSM_HTML5_PKG.HTML5_PARSE_XML(l_session_id,l_ret,l_err);
2323 IF l_ret=FND_API.G_RET_STS_ERROR THEN
2324 CSM_UTIL_PKG.LOG( 'Exception while parsing upload data in tran_id:'||l_session_id||' for user:'||p_user_name
2325 ||' with error:'||substr(l_err,1,1000),'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2326 UPDATE CSM_HTML5_UPLOAD_DATA
2327 SET LAST_UPDATE_DATE = SYSDATE,
2328 LAST_UPDATED_BY = 1,
2329 STATUS = 'PARSE_ERROR',
2330 COMMENTS = l_err
2331 WHERE SESSION_ID = l_session_id;
2332 l_err:= 'w:'||l_session_id;
2333 ELSE
2334 l_dummy:=true;
2335 FOR rec IN (SELECT PIV_NAME,COUNT(1) cnt FROM CSM_HTML5_PARSED_DATA
2336 WHERE SESSION_ID=l_session_id GROUP BY PIV_NAME ORDER BY PIV_NAME)
2337 LOOP
2338 UPDATE_SESSION_DETAILS(l_session_id,rec.PIV_NAME,rec.cnt,l_dummy);
2339 END LOOP;
2340
2341 SELECT COUNT(*) INTO req_id FROM CSM_HTML5_PARSED_DATA
2342 WHERE SESSION_ID=l_session_id AND STATUS='PARSE_ERROR';
2343
2344 IF req_id > 0 THEN
2345 l_err:= 'w:'||l_session_id; req_id:=0;
2346 ELSE
2347 l_err:= 's';
2348 END IF;
2349 END IF;
2350
2351 process_conflicts(p_user_name,l_session_id);
2352
2353 IF NOT is_synchronous THEN
2354 p_result := 'sync.logSyncSession('||to_char(l_session_id)||',true);sync.upload_complete(false,"'||l_err||'");';
2355 END_SESSION(l_session_id,'SUCCESS');
2356 RETURN -1;
2357 END IF;
2358
2359 CSM_UTIL_PKG.LOG('Synchronous Upload set for USER: ' || p_user_name,'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2360
2361 l_id.extend(2);l_ch.extend(2);l_dt.extend(2);
2362 l_id(1):=1; l_ch(1):=p_user_name;
2363
2364 l_id(2):=2; l_ch(2):=l_session_id;
2365
2366 CSM_QUERY_PKG.INSERT_INSTANCE(asg_base.get_user_id(p_user_name), 16, NULL, 'SYNCHRONOUS_UPLOAD', l_id, l_ch, l_dt,NULL, instId, ret, m);
2367
2368 IF (ret=fnd_api.g_ret_sts_success) THEN
2369 CSM_UTIL_PKG.LOG('Created Instance -:'||instId, 'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2370
2371 UPDATE csm_html5_sync_info SET Q_INSTANCE_ID=instId WHERE SESSION_ID=l_session_id;
2372
2373 req_id:=SUBMIT_CON_QUERY(asg_base.get_user_id(p_user_name), 16, instId);
2374 IF req_id=0 THEN
2375 CSM_UTIL_PKG.LOG('Sorry, this user -'||p_user_name||' does not have the responsibility/request group to submit request', 'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2376 p_result:= 'sync.logSyncSession('||to_char(l_session_id)||',true);sync.upload_complete(true,"e:no_resp_to_submit_req");';
2377 END_SESSION(l_session_id,'SUCCESS_W');
2378 RETURN -1;
2379 END IF;
2380 ELSE
2381 CSM_UTIL_PKG.LOG('Create Instance failed - Status:'||instId||':'||ret||':'||m, 'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2382 p_result:= 'sync.logSyncSession('||to_char(l_session_id)||',true);sync.upload_complete(true,"e:instance_create_failed");';
2383 END_SESSION(l_session_id,'SUCCESS_W');
2384 RETURN -1;
2385 END IF;
2386
2387 /*p_result:= 'sync.logSyncSession('||to_char(l_session_id)||',true);setTimeout("connectTo(''queryId=13 amp INSTANCE_ID='||instId||' amp USER_NAME='||p_user_name||');secureSessionId='||instId||';",5000);'*/
2388 p_result:=to_char(req_id)||':'||to_char(l_session_id); --ampersand is causing issue with plsql, so moved this string to java
2389 RETURN instId;
2390
2391 EXCEPTION
2392 WHEN others THEN
2393 ROLLBACK;
2394 l_final := 'Exception occurred in uploadData: ' || substr(sqlerrm,1,3900);
2395 CSM_UTIL_PKG.LOG(l_final, 'CSM_HTML5_PKG.uploadData', FND_LOG.LEVEL_PROCEDURE);
2396 END_SESSION(l_session_id,'ERROR',l_final);
2397 p_result := 'handle_sync_exception("'||translateString(l_final)||'");';
2398 RETURN -1;
2399 END uploadData;
2400
2401 PROCEDURE CONC_EXECUTE_QUERY(errbuf OUT NOCOPY VARCHAR2,
2402 RETCODE OUT NOCOPY VARCHAR2,
2403 p_USER_ID IN NUMBER,
2404 p_QUERY_ID IN NUMBER,
2405 p_INSTANCE_ID IN NUMBER
2406 )
2407 IS
2408 BEGIN
2409 CSM_QUERY_PKG.EXECUTE_QUERY(p_USER_ID, p_QUERY_ID, p_INSTANCE_ID, RETCODE, errbuf);
2410 END CONC_EXECUTE_QUERY;
2411
2412 FUNCTION SUBMIT_CON_QUERY(p_USER_ID IN NUMBER,
2413 p_QUERY_ID IN NUMBER,
2414 p_INSTANCE_ID IN NUMBER) RETURN NUMBER
2415 IS
2416 CON_REQUEST_ID NUMBER;
2417 l_app_id NUMBER:=883;
2418 l_resp_id NUMBER:=23675;
2419 l_app_name VARCHAR2(10):='CSM';
2420 BEGIN
2421 begin
2422 select responsibility_id ,application_id into l_resp_id ,l_app_id
2423 from fnd_responsibility a, fnd_oracle_userid b
2424 where responsibility_key='OMFS_PALM' and a.application_id=b.oracle_id
2425 and b.oracle_username=l_app_name ;
2426 exception
2427 when others then
2428 null;
2429 end;
2430
2431 FND_GLOBAL.APPS_INITIALIZE (p_USER_ID,l_resp_id,l_app_id);
2432
2433 CON_REQUEST_ID :=FND_REQUEST.SUBMIT_REQUEST(application => l_app_name
2434 ,program => 'CSM_MULTIPLAT_CONC'
2435 ,start_time => SYSDATE
2436 ,sub_request => FALSE
2437 ,argument1 => to_char(p_USER_ID)
2438 ,argument2 => to_char(p_QUERY_ID)
2439 ,argument3 => to_char(p_INSTANCE_ID));
2440 COMMIT;
2441
2442 RETURN CON_REQUEST_ID;
2443 END SUBMIT_CON_QUERY;
2444
2445 PROCEDURE set_app_revision(p_version IN VARCHAR2,p_force_update IN VARCHAR2 :='N')
2446 IS
2447 l_cur_version VARCHAR2(100):=get_app_revision;
2448 BEGIN
2449
2450 IF l_cur_version IS NULL THEN
2451 INSERT INTO csm_html5_clients_info(USER_NAME,PRF_NAME,PRF_VALUE)
2452 VALUES('APPLICATION','REVISION',p_version);
2453 ELSIF to_number(p_version)> to_number(l_cur_version) THEN
2454 UPDATE csm_html5_clients_info SET PRF_VALUE=p_version
2455 WHERE USER_NAME='APPLICATION' AND PRF_NAME='REVISION';
2456
2457 UPDATE csm_html5_clients_info SET PRF_VALUE=p_force_update
2458 WHERE USER_NAME='APPLICATION' AND PRF_NAME='FORCE_UPDATE';
2459 IF SQL%ROWCOUNT=0 THEN
2460 INSERT INTO csm_html5_clients_info(USER_NAME,PRF_NAME,PRF_VALUE)
2461 VALUES('APPLICATION','FORCE_UPDATE',p_force_update);
2462 END IF;
2463 END IF;
2464
2465 END set_app_revision;
2466
2467 FUNCTION get_app_revision(p_u IN VARCHAR2:=NULL,p_v IN VARCHAR2:=NULL) RETURN VARCHAR2
2468 IS
2469 x varchar2(1000);
2470 BEGIN
2471 SELECT MAX(PRF_VALUE) into x FROM csm_html5_clients_info
2472 WHERE USER_NAME='APPLICATION' AND PRF_NAME='REVISION';
2473
2474 IF p_u IS NOT NULL AND p_v IS NOT NULL THEN
2475 UPDATE csm_html5_clients_info SET PRF_VALUE=p_v
2476 WHERE USER_NAME=P_U AND PRF_NAME='LAST_SYNC_APP_VERSION';
2477 IF SQL%ROWCOUNT=0 THEN
2478 INSERT INTO csm_html5_clients_info(USER_NAME,PRF_NAME,PRF_VALUE)
2479 VALUES(P_U,'LAST_SYNC_APP_VERSION',p_v);
2480 END IF;
2481 END IF;
2482
2483 RETURN x;
2484 END get_app_revision;
2485
2486 FUNCTION has_upgraded_version(p_user_name IN VARCHAR2,p_version IN VARCHAR2 :=NULL) RETURN BOOLEAN
2487 IS
2488 x VARCHAR2(1000);
2489 BEGIN
2490 IF (p_version IS NULL) THEN
2491 SELECT PRF_VALUE into x FROM csm_html5_clients_info
2492 WHERE USER_NAME=p_user_name AND PRF_NAME='APP_REVISION';
2493
2494 DELETE FROM csm_html5_clients_info
2495 WHERE USER_NAME=p_user_name AND PRF_NAME='APP_REVISION';
2496
2497 RETURN TRUE;
2498 ELSE
2499 SELECT PRF_VALUE into x FROM csm_html5_clients_info
2500 WHERE USER_NAME='APPLICATION' AND PRF_NAME='REVISION';
2501
2502 if (trim(X) <> trim(p_version)) THEN return TRUE; END IF;
2503 END IF;
2504 RETURN FALSE;
2505 EXCEPTION
2506 WHEN Others THEN
2507 return FALSE;
2508 END has_upgraded_version;
2509
2510 FUNCTION GET_SECURE_SESSION(p_uname IN VARCHAR2) RETURN VARCHAR2
2511 IS
2512 l_e NUMBER;l_d NUMBER;l_n NUMBER;
2513 l_s VARCHAR2(100);
2514 l_seq NUMBER;
2515 BEGIN
2516
2517 l_seq := round(dbms_random.value*100000);
2518 set_user_profile(p_uname,'RSA_KEY',get_rsa_keys(l_e,l_d,l_n));
2519
2520 l_s :=to_char(l_e)||g_pattern||to_char(l_seq)||g_pattern||to_char(l_n)||g_pattern;
2521 RETURN 'sessionCreated("'||encode(l_s)||'");';
2522
2523 END GET_SECURE_SESSION;
2524
2525 /* An OPTIMIZATION FRAMEWORK for queryid 6 and 9 */
2526 FUNCTION GET_REUSABLE(p_USER_NAME IN VARCHAR2,p_password IN VARCHAR2,p_QUERY_ID IN NUMBER) RETURN VARCHAR2
2527 IS
2528 x VARCHAR2(1000);
2529 BEGIN
2530 IF NOT authenticate(p_user_name,p_password) THEN
2531 RETURN '-1';
2532 END IF ;
2533
2534 BEGIN
2535 SELECT '1' INTO x FROM ASG_SYSTEM_DIRTY_QUEUE sdq WHERE CLIENT_ID=p_USER_NAME AND ROWNUM<2
2536 AND EXISTS(SELECT 1 FROM ASG_PUB_ITEM pi WHERE pi.item_id=sdq.pub_item and nvl(html5_offline,'N')='Y');
2537
2538 DELETE FROM csm_html5_clients_info WHERE USER_NAME=p_USER_NAME AND PRF_NAME like 'REUSABLE%';
2539 RETURN '-1';
2540 EXCEPTION
2541 WHEN OTHERS THEN
2542 NULL;
2543 END;
2544
2545 BEGIN
2546 SELECT PRF_VALUE into x FROM csm_html5_clients_info
2547 WHERE USER_NAME=p_USER_NAME AND PRF_NAME='USER_CREATION_DATA';
2548 DELETE FROM csm_html5_clients_info WHERE USER_NAME=p_USER_NAME AND PRF_NAME='USER_CREATION_DATA';
2549 RETURN (-1*x);
2550 EXCEPTION
2551 WHEN OTHERS THEN
2552 NULL;
2553 END;
2554
2555 BEGIN
2556 SELECT PRF_VALUE into x FROM csm_html5_clients_info
2557 WHERE USER_NAME=p_USER_NAME AND PRF_NAME='REUSABLE_'||p_QUERY_ID;
2558 EXCEPTION
2559 WHEN OTHERS THEN
2560 select '-2' into x from csm_html5_clients_info where user_name=p_user_name and prf_name='REUSE_AUTH_'||p_QUERY_ID;
2561 END ;
2562
2563 RETURN x;
2564
2565 EXCEPTION
2566 WHEN OTHERS THEN
2567 RETURN '-1';
2568 END GET_REUSABLE;
2569
2570 PROCEDURE SET_REUSABLE(p_user_name IN VARCHAR2,p_QUERY_ID IN NUMBER,p_INSTANCE_ID IN NUMBER)
2571 IS
2572 x NUMBER;
2573 BEGIN
2574
2575 BEGIN
2576 select 1 into x from csm_html5_clients_info where user_name=p_user_name and prf_name='REUSE_AUTH_'||p_QUERY_ID;
2577 delete from csm_html5_clients_info where user_name=p_user_name and prf_name='REUSE_AUTH_'||p_QUERY_ID;
2578 set_user_profile(p_USER_NAME,'REUSABLE_'||p_QUERY_ID,to_char(p_INSTANCE_ID));
2579 EXCEPTION
2580 WHEN OTHERS THEN
2581 CSM_UTIL_PKG.LOG('Unable to set reusable since the authentication failed', 'CSM_HTML5_PKG.SET_REUSABLE', FND_LOG.LEVEL_PROCEDURE);
2582 RETURN;
2583 END;
2584 END SET_REUSABLE;
2585
2586 procedure generate_html5_data(p_user_name IN VARCHAR2)
2587 is
2588 instId number:=-1; ret VARCHAR2(1); m varchar2(4000);
2589 l_id CSM_INTEGER_LIST :=CSM_INTEGER_LIST();
2590 l_ch CSM_VARCHAR_LIST:=CSM_VARCHAR_LIST();
2591 l_dt CSM_DATE_LIST:=CSM_DATE_LIST();
2592 req_id number:=0;
2593 begin
2594 l_id.extend(1);l_ch.extend(1);l_dt.extend(1);
2595 l_id(1):=1;
2596 l_ch(1):=p_user_name;
2597 CSM_QUERY_PKG.INSERT_INSTANCE(asg_base.get_user_id(p_user_name), 12, NULL, 'GENERATE_USER_DATA', l_id, l_ch, l_dt,NULL, instId, ret, m);
2598
2599 IF (ret=fnd_api.g_ret_sts_success) THEN
2600 CSM_UTIL_PKG.LOG('Created Instance -:'||instId, 'CSM_HTML5_PKG.generate_html5_data', FND_LOG.LEVEL_PROCEDURE);
2601 req_id:=SUBMIT_CON_QUERY(asg_base.get_user_id(p_user_name), 12, instId);
2602 IF req_id=0 THEN
2603 CSM_UTIL_PKG.LOG('Sorry, this user -'||p_user_name||' does not have the responsibility/request group to submit request', 'CSM_HTML5_PKG.generate_html5_data', FND_LOG.LEVEL_PROCEDURE);
2604 ELSE
2605 set_user_profile(p_user_name,'USER_CREATION_DATA',to_char(instId));
2606 END IF;
2607 ELSE
2608 CSM_UTIL_PKG.LOG('Create Instance failed - Status:'||instId||':'||ret||':'||m, 'CSM_HTML5_PKG.generate_html5_data', FND_LOG.LEVEL_PROCEDURE);
2609 END IF;
2610 exception when others then
2611 CSM_UTIL_PKG.LOG('Exception occurred in generate_html5_data: ' || substr(sqlerrm,1,3900), 'CSM_HTML5_PKG.generate_html5_data', FND_LOG.LEVEL_PROCEDURE);
2612 end generate_html5_data;
2613
2614 procedure query_generate_html5_data( p_user_name IN VARCHAR2,p_result OUT nocopy CLOB, x_return_status OUT nocopy VARCHAR2,
2615 x_error_message OUT nocopy VARCHAR2)
2616 is
2617 begin
2618 query_sync_data_js(p_user_name, null,p_result,x_return_status,x_error_message,true);
2619 end query_generate_html5_data;
2620
2621 PROCEDURE GET_INQ_INS_ST(P_TABLE_NAME IN VARCHAR2,P_COL_NAME_LIST IN CSM_VARCHAR_LIST,P_COL_VALUE_LIST IN CSM_VARCHAR_LIST,P_COL_IDX_LIST numtype,p_result OUT NOCOPY CLOB)
2622 IS
2623 L_STMT CLOB :=empty_clob();
2624 l_part CLOB :=empty_clob();
2625 l_cnt NUMBER:=1;
2626 BEGIN
2627
2628 L_STMT := 'INSERT INTO '||P_TABLE_NAME||'(';
2629
2630 l_part:='';
2631 FOR j IN 1..P_COL_NAME_LIST.COUNT
2632 LOOP
2633 IF(P_COL_NAME_LIST(j)<>'ACCESS_ID' AND P_COL_NAME_LIST(j) IS NOT NULL AND (P_COL_VALUE_LIST(j) IS NOT NULL OR P_COL_IDX_LIST.EXISTS(j))) THEN
2634 l_part := l_part||','||P_COL_NAME_LIST(j);
2635 END IF;
2636 END LOOP;
2637
2638 l_part:=l_part||',CLID$$CS,TRANID$$,SEQNO$$,DMLTYPE$$,VERSION$$';
2639 l_stmt:=l_stmt|| SUBSTR(l_part,2)||') VALUES(';
2640
2641 l_part:='';
2642 FOR j IN 1..P_COL_VALUE_LIST.COUNT
2643 LOOP
2644 IF(P_COL_NAME_LIST(j)<>'ACCESS_ID' AND P_COL_NAME_LIST(j) IS NOT NULL) THEN
2645 IF (P_COL_VALUE_LIST(j) IS NOT NULL) THEN
2646 l_part := l_part||','''||replace(P_COL_VALUE_LIST(j),'''','''''')||'''';
2647 ELSIF P_COL_IDX_LIST.EXISTS(j) THEN
2648 l_part := l_part||',:'||to_char(l_cnt);
2649 l_cnt:=l_cnt+1;
2650 END IF;
2651 END IF;
2652 END LOOP;
2653
2654
2655 for i in 1..5
2656 loop
2657 l_part:=l_part||',:'||to_char(l_cnt);
2658 l_cnt:=l_cnt+1;
2659 end loop;
2660
2661 l_stmt:=l_stmt|| SUBSTR(l_part,2)||')';
2662
2663 p_result:=l_stmt;
2664
2665 --CSM_UTIL_PKG.LOG( l_stmt ,'CSM_HTML5_PKG.GET_INQ_INS_ST',FND_LOG.LEVEL_PROCEDURE);
2666 END GET_INQ_INS_ST;
2667
2668 PROCEDURE HTML5_PARSE_XML(p_SYNC_ID IN NUMBER,X_RETURN_STATUS OUT NOCOPY VARCHAR2,x_ERROR_MESSAGE OUT NOCOPY VARCHAR2)
2669 IS
2670
2671 CURSOR c_get_sync_data(sync_id NUMBER)
2672 IS
2673 SELECT UPLOADED_PAYLOAD
2674 FROM CSM_HTML5_UPLOAD_DATA
2675 WHERE SESSION_ID = sync_id
2676 AND STATUS<>'PARSED';
2677
2678 CURSOR c_get_sync_uname(sync_id NUMBER)
2679 IS
2680 SELECT au.USER_NAME, USER_ID, RESPONSIBILITY_ID, APP_ID
2681 FROM CSM_HTML5_SYNC_INFO si, ASG_USER au
2682 WHERE SESSION_ID =SYNC_ID
2683 AND au.USER_NAME =si.USER_NAME;
2684
2685
2686 l_xml_clob_payload CLOB;
2687 l_result CLOB;
2688 part_xml CLOB;
2689 l_xml_doc xmldom.DOMDocument;
2690 l_xml_parser xmlparser.Parser;
2691 l_xml_node_list xmldom.DOMNodeList;
2692 l_xml_DATA_node_list xmldom.DOMNodeList;
2693 l_xml_node xmldom.DOMNode;
2694 l_xml_node_len NUMBER;
2695 dummy number;
2696 l_COL_NAME_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
2697 L_COL_VALUE_LIST CSM_VARCHAR_LIST := CSM_VARCHAR_LIST();
2698 l_COL_NAME_IDX numtype;
2699 l_COL_CLOB_LIST clobtype;
2700
2701
2702 L_ACCESS_ID NUMBER;
2703 L_NODE_NAME VARCHAR2(300);
2704 L_NODE_VALUE VARCHAR2(300);
2705 L_PIV_NAME VARCHAR2(300);
2706 L_DML_TYPE VARCHAR2(3);
2707 l_sec_node dbms_xmldom.domnode;
2708 L_SEC_LST DBMS_XMLDOM.DOMNODELIST;
2709 l_first_node dbms_xmldom.domnode;
2710 L_FIRST_LST DBMS_XMLDOM.DOMNODELIST;
2711 L_FIRST_LEN NUMBER;
2712 L_INQ_TABLE_NAME VARCHAR2(256);
2713 L_SYNC_USER_NAME VARCHAR2(500);
2714 L_RESP_ID NUMBER;
2715 L_APP_ID NUMBER;
2716 L_USER_ID NUMBER;
2717 L_PAYLOAD_ID NUMBER;
2718 l_seq NUMBER:=1;
2719
2720 CURSOR c_date_f
2721 IS
2722 SELECT upper(VALUE)
2723 FROM NLS_SESSION_PARAMETERS
2724 WHERE PARAMETER='NLS_DATE_FORMAT';
2725 l_df VARCHAR2(100);
2726 l_htm5_df VARCHAR2(100):='RRRR-MM-DD HH24:MI:SS';
2727 l_changed_df boolean:=false;
2728 BEGIN
2729 CSM_UTIL_PKG.LOG( 'Entering PARSE_XML for SYNC ID : ' || p_SYNC_ID ,'CSM_HTML5_PKG.HTML5_PARSE_XML',FND_LOG.LEVEL_PROCEDURE);
2730
2731 OPEN c_date_f;
2732 FETCH c_date_f INTO l_df;
2733 CLOSE c_date_f;
2734
2735 --get synch user name
2736 OPEN C_GET_SYNC_UNAME(P_SYNC_ID);
2737 FETCH C_GET_SYNC_UNAME INTO L_SYNC_USER_NAME, L_USER_ID, L_RESP_ID, L_APP_ID;
2738 CLOSE C_GET_SYNC_UNAME;
2739
2740 --Parse Payload
2741 OPEN c_get_sync_data(p_SYNC_ID);
2742 FETCH c_get_sync_data INTO l_xml_clob_payload;
2743 CLOSE c_get_sync_data;
2744
2745 IF l_xml_clob_payload IS NULL THEN
2746 CSM_UTIL_PKG.LOG ( 'No data found in SYNC ID : ' || p_SYNC_ID, 'CSM_HTML5_PKG.HTML5_PARSE_XML',FND_LOG.LEVEL_EXCEPTION);
2747 x_return_status := FND_API.G_RET_STS_ERROR;
2748 x_error_message := 'Either Synch has uploaded no Data Or Is already parsed' ;
2749 RETURN;
2750 END IF;
2751
2752 --PARSE the XML
2753 l_xml_parser := xmlparser.newParser;
2754 xmlparser.parseClob(l_xml_parser, l_xml_clob_payload);
2755 L_XML_DOC := XMLPARSER.GETDOCUMENT(L_XML_PARSER);
2756 xmlparser.freeParser(l_xml_parser);
2757
2758 l_first_lst := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(L_XML_DOC),'/SYNC_DATA/PIV');
2759 l_first_len := dbms_xmldom.getLength(l_first_lst);
2760
2761 l_sec_lst := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(L_XML_DOC),'/SYNC_DATA/PIV/DATA');
2762 l_sec_node := xmldom.makenode(xmldom.makeelement(xmldom.item(l_sec_lst, 0)));
2763
2764 IF l_df <> l_htm5_df THEN
2765 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT='''||l_htm5_df||'''';
2766 l_changed_df:=true;
2767 END If;
2768
2769 -- loop through elements
2770 FOR I IN 0..l_first_len-1 LOOP
2771 l_first_node := xmldom.item(l_first_lst, i);
2772 l_sec_node := xmldom.makenode(xmldom.makeelement(xmldom.item(l_sec_lst, i)));
2773 L_NODE_NAME := XMLDOM.GETNODENAME(L_FIRST_NODE);
2774
2775 IF L_NODE_NAME = 'PIV' THEN
2776
2777 dbms_xslprocessor.valueOf(l_first_node,'PIV_NAME/text()',L_PIV_NAME);
2778 dbms_xslprocessor.valueOf(l_first_node,'ACCESS_ID/text()',L_ACCESS_ID);
2779 dbms_xslprocessor.valueOf(l_first_node,'DML_TYPE/text()',L_DML_TYPE);
2780
2781 END IF;
2782
2783 part_xml := ' ';
2784 dbms_xmldom.writetoclob(l_sec_node, part_xml);
2785
2786 part_xml := REPLACE (part_xml,'<DATA>','<?xml version="' || '1.0' || '"?>' || '<ROWSET><ROW>');
2787 part_xml := REPLACE (part_xml,'</DATA>','</ROW></ROWSET>');
2788
2789 OPEN C_GET_INQ_TABLE(L_PIV_NAME);
2790 FETCH C_GET_INQ_TABLE INTO L_INQ_TABLE_NAME;
2791 CLOSE C_GET_INQ_TABLE;
2792
2793
2794 BEGIN
2795
2796 BEGIN
2797 l_COL_NAME_IDX.DELETE;l_COL_CLOB_LIST.DELETE;
2798 PARSE_XML(part_xml,l_COL_NAME_LIST,L_COL_VALUE_LIST,l_COL_NAME_IDX,l_COL_CLOB_LIST,true);
2799 EXCEPTION
2800 WHEN OTHERS THEN
2801 CSM_UTIL_PKG.LOG( 'Parse xml failed for ' || p_SYNC_ID ||': Payload saved in :'||L_PAYLOAD_ID ,'CSM_HTML5_PKG.HTML5_PARSE_XML',FND_LOG.LEVEL_PROCEDURE);
2802 RAISE_APPLICATION_ERROR(-20994, 'PARSE_XML Failed:'||SUBSTR(SQLERRM,1,3000));
2803 END;
2804
2805 IF L_INQ_TABLE_NAME is null THEN
2806 CSM_UTIL_PKG.LOG( 'INQ TABLE NAME is null for ' || p_SYNC_ID ||': Payload saved in :'||L_PAYLOAD_ID ,'CSM_HTML5_PKG.HTML5_PARSE_XML',FND_LOG.LEVEL_PROCEDURE);
2807 RAISE_APPLICATION_ERROR(-20994, 'INQ TABLE NAME is null for ' || p_SYNC_ID||': Payload saved in :'||L_PAYLOAD_ID);
2808 END IF;
2809
2810 GET_INQ_INS_ST(L_INQ_TABLE_NAME,l_COL_NAME_LIST,L_COL_VALUE_LIST,l_COL_NAME_IDX,l_result);
2811 IF(l_COL_NAME_IDX.COUNT=0) THEN
2812 EXECUTE IMMEDIATE l_result USING L_SYNC_USER_NAME,P_SYNC_ID,l_seq,L_DML_TYPE,1;
2813 ELSE
2814 IF (l_COL_NAME_IDX.COUNT=1) THEN
2815 EXECUTE IMMEDIATE l_result USING l_COL_CLOB_LIST(l_COL_NAME_IDX.FIRST),L_SYNC_USER_NAME,P_SYNC_ID,l_seq,L_DML_TYPE,1;
2816 ELSIF (l_COL_NAME_IDX.COUNT=2) THEN
2817 EXECUTE IMMEDIATE l_result USING l_COL_CLOB_LIST(l_COL_NAME_IDX.FIRST),l_COL_CLOB_LIST(l_COL_NAME_IDX.LAST),L_SYNC_USER_NAME,P_SYNC_ID,l_seq,L_DML_TYPE,1;
2818 ELSE
2819 RAISE_APPLICATION_ERROR(-20994, 'ONLY TWO CLOB COLUMNS PER TABLE SUPPORTED IN UPLOAD FOR NOW');
2820 END IF;
2821 END IF;
2822
2823 BEGIN
2824 SELECT 1 INTO dummy FROM csm_html5_inq
2825 WHERE USER_NAME=L_SYNC_USER_NAME AND pi_name=L_PIV_NAME AND SYNC_ID=p_SYNC_ID;
2826 EXCEPTION
2827 WHEN OTHERS THEN
2828 INSERT INTO csm_html5_inq (USER_NAME,PI_NAME,SYNC_ID) VALUES(L_SYNC_USER_NAME,L_PIV_NAME,p_SYNC_ID);
2829 END;
2830
2831 INSERT INTO CSM_HTML5_PARSED_DATA(SESSION_ID,SEQUENCE, PIV_NAME, PK_VALUE,
2832 DML_TYPE, STATUS, CREATION_DATE, CREATED_BY, LAST_UPDATE_DATE, LAST_UPDATED_BY)
2833 VALUES(P_SYNC_ID,l_seq,L_PIV_NAME,L_ACCESS_ID,L_DML_TYPE,'MOVED_TO_INQ',SYSDATE,L_USER_ID,SYSDATE,L_USER_ID);
2834
2835 EXCEPTION
2836 WHEN OTHERS THEN
2837
2838 X_ERROR_MESSAGE:=SUBSTR(SQLERRM,1,3000);
2839
2840 INSERT INTO CSM_HTML5_PARSED_DATA(SESSION_ID,SEQUENCE, PIV_NAME, PK_VALUE,
2841 DML_TYPE,PAYLOAD, STATUS,COMMENTS, CREATION_DATE, CREATED_BY, LAST_UPDATE_DATE, LAST_UPDATED_BY)
2842 VALUES(P_SYNC_ID,l_seq,L_PIV_NAME,L_ACCESS_ID,L_DML_TYPE,PART_XML,'PARSE_ERROR',X_ERROR_MESSAGE,SYSDATE,L_USER_ID,SYSDATE,L_USER_ID);
2843
2844 END;
2845 l_seq:=l_seq+1;
2846 END LOOP;
2847
2848 UPDATE CSM_HTML5_UPLOAD_DATA
2849 SET LAST_UPDATE_DATE = SYSDATE,
2850 LAST_UPDATED_BY = 1,
2851 STATUS = 'PARSED',
2852 COMMENTS = 'Uploaded Data Parsed Successfully'
2853 WHERE SESSION_ID = P_SYNC_ID;
2854
2855 setup_inq_info(L_SYNC_USER_NAME,P_SYNC_ID,X_RETURN_STATUS);
2856 UPDATE asg_user SET hwm_tranid = P_SYNC_ID WHERE user_name = L_SYNC_USER_NAME;
2857
2858 x_return_status := FND_API.G_RET_STS_SUCCESS;
2859 x_error_message := 'XML Parsing Successfully completed ';
2860 CSM_UTIL_PKG.LOG
2861 ( 'Leaving PARSE_XML for SYNC ID after successfully Executing : ' || p_SYNC_ID , 'CSM_HTML5_PKG.HTML5_PARSE_XML',
2862 FND_LOG.LEVEL_PROCEDURE);
2863
2864 IF l_changed_df THEN
2865 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT='''||l_df||'''';
2866 END If;
2867
2868
2869 EXCEPTION WHEN OTHERS THEN
2870 /*** catch and log exceptions ***/
2871 CSM_UTIL_PKG.LOG
2872 ( 'Exception occurred in PARSE_XML for SYNC ID : ' || p_SYNC_ID || SUBSTR(SQLERRM,1,3000), 'CSM_HTML5_PKG.HTML5_PARSE_XML',
2873 FND_LOG.LEVEL_EXCEPTION);
2874 x_return_status := FND_API.G_RET_STS_ERROR;
2875 X_ERROR_MESSAGE := 'XML Retrieve Failed With Message : ' || SUBSTR(SQLERRM,1,3000) ;
2876 IF l_changed_df THEN
2877 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT='''||l_df||'''';
2878 END If;
2879 END HTML5_PARSE_XML;
2880
2881 PROCEDURE setup_inq_info(p_user_name IN VARCHAR2,
2882 p_tranid IN NUMBER,
2883 x_return_status OUT NOCOPY VARCHAR2)
2884 IS
2885 counter PLS_INTEGER;
2886 counter2 PLS_INTEGER;
2887 l_cursor_id1 NUMBER;
2888 l_cursor_ret1 NUMBER;
2889 l_store VARCHAR2(30);
2890 l_inq_count NUMBER;
2891 l_resource_id NUMBER;
2892 l_select_store_sqlstring VARCHAR2(512);
2893 l_select_inqcnt_sqlstring VARCHAR2(512);
2894 l_delete_inq_sqlstring VARCHAR2(512);
2895 l_pubitems_tbl asg_apply.vc2_tbl_type;
2896 curr_tranid NUMBER;
2897 curr_pubitem VARCHAR2(30);
2898 curr_pubitem_length PLS_INTEGER;
2899 l_pubitems_max_length PLS_INTEGER := 4000;
2900 l_pubitems_1 VARCHAR2(4000);
2901 l_pubitems_2 VARCHAR2(4000);
2902 CURSOR c_resource_id (p_user_name VARCHAR2) IS
2903 SELECT resource_id
2904 FROM asg_user
2905 WHERE user_name = p_user_name;
2906 BEGIN
2907 x_return_status := FND_API.G_RET_STS_SUCCESS;
2908 curr_tranid := p_tranid;
2909
2910 l_select_inqcnt_sqlstring :=
2911 'SELECT count(*) FROM CSM_HTML5_INQ ci ' ||
2912 'WHERE user_name = :1 AND ' ||
2913 ' sync_id = :2 AND ' ||
2914 ' pi_name in (select item_id from asg_pub_item) ' ||
2915 'AND NOT EXISTS (SELECT 1 FROM asg_users_inqinfo ' ||
2916 ' WHERE device_user_name = ci.user_name AND TRANID =ci.sync_id) ' ;
2917
2918 EXECUTE IMMEDIATE l_select_inqcnt_sqlstring INTO l_inq_count USING p_user_name, p_tranid;
2919
2920 IF (l_inq_count > 0) THEN
2921
2922 OPEN c_resource_id(p_user_name);
2923 FETCH c_resource_id into l_resource_id;
2924 CLOSE c_resource_id;
2925 IF l_resource_id IS NULL THEN
2926 csm_util_pkg.log('Did not find the user: '|| p_user_name || ' in asg_user table', 'CSM_HTML5_PKG.setup_inq_info',FND_LOG.LEVEL_PROCEDURE);
2927 x_return_status := FND_API.G_RET_STS_ERROR;
2928 return;
2929 END IF;
2930
2931 INSERT INTO asg_users_inqinfo (device_user_name,
2932 resource_id,
2933 tranid,
2934 sync_date,
2935 processed,
2936 deferred,
2937 archive,
2938 last_update_date,
2939 last_updated_by,
2940 creation_date,
2941 created_by)
2942 VALUES (p_user_name,
2943 l_resource_id,
2944 p_tranid,
2945 sysdate,
2946 'N',
2947 'N',
2948 'Y',
2949 SYSDATE,
2950 1,
2951 SYSDATE,
2952 1);
2953
2954 -- Get the list of pub-items for this tranid
2955 -- This is the list of all publication items uploaded for that tranid
2956 l_pubitems_1 := null;
2957 l_pubitems_2 := null;
2958 counter := 1;
2959 counter2:= 1;
2960 curr_pubitem_length := 0;
2961 l_select_store_sqlstring :=
2962 'SELECT pi_name FROM CSM_HTML5_INQ ci '||
2963 'WHERE user_name = :1 AND ' ||
2964 ' sync_id = :2 AND ' ||
2965 ' pi_name in (select item_id from asg_pub_item) '||
2966 ' AND NOT EXISTS (SELECT 1 FROM asg_users_inqarchive ' ||
2967 ' WHERE device_user_name = ci.user_name AND TRANID =ci.sync_id) '||
2968 ' ORDER BY pi_name';
2969
2970 l_cursor_id1 := DBMS_SQL.OPEN_CURSOR;
2971 DBMS_SQL.PARSE (l_cursor_id1, l_select_store_sqlstring, DBMS_SQL.v7);
2972 DBMS_SQL.DEFINE_COLUMN (l_cursor_id1, 1, l_store, 30);
2973 DBMS_SQL.BIND_VARIABLE(l_cursor_id1, ':1', p_user_name);
2974 DBMS_SQL.BIND_VARIABLE(l_cursor_id1, ':2', p_tranid);
2975 l_cursor_ret1 := DBMS_SQL.EXECUTE (l_cursor_id1);
2976
2977 counter := 1;
2978 WHILE ( DBMS_SQL.FETCH_ROWS(l_cursor_id1) > 0 ) LOOP
2979 DBMS_SQL.COLUMN_VALUE (l_cursor_id1, 1, l_store);
2980 l_pubitems_tbl(counter) := l_store;
2981 counter := counter +1;
2982 END LOOP;
2983
2984 DBMS_SQL.CLOSE_CURSOR(l_cursor_id1);
2985 --12.1
2986 counter := 1;
2987 counter2:= 1;
2988 FOR curr_index2 IN 1..l_pubitems_tbl.count LOOP
2989 curr_pubitem := l_pubitems_tbl(curr_index2);
2990 curr_pubitem_length := curr_pubitem_length + length(curr_pubitem);
2991 IF curr_pubitem_length >= 8000 THEN
2992 EXIT;
2993 END IF;
2994 IF curr_pubitem_length < 4000 THEN
2995 IF counter >1 THEN
2996 l_pubitems_1 := l_pubitems_1 || ',';
2997 curr_pubitem_length := curr_pubitem_length + 1; -- length of ','
2998 END IF;
2999 l_pubitems_1 := l_pubitems_1 || curr_pubitem;
3000 counter := counter +1;
3001 ELSE
3002 IF counter2 >1 THEN
3003 l_pubitems_2 := l_pubitems_2 || ',';
3004 curr_pubitem_length := curr_pubitem_length + 1; -- length of ','
3005 END IF;
3006 l_pubitems_2 := l_pubitems_2 || curr_pubitem;
3007 counter2 := counter2 +1;
3008 END IF;
3009 END LOOP;
3010
3011 -- Replace with call to table-handler for asg_users_inqarchive
3012 INSERT INTO asg_users_inqarchive (device_user_name,
3013 resource_id,
3014 tranid,
3015 sync_date,
3016 processed,
3017 deferred,
3018 pub_items1,
3019 pub_items2,
3020 last_update_date,
3021 last_updated_by,
3022 creation_date,
3023 created_by)
3024 VALUES (p_user_name,
3025 l_resource_id,
3026 p_tranid,
3027 sysdate,
3028 'N',
3029 'N',
3030 l_pubitems_1,
3031 l_pubitems_2,
3032 SYSDATE,
3033 1,
3034 SYSDATE,
3035 1);
3036 END IF;
3037
3038 END setup_inq_info;
3039
3040 -- Procedure to purge all the dirty INQ records for
3041 -- the specified user/transid/publication-item(s)
3042 PROCEDURE purge_pubitems(p_user_name IN VARCHAR2,
3043 p_tranid IN NUMBER,
3044 p_pubitems_tbl IN asg_apply.vc2_tbl_type,
3045 x_return_status OUT NOCOPY VARCHAR2)
3046 IS
3047 num_pubitems PLS_INTEGER;
3048 counter PLS_INTEGER;
3049 curr_pubitem VARCHAR2(30);
3050 inq_tbl_name VARCHAR2(30);
3051 sql_string VARCHAR2(1024);
3052 l_deferred_trans BOOLEAN := FALSE;
3053 l_resource_id NUMBER;
3054
3055 TYPE c_curtype is ref cursor;
3056 c_cur c_curtype;
3057
3058 l_dml VARCHAR2(1);
3059 l_pk VARCHAR2(1000);
3060 l_seq NUMBER;
3061
3062 CURSOR c_resource_id (p_user_name VARCHAR2) IS
3063 SELECT resource_id
3064 FROM asg_user
3065 WHERE user_name = p_user_name;
3066
3067 CURSOR c_pk(b_pi VARCHAR2)
3068 IS --currently only one pk col supported
3069 select primary_key_column from asg_pub_item where item_id=b_pi and instr(primary_key_column,',')=0;
3070
3071 BEGIN
3072 IF ((p_user_name = FND_API.G_MISS_CHAR) OR (p_user_name IS NULL)) OR
3073 ((p_tranid = FND_API.G_MISS_NUM) OR (p_tranid IS NULL)) OR
3074 (p_pubitems_tbl IS NULL) THEN
3075 x_return_status := FND_API.G_RET_STS_ERROR;
3076 return;
3077 END IF;
3078
3079 x_return_status := FND_API.G_RET_STS_SUCCESS;
3080 num_pubitems := p_pubitems_tbl.count;
3081 FOR curr_index in 1..num_pubitems LOOP
3082 curr_pubitem := p_pubitems_tbl(curr_index);
3083 -- Change to <pubitem_name>_inq once that synonym exists
3084
3085 OPEN C_GET_INQ_TABLE(curr_pubitem);
3086 FETCH C_GET_INQ_TABLE INTO inq_tbl_name;
3087 CLOSE C_GET_INQ_TABLE;
3088
3089 CSM_UTIL_PKG.log('Deferring unprocessed records in publication item: ' || curr_pubitem, 'CSM_HTML5_PKG.purge_pubitems',FND_LOG.LEVEL_PROCEDURE);
3090
3091 OPEN c_resource_id(p_user_name);
3092 FETCH c_resource_id INTO l_resource_id;
3093 IF c_resource_id%NOTFOUND THEN
3094 CLOSE c_resource_id;
3095 CSM_UTIL_PKG.log('purge_pubitems: User: ' ||p_user_name||' not found in asg_user table', 'CSM_HTML5_PKG.purge_pubitems',FND_LOG.LEVEL_PROCEDURE);
3096 x_return_status := FND_API.G_RET_STS_ERROR;
3097 return;
3098 END IF;
3099 CLOSE c_resource_id;
3100
3101
3102 l_pk :=NULL;
3103 OPEN c_pk(curr_pubitem);
3104 FETCH c_pk INTO l_pk;
3105 CLOSE c_pk;
3106
3107 IF l_pk IS NOT NULL THEN --this functionality is not there in usual ppc/laptop
3108 OPEN c_cur FOR 'SELECT DMLTYPE$$,SEQNO$$ ,to_char('||l_pk||') FROM '||inq_tbl_name||' a WHERE clid$$cs='''||p_user_name||''' and TRANID$$='||p_tranid
3109 ||'and not exists (SELECT 1 FROM asg_deferred_traninfo WHERE device_user_name = a.clid$$cs AND deferred_tran_id = a.tranid$$ and sequence=a.seqno$$ AND object_name ='''
3110 ||curr_pubitem||''')';
3111 LOOP
3112 FETCH c_cur INTO l_dml,l_seq,l_pk;
3113 EXIT WHEN c_cur%NOTFOUND;
3114 csm_notification_event_pkg.notify_deferred(p_user_name,p_tranid, curr_pubitem,l_seq, l_dml,l_pk,'Row deferred because it was left unprocessed');
3115 END LOOP;
3116 END IF;
3117
3118 -- Defer those records that were not already deferred or deleted during
3119 -- processing by wrapper
3120 sql_string := 'INSERT INTO asg_deferred_traninfo ('||
3121 'DEVICE_USER_NAME, ' ||
3122 'RESOURCE_ID, ' ||
3123 'DEFERRED_TRAN_ID, ' ||
3124 'MOBILE_ERROR_ID, ' ||
3125 'ERROR_DESCRIPTION, ' ||
3126 'OBJECT_NAME, ' ||
3127 'SEQUENCE, ' ||
3128 'STATUS, ' ||
3129 'SYNC_TIME, ' ||
3130 'FAILURES, ' ||
3131 'LAST_UPDATE_DATE, ' ||
3132 'LAST_UPDATED_BY, ' ||
3133 'CREATION_DATE, ' ||
3134 'CREATED_BY) ' ||
3135 'SELECT :1, :2, :3, NULL,''Row deferred because it was left unprocessed'', :4,seqno$$, 1,NULL,1,SYSDATE,1,SYSDATE,1 ' ||
3136 ' FROM '|| inq_tbl_name ||
3137 ' b WHERE b.clid$$cs = :5 AND ' ||
3138 ' tranid$$ = :6 AND ' ||
3139 ' b.seqno$$ not in (SELECT sequence ' ||
3140 'FROM asg_deferred_traninfo ' ||
3141 'WHERE device_user_name = :7 AND ' ||
3142 ' deferred_tran_id = :8 '||
3143 ' AND object_name = :9)';
3144 BEGIN
3145 EXECUTE IMMEDIATE sql_string
3146 USING p_user_name, l_resource_id, p_tranid,
3147 curr_pubitem, p_user_name,
3148 p_tranid, p_user_name, p_tranid, curr_pubitem;
3149
3150 IF SQL%ROWCOUNT >0 THEN
3151 CSM_UTIL_PKG.log('Number of rows deferred as unprocessed: ' || SQL%ROWCOUNT, 'CSM_HTML5_PKG.purge_pubitems',FND_LOG.LEVEL_PROCEDURE);
3152 l_deferred_trans := TRUE;
3153 END IF;
3154 EXCEPTION
3155 WHEN OTHERS THEN
3156 CSM_UTIL_PKG.log('Exception executing the SQL Command ' ||SUBSTR(SQLERRM,1,3000), 'CSM_HTML5_PKG.purge_pubitems',FND_LOG.LEVEL_PROCEDURE);
3157 END;
3158
3159 DELETE FROM CSM_HTML5_INQ WHERE USER_NAME=p_user_name AND SYNC_ID=p_tranid AND PI_NAME=curr_pubitem;
3160
3161 END LOOP;
3162
3163 IF (l_deferred_trans = TRUE) THEN
3164 UPDATE asg_users_inqinfo
3165 SET deferred = 'Y', processed = 'I',
3166 last_update_date = SYSDATE, last_updated_by = 1
3167 WHERE device_user_name = p_user_name AND
3168 tranid = p_tranid;
3169 END IF;
3170
3171 END purge_pubitems;
3172
3173 -- Procedure to purge all the dirty INQ records for
3174 -- the specified user/transid
3175 PROCEDURE purge_pubitems(p_user_name IN VARCHAR2,
3176 p_tranid IN NUMBER,
3177 x_return_status OUT NOCOPY VARCHAR2)
3178 IS
3179 l_pubitems_tbl asg_apply.vc2_tbl_type;
3180 CURSOR l_c IS SELECT PI_NAME FROM CSM_HTML5_INQ WHERE USER_NAME=p_user_name AND SYNC_ID=p_tranid;
3181 BEGIN
3182
3183 IF ((p_user_name = FND_API.G_MISS_CHAR) OR (p_user_name IS NULL)) OR
3184 ((p_tranid = FND_API.G_MISS_NUM) OR (p_tranid IS NULL)) THEN
3185 x_return_status := FND_API.G_RET_STS_ERROR;
3186 return;
3187 END IF;
3188
3189 x_return_status := FND_API.G_RET_STS_SUCCESS;
3190 OPEN l_c;
3191 FETCH l_c BULK COLLECT INTO l_pubitems_tbl;
3192 CLOSE l_c;
3193
3194 -- Found some dirty pub-items for this <p_user_name, p_tranid>
3195 IF (l_pubitems_tbl IS NOT NULL) AND
3196 (l_pubitems_tbl.count > 0) THEN
3197 purge_pubitems(p_user_name, p_tranid, l_pubitems_tbl, x_return_status);
3198 END IF;
3199
3200 -- If no deferred rows, set processed = 'Y'
3201 UPDATE asg_users_inqinfo
3202 SET processed = 'Y', last_update_date=SYSDATE, last_updated_by=1
3203 WHERE device_user_name = p_user_name AND
3204 tranid = p_tranid AND
3205 tranid not IN
3206 (SELECT distinct deferred_tran_id
3207 FROM asg_deferred_traninfo
3208 WHERE device_user_name = p_user_name AND
3209 deferred_tran_id = p_tranid);
3210
3211 END purge_pubitems;
3212
3213 -- Procedure to purge all the dirty INQ records for
3214 -- the specified user
3215 PROCEDURE purge_pubitems(p_user_name IN VARCHAR2,
3216 x_return_status OUT NOCOPY VARCHAR2)
3217 IS
3218
3219 counter PLS_INTEGER;
3220 curr_tranid NUMBER;
3221 l_tranid_tbl asg_apply.num_tbl_type;
3222 cursor c_tranids (p_user_name VARCHAR2, p_max_tranid NUMBER) IS
3223 SELECT tranid FROM asg_users_inqinfo
3224 WHERE device_user_name = p_user_name AND
3225 tranid <= p_max_tranid;
3226 BEGIN
3227 IF ((p_user_name = FND_API.G_MISS_CHAR) OR (p_user_name IS NULL)) THEN
3228 x_return_status := FND_API.G_RET_STS_ERROR;
3229 return;
3230 END IF;
3231
3232 counter :=1;
3233 x_return_status := FND_API.G_RET_STS_SUCCESS;
3234 -- Get all the tranids for this user
3235 FOR cti in c_tranids(p_user_name, g_current_tranid) LOOP
3236 l_tranid_tbl(counter) := cti.tranid;
3237 counter := counter+1;
3238 END LOOP;
3239
3240 -- Process one tranid at a time.
3241 IF counter >1 THEN
3242 FOR curr_index in 1..l_tranid_tbl.count LOOP
3243 curr_tranid := l_tranid_tbl(curr_index);
3244 CSM_UTIL_PKG.log('Purging tranid: ' || curr_tranid, 'CSM_HTML5_PKG.purge_pubitems',FND_LOG.LEVEL_PROCEDURE);
3245 purge_pubitems(p_user_name, curr_tranid, x_return_status);
3246
3247 --Purge xml upload dump tables
3248 DELETE FROM CSM_HTML5_PARSED_DATA a
3249 WHERE A.SESSION_ID=curr_tranid
3250 AND a.status='MOVED_TO_INQ'
3251 AND NOT EXISTS (SELECT 1 FROM asg_deferred_traninfo b
3252 WHERE a.session_id=b.DEFERRED_TRAN_ID
3253 AND a.sequence=b.sequence); --reject record requires the data if deferred
3254 END LOOP;
3255 END IF;
3256
3257 DELETE FROM CSM_HTML5_UPLOAD_DATA b
3258 WHERE SESSION_ID <= g_current_tranid
3259 AND NOT EXISTS(SELECT 1 FROM CSM_HTML5_PARSED_DATA a WHERE a.SESSION_ID=b.SESSION_ID);
3260 END purge_pubitems;
3261
3262 PROCEDURE end_client_apply(p_user_name IN VARCHAR2,
3263 x_return_status OUT NOCOPY VARCHAR2)
3264 IS
3265 curr_tranid NUMBER;
3266 curr_tran_processed VARCHAR2(1);
3267 curr_tran_deferred VARCHAR2(1);
3268 curr_tran_archive VARCHAR2(1);
3269 CURSOR c_archive_asg_users(p_user_name VARCHAR2) IS
3270 SELECT tranid, processed, deferred, archive
3271 FROM asg_users_inqinfo
3272 WHERE device_user_name = p_user_name;
3273 BEGIN
3274
3275 IF ((p_user_name = FND_API.G_MISS_CHAR) OR (p_user_name IS NULL)) THEN
3276 x_return_status := FND_API.G_RET_STS_ERROR;
3277 return;
3278 END IF;
3279
3280 x_return_status := FND_API.G_RET_STS_SUCCESS;
3281
3282 purge_pubitems(p_user_name, x_return_status);
3283
3284 FOR caau in c_archive_asg_users(p_user_name) LOOP
3285 curr_tranid := caau.tranid;
3286 curr_tran_processed := caau.processed;
3287 curr_tran_deferred := caau.deferred;
3288 curr_tran_archive := caau.archive;
3289 IF (curr_tran_processed = 'Y') AND (curr_tran_archive = 'Y') THEN
3290 UPDATE asg_users_inqarchive
3291 SET processed = 'Y', deferred = curr_tran_deferred,
3292 last_update_date = SYSDATE, last_updated_by = 1
3293 WHERE device_user_name = p_user_name AND
3294 tranid = curr_tranid;
3295 END IF;
3296 END LOOP;
3297
3298 DELETE FROM asg_users_inqinfo
3299 WHERE device_user_name = p_user_name AND processed = 'Y';
3300
3301 --COMMIT;
3302
3303 END end_client_apply;
3304
3305 PROCEDURE get_first_tranid(p_user_name IN VARCHAR2,
3306 x_tranid OUT NOCOPY NUMBER,
3307 x_return_status OUT NOCOPY VARCHAR2)
3308 IS
3309 CURSOR c_first_tran (p_user_name VARCHAR2) IS
3310 SELECT min(tranid) tran_id
3311 FROM asg_users_inqinfo a
3312 WHERE a.device_user_name = p_user_name AND
3313 a.deferred='N'
3314 AND a.tranid <=
3315 (SELECT nvl(hwm_tranid,1000000000000)
3316 FROM asg_user
3317 WHERE user_name=a.device_user_name);
3318
3319 BEGIN
3320
3321 x_return_status := FND_API.G_RET_STS_SUCCESS;
3322
3323 OPEN c_first_tran(p_user_name);
3324 FETCH c_first_tran into x_tranid;
3325 IF c_first_tran%NOTFOUND OR x_tranid is NULL THEN
3326 x_return_status := FND_API.G_RET_STS_ERROR;
3327 csm_util_pkg.log('No new tranids', 'CSM_HTML5_PKG.get_first_tranid',FND_LOG.LEVEL_PROCEDURE);
3328 CLOSE c_first_tran;
3329 RETURN;
3330 END IF;
3331 CLOSE c_first_tran;
3332 csm_util_pkg.log('Returning UserName: ' || p_user_name ||' TranID: ' || x_tranid, 'CSM_HTML5_PKG.get_first_tranid',FND_LOG.LEVEL_PROCEDURE);
3333 END get_first_tranid;
3334
3335 -- Will set x_return_status to FND_API.G_RET_STS_ERROR if no tranid exists
3336 -- Returns both dirty and deferred tranids
3337 PROCEDURE get_next_tranid(p_user_name IN VARCHAR2,
3338 p_curr_tranid IN NUMBER,
3339 x_tranid OUT NOCOPY NUMBER,
3340 x_return_status OUT NOCOPY VARCHAR2)
3341 IS
3342 CURSOR c_next_tran (p_user_name VARCHAR2, p_tranid VARCHAR2) IS
3343 SELECT min(tranid) tran_id
3344 FROM asg_users_inqinfo a
3345 WHERE tranid > p_tranid
3346 AND a.device_user_name = p_user_name AND a.deferred='N'
3347 AND a.tranid <= (SELECT nvl(hwm_tranid,1000000000000)
3348 FROM asg_user WHERE user_name=a.device_user_name);
3349
3350 BEGIN
3351
3352 x_return_status := FND_API.G_RET_STS_SUCCESS;
3353
3354 OPEN c_next_tran(p_user_name, p_curr_tranid);
3355 FETCH c_next_tran into x_tranid;
3356 IF c_next_tran%NOTFOUND OR x_tranid IS NULL THEN
3357 -- When the current tranid is the last one, set the next tranid
3358 -- also to the last one.
3359 x_tranid := p_curr_tranid;
3360 x_return_status := FND_API.G_RET_STS_ERROR;
3361 csm_util_pkg.log('No new tranids', 'CSM_HTML5_PKG.get_next_tranid',FND_LOG.LEVEL_PROCEDURE);
3362 CLOSE c_next_tran;
3363 RETURN;
3364 END IF;
3365 CLOSE c_next_tran;
3366
3367 csm_util_pkg.log('Returning UserName: ' || p_user_name ||'\n Current TranID: ' || p_curr_tranid
3368 ||'\n Next TranID: ' || x_tranid, 'CSM_HTML5_PKG.get_next_tranid',FND_LOG.LEVEL_PROCEDURE);
3369
3370 END get_next_tranid;
3371
3372
3373 PROCEDURE process_user(p_user_name IN VARCHAR2,
3374 p_tranid IN NUMBER,
3375 x_return_status OUT NOCOPY VARCHAR2)
3376 IS
3377 l_respid NUMBER;
3378 l_appid NUMBER;
3379 l_userid NUMBER;
3380 l_conc_userid NUMBER;
3381 l_conc_respid NUMBER;
3382 l_conc_appid NUMBER;
3383 BEGIN
3384 x_return_status := FND_API.G_RET_STS_SUCCESS;
3385
3386 -- Get the conc program's user id, respid and appid
3387 l_conc_userid := fnd_global.user_id();
3388 IF l_conc_userid IS NULL or l_conc_userid = -1 THEN
3389 l_conc_userid := 5;
3390 END IF;
3391 l_conc_respid := fnd_global.resp_id();
3392 IF l_conc_respid IS NULL or l_conc_respid = -1 THEN
3393 l_conc_respid := 20420;
3394 END IF;
3395 l_conc_appid := fnd_global.resp_appl_id();
3396 IF l_conc_appid IS NULL or l_conc_appid = -1 THEN
3397 l_conc_appid := 1;
3398 END IF;
3399
3400 SELECT au.user_id,pr.responsibility_id, pr.app_id
3401 INTO l_userid,l_respid,l_appid
3402 FROM asg_user_pub_resps pr ,asg_user au
3403 WHERE pr.user_name = upper(p_user_name)
3404 AND au.user_name=pr.user_name
3405 AND pr.pub_name = upper('SERVICEP') AND ROWNUM=1;
3406
3407
3408 fnd_global.apps_initialize(l_userid, l_respid, l_appid);
3409 BEGIN
3410 CSM_SERVICEP_WRAPPER_PKG.APPLY_HTML5_CHANGES(p_user_name,p_tranid);
3411 EXCEPTION
3412 WHEN OTHERS THEN
3413 CSM_UTIL_PKG.LOG( 'Exception occurred in process_user:'||SUBSTR(SQLERRM,1,3000), 'CSM_HTML5_PKG.process_user',FND_LOG.LEVEL_EXCEPTION);
3414 fnd_global.apps_initialize(l_conc_userid, l_conc_respid, l_conc_appid);
3415 --x_return_status := FND_API.G_RET_STS_ERROR; --in asg_apply returns as SUCCESS always
3416 END;
3417 END process_user;
3418
3419 PROCEDURE process_upload(curr_user IN VARCHAR2)
3420 IS
3421 curr_tranid NUMBER;
3422 next_tranid NUMBER;
3423 l_return_status VARCHAR2(1);
3424 BEGIN
3425 csm_util_pkg.log('Processing upload for user: '|| curr_user, 'CSM_HTML5_PKG.process_upload',FND_LOG.LEVEL_PROCEDURE);
3426 get_first_tranid(p_user_name => curr_user,x_tranid => curr_tranid,x_return_status => l_return_status);
3427 g_current_tranid:=curr_tranid;
3428 WHILE l_return_status = FND_API.G_RET_STS_SUCCESS LOOP
3429 csm_util_pkg.log('Processing tranid: ' || curr_tranid, 'CSM_HTML5_PKG.process_upload',FND_LOG.LEVEL_PROCEDURE);
3430 process_user(p_user_name => curr_user,p_tranid => curr_tranid, x_return_status => l_return_status);
3431 IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
3432 -- Make the call to get the next tranid
3433 -- This means if upload processing for one transaction failed
3434 -- upload processing for the rest of the transactions is stopped.
3435 get_next_tranid(p_user_name => curr_user,p_curr_tranid => curr_tranid,x_tranid => next_tranid,x_return_status => l_return_status);
3436
3437 curr_tranid := next_tranid;
3438 g_current_tranid:=curr_tranid; --used by purge pub items in end client apply
3439 END IF;
3440 END LOOP;
3441
3442 end_client_apply(p_user_name => curr_user, x_return_status => l_return_status);
3443
3444 csm_util_pkg.log('Return status from end_client_apply: ' ||l_return_status, 'CSM_HTML5_PKG.process_upload',FND_LOG.LEVEL_PROCEDURE);
3445
3446 END process_upload;
3447
3448
3449 PROCEDURE get_all_pub_items(p_user_name IN VARCHAR2,
3450 p_tranid IN NUMBER,
3451 x_pubitems_tbl OUT NOCOPY asg_apply.vc2_tbl_type,
3452 x_return_status OUT NOCOPY VARCHAR2)
3453 IS
3454 counter PLS_INTEGER;
3455 CURSOR l_cursor1 IS
3456 SELECT PI_NAME
3457 FROM CSM_HTML5_INQ a,ASG_PUB_ITEM b
3458 WHERE a.PI_NAME=b.ITEM_ID
3459 AND a.user_name=p_user_name
3460 AND a.SYNC_ID=p_tranid
3461 ORDER BY nvl(b.table_weight,0);
3462
3463 l_dummy boolean:=false;
3464 l_n NUMBER;
3465 BEGIN
3466
3467 x_return_status := FND_API.G_RET_STS_SUCCESS;
3468
3469 OPEN l_cursor1;
3470 FETCH l_cursor1 BULK COLLECT INTO x_pubitems_tbl;
3471 CLOSE l_cursor1;
3472
3473 l_n:=x_pubitems_tbl.count;
3474 IF l_n >0 THEN l_dummy:=true; END IF;
3475
3476 FOR REC IN (SELECT object_name
3477 FROM asg_deferred_traninfo a,asg_pub_item b
3478 WHERE device_user_name = p_user_name
3479 AND deferred_tran_id = p_tranid
3480 AND b.item_id=a.object_name
3481 AND NOT EXISTS(SELECT 1 FROM CSM_HTML5_INQ
3482 WHERE PI_NAME= object_name
3483 AND USER_NAME=device_user_name
3484 AND SYNC_ID=deferred_tran_id)
3485 ORDER BY nvl(b.table_weight,0))
3486 LOOP
3487 l_n:=l_n+1;
3488 x_pubitems_tbl(l_n):=rec.OBJECT_NAME;
3489 END LOOP;
3490
3491 IF(l_n=x_pubitems_tbl.COUNT) THEN l_dummy:=false; END IF;
3492
3493 IF l_dummy THEN
3494 asg_apply.sort_by_weight('SERVICEP', x_pubitems_tbl);
3495 END IF;
3496
3497 END get_all_pub_items;
3498
3499
3500 PROCEDURE reapply_transaction(p_user_name IN VARCHAR2,
3501 p_tranid IN NUMBER,
3502 x_return_status OUT NOCOPY VARCHAR2,
3503 p_commit_flag IN BOOLEAN)
3504 IS
3505
3506 l_def_trans VARCHAR2(1);
3507 l_def_count NUMBER;
3508 l_user_id NUMBER;
3509 l_resp_id NUMBER;
3510 l_app_id NUMBER;
3511 l_orig_user_id NUMBER;
3512 l_orig_resp_id NUMBER;
3513 l_orig_app_id NUMBER;
3514
3515 CURSOR c_deferred_processed (p_user_name VARCHAR2, p_tranid NUMBER) IS
3516 SELECT count(*) count
3517 FROM asg_deferred_traninfo
3518 WHERE device_user_name = p_user_name AND
3519 deferred_tran_id = p_tranid AND
3520 status <> 0;
3521 BEGIN
3522
3523 CSM_UTIL_PKG.LOG( 'Reapply started for user:'||p_user_name ||' tranid:'||p_tranid, 'CSM_HTML5_PKG.reapply_transaction',FND_LOG.LEVEL_PROCEDURE);
3524 -- Check if this transaction is deferred
3525 l_def_trans := asg_defer.is_deferred(p_user_name, p_tranid);
3526 IF l_def_trans = FND_API.G_FALSE THEN
3527 CSM_UTIL_PKG.LOG( 'Leaving since tranid is not deferred', 'CSM_HTML5_PKG.reapply_transaction',FND_LOG.LEVEL_PROCEDURE);
3528 x_return_status := FND_API.G_RET_STS_ERROR;
3529 return;
3530 END IF;
3531
3532 x_return_status := FND_API.G_RET_STS_SUCCESS;
3533
3534 BEGIN
3535 l_orig_user_id := fnd_global.user_id();
3536 l_orig_resp_id := fnd_global.resp_id();
3537 l_orig_app_id := fnd_global.resp_appl_id();
3538
3539 SELECT au.user_id,pr.responsibility_id, pr.app_id
3540 INTO l_user_id,l_resp_id,l_app_id
3541 FROM asg_user_pub_resps pr ,asg_user au
3542 WHERE pr.user_name = upper(p_user_name)
3543 AND au.user_name=pr.user_name
3544 AND pr.pub_name = upper('SERVICEP') AND ROWNUM=1;
3545
3546 fnd_global.apps_initialize(l_user_id, l_resp_id, l_app_id);
3547 CSM_SERVICEP_WRAPPER_PKG.APPLY_HTML5_CHANGES(p_user_name,p_tranid);
3548 fnd_global.apps_initialize(l_orig_user_id, l_orig_resp_id,l_orig_app_id);
3549 EXCEPTION
3550 WHEN OTHERS THEN
3551 CSM_UTIL_PKG.LOG( 'Exception occurred in reapply_transaction:'||SUBSTR(SQLERRM,1,3000), 'CSM_HTML5_PKG.reapply_transaction',FND_LOG.LEVEL_EXCEPTION);
3552 x_return_status := FND_API.G_RET_STS_SUCCESS;
3553 fnd_global.apps_initialize(l_orig_user_id, l_orig_resp_id,l_orig_app_id);
3554 return;
3555 END;
3556
3557 OPEN c_deferred_processed(p_user_name, p_tranid);
3558 FETCH c_deferred_processed INTO l_def_count;
3559 CLOSE c_deferred_processed;
3560 -- All the deferred records are processed
3561 IF l_def_count = 0 THEN
3562 UPDATE asg_users_inqinfo
3563 SET deferred = 'S'
3564 WHERE device_user_name = p_user_name AND
3565 tranid = p_tranid;
3566 END IF;
3567
3568 IF p_commit_flag THEN
3569 COMMIT;
3570 END IF;
3571
3572 CSM_UTIL_PKG.LOG( 'Reapply Completed', 'CSM_HTML5_PKG.reapply_transaction',FND_LOG.LEVEL_PROCEDURE);
3573 END reapply_transaction;
3574
3575 PROCEDURE CONC_PROCESS_UPLOAD(errbuf OUT NOCOPY VARCHAR2,RETCODE OUT NOCOPY VARCHAR2)
3576 IS
3577 l_uname VARCHAR2(500):=NULL;
3578 l_list VARCHAR2(4000):=NULL;
3579 BEGIN
3580 FOR rec IN (select a.session_id,c.user_name from csm_html5_upload_data a,asg_user b, csm_html5_sync_info c
3581 where a.status<>'PARSED' and a.session_id=c.session_id
3582 and nvl(fnd_profile.value_specific('ASG_SYNCHRONOUS_UPLOAD',b.user_id,b.responsibility_id,b.app_id),'N')='N'
3583 and b.user_name=c.user_name and b.multi_platform='Y' and b.enabled='Y' ORDER BY c.USER_NAME,a.SESSION_ID ASC)
3584 LOOP
3585 IF(l_uname IS NULL OR l_uname<>rec.USER_NAME) THEN
3586 CSM_HTML5_PKG.HTML5_PARSE_XML(rec.SESSION_ID,RETCODE,errbuf);
3587 IF RETCODE=FND_API.G_RET_STS_ERROR THEN
3588 CSM_UTIL_PKG.LOG( 'Exception while parsing upload data in tran_id:'||rec.session_id||' for user:'||rec.USER_NAME||' with error:'||substr(errbuf,1,1000), 'CSM_HTML5_PKG.CONC_PROCESS_UPLOAD',FND_LOG.LEVEL_EXCEPTION);
3589
3590 UPDATE CSM_HTML5_UPLOAD_DATA
3591 SET LAST_UPDATE_DATE = SYSDATE,
3592 LAST_UPDATED_BY = 1,
3593 STATUS = 'PARSE_ERROR',
3594 COMMENTS = errbuf
3595 WHERE SESSION_ID = rec.SESSION_ID;
3596
3597 l_uname:= rec.USER_NAME;
3598 IF l_list IS NULL THEN l_list:=l_uname;
3599 else l_list:=substr(l_list||','||l_uname,0,3500);
3600 END IF;
3601 END IF;
3602 END IF;
3603 END LOOP;
3604
3605 FOR rec IN (SELECT DISTINCT USER_NAME FROM CSM_HTML5_INQ)
3606 LOOP
3607 CSM_HTML5_PKG.process_upload(rec.USER_NAME);
3608 END LOOP;
3609
3610 IF l_uname is null THEN
3611 retcode := FND_API.G_RET_STS_SUCCESS;
3612 errbuf:='Success';
3613 ELSE
3614 retcode := FND_API.G_RET_STS_UNEXP_ERROR;
3615 errbuf:='Issue with parsing xml data of users:'||l_list;
3616 END IF;
3617 END CONC_PROCESS_UPLOAD;
3618
3619 FUNCTION isSSOEnabled RETURN VARCHAR2
3620 IS
3621 BEGIN
3622 IF instr(NVL(fnd_profile.value('APPS_SSO'),'NULL'),'SSO')>0 THEN RETURN 'Y'; END IF;
3623 RETURN 'N';
3624 END isSSOEnabled;
3625
3626 PROCEDURE setForceLocalLogin(p_user_name IN VARCHAR2,p_v IN VARCHAR2)
3627 IS
3628 BEGIN
3629 CSM_UTIL_PKG.LOG('Local Login set to :'||p_v||' for user:'||p_user_name, 'CSM_HTML5_PKG.setForceLocalLogin', FND_LOG.LEVEL_PROCEDURE);
3630 IF p_v<>'Y' THEN
3631 DELETE FROM csm_html5_clients_info WHERE PRF_NAME='FORCE_LOCAL_LOGIN' AND USER_NAME=p_user_name;
3632 ELSE
3633 set_user_profile(p_user_name,'FORCE_LOCAL_LOGIN','Y');
3634 END IF;
3635
3636 END setForceLocalLogin;
3637
3638 FUNCTION isOIDAuth(p_user_name IN VARCHAR2) RETURN BOOLEAN
3639 IS
3640 l_user_id NUMBER;
3641 l_resp_id NUMBER;
3642 l_app_id NUMBER;
3643 l_local VARCHAR2(1):='N';
3644 BEGIN
3645
3646 --note: other ajax queries might also set force login to Y. stopForceLogin from client only can set it back to N
3647 --add if block with profile later to turn this feature off completely
3648 BEGIN
3649 SELECT PRF_VALUE INTO l_local
3650 FROM CSM_HTML5_CLIENTS_INFO
3651 WHERE USER_NAME=p_user_name
3652 AND PRF_NAME='FORCE_LOCAL_LOGIN'
3653 AND PRF_VALUE='Y';
3654
3655 RETURN FALSE;
3656 EXCEPTION
3657 WHEN OTHERS THEN
3658 NULL;
3659 END;
3660
3661
3662
3663 SELECT user_id,responsibility_id, app_id
3664 INTO l_user_id,l_resp_id,l_app_id
3665 FROM asg_user WHERE user_name=p_user_name;
3666
3667 IF (instr(NVL(fnd_profile.value('APPS_SSO'),'NULL'),'SSO')>0)
3668 AND (NVL(fnd_profile.value_specific('APPS_SSO_LOCAL_LOGIN',l_user_id,l_resp_id,l_app_id),'BOTH')<>'LOCAL') THEN
3669 RETURN TRUE;
3670 END IF;
3671
3672 RETURN FALSE;
3673 EXCEPTION
3674 WHEN OTHERS THEN
3675 RETURN FALSE;
3676 END isOIDAuth;
3677
3678 procedure delete_user_vault(p_user_id IN NUMBER)
3679 is
3680 begin
3681 set_context('CSM5_VAULT_NS', 'VAULT', 'Y');
3682 fnd_vault.del('CSM','RSA_KEY_'||p_user_id);
3683 set_context('CSM5_VAULT_NS', 'VAULT', 'N');
3684 exception
3685 when others then
3686 CSM_UTIL_PKG.LOG('Exception:'||' for user_id:'||p_user_id||' with msg:'||substr(sqlerrm,1,2000), 'CSM_HTML5_PKG.delete_user_vault', FND_LOG.LEVEL_PROCEDURE);
3687 end delete_user_vault;
3688
3689 PROCEDURE DROP_USER(p_user_id IN NUMBER)
3690 IS BEGIN
3691 DELETE FROM csm_html5_clients_info WHERE USER_NAME=(SELECT USER_NAME
3692 FROM ASG_USER WHERE USER_ID=p_user_id) AND PRF_NAME NOT IN ('REVISION','FORCE_UPDATE'); --if any user has name as APPLICATION
3693
3694 DELETE FROM CSM_HTML5_CACHE WHERE USER_NAME=(SELECT USER_NAME
3695 FROM ASG_USER WHERE USER_ID=p_user_id);
3696
3697 CSM_HTML5_PKG.DELETE_USER_VAULT(p_user_id);
3698 END DROP_USER;
3699
3700 FUNCTION IS_FIRST_SYNC(p_user_name IN VARCHAR2) RETURN BOOLEAN
3701 IS
3702 l_t NUMBER;
3703 BEGIN
3704 SELECT 1 INTO l_t
3705 FROM asg_purge_sdq
3706 WHERE user_name = p_user_name
3707 AND pub_name = 'SERVICEP'
3708 AND TRANSACTION_ID IS NULL;
3709 RETURN TRUE;
3710 EXCEPTION
3711 WHEN OTHERS THEN
3712 RETURN FALSE;
3713 END IS_FIRST_SYNC;
3714
3715 FUNCTION get_app_upg_info(p_user_name IN VARCHAR2) RETURN VARCHAR2
3716 IS
3717 l_store VARCHAR2(4000);
3718 BEGIN
3719 SELECT (SELECT NVL(MAX(PRF_VALUE),'N') FROM CSM_HTML5_CLIENTS_INFO WHERE USER_NAME='APPLICATION' AND PRF_NAME='FORCE_UPDATE')
3720 ||';'|| fnd_profile.value_specific('CSM_MULTI_APP_STORE_URL',USER_ID,RESPONSIBILITY_ID)
3721 INTO l_store
3722 FROM ASG_USER WHERE USER_NAME=p_user_name;
3723
3724 RETURN l_store;
3725 END get_app_upg_info;
3726
3727 end CSM_HTML5_PKG;