1 Package Body IBY_UTILITY_PVT AS
2 /* $Header: ibyvutlb.pls 120.44.12020000.3 2012/11/16 08:53:19 gmamidip ship $ */
3
4
5 -- Added for encoding/decoding in Base64.
6 TYPE vc2_table IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
7
8 TYPE t_psr_record_type IS RECORD(
9 psr_status VARCHAR2(30),
10 payment_status_flag VARCHAR2(1)
11 );
12
13 TYPE psr_table_type IS TABLE OF t_psr_record_type INDEX BY BINARY_INTEGER;
14
15 g_psr_table psr_table_type;
16
17 TYPE t_psr_snapshot_record_type IS RECORD(
18 psr_snapshot_count NUMBER
19 );
20
21 TYPE psr_snapshot_table_type IS TABLE OF t_psr_snapshot_record_type INDEX BY varchar2(30);
22
23 g_psr_snapshot_table psr_snapshot_table_type;
24
25 TYPE t_instr_access_record_type IS RECORD(
26 instruction_id Number,
27 access_flag VARCHAR2(1)
28 );
29
30 TYPE instr_access_table_type IS TABLE OF t_instr_access_record_type INDEX BY BINARY_INTEGER;
31
32 g_instr_access_table instr_access_table_type;
33
34 map vc2_table;
35
36 --
37 -- UTILITY PROCEDURE #1: INIT_MAP
38 -- This procedure maps the numbers from 0 through 63 to character literals
39 -- for Base64 encoding. Initializes the Base64 mapping.
40 --
41 PROCEDURE init_map IS
42 BEGIN
43 -- do not initialize it more than once
44 IF (map.count > 0) THEN
45 RETURN;
46 END IF;
47
48 map(0) :='A'; map(1) :='B'; map(2) :='C'; map(3) :='D'; map(4) :='E';
49 map(5) :='F'; map(6) :='G'; map(7) :='H'; map(8) :='I'; map(9):='J';
50 map(10):='K'; map(11):='L'; map(12):='M'; map(13):='N'; map(14):='O';
51 map(15):='P'; map(16):='Q'; map(17):='R'; map(18):='S'; map(19):='T';
52 map(20):='U'; map(21):='V'; map(22):='W'; map(23):='X'; map(24):='Y';
53 map(25):='Z'; map(26):='a'; map(27):='b'; map(28):='c'; map(29):='d';
54 map(30):='e'; map(31):='f'; map(32):='g'; map(33):='h'; map(34):='i';
55 map(35):='j'; map(36):='k'; map(37):='l'; map(38):='m'; map(39):='n';
56 map(40):='o'; map(41):='p'; map(42):='q'; map(43):='r'; map(44):='s';
57 map(45):='t'; map(46):='u'; map(47):='v'; map(48):='w'; map(49):='x';
58 map(50):='y'; map(51):='z'; map(52):='0'; map(53):='1'; map(54):='2';
59 map(55):='3'; map(56):='4'; map(57):='5'; map(58):='6'; map(59):='7';
60 map(60):='8'; map(61):='9'; map(62):='+'; map(63):='/';
61 END init_map;
62
63
64 --
65 -- UTILITY FUNCTION#1: GET_MAP
66 -- This function returns the Base64 number equivalent for a character
67 -- literal passed. It returns values 0 through 63 for all the values that
68 -- are mapped. When it does not find the character in the table it returns
69 -- the value 64.
70 --
71 FUNCTION get_map( t IN VARCHAR2 ) RETURN NUMBER IS
72 temp NUMBER;
73 BEGIN
74 temp := 0;
75 WHILE temp < 64 LOOP
76 EXIT WHEN ( map(temp) = t );
77 temp := temp + 1;
78 END LOOP;
79 RETURN temp;
80 END get_map;
81
82 FUNCTION to_num( p_str IN VARCHAR2 ) RETURN NUMBER
83 IS
84 BEGIN
85 RETURN to_number( p_str );
86 EXCEPTION
87 WHEN OTHERS THEN
88 RETURN null;
89 END to_num;
90
91 FUNCTION isNumeric (p_input IN VARCHAR2) RETURN VARCHAR2
92 IS
93 l_number NUMBER;
94 BEGIN
95 l_number := p_input;
96 RETURN 'Y';
97 EXCEPTION
98 WHEN OTHERS THEN
99 RETURN 'N';
100 END isNumeric;
101
102 PROCEDURE handle_exceptions
103 (
104 p_api_name IN VARCHAR2,
105 p_pkg_name IN VARCHAR2,
106 p_rollback_point IN VARCHAR2,
107 p_exception_type IN VARCHAR2,
108 x_msg_count OUT NOCOPY NUMBER,
109 x_msg_data OUT NOCOPY VARCHAR2,
110 x_return_status OUT NOCOPY VARCHAR2
111 )
112 IS
113 l_api_name VARCHAR2(30);
114 l_ora_err_code NUMBER;
115 -- the maximum length of Oracle error msg is 512
116 -- make it longer for future enh
117 l_ora_err_msg VARCHAR2(2000);
118 l_error_reason VARCHAR2(80);
119 BEGIN
120
121 iby_debug_pub.add('entered IBY_UTILITY_PVT.handle_exceptions()');
122
123 l_api_name := UPPER(p_api_name);
124
125 -- rollback to the savepoint
126 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(p_rollback_point);
127
128 IF p_exception_type = iby_utility_pvt.g_expt_err
129 THEN
130 x_return_status := FND_API.G_RET_STS_ERROR;
131 l_error_reason := 'FND_API.G_RET_STS_ERROR';
132 ELSIF p_exception_type = iby_utility_pvt.g_expt_unexp_err
133 THEN
134 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
135 l_error_reason := 'FND_API.G_RET_STS_UNEXP_ERROR';
136 ELSIF p_exception_type = iby_utility_pvt.g_expt_otr_err
137 THEN
138 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
139 l_error_reason := 'G_EXC_OTHERS';
140
141 l_ora_err_code := SQLCODE;
142 l_ora_err_msg := SQLERRM;
143
144 iby_debug_pub.add('Oracle error in ' || p_pkg_name || '.' || p_api_name || ', code: '|| l_ora_err_code);
145 iby_debug_pub.add('Oracle error in ' || p_pkg_name || '.' || p_api_name || ', msg : '|| l_ora_err_msg);
146 --dbms_output.put_line('Oracle error, code: '|| l_ora_err_code);
147 --dbms_output.put_line('Oracle error, msg : '|| l_ora_err_msg);
148
149 fnd_message.set_name('IBY', 'IBY_G_SQL_ERR');
150 fnd_message.set_token('API', p_pkg_name || '.' || p_api_name);
151 fnd_message.set_token('SQLCODE', l_ora_err_code);
152 fnd_message.set_token('SQLERRM', l_ora_err_msg);
153 FND_MSG_PUB.ADD;
154
155 END IF;
156
157 FND_MSG_PUB.Count_And_Get(
158 p_count => x_msg_count,
159 p_data => x_msg_data);
160
161 iby_debug_pub.add('x_msg_count: ' || x_msg_count);
162 iby_debug_pub.add('x_msg_data: ' || x_msg_data);
163 iby_debug_pub.add('x_return_status: ' || x_return_status);
164
165 -- finally add the exception msg to debug log
166 /*
167 iby_debug_pub.add_return_messages(
168 p_count => x_msg_count,
169 p_data => x_msg_data,
170 p_reason => l_error_reason
171 );
172 */
173
174 END Handle_Exceptions;
175
176 PROCEDURE handleException
177 (
178 p_err_msg IN VARCHAR2,
179 p_err_code IN VARCHAR2
180 )
181 IS
182 l_ibycode_start NUMBER;
183 l_ibycode_end NUMBER;
184 l_index NUMBER;
185 l_msg_len NUMBER;
186 l_val_concat NUMBER;
187 l_tok_concat NUMBER;
188
189 l_err_code VARCHAR2(200);
190 l_token_name VARCHAR2(200);
191 l_token_val VARCHAR2(200);
192 BEGIN
193 l_msg_len := LENGTH(p_err_msg);
194 --
195 -- check if 'IBY_' is present in the error message; if so
196 -- then the exception was internally generated
197 --
198 l_ibycode_start := INSTR(p_err_msg,iby_utility_pvt.C_ERRCODE_PREFIX);
199
200 IF (l_ibycode_start > 0) THEN
201
202 l_ibycode_end:=INSTR(p_err_msg,iby_utility_pvt.C_TOKEN_CONCATENATOR)-1;
203 IF (l_ibycode_end < 1) THEN
204 l_ibycode_end := l_msg_len;
205 END IF;
206 l_err_code := SUBSTR(p_err_msg,l_ibycode_start,l_ibycode_end-l_ibycode_start+1);
207 FND_MESSAGE.SET_NAME('IBY',l_err_code);
208
209 -- +1 to go the position of the token concatenator; +1 again to
210 -- to go past it to the beginning of the token name
211 --
212 l_index:= l_ibycode_end+1+1;
213 WHILE l_index < l_msg_len LOOP
214 l_val_concat := INSTR(p_err_msg,iby_utility_pvt.C_TOKEN_VAL_CONCATENATOR,l_index);
215 IF (l_val_concat < 1) THEN
216 EXIT;
217 END IF;
218 l_tok_concat := INSTR(p_err_msg,iby_utility_pvt.C_TOKEN_CONCATENATOR,l_index);
219 IF (l_tok_concat < 1) THEN
220 -- the error message is usually of the form:
221 --
222 -- ORA-2000: IBY_XXXX#TOKENNAME=TOKENVAL#...<new line>
223 -- ORA-06512 ...
224 --
225 -- we wish to ignore the text after the
226 -- last token on the first line
227 --
228
229 -- note the -1 is for the newline character after the last
230 -- token value
231 --
232 l_tok_concat := INSTR(p_err_msg,'ORA',l_index)-1;
233 IF (l_tok_concat < 1) THEN
234 -- +1 so that the last character of the token value is
235 -- included
236 l_tok_concat := l_msg_len +1;
237 END IF;
238 END IF;
239
240 l_token_name := SUBSTR(p_err_msg,l_index,(l_val_concat-1)-l_index+1);
241 l_token_val := SUBSTR(p_err_msg,l_val_concat+1,(l_tok_concat-1)-(l_val_concat+1)+1);
242 FND_MESSAGE.SET_TOKEN(l_token_name,l_token_val);
243 --
244 -- go +1 character past the token concatenator
245 --
246 l_index := l_tok_concat + 1;
247 END LOOP;
248 FND_MSG_PUB.ADD;
249 --
250 -- no IBY message found; simply put the exact text of
251 -- the exception into the FND_MSG stack
252 --
253 ELSE
254 FND_MESSAGE.SET_NAME('IBY', 'IBY_9999');
255 FND_MESSAGE.SET_TOKEN('MESSAGE_TEXT',p_err_msg);
256 FND_MSG_PUB.ADD;
257 END IF;
258 END handleException;
259
260
261 PROCEDURE get_property
262 (
263 p_name IN VARCHAR2,
264 x_val OUT NOCOPY VARCHAR2
265 )
266 IS
267 BEGIN
268 FND_PROFILE.get(p_name,x_val);
269 END get_property;
270
271
272 PROCEDURE set_property
273 (
274 p_name IN VARCHAR2,
275 p_val IN VARCHAR2
276 )
277 IS
278 l_rtn_sts BOOLEAN;
279 BEGIN
280
281 l_rtn_sts := FND_PROFILE.save(p_name,p_val,'SITE');
282 --
283 -- 2nd put is so that the value is visible in the
284 -- current session
285 --
286 FND_PROFILE.put(p_name,p_val);
287 COMMIT;
288
289 END set_property;
290
291
292
293 --
294 -- Name: get_jtf_property
295 -- Args: p_name => property name
296 -- Outs: x_val => property value
297 --
298 -- Notes: gets an IBY property from old JTF Property manager tables.
299 -- only the first element of the value list is returned.
300 -- this function is used by ibyprupg.sql
301 --
302 FUNCTION get_jtf_property(p_name IN VARCHAR2)
303 RETURN VARCHAR2 IS
304
305 p_api_version_number NUMBER := 1.0;
306 p_init_msg_list VARCHAR2(2000) := FND_API.G_FALSE;
307 p_application_id NUMBER := 673;
308 p_profile_id NUMBER;
309 p_profile_name VARCHAR2(2000) := 'JTF_PROPERTY_MANAGER_DEFAULT_1';
310 p_perz_data_id NUMBER;
311 p_perz_data_type VARCHAR2(2000) := 'JTF';
312
313 x_return_status VARCHAR2(2000);
314 x_msg_count NUMBER := 0;
315 x_msg_data VARCHAR2(2000);
316 x_perz_data_id NUMBER;
317 x_perz_data_name VARCHAR2(2000);
318 x_perz_data_type VARCHAR2(2000);
319 x_perz_data_desc VARCHAR2(2000);
320 x_data_attrib_tbl JTF_PERZ_DATA_PUB.DATA_ATTRIB_TBL_TYPE;
321
322 p_temp_var VARCHAR2(2);
323 x_val VARCHAR2(2000);
324
325 BEGIN
326
327 JTF_PERZ_DATA_PUB.GET_PERZ_DATA( p_api_version_number,
328 p_init_msg_list,
329 p_application_id,
330 p_profile_id,
331 p_profile_name,
332 p_perz_data_id,
333 p_name,
334 p_perz_data_type,
335 x_perz_data_id,
336 x_perz_data_name,
337 x_perz_data_type,
338 x_perz_data_desc,
339 x_data_attrib_tbl,
340 x_return_status,
341 x_msg_count,
342 x_msg_data
343 );
344
345 IF ((x_return_status IS NULL OR
346 x_return_status <> FND_API.G_RET_STS_SUCCESS) OR
347 (x_data_attrib_tbl.count<1)) THEN
348 x_val := NULL;
349 ELSE
350 x_val := x_data_attrib_tbl(1).attribute_value;
351 END IF;
352
353 return x_val;
354
355 END get_jtf_property;
356
357
358 --
359 --
360 FUNCTION encode64(s IN VARCHAR2) RETURN VARCHAR2 IS
361 r RAW(32767);
362 i pls_integer;
363 x pls_integer;
364 y pls_integer;
365 v VARCHAR2(32767);
366 BEGIN
367
368 init_map;
369 r := UTL_RAW.CAST_TO_RAW( s );
370
371 -- For every 3 bytes, split them into 4 6-bit units and map them to
372 -- the Base64 characters
373 i := 1;
374 WHILE ( i + 2 <= utl_raw.length(r) ) LOOP
375 x := to_number(utl_raw.substr(r, i, 1), '0X') * 65536 +
376 to_number(utl_raw.substr(r, i + 1, 1), '0X') * 256 +
377 to_number(utl_raw.substr(r, i + 2, 1), '0X');
378 y := floor(x / 262144); v := v || map(y); x := x - y * 262144;
379 y := floor(x / 4096); v := v || map(y); x := x - y * 4096;
380 y := floor(x / 64); v := v || map(y); x := x - y * 64;
381 v := v || map(x);
382 i := i + 3;
383 END LOOP;
384
385 -- Process the remaining bytes that has fewer than 3 bytes.
386 --when last two bytes are '='
387 IF ( utl_raw.length(r) - i = 0) THEN
388 x := to_number(utl_raw.substr(r, i, 1), '0X');
389 y := floor(x / 4); v := v || map(y); x := x - y * 4;
390 x := x * 16; v := v || map(x);
391 v := v || '==';
392 --when last one byte is '='
393 ELSIF ( utl_raw.length(r) - i = 1) THEN
394 x := to_number(utl_raw.substr(r, i, 1), '0X') * 256 +
395 to_number(utl_raw.substr(r, i + 1, 1), '0X');
396 y := floor(x / 1024); v := v || map(y); x := x - y * 1024;
397 y := floor(x / 16); v := v || map(y); x := x - y * 16;
398 x := x * 4; v := v || map(x);
399 v := v || '=';
400 END IF;
401
402 RETURN v;
403
404 END encode64;
405
406 --
407 --
408 FUNCTION decode64(s IN VARCHAR2) RETURN VARCHAR2 IS
409 i pls_integer;
410 x pls_integer;
411 y pls_integer;
412 iTh pls_integer;
413 iPlusOne pls_integer;
414 iPlusTwo pls_integer;
415 iPlusThree pls_integer;
416 v VARCHAR2(32767);
417 BEGIN
418 init_map;
419 i := 1;
420 v := '';
421 --Processing 4 bytes at a time. For every 4 bytes, convert them into 3 bytes.
422 WHILE ( i + 3 <= LENGTH(s) ) LOOP
423 iTh := get_map( SUBSTR( s, i, 1) );
424 iPlusOne := get_map( SUBSTR( s, i + 1, 1) );
425 iPlusTwo := get_map( SUBSTR( s, i + 2, 1) );
426 iPlusThree := get_map( SUBSTR( s, i + 3, 1) );
427
428 --when the last two bytes equal '='
429 IF( iPlusTwo = 64 ) THEN
430 x := iTh * 64 + iPlusOne;
431 x := floor(x/16);
432 v := v || fnd_global.local_chr( x );
433
434 --when the last byte equals '='
435 ELSIF( iPlusThree = 64 ) THEN
436 x := iTh * 4096 + iPlusOne * 64 + iPlusTwo;
437 y := floor(x/1024);
438 v := v || fnd_global.local_chr( y );
439 x := x - y * 1024;
440 x := floor(x/4);
441 v := v || fnd_global.local_chr( x );
442
443 --when all the bytes hold values to be converted.
444 ELSE
445 x := iTh * 262144 + iPlusOne * 4096 + iPlusTwo * 64 + iPlusThree;
446 y := floor(x/65536);
447 v := v || fnd_global.local_chr( y );
448 x := x - y * 65536;
449 y := floor(x/256);
450 v := v || fnd_global.local_chr( y );
451 x := x - y * 256;
452 v := v || fnd_global.local_chr( x );
453 END IF;
454 i := i + 4;
455 END LOOP;
456
457 RETURN v;
458
459 END decode64;
460
461 --
462 --
463 FUNCTION get_local_nls
464 RETURN VARCHAR2
465 IS
466 BEGIN
467
468 return userenv('LANGUAGE');
469
470 EXCEPTION WHEN others THEN
471 return NULL;
472 END get_local_nls;
473
474 --
475 --
476 FUNCTION get_nls_charset( p_nls VARCHAR2 )
477 RETURN VARCHAR2
478 IS
479 l_charset_index INTEGER;
480
481 -- charset value seperator in NLSLang parameters
482 --
483 c_charset_seperator CONSTANT VARCHAR2(1) := '.';
484 BEGIN
485
486 IF (p_nls IS NULL) THEN
487 return null;
488 END IF;
489
490 l_charset_index := INSTR(p_nls,c_charset_seperator);
491
492 IF ( l_charset_index > 0 ) THEN
493 return SUBSTR(p_nls,l_charset_index+1);
494 ELSE
495 return NULL;
496 END IF;
497
498 END get_nls_charset;
499
500
501 /* ========================================================================
502 -- Function Name: MAKE_ASCII
503 --
504 -- Purpose: Function to convert a string with possibly
505 -- non-ASCII characters to ASCII. Internally, this
506 -- function calls the SQL CONVERT function.
507 --
508 -- The usage of this function will be to
509 -- substitute certain 8-bit chars in European
510 -- languages by their closest ASCII (7-bit)
511 -- equivalent.
512 --
513 -- Example:
514 -- {a with various accent marks} -> a
515 -- {e with various accent marks} -> e
516 -- and so on.
517 --
518 -- Sometimes, no straightforward conversion is possible
519 -- because there is no equivalent in ASCII for a
520 -- particular character. In this case the SQL CONVERT
521 -- function will substitute a '?' for that character.
522 --
523 -- MAKE_ASCII("Senaj(o with two dots)ki") returns "Senajoki"
524 -- MAKE_ASCII("Senaj(o with a slash)ki") returns "Senaj?ki"
525 --
526 -- Parameters:
527 -- IN 1) p_from_text VARCHAR2
528 -- The raw text which might contain accented
529 -- or otherwise non-ASCII characters.
530 --
531 -- OUT None
532 --
533 -- RETURN VARCHAR2 - The converted text with only ASCII characters.
534 -- =======================================================================*/
535
536 FUNCTION MAKE_ASCII(
537 p_from_text IN VARCHAR2
538 ) RETURN VARCHAR2 IS
539
540 l_converted_text VARCHAR2(300);
541
542 BEGIN
543
544 --
545 -- Call the SQL CONVERT method to convert given string
546 -- to US ASCII format.
547 --
548 -- See http://st-doc/8.0/817/server.817/a85397/function.htm#77039
549 -- for CONVERT syntax
550 --
551 l_converted_text := convert(p_from_text, 'US7ASCII');
552
553 RETURN l_converted_text;
554
555 EXCEPTION
556 WHEN OTHERS THEN
557 RETURN p_from_text;
558
559 END MAKE_ASCII;
560
561 FUNCTION get_call_exec
562 (
563 p_pkg_name VARCHAR2,
564 p_function_name VARCHAR2,
565 p_params JTF_VARCHAR2_TABLE_200
566 )
567 RETURN VARCHAR2
568 IS
569 l_call VARCHAR2(3000);
570 l_bind_counter NUMBER := 1;
571 BEGIN
572
573 l_call :='CALL '|| p_pkg_name || '.' || p_function_name || '(';
574
575 FOR i IN p_params.FIRST..p_params.LAST LOOP
576 IF (NOT (i = p_params.FIRST)) THEN
577 l_call := l_call || ',';
578 END IF;
579
580 IF (p_params(i) IS NULL) THEN
581 l_call := l_call || ':' || TO_CHAR(l_bind_counter);
582 l_bind_counter := l_bind_counter+1;
583 ELSE
584 l_call := l_call || p_params(i);
585 END IF;
586 END LOOP;
587
588 l_call := l_call || ')';
589
590 return l_call;
591 END get_call_exec;
592
593 PROCEDURE set_view_param
594 (
595 p_name iby_view_parameters_gt.name%TYPE,
596 p_val iby_view_parameters_gt.value%TYPE
597 )
598 IS
599 BEGIN
600
601 INSERT INTO iby_view_parameters_gt
602 (name,value,created_by,creation_date,last_updated_by,last_update_date,
603 last_update_login,object_version_number)
604 VALUES
605 (p_name,p_val,fnd_global.user_id,sysdate,fnd_global.user_id,
606 sysdate,fnd_global.login_id,1);
607
608 -- no commit, as data deleted at the end of the current
609 -- transaction
610 END set_view_param;
611
612 FUNCTION get_view_param( p_name iby_view_parameters_gt.name%TYPE )
613 RETURN iby_view_parameters_gt.value%TYPE
614 IS
615 l_val iby_view_parameters_gt.value%TYPE;
616
617 CURSOR c_param_val
618 (ci_name iby_view_parameters_gt.name%TYPE)
619 IS
620 SELECT value
621 FROM iby_view_parameters_gt
622 WHERE (name=ci_name);
623
624 BEGIN
625
626 IF (c_param_val%ISOPEN) THEN
627 CLOSE c_param_val;
628 END IF;
629
630 OPEN c_param_val(p_name);
631 FETCH c_param_val INTO l_val;
632
633 IF (c_param_val%NOTFOUND) THEN
634 l_val := NULL;
635 END IF;
636 CLOSE c_param_val;
637
638 RETURN l_val;
639
640 END get_view_param;
641
642 PROCEDURE init_debug_mode_for_extract
643 IS
644 BEGIN
645 set_view_param(PARAM_EXTRACT_DEBUG_MODE, 'Y');
646 END init_debug_mode_for_extract;
647
648 FUNCTION debug_mode_for_extract_enabled
649 RETURN VARCHAR2
650 IS
651 BEGIN
652 RETURN NVL(get_view_param(PARAM_EXTRACT_DEBUG_MODE), 'N');
653 END debug_mode_for_extract_enabled;
654
655
656 FUNCTION check_lookup_val( p_val IN VARCHAR2, p_lookup IN VARCHAR2 )
657 RETURN BOOLEAN
658 IS
659 l_count NUMBER;
660 BEGIN
661
662 SELECT count(lookup_code)
663 INTO l_count
664 FROM fnd_lookups
665 WHERE (lookup_type = p_lookup)
666 AND (lookup_code = p_val)
667 AND (enabled_flag = 'Y')
668 AND (NVL(end_date_active,SYSDATE-10) < SYSDATE);
669
670 IF (l_count<1) THEN
671 RETURN false;
672 ELSE
673 RETURN true;
674 END IF;
675
676 END check_lookup_val;
677
678 FUNCTION validate_party_id(p_party_id IN hz_parties.party_id%TYPE)
679 RETURN BOOLEAN
680 IS
681 l_count NUMBER;
682
683 CURSOR c_party(ci_party_id IN hz_parties.party_id%TYPE)
684 IS
685 SELECT COUNT(party_id)
686 INTO l_count
687 FROM hz_parties
688 WHERE party_id = ci_party_id;
689 BEGIN
690 IF (c_party%ISOPEN) THEN CLOSE c_party; END IF;
691
692 OPEN c_party(p_party_id);
693 FETCH c_party INTO l_count;
694 CLOSE c_party;
695
696 RETURN (l_count>0);
697 END validate_party_id;
698
699 FUNCTION validate_app_id(p_app_id IN fnd_application.application_id%TYPE)
700 RETURN BOOLEAN
701 IS
702 l_count NUMBER;
703
704 CURSOR c_app(ci_app_id IN fnd_application.application_id%TYPE)
705 IS
706 SELECT count(*)
707 FROM fnd_application
708 WHERE (application_id = ci_app_id);
709
710 BEGIN
711 IF (c_app%ISOPEN) THEN CLOSE c_app; END IF;
712
713 OPEN c_app(p_app_id);
714 FETCH c_app INTO l_count;
715 CLOSE c_app;
716
717 IF (l_count<1) THEN
718 RETURN FALSE;
719 ELSE
720 RETURN TRUE;
721 END IF;
722 END validate_app_id;
723
724
725 FUNCTION validate_territory
726 ( p_territory IN fnd_territories.territory_code%TYPE )
727 RETURN BOOLEAN
728 IS
729
730 l_territory fnd_territories.territory_code%TYPE;
731
732 CURSOR c_terr( ci_code IN fnd_territories.territory_code%TYPE )
733 IS
734 SELECT territory_code
735 FROM fnd_territories
736 WHERE (territory_code = ci_code)
737 AND (NVL(obsolete_flag,'N') = 'N');
738
739 BEGIN
740 IF (c_terr%ISOPEN) THEN CLOSE c_terr; END IF;
741
742 OPEN c_terr(p_territory);
743 FETCH c_terr INTO l_territory;
744 CLOSE c_terr;
745
746 RETURN (NOT l_territory IS NULL);
747 END validate_territory;
748
749
750 FUNCTION is_trivial(p_string VARCHAR2)
751 RETURN BOOLEAN
752 IS
753 BEGIN
754 IF (p_string IS NULL) THEN RETURN TRUE;
755 ELSIF (RTRIM(LTRIM(p_string)) IS NULL) THEN RETURN TRUE;
756 ELSE RETURN FALSE; END IF;
757 END is_trivial;
758
759 FUNCTION validate_organization(p_org_id IN iby_trxn_summaries_all.org_id%TYPE,
760 p_org_type IN iby_trxn_summaries_all.org_type%TYPE)
761 RETURN VARCHAR2
762 IS
763
764 l_org_id NUMBER;
765 l_return_value VARCHAR2(1) := 'N';
766
767 BEGIN
768
769 BEGIN
770 SELECT organization_id
771 INTO l_org_id
772 FROM hr_operating_units
773 WHERE organization_id = p_org_id;
774
775 EXCEPTION
776 WHEN no_data_found THEN
777 l_org_id := NULL;
778
779 END;
780
781 IF (l_org_id IS NOT NULL) THEN
782 l_return_value := 'Y';
783 END IF;
784
785 RETURN l_return_value;
786
787 END validate_organization;
788
789
790 PROCEDURE validate_pmt_channel_code(p_instrument_type IN iby_creditcard.instrument_type%TYPE,
791 p_payment_channel_code IN OUT NOCOPY iby_trxn_summaries_all.payment_channel_code%TYPE,
792 p_valid OUT NOCOPY VARCHAR2)
793 IS
794 l_payment_channel_code iby_trxn_summaries_all.payment_channel_code%TYPE;
795 l_return_value VARCHAR2(1) := 'N';
796
797 BEGIN
798
799 BEGIN
800 SELECT payment_channel_code
801 INTO l_payment_channel_code
802 FROM iby_fndcpt_pmt_chnnls_b
803 WHERE instrument_type = p_instrument_type
804 AND (UPPER(payment_channel_code) = UPPER(p_payment_channel_code)
805 OR p_payment_channel_code is null);
806
807 EXCEPTION
808 WHEN no_data_found THEN
809 l_payment_channel_code := NULL;
810
811 WHEN too_many_rows THEN
812 IF (p_instrument_type = 'BANKACCOUNT') THEN
813 l_payment_channel_code := 'BANK_ACCT_XFER';
814
815 ELSIF (p_instrument_type = 'MANUAL') THEN
816 l_payment_channel_code := 'CHECK';
817
818 ELSE
819 l_payment_channel_code := NULL;
820 END IF;
821
822 END;
823
824 IF (l_payment_channel_code IS NOT NULL AND
825 UPPER(l_payment_channel_code) = NVL(UPPER(p_payment_channel_code), UPPER(l_payment_channel_code))) THEN
826 l_return_value := 'Y';
827 END IF;
828
829 p_payment_channel_code := l_payment_channel_code;
830 p_valid := l_return_value;
831
832 END validate_pmt_channel_code;
833
834 -- This function is moved from appayutb.pls to provide the count of requests in 'Processing', 'Terminated' in Payments Dashboard.
835 FUNCTION get_psr_snapshot_count(p_snapshot_code IN VARCHAR2)
836 RETURN NUMBER IS
837
838 l_status_code FND_LOOKUP_VALUES.LOOKUP_CODE%TYPE;
839
840 l_ret_val NUMBER;
841 l_count1 NUMBER;
842 l_count2 NUMBER;
843 l_count3 NUMBER;
844 l_count4 NUMBER;
845 BEGIN
846 IF(g_psr_snapshot_table.EXISTS(p_snapshot_code) AND g_psr_snapshot_table(p_snapshot_code).psr_snapshot_count IS NOT NULL) THEN
847 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
848 iby_debug_pub.add(debug_msg => 'IBY_UTILITY_PVT.get_psr_snapshot_count :Getting from the cache',
849 debug_level => FND_LOG.LEVEL_STATEMENT,
850 module => 'IBY_UTILITY_PVT.get_psr_snapshot_count');
851 END IF;
852 l_ret_val:= g_psr_snapshot_table(p_snapshot_code).psr_snapshot_count;
853 ELSE
854 IF (p_snapshot_code = 'NEED_ACTION_BY_ME') THEN
855
856 SELECT SUM(icount) tcount
857 INTO l_count1
858 FROM
859 (SELECT COUNT(*) icount
860 FROM iby_pay_service_requests iby
861 WHERE iby.calling_app_id = 200
862 AND iby.process_type = 'STANDARD'
863 AND iby.payment_service_request_status IN ( 'INFORMATION_REQUIRED', 'PENDING_REVIEW_DOC_VAL_ERRORS', 'PENDING_REVIEW_PMT_VAL_ERRORS', 'PENDING_REVIEW')
864 UNION
865 SELECT COUNT(*) icount
866 FROM iby_pay_service_requests iby
867 WHERE iby.calling_app_id = 200
868 AND iby.process_type = 'STANDARD'
869 AND iby.payment_service_request_status = 'PAYMENTS_CREATED'
870 AND EXISTS
871 (SELECT 'NEED_ACTION_BY_ME'
872 FROM iby_payments_all pmt
873 WHERE iby.payment_service_request_id = pmt.payment_service_request_id
874 AND EXISTS
875 (SELECT 'NEED_ACTION_BY_ME'
876 FROM iby_pay_instructions_all instr
877 WHERE instr.payment_instruction_id = pmt.payment_instruction_id
878 AND instr.payment_instruction_status IN ('CREATION_ERROR', 'FORMATTED_READY_TO_TRANSMIT', 'TRANSMISSION_FAILED',
879 'FORMATTED_READY_FOR_PRINTING', 'SUBMITTED_FOR_PRINTING', 'CREATED_READY_FOR_PRINTING',
880 'CREATED_READY_FOR_FORMATTING', 'FORMATTED', 'CREATED', 'TRANSMITTED')
881 AND instr.payments_complete_code = 'NO'
882 AND iby_utility_pvt.check_user_access(instr.payment_instruction_id) = 'Y'
883 )
884 )
885 );
886
887 SELECT count(*)
888 INTO l_count2
889 FROM ap_inv_selection_criteria_all ap
890 WHERE ap.status IN ('REVIEW', 'MISSING RATES' )
891 AND NOT EXISTS ( SELECT 'NEED_ACTION_BY_ME'
892 FROM iby_pay_service_requests iby
893 WHERE iby.calling_app_id = 200
894 AND iby.call_app_pay_service_req_code =
895 ap.checkrun_name);
896
897
898 l_ret_val := l_count1 + l_count2;
899 g_psr_snapshot_table(p_snapshot_code).psr_snapshot_count := l_ret_val;
900
901 ELSIF p_snapshot_code = 'PROCESSING' THEN
902 /*Modified the query for the Bug 7560766
903 Added a condition to identify the PPRs which
904 are waiting for the user action*/
905 SELECT
906 count(*)
907 INTO l_count1
908 FROM iby_pay_service_requests iby
909 WHERE iby.calling_app_id = 200
910 AND iby.process_type = 'STANDARD'
911 AND
912 (
913 iby.payment_service_request_status IN ('INSERTED', 'SUBMITTED',
914 'ASSIGNMENT_COMPLETE',
915 'DOCUMENTS_VALIDATED',
916 'RETRY_DOCUMENT_VALIDATION',
917 'RETRY_PAYMENT_CREATION')
918 OR
919 (
920 iby.payment_service_request_status IN ('PAYMENTS_CREATED')
921 AND EXISTS
922 (SELECT 'PROCESSING'
923 FROM iby_payments_all pmt
924 WHERE
925 pmt.payment_service_request_id = iby.payment_service_request_id
926 AND pmt.payment_status NOT IN('REMOVED', 'VOID', 'VOID_BY_SETUP', 'VOID_BY_OVERFLOW', 'REMOVED_PAYMENT_STOPPED',
927 'REMOVED_DOCUMENT_SPOILED', 'REMOVED_INSTRUCTION_TERMINATED', 'REMOVED_REQUEST_TERMINATED', 'ISSUED', 'TRANSMITTED', 'REJECTED',
928 'FAILED_VALIDATION', 'FAILED_BY_CALLING_APP', 'FAILED_BY_REJECTION_LEVEL')
929 AND pmt.payments_complete_flag <> 'Y'
930 AND NOT EXISTS
931 (SELECT 'NEED_ACTION'
932 FROM iby_pay_instructions_all inst
933 WHERE pmt.payment_instruction_id = inst.payment_instruction_id
934 AND inst.payment_instruction_status IN('CREATION_ERROR',
935 'FORMATTED_READY_TO_TRANSMIT',
936 'TRANSMISSION_FAILED',
937 'FORMATTED_READY_FOR_PRINTING',
938 'SUBMITTED_FOR_PRINTING',
939 'CREATED_READY_FOR_PRINTING',
940 'CREATED_READY_FOR_FORMATTING',
941 'FORMATTED',
942 'CREATED',
943 'FORMATTED_ELECTRONIC'))
944 )
945 )
946 );
947
948
949 SELECT count(*)
950 INTO l_count2
951 FROM ap_inv_selection_criteria_all ap
952 WHERE ap.status IN ('UNSTARTED', 'SELECTING', 'CANCELING',
953 'CALCULATING', 'SELECTED')
954 AND NOT EXISTS ( SELECT 'PROCESSING'
955 FROM iby_pay_service_requests iby
956 WHERE iby.calling_app_id = 200
957 AND iby.call_app_pay_service_req_code =
958 ap.checkrun_name);
959
960 l_ret_val := l_count1 + l_count2;
961 g_psr_snapshot_table(p_snapshot_code).psr_snapshot_count := l_ret_val;
962
963 ELSIF p_snapshot_code = 'USER_TERMINATED' THEN
964 SELECT count(*)
965 INTO l_count1
966 FROM ap_inv_selection_criteria_all ap
967 WHERE EXISTS ( SELECT 'IBY USER_TERMINATED'
968 FROM iby_pay_service_requests iby
969 WHERE iby.calling_app_id = 200
970 AND iby.call_app_pay_service_req_code =
971 ap.checkrun_name
972 AND iby.payment_service_request_status IN
973 ('TERMINATED'))
974 AND ap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999);
975
976 SELECT count(*)
977 INTO l_count2
978 FROM ap_inv_selection_criteria_all ap
979 WHERE ap.status IN ('CANCELED', 'CANCELLED NO PAYMENTS')
980 AND TRUNC(ap.creation_date) =TRUNC(sysdate)
981 AND NOT EXISTS ( SELECT 'AP USER_TERMINATED'
982 FROM iby_pay_service_requests iby
983 WHERE iby.calling_app_id = 200
984 AND iby.call_app_pay_service_req_code =
985 ap.checkrun_name)
986 AND ap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999);
987
988 l_ret_val := l_count1 + l_count2;
989 g_psr_snapshot_table(p_snapshot_code).psr_snapshot_count := l_ret_val;
990
991 ELSIF p_snapshot_code = 'PROGRAM_ERRORS' THEN
992
993 SELECT count(*)
994 INTO l_count1
995 FROM ap_inv_selection_criteria_all ap
996 WHERE EXISTS ( SELECT 'PROGRAM ERRORS'
997 FROM iby_pay_service_requests iby
998 WHERE iby.calling_app_id = 200
999 AND iby.call_app_pay_service_req_code =
1000 ap.checkrun_name
1001 AND iby.payment_service_request_status IN
1002 ('PENDING_REVIEW_DOC_VAL_ERRORS',
1003 'PENDING_REVIEW_PMT_VAL_ERRORS'))
1004 AND ap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999);
1005
1006 l_ret_val := l_count1;
1007 g_psr_snapshot_table(p_snapshot_code).psr_snapshot_count := l_ret_val;
1008
1009 ELSIF p_snapshot_code = 'COMPLETED' THEN
1010
1011 SELECT count(*)
1012 INTO l_count1
1013 FROM ap_inv_selection_criteria_all ap
1014 WHERE EXISTS ( SELECT 'COMPLETED'
1015 FROM iby_pay_service_requests iby
1016 WHERE iby.calling_app_id = 200
1017 AND iby.call_app_pay_service_req_code =
1018 ap.checkrun_name
1019 AND iby.payment_service_request_status IN
1020 ('PAYMENTS_CREATED','COMPLETED')
1021 AND AP_PAYMENT_UTIL_PKG.get_payment_status_flag(iby.payment_service_request_id) = 'Y')
1022 AND ap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999);
1023
1024 l_ret_val := l_count1;
1025 g_psr_snapshot_table(p_snapshot_code).psr_snapshot_count := l_ret_val;
1026
1027 ELSIF p_snapshot_code = 'TOTAL' THEN
1028
1029 -- The total value is calculated in the UI
1030 NULL;
1031
1032 END IF;
1033 END IF;
1034 RETURN l_ret_val;
1035
1036 END;
1037
1038 -- This function is moved from appayutb.pls to provide the count of requests in 'Processing', 'Terminated' in Payments Dashboard.
1039 /* Bug Number: 7279395
1040 * Caching is implemented based on the psr id. Hence pages or procedures
1041 * which are accessing this function should take the responsibility to
1042 * initialize g_psr_table by calling the initialize procedure
1043 *
1044 *Bug 8883966: Added new input parameter p_from_cache.
1045 */
1046 FUNCTION get_payment_status_flag(p_psr_id IN NUMBER,
1047 p_from_cache IN VARCHAR2 DEFAULT 'FALSE')
1048 RETURN VARCHAR2 IS
1049
1050 l_payment_status_flag VARCHAR2(1);
1051 l_total_pmt_count NUMBER;
1052 l_pmt_complete_count NUMBER;
1053
1054
1055 BEGIN
1056
1057 IF ( p_psr_id IS NOT NULL ) THEN
1058
1059 IF(g_psr_table.EXISTS(p_psr_id) AND g_psr_table(p_psr_id).payment_status_flag IS NOT NULL
1060 AND p_from_cache = 'TRUE') THEN
1061 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1062 iby_debug_pub.add(debug_msg => 'IBY_UTILITY_PVT.get_payment_status_flag :Getting from the cache',
1063 debug_level => FND_LOG.LEVEL_STATEMENT,
1064 module => 'IBY_UTILITY_PVT.get_payment_status_flag');
1065 END IF;
1066 l_payment_status_flag:= g_psr_table(p_psr_id).payment_status_flag;
1067 ELSE
1068
1069 /*Bug 7248943*/
1070 select count (*) total_pmt_count,
1071 count(case when PAYMENTS_COMPLETE_FLAG = 'Y' then 1 else null
1072 end) pmt_complete_count
1073 into l_total_pmt_count, l_pmt_complete_count /*Bug 7248943*/
1074 FROM iby_payments_all
1075 WHERE payment_service_request_id = p_psr_id
1076 AND payment_status NOT IN ('REMOVED', 'VOID_BY_SETUP',
1077 'VOID_BY_OVERFLOW', 'REMOVED_PAYMENT_STOPPED',
1078 'REMOVED_DOCUMENT_SPOILED',
1079 'REMOVED_INSTRUCTION_TERMINATED',
1080 'REMOVED_REQUEST_TERMINATED',
1081 'REJECTED', -- Bug 6897223- new statuses added
1082 'FAILED_BY_CALLING_APP',
1083 'FAILED_BY_REJECTION_LEVEL',
1084 'FAILED_VALIDATION',
1085 'INSTRUCTION_FAILED_VALIDATION'); --Bug 6686639
1086
1087 IF l_total_pmt_count > 0 THEN
1088 --
1089 /*Removed query for Bug 7248943*/
1090
1091 IF ( l_total_pmt_count = l_pmt_complete_count) THEN
1092 l_payment_status_flag := 'Y';
1093 g_psr_table(p_psr_id).payment_status_flag := l_payment_status_flag;
1094 ELSIF ((l_total_pmt_count > l_pmt_complete_count) AND
1095 (l_pmt_complete_count <> 0))THEN
1096 l_payment_status_flag := 'P';
1097 g_psr_table(p_psr_id).payment_status_flag := l_payment_status_flag;
1098 ELSIF ((l_total_pmt_count > l_pmt_complete_count) AND
1099 (l_pmt_complete_count = 0)) THEN
1100 l_payment_status_flag := 'N';
1101 g_psr_table(p_psr_id).payment_status_flag := l_payment_status_flag;
1102 END IF;
1103 --
1104 ELSE
1105 --
1106
1107 l_payment_status_flag := 'N';
1108 g_psr_table(p_psr_id).payment_status_flag := l_payment_status_flag;
1109
1110 END IF;
1111 END IF;
1112 ELSE
1113 l_payment_status_flag := 'N';
1114
1115 END IF;
1116
1117
1118 RETURN l_payment_status_flag;
1119
1120 END get_payment_status_flag;
1121
1122 -- This function is moved from appayutb.pls to provide the count of requests in 'Processing', 'Terminated' in Payments Dashboard.
1123 /* Bug Number: 7279395
1124 * Caching is implemented based on the psr id. Hence pages or procedures
1125 * which are accessing this function should take the responsibility to
1126 * initialize g_psr_table by calling the initialize procedure
1127 *
1128 * Bug 8883966: Added new input parameter p_from_cache.
1129 */
1130 FUNCTION get_psr_status(p_psr_id IN NUMBER,
1131 p_psr_status IN VARCHAR2,
1132 p_from_cache IN VARCHAR2 DEFAULT 'FALSE')
1133 RETURN VARCHAR2 IS
1134
1135 l_psr_status VARCHAR2(30);
1136 l_total_pmt_count NUMBER;
1137 l_instr_count NUMBER;
1138 l_pmt_terminate_count NUMBER;
1139 l_pmt_spoil_skip NUMBER;
1140 l_valid_completed_pmt NUMBER;
1141
1142 BEGIN
1143 IF(g_psr_table.EXISTS(p_psr_id) AND g_psr_table(p_psr_id).psr_status IS NOT NULL
1144 AND p_from_cache = 'TRUE') THEN
1145 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1146 iby_debug_pub.add(debug_msg => 'IBY_UTILITY_PVT.get_psr_status :Getting from the cache',
1147 debug_level => FND_LOG.LEVEL_STATEMENT,
1148 module => 'IBY_UTILITY_PVT.get_psr_status');
1149 END IF;
1150 l_psr_status:= g_psr_table(p_psr_id).psr_status;
1151 ELSE
1152
1153 IF p_psr_status <> 'PAYMENTS_CREATED' AND p_psr_status <> 'COMPLETED' THEN
1154
1155 IF p_psr_status IN ('INSERTED', 'SUBMITTED',
1156 'ASSIGNMENT_COMPLETE',
1157 'DOCUMENTS_VALIDATED',
1158 'RETRY_DOCUMENT_VALIDATION',
1159 'RETRY_PAYMENT_CREATION') THEN
1160
1161 l_psr_status := 'BUILDING';
1162 g_psr_table(p_psr_id).psr_status := l_psr_status;
1163 RETURN l_psr_status;
1164 --
1165 END IF;
1166 --
1167 RETURN p_psr_status;
1168 ELSIF p_psr_status = 'COMPLETED' THEN
1169 BEGIN
1170 select 1
1171 into l_valid_completed_pmt
1172 from dual
1173 where exists(select 'VALID_PAYMENT'
1174 from iby_payments_all
1175 where payment_service_request_id = p_psr_id
1176 and payments_complete_flag = 'Y'
1177 and payment_status in ('INSTRUCTION_CREATED', 'ISSUED', 'FORMATTED', 'TRANSMITTED'));
1178
1179 l_psr_status := 'CONFIRMED';
1180 EXCEPTION
1181 WHEN no_data_found then
1182 l_psr_status := 'TERMINATED';
1183 END;
1184
1185 RETURN l_psr_status;
1186 END IF;
1187
1188 /*Bug 7248943*/
1189 select count (*) total_pmt_count,
1190 count(case when payment_instruction_id IS NOT NULL then 1
1191 else null end) instr_count,
1192 count(case when PAYMENT_STATUS IN ('REMOVED_INSTRUCTION_TERMINATED',
1193 'REMOVED_REQUEST_TERMINATED',
1194 'VOID',
1195 'REMOVED',
1196 'REMOVED_PAYMENT_STOPPED',
1197 'VOID_BY_SETUP',
1198 'VOID_BY_OVERFLOW',
1199 'REMOVED_DOCUMENT_SPOILED',
1200 'REJECTED',
1201 'FAILED_BY_CALLING_APP',
1202 'FAILED_BY_REJECTION_LEVEL',
1203 'FAILED_VALIDATION',
1204 'INSTRUCTION_FAILED_VALIDATION') then 1
1205 else null end) pmt_terminate_count,
1206 count(case when PAYMENT_STATUS IN ('REMOVED_DOCUMENT_SPOILED',
1207 'REMOVED_DOCUMENT_SKIPPED') then 1
1208 else null end) pmt_spoil_skip
1209 into l_total_pmt_count, l_instr_count, l_pmt_terminate_count, l_pmt_spoil_skip
1210 from iby_payments_all
1211 WHERE payment_service_request_id = p_psr_id ;
1212 /*Bug 7248943*/
1213
1214 IF (l_instr_count = 0 AND p_psr_status = 'PAYMENTS_CREATED') THEN
1215
1216 l_psr_status := 'BUILT';
1217 g_psr_table(p_psr_id).psr_status := l_psr_status;
1218 RETURN l_psr_status;
1219
1220 END IF;
1221
1222
1223 if (l_pmt_spoil_skip > 0) THEN
1224
1225 l_psr_status := 'CONFIRMED';
1226 g_psr_table(p_psr_id).psr_status := l_psr_status;
1227 ELSE
1228
1229
1230 IF l_total_pmt_count > 0 THEN
1231 --
1232
1233 IF ( l_total_pmt_count = l_pmt_terminate_count) THEN
1234 l_psr_status := 'TERMINATED';
1235 g_psr_table(p_psr_id).psr_status := l_psr_status;
1236 ELSIF get_payment_status_flag(p_psr_id, p_from_cache) = 'Y' THEN
1237 l_psr_status := 'CONFIRMED';
1238 g_psr_table(p_psr_id).psr_status := l_psr_status;
1239 ELSE
1240 l_psr_status := 'FORMATTING';
1241 g_psr_table(p_psr_id).psr_status := l_psr_status;
1242 END IF;
1243 ELSE
1244 l_psr_status := p_psr_status;
1245 g_psr_table(p_psr_id).psr_status := l_psr_status;
1246
1247 END IF;
1248 END IF;
1249
1250 END IF;
1251
1252 RETURN l_psr_status;
1253
1254 END get_psr_status;
1255
1256 /* Bug Number: 7279395
1257 * This procedure is used to initialize the table type variable
1258 * g_psr_table.
1259 * The pages which are accessing the functions get_psr_status and
1260 * get_payment_status_flag should take the responsibility of initializing
1261 * g_psr_table by calling this procedure.
1262 */
1263 PROCEDURE initialize
1264 IS
1265 BEGIN
1266 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1267 iby_debug_pub.add(debug_msg => 'ENTER: ' || 'IBY_UTILITY_PVT.initialize',
1268 debug_level => FND_LOG.LEVEL_STATEMENT,
1269 module => 'IBY_UTILITY_PVT.initialize');
1270 END IF;
1271 g_psr_table.DELETE;
1272 g_psr_snapshot_table.DELETE;
1273 g_instr_access_table.DELETE;
1274 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1275 iby_debug_pub.add(debug_msg => 'Exit: ' || 'IBY_UTILITY_PVT.initialize',
1276 debug_level => FND_LOG.LEVEL_STATEMENT,
1277 module => 'IBY_UTILITY_PVT.initialize');
1278 END IF;
1279 END initialize;
1280
1281
1282 Function check_user_access(p_pay_instruction_id IN Number) RETURN VARCHAR2 IS
1283 l_access varchar2(1) := 'Y';
1284 BEGIN
1285 IF(g_instr_access_table.EXISTS(p_pay_instruction_id) AND g_instr_access_table(p_pay_instruction_id).access_flag IS NOT NULL)
1286 THEN
1287 l_access := g_instr_access_table(p_pay_instruction_id).access_flag;
1288 ELSE
1289 begin
1290 select 'N' into l_access from dual where exists ( select 'Inaccessible org' from iby_payments_all where
1291 payment_instruction_id = p_pay_instruction_id and MO_GLOBAL.CHECK_ACCESS(org_id) = 'N');
1292
1293 Exception
1294 when NO_DATA_FOUND
1295 then
1296 l_access := 'Y';
1297 end;
1298 g_instr_access_table(p_pay_instruction_id).access_flag := l_access;
1299 END IF;
1300 return l_access;
1301 END check_user_access;
1302
1303
1304
1305 FUNCTION get_format_program_name(p_pay_instruction_id IN NUMBER) RETURN VARCHAR2 IS
1306
1307 l_conc_prog varchar2(100);
1308
1309 BEGIN
1310
1311 SELECT decode(decode(template_type_code,
1312 'RTF','PDF',
1313 'ETEXT','ETEXT',
1314 'XSL-XML','XML',
1315 'PDF','PDF'),'PDF', 'IBY_FD_PAYMENT_FORMAT','IBY_FD_PAYMENT_FORMAT_TEXT')
1316 into
1317 l_conc_prog
1318 FROM iby_pay_instructions_all ins,
1319 iby_payment_profiles pp,
1320 iby_formats_b format,
1321 XDO_TEMPLATES_B temp
1322 WHERE ins.payment_instruction_id = p_pay_instruction_id
1323 AND ins.payment_profile_id = pp.payment_profile_id
1324 AND format.FORMAT_CODE = pp.PAYMENT_FORMAT_CODE
1325 AND format.FORMAT_TEMPLATE_CODE = temp.template_code
1326 AND nvl(temp.end_date, SYSDATE)>= SYSDATE;
1327
1328
1329 return l_conc_prog;
1330
1331 END get_format_program_name;
1332
1333 /*-----------------------------------------------------------------------------------------
1334 | FUNCTION - get_psr_snapshot_count PIPELINED.
1335 |
1336 |
1337 | DESCRIPTION - This function is designed for the Payables Payment Manager
1338 | Home Page . The function returns the total count of Payment
1339 | Process Requests with a particular Status or a combination
1340 | of Payment Process Request Statuses that map to a particular
1341 | snapshot code
1342 |
1343 | SNAPSHOT CODE STATUS
1344 | ------------- ------------------------------------------------
1345 | NEED_ACTION_BY_ME AP:
1346 | 'REVIEW', 'MISSING RATES'
1347 | IBY:
1348 | 'INFORMATION_REQUIRED'
1349 | 'PENDING_REVIEW_DOC_VAL_ERRORS',
1350 | 'PENDING_REVIEW_PMT_VAL_ERRORS',
1351 | 'PENDING_REVIEW'
1352 |
1353 | PROCESSING AP:
1354 | 'UNSTARTED', 'SELECTING', 'CANCELING',
1355 | 'CALCULATING', 'SELECTED'
1356 | IBY:
1357 | 'INSERTED', 'SUBMITTED',
1358 | 'ASSIGNMENT_COMPLETE','DOCUMENTS_VALIDATED',
1359 | 'RETRY_DOCUMENT_VALIDATION',
1360 | 'RETRY_PAYMENT_CREATION'
1361 |
1362 | USER_TERMINATED AP:
1363 | 'CANCELED' , 'CANCELLED NO PAYMENTS'
1364 | IBY:
1365 | 'TERMINATED'
1366 |
1367 | PROGRAM_ERRORS IBY:
1368 | 'PENDING_REVIEW_DOC_VAL_ERRORS'
1369 | 'PENDING_REVIEW_PMT_VAL_ERRORS'
1370 |
1371 | COMPLETED IBY:
1372 | 'PAYMENTS_CREATED'
1373 |
1374 | TOTAL COUNT(*) IN AP
1375 |
1376 |===========================================================================================
1377 |Understanding PIPELINED FUNCTION:
1378 |-----------------------------------
1379 |PIPELINED functions are piece of code that can be used for querying SQL.
1380 |Basically, when you would like a PLSQL routine to be the source
1381 |of data -- instead of a table -- you would use a pipelined function.
1382 |PIPELINED functions will operate like a table.
1383 |Using PL/SQL table functions can significantly lower the over-head of
1384 |doing such transformations. PL/SQL table functions accept and return
1385 |multiple rows, delivering them as they are ready rather than all at once,
1386 |and can be made to execute as parallel operations.
1387 |
1388 -----------------------------------------------------------------------------------------
1389 */
1390
1391 FUNCTION get_psr_snapshot_pipe RETURN snapshot_count_t PIPELINED
1392 IS
1393
1394 p_snapshot_code VARCHAR2(100) := 'Test';
1395 l_ret_val snapshot_count_type;
1396 l_status_code FND_LOOKUP_VALUES.LOOKUP_CODE%TYPE;
1397 --l_ret_val NUMBER;
1398 l_count1 NUMBER;
1399 l_count2 NUMBER;
1400 l_count3 NUMBER;
1401 l_count4 NUMBER;
1402 -- Variables for count
1403 l_need_action NUMBER;
1404 l_processing NUMBER;
1405 l_terminated NUMBER;
1406 l_errors NUMBER;
1407 l_completed NUMBER;
1408 l_process_count NUMBER;
1409 l_access VARCHAR2(1);
1410 --Loop For every ppr
1411 CURSOR c_psr_snapshot
1412 IS
1413 SELECT ipsr.payment_service_request_id ,
1414 ipsr.payment_service_request_status ,
1415 aisc.status ,
1416 aisc.checkrun_id ,
1417 aisc.checkrun_name ,
1418 aisc.creation_date
1419 FROM iby_pay_service_requests ipsr ,
1420 ap_inv_selection_criteria_all aisc
1421 WHERE ipsr.call_app_pay_service_req_code(+) = aisc.checkrun_name;
1422 --AND process_type = 'STANDARD' ;
1423 BEGIN
1424 IF(g_psr_snapshot_table.EXISTS(p_snapshot_code) AND g_psr_snapshot_table(p_snapshot_code).psr_snapshot_count IS NOT NULL) THEN
1425
1426 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1427 iby_debug_pub.add(debug_msg => 'IBY_UTILITY_PVT.get_psr_snapshot_count :Getting from the cache', debug_level => FND_LOG.LEVEL_STATEMENT, module => 'IBY_UTILITY_PVT.get_psr_snapshot_count');
1428 END IF ;
1429 ELSE
1430 -- Initialize the variables.
1431 l_need_action :=0;
1432 l_processing :=0;
1433 l_terminated :=0;
1434 l_errors :=0;
1435 l_completed :=0;
1436 FOR c_rec_snap IN c_psr_snapshot
1437 LOOP
1438
1439 /* IBY NEED ACTION */
1440 --Handling everything with iby_pay_service_requests first.
1441 --For IBY_PAY_SERVICE_REQUESTS.
1442 IF c_rec_snap.payment_service_request_status IN ('INFORMATION_REQUIRED' , 'PENDING_REVIEW_DOC_VAL_ERRORS','PENDING_REVIEW_PMT_VAL_ERRORS', 'PENDING_REVIEW') THEN
1443 l_need_action := l_need_action + 1;
1444 --For records in ap_inv_selection_criteria_all but not in iby_pay_service_request. For PPR which are still before build.
1445 ELSIF c_rec_snap.payment_service_request_status IS NULL AND c_rec_snap.status IN ('REVIEW', 'MISSING RATES' ) THEN
1446 l_need_action := l_need_action + 1;
1447 /* IBY NEED ACTION */
1448 /* IBY IN PROCESS. */
1449 ELSIF c_rec_snap.payment_service_request_status IN ('INSERTED', 'SUBMITTED','ASSIGNMENT_COMPLETE','DOCUMENTS_VALIDATED','RETRY_DOCUMENT_VALIDATION','RETRY_PAYMENT_CREATION') THEN
1450 l_processing := l_processing + 1;
1451 ELSIF c_rec_snap.payment_service_request_status IS NULL AND c_rec_snap.status IN ('UNSTARTED', 'SELECTING', 'CANCELING','CALCULATING', 'SELECTED') THEN
1452 l_processing := l_processing + 1;
1453 /* IBY IN PROCESS. */
1454 /* PAYMENTS_CREATED and it can be in either processing or need action group */
1455 --Special case Payment Created
1456 ELSIF c_rec_snap.payment_service_request_status IN ('PAYMENTS_CREATED') THEN
1457 -- Need to check the payment instruction and individual payments.
1458 l_access := 'N';
1459 --Check org access also verifies the Payment Instruction statuses that are valid.
1460 l_access := check_org_access(c_rec_snap.payment_service_request_id);
1461 IF l_access = 'Y'
1462 THEN
1463 l_need_action := l_need_action + 1;
1464 ELSE
1465 -- For Processing Action.
1466 BEGIN
1467 SELECT 'Y'
1468 INTO l_process_count
1469 FROM dual
1470 WHERE EXISTS
1471 (SELECT 'PROCESSING'
1472 FROM iby_payments_all pmt
1473 WHERE pmt.payment_service_request_id =c_rec_snap.payment_service_request_id
1474 AND pmt.payment_status NOT IN('REMOVED', 'VOID', 'VOID_BY_SETUP', 'VOID_BY_OVERFLOW', 'REMOVED_PAYMENT_STOPPED', 'REMOVED_DOCUMENT_SPOILED', 'REMOVED_INSTRUCTION_TERMINATED',
1475 'REMOVED_REQUEST_TERMINATED', 'ISSUED', 'TRANSMITTED', 'REJECTED')
1476 AND pmt.payments_complete_flag <> 'Y'
1477 AND NOT EXISTS
1478 (SELECT 'NEED_ACTION'
1479 FROM iby_pay_instructions_all inst
1480 WHERE pmt.payment_instruction_id = inst.payment_instruction_id
1481 AND (inst.payment_instruction_status IN('CREATION_ERROR', 'FORMATTED_READY_TO_TRANSMIT', 'TRANSMISSION_FAILED', 'FORMATTED_READY_FOR_PRINTING', 'SUBMITTED_FOR_PRINTING',
1482 'CREATED_READY_FOR_PRINTING', 'CREATED_READY_FOR_FORMATTING', 'FORMATTED', 'CREATED', 'FORMATTED_ELECTRONIC')
1483 OR (inst.payment_instruction_status = 'TRANSMITTED' AND IBY_FD_USER_API_PUB.Is_transmitted_Pmt_Inst_Compl(inst.PAYMENT_INSTRUCTION_ID) = 'N'))
1484 )
1485 );
1486 -- If it comes here then it is in processing status
1487 l_processing := l_processing + 1;
1488 EXCEPTION
1489 WHEN NO_DATA_FOUND THEN
1490 NULL; -- Do Nothing.
1491 WHEN OTHERS THEN
1492 iby_debug_pub.add(debug_msg => 'IBY_UTILITY_PVT.get_psr_snapshot_count :Error in processing count', debug_level => FND_LOG.LEVEL_STATEMENT, module => 'IBY_UTILITY_PVT.get_psr_snapshot_count');
1493 END;
1494 END IF;
1495 /* PAYMENTS_CREATED and it can be in either processing or need action group */
1496 /* IBY Terminated */
1497 ELSIF c_rec_snap.payment_service_request_status IN ('TERMINATED') AND (c_rec_snap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999))THEN
1498 l_terminated := l_terminated + 1;
1499 ELSIF c_rec_snap.payment_service_request_status IS NULL AND (c_rec_snap.status IN('CANCELED', 'CANCELLED NO PAYMENTS'))
1500 AND (c_rec_snap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999)) THEN
1501 l_terminated := l_terminated + 1;
1502 /* IBY Terminated */
1503 /* IBY Errors */
1504 ELSIF c_rec_snap.payment_service_request_status IN ('PENDING_REVIEW_DOC_VAL_ERRORS', 'PENDING_REVIEW_PMT_VAL_ERRORS') AND
1505 (c_rec_snap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999)) THEN
1506 l_errors := l_errors + 1;
1507 /* IBY Errors */
1508 /* IBY Completed */
1509 ELSIF c_rec_snap.payment_service_request_status IN ('PAYMENTS_CREATED','COMPLETED') AND
1510 (c_rec_snap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999)) AND
1511 (AP_PAYMENT_UTIL_PKG.get_payment_status_flag(c_rec_snap.payment_service_request_id) = 'Y') THEN
1512 l_completed := l_completed + 1;
1513 /* IBY Completed */
1514 END IF;
1515 END LOOP;
1516
1517 END IF;
1518 -- dbms_output.put_line('Outputs:: Action::'||l_need_action ||' Processing::'||l_processing||' Terminated::'||l_terminated||' Errors::'||l_errors||' Completed::'|| l_completed);
1519
1520 SELECT l_need_action,l_processing,l_terminated,l_errors,l_completed
1521 INTO l_ret_val
1522 FROM DUAL;
1523 --INSERTING INTO PIPE SO IT CAN BE QUERIED.
1524 PIPE ROW( l_ret_val);
1525 RETURN ;
1526 END get_psr_snapshot_pipe;
1527
1528 FUNCTION check_org_access(
1529 p_payment_service_request_id IN NUMBER)
1530 RETURN VARCHAR2
1531 IS
1532 l_instr_id NUMBER;
1533 l_access VARCHAR2(1);
1534 CURSOR c_org_access
1535 IS
1536 SELECT pmt_all.INSTR_ID,
1537 pmt_all.ORG_ID
1538 FROM
1539 (SELECT DISTINCT pmt.payment_instruction_id INSTR_ID,
1540 pmt.org_id ORG_ID
1541 FROM iby_payments_all pmt,
1542 iby_pay_instructions_all instr
1543 WHERE p_payment_service_request_id = pmt.payment_service_request_id
1544 AND instr.payment_instruction_id = pmt.payment_instruction_id
1545 AND (instr.payment_instruction_status IN ('CREATION_ERROR', 'FORMATTED_READY_TO_TRANSMIT', 'TRANSMISSION_FAILED', 'FORMATTED_READY_FOR_PRINTING',
1546 'SUBMITTED_FOR_PRINTING', 'CREATED_READY_FOR_PRINTING', 'CREATED_READY_FOR_FORMATTING', 'FORMATTED', 'CREATED')
1547 OR (instr.payment_instruction_status = 'TRANSMITTED' AND IBY_FD_USER_API_PUB.Is_transmitted_Pmt_Inst_Compl(instr.PAYMENT_INSTRUCTION_ID) = 'N'))
1548 ) pmt_all;
1549 BEGIN
1550 -- Initialize all variables.
1551 l_instr_id := NULL;
1552 l_access := 'N';
1553 FOR i_org_access IN c_org_access
1554 LOOP
1555 IF l_instr_id IS NOT NULL AND l_access = 'N' THEN
1556 RETURN 'N';
1557 END IF;
1558 l_access := 'Y'; -- Initialize for new instruction
1559 l_instr_id := i_org_access.INSTR_ID;
1560 IF MO_GLOBAL.check_access(i_org_access.ORG_ID) = 'N' THEN
1561 l_access := 'N';
1562 END IF;
1563 END LOOP;
1564
1565 -- Take care of the last instruction here.
1566 IF l_access = 'Y' THEN -- User has access to this last instruction, hence PPR
1567 RETURN 'Y';
1568 ELSE
1569 RETURN 'N';
1570 END IF;
1571 END check_org_access;
1572
1573 FUNCTION Spawn_Random_Card
1574 (p_prefix IN VARCHAR2,
1575 p_card_len IN NUMBER,
1576 p_mod_check IN VARCHAR2
1577 )
1578 RETURN VARCHAR2
1579 IS
1580 l_prefix_len NUMBER ;
1581 l_random_num NUMBER ;
1582 l_random_num_len NUMBER ;
1583 l_digit_sum NUMBER ;
1584 l_digit NUMBER ;
1585 l_ptr NUMBER ;
1586 l_psuedo_num VARCHAR2(30);
1587 BEGIN
1588 l_prefix_len := LENGTH(p_prefix);
1589 IF(l_prefix_len IS NULL) THEN
1590 l_prefix_len := 0;
1591 END IF ;
1592 IF(NVL(p_card_len,0) = 0) THEN
1593 RETURN NULL;
1594 END IF;
1595 IF(l_prefix_len >= p_card_len) THEN
1596 RETURN p_prefix;
1597 END IF;
1598 --test_debug('l_prefix_len: '|| l_prefix_len);
1599 IF (p_mod_check = 'Y') THEN
1600 l_random_num_len := p_card_len-l_prefix_len-1;
1601 ELSE
1602 l_random_num_len := p_card_len-l_prefix_len;
1603 END IF ;
1604 --test_debug('l_random_num_len: '|| l_random_num_len);
1605 --l_random_num := MOD(fnd_crypto.randomnumber, POWER(10,l_random_num_len));
1606 l_random_num := TO_NUMBER(SUBSTR(fnd_crypto.randomnumber,0,l_random_num_len));
1607 --test_debug('l_random_num: '|| l_random_num);
1608 l_psuedo_num := p_prefix || l_random_num;
1609 --test_debug('l_psuedo_num: '|| l_psuedo_num);
1610 IF (NVL(p_mod_check,'N') = 'N') THEN
1611 --test_debug('N -> returning : '|| l_psuedo_num);
1612 RETURN l_psuedo_num;
1613 END IF ;
1614 l_digit_sum := 0;
1615 FOR i IN 1..LENGTH(l_psuedo_num) LOOP
1616 l_ptr := LENGTH(l_psuedo_num) - i + 1;
1617 l_digit := TO_NUMBER(SUBSTR(l_psuedo_num, l_ptr, 1));
1618 --test_debug('l_ptr : '|| l_ptr);
1619 --test_debug('l_digit : '|| l_digit);
1620 IF(MOD(i,2) = 1) THEN
1621 l_digit := l_digit * 2;
1622 END IF ;
1623
1624 CASE l_digit
1625 WHEN 10 THEN l_digit_sum := l_digit_sum + 1;
1626 WHEN 12 THEN l_digit_sum := l_digit_sum + 3;
1627 WHEN 14 THEN l_digit_sum := l_digit_sum + 5;
1628 WHEN 16 THEN l_digit_sum := l_digit_sum + 7;
1629 WHEN 18 THEN l_digit_sum := l_digit_sum + 9;
1630 ELSE l_digit_sum := l_digit_sum + l_digit;
1631 END CASE ;
1632 --test_debug('l_digit_sum : '|| l_digit_sum);
1633 END LOOP ;
1634 l_digit := 10 - TO_NUMBER(SUBSTR(l_digit_sum,-1));
1635 IF(l_digit = 10) THEN l_digit := 0; END IF ;
1636 --test_debug('check digit : '|| l_digit);
1637 l_psuedo_num := l_psuedo_num || l_digit;
1638 RETURN l_psuedo_num;
1639 END Spawn_Random_Card;
1640
1641
1642
1643 -- This function populates psr snapshot PPRs in to GT table
1644 PROCEDURE populate_psr_snapshot_count
1645 IS
1646
1647 BEGIN
1648
1649 -- Deleting all records from GT table
1650 DELETE FROM IBY_PAY_DASHBOARD_GT;
1651 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1652 iby_debug_pub.add(debug_msg => 'Deleted all records from GT table',
1653 debug_level => FND_LOG.LEVEL_STATEMENT,
1654 module => 'IBY_UTILITY_PVT.populate_psr_snapshot_count');
1655 END IF;
1656
1657
1658 -- Inserting PPR's which need Action - 'NEED_ACTION_BY_ME'
1659
1660 INSERT INTO IBY_PAY_DASHBOARD_GT(PAYMENT_SERVICE_REQUEST_ID,
1661 CHECKRUN_ID,
1662 CHECKRUN_NAME,
1663 STATE)
1664 SELECT iby.payment_service_request_id,
1665 null,
1666 iby.CALL_APP_PAY_SERVICE_REQ_CODE,
1667 'NEED_ACTION_BY_ME'
1668 FROM iby_pay_service_requests iby
1669 WHERE iby.calling_app_id = 200
1670 AND iby.process_type = 'STANDARD'
1671 AND iby.payment_service_request_status IN ( 'INFORMATION_REQUIRED', 'PENDING_REVIEW_DOC_VAL_ERRORS', 'PENDING_REVIEW_PMT_VAL_ERRORS', 'PENDING_REVIEW')
1672 UNION
1673 SELECT iby.payment_service_request_id,
1674 null,
1675 iby.CALL_APP_PAY_SERVICE_REQ_CODE,
1676 'NEED_ACTION_BY_ME'
1677 FROM iby_pay_service_requests iby
1678 WHERE iby.calling_app_id = 200
1679 AND iby.process_type = 'STANDARD'
1680 AND iby.payment_service_request_status = 'PAYMENTS_CREATED'
1681 AND EXISTS
1682 (SELECT 'NEED_ACTION_BY_ME'
1683 FROM iby_payments_all pmt
1684 WHERE iby.payment_service_request_id = pmt.payment_service_request_id
1685 AND EXISTS
1686 (SELECT 'NEED_ACTION_BY_ME'
1687 FROM iby_pay_instructions_all instr
1688 WHERE instr.payment_instruction_id = pmt.payment_instruction_id
1689 AND instr.payment_instruction_status IN ('CREATION_ERROR', 'FORMATTED_READY_TO_TRANSMIT', 'TRANSMISSION_FAILED',
1690 'FORMATTED_READY_FOR_PRINTING', 'SUBMITTED_FOR_PRINTING', 'CREATED_READY_FOR_PRINTING',
1691 'CREATED_READY_FOR_FORMATTING', 'FORMATTED', 'CREATED', 'TRANSMITTED')
1692 AND instr.payments_complete_code = 'NO'
1693 AND iby_utility_pvt.check_user_access(instr.payment_instruction_id) = 'Y'
1694 )
1695 );
1696
1697 INSERT INTO IBY_PAY_DASHBOARD_GT(PAYMENT_SERVICE_REQUEST_ID,
1698 CHECKRUN_ID,
1699 CHECKRUN_NAME,
1700 STATE)
1701 SELECT null,
1702 ap.checkrun_id,
1703 ap.checkrun_name,
1704 'NEED_ACTION_BY_ME'
1705 FROM ap_inv_selection_criteria_all ap
1706 WHERE ap.status IN ('REVIEW', 'MISSING RATES' )
1707 AND NOT EXISTS ( SELECT 'NEED_ACTION_BY_ME'
1708 FROM iby_pay_service_requests iby
1709 WHERE iby.calling_app_id = 200
1710 AND iby.call_app_pay_service_req_code =
1711 ap.checkrun_name);
1712
1713 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1714 iby_debug_pub.add(debug_msg => 'Populated Need Action PPRs ',
1715 debug_level => FND_LOG.LEVEL_STATEMENT,
1716 module => 'IBY_UTILITY_PVT.populate_psr_snapshot_count');
1717 END IF;
1718
1719 -- Inserting PPRs which are in Processing Status - 'PROCESSING'
1720 /*Modified the query for the Bug 7560766
1721 Added a condition to identify the PPRs which
1722 are waiting for the user action*/
1723 INSERT INTO IBY_PAY_DASHBOARD_GT(PAYMENT_SERVICE_REQUEST_ID,
1724 CHECKRUN_ID,
1725 CHECKRUN_NAME,
1726 STATE)
1727 SELECT iby.payment_service_request_id,
1728 null,
1729 iby.CALL_APP_PAY_SERVICE_REQ_CODE,
1730 'PROCESSING'
1731 FROM iby_pay_service_requests iby
1732 WHERE iby.calling_app_id = 200
1733 AND iby.process_type = 'STANDARD'
1734 AND
1735 (
1736 iby.payment_service_request_status IN ('INSERTED', 'SUBMITTED',
1737 'ASSIGNMENT_COMPLETE',
1738 'DOCUMENTS_VALIDATED',
1739 'RETRY_DOCUMENT_VALIDATION',
1740 'RETRY_PAYMENT_CREATION')
1741 OR
1742 (
1743 iby.payment_service_request_status IN ('PAYMENTS_CREATED')
1744 AND EXISTS
1745 (SELECT 'PROCESSING'
1746 FROM iby_payments_all pmt
1747 WHERE
1748 pmt.payment_service_request_id = iby.payment_service_request_id
1749 AND pmt.payment_status NOT IN('REMOVED', 'VOID', 'VOID_BY_SETUP', 'VOID_BY_OVERFLOW', 'REMOVED_PAYMENT_STOPPED',
1750 'REMOVED_DOCUMENT_SPOILED', 'REMOVED_INSTRUCTION_TERMINATED', 'REMOVED_REQUEST_TERMINATED', 'ISSUED', 'TRANSMITTED', 'REJECTED',
1751 'FAILED_VALIDATION', 'FAILED_BY_CALLING_APP', 'FAILED_BY_REJECTION_LEVEL')
1752 AND pmt.payments_complete_flag <> 'Y'
1753 AND NOT EXISTS
1754 (SELECT 'NEED_ACTION'
1755 FROM iby_pay_instructions_all inst
1756 WHERE pmt.payment_instruction_id = inst.payment_instruction_id
1757 AND inst.payment_instruction_status IN('CREATION_ERROR',
1758 'FORMATTED_READY_TO_TRANSMIT',
1759 'TRANSMISSION_FAILED',
1760 'FORMATTED_READY_FOR_PRINTING',
1761 'SUBMITTED_FOR_PRINTING',
1762 'CREATED_READY_FOR_PRINTING',
1763 'CREATED_READY_FOR_FORMATTING',
1764 'FORMATTED',
1765 'CREATED',
1766 'FORMATTED_ELECTRONIC'))
1767 )
1768 )
1769 );
1770
1771
1772 INSERT INTO IBY_PAY_DASHBOARD_GT(PAYMENT_SERVICE_REQUEST_ID,
1773 CHECKRUN_ID,
1774 CHECKRUN_NAME,
1775 STATE)
1776 SELECT null,
1777 ap.checkrun_id,
1778 ap.checkrun_name,
1779 'PROCESSING'
1780 FROM ap_inv_selection_criteria_all ap
1781 WHERE ap.status IN ('UNSTARTED', 'SELECTING', 'CANCELING',
1782 'CALCULATING', 'SELECTED')
1783 AND NOT EXISTS ( SELECT 'PROCESSING'
1784 FROM iby_pay_service_requests iby
1785 WHERE iby.calling_app_id = 200
1786 AND iby.call_app_pay_service_req_code =
1787 ap.checkrun_name);
1788
1789 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1790 iby_debug_pub.add(debug_msg => 'Populated Processing PPRs ',
1791 debug_level => FND_LOG.LEVEL_STATEMENT,
1792 module => 'IBY_UTILITY_PVT.populate_psr_snapshot_count');
1793 END IF;
1794
1795 -- Inserting PPRs which are terminated by User --'USER_TERMINATED'
1796 INSERT INTO IBY_PAY_DASHBOARD_GT(PAYMENT_SERVICE_REQUEST_ID,
1797 CHECKRUN_ID,
1798 CHECKRUN_NAME,
1799 STATE)
1800 SELECT null,
1801 ap.checkrun_id,
1802 ap.checkrun_name,
1803 'USER_TERMINATED'
1804 FROM ap_inv_selection_criteria_all ap
1805 WHERE EXISTS ( SELECT 'IBY USER_TERMINATED'
1806 FROM iby_pay_service_requests iby
1807 WHERE iby.calling_app_id = 200
1808 AND iby.call_app_pay_service_req_code =
1809 ap.checkrun_name
1810 AND iby.payment_service_request_status IN
1811 ('TERMINATED'))
1812 AND ap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999);
1813
1814 INSERT INTO IBY_PAY_DASHBOARD_GT(PAYMENT_SERVICE_REQUEST_ID,
1815 CHECKRUN_ID,
1816 CHECKRUN_NAME,
1817 STATE)
1818 SELECT null,
1819 ap.checkrun_id,
1820 ap.checkrun_name,
1821 'USER_TERMINATED'
1822 FROM ap_inv_selection_criteria_all ap
1823 WHERE ap.status IN ('CANCELED', 'CANCELLED NO PAYMENTS')
1824 AND TRUNC(ap.creation_date) =TRUNC(sysdate)
1825 AND NOT EXISTS ( SELECT 'AP USER_TERMINATED'
1826 FROM iby_pay_service_requests iby
1827 WHERE iby.calling_app_id = 200
1828 AND iby.call_app_pay_service_req_code =
1829 ap.checkrun_name)
1830 AND ap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999);
1831
1832 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1833 iby_debug_pub.add(debug_msg => 'Populated User Terminated PPRs ',
1834 debug_level => FND_LOG.LEVEL_STATEMENT,
1835 module => 'IBY_UTILITY_PVT.populate_psr_snapshot_count');
1836 END IF;
1837
1838
1839 -- Inserting PPRs which are halted with Program Errors -'PROGRAM_ERRORS'
1840
1841 INSERT INTO IBY_PAY_DASHBOARD_GT(PAYMENT_SERVICE_REQUEST_ID,
1842 CHECKRUN_ID,
1843 CHECKRUN_NAME,
1844 STATE)
1845 SELECT null,
1846 ap.checkrun_id,
1847 ap.checkrun_name,
1848 'PROGRAM_ERRORS'
1849 FROM ap_inv_selection_criteria_all ap
1850 WHERE EXISTS ( SELECT 'PROGRAM ERRORS'
1851 FROM iby_pay_service_requests iby
1852 WHERE iby.calling_app_id = 200
1853 AND iby.call_app_pay_service_req_code =
1854 ap.checkrun_name
1855 AND iby.payment_service_request_status IN
1856 ('PENDING_REVIEW_DOC_VAL_ERRORS',
1857 'PENDING_REVIEW_PMT_VAL_ERRORS'))
1858 AND ap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999);
1859
1860 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1861 iby_debug_pub.add(debug_msg => 'Populated Program Errors PPRs ',
1862 debug_level => FND_LOG.LEVEL_STATEMENT,
1863 module => 'IBY_UTILITY_PVT.populate_psr_snapshot_count');
1864 END IF;
1865
1866 -- Insert PPRs which are completed - 'COMPLETED'
1867
1868 INSERT INTO IBY_PAY_DASHBOARD_GT(PAYMENT_SERVICE_REQUEST_ID,
1869 CHECKRUN_ID,
1870 CHECKRUN_NAME,
1871 STATE)
1872 SELECT null,
1873 ap.checkrun_id,
1874 ap.checkrun_name,
1875 'COMPLETED'
1876 FROM ap_inv_selection_criteria_all ap
1877 WHERE EXISTS ( SELECT 'COMPLETED'
1878 FROM iby_pay_service_requests iby
1879 WHERE iby.calling_app_id = 200
1880 AND iby.call_app_pay_service_req_code =
1881 ap.checkrun_name
1882 AND iby.payment_service_request_status IN
1883 ('PAYMENTS_CREATED','COMPLETED')
1884 AND AP_PAYMENT_UTIL_PKG.get_payment_status_flag(iby.payment_service_request_id) = 'Y')
1885 AND ap.creation_date BETWEEN TRUNC(SYSDATE) AND (TRUNC(SYSDATE) + 0.99999);
1886
1887 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1888 iby_debug_pub.add(debug_msg => 'Populated Completed PPRs ',
1889 debug_level => FND_LOG.LEVEL_STATEMENT,
1890 module => 'IBY_UTILITY_PVT.populate_psr_snapshot_count');
1891 iby_debug_pub.add(debug_msg => 'Exit: ' || 'IBY_UTILITY_PVT.populate_psr_snapshot_count',
1892 debug_level => FND_LOG.LEVEL_STATEMENT,
1893 module => 'IBY_UTILITY_PVT.populate_psr_snapshot_count');
1894 END IF;
1895
1896 END populate_psr_snapshot_count;
1897
1898 END IBY_UTILITY_PVT;