1 PACKAGE BODY OKS_QA_DATA_INTEGRITY AS
2 /* $Header: OKSRQADB.pls 120.71.12020000.3 2012/07/30 10:53:28 skuchima ship $ */
3
4
5 G_BULK_FETCH_LIMIT CONSTANT NUMBER := 1000;
6
7 /*============================================================================+
8 | Procedure: get_line_number
9 |
10 | Purpose: Given a line id it will return the line number.
11 |
12 | In Parameters: p_cle_id The line id
13 |
14 +============================================================================*/
15 FUNCTION get_line_number
16 (
17 p_cle_id IN NUMBER
18 )
19 RETURN VARCHAR2 IS
20
21 CURSOR l_get_top_line_number_csr (p_line_id NUMBER) IS
22 SELECT line_number, cle_id
23 FROM OKC_K_LINES_B
24 WHERE id = p_line_id;
25
26
27 l_line_num VARCHAR2(150);
28 l_top_line_num VARCHAR2(150);
29 l_cle_id NUMBER;
30
31 BEGIN
32
33 OPEN l_get_top_line_number_csr(p_cle_id);
34 FETCH l_get_top_line_number_csr INTO l_line_num, l_cle_id;
35 CLOSE l_get_top_line_number_csr;
36
37 IF l_cle_id IS NOT NULL THEN
38 OPEN l_get_top_line_number_csr(l_cle_id);
39 FETCH l_get_top_line_number_csr INTO l_top_line_num, l_cle_id;
40 CLOSE l_get_top_line_number_csr;
41 l_line_num := l_top_line_num || '.' || l_line_num;
42 END IF;
43
44
45 IF l_line_num IS NULL THEN
46 RETURN('x');
47 ELSE
48 RETURN(l_line_num);
49 END IF;
50
51 EXCEPTION
52 WHEN OTHERS THEN
53 -- store SQL error message on message stack
54 OKC_API.SET_MESSAGE
55 (
56 p_app_name => G_APP_NAME,
57 p_msg_name => G_UNEXPECTED_ERROR,
58 p_token1 => G_SQLCODE_TOKEN,
59 p_token1_value => SQLCODE,
60 p_token2 => G_SQLERRM_TOKEN,
61 p_token2_value => SQLERRM
62 );
63 -- verify that cursor was closed
64 IF l_get_top_line_number_csr%ISOPEN THEN
65 CLOSE l_get_top_line_number_csr;
66 END IF;
67 RETURN('x');
68
69 END get_line_number;
70
71 /*============================================================================+
72 | Procedure: get_contract_name
73 |
74 | Purpose: Given a contract header id it will return the
75 | <contract number, contract modifier>
76 |
77 | In Parameters: p_chr_id The contract header id
78 |
79 +============================================================================*/
80 FUNCTION get_contract_name
81 (
82 p_chr_id IN NUMBER
83 )
84 RETURN VARCHAR2 IS
85 l_contr_name VARCHAR2(3300);
86
87 CURSOR get_contr_name(l_chr_id NUMBER) IS
88 SELECT contract_number, contract_number_modifier
89 FROM okc_k_headers_all_b WHERE id = p_chr_id;
90 l_contr_num VARCHAR2(120);
91 l_contr_modifier VARCHAR2(120);
92
93 BEGIN
94 OPEN get_contr_name(p_chr_id);
95 FETCH get_contr_name INTO l_contr_num, l_contr_modifier;
96 IF get_contr_name%FOUND THEN
97 l_contr_name := l_contr_num;
98 IF l_contr_modifier IS NOT NULL THEN
99 l_contr_name := l_contr_name || ', ' || l_contr_modifier;
100 END IF;
101 END IF;
102 CLOSE get_contr_name;
103
104 RETURN l_contr_name;
105 EXCEPTION
106 WHEN OTHERS THEN
107 -- store SQL error message on message stack
108 OKC_API.SET_MESSAGE
109 (
110 p_app_name => G_APP_NAME,
111 p_msg_name => G_UNEXPECTED_ERROR,
112 p_token1 => G_SQLCODE_TOKEN,
113 p_token1_value => SQLCODE,
114 p_token2 => G_SQLERRM_TOKEN,
115 p_token2_value => SQLERRM
116 );
117 RETURN 'x';
118 END get_contract_name;
119
120
121
122 /*============================================================================+
123 | Procedure: get_line_name
124 |
125 | Purpose:
126 |
127 | In Parameters: p_cle_id contract line id
128 |
129 +============================================================================*/
130 FUNCTION get_line_name
131 (
132 p_cle_id IN NUMBER
133 )
134 RETURN VARCHAR2 IS
135
136 CURSOR l_chk_cle_csr IS
137 SELECT clev.cle_id, RTRIM(clev.line_number) line_number
138 FROM
139 OKC_K_LINES_V clev
140 WHERE
141 clev.id = p_cle_id;
142
143 CURSOR l_get_top_line_number_csr (p_line_id NUMBER) IS
144 SELECT line_number
145 FROM OKC_K_LINES_B
146 WHERE id = p_line_id;
147
148 CURSOR l_line_name_csr IS
149 SELECT RTRIM(RTRIM(line_number) || ', ' || RTRIM(lsev.name) || ' ' ||
150 RTRIM(clev.name)) "LINE_NAME"
151 FROM OKC_LINE_STYLES_V lsev,
152 OKC_K_LINES_V clev
153 WHERE lsev.id = clev.lse_id
154 AND clev.id = p_cle_id;
155
156 l_line_name_rec l_line_name_csr%ROWTYPE;
157 l_chk_cle_rec l_chk_cle_csr%ROWTYPE;
158 l_line_name VARCHAR2(1000);
159 l_get_top_line_number_rec l_get_top_line_number_csr%ROWTYPE;
160 BEGIN
161
162
163 OPEN l_chk_cle_csr;
164 FETCH l_chk_cle_csr INTO l_chk_cle_rec;
165 IF l_chk_cle_rec.cle_id IS NULL
166 THEN
167 OPEN l_line_name_csr;
168 FETCH l_line_name_csr INTO l_line_name_rec;
169 CLOSE l_line_name_csr;
170
171 l_line_name := l_line_name_rec.line_name;
172
173 ELSE
174 OPEN l_get_top_line_number_csr (l_chk_cle_rec.cle_id);
175 FETCH l_get_top_line_number_csr INTO l_get_top_line_number_rec;
176 CLOSE l_get_top_line_number_csr;
177
178 OPEN l_line_name_csr;
179 FETCH l_line_name_csr INTO l_line_name_rec;
180 CLOSE l_line_name_csr;
181
182 l_line_name := l_get_top_line_number_rec.line_number || '.' || l_line_name_rec.line_name;
183
184 END IF; --IF l_chk_cle_rec.cle_id IS NULL
185
186 CLOSE l_chk_cle_csr;
187
188 IF l_line_name_rec.line_name IS NULL THEN
189 RETURN('No Line Name Found');
190 ELSE
191 RETURN(l_line_name);
192 END IF;
193
194 EXCEPTION
195 WHEN OTHERS THEN
196 -- store SQL error message on message stack
197 OKC_API.SET_MESSAGE
198 (
199 p_app_name => G_APP_NAME,
200 p_msg_name => G_UNEXPECTED_ERROR,
201 p_token1 => G_SQLCODE_TOKEN,
202 p_token1_value => SQLCODE,
203 p_token2 => G_SQLERRM_TOKEN,
204 p_token2_value => SQLERRM
205 );
206 -- verify that cursor was closed
207 IF l_line_name_csr%ISOPEN THEN
208 CLOSE l_line_name_csr;
209 END IF;
210 RETURN('Error getting Line Name');
211 END get_line_name;
212
213 /*============================================================================+
214 | Procedure: get_renewal_status
215 |
216 | Purpose:
217 |
218 | In Parameters: p_chr_id contract id
219 |added for bug 4069048
220
221 +============================================================================*/
222 FUNCTION get_renewal_status
223 (
224 p_chr_id IN NUMBER
225 )RETURN VARCHAR2 IS
226
227
228 CURSOR l_renewal_sts_csr IS
229 SELECT renewal_status
230 FROM
231 OKS_K_HEADERS_B
232 WHERE
233 chr_id = p_chr_id;
234
235 l_renewal_sts VARCHAR2(30);
236 BEGIN
237 OPEN l_renewal_sts_csr;
238 FETCH l_renewal_sts_csr INTO l_renewal_sts;
239 CLOSE l_renewal_sts_csr;
240
241 IF l_renewal_sts IS NULL THEN
242 RETURN '-999';
243 ELSE
244 RETURN l_renewal_sts;
245 END IF;
246 EXCEPTION
247 WHEN OTHERS THEN
248 -- store SQL error message on message stack
249 OKC_API.SET_MESSAGE
250 (
251 p_app_name => G_APP_NAME,
252 p_msg_name => G_UNEXPECTED_ERROR,
253 p_token1 => G_SQLCODE_TOKEN,
254 p_token1_value => SQLCODE,
255 p_token2 => G_SQLERRM_TOKEN,
256 p_token2_value => SQLERRM
257 );
258 -- verify that cursor was closed
259 IF l_renewal_sts_csr%ISOPEN THEN
260 CLOSE l_renewal_sts_csr;
261 END IF;
262
263
264 END get_renewal_status;
265
266
267
268
269 /*============================================================================+
270 | Procedure: Check_PO_Flag
271 |
272 | Purpose: Checks PO flag and number at contract level.
273 | If PO flag is 'Y' then po number is required.
274 |
275 | In Parameters: p_chr_id the contract id
276 | Out Parameters: x_return_status standard return status
277 |
278 +============================================================================*/
279 PROCEDURE Check_PO_Flag
280 (
281 x_return_status OUT NOCOPY VARCHAR2,
282 p_chr_id IN NUMBER
283 )
284 IS
285 -- Gets PO number at contract level.
286 CURSOR get_po IS
287 SELECT CUST_PO_NUMBER_REQ_YN, CUST_PO_NUMBER
288 FROM okc_k_headers_all_b
289 WHERE id = p_chr_id AND CUST_PO_NUMBER_REQ_YN = 'Y';
290
291 l_po_flag VARCHAR2(3);
292 l_po_num VARCHAR2(150);
293 l_null VARCHAR2(200);
294 l_return_status VARCHAR2(1);
295 l_renewal_status VARCHAR2(30);
296
297 BEGIN
298 l_return_status := OKC_API.G_RET_STS_SUCCESS;
299 --adding the following code for Bug#4069048
300 -- get renewal status to see if this is called for Electronic renewal
301 -- if so bypass the PO Number validation
302 l_renewal_status := get_renewal_status(p_chr_id);
303
304 --Bug 4673694 in R12 the renewal status codes have been modified
305 --if nvl(l_renewal_status ,'-99') <> 'QAS' and nvl(l_renewal_status, '-99') <> 'ERN_QA_CHECK_FAIL' then
306 IF nvl(l_renewal_status, '-99') <> 'PEND_PUBLISH' THEN
307
308 -- If PO Flag has been set at contract level then PO number should not be null
309 OPEN get_po;
310 FETCH get_po INTO l_po_flag, l_po_num;
311 IF get_po%FOUND THEN
312 IF l_po_num IS NULL THEN
313 OKC_API.set_message(
314 p_app_name => G_APP_NAME,
315 p_msg_name => G_PO_NUM_REQUIRED
316 );
317 -- notify caller of an error
318 l_return_status := OKC_API.G_RET_STS_ERROR;
319 END IF;
320 END IF;
321 CLOSE get_po;
322 END IF;
323 x_return_status := l_return_status;
324
325
326
327 EXCEPTION
328 WHEN OTHERS THEN
329 -- store SQL error message on message stack
330 OKC_API.SET_MESSAGE
331 (
332 p_app_name => G_APP_NAME,
333 p_msg_name => G_UNEXPECTED_ERROR,
334 p_token1 => G_SQLCODE_TOKEN,
335 p_token1_value => SQLCODE,
336 p_token2 => G_SQLERRM_TOKEN,
337 p_token2_value => SQLERRM
338 );
339 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
340 -- verify that cursor was closed
341 IF get_po%ISOPEN THEN
342 CLOSE get_po;
343 END IF;
344
345 END Check_PO_Flag;
346
347 /*============================================================================+
348 | Procedure: Check_Service_PO_Flag
349 |
350 | Purpose: Checks service PO flag and number.
351 | If service PO flag is 'Y' then service po number is
352 | required.
353 |
354 | In Parameters: p_chr_id the contract id
355 | Out Parameters: x_return_status standard return status
356 |
357 +============================================================================*/
358 PROCEDURE Check_Service_PO_Flag
359 (
360 x_return_status OUT NOCOPY VARCHAR2,
361 p_chr_id IN NUMBER
362 )
363 IS
364
365 -- Gets service PO from SPO rules.
366 CURSOR rules_cur IS
367 SELECT SERVICE_PO_NUMBER sr_po_num, SERVICE_PO_REQUIRED sr_po_flag
368 FROM
369 OKS_K_HEADERS_B
370 WHERE chr_id = p_chr_id;
371
372 l_sr_po_flag VARCHAR2(3);
373 l_sr_po_num VARCHAR2(150);
374 l_null VARCHAR2(200);
375
376 BEGIN
377 x_return_status := OKC_API.G_RET_STS_SUCCESS;
378
379 -- Check if Service PO flag has been set for SPO rule
380 OPEN rules_cur;
381 FETCH rules_cur INTO l_sr_po_num, l_sr_po_flag;
382 CLOSE rules_cur;
383 -- If PO flag is set for renewal then check if the po number has been entered.
384 IF l_sr_po_flag = 'Y' AND l_sr_po_num IS NULL THEN
385 OKC_API.set_message(
386 p_app_name => G_APP_NAME,
387 p_msg_name => G_SERVICE_PO_NUM
388 );
389 -- notify caller of an error
390 x_return_status := OKC_API.G_RET_STS_ERROR;
391 END IF;
392
393
394 EXCEPTION
395 WHEN OTHERS THEN
396 -- store SQL error message on message stack
397 OKC_API.SET_MESSAGE
398 (
399 p_app_name => G_APP_NAME,
400 p_msg_name => G_UNEXPECTED_ERROR,
401 p_token1 => G_SQLCODE_TOKEN,
402 p_token1_value => SQLCODE,
403 p_token2 => G_SQLERRM_TOKEN,
404 p_token2_value => SQLERRM
405 );
406 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
407 END Check_Service_PO_Flag;
408
409 /*============================================================================+
410 | Procedure: Check_Currency_Conv_Type
411 |
412 | Purpose:
413 |
414 | In Parameters: p_chr_id the contract id
415 | Out Parameters: x_return_status standard return status
416 |
417 +============================================================================*/
418 PROCEDURE Check_Currency_Conv_Type
419 (
420 x_return_status OUT NOCOPY VARCHAR2,
421 p_chr_id IN NUMBER
422 )
423 IS
424 to_currency VARCHAR2(30); -- vendor currency code
425 from_currency VARCHAR2(30);
426 l_org_id NUMBER;
427 l_rgp_id NUMBER;
428 l_conversion_type VARCHAR2(30);
429
430 CURSOR get_contract_info IS
431 SELECT currency_code, authoring_org_id
432 FROM okc_k_headers_all_b
433 WHERE id = p_chr_id;
434 -- CVN
435 CURSOR get_rule IS
436 SELECT CONVERSION_TYPE --object1_id1
437 FROM okc_k_headers_all_b
438 WHERE id = p_chr_id;
439
440 BEGIN
441 x_return_status := OKC_API.G_RET_STS_SUCCESS;
442
443 OPEN get_contract_info;
444 FETCH get_contract_info INTO from_currency, l_org_id;
445 CLOSE get_contract_info;
446 to_currency := OKC_CURRENCY_API.GET_OU_CURRENCY (p_ORG_ID => l_org_id);
447
448 IF from_currency <> to_currency THEN
449 OPEN get_rule;
450 FETCH get_rule INTO l_conversion_type;
451 IF get_rule%NOTFOUND THEN
452 OKC_API.set_message(
453 p_app_name => G_APP_NAME,
454 p_msg_name => G_CURR_CONV_REQUIRED
455 );
456 -- notify caller of an error
457 x_return_status := OKC_API.G_RET_STS_ERROR;
458 END IF;
459 CLOSE get_rule;
460 END IF;
461
462 EXCEPTION
463 WHEN OTHERS THEN
464 -- store SQL error message on message stack
465 OKC_API.SET_MESSAGE
466 (
467 p_app_name => G_APP_NAME,
468 p_msg_name => G_UNEXPECTED_ERROR,
469 p_token1 => G_SQLCODE_TOKEN,
470 p_token1_value => SQLCODE,
471 p_token2 => G_SQLERRM_TOKEN,
472 p_token2_value => SQLERRM
473 );
474 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
475 END Check_Currency_Conv_Type;
476
477 /*============================================================================+
478 | Procedure: Check_Price_List_Currency
479 |
480 | Purpose:
481 |
482 | In Parameters: p_chr_id the contract id
483 | Out Parameters: x_return_status standard return status
484 |
485 +============================================================================*/
486
487 -- GCHADHA --
488 -- 28 - OCT - 2004 --
489 -- MULTI CURRENCY PRICE LIST PROJECT --
490 -- VALIDATE THE HEADER AND LINES LEVEL PRICELIST
491 -- IF INVALID THROW THE APPROPRIATE ERROR
492 PROCEDURE Check_Price_List_Currency
493 (
494 x_return_status OUT NOCOPY VARCHAR2,
495 p_chr_id IN NUMBER
496 )
497 IS
498
499 CURSOR get_hdr_info(p_chr_id NUMBER) IS
500 SELECT currency_code, price_list_id, sts_code
501 FROM okc_k_headers_all_b WHERE id = p_chr_id;
502
503 CURSOR get_status(l_sts_code VARCHAR) IS
504 SELECT ste_code
505 FROM okc_statuses_b
506 WHERE ste_code = 'ENTERED' AND code = l_sts_code;
507
508 /*cursor get_price_list(l_price_list_id number) is
509 SELECT CURRENCY_CODE
510 FROM QP_LIST_HEADERS_B
511 WHERE list_type_code IN ('PRL','AGR')
512 AND id1 = l_price_list_id;*/
513
514 CURSOR get_line_info(p_chr_id NUMBER) IS
515 /**
516 SELECT line_number, price_list_id, sts_code
517 FROM okc_k_lines_b WHERE chr_id = p_chr_id
518 AND lse_id IN (1, 12, 46, 19)
519 AND date_cancelled IS NULL ; --Changes [llc]
520 **/
521 --bug 5442886
522 SELECT line_number, price_list_id
523 FROM okc_k_lines_b,
524 okc_statuses_b
525 WHERE chr_id = p_chr_id
526 AND lse_id IN (1,12,46,19)
527 AND ste_code = 'ENTERED'
528 AND code = sts_code
529 AND date_cancelled IS NULL;
530
531 TYPE chr150_tbl_type IS TABLE OF okc_k_lines_b.line_number%TYPE INDEX BY BINARY_INTEGER;
532 TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
533
534 l_line_number_tbl chr150_tbl_type;
535 l_price_list_id_tbl num_tbl_type;
536
537 -- GCHADHA --
538 -- BUG 4048186 --
539
540 CURSOR get_renewal_info(p_chr_id IN NUMBER) IS
541 SELECT RENEWAL_PRICE_LIST FROM OKS_K_HEADERS_B
542 WHERE CHR_ID = p_chr_id;
543
544 l_renewal_price_list_id NUMBER;
545
546 -- END GCHADHA --
547
548 l_price_list_curr VARCHAR2(90);
549 l_currency_code VARCHAR2(30);
550 l_price_list_id NUMBER;
551 l_line_number NUMBER;
552 l_pricing_effective_date DATE;
553 l_validate_result VARCHAR2(1);
554 l_sts_code VARCHAR2(30);
555 l_hdr_ste_code VARCHAR2(30);
556 l_line_ste_code VARCHAR2(30);
557
558 BEGIN
559
560 x_return_status := OKC_API.G_RET_STS_SUCCESS;
561
562 OPEN get_hdr_info(p_chr_id);
563 FETCH get_hdr_info INTO l_currency_code, l_price_list_id, l_sts_code;
564 CLOSE get_hdr_info;
565
566 OPEN get_status(l_sts_code);
567 FETCH get_status INTO l_hdr_ste_code;
568 CLOSE get_status;
569 /*Open get_price_list(l_price_list_id);
570 Fetch get_price_list into l_price_list_curr;
571 Close get_price_list; */
572
573 -- Check for hdr level pricelist only for entered status contracts.
574 IF l_hdr_ste_code = 'ENTERED' THEN
575 QP_UTIL_PUB.Validate_Price_list_Curr_code(
576 l_price_list_id => l_price_list_id
577 , l_currency_code => l_currency_code
578 , l_pricing_effective_date => l_pricing_effective_date
579 , l_validate_result => l_validate_result);
580
581
582
583
584 IF UPPER(nvl(l_validate_result, 'N')) <> 'Y' THEN
585 -- Throw error in check list
586 OKC_API.set_message(
587 p_app_name => G_APP_NAME,
588 p_msg_name => G_PRICE_LIST_CURR_H -- MSG FOR INVALID PL AT HDR
589 );
590 -- notify caller of an error
591 x_return_status := OKC_API.G_RET_STS_ERROR;
592 END IF;
593
594
595 -- CHECK RENEWAL PRICE LIST --
596 OPEN get_renewal_info(p_chr_id);
597 FETCH get_renewal_info INTO l_renewal_price_list_id;
598 CLOSE get_renewal_info;
599
600 IF NVL(l_renewal_price_list_id, - 99) <> - 99 THEN
601
602 QP_UTIL_PUB.Validate_Price_list_Curr_code(
603 l_price_list_id => l_renewal_price_list_id
604 , l_currency_code => l_currency_code
605 , l_pricing_effective_date => l_pricing_effective_date
606 , l_validate_result => l_validate_result);
607
608 IF UPPER(nvl(l_validate_result, 'N')) <> 'Y' THEN
609 -- Throw error in check list
610 OKC_API.set_message(
611 p_app_name => G_APP_NAME,
612 p_msg_name => G_PRICE_LIST_CURR_R -- MSG FOR INVALID PL FOR RENEWAL
613 );
614 -- notify caller of an error
615 x_return_status := OKC_API.G_RET_STS_ERROR;
616 END IF;
617 END IF ; -- IF NVL(l_renwal_price_list_id, -99) <> -99 THEN
618 END IF; -- If l_hdr_ste_code = 'ENTERED'
619
620
621 -- CHECK FOR LINES --
622 /**
623 FOR CUR_REC IN get_line_info(p_chr_id) LOOP
624
625 OPEN get_status(cur_rec.sts_code);
626 FETCH get_status INTO l_line_ste_code;
627 IF get_status%FOUND THEN
628 l_price_list_id := cur_rec.price_list_id;
629 l_line_number := cur_rec.line_number;
630
631 QP_UTIL_PUB.Validate_Price_list_Curr_code(
632 l_price_list_id => l_price_list_id
633 , l_currency_code => l_currency_code
634 , l_pricing_effective_date => l_pricing_effective_date
635 , l_validate_result => l_validate_result);
636
637 IF UPPER(nvl(l_validate_result, 'N')) <> 'Y' THEN
638 -- Throw error in check list
639 OKC_API.set_message(
640 p_app_name => G_APP_NAME,
641 p_msg_name => G_PRICE_LIST_CURR_L, -- MSG FOR INVALID PL AT LINES
642 p_token1 => 'TOKEN1',
643 p_token1_value => l_line_number
644 );
645 x_return_status := OKC_API.G_RET_STS_ERROR;
646 END IF;
647 END IF;
648 CLOSE get_status;
649
650 END LOOP;
651 **/
652
653
654 --bug 5442886
655 OPEN get_line_info(p_chr_id);
656 LOOP
657
658 FETCH get_line_info BULK COLLECT INTO l_line_number_tbl, l_price_list_id_tbl LIMIT G_BULK_FETCH_LIMIT;
659
660 EXIT WHEN (l_line_number_tbl.count = 0);
661
662 FOR i IN l_line_number_tbl.FIRST..l_line_number_tbl.LAST LOOP
663
664 QP_UTIL_PUB.Validate_Price_list_Curr_code(
665 l_price_list_id => l_price_list_id_tbl(i)
666 ,l_currency_code => l_currency_code
667 ,l_pricing_effective_date => l_pricing_effective_date
668 ,l_validate_result => l_validate_result);
669
670 If UPPER(nvl(l_validate_result,'N')) <> 'Y' THEN
671 -- Throw error in check list
672 OKC_API.set_message(
673 p_app_name => G_APP_NAME,
674 p_msg_name => G_PRICE_LIST_CURR_L,-- MSG FOR INVALID PL AT LINES
675 p_token1 => 'TOKEN1',
676 p_token1_value => l_line_number_tbl(i)
677 );
678 x_return_status := OKC_API.G_RET_STS_ERROR;
679 End If;
680
681 END LOOP;
682
683 END LOOP;
684 CLOSE get_line_info;
685
686 EXCEPTION
687 WHEN OTHERS THEN
688 -- store SQL error message on message stack
689 OKC_API.SET_MESSAGE
690 (
691 p_app_name => G_APP_NAME,
692 p_msg_name => G_UNEXPECTED_ERROR,
693 p_token1 => G_SQLCODE_TOKEN,
694 p_token1_value => SQLCODE,
695 p_token2 => G_SQLERRM_TOKEN,
696 p_token2_value => SQLERRM
697 );
698 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
699 END Check_Price_List_Currency;
700
701 /*============================================================================+
702 | Procedure: Check_Inv_Trx
703 |
704 | Purpose:
705 |
706 | In Parameters: p_chr_id the contract id
707 | Out Parameters: x_return_status standard return status
708 |
709 +============================================================================*/
710 PROCEDURE Check_Inv_Trx
711 (
712 x_return_status OUT NOCOPY VARCHAR2,
713 p_chr_id IN NUMBER
714 )
715 IS
716
717 CURSOR ORG_CUR IS
718 SELECT authoring_org_id
719 FROM okc_k_headers_all_b
720 WHERE id = p_chr_id;
721
722 CURSOR TAX_METHOD_CUR(p_org_id NUMBER) IS
723 SELECT tax_method_code
724 FROM zx_product_options_all
725 WHERE org_id = p_org_id
726 AND application_id = 222;
727
728
729 l_org_id NUMBER;
730 l_tax_method zx_product_options_all.tax_method_code%TYPE;
731 l_inv_trx_type oks_k_headers_b.inv_trx_type%TYPE;
732 l_api_name CONSTANT VARCHAR2(30) := 'Check_Inv_Trx';
733 l_mod_name VARCHAR2(256) := G_APP_NAME || '.PLSQL.' || G_PKG_NAME || '.' || l_api_name;
734
735 BEGIN
736 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
737 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, l_mod_name,'Entering: '|| l_api_name);
738 END IF;
739
740 x_return_status := OKC_API.G_RET_STS_SUCCESS;
741
742 OPEN ORG_CUR;
743 FETCH ORG_CUR INTO l_org_id;
744 CLOSE ORG_CUR;
745
746 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
747 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_org_id: '|| l_org_id);
748 END IF;
749
750 OPEN TAX_METHOD_CUR(l_org_id);
751 FETCH TAX_METHOD_CUR INTO l_tax_method;
752 CLOSE TAX_METHOD_CUR;
753
754 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
755 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_tax_method: '|| l_tax_method);
756 END IF;
757
758 IF l_tax_method = 'LTE' THEN
759 SELECT inv_trx_type INTO l_inv_trx_type
760 FROM oks_k_headers_b
761 WHERE id = p_chr_id;
762
763 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
764 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'latin tax, l_inv_trx_type: '|| l_inv_trx_type);
765 END IF;
766
767 IF l_inv_trx_type IS NULL THEN
768 OKC_API.set_message(
769 p_app_name => G_APP_NAME,
770 p_msg_name => 'OKS_INV_TRX_TYPE_REQUIRED');
771 END IF;
772 END IF;
773
774 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
775 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, l_mod_name,'Leaving: '|| l_api_name);
776 END IF;
777
778 EXCEPTION
779 WHEN OTHERS THEN
780 IF (FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
781 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, l_mod_name,'Exception OTHERS, SQLCODE: '|| SQLCODE ||' SQLERRM:'|| SQLERRM);
782 END IF;
783
784 IF ORG_CUR%ISOPEN THEN
785 CLOSE ORG_CUR;
786 END IF;
787
788 IF TAX_METHOD_CUR%ISOPEN THEN
789 CLOSE TAX_METHOD_CUR;
790 END IF;
791 -- store SQL error message on message stack
792 OKC_API.SET_MESSAGE
793 (
794 p_app_name => G_APP_NAME,
795 p_msg_name => G_UNEXPECTED_ERROR,
796 p_token1 => G_SQLCODE_TOKEN,
797 p_token1_value => SQLCODE,
798 p_token2 => G_SQLERRM_TOKEN,
799 p_token2_value => SQLERRM
800 );
801 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
802 END Check_Inv_Trx;
803
804
805
806
807
808 /*============================================================================+
809 | Procedure: check_required_values
810 |
811 | Purpose:
812 |
813 | In Parameters: p_chr_id the contract id
814 | Out Parameters: x_return_status standard return status
815 |
816 +============================================================================*/
817 PROCEDURE check_required_values
818 (
819 x_return_status OUT NOCOPY VARCHAR2,
820 p_chr_id IN NUMBER
821 )
822 IS
823 l_return_status VARCHAR2(1);
824
825 BEGIN
826 -- initialize return status
827 x_return_status := OKC_API.G_RET_STS_SUCCESS;
828
829 check_req_values
830 (
831 x_return_status => l_return_status,
832 p_chr_id => p_chr_id
833 );
834
835 IF l_return_status = OKC_API.G_RET_STS_ERROR THEN
836 x_return_status := l_return_status;
837 END IF;
838
839
840 Check_PO_Flag
841 (
842 x_return_status => l_return_status,
843 p_chr_id => p_chr_id
844 );
845
846 IF l_return_status = OKC_API.G_RET_STS_ERROR THEN
847 x_return_status := l_return_status;
848 END IF;
849
850 Check_Service_PO_Flag
851 (
852 x_return_status => l_return_status,
853 p_chr_id => p_chr_id
854 );
855
856 IF l_return_status = OKC_API.G_RET_STS_ERROR THEN
857 x_return_status := l_return_status;
858 END IF;
859
860 Check_Currency_Conv_Type
861 (
862 x_return_status => l_return_status,
863 p_chr_id => p_chr_id
864 );
865 IF l_return_status = OKC_API.G_RET_STS_ERROR THEN
866 x_return_status := l_return_status;
867 END IF;
868
869 Check_Price_List_Currency
870 (
871 x_return_status => l_return_status,
872 p_chr_id => p_chr_id
873 );
874 IF l_return_status = OKC_API.G_RET_STS_ERROR THEN
875 x_return_status := l_return_status;
876 END IF;
877
878 --Begin: Added for R12 eBTax
879 Check_Inv_Trx
880 (
881 x_return_status => l_return_status,
882 p_chr_id => p_chr_id
883 );
884 IF l_return_status = OKC_API.G_RET_STS_ERROR THEN
885 x_return_status := l_return_status;
886 END IF;
887 --End: Added for R12 eBTax
888
889
890
891 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
892 OKC_API.set_message(
893 p_app_name => G_APP_NAME,
894 p_msg_name => 'OKS_QA_SUCCESS');
895 END IF;
896
897 EXCEPTION
898 WHEN G_EXCEPTION_HALT_VALIDATION THEN
899 -- no processing necessary; validation can continue with next column
900 NULL;
901 WHEN OTHERS THEN
902 -- store SQL error message on message stack
903 OKC_API.SET_MESSAGE
904 (
905 p_app_name => G_APP_NAME,
906 p_msg_name => G_UNEXPECTED_ERROR,
907 p_token1 => G_SQLCODE_TOKEN,
908 p_token1_value => SQLCODE,
909 p_token2 => G_SQLERRM_TOKEN,
910 p_token2_value => SQLERRM
911 );
912 -- notify caller of an error as UNEXPETED error
913 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
914 -- verify that cursor was closed
915 END check_required_values;
916
917
918 PROCEDURE Check_Counter_base_reading
919 (
920 p_chr_id IN NUMBER,
921 X_return_status OUT NOCOPY VARCHAR2
922 )
923 IS
924
925 BEGIN
926 -- initialize return status
927 x_return_status := OKC_API.G_RET_STS_SUCCESS;
928 NULL;
929 -- code taken out.
930 EXCEPTION
931 WHEN G_EXCEPTION_HALT_VALIDATION THEN
932 -- no processing necessary; validation can continue with next column
933 NULL;
934 WHEN OTHERS THEN
935 -- store SQL error message on message stack
936 OKC_API.SET_MESSAGE(
937 p_app_name => G_APP_NAME,
938 p_msg_name => G_UNEXPECTED_ERROR,
939 p_token1 => G_SQLCODE_TOKEN,
940 p_token1_value => SQLCODE,
941 p_token2 => G_SQLERRM_TOKEN,
942 p_token2_value => SQLERRM);
943 -- notify caller of an error as UNEXPETED error
944 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
945
946
947 END;
948
949 /*============================================================================+
950 | Procedure: val_credit_card
951 |
952 | Purpose: function to validate credit card - Hari 02/14/2001
953 | Returns 0' failure, 1' success
954 |
955 | In Parameters: p_chr_id the contract id
956 | Out Parameters: x_return_status standard return status
957 |
958 +============================================================================*/
959 FUNCTION val_credit_card (
960 p_cc_num_stripped IN VARCHAR2
961 ) RETURN NUMBER IS
962
963 l_stripped_num_table numeric_tab_typ; /* Holds credit card number stripped of white spaces */
964 l_product_table numeric_tab_typ; /* Table of cc digits multiplied by 2 or 1,for validity check */
965 l_len_credit_card_num NUMBER := 0; /* Length of credit card number stripped of white spaces */
966 l_product_tab_sum NUMBER := 0; /* Sum of digits in product table */
967 l_actual_cc_check_digit NUMBER := 0; /* First digit of credit card, numbered from right to left */
968 l_mod10_check_digit NUMBER := 0; /* Check digit after mod10 algorithm is applied */
969 j NUMBER := 0; /* Product table index */
970
971 BEGIN
972
973 SELECT length(p_cc_num_stripped)
974 INTO l_len_credit_card_num
975 FROM dual;
976
977 FOR i IN 1..l_len_credit_card_num LOOP
978 SELECT to_number(substr(p_cc_num_stripped, i, 1))
979 INTO l_stripped_num_table(i)
980 FROM dual;
981 END LOOP;
982 l_actual_cc_check_digit := l_stripped_num_table(l_len_credit_card_num);
983
984 FOR i IN 1..l_len_credit_card_num - 1 LOOP
985 IF (MOD(l_len_credit_card_num + 1 - i, 2) > 0 )
986 THEN
987 -- Odd numbered digit. Store as is, in the product table.
988 j := j + 1;
989 l_product_table(j) := l_stripped_num_table(i);
990 ELSE
991 -- Even numbered digit. Multiply digit by 2 and store in the product table.
992 -- Numbers beyond 5 result in 2 digits when multiplied by 2. So handled seperately.
993 IF (l_stripped_num_table(i) >= 5)
994 THEN
995 j := j + 1;
996 l_product_table(j) := 1;
997 j := j + 1;
998 l_product_table(j) := (l_stripped_num_table(i) - 5) * 2;
999 ELSE
1000 j := j + 1;
1001 l_product_table(j) := l_stripped_num_table(i) * 2;
1002 END IF;
1003 END IF;
1004 END LOOP;
1005
1006 -- Sum up the product table's digits
1007 FOR k IN 1..j LOOP
1008 l_product_tab_sum := l_product_tab_sum + l_product_table(k);
1009 END LOOP;
1010
1011 l_mod10_check_digit := MOD((10 - MOD(l_product_tab_sum, 10)), 10);
1012
1013 -- If actual check digit and check_digit after mod10 don't match, the credit card is an invalid one.
1014 IF (l_mod10_check_digit <> l_actual_cc_check_digit)
1015 THEN
1016 RETURN(0);
1017 ELSE
1018 RETURN(1);
1019 END IF;
1020
1021 EXCEPTION
1022 WHEN OTHERS THEN
1023 RAISE;
1024
1025 END val_credit_card;
1026
1027 /*============================================================================+
1028 | Procedure: check_overlap
1029 |
1030 | Purpose: Helper procedure. Get's called inside of
1031 | check_covlvl_Overlap. Checks if the current contract
1032 | has covered lines which dates over lap with the
1033 | covered lines of an existing contract. The existing
1034 | contract should not be cancelled, terminated or expired.
1035 |
1036 | In Parameters: p_chr_id the contract id
1037 | Out Parameters: x_return_status standard return status
1038 |
1039 +============================================================================*/
1040 PROCEDURE check_overlap
1041 (
1042 x_return_status OUT NOCOPY VARCHAR2,
1043 p_cle_id IN NUMBER,
1044 p_lty_code IN VARCHAR2,
1045 p_jtot_object1_code IN VARCHAR2,
1046 p_object1_id1 IN VARCHAR2,
1047 p_object1_id2 IN VARCHAR2,
1048 p_start_date IN DATE,
1049 p_end_date IN DATE
1050 ) IS
1051
1052 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
1053 l_dummy VARCHAR2(1) := '?';
1054 l_count NUMBER := 0;
1055
1056 CURSOR l_chr_csr IS
1057 SELECT chdr.contract_number
1058 , cle.id
1059 , chdr.contract_number_modifier
1060 FROM okc_k_headers_all_b chdr,
1061 OKC_K_ITEMS cim,
1062 OKC_LINE_STYLES_V lse,
1063 OKC_K_LINES_B cle,
1064 OKC_STATUSES_B sts
1065 WHERE chdr.id = cle.dnz_chr_id
1066 AND object1_id1 = p_object1_id1
1067 AND object1_id2 = p_object1_id2
1068 AND jtot_object1_code = p_jtot_object1_code
1069 AND cim.cle_id = cle.id
1070 AND (p_start_date BETWEEN cle.start_date
1071 AND NVL(cle.date_terminated, cle.end_date)
1072 OR p_end_date BETWEEN cle.start_date
1073 AND NVL(cle.date_terminated, cle.end_date)
1074 OR (p_start_date < cle.start_date
1075 AND p_end_date > cle.start_date ))
1076 AND lse.lty_code = p_lty_code
1077 AND lse.id = cle.lse_id
1078 AND cle.id <> p_cle_id
1079 AND nvl(cle.date_terminated, SYSDATE + 1) > SYSDATE -- added condition for bug # 3646108
1080 AND sts.code = chdr.sts_code
1081 AND sts.ste_code NOT IN ('CANCELLED', 'TERMINATED', 'EXPIRED')
1082 AND cle.date_cancelled IS NULL -- Changes [llc]
1083 ;
1084
1085 l_chr_rec l_chr_csr%ROWTYPE;
1086
1087 l_contr_num_list VARCHAR2(32000);
1088 l_contr_num VARCHAR2(120);
1089 l_count_contr NUMBER := 0;
1090
1091 BEGIN
1092
1093 -- initialize return status
1094 x_return_status := OKC_API.G_RET_STS_SUCCESS;
1095
1096 -- Find Coverage Overlap
1097 OPEN l_chr_csr;
1098 LOOP
1099 FETCH l_chr_csr INTO l_chr_rec;
1100 EXIT WHEN l_chr_csr%NOTFOUND;
1101 x_return_status := OKC_API.G_RET_STS_ERROR;
1102 l_contr_num := l_chr_rec.contract_number || '(' || get_line_name(l_chr_rec.id) || ')';
1103
1104 IF l_contr_num_list IS NULL THEN
1105 l_contr_num_list := l_contr_num;
1106 ELSE
1107 l_contr_num_list := l_contr_num_list || ', ' || l_contr_num;
1108 END IF;
1109 l_count_contr := l_count_contr + 1;
1110
1111 IF l_count_contr = 50 OR length(l_contr_num_list) > 30000 THEN
1112 OKC_API.set_message
1113 (
1114 p_app_name => 'OKS',
1115 p_msg_name => G_COVERAGE_OVERLAP_LIST,
1116 p_token1 => 'LINE_NAME',
1117 p_token1_value => get_line_name(p_cle_id),
1118 p_token2 => 'CONTRACT_NUMBER',
1119 p_token2_value => l_contr_num_list
1120 );
1121 l_contr_num_list := NULL;
1122 l_count_contr := 0;
1123 END IF;
1124 /*
1125 OKC_API.set_message
1126 (
1127 p_app_name => 'OKS',
1128 p_msg_name => G_COVERAGE_OVERLAP,
1129 p_token1 => 'LINE_NAME',
1130 p_token1_value => get_line_name(p_cle_id),
1131 p_token2 => 'CONTRACT_NUMBER',
1132 p_token2_value => l_chr_rec.contract_number,
1133 p_token3 => 'CONTRACT_MODIFIER',
1134 p_token3_value => l_chr_rec.contract_number_modifier,
1135 p_token4 => 'LINE_NAME1',
1136 p_token4_value => get_line_name(l_chr_rec.id));
1137 */
1138 END LOOP;
1139 CLOSE l_chr_csr;
1140 IF l_contr_num_list IS NOT NULL AND l_count_contr > 0 THEN
1141 OKC_API.set_message
1142 (
1143 p_app_name => 'OKS',
1144 p_msg_name => G_COVERAGE_OVERLAP_LIST,
1145 p_token1 => 'LINE_NAME',
1146 p_token1_value => get_line_name(p_cle_id),
1147 p_token2 => 'CONTRACT_NUMBER',
1148 p_token2_value => l_contr_num_list
1149 );
1150 END IF;
1151
1152 EXCEPTION
1153 WHEN G_EXCEPTION_HALT_VALIDATION THEN
1154 -- no processing necessary; validation can continue with next column
1155 NULL;
1156 WHEN OTHERS THEN
1157 -- store SQL error message on message stack
1158 OKC_API.SET_MESSAGE(
1159 p_app_name => G_APP_NAME,
1160 p_msg_name => G_UNEXPECTED_ERROR,
1161 p_token1 => G_SQLCODE_TOKEN,
1162 p_token1_value => SQLCODE,
1163 p_token2 => G_SQLERRM_TOKEN,
1164 p_token2_value => SQLERRM);
1165 -- notify caller of an error as UNEXPETED error
1166 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1167 -- verify that cursor was closed
1168 IF l_chr_csr%ISOPEN THEN
1169 CLOSE l_chr_csr;
1170 END IF;
1171 END check_overlap;
1172
1173 /*cgopinee code fix for bug 8361496*/
1174
1175 /*============================================================================+
1176 | Procedure: check_curr_conv_date
1177 |
1178 | Purpose: Check if the currency conversion date falls within
1179 | contract's header effectivity.
1180 |
1181 | In Parameters: p_chr_id the contract id
1182 | Out Parameters: x_return_status standard return status
1183 |
1184 +============================================================================*/
1185 PROCEDURE check_curr_conv_date
1186 (
1187 x_return_status OUT NOCOPY VARCHAR2,
1188 p_chr_id IN NUMBER
1189 ) IS
1190
1191 l_api_name CONSTANT VARCHAR2(30) := 'check_curr_conv_date';
1192 l_invalid VARCHAR2(1) := 'N';
1193
1194 CURSOR c_conv_date IS
1195 SELECT 'Y'
1196 FROM okc_k_headers_all_b
1197 WHERE id = p_chr_id
1198 AND conversion_type IS NOT NULL
1199 AND conversion_rate_date NOT BETWEEN start_date AND end_date;
1200
1201 BEGIN
1202
1203 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1204 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name,'Entering '|| G_PKG_NAME || '.' || l_api_name);
1205 END IF;
1206
1207 -- initialize return status
1208 x_return_status := OKC_API.G_RET_STS_SUCCESS;
1209
1210 OPEN c_conv_date;
1211 FETCH c_conv_date INTO l_invalid;
1212 CLOSE c_conv_date;
1213
1214 IF l_invalid = 'Y' THEN
1215
1216 x_return_status := OKC_API.G_RET_STS_ERROR;
1217 OKC_API.set_message(
1218 p_app_name => G_APP_NAME,
1219 p_msg_name => 'OKS_INV_CURR_CONV_DATE');
1220
1221 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1222 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name,'Currency conversion date is not within header effectivity');
1223 END IF;
1224
1225 END IF;
1226
1227 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
1228 OKC_API.set_message(
1229 p_app_name => G_APP_NAME,
1230 p_msg_name => 'OKS_QA_SUCCESS');
1231 END IF;
1232 END;
1233
1234 /*cgopinee end of bug fix*/
1235
1236 /*============================================================================+
1237 | Procedure: check_covlvl_Overlap
1238 |
1239 | Purpose: Calls the helper procedure check_overlap to
1240 | checks if the current contract has covered lines which
1241 | dates over lap with the covered lines of an existing
1242 | contract. The existing contract should not be
1243 | cancelled, terminated or expired.
1244 |
1245 | In Parameters: p_chr_id the contract id
1246 | Out Parameters: x_return_status standard return status
1247 |
1248 +============================================================================*/
1249 PROCEDURE check_covlvl_Overlap
1250 (
1251 x_return_status OUT NOCOPY VARCHAR2,
1252 p_chr_id IN NUMBER
1253 ) IS
1254
1255 /***
1256 Bug 4767013: commented out
1257 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
1258 l_dummy VARCHAR2(1) := '?';
1259 l_count NUMBER := 0;
1260
1261 CURSOR l_cle_csr IS
1262 SELECT cle.id
1263 , lse.lty_code
1264 , cle.name
1265 , cle.start_date
1266 , cle.end_date
1267 , cim.jtot_object1_code
1268 , cim.object1_id1
1269 , cim.object1_id2
1270 FROM OKC_K_ITEMS cim,
1271 OKC_LINE_STYLES_B lse,
1272 OKC_K_LINES_V cle
1273 WHERE cim.cle_id = cle.id
1274 and lse.id = cle.lse_id
1275 and cle.chr_id = p_chr_id
1276 and cle.date_cancelled is null --Changes [llc]
1277 ;
1278
1279
1280 l_cle_rec l_cle_csr%ROWTYPE;
1281
1282 CURSOR l_cve_csr (p_cle_id NUMBER) IS
1283 SELECT cle.id
1284 ,cle.PRICE_NEGOTIATED
1285 , cle.name
1286 , cle.start_date
1287 , cle.end_date
1288 , lse.lty_code
1289 , cim.jtot_object1_code
1290 , cim.object1_id1
1291 , cim.object1_id2
1292 , cle.date_terminated
1293 FROM OKC_K_ITEMS cim,
1294 OKC_LINE_STYLES_B lse,
1295 OKC_K_LINES_V cle
1296 WHERE cim.cle_id = cle.id
1297 AND lse.LTY_CODE IN
1298 ('COVER_CUST', 'COVER_ITEM', 'COVER_PROD',
1299 'COVER_PTY', 'COVER_SITE', 'COVER_SYS','INST_CTR')
1300 AND lse.id = cle.lse_id
1301 AND cle.cle_id = p_cle_id
1302 AND nvl(cle.date_terminated, sysdate+1) > sysdate -- added condition for bug # 3646108
1303 AND cle.date_cancelled is null; --Changes [llc]
1304
1305 l_cve_rec l_cve_csr%ROWTYPE;
1306 ***/
1307
1308 l_api_name CONSTANT VARCHAR2(30) := 'check_covlvl_Overlap';
1309
1310 TYPE chr120_tbl_type IS TABLE OF okc_k_headers_all_b.contract_number%TYPE INDEX BY BINARY_INTEGER;
1311 TYPE chr640_tbl_type IS TABLE OF VARCHAR2(640) INDEX BY BINARY_INTEGER;
1312 TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
1313
1314 CURSOR c_chk_overlap(cp_chr_id IN NUMBER, cp_date IN DATE) IS
1315 SELECT trgh.contract_number, nvl(trgh.contract_number_modifier, OKC_API.G_MISS_CHAR),
1316 nvl(rtrim(trgtl.line_number) || '.' || RTRIM(trgsl.line_number) ||', '|| RTRIM(trgst.name) ||' '|| RTRIM(trgsl.name), OKC_API.G_MISS_CHAR) trg_name,
1317 nvl(rtrim(srctl.line_number) || '.' || RTRIM(srcsl.line_number) ||', '|| RTRIM(srcst.name) ||' '|| RTRIM(srcsl.name), OKC_API.G_MISS_CHAR) src_name,
1318 srcsl.id srcsl_id
1319 FROM okc_k_headers_all_b trgh,
1320 okc_k_lines_v trgsl,
1321 okc_k_items trgi,
1322 okc_k_lines_b trgtl,
1323 okc_line_styles_v trgst,
1324 okc_k_lines_v srcsl,
1325 okc_k_items srci,
1326 okc_k_lines_b srctl,
1327 okc_line_styles_v srcst,
1328 okc_statuses_b sts
1329 WHERE srcsl.dnz_chr_id = cp_chr_id
1330 AND srcsl.lse_id IN (7, 8, 9, 10, 11, 35, 13, 18, 25)
1331 AND nvl(srcsl.date_terminated, cp_date + 1) > cp_date
1332 AND srci.cle_id = srcsl.id
1333 AND srcst.id = srcsl.lse_id
1334 AND srctl.id = srcsl.cle_id
1335 AND trgi.object1_id1 = srci.object1_id1
1336 AND trgi.jtot_object1_code = srci.jtot_object1_code
1337 AND trgi.object1_id2 = srci.object1_id2
1338 AND trgsl.id = trgi.cle_id
1339 AND trgsl.id <> srcsl.id
1340 AND nvl(trgsl.date_terminated, cp_date + 1) > cp_date
1341 AND (
1342 (srcsl.start_date BETWEEN trgsl.start_date
1343 AND nvl(trgsl.date_terminated, trgsl.end_date))
1344 OR (nvl(srcsl.date_terminated, srcsl.end_date) BETWEEN trgsl.start_date
1345 AND nvl(trgsl.date_terminated, trgsl.end_date))
1346 OR (srcsl.start_date < trgsl.start_date
1347 AND nvl(srcsl.date_terminated, srcsl.end_date) > trgsl.start_date)
1348 )
1349 AND nvl(trgsl.date_terminated, trgsl.end_date) <> trgsl.start_date/*Bugfix 6040062-FP of 6013613*/
1350 AND trgst.id = trgsl.lse_id
1351 AND trgtl.id = trgsl.cle_id
1352 AND trgh.id = trgsl.dnz_chr_id
1353 AND sts.code = trgh.sts_code
1354 AND sts.ste_code NOT IN ('CANCELLED', 'TERMINATED', 'EXPIRED')
1355 AND trgsl.date_cancelled IS NULL -- Changes [llc]
1356 ORDER BY srcsl.id; -- note: each time the source subline changes, we dump the warning/error messages for the previous line
1357 -- that is why we need this ORDER BY here to avoid unnessarily large number of messages
1358 -- also, since the cursor looks at only those sublines with overlapping coverages, that number is not
1359 -- expected to be large so the performance overhead of the ORDER BY should be minimal
1360
1361
1362
1363 l_date DATE;
1364 l_k_num_tbl chr120_tbl_type;
1365 l_k_mod_tbl chr120_tbl_type;
1366 l_src_name_tbl chr640_tbl_type;
1367 l_src_name VARCHAR2(640);
1368 l_srcsl_id_tbl num_tbl_type;
1369 l_trg_name_tbl chr640_tbl_type;
1370
1371
1372 l_contr_num_list VARCHAR2(32000);
1373 l_contr_num VARCHAR2(120);
1374 l_count_contr NUMBER := 0;
1375
1376 BEGIN
1377
1378 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1379 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name,'Entering '|| G_PKG_NAME || '.' || l_api_name);
1380 END IF;
1381
1382 -- initialize return status
1383 x_return_status := OKC_API.G_RET_STS_SUCCESS;
1384 l_date := SYSDATE;
1385
1386 OPEN c_chk_overlap(p_chr_id, l_date);
1387 LOOP
1388 FETCH c_chk_overlap BULK COLLECT INTO l_k_num_tbl, l_k_mod_tbl,
1389 l_trg_name_tbl, l_src_name_tbl, l_srcsl_id_tbl LIMIT G_BULK_FETCH_LIMIT;
1390
1391 EXIT WHEN (l_k_num_tbl.COUNT = 0);
1392
1393 FOR i IN l_k_num_tbl.FIRST..l_k_num_tbl.LAST LOOP
1394
1395 x_return_status := OKC_API.G_RET_STS_ERROR;
1396
1397 IF i > l_k_num_tbl.FIRST AND l_srcsl_id_tbl(l_srcsl_id_tbl.PRIOR(i)) <> l_srcsl_id_tbl(i) AND l_count_contr > 0 THEN
1398 -- the source subline has changed so we need to dump information (if any) for the last source subline processed
1399
1400 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1401 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'The source subline has changed so we need to dump information for the last source subline processed.');
1402 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'previous l_src_name_tbl(' || l_src_name_tbl.PRIOR(i) ||'): ' || l_src_name_tbl(l_src_name_tbl.PRIOR(i)));
1403 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'current l_src_name_tbl(' ||i ||'): ' || l_src_name_tbl(i));
1404 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'previous l_count_contr: ' || l_count_contr);
1405 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'previous l_contr_num_list: ' || l_contr_num_list);
1406 END IF;
1407
1408 OKC_API.set_message
1409 (
1410 p_app_name => 'OKS',
1411 p_msg_name => G_COVERAGE_OVERLAP_LIST,
1412 p_token1 => 'LINE_NAME',
1413 p_token1_value => l_src_name_tbl(l_src_name_tbl.PRIOR(i)),
1414 p_token2 => 'CONTRACT_NUMBER',
1415 p_token2_value => l_contr_num_list
1416 );
1417
1418 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1419 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'message set for l_contr_num_list of previous source subline: ' || l_contr_num_list);
1420 END IF;
1421
1422 l_contr_num_list := NULL;
1423 l_count_contr := 0;
1424
1425 END IF;
1426
1427
1428 --processing for current source subline continues
1429 /*Commented for bug:7114842
1430 l_contr_num := l_k_num_tbl(i) || '(' || l_trg_name_tbl(i) || ')';
1431 */
1432 If l_k_mod_tbl(i) <> FND_API.G_MISS_CHAR THEN
1433 l_contr_num := l_k_num_tbl(i) || ' - Contract_modifier= '||l_k_mod_tbl(i)||' , ' || '(' || l_trg_name_tbl(i) || ')';
1434 ELSE
1435 l_contr_num := l_k_num_tbl(i) || '(' || l_trg_name_tbl(i) || ')';
1436 END IF;
1437
1438 IF l_contr_num_list IS NULL THEN
1439 l_contr_num_list := l_contr_num;
1440 ELSE
1441 l_contr_num_list := l_contr_num_list || ', ' || l_contr_num;
1442 END IF;
1443 l_count_contr := l_count_contr + 1;
1444 l_src_name := l_src_name_tbl(i);
1445
1446 --IF l_count_contr = 50 OR length(l_contr_num_list) > 30000 THEN
1447 IF l_count_contr = 50 OR length(l_contr_num_list) > 1500 THEN --anything larger than 1928 results in a numeric value error from OKC/FND API.set_message
1448
1449 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1450 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_src_name_tbl(' ||i ||'): ' || l_src_name_tbl(i));
1451 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_count_contr: ' || l_count_contr);
1452 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_contr_num_list: ' || l_contr_num_list);
1453 END IF;
1454
1455 OKC_API.set_message
1456 (
1457 p_app_name => 'OKS',
1458 p_msg_name => G_COVERAGE_OVERLAP_LIST,
1459 p_token1 => 'LINE_NAME',
1460 p_token1_value => l_src_name_tbl(i),
1461 p_token2 => 'CONTRACT_NUMBER',
1462 p_token2_value => l_contr_num_list
1463 );
1464
1465 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1466 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'message set for l_contr_num_list: ' || l_contr_num_list);
1467 END IF;
1468
1469 l_contr_num_list := NULL;
1470 l_count_contr := 0;
1471
1472 END IF;
1473
1474 END LOOP;
1475
1476 END LOOP;
1477
1478 --this processing applies only to coverage overlaps of the same source subline since dumping of a different source subline has already occured at this point
1479 IF l_contr_num_list IS NOT NULL AND l_count_contr > 0 THEN
1480
1481 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1482 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_src_name: ' || l_src_name);
1483 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_count_contr: ' || l_count_contr);
1484 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_contr_num_list: ' || l_contr_num_list);
1485 END IF;
1486
1487 OKC_API.set_message
1488 (
1489 p_app_name => 'OKS',
1490 p_msg_name => G_COVERAGE_OVERLAP_LIST,
1491 p_token1 => 'LINE_NAME',
1492 p_token1_value => l_src_name,
1493 p_token2 => 'CONTRACT_NUMBER',
1494 p_token2_value => l_contr_num_list
1495 );
1496
1497 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1498 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'message set for l_contr_num_list: ' || l_contr_num_list);
1499 END IF;
1500
1501 END IF;
1502
1503
1504 CLOSE c_chk_overlap;
1505
1506
1507
1508 /***
1509 Bug 4767013 commented out
1510
1511 -- initialize return status
1512 l_return_status := OKC_API.G_RET_STS_SUCCESS;
1513
1514 -- Get Top Lines
1515 OPEN l_cle_csr;
1516 LOOP
1517 FETCH l_cle_csr INTO l_cle_rec;
1518 EXIT WHEN l_cle_csr%NOTFOUND;
1519
1520 -- Get Covered Levels( sub lines) for top Line
1521 OPEN l_cve_csr (l_cle_rec.id);
1522 LOOP
1523 FETCH l_cve_csr INTO l_cve_rec;
1524 EXIT WHEN l_cve_csr%NOTFOUND;
1525
1526 -- Check for covered overlap
1527 check_overlap(
1528 l_return_status
1529 ,l_cve_rec.id
1530 ,l_cve_rec.lty_code
1531 ,l_cve_rec.jtot_object1_code
1532 ,l_cve_rec.object1_id1
1533 ,l_cve_rec.object1_id2
1534 ,l_cve_rec.start_date
1535 ,nvl(l_cve_rec.date_terminated, l_cve_rec.end_date)
1536 );
1537 IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1538 x_return_status := l_return_status;
1539 END IF;
1540
1541 END LOOP;
1542 CLOSE l_cve_csr;
1543
1544 END LOOP;
1545 CLOSE l_cle_csr;
1546 x_return_status := l_return_status;
1547 ***/
1548
1549 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
1550 OKC_API.set_message(
1551 p_app_name => G_APP_NAME,
1552 p_msg_name => 'OKS_QA_SUCCESS');
1553 END IF;
1554
1555
1556 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1557 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name,'Leaving '|| G_PKG_NAME || '.' || l_api_name);
1558 END IF;
1559
1560
1561 EXCEPTION
1562 WHEN G_EXCEPTION_HALT_VALIDATION THEN
1563 -- no processing necessary; validation can continue with next column
1564 NULL;
1565 WHEN OTHERS THEN
1566 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1567 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'WHEN OTHERS: setting message after encountering error: ' || SQLCODE || ' ' || SQLERRM);
1568 END IF;
1569
1570 -- store SQL error message on message stack
1571 OKC_API.SET_MESSAGE(
1572 p_app_name => G_APP_NAME,
1573 p_msg_name => G_UNEXPECTED_ERROR,
1574 p_token1 => G_SQLCODE_TOKEN,
1575 p_token1_value => SQLCODE,
1576 p_token2 => G_SQLERRM_TOKEN,
1577 p_token2_value => SQLERRM);
1578 -- notify caller of an error as UNEXPETED error
1579 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1580 -- verify that cursor was closed
1581 IF c_chk_overlap%ISOPEN THEN
1582 CLOSE c_chk_overlap;
1583 END IF;
1584
1585
1586 /**
1587 IF l_cle_csr%ISOPEN THEN
1588 CLOSE l_cle_csr;
1589 END IF;
1590 IF l_cve_csr%ISOPEN THEN
1591 CLOSE l_cve_csr;
1592 END IF;
1593 **/
1594
1595 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1596 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'WHEN OTHERS: x_return_status: ' || x_return_status);
1597 END IF;
1598
1599 END;
1600
1601 /*============================================================================+
1602 | Procedure: check_covered_levels
1603 |
1604 | Purpose:
1605 |
1606 | In Parameters: p_chr_id the contract id
1607 | Out Parameters: x_return_status standard return status
1608 |
1609 +============================================================================*/
1610 PROCEDURE check_covered_levels(
1611 x_return_status OUT NOCOPY VARCHAR2,
1612 p_chr_id IN NUMBER
1613 ) IS
1614
1615 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
1616 l_dummy VARCHAR2(1) := '?';
1617 l_count NUMBER := 0;
1618
1619 CURSOR l_cle_csr IS
1620 SELECT cle.id, lse.lty_code, cle.name, cle.lse_id,
1621 cle.start_date, cle.end_date,
1622 cim.jtot_object1_code, cim.object1_id1, cim.object1_id2
1623 FROM OKC_K_ITEMS cim,
1624 OKC_LINE_STYLES_B lse,
1625 OKC_K_LINES_V cle
1626 WHERE cim.cle_id = cle.id
1627 AND lse.id = cle.lse_id
1628 AND cle.chr_id = p_chr_id
1629 AND cle.date_cancelled IS NULL --Changes [llc]
1630 ;
1631
1632 l_cle_rec l_cle_csr%ROWTYPE;
1633
1634 CURSOR l_cve_csr (p_cle_id NUMBER) IS
1635 SELECT cle.id, cle.PRICE_NEGOTIATED, cle.name, cle.lse_id,
1636 cle.start_date, cle.end_date, lse.lty_code,
1637 cim.jtot_object1_code, cim.object1_id1, cim.object1_id2
1638 FROM OKC_K_ITEMS cim,
1639 OKC_LINE_STYLES_B lse,
1640 OKC_K_LINES_V cle
1641 WHERE cim.cle_id = cle.id
1642 AND lse.LTY_CODE IN
1643 ('COVER_CUST', 'COVER_ITEM', 'COVER_PROD',
1644 'COVER_PTY', 'COVER_SITE', 'COVER_SYS', 'INST_CTR')
1645 AND lse.id = cle.lse_id
1646 AND cle.cle_id = p_cle_id
1647 AND cle.date_cancelled IS NULL ; --Changes [llc]
1648
1649 l_cve_rec l_cve_csr%ROWTYPE;
1650
1651 CURSOR l_cva_csr (p_cle_id NUMBER) IS
1652 SELECT COUNT( * )
1653 FROM OKC_LINE_STYLES_B lse,
1654 OKC_K_LINES_B cle
1655 WHERE lse.lty_code = 'COVERAGE'
1656 AND lse.id = cle.lse_id
1657 AND cle.cle_id = p_cle_id
1658 GROUP BY cle.cle_id;
1659
1660 -- Rule_information10 in QRE
1661 CURSOR l_usage_type_csr(p_id NUMBER) IS
1662 SELECT Usage_type
1663 FROM OKS_K_LINES_B
1664 WHERE cle_id = p_id;
1665
1666 -- Rule_information5 in QRE
1667 CURSOR l_default_csr(p_cle_id NUMBER) IS
1668 SELECT Default_quantity
1669 FROM OKS_K_LINES_B
1670 WHERE cle_id = p_cle_id;
1671
1672 CURSOR l_salescredit_csr(p_cle_id NUMBER) IS
1673 SELECT NVL(SUM(PERCENT), 0)
1674 FROM OKS_K_SALES_CREDITS sc,
1675 OE_SALES_CREDIT_TYPES sct
1676 WHERE sc.cle_id = p_cle_id
1677 AND sc.sales_credit_type_id1 = sct.sales_credit_type_id
1678 AND sct.quota_flag = 'Y';
1679
1680 /*** for revenue and Quota Sales Credit **/
1681 -- keeping this okx view because it's complicated
1682 CURSOR l_cust_csr(p_contact_id NUMBER) IS
1683 SELECT cust_acct_id
1684 -- FROM OKX_CUST_ROLE_RESP_V
1685 FROM OKX_CUST_CONTACTS_V --Bug 4558172
1686 WHERE id1 = p_contact_id;
1687
1688 CURSOR l_customer_csr(l_billto_siteuse_id IN VARCHAR2) IS
1689 SELECT CA.CUST_ACCOUNT_ID
1690 FROM HZ_CUST_ACCT_SITES_ALL CA, HZ_CUST_SITE_USES_ALL CS
1691 WHERE CS.SITE_USE_ID = l_billto_siteuse_id
1692 AND CS.SITE_USE_CODE = 'BILL_TO'
1693 AND CA.CUST_ACCT_SITE_ID = CS.CUST_ACCT_SITE_ID;
1694
1695
1696 CURSOR l_Contact_csr(p_cle_id NUMBER) IS
1697 SELECT Contact.object1_id1
1698 FROM Okc_contacts Contact
1699 , Okc_k_party_roles_b Party
1700 , okc_k_lines_b lines
1701 WHERE Contact.cpl_id = Party.id
1702 AND party.cle_id = p_cle_id
1703 AND party.jtot_object1_code = 'OKX_PARTY'
1704 AND Contact.cro_code = 'CUST_BILLING'
1705 AND party.cle_id = lines.id
1706 AND party.dnz_chr_id = lines.dnz_chr_id;
1707
1708 -- object1_id1 in BTO
1709 CURSOR l_billto_csr(p_id NUMBER) IS
1710 SELECT BILL_TO_SITE_USE_ID
1711 FROM OKC_K_LINES_B
1712 -- Bug 4558172 --
1713 -- where cle_id = p_id;
1714 WHERE id = p_id;
1715 -- Bug 4558172 --
1716 /* The following two cursors are added since the covered product name
1717 in authoring form is no longer mandatory - Bug #2364436 - Anupama */
1718
1719 CURSOR l_cvd_lvl_csr (p_cle_id NUMBER) IS
1720 SELECT cle.id id
1721 FROM okc_k_lines_v cle, okc_line_styles_v lse
1722 WHERE lse.id = cle.lse_id
1723 AND lse.LTY_CODE IN
1724 ('COVER_CUST', 'COVER_ITEM', 'COVER_PROD',
1725 'COVER_PTY', 'COVER_SITE', 'COVER_SYS', 'INST_CTR')
1726 AND cle.dnz_chr_id = p_chr_id
1727 AND cle.date_cancelled IS NULL --Changes [llc]
1728 ;
1729 l_cvd_lvl_rec l_cvd_lvl_csr%ROWTYPE;
1730
1731 CURSOR l_cvd_item_csr (line_id NUMBER) IS
1732 SELECT object1_id1
1733 FROM okc_k_items
1734 WHERE cle_id = line_id ;
1735 l_cvd_item_rec l_cvd_item_csr%ROWTYPE;
1736
1737
1738 CURSOR l_org_csr IS
1739 SELECT org_id --from R12, we use org_id instead of authoring_org_id
1740 FROM okc_k_headers_all_b
1741 WHERE id = p_chr_id;
1742
1743
1744 CURSOR l_salesperson_contact IS
1745 SELECT contact.object1_id1
1746 FROM okc_contacts contact
1747 ,okc_k_party_roles_b party
1748 ,okc_k_headers_all_b header
1749 WHERE contact.cpl_id = party.id
1750 AND party.chr_id = p_chr_id
1751 AND party.jtot_object1_code = 'OKX_OPERUNIT' --'okx_party'
1752 --npalepu modified on 06-FEB-2007 for bug # 5855434
1753 /* AND contact.cro_code = 'SALESPERSON' */
1754 AND contact.cro_code in (SELECT cro_code
1755 FROM okc_contact_sources
1756 WHERE rle_code in ('VENDOR', 'MERCHANT')
1757 AND buy_or_sell = 'S'
1758 AND jtot_object_code = 'OKX_SALEPERS')
1759 --end npalepu
1760 AND party.chr_id = header.id
1761 --npalepu added condition on party.dnz_chr_id for bug # 5845463
1762 AND party.dnz_chr_id = p_chr_id;
1763 --end npalepu
1764
1765
1766 l_check_salesperson_contact CHAR(1) := 'F';
1767
1768 l_sc_percent NUMBER;
1769 l_default_qty NUMBER;
1770 l_Usage_type VARCHAR2(3);
1771 l_cust_id NUMBER;
1772 l_contact_id NUMBER := NULL;
1773 l_customer_id NUMBER;
1774 l_billto_id NUMBER;
1775 l_renewal_status VARCHAR2(30);
1776
1777 l_org_id NUMBER;
1778
1779 BEGIN
1780 -- initialize return status
1781 x_return_status := OKC_API.G_RET_STS_SUCCESS;
1782
1783 -- The following code added for bug # 2364436 - Anupama
1784
1785 OPEN l_cvd_lvl_csr (p_chr_id);
1786 LOOP
1787 FETCH l_cvd_lvl_csr INTO l_cvd_lvl_rec;
1788 EXIT WHEN l_cvd_lvl_csr%NOTFOUND;
1789
1790 OPEN l_cvd_item_csr (l_cvd_lvl_rec.id);
1791 FETCH l_cvd_item_csr INTO l_cvd_item_rec;
1792 IF (l_cvd_item_csr%NOTFOUND) OR (l_cvd_item_rec.object1_id1 IS NULL) THEN
1793 /**
1794 OKC_API.set_message(
1795 p_app_name => G_APP_NAME,
1796 p_msg_name => G_REQUIRED_LINE_VALUE,
1797 p_token1 => G_COL_NAME_TOKEN,
1798 p_token1_value => 'Covered Level Name',
1799 p_token2 => 'LINE_NAME',
1800 p_token2_value => get_line_name(l_cvd_lvl_rec.id));
1801 **/
1802
1803 OKC_API.set_message(
1804 p_app_name => G_APP_NAME,
1805 p_msg_name => G_COVERED_LINE_REQUIRED,
1806 p_token1 => 'LINE_NAME',
1807 p_token1_value => get_line_name(l_cvd_lvl_rec.id));
1808
1809 -- notify caller of an error
1810 x_return_status := OKC_API.G_RET_STS_ERROR;
1811 END IF;
1812 CLOSE l_cvd_item_csr;
1813 END LOOP;
1814 CLOSE l_cvd_lvl_csr;
1815
1816
1817 -- Get Contract Lines
1818 OPEN l_cle_csr;
1819 LOOP
1820 FETCH l_cle_csr INTO l_cle_rec;
1821 EXIT WHEN l_cle_csr%NOTFOUND;
1822
1823 -- Get Covered Levels for Contract Line
1824
1825 OPEN l_cve_csr (l_cle_rec.id);
1826 LOOP
1827 FETCH l_cve_csr INTO l_cve_rec;
1828 EXIT WHEN l_cve_csr%NOTFOUND;
1829 IF l_cve_rec.lty_code <> 'INST_CTR' THEN
1830 -- Negotiated amount at covered levels is required.
1831 IF l_cve_rec.PRICE_NEGOTIATED IS NULL THEN
1832 /**
1833 OKC_API.set_message(
1834 p_app_name => G_APP_NAME,
1835 p_msg_name => G_REQUIRED_LINE_VALUE,
1836 p_token1 => G_COL_NAME_TOKEN,
1837 p_token1_value => 'Final Price',
1838 p_token2 => 'LINE_NAME',
1839 p_token2_value => get_line_name(l_cve_rec.id));
1840 **/
1841
1842 OKC_API.set_message(
1843 p_app_name => G_APP_NAME,
1844 p_msg_name => G_NEG_AMT_REQUIRED,
1845 p_token1 => 'LINE_NAME',
1846 p_token1_value => get_line_name(l_cve_rec.id));
1847 -- notify caller of an error
1848 x_return_status := OKC_API.G_RET_STS_ERROR;
1849 END IF;
1850 END IF;
1851
1852
1853 OPEN l_Usage_type_csr(l_cle_rec.id);
1854 FETCH l_Usage_type_csr INTO l_usage_type;
1855 CLOSE l_Usage_type_csr;
1856
1857
1858 OPEN l_default_csr(l_cve_rec.id);
1859 FETCH l_default_csr INTO l_default_qty;
1860 CLOSE l_default_csr;
1861
1862 IF l_usage_type = 'VRT' AND l_default_qty IS NULL THEN
1863 x_return_status := OKC_API.G_RET_STS_ERROR;
1864
1865 OKC_API.set_message
1866 (
1867 p_app_name => G_APP_NAME,
1868 p_msg_name => G_DEFAULT_READING,
1869 p_token1 => 'TOKEN',
1870 p_token1_value => get_line_name(l_cve_rec.id)
1871 );
1872
1873 END IF;
1874
1875 END LOOP;
1876
1877 -- if statement added for subscription lines.
1878 IF l_cle_rec.lse_id <> 46 THEN
1879 -- A Contract Line must have at least 1 covered level line
1880 IF l_cve_csr%ROWCOUNT <= 0 THEN
1881 OKC_API.set_message(
1882 p_app_name => G_APP_NAME,
1883 p_msg_name => G_REQUIRED_COVERED_LINE,
1884 p_token1 => 'LINE_NAME',
1885 p_token1_value => get_line_name(l_cle_rec.id));
1886 -- notify caller of an error
1887 x_return_status := OKC_API.G_RET_STS_ERROR;
1888 END IF;
1889 END IF; -- l_cle_rec.lse_id <> 46
1890 CLOSE l_cve_csr;
1891
1892 IF l_cle_rec.lty_code = 'SERVICE' THEN
1893 OPEN l_cva_csr (l_cle_rec.id);
1894 FETCH l_cva_csr INTO l_count;
1895 CLOSE l_cva_csr;
1896
1897 IF l_count > 1 THEN
1898 -- A Service Line must have at most 1 coverage line
1899 OKC_API.set_message(
1900 p_app_name => G_APP_NAME,
1901 p_msg_name => G_INVALID_COVERAGE_LINE,
1902 p_token1 => 'LINE_NAME',
1903 p_token1_value => get_line_name(l_cle_rec.id));
1904 -- notify caller of an error
1905 x_return_status := OKC_API.G_RET_STS_ERROR;
1906 END IF;
1907 END IF;
1908
1909
1910 --adding the following code for Bug#4069048
1911 -- get renewal status to see if this is called for Electronic renewal
1912 -- if so bypass the sales credit validation
1913 l_renewal_status := get_renewal_status(p_chr_id);
1914
1915 --Bug 4673694 in R12 the renewal status codes have been modified
1916 --if nvl(l_renewal_status ,'-99') <> 'QAS' and nvl(l_renewal_status, '-99') <> 'ERN_QA_CHECK_FAIL' then
1917 IF nvl(l_renewal_status, '-99') <> 'PEND_PUBLISH' THEN
1918
1919 /** check sales credit for Top lines **/
1920
1921 l_sc_percent := 0;
1922
1923 l_org_id := NULL;
1924 OPEN l_org_csr;
1925 FETCH l_org_csr INTO l_org_id;
1926 CLOSE l_org_csr;
1927
1928 IF l_cle_rec.lse_id IN (1, 12, 19, 46) AND
1929 --(FND_PROFILE.VALUE('OKS_ENABLE_SALES_CREDIT') IN ('YES', 'R') OR OKS_BILL_UTIL_PUB.Is_Sc_Allowed) THEN
1930 (FND_PROFILE.VALUE('OKS_ENABLE_SALES_CREDIT') IN ('YES', 'DRT', 'R') OR OKS_BILL_UTIL_PUB.Is_Sc_Allowed(l_org_id)) THEN
1931
1932 l_check_salesperson_contact := 'T';
1933
1934 OPEN l_salescredit_csr(l_cle_rec.id);
1935 FETCH l_salescredit_csr INTO l_sc_percent;
1936 CLOSE l_salescredit_csr;
1937
1938 IF l_sc_percent <> 100 THEN
1939
1940 /**
1941 OKC_API.set_message(
1942 p_app_name => G_APP_NAME,
1943 p_msg_name => G_REQUIRED_LINE_VALUE,
1944 p_token1 => G_COL_NAME_TOKEN,
1945 p_token1_value => 'Quota Sales Credit at line must be assigned to 100%',
1946 p_token2 => 'LINE_NAME',
1947 p_token2_value => get_line_name(l_cle_rec.id));
1948 **/
1949 OKC_API.set_message( -- Bug 4708540 (changed message)
1950 p_app_name => G_APP_NAME,
1951 p_msg_name => 'OKS_INCOMP_QUOTA_SALES_CREDIT',
1952 p_token1 => 'LINE_NAME',
1953 p_token1_value => get_line_name(l_cle_rec.id));
1954
1955 -- notify caller of an error
1956 x_return_status := OKC_API.G_RET_STS_ERROR;
1957
1958 END IF;
1959
1960 END IF;
1961 END IF;
1962 l_contact_id := null; /*harlaksh bug:7013295*/
1963 OPEN l_contact_csr(l_cle_rec.id);
1964 FETCH l_contact_csr INTO l_contact_id;
1965 CLOSE l_contact_csr;
1966
1967
1968 IF l_contact_id IS NOT NULL THEN
1969 OPEN l_cust_csr(l_contact_id);
1970 FETCH l_cust_csr INTO l_cust_id;
1971 CLOSE l_cust_csr;
1972
1973 OPEN l_billto_csr(l_cle_rec.id);
1974 FETCH l_billto_csr INTO l_billto_id;
1975 CLOSE l_billto_csr;
1976
1977 OPEN l_customer_csr(l_billto_id);
1978 FETCH l_customer_csr INTO l_customer_id;
1979 CLOSE l_customer_csr;
1980 -- Bug 4558172--
1981 IF nvl(l_cust_id, 0) <> nvl(l_customer_id, - 99) THEN
1982 -- Bug 4558172--
1983 /**
1984 OKC_API.set_message(
1985 p_app_name => G_APP_NAME,
1986 p_msg_name => G_REQUIRED_VALUE,
1987 p_token1 => G_COL_NAME_TOKEN,
1988 p_token1_value => 'INVALID BILLING CONTACTS ');
1989 **/
1990
1991 OKC_API.set_message(
1992 p_app_name => G_APP_NAME,
1993 p_msg_name => G_INVALID_BILLING_CONTACTS);
1994
1995 -- notify caller of an error
1996 x_return_status := OKC_API.G_RET_STS_ERROR;
1997 END IF;
1998
1999 END IF;
2000
2001
2002
2003
2004 END LOOP;
2005 -- A Contract must have at least 1 Contract Line
2006
2007 IF l_cle_csr%ROWCOUNT <= 0 THEN
2008 /**
2009 OKC_API.set_message(
2010 p_app_name => G_APP_NAME,
2011 p_msg_name => G_REQUIRED_VALUE,
2012 p_token1 => G_COL_NAME_TOKEN,
2013 p_token1_value => 'Contract Line');
2014 **/
2015
2016 OKC_API.set_message(
2017 p_app_name => G_APP_NAME,
2018 p_msg_name => G_LINE_REQUIRED);
2019
2020
2021 -- notify caller of an error
2022 x_return_status := OKC_API.G_RET_STS_ERROR;
2023 END IF;
2024
2025
2026 CLOSE l_cle_csr;
2027
2028
2029 --bug 5136368
2030 IF l_check_salesperson_contact = 'T' THEN
2031 l_contact_id := NULL;
2032
2033 OPEN l_salesperson_contact;
2034 FETCH l_salesperson_contact INTO l_contact_id;
2035 CLOSE l_salesperson_contact;
2036
2037 IF l_contact_id IS NULL THEN
2038 OKC_API.set_message(
2039 p_app_name => G_APP_NAME,
2040 p_msg_name => G_MISSING_SALESREP);
2041
2042 -- notify caller of an error
2043 x_return_status := OKC_API.G_RET_STS_ERROR;
2044 END IF;
2045
2046 END IF;
2047
2048
2049
2050 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
2051 OKC_API.set_message(
2052 p_app_name => G_APP_NAME,
2053 p_msg_name => 'OKS_QA_SUCCESS');
2054 END IF;
2055
2056
2057
2058 EXCEPTION
2059 WHEN G_EXCEPTION_HALT_VALIDATION THEN
2060 -- no processing necessary; validation can continue with next column
2061 NULL;
2062 WHEN OTHERS THEN
2063 -- store SQL error message on message stack
2064 OKC_API.SET_MESSAGE(
2065 p_app_name => G_APP_NAME,
2066 p_msg_name => G_UNEXPECTED_ERROR,
2067 p_token1 => G_SQLCODE_TOKEN,
2068 p_token1_value => SQLCODE,
2069 p_token2 => G_SQLERRM_TOKEN,
2070 p_token2_value => SQLERRM);
2071 -- notify caller of an error as UNEXPETED error
2072 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
2073 -- verify that cursor was closed
2074 IF l_cle_csr%ISOPEN THEN
2075 CLOSE l_cle_csr;
2076 END IF;
2077 IF l_cve_csr%ISOPEN THEN
2078 CLOSE l_cve_csr;
2079 END IF;
2080 IF l_cva_csr%ISOPEN THEN
2081 CLOSE l_cva_csr;
2082 END IF;
2083
2084
2085 END check_covered_levels;
2086
2087 /*============================================================================+
2088 | Procedure: check_req_values
2089 |
2090 | Purpose:
2091 |
2092 | Modified: mkhayer -- to support merchant and subscriber for
2093 | subscription contracts
2094 |
2095 | In Parameters: p_chr_id the contract id
2096 | Out Parameters: x_return_status standard return status
2097 |
2098 +============================================================================*/
2099 PROCEDURE check_req_values(
2100 x_return_status OUT NOCOPY VARCHAR2,
2101 p_chr_id IN NUMBER
2102 ) IS
2103
2104 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
2105 l_dummy VARCHAR2(1) := '?';
2106 l_count NUMBER := 0;
2107
2108 CURSOR l_cle_csr IS
2109 /**
2110 SELECT cle.id, COUNT( * )
2111 FROM OKC_K_ITEMS cim,
2112 OKC_K_LINES_B cle
2113 WHERE cim.cle_id = cle.id
2114 AND cle.dnz_chr_id = p_chr_id
2115 AND cle.date_cancelled IS NULL --Changes [llc]
2116 GROUP BY cle.id
2117 HAVING COUNT( * ) > 1;
2118 **/
2119 --bug 5442886
2120 SELECT cle_id, count(*)
2121 FROM okc_k_items
2122 WHERE dnz_chr_id = p_chr_id
2123 GROUP BY cle_id
2124 HAVING COUNT(*) > 1;
2125
2126
2127 l_cle_rec l_cle_csr%ROWTYPE;
2128 l_date_cancelled DATE;
2129
2130 CURSOR l_cle1_csr IS
2131 SELECT cle.id
2132 FROM OKC_K_LINES_V cle
2133 WHERE cle.dnz_chr_id = p_chr_id
2134 AND cle.name IS NULL
2135 AND cle.date_cancelled IS NULL ; --Changes [llc]
2136
2137 l_cle1_rec l_cle1_csr%ROWTYPE;
2138
2139 CURSOR l_cpl_csr (p_rle_code VARCHAR2) IS
2140 SELECT COUNT( * )
2141 FROM OKC_K_PARTY_ROLES_B cpl
2142 WHERE cpl.rle_code = p_rle_code
2143 AND cpl.dnz_chr_id = p_chr_id
2144 AND cpl.cle_id IS NULL;
2145
2146 CURSOR l_desc_csr IS
2147 SELECT contract_number, Short_description
2148 FROM OKC_K_HEADERS_V
2149 WHERE id = p_chr_id;
2150
2151 CURSOR l_qa_csr IS
2152 SELECT contract_number, QCL_ID, scs_code
2153 FROM okc_k_headers_all_b
2154 WHERE id = p_chr_id;
2155
2156 -- Object1_id1 in PRE rule
2157 CURSOR l_price_csr IS
2158 SELECT price_list_id -- Object1_id1
2159 FROM okc_k_headers_all_b
2160 WHERE id = p_chr_id;
2161
2162
2163 CURSOR l_k_grp_csr IS
2164 SELECT id
2165 FROM OKC_K_GRPINGS
2166 WHERE Included_chr_id = p_chr_id;
2167
2168 CURSOR l_wf_csr IS
2169 SELECT id
2170 FROM OKC_K_PROCESSES
2171 WHERE Chr_id = p_chr_id;
2172
2173 --Fixes Bug# 1926370
2174
2175 /***
2176 CURSOR l_get_top_line_csr IS
2177 SELECT id
2178 FROM OKC_K_LINES_B
2179 WHERE dnz_chr_id = p_chr_id
2180 AND lse_id IN (1, 19)
2181 AND date_cancelled IS NULL ; --Changes [llc]
2182
2183 CURSOR l_get_sub_line_csr (p_cle_id NUMBER) IS
2184 SELECT id, price_unit
2185 FROM OKC_K_LINES_B
2186 WHERE dnz_chr_id = p_chr_id
2187 AND cle_id = p_cle_id
2188 AND lse_id IN (7, 8, 9, 10, 11, 18, 25, 35)
2189 AND date_cancelled IS NULL --Changes [llc]
2190 ;
2191
2192 CURSOR l_get_item_csr (p_cle_id NUMBER) IS
2193 SELECT id, uom_code
2194 FROM OKC_K_ITEMS_V
2195 WHERE dnz_chr_id = p_chr_id
2196 AND cle_id = p_cle_id;
2197 ***/
2198
2199 --bug 5442886
2200 CURSOR l_get_line_details_csr IS
2201 SELECT /*+ ordered use_nl(rlb,ri) */
2202 rlb.id sub_line_id, rlb.price_unit,
2203 ri.uom_code
2204 FROM okc_k_lines_b rla,
2205 okc_k_lines_b rlb,
2206 okc_k_items_v ri
2207 WHERE rla.dnz_chr_id = p_chr_id
2208 AND rla.lse_id IN (1,19)
2209 AND rla.date_cancelled IS NULL
2210 AND rlb.cle_id = rla.id
2211 AND rlb.lse_id IN (7,8,9,10,11,18,25,35)
2212 AND rlb.date_cancelled IS NULL
2213 ------AND ri.dnz_chr_id = rla.dnz_chr_id --not necessary
2214 AND ri.cle_id = rlb.id
2215 AND (rlb.price_unit IS NULL OR ri.uom_code IS NULL);
2216
2217 TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
2218 TYPE chr3_tbl_type IS TABLE OF okc_k_items.uom_code%TYPE INDEX BY BINARY_INTEGER;
2219
2220 l_sub_line_id_tbl num_tbl_type;
2221 l_price_unit_tbl num_tbl_type;
2222 l_uom_code_tbl chr3_tbl_type;
2223
2224 l_desc VARCHAR2(600);
2225 l_qcl NUMBER;
2226 l_contr_category VARCHAR2(30);
2227 l_customer VARCHAR2(30);
2228 l_vedor VARCHAR2(30);
2229 l_grp_id NUMBER;
2230 l_price_id NUMBER;
2231 l_wf_id NUMBER;
2232 l_k_no VARCHAR2(120);
2233
2234
2235 /* check for product availability */
2236
2237 service_rec_type OKS_OMINT_PUB.check_service_rec_type;
2238 l_service_id NUMBER;
2239 l_service_item_id NUMBER;
2240 l_product_id NUMBER;
2241 l_product_item_id NUMBER;
2242 l_customer_id NUMBER;
2243 l_msg_Count NUMBER;
2244 l_msg_Data VARCHAR2(50);
2245 --l_Return_Status VARCHAR2(1);
2246 l_Available_YN VARCHAR2(1);
2247 l_sts_code VARCHAR2(100);
2248 l_prod_start_date DATE;
2249
2250 --start changes for org id in is_service_available
2251 CURSOR get_auth_org_csr IS
2252 SELECT authoring_org_id
2253 FROM okc_k_headers_all_b
2254 WHERE id = p_chr_id;
2255
2256 get_auth_org_rec get_auth_org_csr%ROWTYPE;
2257 --End changes for org id in is_service_available
2258
2259 /*** Get all service lines for given Contract header id ***/
2260 CURSOR l_csr_get_service_line_id(p_chr_id NUMBER) IS
2261 SELECT cle.id, sts.ste_code sts_code
2262 FROM okc_k_lines_v cle,
2263 okc_statuses_b sts
2264 WHERE cle.dnz_chr_id = p_chr_id
2265 AND sts.code = cle.sts_code
2266 AND cle.lse_id IN (1, 19);
2267
2268 /*** Get customer id for all the above service lines ***/
2269 -- object1_id1 in CAN rule
2270 CURSOR l_csr_get_customer_id IS
2271 SELECT CUST_ACCT_ID -- object1_id1
2272 FROM okc_k_lines_b
2273 WHERE id = l_service_id;
2274
2275
2276 /*** Get service item id for all the service lines from OKC_K_ITEMS_V ***/
2277 CURSOR l_csr_get_service_item_id(p_cle_id IN NUMBER) IS
2278 SELECT object1_id1
2279 FROM okc_k_items_v
2280 WHERE cle_id = p_cle_id ;
2281
2282
2283 /*** Get all product lines and item lines for each service line ***/
2284 CURSOR l_csr_get_product_line_id IS
2285 SELECT id, start_date
2286 FROM okc_k_lines_v
2287 WHERE cle_id = l_service_id
2288 AND lse_id IN (9, 25, 7); -- 7 added for bug#2430496
2289
2290
2291 /*** Get service item id or product item if for all the service lines
2292 *** or product lines from OKC_K_ITEMS_V ***/
2293 CURSOR l_csr_get_item_id(p_cle_id IN NUMBER) IS
2294 SELECT object1_id1
2295 FROM okc_k_items_v
2296 WHERE cle_id = p_cle_id ;
2297
2298 CURSOR l_product_csr(p_cp_id NUMBER) IS
2299 SELECT inventory_item_id
2300 FROM csi_item_instances
2301 WHERE instance_id = p_cp_id;
2302
2303 l_cp_id NUMBER;
2304
2305
2306 BEGIN
2307 -- initialize return status
2308 x_return_status := OKC_API.G_RET_STS_SUCCESS;
2309
2310 --changes for passing org_id in is_service_available
2311 OPEN get_auth_org_csr;
2312 FETCH get_auth_org_csr INTO get_auth_org_rec;
2313 CLOSE get_auth_org_csr;
2314
2315 -- A Contract Line may have at most 1 contract item
2316 OPEN l_cle_csr;
2317 LOOP
2318 FETCH l_cle_csr INTO l_cle_rec;
2319 EXIT WHEN l_cle_csr%NOTFOUND;
2320
2321 l_date_cancelled := NULL;
2322 SELECT date_cancelled
2323 INTO l_date_cancelled
2324 FROM okc_k_lines_b
2325 WHERE id = l_cle_rec.cle_id;
2326
2327 IF l_date_cancelled IS NULL THEN
2328 OKC_API.set_message(
2329 p_app_name => G_APP_NAME,
2330 p_msg_name => G_INVALID_LINE_ITEM,
2331 p_token1 => 'LINE_NAME',
2332 --p_token1_value => get_line_name(l_cle_rec.id));
2333 p_token1_value => get_line_name(l_cle_rec.cle_id));
2334
2335
2336 -- notify caller of an error
2337 x_return_status := OKC_API.G_RET_STS_ERROR;
2338 END IF;
2339
2340 END LOOP;
2341 CLOSE l_cle_csr;
2342
2343 -- A Contract Line must have a name
2344 -- This check is no longer needed.
2345 --OPEN l_cle1_csr;
2346 --LOOP
2347 -- FETCH l_cle1_csr INTO l_cle1_rec;
2348 -- EXIT WHEN l_cle1_csr%NOTFOUND;
2349 -- OKC_API.set_message(
2350 -- p_app_name => G_APP_NAME,
2351 -- p_msg_name => G_REQUIRED_LINE_VALUE,
2352 -- p_token1 => G_COL_NAME_TOKEN,
2353 -- p_token1_value => 'Name',
2354 -- p_token2 => 'LINE_NAME',
2355 -- p_token2_value => get_line_name(l_cle1_rec.id));
2356
2357 -- -- notify caller of an error
2358 -- x_return_status := OKC_API.G_RET_STS_ERROR;
2359 --END LOOP;
2360 --CLOSE l_cle1_csr;
2361 OPEN l_qa_csr;
2362 FETCH l_qa_csr INTO l_k_no, l_qcl, l_contr_category;
2363 CLOSE l_qa_csr;
2364
2365 IF l_qcl IS NULL THEN
2366 OKC_API.set_message(
2367 p_app_name => G_APP_NAME,
2368 p_msg_name => G_QA_CHECK,
2369 p_token1 => 'TOKEN',
2370 p_token1_value => l_k_no);
2371
2372 -- notify caller of an error
2373 x_return_status := OKC_API.G_RET_STS_ERROR;
2374 END IF;
2375
2376 IF l_contr_category = 'SUBSCRIPTION' THEN
2377 l_customer := 'SUBSCRIBER';
2378 l_vedor := 'MERCHANT';
2379 ELSE
2380 l_customer := 'CUSTOMER';
2381 l_vedor := 'VENDOR';
2382 END IF;
2383 -- At most only 1 customer or subscriber may be attached to the Contract
2384 OPEN l_cpl_csr(l_customer);
2385 FETCH l_cpl_csr INTO l_count;
2386 CLOSE l_cpl_csr;
2387
2388 IF (l_count > 1) THEN
2389 OKC_API.set_message(
2390 p_app_name => G_APP_NAME,
2391 p_msg_name => G_PARTY_ROLE,
2392 p_token1 => 'ROLE',
2393 p_token1_value => l_customer);
2394 -- notify caller of an error
2395 x_return_status := OKC_API.G_RET_STS_ERROR;
2396 END IF;
2397
2398 -- It is required that one customer or subscriber may be attached to
2399 -- a contract. Added by mkhayer on 05/03/2002
2400 IF (l_count < 1) THEN
2401 OKC_API.set_message(
2402 p_app_name => G_APP_NAME,
2403 p_msg_name => G_PARTY_MISSING_ROLE,
2404 p_token1 => 'ROLE',
2405 p_token1_value => l_customer);
2406 -- notify caller of an error (The contract has no Customer attached to it)
2407 x_return_status := OKC_API.G_RET_STS_ERROR;
2408 END IF;
2409
2410 -- At most only 1 vendor or merchant may be attached to the Contract
2411 OPEN l_cpl_csr(l_vedor);
2412 FETCH l_cpl_csr INTO l_count;
2413 CLOSE l_cpl_csr;
2414
2415 IF (l_count > 1) THEN
2416 OKC_API.set_message(
2417 p_app_name => G_APP_NAME,
2418 p_msg_name => G_PARTY_ROLE,
2419 p_token1 => 'ROLE',
2420 p_token1_value => l_vedor);
2421 -- notify caller of an error
2422 x_return_status := OKC_API.G_RET_STS_ERROR;
2423 END IF;
2424
2425 -- It is required that one vendor or merchant may be attached to a contract.
2426 -- Added by mkhayer on 05/03/2002
2427 IF (l_count < 1) THEN
2428 OKC_API.set_message(
2429 p_app_name => G_APP_NAME,
2430 p_msg_name => G_PARTY_MISSING_ROLE,
2431 p_token1 => 'ROLE',
2432 p_token1_value => l_vedor);
2433 -- notify caller of an error (The contract has no Vendor attached to it)
2434 x_return_status := OKC_API.G_RET_STS_ERROR;
2435 END IF;
2436
2437 OPEN l_desc_csr;
2438 FETCH l_desc_csr INTO l_k_no, l_desc;
2439 CLOSE l_desc_csr;
2440
2441 IF l_desc IS NULL THEN
2442 OKC_API.set_message(
2443 p_app_name => G_APP_NAME,
2444 p_msg_name => G_SHORT_DESC,
2445 p_token1 => 'TOKEN',
2446 p_token1_value => l_k_no);
2447 -- notify caller of an error
2448 x_return_status := OKC_API.G_RET_STS_ERROR;
2449 END IF;
2450
2451 OPEN l_price_csr;
2452 FETCH l_price_csr INTO l_price_id;
2453 CLOSE l_price_csr;
2454
2455 IF l_price_id IS NULL THEN
2456 OKC_API.set_message(
2457 p_app_name => G_APP_NAME,
2458 p_msg_name => G_PRICE_LIST,
2459 p_token1 => 'TOKEN',
2460 --p_token1_value => 'BILLING HEADER');
2461 p_token1_value => l_k_no);
2462 -- notify caller of an error
2463 x_return_status := OKC_API.G_RET_STS_ERROR;
2464 END IF;
2465
2466
2467 OPEN l_k_grp_csr;
2468 FETCH l_k_grp_csr INTO l_grp_id;
2469
2470 IF l_grp_id IS NULL THEN
2471
2472 OKC_API.set_message(
2473 p_app_name => G_APP_NAME,
2474 p_msg_name => G_K_GROUP,
2475 p_token1 => 'TOKEN',
2476 --p_token1_value => 'Header Admin');
2477 p_token1_value => l_k_no);
2478
2479
2480 -- notify caller of an error
2481 x_return_status := OKC_API.G_RET_STS_ERROR;
2482 END IF;
2483
2484 CLOSE l_k_grp_csr;
2485
2486
2487 OPEN l_wf_csr;
2488 FETCH l_wf_csr INTO l_wf_id;
2489 CLOSE l_wf_csr;
2490
2491 IF l_wf_id IS NULL THEN
2492
2493 OKC_API.set_message(
2494 p_app_name => G_APP_NAME,
2495 p_msg_name => G_WORKFLOW );
2496
2497
2498 -- notify caller of an error
2499 x_return_status := OKC_API.G_RET_STS_ERROR;
2500 END IF;
2501
2502 /* check for product availability*/
2503 /*** Get customer_id ****/
2504
2505 /* -- Comented out by mkhayer --
2506 -- there is an API called check_product_availability which has the exact code
2507 -- as below.
2508 OPEN l_csr_get_service_line_id(p_chr_id);
2509
2510 LOOP
2511
2512 FETCH l_csr_get_service_line_id INTO l_service_id,l_sts_code;
2513 IF l_csr_get_service_line_id%NOTFOUND THEN
2514 EXIT;
2515 END IF;
2516
2517 l_customer_id := NULL;
2518
2519 OPEN l_csr_get_customer_id;
2520 FETCH l_csr_get_customer_id INTO l_customer_id;
2521 IF l_csr_get_customer_id%NOTFOUND THEN
2522 x_return_status := 'E';
2523 EXIT;
2524 END IF;
2525 CLOSE l_csr_get_customer_id;
2526
2527 l_service_item_id := NULL;
2528
2529 OPEN l_csr_get_item_id(l_service_id);
2530 FETCH l_csr_get_item_id INTO l_service_item_id;
2531 IF l_csr_get_item_id%NOTFOUND THEN
2532 x_return_status := 'E';
2533 EXIT;
2534 END IF;
2535 CLOSE l_csr_get_item_id;
2536
2537 l_product_id := NULL;
2538 l_prod_start_date := NULL;
2539
2540 OPEN l_csr_get_product_line_id;
2541 LOOP
2542 FETCH l_csr_get_product_line_id INTO l_product_id,l_prod_start_date;
2543 IF l_csr_get_product_line_id%NOTFOUND THEN
2544
2545 EXIT;
2546 END IF;
2547
2548 l_product_item_id := NULL;
2549
2550 OPEN l_csr_get_item_id(l_product_id);
2551 FETCH l_csr_get_item_id INTO l_product_item_id;
2552 IF l_csr_get_item_id%NOTFOUND THEN
2553 x_return_status := 'E';
2554 EXIT;
2555 END IF;
2556 CLOSE l_csr_get_item_id;
2557
2558 l_cp_id := NULL;
2559
2560 Open l_product_csr(l_product_item_id);
2561 Fetch l_product_csr into l_cp_id;
2562 Close l_product_csr;
2563
2564 service_rec_type.service_item_id := l_service_item_id;
2565 service_rec_type.customer_id := l_customer_id;
2566 service_rec_type.product_item_id := l_cp_id;
2567 service_rec_type.request_date := l_prod_start_date;
2568 l_available_YN := NULL;
2569
2570 If l_sts_code = 'ENTERED'
2571 then
2572 --changes for passing org_id in is_service_available
2573 OKS_OMINT_PUB.Is_Service_Available
2574 (
2575 p_api_version => 1.0 ,
2576 p_init_msg_list => 'F' ,
2577 x_msg_count => l_msg_Count ,
2578 x_msg_data => l_msg_Data ,
2579 x_return_status => l_Return_Status ,
2580 p_check_service_rec => service_rec_type,
2581 x_available_yn => l_available_YN,
2582 p_org_id => get_auth_org_rec.authoring_org_id
2583 );
2584
2585
2586 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2587 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT , G_PKG_NAME||'.'||l_api_name,'After Service_Available p return_status: '||x_return_status);
2588 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT , G_PKG_NAME||'.'||l_api_name,'l_msg_data: '||l_msg_data);
2589 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT , G_PKG_NAME||'.'||l_api_name,'l_msg_count: '||l_msg_count);
2590 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT , G_PKG_NAME||'.'||l_api_name,'l_available_YN: '||l_available_YN);
2591 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT , G_PKG_NAME||'.'||l_api_name,'l_org_id: '||get_auth_org_rec.authoring_org_id);
2592 END IF;
2593
2594 If l_available_yn = 'N' then
2595 x_return_status := OKC_API.G_RET_STS_ERROR;
2596
2597 OKC_API.set_message
2598 (
2599 p_app_name => 'OKS',
2600 p_msg_name => 'OKS_PRODUCT_AVAILABILITY',
2601 p_token1 => 'TOKEN1',
2602 --p_token1_value => get_line_name(l_line_rec.line_number),
2603 p_token1_value => get_line_name(l_service_id),
2604 p_token2 => 'TOKEN2',
2605 p_token2_value => get_line_name(l_product_id)
2606 );
2607
2608 End If;
2609 End if; --If l_sts_code = 'ENTERED'
2610
2611 END LOOP; -- End loop get product line id
2612 CLOSE l_csr_get_product_line_id;
2613
2614 END LOOP; -- End loop get service line id
2615 CLOSE l_csr_get_service_line_id; */
2616
2617 /****
2618 IF NVL(fnd_profile.VALUE('OKS_USE_QP_FOR_MANUAL_ADJ'), 'NO') = 'YES'
2619 THEN
2620 FOR l_get_top_line_rec IN l_get_top_line_csr
2621 LOOP
2622
2623 FOR l_get_sub_line_rec IN l_get_sub_line_csr (l_get_top_line_rec.id)
2624 LOOP
2625 FOR l_get_item_rec IN l_get_item_csr (l_get_sub_line_rec.id)
2626 LOOP
2627
2628 IF (l_get_sub_line_rec.price_unit IS NULL OR l_get_item_rec.uom_code IS NULL)
2629 THEN
2630
2631 -- store SQL error message on message stack
2632 OKC_API.SET_MESSAGE
2633 (
2634 p_app_name => G_APP_NAME,
2635 p_msg_name => 'OKS_UOM_VALUES',
2636 p_token1 => 'TOKEN1',
2637 p_token1_value => get_line_name(l_get_sub_line_rec.id));
2638
2639 x_return_status := OKC_API.G_RET_STS_ERROR;
2640
2641 END IF; -- IF (l_get_sub_line_rec.price_unit IS NULL OR l_get_item_rec.uom_code IS NULL)
2642
2643 END LOOP; --FOR l_get_item_rec in l_get_item_csr
2644
2645 END LOOP; --FOR l_get_sub_line_rec in l_get_sub_line_csr
2646
2647 END LOOP; --FOR l_get_top_line_rec in l_get_top_line_csr
2648
2649 ELSE
2650
2651 FOR l_get_top_line_rec IN l_get_top_line_csr
2652 LOOP
2653
2654 FOR l_get_sub_line_rec IN l_get_sub_line_csr (l_get_top_line_rec.id)
2655 LOOP
2656 FOR l_get_item_rec IN l_get_item_csr (l_get_sub_line_rec.id)
2657 LOOP
2658
2659 IF (l_get_item_rec.uom_code IS NULL)
2660 THEN
2661
2662 -- store SQL error message on message stack
2663 OKC_API.SET_MESSAGE
2664 (
2665 p_app_name => G_APP_NAME,
2666 p_msg_name => 'OKS_UOM_VALUES',
2667 p_token1 => 'TOKEN1',
2668 p_token1_value => get_line_name(l_get_sub_line_rec.id));
2669
2670 x_return_status := OKC_API.G_RET_STS_ERROR;
2671
2672 END IF; -- IF (l_get_sub_line_rec.price_unit IS NULL OR l_get_item_rec.uom_code IS NULL)
2673
2674 END LOOP; --FOR l_get_item_rec in l_get_item_csr
2675
2676 END LOOP; --FOR l_get_sub_line_rec in l_get_sub_line_csr
2677
2678 END LOOP; --FOR l_get_top_line_rec in l_get_top_line_csr
2679
2680
2681
2682 END IF; -- IF NVL(fnd_profile.value('OKS_USE_QP_FOR_MANUAL_ADJ'),'NO') = 'YES'
2683 ****/
2684
2685
2686 --bug 5442886
2687 OPEN l_get_line_details_csr;
2688
2689 LOOP
2690
2691 FETCH l_get_line_details_csr BULK COLLECT INTO l_sub_line_id_tbl, l_price_unit_tbl, l_uom_code_tbl LIMIT G_BULK_FETCH_LIMIT;
2692
2693 EXIT WHEN l_sub_line_id_tbl.COUNT = 0;
2694
2695 FOR i IN l_sub_line_id_tbl.FIRST..l_sub_line_id_tbl.LAST LOOP
2696
2697 --Modified for Bug#6317316 harlaksh. Price_unit check is not necessary.
2698 /* commenting out the first IF condition keeping only else condition part.
2699 IF NVL(fnd_profile.value('OKS_USE_QP_FOR_MANUAL_ADJ'),'NO') = 'YES' THEN
2700
2701 IF (l_price_unit_tbl(i) IS NULL OR l_uom_code_tbl(i) IS NULL)
2702 THEN
2703 -- store SQL error message on message stack
2704 OKC_API.SET_MESSAGE
2705 (
2706 p_app_name => G_APP_NAME,
2707 p_msg_name => 'OKS_UOM_VALUES',
2708 p_token1 => 'TOKEN1',
2709 p_token1_value => get_line_name(l_sub_line_id_tbl(i)));
2710
2711 x_return_status := OKC_API.G_RET_STS_ERROR;
2712
2713 END IF;
2714
2715 ELSE
2716 Bug #6317316 commented the above IF part */
2717 IF (l_uom_code_tbl(i) IS NULL)
2718 THEN
2719 -- store SQL error message on message stack
2720 OKC_API.SET_MESSAGE
2721 (
2722 p_app_name => G_APP_NAME,
2723 p_msg_name => 'OKS_UOM_VALUES',
2724 p_token1 => 'TOKEN1',
2725 p_token1_value => get_line_name(l_sub_line_id_tbl(i)));
2726
2727 x_return_status := OKC_API.G_RET_STS_ERROR;
2728
2729 END IF;
2730 --commented for bug#6317316 harlaksh
2731 --END IF;
2732 --commented for bug#6317316 harlaksh
2733
2734 END LOOP;
2735
2736 END LOOP;
2737
2738 CLOSE l_get_line_details_csr;
2739
2740
2741
2742 /* Commented out because it's getting called in check_required_values
2743 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
2744 OKC_API.set_message(
2745 p_app_name => G_APP_NAME,
2746 p_msg_name => 'OKS_QA_SUCCESS');
2747 END IF;
2748 */
2749 EXCEPTION
2750 WHEN G_EXCEPTION_HALT_VALIDATION THEN
2751 -- no processing necessary; validation can continue with next column
2752 NULL;
2753 WHEN OTHERS THEN
2754 -- store SQL error message on message stack
2755 OKC_API.SET_MESSAGE(
2756 p_app_name => G_APP_NAME,
2757 p_msg_name => G_UNEXPECTED_ERROR,
2758 p_token1 => G_SQLCODE_TOKEN,
2759 p_token1_value => SQLCODE,
2760 p_token2 => G_SQLERRM_TOKEN,
2761 p_token2_value => SQLERRM);
2762 -- notify caller of an error as UNEXPETED error
2763 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
2764 -- verify that cursor was closed
2765
2766 IF l_cle_csr%ISOPEN THEN
2767 CLOSE l_cle_csr;
2768 END IF;
2769
2770 IF l_cpl_csr%ISOPEN THEN
2771 CLOSE l_cpl_csr;
2772 END IF;
2773
2774 END check_req_values;
2775
2776 /*============================================================================+
2777 | Procedure: Get_Cust_Trx_Type_Id
2778 |
2779 | Purpose: Gets transaction type ID for check_tax_exemption
2780 | If no transaction type ID is found for the given org and
2781 | transaction type, a default value will be used
2782 |
2783 | In Parameters: p_org_id the org id
2784 | p_inv_trx_type the transaction type
2785 | Return: transaction type ID
2786 |
2787 +============================================================================*/
2788
2789 FUNCTION Get_Cust_Trx_Type_Id(p_org_id IN NUMBER,
2790 p_inv_trx_type IN VARCHAR2) RETURN NUMBER
2791 IS
2792
2793 CURSOR Cur_custtrx_type_id(bookId NUMBER, object1Id1 NUMBER, orgId NUMBER) IS
2794 SELECT Cust_trx_type_id
2795 FROM RA_CUST_TRX_TYPES_ALL
2796 WHERE SET_OF_BOOKS_ID = bookId
2797 AND org_id = orgId
2798 AND Cust_trx_type_id = NVL(object1Id1, - 99);
2799
2800
2801 CURSOR Cur_default_custtrx_type_id(bookId NUMBER, orgId NUMBER) IS
2802 SELECT Cust_trx_type_id
2803 FROM RA_CUST_TRX_TYPES_ALL
2804 WHERE SET_OF_BOOKS_ID = bookId
2805 AND org_id = orgId
2806 AND TYPE = 'INV' AND name = 'Invoice-OKS' AND SYSDATE <= nvl(end_date, SYSDATE);
2807
2808 CURSOR l_org_csr IS
2809 SELECT set_of_books_id
2810 FROM ar_system_parameters_all
2811 WHERE org_id = p_org_id;
2812
2813 l_api_name CONSTANT VARCHAR2(30) := 'Get_Cust_Trx_Type_Id';
2814 l_cust_trx_type_id NUMBER;
2815 l_set_of_books_id NUMBER;
2816
2817 BEGIN
2818 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2819 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name,'Entering: '|| l_api_name);
2820 END IF;
2821
2822 l_cust_trx_type_id := NULL;
2823
2824 OPEN l_org_csr;
2825 FETCH l_org_csr INTO l_set_of_books_id ;
2826 CLOSE l_org_csr;
2827
2828
2829
2830 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2831 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_set_of_books_id: '|| l_set_of_books_id);
2832 END IF;
2833
2834 IF p_inv_trx_type IS NOT NULL THEN
2835 OPEN Cur_custtrx_type_id(l_set_of_books_id,
2836 p_inv_trx_type,
2837 p_org_id);
2838 FETCH Cur_custtrx_type_id INTO l_cust_trx_type_id;
2839 CLOSE Cur_custtrx_type_id;
2840
2841 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2842 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'p_inv_trx_type is not null');
2843 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_set_of_books_id: '|| l_set_of_books_id);
2844 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'p_org_id: ' || p_org_id);
2845 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_cust_trx_type_id: ' || l_cust_trx_type_id);
2846 END IF;
2847
2848 END IF;
2849
2850
2851
2852 IF l_cust_trx_type_id IS NULL THEN
2853 OPEN Cur_default_custtrx_type_id(l_set_of_books_id,
2854 p_org_id);
2855 FETCH Cur_default_custtrx_type_id INTO l_cust_trx_type_id;
2856 CLOSE Cur_default_custtrx_type_id;
2857
2858 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2859 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_cust_trx_type_id is null, getting the default value.');
2860 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'default l_cust_trx_type_id: ' || l_cust_trx_type_id);
2861 END IF;
2862
2863 END IF;
2864
2865 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2866 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name,'Leaving: '|| l_api_name);
2867 END IF;
2868
2869 RETURN l_cust_trx_type_id;
2870 EXCEPTION
2871 WHEN OTHERS THEN
2872 OKC_API.set_message(G_APP_NAME, G_UNEXPECTED_ERROR, G_SQLCODE_TOKEN, SQLCODE, G_SQLERRM_TOKEN, SQLERRM);
2873 IF (FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2874 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, G_PKG_NAME || '.' || l_api_name,'Exception OTHERS: '|| SQLERRM);
2875 END IF;
2876
2877 END Get_Cust_Trx_Type_Id;
2878
2879 /*============================================================================+
2880 | Procedure: check_tax_exemption
2881 |
2882 | Purpose: Gets the approval status of the tax_exempt.
2883 | Reports an error if its invalid. It also reports an error
2884 | if the line start date is not between the satrt date and
2885 | end date of the tax exemption.
2886 |
2887 | In Parameters: p_chr_id the contract id
2888 | Out Parameters: x_return_status standard return status
2889 |
2890 +============================================================================*/
2891 PROCEDURE check_tax_exemption(
2892 x_return_status OUT NOCOPY VARCHAR2,
2893 p_chr_id IN NUMBER
2894 )
2895 IS
2896 l_api_name CONSTANT VARCHAR2(30) := 'check_tax_exemption';
2897 l_mod_name VARCHAR2(256) := G_APP_NAME || '.PLSQL.' || G_PKG_NAME || '.' || l_api_name;
2898 l_api_version CONSTANT NUMBER := 1;
2899 l_error_text VARCHAR2(512);
2900
2901
2902 --Begin: Add for R12
2903 -- if the statement fetches a row then the exemption
2904 -- is valid for the transaction date; if it cursor does not
2905 -- fetch a row, raise error
2906 CURSOR old_valid_exemption_csr(l_tax_exemption_id NUMBER, l_start_date DATE)
2907 IS
2908 SELECT v2.exempt_certificate_number
2909 FROM zx_exemptions v2
2910 WHERE (trunc(l_start_date) BETWEEN trunc(v2.EFFECTIVE_FROM)
2911 AND nvl(trunc(v2.EFFECTIVE_TO), trunc(l_start_date)))
2912 AND v2.tax_exemption_id = l_tax_exemption_id;
2913
2914
2915
2916
2917 CURSOR old_exemption_period_csr(l_start_date DATE, l_tax_exemption_id NUMBER, l_trx_date DATE)
2918 IS
2919 SELECT exempt_certificate_number, effective_from, effective_to
2920 FROM zx_exemptions v1
2921 WHERE EXEMPTION_STATUS_CODE IN ('PRIMARY', 'MANUAL', 'UNAPPROVED')
2922 AND v1.tax_exemption_id = l_tax_exemption_id --selected tax_exemption_id from top_line_csr
2923 AND NOT EXISTS(
2924 SELECT 1 FROM zx_exemptions v2
2925 WHERE v2.tax_exemption_id = l_tax_exemption_id
2926 AND trunc(l_trx_date) BETWEEN trunc(v1.EFFECTIVE_FROM) AND nvl(trunc(v1.EFFECTIVE_TO), trunc(l_trx_date ))
2927 )
2928 ;
2929
2930
2931
2932
2933 CURSOR old_approved_exemption_csr(l_tax_exempt_id NUMBER)
2934 IS
2935 -- if the sql statement fetches a row, raise error.
2936 SELECT exemption_status_code
2937 FROM ZX_EXEMPTIONS
2938 WHERE exemption_status_code = 'UNAPPROVED'
2939 AND TAX_EXEMPTION_ID = l_tax_exempt_id;
2940
2941
2942
2943
2944 CURSOR tax_info_csr(p_site_use_id IN NUMBER) IS
2945 SELECT c.party_id,
2946 a.party_site_id,
2947 a.cust_account_id,
2948 a.org_id
2949 FROM hz_cust_acct_sites_all a,
2950 hz_cust_site_uses_all b,
2951 hz_party_sites c
2952 WHERE a.cust_acct_site_id = b.cust_acct_site_id
2953 AND c.party_site_id = a.party_site_id
2954 AND b.site_use_id = p_site_use_id;
2955
2956 l_bill_tax_info_rec tax_info_csr%ROWTYPE;
2957 l_ship_tax_info_rec tax_info_csr%ROWTYPE;
2958 l_hdr_bill_tax_rec tax_info_csr%ROWTYPE;
2959 l_hdr_ship_tax_rec tax_info_csr%ROWTYPE;
2960
2961 --End: Add for R12
2962
2963
2964 -- added for tax exemption project
2965 -- select tax exemption_id and cle_id
2966
2967 CURSOR top_line_csr(p_chr_id IN NUMBER) IS
2968 SELECT CLEB.id,
2969 tax_exemption_id,
2970 line_number,
2971 bill_to_site_use_id,
2972 ship_to_site_use_id,
2973 cust_acct_id,
2974 start_date,
2975 exempt_certificate_number,
2976 exempt_reason_code
2977
2978 FROM
2979 OKC_K_LINES_B CLEB,
2980 OKS_K_LINES_B KLN
2981 WHERE
2982 CLEB.dnz_chr_id = p_chr_id AND
2983 CLEB.ID = KLN.CLE_ID AND
2984 lse_id IN (1, 12, 19, 46);
2985
2986 -- added for tax exemption project
2987 -- select date transaction
2988
2989 CURSOR trx_date_csr(l_cle_id IN NUMBER) IS
2990 SELECT MAX(date_transaction)
2991 FROM oks_level_elements
2992 WHERE parent_cle_id = l_cle_id;
2993
2994
2995 -- GCHADHA --
2996 -- 5/6/2005 --
2997 -- IKON ENHANCEMENT --
2998 CURSOR old_check_tax_exempt_acct(l_tax_exemption_id IN NUMBER ) IS
2999 SELECT cust_account_id
3000 FROM zx_exemptions
3001 WHERE exemption_status_code IN ('PRIMARY', 'MANUAL', 'UNAPPROVED')
3002 AND tax_exemption_id = l_tax_exemption_id; --selected tax_exemption_id from top_line_csr
3003
3004 /** not needed for new R12 flow bug 5264786
3005 CURSOR new_check_tax_exempt_acct(l_tax_exempt_number VARCHAR2,
3006 l_tax_exempt_reason_code VARCHAR2) IS
3007 SELECT cust_account_id
3008 FROM zx_exemptions_v
3009 WHERE EXEMPT_CERTIFICATE_NUMBER = l_tax_exempt_number
3010 AND EXEMPT_REASON_CODE = l_tax_exempt_reason_code
3011 AND exemption_status_code IN ('PRIMARY', 'MANUAL', 'UNAPPROVED');
3012 **/
3013
3014 CURSOR Get_Customer_Name (p_cust_acct_id IN NUMBER) IS
3015 SELECT name
3016 FROM okx_customer_accounts_v
3017 WHERE id1 = p_cust_acct_id;
3018
3019 -- IKON ENHANCEMENT -
3020 CURSOR get_hdr_tax_exemp(p_chr_id NUMBER) IS
3021 SELECT
3022 tax_exemption_id,
3023 exempt_certificate_number,
3024 exempt_reason_code,
3025 bill_to_site_use_id,
3026 ship_to_site_use_id,
3027 cust_acct_id,
3028 start_date,
3029 end_date
3030 FROM
3031 okc_k_headers_all_b OKC,
3032 OKS_K_HEADERS_B OKS
3033 WHERE
3034 OKC.id = p_chr_id AND
3035 OKC.ID = OKS.chr_id
3036 AND (exempt_certificate_number IS NOT NULL
3037 OR tax_exemption_id IS NOT NULL);
3038 hdr_tax_exemp_rec get_hdr_tax_exemp%ROWTYPE;
3039
3040
3041 CURSOR Cur_Batch_Source_Id(p_org_id IN NUMBER)
3042 IS
3043 SELECT BATCH_SOURCE_ID
3044 FROM ra_batch_sources_all
3045 WHERE org_id = p_org_id
3046 AND NAME = 'OKS_CONTRACTS';
3047
3048 CURSOR Cur_Inv_Trx_Type(p_chr_id IN NUMBER)
3049 IS
3050 SELECT inv_trx_type
3051 FROM OKS_K_HEADERS_B
3052 WHERE OKS_K_HEADERS_B.id = p_chr_id;
3053
3054 CURSOR cust_acct_csr(p_site_use_id NUMBER) IS
3055 SELECT ACCT_SITE_SHIP.CUST_ACCOUNT_ID
3056 FROM
3057 HZ_CUST_SITE_USES_ALL S_SHIP,
3058 HZ_CUST_ACCT_SITES_ALL ACCT_SITE_SHIP
3059 WHERE S_SHIP.SITE_USE_ID = p_site_use_id
3060 AND S_SHIP.CUST_ACCT_SITE_ID = acct_site_ship.cust_acct_site_id
3061 ;
3062
3063
3064
3065
3066
3067 --l_cle_id NUMBER;
3068 l_tax_exemption_id NUMBER;
3069 l_status VARCHAR2(30);
3070 l_trx_date DATE;
3071 --l_number NUMBER;
3072 l_tax_exemption_number VARCHAR2(80);
3073 l_start_date DATE;
3074 --l_line_start_date DATE; -- Added for bug # 4069388
3075 --l_exemption_id number;
3076 l_end_date DATE;
3077 l_bill_to_site_use_id NUMBER;
3078 l_ship_to_site_use_id NUMBER;
3079
3080 --l_cust_acct_id NUMBER;
3081
3082
3083 TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3084 TYPE dte_tbl_type IS TABLE OF DATE INDEX BY BINARY_INTEGER;
3085 TYPE chr80_tbl_type IS TABLE OF VARCHAR2(80) INDEX BY BINARY_INTEGER;
3086 TYPE chr30_tbl_type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
3087
3088 l_cle_id_tbl num_tbl_type;
3089 l_tax_exemption_id_tbl num_tbl_type;
3090 l_number_tbl num_tbl_type;
3091 l_bill_to_site_use_id_tbl num_tbl_type;
3092 l_ship_to_site_use_id_tbl num_tbl_type;
3093 l_cust_acct_id_tbl num_tbl_type;
3094 l_line_start_date_tbl dte_tbl_type;
3095 l_exempt_cert_number_tbl chr80_tbl_type;
3096 l_exempt_reason_code_tbl chr30_tbl_type;
3097
3098
3099 -- IKON ENHANCEMENT --
3100 -- GCHADHA --
3101 -- 5/6/2005 --
3102 l_cust_acct_name VARCHAR2(360);
3103 l_tax_exempt_acct NUMBER;
3104 -- IKON ENHANCEMENT --
3105
3106 --Added in R12
3107 l_exempt_certificate_number VARCHAR2(80);
3108 l_exempt_reason_code VARCHAR2(30);
3109 l_bill_to_party_site_id NUMBER;
3110 l_ship_to_party_site_id NUMBER;
3111 l_bill_to_cust_acct_id NUMBER;
3112 l_bill_to_party_id NUMBER;
3113 l_legal_entity_id NUMBER;
3114 l_org_id NUMBER;
3115 l_inv_trx_type OKS_K_HEADERS_B.inv_trx_type%TYPE;
3116 l_cust_trx_type_id NUMBER;
3117 l_batch_source_id NUMBER;
3118
3119 l_valid_flag VARCHAR2(1);
3120 l_return_status VARCHAR2(1);
3121 l_msg_count NUMBER;
3122 l_msg_data VARCHAR2(2000);
3123
3124 BEGIN
3125 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3126 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, l_mod_name || '.begin', 'p_chrid=' || p_chr_id);
3127 END IF;
3128
3129 --basic input validation
3130 IF(p_chr_id IS NULL) THEN
3131 FND_MESSAGE.set_name(G_APP_NAME, 'OKS_MANDATORY_ARG');
3132 FND_MESSAGE.set_token('ARG_NAME', 'p_chr_id');
3133 FND_MESSAGE.set_token('PROG_NAME', G_PKG_NAME || '.' || l_api_name);
3134 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
3135 FND_LOG.message(FND_LOG.level_error, l_mod_name || '.input_validation', FALSE);
3136 END IF;
3137 FND_MSG_PUB.ADD;
3138 RAISE FND_API.g_exc_error;
3139 END IF;
3140
3141 -- initialize return status
3142 x_return_status := OKC_API.G_RET_STS_SUCCESS;
3143
3144
3145
3146 --modified top_line_csr to use bulk collect for bug 5442886
3147
3148 OPEN top_line_csr(p_chr_id);
3149 LOOP
3150 FETCH top_line_csr BULK COLLECT INTO l_cle_id_tbl,l_tax_exemption_id_tbl, l_number_tbl,
3151 l_bill_to_site_use_id_tbl, l_ship_to_site_use_id_tbl, l_cust_acct_id_tbl, l_line_start_date_tbl,
3152 l_exempt_cert_number_tbl, l_exempt_reason_code_tbl LIMIT G_BULK_FETCH_LIMIT;
3153
3154 EXIT WHEN l_cle_id_tbl.COUNT = 0;
3155
3156 FOR i IN l_cle_id_tbl.FIRST..l_cle_id_tbl.LAST LOOP
3157
3158 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3159 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'After querying the top line');
3160 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_cle_id: '|| l_cle_id_tbl(i));
3161 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_tax_exemption_id: '|| l_tax_exemption_id_tbl(i));
3162 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_number: '|| l_number_tbl(i));
3163 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_bill_to_site_use_id: '|| l_bill_to_site_use_id_tbl(i));
3164 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_ship_to_site_use_id: '|| l_ship_to_site_use_id_tbl(i));
3165 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_cust_acct_id: '|| l_cust_acct_id_tbl(i));
3166 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_line_start_date: '|| l_line_start_date_tbl(i));
3167 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_exempt_cert_number: '|| l_exempt_cert_number_tbl(i));
3168 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_exempt_reason_code: '|| l_exempt_reason_code_tbl(i));
3169 END IF;
3170
3171
3172 IF l_exempt_cert_number_tbl(i) IS NOT NULL THEN
3173 --New contracts
3174 l_trx_date := NULL;
3175 OPEN trx_date_csr(l_cle_id_tbl(i));
3176 FETCH trx_date_csr INTO l_trx_date;
3177 CLOSE trx_date_csr;
3178
3179 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3180 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_trx_date: '|| l_trx_date);
3181 END IF;
3182
3183 OPEN tax_info_csr(l_bill_to_site_use_id_tbl(i));
3184 FETCH tax_info_csr INTO l_bill_tax_info_rec;
3185 IF tax_info_csr%FOUND THEN
3186 l_bill_to_party_site_id := l_bill_tax_info_rec.party_site_id;
3187 l_bill_to_party_id := l_bill_tax_info_rec.party_id;
3188 l_bill_to_cust_acct_id := l_bill_tax_info_rec.cust_account_id;
3189 l_org_id := l_bill_tax_info_rec.org_id;
3190 END IF;
3191 CLOSE tax_info_csr;
3192
3193 IF l_bill_to_cust_acct_id IS NULL THEN
3194 --if cust_acct_id is null, we can derive it from the site_use_id
3195 OPEN cust_acct_csr(l_bill_to_site_use_id_tbl(i));
3196 FETCH cust_acct_csr INTO l_bill_to_cust_acct_id;
3197 CLOSE cust_acct_csr;
3198 END IF;
3199
3200 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3201 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_bill_to_party_site_id: '|| l_bill_to_party_site_id);
3202 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_bill_to_party_id: '|| l_bill_to_party_id);
3203 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_bill_to_cust_acct_id: '|| l_bill_to_cust_acct_id);
3204 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_org_id: '|| l_org_id);
3205 END IF;
3206
3207 OPEN tax_info_csr(l_ship_to_site_use_id_tbl(i));
3208 FETCH tax_info_csr INTO l_ship_tax_info_rec;
3209 IF tax_info_csr%FOUND THEN
3210 l_ship_to_party_site_id := l_ship_tax_info_rec.party_site_id;
3211 END IF;
3212 CLOSE tax_info_csr;
3213 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3214 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_ship_to_party_site_id: '|| l_ship_to_party_site_id);
3215 END IF;
3216
3217 --inv_trx_type is per contract
3218 --so to avoid execute the query multiple times over multiple lines,
3219 --we put a conditional check
3220 IF l_inv_trx_type IS NULL THEN
3221 OPEN Cur_Inv_Trx_Type(p_chr_id);
3222 FETCH Cur_Inv_Trx_Type INTO l_inv_trx_type;
3223 CLOSE Cur_Inv_Trx_Type;
3224 END IF;
3225
3226 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3227 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_inv_trx_type: '|| l_inv_trx_type);
3228 END IF;
3229
3230 l_cust_trx_type_id := Get_Cust_Trx_Type_Id(l_org_id, l_inv_trx_type);
3231 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3232 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_cust_trx_type_id: '|| l_cust_trx_type_id);
3233 END IF;
3234
3235 OPEN Cur_Batch_Source_Id(l_org_id);
3236 FETCH Cur_Batch_Source_Id INTO l_batch_source_id;
3237 CLOSE Cur_Batch_Source_Id;
3238
3239 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3240 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_batch_source_id: '|| l_batch_source_id);
3241 END IF;
3242
3243
3244 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3245 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'Before calling ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS on l_line_start_date: '|| l_line_start_date_tbl(i));
3246 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_tax_exempt_number: '|| l_exempt_cert_number_tbl(i));
3247 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_tax_exempt_reason_code: '|| l_exempt_reason_code_tbl(i));
3248 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_ship_to_org_id: '|| l_ship_to_site_use_id_tbl(i));
3249 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_invoice_to_org_id: '|| l_bill_to_site_use_id_tbl(i));
3250 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_bill_to_cust_account_id: '|| l_bill_to_cust_acct_id);
3251 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_ship_to_party_site_id: '|| l_ship_to_party_site_id);
3252 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_bill_to_party_site_id: '|| l_bill_to_party_site_id);
3253 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_org_id: '|| l_org_id);
3254 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_bill_to_party_id: '|| l_bill_to_party_id);
3255 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_legal_entity_id: '|| l_legal_entity_id);
3256 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_trx_type_id: '|| l_cust_trx_type_id);
3257 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_batch_source_id: '|| l_batch_source_id);
3258 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_trx_date: '|| l_line_start_date_tbl(i));
3259 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_exemption_status: '|| 'PMU');
3260 END IF;
3261
3262 ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS
3263 (p_tax_exempt_number => l_exempt_cert_number_tbl(i),
3264 p_tax_exempt_reason_code => l_exempt_reason_code_tbl(i),
3265 p_ship_to_org_id => l_ship_to_site_use_id_tbl(i),
3266 p_invoice_to_org_id => l_bill_to_site_use_id_tbl(i),
3267 p_bill_to_cust_account_id => l_bill_to_cust_acct_id,
3268 p_ship_to_party_site_id => l_ship_to_party_site_id,
3269 p_bill_to_party_site_id => l_bill_to_party_site_id,
3270 p_org_id => l_org_id,
3271 p_bill_to_party_id => l_bill_to_party_id,
3272 p_legal_entity_id => l_legal_entity_id, --per Nilesh Patel, legal_entity_id is optional
3273 p_trx_type_id => l_cust_trx_type_id,
3274 p_batch_source_id => l_batch_source_id,
3275 p_trx_date => l_line_start_date_tbl(i),
3276 p_exemption_status => 'PMU', --fix bug 4766994
3277 x_valid_flag => l_valid_flag,
3278 x_return_status => l_return_status,
3279 x_msg_count => l_msg_count,
3280 x_msg_data => l_msg_data);
3281
3282 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3283 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'After calling ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS on l_line_start_date: '|| l_line_start_date_tbl(i));
3284 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_valid_flag: '|| l_valid_flag);
3285 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_legal_entity_id: '|| l_legal_entity_id);
3286 END IF;
3287
3288
3289 IF l_valid_flag <> 'Y' THEN
3290
3291 OKC_API.set_message(p_app_name => G_APP_NAME,
3292 p_msg_name => G_INVALID_TAX_EXEMPT_DATE,
3293 p_token1 => 'LINE_NUM',
3294 p_token1_value => l_number_tbl(i),
3295 p_token2 => 'EXEMPT_NUM',
3296 p_token2_value => l_exempt_cert_number_tbl(i)
3297 );
3298
3299 x_return_status := OKC_API.G_RET_STS_ERROR;
3300
3301
3302 -- GCHADHA --
3303 -- IKON Enhancement --
3304 -- 5/6/2005 --
3305 ELSE
3306 --now check if the exemption is valid at the transaction date (end date)
3307 --of the contract
3308 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3309 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'Before calling ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS on l_trx_date: '|| l_trx_date);
3310 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_tax_exempt_number: '|| l_exempt_cert_number_tbl(i));
3311 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_tax_exempt_reason_code: '|| l_exempt_reason_code_tbl(i));
3312 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_ship_to_org_id: '|| l_ship_to_site_use_id_tbl(i));
3313 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_invoice_to_org_id: '|| l_bill_to_site_use_id_tbl(i));
3314 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_bill_to_cust_account_id: '|| l_bill_to_cust_acct_id);
3315 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_ship_to_party_site_id: '|| l_ship_to_party_site_id);
3316 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_bill_to_party_site_id: '|| l_bill_to_party_site_id);
3317 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_org_id: '|| l_org_id);
3318 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_bill_to_party_id: '|| l_bill_to_party_id);
3319 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_legal_entity_id: '|| l_legal_entity_id);
3320 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_trx_type_id: '|| l_cust_trx_type_id);
3321 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_batch_source_id: '|| l_batch_source_id);
3322 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_trx_date: '|| l_line_start_date_tbl(i));
3323 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'p_exemption_status: '|| 'PMU');
3324 END IF;
3325
3326 ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS
3327 (p_tax_exempt_number => l_exempt_cert_number_tbl(i),
3328 p_tax_exempt_reason_code => l_exempt_reason_code_tbl(i),
3329 p_ship_to_org_id => l_ship_to_site_use_id_tbl(i),
3330 p_invoice_to_org_id => l_bill_to_site_use_id_tbl(i),
3331 p_bill_to_cust_account_id => l_bill_to_cust_acct_id,
3332 p_ship_to_party_site_id => l_ship_to_party_site_id,
3333 p_bill_to_party_site_id => l_bill_to_party_site_id,
3334 p_org_id => l_org_id,
3335 p_bill_to_party_id => l_bill_to_party_id,
3336 p_legal_entity_id => l_legal_entity_id, --per Nilesh Patel, legal_entity_id is optional
3337 p_trx_type_id => l_cust_trx_type_id,
3338 p_batch_source_id => l_batch_source_id,
3339 p_trx_date => l_trx_date,
3340 p_exemption_status => 'PMU', --fix bug 4766994
3341 x_valid_flag => l_valid_flag,
3342 x_return_status => l_return_status,
3343 x_msg_count => l_msg_count,
3344 x_msg_data => l_msg_data);
3345
3346 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3347 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'After calling ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS on l_trx_date: '|| l_trx_date);
3348 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_valid_flag: '|| l_valid_flag);
3349 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_legal_entity_id: '|| l_legal_entity_id);
3350 END IF;
3351
3352 IF l_valid_flag <> 'Y' THEN
3353 OKC_API.set_message(
3354 p_app_name => G_APP_NAME,
3355 p_msg_name => 'OKS_PARTIAL_TAX_EXEMPT_LINE',
3356 p_token1 => 'EXEMPT_NUM',
3357 p_token1_value => l_exempt_cert_number_tbl(i),
3358 p_token2 => 'LINE_NUM',
3359 p_token2_value => l_number_tbl(i));
3360 -- notify caller of an error
3361 x_return_status := OKC_API.G_RET_STS_ERROR;
3362
3363 /** not needed for new R12 flow bug 5264786
3364 ELSE
3365
3366 OPEN new_check_tax_exempt_acct(l_exempt_certificate_number, l_exempt_reason_code);
3367 FETCH new_check_tax_exempt_acct INTO l_tax_exempt_acct;
3368 CLOSE new_check_tax_exempt_acct;
3369 IF l_tax_exempt_acct <> l_cust_acct_id THEN
3370 OPEN Get_Customer_Name (l_cust_acct_id);
3371 FETCH Get_Customer_Name INTO l_cust_acct_name;
3372 CLOSE Get_Customer_Name;
3373 OKC_API.set_message(
3374 p_app_name => G_APP_NAME,
3375 p_msg_name => G_INVALID_TAX_EXEMPT_LINE,
3376 p_token1 => 'TOKEN1',
3377 p_token1_value => l_exempt_certificate_number,
3378 p_token2 => 'TOKEN2',
3379 p_token2_value => l_cust_acct_name,
3380 p_token3 => 'TOKEN3',
3381 p_token3_value => l_number);
3382 x_return_status := OKC_API.G_RET_STS_ERROR;
3383 END IF;
3384 **/
3385
3386 -- END GCHADHA --
3387 -- 5/6/2005 --
3388 -- IKON Enhancement --
3389 END IF; --l_valid_flag <> 'Y'
3390
3391
3392
3393 END IF;
3394
3395
3396 ELSIF l_tax_exemption_id_tbl(i) IS NOT NULL THEN
3397 --historical contracts
3398 OPEN old_valid_exemption_csr(l_tax_exemption_id_tbl(i), l_line_start_date_tbl(i)); --old_valid_exemption_csr
3399 FETCH old_valid_exemption_csr INTO l_tax_exemption_number;
3400 -- if found means date does not fall between the start date/end date of the exemption
3401 IF old_valid_exemption_csr%FOUND THEN
3402 -- Line LINE_NUM start date does not fall within the effective dates
3403 -- for Tax Exemption EXEMPT_NUM. The Tax Exemption will not be applied to this line.
3404 OKC_API.set_message(p_app_name => G_APP_NAME,
3405 p_msg_name => G_INVALID_TAX_EXEMPT_DATE,
3406 p_token1 => 'LINE_NUM',
3407 p_token1_value => l_number_tbl(i),
3408 p_token2 => 'EXEMPT_NUM',
3409 p_token2_value => l_tax_exemption_number
3410 );
3411 x_return_status := OKC_API.G_RET_STS_ERROR;
3412
3413 ELSE
3414 OPEN trx_date_csr(l_cle_id_tbl(i));
3415 FETCH trx_date_csr INTO l_trx_date;
3416
3417 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3418 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_trx_date: '|| l_trx_date);
3419 END IF;
3420
3421 IF trx_date_csr%found AND l_tax_exemption_id_tbl(i) IS NOT NULL THEN
3422 OPEN old_exemption_period_csr (l_line_start_date_tbl(i), l_tax_exemption_id_tbl(i), l_trx_date) ;
3423 FETCH old_exemption_period_csr INTO l_tax_exemption_number, l_start_date, l_end_date ;
3424 IF old_exemption_period_csr%FOUND THEN
3425 OKC_API.set_message(
3426 p_app_name => G_APP_NAME,
3427 p_msg_name => G_INVALID_TAX_EXEMPT,
3428 p_token1 => 'EXEMPTNUMBER',
3429 p_token1_value => l_tax_exemption_number,
3430 p_token2 => 'LINE',
3431 p_token2_value => l_number_tbl(i),
3432 p_token3 => 'DATE',
3433 p_token3_value => l_end_date);
3434 -- notify caller of an error
3435 x_return_status := OKC_API.G_RET_STS_ERROR;
3436 -- GCHADHA --
3437 -- IKON Enhancement --
3438 -- 5/6/2005 --
3439 ELSE
3440 OPEN old_check_tax_exempt_acct(l_tax_exemption_id_tbl(i));
3441 FETCH old_check_tax_exempt_acct INTO l_tax_exempt_acct;
3442 CLOSE old_check_tax_exempt_acct;
3443 IF l_tax_exempt_acct <> l_cust_acct_id_tbl(i) THEN
3444 OPEN Get_Customer_Name (l_cust_acct_id_tbl(i));
3445 FETCH Get_Customer_Name INTO l_cust_acct_name;
3446 CLOSE Get_Customer_Name;
3447 OKC_API.set_message(
3448 p_app_name => G_APP_NAME,
3449 p_msg_name => G_INVALID_TAX_EXEMPT_LINE,
3450 p_token1 => 'TOKEN1',
3451 p_token1_value => l_tax_exemption_number,
3452 p_token2 => 'TOKEN2',
3453 p_token2_value => l_cust_acct_name,
3454 p_token3 => 'TOKEN3',
3455 p_token3_value => l_number_tbl(i));
3456 x_return_status := OKC_API.G_RET_STS_ERROR;
3457 END IF;
3458 -- END GCHADHA --
3459 -- 5/6/2005 --
3460 -- IKON Enhancement --
3461 END IF;
3462 CLOSE old_exemption_period_csr;
3463 END IF;
3464 CLOSE trx_date_csr;
3465 END IF;
3466 CLOSE old_valid_exemption_csr;
3467 -- Added for bug # 4085884
3468
3469 OPEN old_approved_exemption_csr(l_tax_exemption_id_tbl(i)); --old_approved_exemption_csr
3470 FETCH old_approved_exemption_csr INTO l_status;
3471 IF old_approved_exemption_csr%FOUND THEN
3472 -- Line LINE_NUM has an unapproved exemption. Billing this
3473 -- line will result in creation of an invoice with an
3474 -- unapproved tax exemption.
3475 OKC_API.set_message(p_app_name => G_APP_NAME,
3476 p_msg_name => G_UNAPPROVED_TAX_EXEMPT,
3477 p_token1 => 'LINE_NUM',
3478 p_token1_value => l_number_tbl(i)
3479 );
3480 x_return_status := OKC_API.G_RET_STS_ERROR;
3481 END IF;
3482 CLOSE old_approved_exemption_csr;
3483
3484 END IF;
3485
3486 END LOOP;
3487
3488 END LOOP;
3489
3490 CLOSE top_line_csr;
3491
3492
3493
3494 OPEN get_hdr_tax_exemp(p_chr_id);
3495 FETCH get_hdr_tax_exemp INTO hdr_tax_exemp_rec;
3496 IF get_hdr_tax_exemp%FOUND THEN
3497 IF hdr_tax_exemp_rec.tax_exemption_id IS NOT NULL THEN
3498 OPEN old_approved_exemption_csr(hdr_tax_exemp_rec.tax_exemption_id);
3499 FETCH old_approved_exemption_csr INTO l_status;
3500 IF old_approved_exemption_csr%FOUND THEN
3501 OKC_API.set_message(p_app_name => G_APP_NAME,
3502 p_msg_name => G_UNAPPROVED_HDR_TAX_EXEMPT
3503 );
3504 x_return_status := OKC_API.G_RET_STS_ERROR;
3505 END IF;
3506 CLOSE old_approved_exemption_csr;
3507 ELSIF hdr_tax_exemp_rec.exempt_certificate_number IS NOT NULL THEN
3508 -- This contract has an unapproved exemption. Billing this
3509 -- contract will result in creation of an invoice with an
3510 -- unapproved tax exemption.
3511
3512
3513 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3514 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_trx_date: '|| l_trx_date);
3515 END IF;
3516
3517 OPEN tax_info_csr(hdr_tax_exemp_rec.bill_to_site_use_id);
3518 FETCH tax_info_csr INTO l_hdr_bill_tax_rec;
3519 IF tax_info_csr%FOUND THEN
3520 l_bill_to_party_site_id := l_hdr_bill_tax_rec.party_site_id;
3521 l_bill_to_party_id := l_hdr_bill_tax_rec.party_id;
3522 l_bill_to_cust_acct_id := l_hdr_bill_tax_rec.cust_account_id;
3523 l_org_id := l_hdr_bill_tax_rec.org_id;
3524 ELSE
3525 --this is to avoid the case when the values on the line are retained
3526 --even though there's no value on the header
3527 l_bill_to_party_site_id := NULL;
3528 l_bill_to_party_id := NULL;
3529 l_bill_to_cust_acct_id := NULL;
3530 l_org_id := NULL;
3531 END IF;
3532 CLOSE tax_info_csr;
3533
3534 IF l_bill_to_cust_acct_id IS NULL THEN
3535 --if cust_acct_id is null, we can derive it from the site_use_id
3536 OPEN cust_acct_csr(hdr_tax_exemp_rec.bill_to_site_use_id);
3537 FETCH cust_acct_csr INTO l_bill_to_cust_acct_id;
3538 CLOSE cust_acct_csr;
3539 END IF;
3540
3541 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3542 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_bill_to_party_site_id: '|| l_bill_to_party_site_id);
3543 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_bill_to_party_id: '|| l_bill_to_party_id);
3544 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_bill_to_cust_acct_id: '|| l_bill_to_cust_acct_id);
3545 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_org_id: '|| l_org_id);
3546 END IF;
3547
3548 OPEN tax_info_csr(hdr_tax_exemp_rec.ship_to_site_use_id);
3549 FETCH tax_info_csr INTO l_hdr_ship_tax_rec;
3550 IF tax_info_csr%FOUND THEN
3551 l_ship_to_party_site_id := l_hdr_ship_tax_rec.party_site_id;
3552 END IF;
3553 CLOSE tax_info_csr;
3554 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3555 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_ship_to_party_site_id: '|| l_ship_to_party_site_id);
3556 END IF;
3557
3558 --inv_trx_type is already obtained from the header, so no need to
3559 --re-execute the query to get the trx_type_id
3560 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3561 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_inv_trx_type: '|| l_inv_trx_type);
3562 END IF;
3563
3564 l_cust_trx_type_id := Get_Cust_Trx_Type_Id(l_org_id, l_inv_trx_type);
3565 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3566 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_cust_trx_type_id: '|| l_cust_trx_type_id);
3567 END IF;
3568
3569 OPEN Cur_Batch_Source_Id(l_org_id);
3570 FETCH Cur_Batch_Source_Id INTO l_batch_source_id;
3571 CLOSE Cur_Batch_Source_Id;
3572
3573 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3574 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_batch_source_id: '|| l_batch_source_id);
3575 END IF;
3576
3577
3578 ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS
3579 (p_tax_exempt_number => hdr_tax_exemp_rec.exempt_certificate_number,
3580 p_tax_exempt_reason_code => hdr_tax_exemp_rec.exempt_reason_code,
3581 p_ship_to_org_id => hdr_tax_exemp_rec.ship_to_site_use_id, -- Modified By sjanakir for bug#6709146
3582 p_invoice_to_org_id => hdr_tax_exemp_rec.bill_to_site_use_id, -- Modified By sjanakir for bug#6709146
3583 p_bill_to_cust_account_id => l_bill_to_cust_acct_id,
3584 p_ship_to_party_site_id => l_ship_to_party_site_id,
3585 p_bill_to_party_site_id => l_bill_to_party_site_id,
3586 p_org_id => l_org_id,
3587 p_bill_to_party_id => l_bill_to_party_id,
3588 p_legal_entity_id => l_legal_entity_id, --per Nilesh Patel, legal_entity_id is optional
3589 p_trx_type_id => l_cust_trx_type_id,
3590 p_batch_source_id => l_batch_source_id,
3591 p_exemption_status => 'PMU', -- fix bug 4766994
3592 p_trx_date => hdr_tax_exemp_rec.start_date,
3593 x_valid_flag => l_valid_flag,
3594 x_return_status => l_return_status,
3595 x_msg_count => l_msg_count,
3596 x_msg_data => l_msg_data);
3597
3598 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3599 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'After calling ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS on header start_date: '|| hdr_tax_exemp_rec.start_date);
3600 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_valid_flag: '|| l_valid_flag);
3601 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_legal_entity_id: '|| l_legal_entity_id);
3602 END IF;
3603
3604
3605 IF l_valid_flag <> 'Y' THEN
3606 OKC_API.set_message(
3607 p_app_name => G_APP_NAME,
3608 p_msg_name => 'OKS_INVALID_TAX_EXEMPT_HEADER',
3609 p_token1 => 'EXEMPT_NUM',
3610 p_token1_value => hdr_tax_exemp_rec.exempt_certificate_number);
3611
3612 x_return_status := OKC_API.G_RET_STS_ERROR;
3613
3614 ELSE
3615 ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS
3616 (p_tax_exempt_number => hdr_tax_exemp_rec.exempt_certificate_number,
3617 p_tax_exempt_reason_code => hdr_tax_exemp_rec.exempt_reason_code,
3618 p_ship_to_org_id => hdr_tax_exemp_rec.ship_to_site_use_id, -- Modified By sjanakir for bug#6709146
3619 p_invoice_to_org_id => hdr_tax_exemp_rec.bill_to_site_use_id, -- Modified By sjanakir for bug#6709146
3620 p_bill_to_cust_account_id => l_bill_to_cust_acct_id,
3621 p_ship_to_party_site_id => l_ship_to_party_site_id,
3622 p_bill_to_party_site_id => l_bill_to_party_site_id,
3623 p_org_id => l_org_id,
3624 p_bill_to_party_id => l_bill_to_party_id,
3625 p_legal_entity_id => l_legal_entity_id, --per Nilesh Patel, legal_entity_id is optional
3626 p_trx_type_id => l_cust_trx_type_id,
3627 p_batch_source_id => l_batch_source_id,
3628 p_trx_date => hdr_tax_exemp_rec.end_date,
3629 p_exemption_status => 'PMU', --fix bug 4766994
3630 x_valid_flag => l_valid_flag,
3631 x_return_status => l_return_status,
3632 x_msg_count => l_msg_count,
3633 x_msg_data => l_msg_data);
3634
3635 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3636 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'After calling ZX_TCM_VALIDATE_EXEMPT_PKG.VALIDATE_TAX_EXEMPTIONS on header end_date: '|| hdr_tax_exemp_rec.end_date);
3637 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_valid_flag: '|| l_valid_flag);
3638 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, l_mod_name,'l_legal_entity_id: '|| l_legal_entity_id);
3639 END IF;
3640 IF l_valid_flag <> 'Y' THEN
3641 OKC_API.set_message(
3642 p_app_name => G_APP_NAME,
3643 p_msg_name => 'OKS_PARTIAL_TAX_EXEMPT_HEADER',
3644 p_token1 => 'EXEMPT_NUM',
3645 p_token1_value => hdr_tax_exemp_rec.exempt_certificate_number);
3646
3647 x_return_status := OKC_API.G_RET_STS_ERROR;
3648 END IF;
3649
3650
3651 END IF;
3652
3653
3654
3655 END IF;
3656 END IF;
3657 CLOSE get_hdr_tax_exemp;
3658
3659 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
3660 OKC_API.set_message(
3661 p_app_name => G_APP_NAME,
3662 p_msg_name => 'OKS_QA_SUCCESS');
3663 END IF;
3664
3665 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3666 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, l_mod_name,'Leaving: '|| l_api_name);
3667 END IF;
3668
3669 EXCEPTION
3670 WHEN G_EXCEPTION_HALT_VALIDATION THEN
3671 -- no processing necessary; validation can continue with next column
3672 NULL;
3673 WHEN OTHERS THEN
3674 -- store SQL error message on message stack
3675 OKC_API.SET_MESSAGE(
3676 p_app_name => G_APP_NAME,
3677 p_msg_name => G_UNEXPECTED_ERROR,
3678 p_token1 => G_SQLCODE_TOKEN,
3679 p_token1_value => SQLCODE,
3680 p_token2 => G_SQLERRM_TOKEN,
3681 p_token2_value => SQLERRM);
3682 -- notify caller of an error as UNEXPETED error
3683 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
3684 IF top_line_csr%ISOPEN THEN
3685 CLOSE top_line_csr;
3686 END IF;
3687
3688 IF trx_date_csr%ISOPEN THEN
3689 CLOSE trx_date_csr;
3690 END IF;
3691
3692 IF old_valid_exemption_csr%ISOPEN THEN
3693 CLOSE old_valid_exemption_csr;
3694 END IF;
3695
3696
3697 IF old_exemption_period_csr%ISOPEN THEN
3698 CLOSE old_exemption_period_csr;
3699 END IF;
3700
3701
3702 IF old_approved_exemption_csr%ISOPEN THEN
3703 CLOSE old_approved_exemption_csr;
3704 END IF;
3705
3706
3707 IF old_check_tax_exempt_acct%ISOPEN THEN
3708 CLOSE old_check_tax_exempt_acct;
3709 END IF;
3710
3711 /**
3712 IF new_check_tax_exempt_acct%ISOPEN THEN
3713 CLOSE new_check_tax_exempt_acct;
3714 END IF;
3715 **/
3716
3717 IF tax_info_csr%ISOPEN THEN
3718 CLOSE tax_info_csr;
3719 END IF;
3720
3721 IF Get_Customer_Name%ISOPEN THEN
3722 CLOSE Get_Customer_Name;
3723 END IF;
3724
3725 IF get_hdr_tax_exemp%ISOPEN THEN
3726 CLOSE get_hdr_tax_exemp;
3727 END IF;
3728
3729 IF Cur_Batch_Source_Id%ISOPEN THEN
3730 CLOSE Cur_Batch_Source_Id;
3731 END IF;
3732
3733 IF Cur_Inv_Trx_Type%ISOPEN THEN
3734 CLOSE Cur_Inv_Trx_Type;
3735 END IF;
3736
3737
3738 END check_tax_exemption;
3739
3740
3741
3742
3743
3744
3745
3746 /*============================================================================+
3747 | Procedure: check_cust_credit_hold
3748 |
3749 | Purpose: Checks if the customer is on credit hold.
3750 |
3751 | In Parameters: p_chr_id the contract id
3752 | Out Parameters: x_return_status standard return status
3753 |
3754 +============================================================================*/
3755 PROCEDURE check_cust_credit_hold(
3756 x_return_status OUT NOCOPY VARCHAR2,
3757 p_chr_id IN NUMBER
3758 )
3759 IS
3760 -- object1_id1 of BTO rule
3761 /*Modified cursor for bug8819474 as per appsperf team suggestion,
3762 added to_char to CA.CUST_ACCOUNT_ID */
3763 /* Modified for bug 7446647
3764 CURSOR check_cust_on_credit_hold
3765 IS
3766 SELECT prt.party_name
3767 FROM oe_hold_sources_all ohs,
3768 HZ_PARTIES prt,
3769 HZ_PARTY_SITES PS, HZ_CUST_ACCT_SITES_ALL CA, HZ_CUST_SITE_USES_ALL CS,
3770 okc_k_headers_all_b rl
3771 WHERE ohs.hold_entity_code = 'C'
3772 AND ohs.released_flag = 'N'
3773 AND ohs.org_id = okc_context.get_okc_org_id
3774 AND PS.PARTY_SITE_ID = CA.PARTY_SITE_ID
3775 AND CA.CUST_ACCT_SITE_ID = CS.CUST_ACCT_SITE_ID
3776 AND CS.SITE_USE_CODE = 'BILL_TO'
3777 AND PS.PARTY_ID = prt.party_id
3778 AND prt.PARTY_TYPE IN ('PERSON', 'ORGANIZATION')
3779 AND CS.SITE_USE_ID = rl.BILL_TO_SITE_USE_ID -- object1_id1
3780 AND rl.id = p_chr_id
3781 AND ohs.hold_entity_id = to_char(CA.CUST_ACCOUNT_ID); --okx_bill_to.cust_account_id */
3782
3783
3784 CURSOR check_cust_on_credit_hold
3785 IS
3786 SELECT prt.party_name,
3787 ohd.description,
3788 Decode(ohd.type_code,
3789 'CREDIT',
3790 1,
3791 'EPAYMENT',
3792 2,
3793 'COMPLIANCE',
3794 3,
3795 4) credit_typ
3796 FROM oe_hold_sources_all ohs,
3797 oe_hold_definitions ohd,
3798 HZ_PARTIES prt,
3799 HZ_PARTY_SITES PS,
3800 HZ_CUST_ACCT_SITES_ALL CA,
3801 HZ_CUST_SITE_USES_ALL CS,
3802 okc_k_headers_all_b rl
3803 WHERE ohs.hold_entity_code = 'C'
3804 AND ohs.released_flag = 'N'
3805 AND ohs.org_id = okc_context.get_okc_org_id
3806 AND ohs.hold_id = ohd.hold_id
3807 AND ohd.type_code IN ('CREDIT', 'EPAYMENT', 'COMPLIANCE', 'GSA')
3808 AND PS.PARTY_SITE_ID = CA.PARTY_SITE_ID
3809 AND CA.CUST_ACCT_SITE_ID = CS.CUST_ACCT_SITE_ID
3810 AND CS.SITE_USE_CODE = 'BILL_TO'
3811 AND PS.PARTY_ID = prt.party_id
3812 AND prt.PARTY_TYPE IN ('PERSON', 'ORGANIZATION')
3813 AND CS.SITE_USE_ID = rl.BILL_TO_SITE_USE_ID -- object1_id1
3814 AND rl.id = p_chr_id
3815 AND ohs.hold_entity_id = to_char(CA.CUST_ACCOUNT_ID)
3816 /*Added for Bug#12623034*/
3817 UNION ALL
3818 SELECT prt.party_name,
3819 ohd.description,
3820 Decode(ohd.type_code,
3821 'CREDIT',
3822 1,
3823 'EPAYMENT',
3824 2,
3825 'COMPLIANCE',
3826 3,
3827 4) credit_typ
3828 FROM oe_hold_sources_all ohs,
3829 oe_hold_definitions ohd,
3830 HZ_PARTIES prt,
3831 HZ_PARTY_SITES PS,
3832 HZ_CUST_ACCT_SITES_ALL CA,
3833 HZ_CUST_SITE_USES_ALL CS,
3834 okc_k_headers_all_b rl
3835 WHERE ohs.hold_entity_code = 'B'
3836 AND ohs.released_flag = 'N'
3837 AND ohs.org_id = okc_context.get_okc_org_id
3838 AND ohs.hold_id = ohd.hold_id
3839 AND ohd.type_code IN ('CREDIT', 'EPAYMENT', 'COMPLIANCE', 'GSA')
3840 AND PS.PARTY_SITE_ID = CA.PARTY_SITE_ID
3841 AND CA.CUST_ACCT_SITE_ID = CS.CUST_ACCT_SITE_ID
3842 AND CS.SITE_USE_CODE = 'BILL_TO'
3843 AND PS.PARTY_ID = prt.party_id
3844 AND prt.PARTY_TYPE IN ('PERSON', 'ORGANIZATION')
3845 AND CS.SITE_USE_ID = rl.BILL_TO_SITE_USE_ID -- object1_id1
3846 AND rl.id = p_chr_id
3847 AND ohs.hold_entity_id = to_char(CS.SITE_USE_ID)
3848 /*End of code added for Bug12623034*/
3849 ORDER BY 3;
3850
3851
3852
3853 v_customer_name VARCHAR2(360);
3854 v_crd_hold_desc VARCHAR2(2000);
3855 v_crd_typ NUMBER;
3856
3857
3858 BEGIN
3859
3860 -- initialize return status
3861 x_return_status := OKC_API.G_RET_STS_SUCCESS;
3862
3863 OPEN check_cust_on_credit_hold;
3864 FETCH check_cust_on_credit_hold INTO v_customer_name, v_crd_hold_desc, v_crd_typ;
3865
3866
3867 IF check_cust_on_credit_hold%FOUND
3868 THEN
3869
3870 OKC_API.set_message(
3871 p_app_name => G_APP_NAME,
3872 p_msg_name => G_CUSTOMER_ON_CREDIT_HOLD,
3873 p_token1 => 'CUSTOMER_NAME',
3874 p_token1_value => v_customer_name,
3875 p_token2 => 'HOLD_TYPE',
3876 p_token2_value => v_crd_hold_desc);
3877
3878 -- notify caller of an error
3879 x_return_status := OKC_API.G_RET_STS_ERROR;
3880
3881 END IF;
3882
3883 CLOSE check_cust_on_credit_hold;
3884
3885 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
3886 OKC_API.set_message(
3887 p_app_name => G_APP_NAME,
3888 p_msg_name => 'OKS_QA_SUCCESS');
3889 END IF;
3890
3891 EXCEPTION
3892 WHEN G_EXCEPTION_HALT_VALIDATION THEN
3893 -- no processing necessary; validation can continue with next column
3894 NULL;
3895 WHEN OTHERS THEN
3896 -- store SQL error message on message stack
3897 OKC_API.SET_MESSAGE(
3898 p_app_name => G_APP_NAME,
3899 p_msg_name => G_UNEXPECTED_ERROR,
3900 p_token1 => G_SQLCODE_TOKEN,
3901 p_token1_value => SQLCODE,
3902 p_token2 => G_SQLERRM_TOKEN,
3903 p_token2_value => SQLERRM);
3904 -- notify caller of an error as UNEXPETED error
3905 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
3906
3907 END check_cust_credit_hold;
3908
3909 /*============================================================================+
3910 | Procedure: check_address
3911 |
3912 | Purpose: 1. Checks if bill to address exists for service, usage and
3913 | extended warranty lines.
3914 | 2. Checks if bill to address is active for service, usage
3915 | and extended warranty lines.
3916 |
3917 | In Parameters: p_chr_id the contract id
3918 | Out Parameters: x_return_status standard return status
3919 |
3920 +============================================================================*/
3921 PROCEDURE check_address(
3922 x_return_status OUT NOCOPY VARCHAR2,
3923 p_chr_id IN NUMBER
3924 )
3925 IS
3926
3927 /******
3928 -- Cursor CHECK_BILL_TO_ADDRESS to check if the bill to
3929 -- address is entered and is valid for all top lines.
3930 -- BTO rule. Replaced okx_cust_site_uses_v with HZ_CUST_SITE_USES_ALL
3931 CURSOR check_address (line_id NUMBER, l_use_code VARCHAR2)
3932 IS
3933 SELECT CS.SITE_USE_ID, CS.STATUS, CS.CUST_ACCT_SITE_ID
3934 FROM okc_k_lines_b rl,
3935 HZ_CUST_SITE_USES_ALL CS
3936 WHERE rl.dnz_chr_id = p_chr_id
3937 AND rl.id = line_id
3938 AND CS.SITE_USE_ID = decode(l_use_code, 'BILL_TO', rl.BILL_TO_SITE_USE_ID, rl.SHIP_TO_SITE_USE_ID)
3939 AND CS.SITE_USE_CODE = l_use_code -- 'BILL_TO' or 'SHIP_TO'
3940 AND rl.date_cancelled IS NULL --Changes [llc]
3941 ;
3942 ******/
3943
3944 CURSOR check_site (l_cust_acct_site_id NUMBER) IS
3945 SELECT CA.STATUS STATUS
3946 FROM HZ_CUST_ACCT_SITES_ALL CA
3947 WHERE CA.CUST_ACCT_SITE_ID = l_cust_acct_site_id;
3948
3949 /******
3950 -- checks bill to address for top lines.
3951 CURSOR line_cur IS
3952 SELECT id, line_number FROM okc_k_lines_b
3953 WHERE dnz_chr_id = p_chr_id
3954 AND chr_id = p_chr_id
3955 AND cle_id IS NULL
3956 AND lse_id IN (1, 12, 14, 19, 46)
3957 AND (date_terminated IS NULL OR date_terminated > SYSDATE)
3958 AND date_cancelled IS NULL --Changes [llc]
3959 ;
3960 ******/
3961
3962
3963 --bug 5442886
3964 -- to check if the bill to address is entered and is valid for all top lines.
3965 CURSOR check_top_line_address IS
3966 SELECT rl.id, rl.line_number,
3967 cs.site_use_id, cs.status site_use_status,
3968 cs.cust_acct_site_id,
3969 ca.status site_status,
3970 'BILL_TO' use_code
3971 FROM okc_k_lines_b rl,
3972 hz_cust_site_uses_all cs,
3973 hz_cust_acct_sites_all ca
3974 WHERE rl.dnz_chr_id = p_chr_id
3975 AND rl.chr_id = p_chr_id
3976 AND rl.cle_id IS NULL
3977 AND rl.lse_id IN (1,12, 14, 19, 46)
3978 AND (rl.date_terminated IS NULL OR rl.date_terminated > SYSDATE)
3979 AND rl.date_cancelled IS NULL
3980 --
3981 AND cs.site_use_id (+)= rl.bill_to_site_use_id
3982 AND cs.site_use_code (+)= 'BILL_TO'
3983 --
3984 AND ca.cust_acct_site_id (+)= cs.cust_acct_site_id
3985 UNION ALL
3986 SELECT rl.id, rl.line_number,
3987 cs.site_use_id, cs.status site_use_status,
3988 cs.cust_acct_site_id,
3989 ca.status site_status,
3990 'SHIP_TO' use_code
3991 FROM okc_k_lines_b rl,
3992 hz_cust_site_uses_all cs,
3993 hz_cust_acct_sites_all ca
3994 WHERE rl.dnz_chr_id = p_chr_id
3995 AND rl.chr_id = p_chr_id
3996 AND rl.cle_id IS NULL
3997 AND rl.lse_id IN (1,12, 14, 19, 46)
3998 AND (rl.date_terminated IS NULL OR rl.date_terminated > SYSDATE)
3999 AND rl.date_cancelled IS NULL
4000 --
4001 AND cs.site_use_id (+)= rl.ship_to_site_use_id
4002 AND cs.site_use_code (+)= 'SHIP_TO' --l_use_code -- 'bill_to' or 'ship_to'
4003 --
4004 AND ca.cust_acct_site_id (+)= cs.cust_acct_site_id;
4005
4006 TYPE chr150_tbl_type IS TABLE OF okc_k_lines_b.line_number%TYPE INDEX BY BINARY_INTEGER;
4007 TYPE chr7_tbl_type IS TABLE OF VARCHAR2(7) INDEX BY BINARY_INTEGER;
4008 TYPE chr1a_tbl_type IS TABLE OF hz_cust_site_uses_all.status%TYPE INDEX BY BINARY_INTEGER;
4009 TYPE chr1b_tbl_type IS TABLE OF hz_cust_acct_sites_all.status%TYPE INDEX BY BINARY_INTEGER;
4010 TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4011
4012 l_id_tbl num_tbl_type;
4013 l_line_number_tbl chr150_tbl_type;
4014 l_site_use_id_tbl num_tbl_type;
4015 l_site_use_status_tbl chr1a_tbl_type;
4016 l_cust_acct_site_id_tbl num_tbl_type;
4017 l_site_status_tbl chr1b_tbl_type;
4018 l_use_code_tbl chr7_tbl_type;
4019
4020 line_rec check_top_line_address%ROWTYPE;
4021 line_id NUMBER;
4022 l_status VARCHAR2(30);
4023
4024 -- GCHADHA --
4025 -- 4132844 --
4026 CURSOR check_address_header(l_site_use_id IN NUMBER, l_site_use_code IN VARCHAR2) IS
4027 SELECT CS.SITE_USE_ID, CS.STATUS, CS.CUST_ACCT_SITE_ID
4028 FROM okc_k_headers_all_b rl,
4029 HZ_CUST_SITE_USES_ALL CS
4030 WHERE rl.id = p_chr_id
4031 AND CS.SITE_USE_ID = l_site_use_id
4032 AND CS.SITE_USE_CODE = l_site_use_code;
4033
4034 l_bto_address_rec check_address_header%ROWTYPE;
4035 l_sto_address_rec check_address_header%ROWTYPE;
4036
4037 CURSOR get_billto_shipto(p_chr_id IN NUMBER) IS
4038 SELECT bill_to_site_use_id, ship_to_site_use_id
4039 FROM okc_k_headers_all_b
4040 WHERE id = p_chr_id ;
4041
4042 l_bill_to_site_use_id NUMBER;
4043 l_ship_to_site_use_id NUMBER;
4044 -- END GCHADHA --
4045 BEGIN
4046
4047 -- initialize return status
4048 x_return_status := OKC_API.G_RET_STS_SUCCESS;
4049
4050 -- Bug 4138244 --
4051 -- GCHADHA --
4052 OPEN get_billto_shipto(p_chr_id);
4053 FETCH get_billto_shipto INTO l_bill_to_site_use_id, l_ship_to_site_use_id ;
4054 CLOSE get_billto_shipto;
4055
4056 IF l_bill_to_site_use_id IS NOT NULL THEN
4057 OPEN check_address_header(l_bill_to_site_use_id, 'BILL_TO');
4058 FETCH check_address_header INTO l_bto_address_rec;
4059 IF check_address_header%FOUND THEN
4060 IF l_bto_address_rec.status <> 'A' THEN
4061 OKC_API.set_message(
4062 p_app_name => G_APP_NAME,
4063 p_msg_name => G_BTO_INVALID_HEAD
4064 );
4065
4066 -- notify caller of an error
4067 x_return_status := OKC_API.G_RET_STS_ERROR;
4068 ELSE
4069 OPEN check_site (l_bto_address_rec.cust_acct_site_id);
4070 FETCH check_site INTO l_status;
4071 IF check_site%FOUND THEN
4072 IF l_status <> 'A' THEN
4073 OKC_API.set_message(
4074 p_app_name => G_APP_NAME,
4075 p_msg_name => G_BTO_INVALID_HEAD
4076 );
4077 -- notify caller of an error
4078 x_return_status := OKC_API.G_RET_STS_ERROR;
4079 END IF;
4080 END IF;
4081 CLOSE check_site;
4082 END IF; -- If l_bto_address_rec.status <> 'A' THEN
4083 END IF; -- If check_address_header%FOUND Then
4084 CLOSE check_address_header;
4085 END IF;
4086
4087 IF l_ship_to_site_use_id IS NOT NULL THEN
4088
4089 OPEN check_address_header(l_ship_to_site_use_id, 'SHIP_TO');
4090 FETCH check_address_header INTO l_sto_address_rec;
4091 IF check_address_header%FOUND THEN
4092 IF l_sto_address_rec.status <> 'A' THEN
4093 OKC_API.set_message(
4094 p_app_name => G_APP_NAME,
4095 p_msg_name => G_STO_INVALID_HEAD
4096 );
4097
4098 -- notify caller of an error
4099 x_return_status := OKC_API.G_RET_STS_ERROR;
4100 ELSE
4101 OPEN check_site (l_sto_address_rec.cust_acct_site_id);
4102 FETCH check_site INTO l_status;
4103 IF check_site%FOUND THEN
4104 IF l_status <> 'A' THEN
4105 OKC_API.set_message(
4106 p_app_name => G_APP_NAME,
4107 p_msg_name => G_STO_INVALID_HEAD
4108 );
4109 -- notify caller of an error
4110 x_return_status := OKC_API.G_RET_STS_ERROR;
4111 END IF;
4112 END IF;
4113 CLOSE check_site;
4114 END IF; -- If l_sto_address_rec.status <> 'A' THEN
4115 END IF; -- If check_address_header%FOUND Then
4116 CLOSE check_address_header;
4117
4118 END IF;
4119
4120
4121 -- END GCHADHA --
4122
4123 /*******
4124 FOR line_rec IN line_cur
4125
4126 LOOP
4127 -- Check if Bill to Address is entered
4128 line_id := line_rec.id;
4129
4130 OPEN check_address(line_id, 'BILL_TO');
4131 FETCH check_address INTO l_bto_address_rec;
4132
4133 IF check_address%NOTFOUND THEN
4134
4135 OKC_API.set_message(
4136 p_app_name => G_APP_NAME,
4137 p_msg_name => G_BTO_REQUIRED,
4138 p_token1 => 'LINE',
4139 p_token1_value => line_rec.line_number);
4140
4141 -- notify caller of an error
4142 x_return_status := OKC_API.G_RET_STS_ERROR;
4143 ELSIF l_bto_address_rec.status <> 'A' THEN
4144 -- If bill to address is entered then
4145 -- check if it is of active status
4146
4147 OKC_API.set_message(
4148 p_app_name => G_APP_NAME,
4149 p_msg_name => G_BTO_INVALID,
4150 p_token1 => 'LINE',
4151 p_token1_value => line_rec.line_number);
4152
4153 -- notify caller of an error
4154 x_return_status := OKC_API.G_RET_STS_ERROR;
4155 ELSE
4156 OPEN check_site (l_bto_address_rec.cust_acct_site_id);
4157 FETCH check_site INTO l_status;
4158 IF check_site%FOUND THEN
4159 IF l_status <> 'A' THEN
4160 OKC_API.set_message(
4161 p_app_name => G_APP_NAME,
4162 p_msg_name => G_BTO_INVALID,
4163 p_token1 => 'LINE',
4164 p_token1_value => line_rec.line_number);
4165 -- notify caller of an error
4166 x_return_status := OKC_API.G_RET_STS_ERROR;
4167 END IF;
4168 END IF;
4169 CLOSE check_site;
4170 END IF; -- Elsif l_bto_address_rec.status <> 'A' THEN
4171 CLOSE check_address;
4172
4173 OPEN check_address(line_id, 'SHIP_TO');
4174 FETCH check_address INTO l_sto_address_rec;
4175 IF check_address%FOUND THEN
4176 IF l_sto_address_rec.status <> 'A' THEN
4177 OKC_API.set_message(
4178 p_app_name => G_APP_NAME,
4179 p_msg_name => G_STO_INVALID,
4180 p_token1 => 'LINE',
4181 p_token1_value => line_rec.line_number);
4182
4183 -- notify caller of an error
4184 x_return_status := OKC_API.G_RET_STS_ERROR;
4185 ELSE
4186 OPEN check_site (l_sto_address_rec.cust_acct_site_id);
4187 FETCH check_site INTO l_status;
4188 IF check_site%FOUND THEN
4189 IF l_status <> 'A' THEN
4190 OKC_API.set_message(
4191 p_app_name => G_APP_NAME,
4192 p_msg_name => G_STO_INVALID,
4193 p_token1 => 'LINE',
4194 p_token1_value => line_rec.line_number);
4195 -- notify caller of an error
4196 x_return_status := OKC_API.G_RET_STS_ERROR;
4197 END IF;
4198 END IF;
4199 CLOSE check_site;
4200 END IF; -- If l_sto_address_rec.status <> 'A' THEN
4201 END IF; -- If check_address%FOUND Then
4202 CLOSE check_address;
4203 END LOOP;
4204 *******/
4205
4206 --bug 5442886
4207 OPEN check_top_line_address;
4208 LOOP
4209
4210 FETCH check_top_line_address BULK COLLECT INTO l_id_tbl,
4211 l_line_number_tbl,
4212 l_site_use_id_tbl,
4213 l_site_use_status_tbl,
4214 l_cust_acct_site_id_tbl,
4215 l_site_status_tbl,
4216 l_use_code_tbl LIMIT G_BULK_FETCH_LIMIT;
4217
4218 EXIT WHEN (l_id_tbl.COUNT = 0);
4219
4220 FOR i IN l_id_tbl.FIRST..l_id_tbl.LAST LOOP
4221
4222 IF l_site_use_id_tbl(i) IS NULL AND l_use_code_tbl(i) = 'BILL_TO' THEN
4223 -- Check if Bill to/Ship to Address is entered
4224
4225 OKC_API.set_message(
4226 p_app_name => G_APP_NAME,
4227 p_msg_name => G_BTO_REQUIRED,
4228 p_token1 => 'LINE',
4229 p_token1_value => l_line_number_tbl(i));
4230
4231 -- notify caller of an error
4232 x_return_status := OKC_API.G_RET_STS_ERROR;
4233
4234 ELSIF l_site_use_status_tbl(i) <> 'A' THEN
4235
4236 IF l_use_code_tbl(i) = 'BILL_TO' THEN
4237 -- If bill to address is entered then check if it is of active status
4238 OKC_API.set_message(
4239 p_app_name => G_APP_NAME,
4240 p_msg_name => G_BTO_INVALID,
4241 p_token1 => 'LINE',
4242 p_token1_value => l_line_number_tbl(i));
4243
4244 ELSIF l_site_use_id_tbl(i) IS NOT NULL AND l_use_code_tbl(i) = 'SHIP_TO' THEN
4245 -- If ship to address is entered then check if it is of active status
4246 OKC_API.set_message(
4247 p_app_name => G_APP_NAME,
4248 p_msg_name => G_STO_INVALID,
4249 p_token1 => 'LINE',
4250 p_token1_value => l_line_number_tbl(i));
4251 END IF;
4252
4253 -- notify caller of an error
4254 x_return_status := OKC_API.G_RET_STS_ERROR;
4255 ELSE
4256 IF l_cust_acct_site_id_tbl(i) IS NOT NULL AND l_site_status_tbl(i) <> 'A' THEN
4257
4258 IF l_use_code_tbl(i) = 'BILL_TO' THEN
4259 OKC_API.set_message(
4260 p_app_name => G_APP_NAME,
4261 p_msg_name => G_BTO_INVALID,
4262 p_token1 => 'LINE',
4263 p_token1_value => l_line_number_tbl(i));
4264
4265 ELSIF l_use_code_tbl(i) = 'SHIP_TO' THEN
4266 OKC_API.set_message(
4267 p_app_name => G_APP_NAME,
4268 p_msg_name => G_STO_INVALID,
4269 p_token1 => 'LINE',
4270 p_token1_value => l_line_number_tbl(i));
4271 END IF;
4272
4273
4274 -- notify caller of an error
4275 x_return_status := OKC_API.G_RET_STS_ERROR;
4276
4277 END IF;
4278 END IF;
4279
4280 END LOOP;
4281
4282 END LOOP;
4283 CLOSE check_top_line_address;
4284
4285
4286 IF x_return_status = OKC_API.G_RET_STS_SUCCESS
4287 THEN
4288 OKC_API.set_message(
4289 p_app_name => G_APP_NAME,
4290 p_msg_name => 'OKS_QA_SUCCESS');
4291 END IF;
4292
4293 EXCEPTION
4294 WHEN G_EXCEPTION_HALT_VALIDATION THEN
4295 -- no processing necessary; validation can continue with next column
4296 NULL;
4297 WHEN OTHERS THEN
4298 -- store SQL error message on message stack
4299 OKC_API.SET_MESSAGE(
4300 p_app_name => G_APP_NAME,
4301 p_msg_name => G_UNEXPECTED_ERROR,
4302 p_token1 => G_SQLCODE_TOKEN,
4303 p_token1_value => SQLCODE,
4304 p_token2 => G_SQLERRM_TOKEN,
4305 p_token2_value => SQLERRM);
4306 -- notify caller of an error as UNEXPETED error
4307 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4308 -- verify that cursor was closed
4309 IF check_address_header%ISOPEN THEN
4310 CLOSE check_address_header;
4311 END IF;
4312
4313 END check_address;
4314
4315
4316 /*============================================================================+
4317 | Procedure: check_item_effectivity
4318 |
4319 | Purpose: These checks are for entered status top lines:
4320 | 1. Checks if the inventory item status is active for entered
4321 | status line.
4322 | 2. Checks if the service item for service and extended warranty
4323 | lines is valid.
4324 | 3. Checks if the usage item for usage lines is valid.
4325 |
4326 | These checks are for entered status covered levels:
4327 | 1. Checks if covered product status is active.
4328 | 2. Checks if covered item status is active.
4329 | 3. Checks if covered party status is active.
4330 | 4. Checks if covered product status is active.
4331 | 5. If header status is QA hold and covered level terminated
4332 | date/end date is greater than covered product end date
4333 | active then report an error if covered product status is
4334 | not active.
4335 | 6. Checks if covered system status is active.
4336 | 7. Checks if covered site status is active.
4337 |
4338 | In Parameters: p_chr_id the contract id
4339 | Out Parameters: x_return_status standard return status
4340 |
4341 +============================================================================*/
4342 PROCEDURE check_item_effectivity
4343 (
4344 x_return_status OUT NOCOPY VARCHAR2,
4345 p_chr_id IN NUMBER
4346 )
4347 IS
4348
4349 CURSOR l_cle_csr IS
4350 SELECT cle.id, cle.lse_id, sts.ste_code sts_code,
4351 cle.start_date, cle.end_date, cle.date_terminated,
4352 cim.jtot_object1_code, cim.object1_id1, cim.object1_id2
4353 FROM okc_k_items cim,
4354 okc_k_lines_b cle,
4355 okc_statuses_b sts
4356 WHERE cle.dnz_chr_id = p_chr_id
4357 AND cle.cle_id IS NULL
4358 AND sts.code = cle.sts_code
4359 AND cim.cle_id = cle.id
4360 AND cle.date_cancelled IS NULL --Changes [llc]
4361 ;
4362
4363 l_cle_rec l_cle_csr%ROWTYPE;
4364
4365 CURSOR l_status_csr(p_inv_item NUMBER, p_org_id NUMBER) IS
4366 SELECT 1
4367 FROM Mtl_system_items
4368 WHERE Inventory_item_id = p_inv_item
4369 AND Organization_id = p_org_id
4370 AND (SYSDATE BETWEEN
4371 NVL(start_date_active, SYSDATE) AND NVL(end_date_active, SYSDATE));
4372
4373 --Service continuity check
4374
4375 CURSOR l_chk_service_prod_csr (p_inv_item NUMBER, p_org_id NUMBER) IS
4376 SELECT service_item_flag, vendor_warranty_flag,
4377 usage_item_flag, serviceable_product_flag,
4378 customer_order_enabled_flag, internal_order_enabled_flag,
4379 invoice_enabled_flag
4380 FROM MTL_SYSTEM_ITEMS_B_KFV
4381 WHERE Inventory_item_id = p_inv_item
4382 AND Organization_id = p_org_id;
4383
4384 l_chk_service_prod_rec l_chk_service_prod_csr%ROWTYPE;
4385
4386 CURSOR l_get_inv_item_csr (p_cp_id NUMBER) IS
4387 SELECT inventory_item_id
4388 FROM csi_item_instances -- okx_cust_prod_v
4389 WHERE instance_id = p_cp_id;
4390
4391 l_get_inv_item_rec l_get_inv_item_csr%ROWTYPE;
4392
4393 CURSOR l_cve_csr (p_cle_id NUMBER) IS
4394 SELECT cle.id, cle.PRICE_NEGOTIATED, cle.lse_id, sts.ste_code sts_code,
4395 cle.start_date, cle.end_date, cle.date_terminated,
4396 cim.jtot_object1_code, cim.object1_id1,
4397 cim.object1_id2
4398 FROM OKC_K_ITEMS cim,
4399 OKC_K_LINES_B cle,
4400 OKC_STATUSES_B sts
4401 WHERE cim.cle_id = cle.id
4402 AND cle.cle_id = p_cle_id
4403 AND sts.code = cle.sts_code
4404 AND cle.lse_id IN (35, 7, 8, 9, 10, 11, 13, 18, 25);
4405
4406 l_cve_rec l_cve_csr%ROWTYPE;
4407
4408
4409 CURSOR l_inv_csr(p_id NUMBER) IS
4410 SELECT object1_id1
4411 FROM Okc_k_items
4412 WHERE cle_id = p_id;
4413
4414 CURSOR l_covitm_csr(p_inv_item NUMBER, p_org_id NUMBER) IS
4415 SELECT DECODE(ENABLED_FLAG, 'Y', 'A', 'I') status
4416 FROM MTL_SYSTEM_ITEMS_B_KFV --okx_system_items_v
4417 WHERE INVENTORY_ITEM_ID = p_inv_item
4418 AND Organization_id = p_org_id
4419 AND serviceable_product_flag = 'Y';
4420
4421 CURSOR l_covparty_csr(l_inv_id NUMBER) IS
4422 SELECT status
4423 FROM HZ_PARTIES --okx_parties_v
4424 WHERE PARTY_TYPE IN ('PERSON', 'ORGANIZATION') AND PARTY_ID = l_inv_id;
4425
4426 -- replaced okx_cust_prod_statuses_v with CS_CUSTOMER_PRODUCT_STATUSES
4427 -- replace okx_customer_products_v with csi_item_instances CP,MTL_SYSTEM_ITEMS_B_KFV BK
4428 CURSOR l_covprod_csr(p_inv_id NUMBER, p_org_id NUMBER) IS
4429 SELECT cs.Service_order_allowed_flag, CP.ACTIVE_END_DATE
4430 FROM CS_CUSTOMER_PRODUCT_STATUSES cs,
4431 csi_item_instances CP, MTL_SYSTEM_ITEMS_B_KFV BK
4432 WHERE BK.INVENTORY_ITEM_ID = CP.INVENTORY_ITEM_ID
4433 AND CP.INSTANCE_STATUS_ID = cs.customer_product_status_id
4434 AND CP.INSTANCE_ID = p_inv_id
4435 AND BK.ORGANIZATION_ID = p_org_id;
4436
4437 --Bug 5583158
4438 CURSOR l_covsys_csr(p_system_id NUMBER) IS
4439 SELECT 'A'
4440 FROM CSI_SYSTEMS_B CSB
4441 WHERE CSB.system_id = p_system_id
4442 AND sysdate between NVL(start_date_active, sysdate) and NVL(end_date_active, sysdate);
4443 --Bug 5583158
4444 --commented out asked by umesh And org_id = p_org_id;
4445
4446 CURSOR l_org_csr IS
4447 SELECT authoring_org_id, inv_organization_id
4448 FROM okc_k_headers_all_b
4449 WHERE id = p_chr_id;
4450
4451 -- Changed this cursor because object1_id1 will be holding the party_site_id
4452 -- not the customer site use id.
4453 CURSOR l_covsit_csr(partySiteId NUMBER) IS
4454 SELECT status
4455 FROM HZ_PARTY_SITES -- okx_party_sites_v
4456 WHERE party_site_id = partySiteId;
4457
4458 --Changed cursor because ste_code does not have QA_HOLD
4459 CURSOR l_hdr_csr(l_chr_id NUMBER) IS
4460 SELECT sts_code --sts.ste_code sts_code
4461 FROM okc_k_headers_all_b
4462 -- ,okc_statuses_b sts
4463 WHERE id = l_chr_id;
4464 --And sts.code = chr.sts_code;
4465
4466
4467 l_org_id NUMBER;
4468 l_organization_id NUMBER;
4469 l_inv_id NUMBER;
4470 l_stat VARCHAR2(100);
4471 l_end_date DATE;
4472 l_status NUMBER;
4473 l_sts_code VARCHAR2(200);
4474
4475 BEGIN
4476
4477 -- initialize return status
4478 x_return_status := OKC_API.G_RET_STS_SUCCESS;
4479 -- Get Contract Lines
4480
4481 OPEN l_org_csr;
4482 FETCH l_org_csr INTO l_org_id, l_organization_id;
4483 CLOSE l_org_csr;
4484
4485
4486 OPEN l_cle_csr;
4487 LOOP
4488 FETCH l_cle_csr INTO l_cle_rec;
4489 EXIT WHEN l_cle_csr%NOTFOUND;
4490
4491 IF (l_cle_rec.date_terminated IS NULL )
4492 AND (l_cle_rec.sts_code = 'ENTERED') THEN
4493
4494 OPEN l_status_csr(l_cle_rec.object1_id1, l_organization_id);
4495 FETCH l_status_csr INTO l_status;
4496 CLOSE l_status_csr;
4497
4498 IF l_status IS NULL THEN
4499 /**
4500 OKC_API.set_message(
4501 p_app_name => G_APP_NAME,
4502 p_msg_name => G_REQUIRED_LINE_VALUE,
4503 p_token1 => G_COL_NAME_TOKEN,
4504 p_token1_value => 'Inventory item status not active',
4505 p_token2 => 'LINE_NAME',
4506 p_token2_value => get_line_name(l_cle_rec.id));
4507 **/
4508
4509 OKC_API.set_message(
4510 p_app_name => G_APP_NAME,
4511 p_msg_name => G_INACTIVE_INVENTORY_ITEM,
4512 p_token1 => 'LINE_NAME',
4513 p_token1_value => get_line_name(l_cle_rec.id));
4514
4515 -- notify caller of an error
4516 x_return_status := OKC_API.G_RET_STS_ERROR;
4517
4518 END IF; -- if l_status is NULL
4519 END IF; -- if (l_cle_rec.date_terminated is null )AND (l_cle_rec.sts_code = 'ENTERED')
4520
4521 IF l_cle_rec.sts_code = 'ENTERED' AND l_cle_rec.date_terminated IS NULL
4522 THEN
4523 OPEN l_chk_service_prod_csr(l_cle_rec.object1_id1, l_organization_id);
4524 FETCH l_chk_service_prod_csr INTO l_chk_service_prod_rec;
4525
4526 --for service and extended warranty
4527 IF (l_cle_rec.lse_id IN (1, 19)
4528 AND (l_chk_service_prod_rec.service_item_flag = 'N' OR l_chk_service_prod_rec.vendor_warranty_flag = 'Y'
4529 OR (l_chk_service_prod_rec.customer_order_enabled_flag = 'N' AND l_chk_service_prod_rec.internal_order_enabled_flag = 'N')
4530 OR l_chk_service_prod_rec.invoice_enabled_flag = 'N'))
4531 THEN
4532
4533 OKC_API.SET_MESSAGE
4534 (
4535 p_app_name => G_APP_NAME,
4536 p_msg_name => 'OKS_INVALID_SERVICE_ITEM',
4537 p_token1 => 'ITEM',
4538 p_token1_value => get_line_name(l_cle_rec.id)
4539 );
4540 x_return_status := OKC_API.G_RET_STS_ERROR;
4541
4542 END IF; --l_chk_service_prod_rec.service_item_flag = 'Y' and l_chk_service_prod_rec.vendor_warranty_flag = 'N'
4543
4544 --for USAGE
4545
4546 IF (l_cle_rec.lse_id = 12 AND (l_chk_service_prod_rec.usage_item_flag = 'N'
4547 OR (l_chk_service_prod_rec.customer_order_enabled_flag = 'N' AND l_chk_service_prod_rec.internal_order_enabled_flag = 'N')
4548 OR l_chk_service_prod_rec.invoice_enabled_flag = 'N'))
4549 THEN
4550
4551 OKC_API.SET_MESSAGE
4552 (
4553 p_app_name => G_APP_NAME,
4554 p_msg_name => 'OKS_INVALID_USAGE_ITEM',
4555 p_token1 => 'ITEM',
4556 p_token1_value => get_line_name(l_cle_rec.id)
4557 );
4558 x_return_status := OKC_API.G_RET_STS_ERROR;
4559
4560 END IF; --l_chk_service_prod_rec.usage_item_flag = 'Y'
4561
4562 CLOSE l_chk_service_prod_csr;
4563
4564 END IF; --IF l_cle_rec.sts_code = 'ENTERED'
4565
4566 -- Get Covered Levels for Contract Line
4567 OPEN l_cve_csr (l_cle_rec.id);
4568 LOOP
4569 FETCH l_cve_csr INTO l_cve_rec;
4570 EXIT WHEN l_cve_csr%NOTFOUND;
4571
4572 IF (l_cve_rec.date_terminated IS NULL )
4573 AND (l_cve_rec.sts_code = 'ENTERED') THEN
4574
4575 OPEN l_get_inv_item_csr(l_cve_rec.object1_id1);
4576 FETCH l_get_inv_item_csr INTO l_get_inv_item_rec;
4577
4578 OPEN l_chk_service_prod_csr(l_get_inv_item_rec.inventory_item_id, l_organization_id);
4579 FETCH l_chk_service_prod_csr INTO l_chk_service_prod_rec;
4580
4581 --for product
4582 IF (l_chk_service_prod_rec.serviceable_product_flag = 'N' AND l_cve_rec.lse_id IN (9, 25))
4583 THEN
4584
4585 OKC_API.SET_MESSAGE
4586 (
4587 p_app_name => G_APP_NAME,
4588 p_msg_name => 'OKS_PRODUCT_INACTIVE',
4589 p_token1 => 'ITEM',
4590 p_token1_value => get_line_name(l_cve_rec.id)
4591 );
4592 x_return_status := OKC_API.G_RET_STS_ERROR;
4593
4594
4595 END IF; -- IF (l_chk_service_prod_rec.service_item_flag = 'Y'
4596 CLOSE l_chk_service_prod_csr;
4597 CLOSE l_get_inv_item_csr;
4598
4599
4600 IF l_cve_rec.lse_id = 7 THEN
4601 l_stat :='X'; --Bug 5583158
4602
4603 OPEN l_covitm_csr(l_cve_rec.object1_id1, l_organization_id);
4604 FETCH l_covitm_csr INTO l_stat;
4605 CLOSE l_covitm_csr;
4606
4607 IF nvl(l_stat, 'X') <> 'A' THEN --Bug 5583158
4608 /**
4609 OKC_API.set_message(
4610 p_app_name => G_APP_NAME,
4611 p_msg_name => G_REQUIRED_LINE_VALUE,
4612 p_token1 => G_COL_NAME_TOKEN,
4613 p_token1_value => 'Covered item status not active',
4614 p_token2 => 'LINE_NAME',
4615 p_token2_value => get_line_name(l_cve_rec.id));
4616 **/
4617
4618 OKC_API.set_message(
4619 p_app_name => G_APP_NAME,
4620 p_msg_name => G_INACTIVE_COVERED_ITEM,
4621 p_token1 => 'LINE_NAME',
4622 p_token1_value => get_line_name(l_cve_rec.id));
4623
4624 -- notify caller of an error
4625 x_return_status := OKC_API.G_RET_STS_ERROR;
4626
4627 END IF; -- If l_stat <> 'A' Then
4628 END IF; -- If l_cve_rec.lse_id = 7 Then
4629
4630 IF l_cve_rec.lse_id = 8 THEN
4631 l_stat :='X'; --Bug 5583158
4632 OPEN l_covparty_csr(l_cve_rec.object1_id1);
4633 FETCH l_covparty_csr INTO l_stat;
4634 CLOSE l_covparty_csr;
4635 IF nvl(l_stat, 'X') <> 'A' THEN --Bug 5583158
4636 /**
4637 OKC_API.set_message(
4638 p_app_name => G_APP_NAME,
4639 p_msg_name => G_REQUIRED_LINE_VALUE,
4640 p_token1 => G_COL_NAME_TOKEN,
4641 p_token1_value => 'Covered Party status not active',
4642 p_token2 => 'LINE_NAME',
4643 p_token2_value => get_line_name(l_cve_rec.id));
4644 **/
4645
4646 OKC_API.set_message(
4647 p_app_name => G_APP_NAME,
4648 p_msg_name => G_INACTIVE_COVERED_PARTY,
4649 p_token1 => 'LINE_NAME',
4650 p_token1_value => get_line_name(l_cve_rec.id));
4651
4652 -- notify caller of an error
4653 x_return_status := OKC_API.G_RET_STS_ERROR;
4654
4655 END IF;
4656 END IF;
4657
4658 IF l_cve_rec.lse_id IN (9, 25) THEN
4659 l_stat :='X'; --Bug 5583158
4660 OPEN l_covprod_csr(l_cve_rec.object1_id1, l_organization_id);
4661 FETCH l_covprod_csr INTO l_stat, l_end_date;
4662 CLOSE l_covprod_csr;
4663
4664 OPEN l_hdr_csr(p_chr_id);
4665 FETCH l_hdr_csr INTO l_sts_code;
4666 CLOSE l_hdr_csr;
4667
4668
4669 IF nvl(l_sts_code, 'X') <> 'QA_HOLD' THEN
4670 IF nvl(l_stat, 'X') <> 'Y' THEN --Bug 5583158
4671 /**
4672 OKC_API.set_message(
4673 p_app_name => G_APP_NAME,
4674 p_msg_name => G_REQUIRED_LINE_VALUE,
4675 p_token1 => G_COL_NAME_TOKEN,
4676 p_token1_value => 'Covered Product status not active',
4677 p_token2 => 'LINE_NAME',
4678 p_token2_value => get_line_name(l_cve_rec.id));
4679 **/
4680
4681 OKC_API.set_message(
4682 p_app_name => G_APP_NAME,
4683 p_msg_name => G_INACTIVE_COVERED_PRODUCT,
4684 p_token1 => 'LINE_NAME',
4685 p_token1_value => get_line_name(l_cve_rec.id));
4686
4687 -- notify caller of an error
4688 x_return_status := OKC_API.G_RET_STS_ERROR;
4689 END IF;
4690 ELSE
4691 IF nvl(l_stat, 'X') <> 'Y' AND --Bug5583158
4692 nvl(l_cve_rec.date_terminated, l_cve_rec.end_date) > nvl(l_end_date, SYSDATE) THEN
4693 /**
4694 OKC_API.set_message(
4695 p_app_name => G_APP_NAME,
4696 p_msg_name => G_REQUIRED_LINE_VALUE,
4697 p_token1 => G_COL_NAME_TOKEN,
4698 p_token1_value => 'Covered Product status not active',
4699 p_token2 => 'LINE_NAME',
4700 p_token2_value => get_line_name(l_cve_rec.id));
4701 **/
4702
4703 OKC_API.set_message(
4704 p_app_name => G_APP_NAME,
4705 p_msg_name => G_INACTIVE_COVERED_PRODUCT,
4706 p_token1 => 'LINE_NAME',
4707 p_token1_value => get_line_name(l_cve_rec.id));
4708
4709 -- notify caller of an error
4710 x_return_status := OKC_API.G_RET_STS_ERROR;
4711 END IF;
4712 END IF;
4713 END IF;
4714
4715 --Bug 5583158
4716 IF l_cve_rec.lse_id = 11 THEN
4717 l_stat :='X';
4718
4719 OPEN l_covsys_csr(l_cve_rec.object1_id1);
4720 FETCH l_covsys_csr INTO l_stat;
4721 CLOSE l_covsys_csr;
4722 IF nvl(l_stat, 'X') <> 'A' THEN
4723 /**
4724 OKC_API.set_message(
4725 p_app_name => G_APP_NAME,
4726 p_msg_name => G_REQUIRED_LINE_VALUE,
4727 p_token1 => G_COL_NAME_TOKEN,
4728 p_token1_value => 'Covered System status not active',
4729 p_token2 => 'LINE_NAME',
4730 p_token2_value => get_line_name(l_cve_rec.id));
4731 **/
4732
4733 OKC_API.set_message(
4734 p_app_name => G_APP_NAME,
4735 p_msg_name => G_INACTIVE_COVERED_SYSTEM,
4736 p_token1 => 'LINE_NAME',
4737 p_token1_value => get_line_name(l_cve_rec.id));
4738
4739 -- notify caller of an error
4740 x_return_status := OKC_API.G_RET_STS_ERROR;
4741
4742 END IF;
4743 END IF;
4744
4745 --Bug 5583158
4746
4747 IF l_cve_rec.lse_id = 10 THEN
4748 l_stat :='X'; --Bug 5583158
4749 OPEN l_covsit_csr(l_cve_rec.object1_id1);
4750 FETCH l_covsit_csr INTO l_stat;
4751 CLOSE l_covsit_csr;
4752 IF nvl(l_stat, 'X') <> 'A' THEN --Bug 5583158
4753 /**
4754 OKC_API.set_message(
4755 p_app_name => G_APP_NAME,
4756 p_msg_name => G_REQUIRED_LINE_VALUE,
4757 p_token1 => G_COL_NAME_TOKEN,
4758 p_token1_value => 'Covered Site status not active',
4759 p_token2 => 'LINE_NAME',
4760 p_token2_value => get_line_name(l_cle_rec.id));
4761 **/
4762
4763 OKC_API.set_message(
4764 p_app_name => G_APP_NAME,
4765 p_msg_name => G_INACTIVE_COVERED_SITE,
4766 p_token1 => 'LINE_NAME',
4767 p_token1_value => get_line_name(l_cle_rec.id));
4768
4769 -- notify caller of an error
4770 x_return_status := OKC_API.G_RET_STS_ERROR;
4771 END IF;
4772 END IF;
4773 END IF;
4774 END LOOP;
4775
4776 CLOSE l_cve_csr;
4777
4778 END LOOP;
4779 CLOSE l_cle_csr;
4780 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
4781 OKC_API.set_message(
4782 p_app_name => G_APP_NAME,
4783 p_msg_name => 'OKS_QA_SUCCESS');
4784 END IF;
4785
4786 EXCEPTION
4787 WHEN G_EXCEPTION_HALT_VALIDATION THEN
4788 -- no processing necessary; validation can continue with next column
4789 NULL;
4790 WHEN OTHERS THEN
4791 -- store SQL error message on message stack
4792 OKC_API.SET_MESSAGE(
4793 p_app_name => G_APP_NAME,
4794 p_msg_name => G_UNEXPECTED_ERROR,
4795 p_token1 => G_SQLCODE_TOKEN,
4796 p_token1_value => SQLCODE,
4797 p_token2 => G_SQLERRM_TOKEN,
4798 p_token2_value => SQLERRM);
4799 -- notify caller of an error as UNEXPETED error
4800 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
4801 IF l_cve_csr%ISOPEN THEN
4802 CLOSE l_cve_csr;
4803 END IF;
4804
4805 IF l_cle_csr%ISOPEN THEN
4806 CLOSE l_cle_csr;
4807 END IF;
4808
4809 END ;
4810
4811 /*============================================================================+
4812 | Procedure: Get_Pay_Method_Info
4813 |
4814 | Purpose: Returns Payment Method Details for a given Receipt
4815 | Method Id
4816 |
4817 | In Parameters: p_chr_id the contract id
4818 | Out Parameters: x_return_status standard return status
4819 |
4820 +============================================================================*/
4821 PROCEDURE Get_Pay_Method_Info
4822 (p_pay_method_id IN NUMBER
4823 , p_pay_method_name OUT NOCOPY VARCHAR2
4824 , p_merchant_ref OUT NOCOPY NUMBER
4825 )
4826 IS
4827
4828 CURSOR receipt_csr (pay_id NUMBER) IS
4829 SELECT
4830 name, nvl(merchant_ref, 0)
4831 FROM AR_RECEIPT_METHODS
4832 WHERE RECEIPT_METHOD_ID = pay_id
4833 AND SYSDATE >= NVL(START_DATE, SYSDATE)
4834 AND SYSDATE <= NVL(END_DATE, SYSDATE)
4835 AND PAYMENT_TYPE_CODE = 'CREDIT_CARD';
4836
4837 BEGIN
4838
4839 --errorout('In Get Pay Method Info');
4840
4841 OPEN receipt_csr(p_pay_method_id);
4842 FETCH receipt_csr INTO p_pay_method_name, p_merchant_ref;
4843 CLOSE receipt_csr;
4844
4845 --errorout('Get Pay Method Info Merchant Id '||p_merchant_id);
4846
4847 EXCEPTION
4848 WHEN OTHERS THEN
4849 RAISE;
4850
4851 END Get_Pay_Method_Info;
4852
4853
4854 /*============================================================================+
4855 | Procedure: Check_Authorize_Payment
4856 |
4857 | Purpose: 1. Check profile option for authorization. Skip the
4858 | process if no authorization is required.
4859 | 2. Exit validation with success if CCR rule
4860 | (credit card rule) doesn't exist or authoring code
4861 | is not null.
4862 | 3. Make a call to iPayment API for authorization using
4863 | 4. Update OKS header with payment information.
4864 |
4865 | In Parameters: p_chr_id the contract id
4866 | Out Parameters: x_return_status standard return status
4867 |
4868 +============================================================================*/
4869 PROCEDURE Check_Authorize_Payment
4870 (x_return_status OUT NOCOPY VARCHAR2,
4871 p_chr_id IN NUMBER
4872 )
4873
4874 IS
4875
4876 l_api_name CONSTANT VARCHAR2(30) := 'Check_Authorize_Payment';
4877 l_trxn_extension_id NUMBER;
4878 l_order_value NUMBER;
4879 l_authorize_payment VARCHAR2(30);
4880
4881 x_msg_data VARCHAR2(1995);
4882 x_msg_count NUMBER;
4883
4884 l_payment_type VARCHAR2(30);
4885
4886
4887 l_payee_rec IBY_FNDCPT_TRXN_PUB.PayeeContext_rec_type;
4888 l_payer_rec IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type;
4889 l_auth_attribs IBY_FNDCPT_TRXN_PUB.AuthAttribs_rec_type;
4890 l_amount IBY_FNDCPT_TRXN_PUB.Amount_rec_type;
4891 l_auth_result IBY_FNDCPT_TRXN_PUB.AuthResult_rec_type;
4892 l_response IBY_FNDCPT_COMMON_PUB.Result_rec_type;
4893
4894
4895
4896 G_SUCCESS_HALT_VALIDATION EXCEPTION;
4897 G_ERROR_HALT_VALIDATION EXCEPTION;
4898
4899 CURSOR oks_hdr_csr (p_chr_id NUMBER) IS
4900 SELECT s.id,
4901 s.object_version_number,
4902 s.trxn_extension_id,
4903 s.payment_type,
4904 NVL(c.org_id, c.authoring_org_id) org_id,
4905 c.currency_code,
4906 c.bill_to_site_use_id
4907 FROM oks_k_headers_b s,
4908 okc_k_headers_all_b c
4909 WHERE s.chr_id = c.id
4910 AND c.id = p_chr_id;
4911
4912 l_oks_header_rec oks_hdr_csr%ROWTYPE;
4913
4914 CURSOR oks_lines_csr(p_chr_id NUMBER) IS
4915 SELECT oks.id,
4916 oks.object_version_number,
4917 oks.trxn_extension_id,
4918 oks.payment_type,
4919 okc.bill_to_site_use_id
4920 FROM oks_k_lines_b oks,
4921 okc_k_lines_b okc
4922 WHERE oks.dnz_chr_id = p_chr_id
4923 AND oks.cle_id = okc.id
4924 AND okc.date_cancelled IS NULL --4735326
4925 AND oks.trxn_extension_id IS NOT NULL; --process only lines with credit cards
4926
4927 l_oks_lines_rec oks_lines_csr%ROWTYPE;
4928
4929 CURSOR cust_account_csr(p_site_use_id VARCHAR2, p_site_use_code VARCHAR2) IS
4930 SELECT accts.party_id,
4931 sites.cust_account_id
4932 FROM hz_cust_site_uses_all site_uses,
4933 hz_cust_acct_sites_all sites,
4934 hz_cust_accounts accts
4935 WHERE site_uses.site_use_id = p_site_use_id
4936 AND site_uses.site_use_code = p_site_use_code
4937 AND site_uses.cust_acct_site_id = sites.cust_acct_site_id
4938 AND sites.cust_account_id = accts.cust_account_id;
4939
4940 cust_account_rec cust_account_csr%ROWTYPE;
4941
4942
4943 PROCEDURE create_header_authorization IS
4944 PRAGMA AUTONOMOUS_TRANSACTION;
4945 BEGIN
4946
4947 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4948 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Authorization does not exist so creating new one.');
4949 END IF;
4950
4951 IBY_FNDCPT_TRXN_PUB.Create_Authorization
4952 (p_api_version => 1.0
4953 , p_payee => l_payee_rec
4954 , p_payer => l_payer_rec
4955 , p_payer_equivalency => IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_FULL -- we need full instead of default G_PAYER_EQUIV_UPWARD (bug 5163778)
4956 , p_trxn_entity_id => l_oks_header_rec.trxn_extension_id
4957 , p_auth_attribs => l_auth_attribs
4958 , p_amount => l_amount
4959 , x_auth_result => l_auth_result
4960 , x_response => l_response
4961 , x_return_status => x_return_status
4962 , x_msg_count => x_msg_count
4963 , x_msg_data => x_msg_data
4964 );
4965
4966 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4967 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Finished checking header. x_return_status: '|| x_return_status);
4968 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_msg_data: '|| x_msg_data);
4969 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_msg_count: '|| x_msg_count);
4970 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'result_code: '|| l_response.Result_Code);
4971 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Result_Category: '|| l_response.Result_Category);
4972 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Result_Message: '|| l_response.Result_Message);
4973 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_auth_result.auth_code: '|| l_auth_result.auth_code);
4974 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_auth_result.auth_id: '|| l_auth_result.auth_id);
4975 END IF;
4976
4977 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
4978 --show IBY error message on standard FND stack in QA results UI
4979 x_return_status := OKC_API.G_RET_STS_ERROR;
4980
4981
4982 --also pick up IBY message in l_response and place onto standard FND message stack
4983 IF NVL(l_response.Result_Category,'x') <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS THEN --'SUCCESS'
4984 FND_MSG_PUB.add_exc_msg(
4985 p_pkg_name => 'IBY_FNDCPT_TRXN_PUB',
4986 p_procedure_name => 'Create_Authorization',
4987 p_error_text => SUBSTR(l_response.Result_Message ||' ('||l_response.Result_Code ||')',1,240));
4988 END IF;
4989
4990 RAISE G_ERROR_HALT_VALIDATION;
4991 END IF;
4992
4993 --delete the 'AUTH_SUCCESS' message put on stack by IBY
4994 FND_MSG_PUB.delete_msg(x_msg_count);
4995
4996 --put success message to display in QA result list for header
4997 OKC_API.set_message(
4998 p_app_name => G_APP_NAME,
4999 p_msg_name => 'OKS_QA_SUCCESS');
5000
5001 COMMIT; --the authorization is always committed by IBY regardless so this commit is necessary to retain the record
5002 --IBY keeps to link an authorization created with the transaction_extension_id
5003 --since this is an autonomous transaction, the rest of the contract is unaffected by the commit here
5004 --ref: bug 4951669
5005
5006 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5007 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Authorization successfully created for header');
5008 END IF;
5009
5010 END create_header_authorization;
5011
5012
5013
5014 PROCEDURE create_line_authorization IS
5015 PRAGMA AUTONOMOUS_TRANSACTION;
5016 BEGIN
5017
5018
5019 IBY_FNDCPT_TRXN_PUB.Create_Authorization
5020 (p_api_version => 1.0
5021 , p_payee => l_payee_rec
5022 , p_payer => l_payer_rec
5023 , p_payer_equivalency => IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_FULL -- we need full instead of default G_PAYER_EQUIV_UPWARD (bug 5163778)
5024 , p_trxn_entity_id => l_oks_lines_rec.trxn_extension_id
5025 , p_auth_attribs => l_auth_attribs
5026 , p_amount => l_amount
5027 , x_auth_result => l_auth_result
5028 , x_response => l_response
5029 , x_return_status => x_return_status
5030 , x_msg_count => x_msg_count
5031 , x_msg_data => x_msg_data
5032 );
5033
5034 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5035 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Finished checking line id: '|| l_oks_lines_rec.id);
5036 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_return_status: '|| x_return_status);
5037 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_msg_data: '|| x_msg_data);
5038 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_msg_count: '|| x_msg_count);
5039 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'result_code: '|| l_response.Result_Code);
5040 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Result_Category: '|| l_response.Result_Category);
5041 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Result_Message: '|| l_response.Result_Message);
5042 END IF;
5043
5044 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
5045 -- show IBY error message on standard FND stack in QA results UI
5046 x_return_status := OKC_API.G_RET_STS_ERROR;
5047
5048
5049 --also pick up IBY message in l_response and place onto standard FND message stack
5050 IF NVL(l_response.Result_Category,'x') <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS THEN --'SUCCESS'
5051 FND_MSG_PUB.add_exc_msg(
5052 p_pkg_name => 'IBY_FNDCPT_TRXN_PUB',
5053 p_procedure_name => 'Create_Authorization',
5054 p_error_text => SUBSTR(l_response.Result_Message ||' ('||l_response.Result_Code ||')',1,240));
5055 END IF;
5056
5057 RAISE G_ERROR_HALT_VALIDATION;
5058 END IF;
5059
5060 --delete the 'AUTH_SUCCESS' message put on stack by IBY
5061 FND_MSG_PUB.delete_msg(x_msg_count);
5062
5063 --put success message to display in QA result list for line
5064 OKC_API.set_message(
5065 p_app_name => G_APP_NAME,
5066 p_msg_name => 'OKS_QA_SUCCESS');
5067
5068
5069 COMMIT; --the authorization is always committed by IBY regardless so this commit is necessary to retain the record
5070 --IBY keeps to link an authorization created with the transaction_extension_id
5071 --since this is an autonomous transaction, the rest of the contract is unaffected by the commit here
5072 --ref: bug 4951669
5073
5074 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5075 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Authorization successfully created for line');
5076 END IF;
5077
5078 END create_line_authorization;
5079
5080
5081
5082
5083 BEGIN
5084 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5085 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name,'Entering '|| G_PKG_NAME || '.' || l_api_name);
5086 END IF;
5087
5088 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5089
5090
5091
5092 -- If OKS: Credit Card Validation Level profile does not hold value 'Authorize Payment', skip check
5093 l_authorize_payment := nvl(fnd_profile.VALUE('OKS_CREDIT_PROCESSING_QA_LEVEL'), '0');
5094
5095 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5096 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_authorize_payment: '|| l_authorize_payment);
5097 END IF;
5098
5099 IF G_AUTHORIZE_PAYMENT <> l_authorize_payment THEN
5100 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5101 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Profile is turned off, no need to perform any check');
5102 END IF;
5103
5104 -- skip the process, No Authorization required
5105 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5106 RAISE G_SUCCESS_HALT_VALIDATION;
5107 END IF;
5108
5109
5110 -- Bug 5106500 --
5111 -- Get amount to be authorized
5112 l_order_value := TO_NUMBER(NVL(fnd_profile.VALUE('OKS_CREDIT_AUTHORIZE_MINIMUM_AMOUNT'), fnd_number.canonical_to_number('0.01'))); --(absolute zero not permitted by iPayment)
5113 -- Bug 5106500 --
5114 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5115 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_order_value: '|| to_char(l_order_value));
5116 END IF;
5117
5118
5119 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5120 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Start checking header.');
5121 END IF;
5122
5123 -- First check header
5124 OPEN oks_hdr_csr(p_chr_id);
5125 FETCH oks_hdr_csr INTO l_oks_header_rec;
5126 CLOSE oks_hdr_csr;
5127
5128 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5129 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_header_rec.id: '|| l_oks_header_rec.id);
5130 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_header_rec.object_version_number: '|| l_oks_header_rec.object_version_number);
5131 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_header_rec.trxn_extension_id: '|| l_oks_header_rec.trxn_extension_id);
5132 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_header_rec.payment_type: '|| l_oks_header_rec.payment_type);
5133 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_header_rec.org_id: '|| l_oks_header_rec.org_id);
5134 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_header_rec.currency_code: '|| l_oks_header_rec.currency_code);
5135 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_header_rec.bill_to_site_use_id: '|| l_oks_header_rec.bill_to_site_use_id);
5136 END IF;
5137
5138 --conduct check only if credit card exists
5139 IF l_oks_header_rec.trxn_extension_id IS NOT NULL AND 'CCR' = nvl(l_oks_header_rec.payment_type, '0') THEN
5140
5141 l_amount.currency_code := l_oks_header_rec.currency_code;
5142 l_amount.VALUE := l_order_value;
5143
5144 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5145 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_amount.currency_code: '|| l_amount.currency_code);
5146 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_amount.value: '|| l_amount.VALUE);
5147 END IF;
5148
5149 /**** Setup PayEE Record ****/
5150 --Payee is optional
5151 --adding payee information
5152 l_payee_rec.org_type := 'OPERATING_UNIT';
5153 l_payee_rec.org_id := l_oks_header_rec.org_id;
5154
5155
5156 /**** Setup PayER Record ****/
5157 OPEN cust_account_csr(l_oks_header_rec.bill_to_site_use_id, 'BILL_TO');
5158 FETCH cust_account_csr INTO cust_account_rec;
5159 CLOSE cust_account_csr;
5160
5161
5162 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5163 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_payee_rec.org_id: '|| l_payee_rec.org_id);
5164 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'cust_account_rec.party_id: '|| cust_account_rec.party_id);
5165 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'cust_account_rec.cust_account_id: '|| cust_account_rec.cust_account_id);
5166 END IF;
5167
5168 --org_type and org_id are optional
5169 l_payer_rec.payment_function := 'CUSTOMER_PAYMENT';
5170 l_payer_rec.party_id := cust_account_rec.party_id;
5171 l_payer_rec.cust_account_id := cust_account_rec.cust_account_id;
5172
5173 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5174 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Checking to see if authorization already exists');
5175 END IF;
5176
5177 --first determine whether there is a pre-existing credit card authorization for the payer
5178 IBY_FNDCPT_TRXN_PUB.Get_Authorization
5179 (p_api_version => 1.0
5180 , p_payer => l_payer_rec
5181 , p_trxn_entity_id => l_oks_header_rec.trxn_extension_id
5182 , x_auth_result => l_auth_result
5183 , x_response => l_response
5184 , x_return_status => x_return_status
5185 , x_msg_count => x_msg_count
5186 , x_msg_data => x_msg_data
5187 );
5188
5189 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5190 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Finished checking for existing authorization. x_return_status: '|| x_return_status);
5191 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_msg_data: '|| x_msg_data);
5192 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_msg_count: '|| x_msg_count);
5193 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'result_code: '|| l_response.Result_Code);
5194 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Result_Category: '|| l_response.Result_Category);
5195 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Result_Message: '|| l_response.Result_Message);
5196 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_auth_result.auth_id: '|| l_auth_result.auth_id);
5197 END IF;
5198
5199 IF x_return_status = OKC_API.G_RET_STS_SUCCESS AND l_response.Result_Code = IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS THEN
5200 --authorization already exists
5201
5202 --delete the 'SUCCESS' message put on stack by IBY
5203 FND_MSG_PUB.delete_msg(x_msg_count);
5204
5205 --put success message to display in QA result list for header
5206 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5207 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Authorization already exists so returning success for header');
5208 END IF;
5209
5210 OKC_API.set_message(
5211 p_app_name => G_APP_NAME,
5212 p_msg_name => 'OKS_QA_SUCCESS');
5213
5214
5215 ELSIF NVL(l_response.Result_Code,'x') IN ('INVALID_AUTHORIZATION', 'INVALID_TXN_EXTENSION') THEN
5216 -- this covers case of x_return_status = 'E' and l_response.Result_Code = 'INVALID_AUTHORIZATION' or 'INVALID_TXN_EXTENSION'
5217 -- which means that authorization does not exist and we need to create one
5218 -- authorization does not already exist so go ahead and create a new one
5219
5220 --delete the 'INVALID_AUTHORIZATION' or 'INVALID_TXN_EXTENSION' message put on stack by IBY
5221 FND_MSG_PUB.delete_msg(x_msg_count);
5222
5223 create_header_authorization;
5224
5225 ELSIF NVL(l_response.Result_Category,'x') <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS THEN --'SUCCESS'
5226 x_return_status := OKC_API.G_RET_STS_ERROR; --show IBY error message (should be in stack) in QA results UI
5227
5228 --also pick up IBY message in l_response and place onto standard FND message stack
5229 IF l_response.Result_Category <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS THEN --'SUCCESS'
5230 FND_MSG_PUB.add_exc_msg(
5231 p_pkg_name => 'IBY_FNDCPT_TRXN_PUB',
5232 p_procedure_name => 'Get_Authorization',
5233 p_error_text => SUBSTR(l_response.Result_Message ||' ('||l_response.Result_Code ||')',1,240));
5234 END IF;
5235
5236 RAISE G_ERROR_HALT_VALIDATION;
5237
5238 END IF;
5239
5240
5241
5242
5243 --Go on to update_Authorization Info of the header
5244 --we directly update instead of using public API to avoid locking issues
5245 --auth code could come from either IBY_FNDCPT_TRXN_PUB.Get_Authorization or IBY_FNDCPT_TRXN_PUB.Create_Authorization
5246 UPDATE oks_k_headers_b
5247 SET cc_auth_code = l_auth_result.auth_code
5248 WHERE id = l_oks_header_rec.id;
5249
5250 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5251 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Finished updating header');
5252 END IF;
5253
5254
5255 END IF; --END IF l_trxn_extension_id IS NOT NULL
5256
5257
5258
5259
5260 --now begin processing contract lines
5261 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5262 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Start checking lines.');
5263 END IF;
5264
5265 --check each line (associated with a credit card)
5266 OPEN oks_lines_csr(p_chr_id);
5267 LOOP
5268 FETCH oks_lines_csr INTO l_oks_lines_rec;
5269 EXIT WHEN oks_lines_csr%NOTFOUND;
5270
5271 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5272 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_lines_rec.id: '|| l_oks_lines_rec.id);
5273 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_lines_rec.object_version_number: '|| l_oks_lines_rec.object_version_number);
5274 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_lines_rec.trxn_extension_id: '|| l_oks_lines_rec.trxn_extension_id);
5275 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_lines_rec.payment_type: '|| l_oks_lines_rec.payment_type);
5276 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_oks_lines_rec.bill_to_site_use_id: '|| l_oks_lines_rec.bill_to_site_use_id);
5277 END IF;
5278
5279 --we use the currency_code from the header always
5280 l_amount.currency_code := l_oks_header_rec.currency_code;
5281 l_amount.VALUE := l_order_value;
5282
5283 /**** Setup PayEE Record ****/
5284 --Payee is optional
5285 l_payee_rec.org_type := 'OPERATING_UNIT';
5286 l_payee_rec.org_id := l_oks_header_rec.org_id;
5287
5288 /**** Setup PayER Record ****/
5289 cust_account_rec.party_id := NULL;
5290 cust_account_rec.cust_account_id := NULL;
5291
5292 OPEN cust_account_csr(l_oks_lines_rec.bill_to_site_use_id, 'BILL_TO');
5293 FETCH cust_account_csr INTO cust_account_rec;
5294 CLOSE cust_account_csr;
5295
5296 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5297 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_payee_rec.org_id: '|| l_payee_rec.org_id);
5298 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'cust_account_rec.party_id: '|| cust_account_rec.party_id);
5299 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'cust_account_rec.cust_account_id: '|| cust_account_rec.cust_account_id);
5300 END IF;
5301
5302 --org_type and org_id are optional
5303 l_payer_rec.payment_function := 'CUSTOMER_PAYMENT';
5304 l_payer_rec.party_id := cust_account_rec.party_id;
5305 l_payer_rec.cust_account_id := cust_account_rec.cust_account_id;
5306
5307 --first determine whether there is a pre-existing credit card authorization for the payer
5308 IBY_FNDCPT_TRXN_PUB.Get_Authorization
5309 (p_api_version => 1.0
5310 , p_payer => l_payer_rec
5311 , p_trxn_entity_id => l_oks_lines_rec.trxn_extension_id
5312 , x_auth_result => l_auth_result
5313 , x_response => l_response
5314 , x_return_status => x_return_status
5315 , x_msg_count => x_msg_count
5316 , x_msg_data => x_msg_data
5317 );
5318
5319 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5320 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Finished checking for existing authorization. x_return_status: '|| x_return_status);
5321 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_msg_data: '|| x_msg_data);
5322 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'x_msg_count: '|| x_msg_count);
5323 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'result_code: '|| l_response.Result_Code);
5324 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Result_Category: '|| l_response.Result_Category);
5325 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Result_Message: '|| l_response.Result_Message);
5326 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_auth_result.auth_id: '|| l_auth_result.auth_id);
5327 END IF;
5328
5329 IF x_return_status = OKC_API.G_RET_STS_SUCCESS AND l_response.Result_Code = IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS THEN
5330 --authorization already exists
5331
5332 --delete the 'SUCCESS' message put on stack by IBY
5333 FND_MSG_PUB.delete_msg(x_msg_count);
5334
5335 --put success message to display in QA result list for line currently being processed
5336 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5337 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Authorization already exists so returning success for line');
5338 END IF;
5339
5340 OKC_API.set_message(
5341 p_app_name => G_APP_NAME,
5342 p_msg_name => 'OKS_QA_SUCCESS');
5343
5344
5345 ELSIF NVL(l_response.Result_Code,'x') IN ('INVALID_AUTHORIZATION', 'INVALID_TXN_EXTENSION') THEN
5346 -- this covers case of x_return_status = 'E' and l_response.Result_Code = 'INVALID_AUTHORIZATION' or 'INVALID_TXN_EXTENSION'
5347 -- which means that authorization does not exist and we need to create one
5348 -- authorization does not already exist so go ahead and create a new one
5349
5350 --delete the 'INVALID_AUTHORIZATION' or 'INVALID_TXN_EXTENSION' message put on stack by IBY
5351 FND_MSG_PUB.delete_msg(x_msg_count);
5352
5353 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5354 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Authorization does not exist so creating new one.');
5355 END IF;
5356
5357 create_line_authorization;
5358
5359
5360 ELSIF NVL(l_response.Result_Category,'x') <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS THEN --'SUCCESS'
5361
5362 --show IBY error message (should be in stack) in QA results UI
5363 x_return_status := OKC_API.G_RET_STS_ERROR;
5364
5365 --also pick up IBY message in l_response and place onto standard FND message stack
5366 IF l_response.Result_Category <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS THEN --'SUCCESS'
5367 FND_MSG_PUB.add_exc_msg(
5368 p_pkg_name => 'IBY_FNDCPT_TRXN_PUB',
5369 p_procedure_name => 'Get_Authorization',
5370 p_error_text => SUBSTR(l_response.Result_Message ||' ('||l_response.Result_Code ||')',1,240));
5371 END IF;
5372
5373
5374 RAISE G_ERROR_HALT_VALIDATION;
5375
5376
5377 END IF;
5378
5379 --Go on to update_Authorization Info of line
5380 --we directly update instead of using public API to avoid locking issues
5381 --auth code could come from either IBY_FNDCPT_TRXN_PUB.Get_Authorization or IBY_FNDCPT_TRXN_PUB.Create_Authorization
5382 UPDATE oks_k_lines_b
5383 SET cc_auth_code = l_auth_result.auth_code
5384 WHERE id = l_oks_lines_rec.id;
5385
5386 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5387 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'Finished updating line');
5388 END IF;
5389
5390 END LOOP;
5391 CLOSE oks_lines_csr;
5392
5393
5394 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5395 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name,'Leaving '|| G_PKG_NAME || '.' || l_api_name);
5396 END IF;
5397
5398 EXCEPTION
5399 WHEN G_SUCCESS_HALT_VALIDATION THEN
5400
5401 IF oks_hdr_csr%ISOPEN THEN
5402 CLOSE oks_hdr_csr;
5403 END IF;
5404
5405 IF oks_lines_csr%ISOPEN THEN
5406 CLOSE oks_lines_csr;
5407 END IF;
5408
5409 IF cust_account_csr%ISOPEN THEN
5410 CLOSE cust_account_csr;
5411 END IF;
5412
5413 x_return_status := x_return_status;
5414 OKC_API.set_message(
5415 p_app_name => G_APP_NAME,
5416 p_msg_name => 'OKS_QA_SUCCESS');
5417
5418 WHEN G_ERROR_HALT_VALIDATION THEN
5419
5420 IF oks_hdr_csr%ISOPEN THEN
5421 CLOSE oks_hdr_csr;
5422 END IF;
5423
5424 IF oks_lines_csr%ISOPEN THEN
5425 CLOSE oks_lines_csr;
5426 END IF;
5427
5428 IF cust_account_csr%ISOPEN THEN
5429 CLOSE cust_account_csr;
5430 END IF;
5431
5432 x_return_status := x_return_status;
5433 -- we rely on IBY or OKS API to put error message on stack and just return error here
5434
5435 WHEN OTHERS THEN
5436
5437 IF oks_hdr_csr%ISOPEN THEN
5438 CLOSE oks_hdr_csr;
5439 END IF;
5440
5441 IF oks_lines_csr%ISOPEN THEN
5442 CLOSE oks_lines_csr;
5443 END IF;
5444
5445 IF cust_account_csr%ISOPEN THEN
5446 CLOSE cust_account_csr;
5447 END IF;
5448
5449 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
5450 OKC_API.set_message(G_APP_NAME, G_UNEXPECTED_ERROR, G_SQLCODE_TOKEN, SQLCODE, G_SQLERRM_TOKEN,'Check_Authorize_Payment:- '|| SQLERRM);
5451
5452 END Check_Authorize_Payment;
5453
5454
5455
5456 /*============================================================================+
5457 | Procedure: check_billing_schedule
5458 |
5459 | Purpose: 1. Top line Stream Level Line (SLL) should be entered.
5460 | 2. For subscription lines billed amount should not be greater
5461 | than the negotiated price on the subscription line.
5462 | 3. Subscription lines with "Equal Amount" billing type should have
5463 | negotiated price equal to sum of level elements.
5464 | 4. Top line billing schedule (level elements) should be entered.
5465 | 5. Top line SLL affectivities should be within line affectivities.
5466 | In general, SLL end date should not be less than top line
5467 | end date. For "covered level" and "equal amount" the SLL end
5468 | date should not be greater than top line end date.
5469 | Top line SLL start date should be same as top line start
5470 | date.
5471 | 6. Sub line billing type should be the same as top line billing
5472 | type.
5473 | 7. For "Equal Amount" billing type the start date and end date of
5474 | sub lines should be the same as their top lines.
5475 | 8. Sub line Stream Level Line (SLL) should be entered.
5476 | 9. Sub line billing schedule should be entered.
5477 | 10. Sub line start date should be same as SLL start date if billing
5478 | level is covered level.
5479 | 11. For sub lines, billed amount should not be greater than sub
5480 | line negotiated price.
5481 | 12. Sub line SLL period should be the same as the number of
5482 | level elements (billing schedule period).
5483 | 13. Sub line final price should be same as total billing schedule
5484 |
5485 | In Parameters: p_chr_id the contract id
5486 | Out Parameters: x_return_status standard return status
5487 |
5488 +============================================================================*/
5489 PROCEDURE check_billing_schedule
5490 (
5491 x_return_status OUT NOCOPY VARCHAR2,
5492 p_chr_id IN NUMBER
5493 )
5494 IS
5495 l_SLL_start_date DATE;
5496 l_SLL_end_date DATE;
5497 l_ETP_flag VARCHAR2(450) := ' ';
5498 l_rules_ctr NUMBER := 0;
5499 l_sub_line_SLL NUMBER := 0;
5500 l_top_line_SLL NUMBER := 0;
5501 l_bs_rec NUMBER := 0;
5502 l_lvl_total_amt NUMBER := 0;
5503 l_lvl_total_billed_amt NUMBER := 0;
5504 --l_lvl_element_count NUMBER := 0;
5505 l_temp_total_billed NUMBER;
5506 l_price_negotiated NUMBER;
5507
5508
5509 TYPE Level_Element_Rec IS RECORD
5510 (
5511 date_start DATE,
5512 date_transaction DATE,
5513 date_to_interface DATE,
5514 date_completed DATE
5515 );
5516
5517 --Type Level_Element_Tbl is TABLE of Level_Element_Rec index by binary_integer;
5518
5519 --l_lvl_tbl Level_Element_Tbl;
5520
5521 CURSOR get_currency_csr (p_chr_id NUMBER) IS
5522 SELECT k_hdr.currency_code
5523 FROM okc_k_headers_all_b k_hdr
5524 WHERE k_hdr.id = p_chr_id ;
5525
5526 l_currency VARCHAR2(15);
5527
5528
5529 /* original cursor commented out for bug 4947610
5530 --Top Lines information
5531 --No billing schedule QA checks for terminated lines.
5532 CURSOR top_line_grp_csr (p_hdr_id NUMBER) IS
5533 SELECT lines.id, lines.lse_id lse_id, lines.cle_id,
5534 lines.start_date, lines.end_date, lines.line_number, date_terminated,
5535 lines.price_negotiated
5536 FROM okc_k_lines_b lines
5537 WHERE lines.dnz_chr_id = p_hdr_id
5538 AND lines.cle_id IS NULL
5539 AND lines.lse_id IN (1, 12, 19, 46)
5540 AND lines.date_terminated IS NULL -- added by mkhayer 11/21/2002.
5541 AND lines.date_cancelled IS NULL --Changes [llc]
5542 ORDER BY lines.id;
5543 */
5544
5545 --modified cursor, bug 4947610
5546 CURSOR top_line_grp_csr (p_hdr_id NUMBER) IS
5547 SELECT lines.id, lines.lse_id lse_id, lines.cle_id,
5548 lines.start_date, lines.end_date, lines.line_number, date_terminated,
5549 lines.price_negotiated, oks.credit_amount, oks.suppressed_credit, oks.override_amount
5550 FROM okc_k_lines_b lines , oks_k_lines_b oks
5551 WHERE lines.dnz_chr_id = p_hdr_id
5552 AND lines.cle_id IS NULL
5553 AND lines.lse_id IN (1, 12, 19, 46)
5554 AND lines.date_terminated IS NULL -- added by mkhayer 11/21/2002.
5555 AND lines.date_cancelled IS NULL --Changes [llc]
5556 AND oks.cle_id = lines.id
5557 ORDER BY lines.id;
5558
5559 -- Sub Line information
5560 CURSOR line_grp_csr (p_hdr_id NUMBER, p_cle_id NUMBER) IS
5561 SELECT lines.id, lines.lse_id lse_id, lines.cle_id,
5562 lines.start_date, lines.end_date, lines.price_negotiated, lines.line_number, date_terminated
5563 FROM okc_k_lines_b lines
5564 WHERE lines.dnz_chr_id = p_hdr_id
5565 AND lines.cle_id = p_cle_id
5566 AND lines.lse_id IN (7, 8, 9, 10, 11, 13, 18, 25, 35)
5567 AND lines.date_terminated IS NULL -- uncommented by mkhayer
5568 AND lines.date_cancelled IS NULL; --Changes [llc]
5569
5570
5571
5572 -- SLL rule
5573 CURSOR rules_csr (p_hdr_id NUMBER, p_cle_id NUMBER) IS
5574 SELECT id,
5575 uom_code,
5576 SEQUENCE_NO,
5577 start_date,
5578 level_periods,
5579 uom_per_period,
5580 advance_periods,
5581 level_amount --rule_information6
5582 FROM oks_stream_levels_b --okc_rules_b
5583 WHERE dnz_chr_id = p_hdr_id
5584 AND cle_id = p_cle_id;
5585
5586
5587 --Level element information - to check dates
5588
5589 CURSOR level_elements_csr (p_id NUMBER) IS
5590 SELECT date_start, date_transaction, date_to_interface,
5591 amount, date_completed
5592 FROM oks_level_elements
5593 WHERE rul_id = p_id -- is the id in oks_level_elements
5594 AND date_completed IS NULL
5595 ORDER BY date_start; -- Added for bug# 2517147
5596
5597 --Level element information - to check amount and periods
5598
5599 CURSOR level_elements_amt_csr (p_id NUMBER) IS
5600 SELECT COUNT(rul_id) lvl_count, SUM(amount) lvl_amt
5601 FROM oks_level_elements
5602 WHERE rul_id = p_id -- is the id in oks_level_elements
5603 GROUP BY rul_id;
5604
5605 --get rle information E/T/P of top line
5606 -- SLH rule
5607 CURSOR get_ETP_csr (p_hdr_id NUMBER, p_cle_id NUMBER) IS
5608 SELECT BILLING_SCHEDULE_TYPE --rule_information1
5609 FROM oks_k_lines_b --okc_rules_b
5610 WHERE dnz_chr_id = p_hdr_id
5611 AND cle_id = p_cle_id;
5612
5613 CURSOR level_elements_billed_csr (p_id NUMBER) IS
5614 SELECT SUM(amount) billed_amt
5615 FROM oks_level_elements
5616 WHERE rul_id = p_id
5617 AND date_completed IS NOT NULL;
5618
5619 CURSOR get_line_price(l_line_id NUMBER) IS
5620 SELECT price_negotiated
5621 FROM okc_k_lines_b
5622 WHERE id = l_line_id
5623 AND lse_id IN (7, 8, 9, 10, 11, 18, 25, 35, 46);
5624
5625
5626 CURSOR get_billed_amount(l_sub_line_id NUMBER) IS
5627 SELECT SUM(amount)
5628 FROM oks_bill_sub_lines
5629 WHERE cle_id = l_sub_line_id
5630 AND bcl_id IN (SELECT id
5631 FROM oks_bill_cont_lines
5632 WHERE bill_action = 'RI');
5633
5634 CURSOR get_top_billed_amount(l_line_id NUMBER) IS
5635 SELECT SUM(amount)
5636 FROM oks_bill_cont_lines
5637 WHERE cle_id = l_line_id AND
5638 bill_action = 'RI';
5639
5640 CURSOR sll_end_date_csr(l_cle_id NUMBER) IS
5641 SELECT MAX(end_date)
5642 FROM oks_stream_levels_b WHERE cle_id = l_cle_id;
5643
5644 CURSOR sll_start_date_csr(l_cle_id NUMBER) IS
5645 SELECT MIN(start_date)
5646 FROM oks_stream_levels_b WHERE cle_id = l_cle_id;
5647
5648 CURSOR check_lvl_element(l_cle_id NUMBER) IS
5649 SELECT amount FROM oks_level_elements
5650 WHERE nvl(amount, 0) < 0 AND
5651 cle_id = l_cle_id;
5652
5653 l_amount NUMBER;
5654 l_total_billed NUMBER;
5655 l_line_price NUMBER;
5656 l_renewal_status VARCHAR2(30);
5657
5658 BEGIN
5659
5660
5661 x_return_status := OKC_API.G_RET_STS_SUCCESS;
5662 --adding the following code for Bug#4069048
5663 -- get renewal status to see if this is called for Electronic renewal
5664 -- if so bypass the Billing Schedule validation
5665 l_renewal_status := get_renewal_status(p_chr_id);
5666
5667 --Bug 4673694 in R12 the renewal status codes have been modified
5668 --if nvl(l_renewal_status ,'-99') <> 'QAS' and nvl(l_renewal_status, '-99') <> 'ERN_QA_CHECK_FAIL' then
5669 IF nvl(l_renewal_status, '-99') <> 'PEND_PUBLISH' THEN
5670
5671 OPEN get_currency_csr (p_chr_id);
5672 FETCH get_currency_csr INTO l_currency;
5673 CLOSE get_currency_csr;
5674
5675 FOR top_line_grp_rec IN top_line_grp_csr (p_chr_id)
5676 LOOP
5677 l_lvl_total_amt := 0;
5678 FOR get_ETP_rec IN get_ETP_csr (p_chr_id, top_line_grp_rec.id)
5679 LOOP
5680 l_ETP_flag := get_ETP_rec.BILLING_SCHEDULE_TYPE;
5681 END LOOP;
5682
5683 --Check for top line SLL exists
5684
5685 SELECT COUNT(id)
5686 INTO l_top_line_SLL
5687 FROM oks_stream_levels_b -- okc_rules_b
5688 WHERE dnz_chr_id = p_chr_id
5689 AND cle_id = top_line_grp_rec.id;
5690
5691
5692 IF l_top_line_SLL = 0
5693 THEN
5694
5695 -- store SQL error message on message stack
5696 OKC_API.SET_MESSAGE
5697 (
5698 p_app_name => G_APP_NAME,
5699 p_msg_name => 'OKS_TOPLINE_SLL_NOT_EXISTS',
5700 p_token1 => 'TOKEN1',
5701 --p_token1_value => top_line_grp_rec.line_number
5702 p_token1_value => get_line_name(top_line_grp_rec.id)
5703 );
5704 x_return_status := OKC_API.G_RET_STS_ERROR;
5705 ELSE
5706
5707 --l_SLL_end_date := top_line_grp_rec.start_date;
5708 --l_rules_ctr := 0;
5709 OPEN sll_end_date_csr(top_line_grp_rec.id);
5710 FETCH sll_end_date_csr INTO l_SLL_end_date;
5711 CLOSE sll_end_date_csr;
5712
5713 OPEN sll_start_date_csr(top_line_grp_rec.id);
5714 FETCH sll_start_date_csr INTO l_SLL_start_date;
5715 CLOSE sll_start_date_csr;
5716
5717 l_lvl_total_billed_amt := 0;
5718
5719
5720 FOR rules_rec IN rules_csr (p_chr_id, top_line_grp_rec.id)
5721 LOOP
5722
5723 --To get end date of product billing cycle
5724
5725 /*l_SLL_end_date := okc_time_util_pub.get_enddate
5726 (
5727 l_SLL_end_date + l_rules_ctr,
5728 rules_rec.uom_code,
5729 rules_rec.level_periods * TO_NUMBER(rules_rec.uom_per_period)
5730 );
5731 l_rules_ctr := 1;
5732 */
5733
5734 --Check for level element exists
5735
5736 SELECT COUNT(id)
5737 INTO l_bs_rec
5738 FROM oks_level_elements
5739 WHERE cle_id = top_line_grp_rec.id; -- rul_id = rules_rec.id;
5740
5741 IF l_bs_rec = 0
5742 THEN
5743
5744 -- store SQL error message on message stack
5745 OKC_API.SET_MESSAGE
5746 (
5747 p_app_name => G_APP_NAME,
5748 p_msg_name => 'OKS_LVL_ELEMENT_NOT_EXISTS',
5749 p_token1 => 'TOKEN1',
5750 --p_token1_value => top_line_grp_rec.line_number
5751 p_token1_value => get_line_name(top_line_grp_rec.id)
5752 );
5753 x_return_status := OKC_API.G_RET_STS_ERROR;
5754
5755 END IF; --end if of l_bs_rec = 0
5756
5757
5758
5759 --l_lvl_element_count := 0;
5760
5761 -- This should only loop once.
5762 FOR level_elements_amt_rec IN level_elements_amt_csr (rules_rec.id)
5763 LOOP
5764
5765 /** Removed check (bug 5358599) as we already check for the product billing
5766 cycle end dates matching the sublines end date.
5767 IF ((rules_rec.level_periods <> level_elements_amt_rec.lvl_count) AND l_ETP_flag <> 'T')
5768 THEN
5769
5770 -- store SQL error message on message stack
5771 OKC_API.SET_MESSAGE
5772 (
5773 p_app_name => G_APP_NAME,
5774 p_msg_name => 'OKS_SL_LVL_PERIOD_MISMATCH',
5775 p_token1 => 'TOKEN1',
5776 p_token1_value => get_line_name(top_line_grp_rec.id),
5777 p_token2 => 'TOKEN2',
5778 p_token2_value => rules_rec.level_periods, --rule_information3,
5779 p_token3 => 'TOKEN3',
5780 p_token3_value => level_elements_amt_rec.lvl_count
5781 );
5782 x_return_status := OKC_API.G_RET_STS_ERROR;
5783
5784 END IF;
5785 **/
5786
5787 -- added for subscription lines
5788 l_lvl_total_amt := l_lvl_total_amt + level_elements_amt_rec.lvl_amt;
5789
5790 END LOOP;
5791
5792 END LOOP; --end loop of rules_rec
5793
5794 --modified if condition, added check for credit amounts also, bug 4947610
5795 -- Usage lines don't have an amount.
5796 IF(l_ETP_flag = 'E') AND top_line_grp_rec.lse_id <> 12 AND -- top_line_grp_rec.lse_id = 46 and
5797 oks_extwar_util_pvt.round_currency_amt(NVL(l_lvl_total_amt, 0), l_currency) <>
5798 (oks_extwar_util_pvt.round_currency_amt(NVL(top_line_grp_rec.price_negotiated, 0),
5799 l_currency) +
5800 oks_extwar_util_pvt.round_currency_amt(NVL(top_line_grp_rec.credit_amount, 0),
5801 l_currency) +
5802 oks_extwar_util_pvt.round_currency_amt(NVL(top_line_grp_rec.suppressed_credit, 0),
5803 l_currency)) THEN
5804
5805 /* original if condition commented for bug 4947610
5806 IF(l_ETP_flag = 'E') AND top_line_grp_rec.lse_id <> 12 AND -- top_line_grp_rec.lse_id = 46 and
5807 oks_extwar_util_pvt.round_currency_amt(NVL(l_lvl_total_amt, 0), l_currency) <>
5808 oks_extwar_util_pvt.round_currency_amt(NVL(top_line_grp_rec.price_negotiated, 0),
5809 l_currency) THEN
5810 */
5811 OKC_API.SET_MESSAGE
5812 (
5813 p_app_name => G_APP_NAME,
5814 p_msg_name => 'OKS_LVL_TOTAL_PRICE_MIS',
5815 p_token1 => 'TOKEN1',
5816 p_token1_value => get_line_name(top_line_grp_rec.id),
5817 p_token2 => 'TOKEN2',
5818 p_token2_value => top_line_grp_rec.price_negotiated,
5819 p_token3 => 'TOKEN3',
5820 p_token3_value => l_lvl_total_amt
5821 );
5822 x_return_status := OKC_API.G_RET_STS_ERROR;
5823 END IF;
5824
5825
5826 --Check for Product billing cycle end date equal to lines end date
5827 -- SLL start date should always be same as top line start date.
5828 IF TRUNC(l_SLL_end_date) < TRUNC(top_line_grp_rec.end_date) OR
5829 TRUNC(l_SLL_start_date) <> TRUNC(top_line_grp_rec.start_date)
5830 THEN
5831
5832 OKC_API.SET_MESSAGE
5833 (
5834 p_app_name => G_APP_NAME,
5835 p_msg_name => 'OKS_TOPLINE_SLL_PERIOD_INVALID',
5836 p_token1 => 'TOKEN1',
5837 p_token1_value => get_line_name(top_line_grp_rec.id)
5838 );
5839 x_return_status := OKC_API.G_RET_STS_ERROR;
5840 END IF;
5841
5842 -- It's possible in Top level billing type that the SLL end date > top line end date
5843 IF l_ETP_flag <> 'T' AND TRUNC(l_SLL_end_date) > TRUNC(top_line_grp_rec.end_date)
5844 THEN
5845
5846 OKC_API.SET_MESSAGE
5847 (
5848 p_app_name => G_APP_NAME,
5849 p_msg_name => 'OKS_TOPLINE_SLL_PERIOD_INVALID',
5850 p_token1 => 'TOKEN1',
5851 p_token1_value => get_line_name(top_line_grp_rec.id)
5852 );
5853 x_return_status := OKC_API.G_RET_STS_ERROR;
5854
5855 END IF;
5856
5857 END IF; --end if of l_top_line_SLL = 0
5858
5859 -- If the subscription line is billed, the amount should not be
5860 -- greater than price negotiated.
5861 IF top_line_grp_rec.lse_id = 46 THEN
5862
5863 OPEN get_line_price(top_line_grp_rec.id);
5864 FETCH get_line_price INTO l_line_price;
5865 CLOSE get_line_price;
5866 -- Added for bug # 4053552
5867 IF l_ETP_flag IN ('E', 'P') AND nvl(l_line_price, 0) >= 0 THEN
5868 -- Checking for negative level element for lse_id = 46
5869 OPEN check_lvl_element(top_line_grp_rec.id);
5870 FETCH check_lvl_element INTO l_amount;
5871 IF check_lvl_element%FOUND THEN
5872 -- The billing schedule amount for line number LINE_NO is negative.
5873 OKC_API.SET_MESSAGE
5874 (
5875 p_app_name => G_APP_NAME,
5876 p_msg_name => 'OKS_NEG_LVL_ELEM',
5877 p_token1 => 'LINE_NO',
5878 p_token1_value => get_line_number(top_line_grp_rec.id)
5879 );
5880 x_return_status := OKC_API.G_RET_STS_ERROR;
5881 END IF;
5882 CLOSE check_lvl_element;
5883 END IF;
5884 -- End modification for bug # 4053552
5885 OPEN get_top_billed_amount(top_line_grp_rec.id);
5886 FETCH get_top_billed_amount INTO l_total_billed;
5887 CLOSE get_top_billed_amount;
5888
5889 IF nvl(l_total_billed, 0) <> 0 THEN
5890 l_temp_total_billed := nvl(l_total_billed, 0);
5891 l_price_negotiated := nvl(l_line_price, 0);
5892 -- If Billed amount and negotiated amount are both negative
5893 IF (l_temp_total_billed < 0 AND
5894 l_price_negotiated < 0 ) THEN
5895 l_temp_total_billed := abs(l_temp_total_billed);
5896 l_price_negotiated := abs(l_price_negotiated);
5897 ELSIF l_price_negotiated < 0 AND l_temp_total_billed > 0 THEN
5898 l_price_negotiated := abs(l_price_negotiated) + l_temp_total_billed;
5899 END IF;
5900
5901 IF (oks_extwar_util_pvt.round_currency_amt(NVL(l_temp_total_billed, 0), l_currency) >
5902 oks_extwar_util_pvt.round_currency_amt(NVL(l_price_negotiated, 0), l_currency))
5903
5904 THEN
5905 OKC_API.SET_MESSAGE
5906 (
5907 p_app_name => G_APP_NAME,
5908 p_msg_name => 'OKS_SUBSCR_BILLED_AMT_MISMATCH',
5909 p_token1 => 'TOKEN1',
5910 p_token1_value => get_line_name(top_line_grp_rec.id),
5911 p_token2 => 'TOKEN2',
5912 p_token2_value => nvl(l_line_price, 0),
5913 p_token3 => 'TOKEN3',
5914 p_token3_value => nvl(l_total_billed, 0)
5915 );
5916 x_return_status := OKC_API.G_RET_STS_ERROR;
5917 END IF; -- IF ((oks_extwar_util_pvt.round_currency_amt(NVL(l_lvl_total_billed_amt,0),l_currency) >
5918 END IF; -- nvl(l_total_billed, 0) <> 0
5919 l_temp_total_billed := 0;
5920 END IF;
5921 --------------------------------------------------------------------
5922
5923 -- Subscription lines will never enter this loop.
5924 FOR line_grp_rec IN line_grp_csr (p_chr_id, top_line_grp_rec.id)
5925 LOOP
5926 l_rules_ctr := 0;
5927 --l_rules_total := 0;
5928
5929
5930 --Check for sub line SLL exists
5931
5932 SELECT COUNT(id)
5933 INTO l_sub_line_SLL
5934 FROM oks_stream_levels_b
5935 WHERE dnz_chr_id = p_chr_id
5936 AND cle_id = line_grp_rec.id;
5937
5938
5939 FOR get_ETP_rec IN get_ETP_csr (p_chr_id, line_grp_rec.id)
5940 LOOP
5941 IF get_ETP_rec.BILLING_SCHEDULE_TYPE <> l_ETP_flag
5942 THEN
5943
5944 -- store SQL error message on message stack
5945 OKC_API.SET_MESSAGE
5946 (
5947 p_app_name => G_APP_NAME,
5948 p_msg_name => 'OKS_BILLING_FLAG_MISMATCH'
5949 );
5950 x_return_status := OKC_API.G_RET_STS_ERROR;
5951
5952 END IF; --end if of get_ETP_rec
5953 END LOOP;
5954
5955 --Check for start date and end date for equal amount
5956 IF l_ETP_flag = 'E' AND
5957 (TRUNC(top_line_grp_rec.start_date) <> TRUNC(line_grp_rec.start_date)
5958 OR TRUNC(top_line_grp_rec.end_date) <> TRUNC(line_grp_rec.end_date))
5959 THEN
5960
5961 -- store SQL error message on message stack
5962 OKC_API.SET_MESSAGE
5963 (
5964 p_app_name => G_APP_NAME,
5965 p_msg_name => 'OKS_TOP_SUB_LINE_DATE_MISMATCH'
5966 );
5967 x_return_status := OKC_API.G_RET_STS_ERROR;
5968
5969 END IF; --IF l_ETP_flag = 'E' and top_line_grp_rec.start_date <> line_grp_rec.start_date
5970
5971 IF l_sub_line_SLL = 0
5972 THEN
5973
5974 -- store SQL error message on message stack
5975 OKC_API.SET_MESSAGE
5976 (
5977 p_app_name => G_APP_NAME,
5978 p_msg_name => 'OKS_SUBLINE_SLL_NOT_EXISTS',
5979 p_token1 => 'TOKEN1',
5980 --p_token1_value => top_line_grp_rec.line_number||'.'||line_grp_rec.line_number
5981 p_token1_value => get_line_name(line_grp_rec.id)
5982 );
5983 x_return_status := OKC_API.G_RET_STS_ERROR;
5984
5985 ELSE
5986
5987 OPEN sll_end_date_csr(line_grp_rec.id);
5988 FETCH sll_end_date_csr INTO l_SLL_end_date;
5989 CLOSE sll_end_date_csr;
5990
5991 OPEN sll_start_date_csr(line_grp_rec.id);
5992 FETCH sll_start_date_csr INTO l_SLL_start_date;
5993 CLOSE sll_start_date_csr;
5994
5995 --l_SLL_end_date := line_grp_rec.start_date;
5996 --l_rules_ctr := 0;
5997 l_lvl_total_amt := 0;
5998 l_lvl_total_billed_amt := 0;
5999
6000 FOR rules_rec IN rules_csr (p_chr_id, line_grp_rec.id)
6001 LOOP
6002
6003 --To get end date of product billing cycle
6004 /*
6005 l_SLL_start_date := l_SLL_end_date + l_rules_ctr;
6006 l_SLL_end_date := okc_time_util_pub.get_enddate
6007 (
6008 l_SLL_end_date + l_rules_ctr,
6009 rules_rec.uom_code, --object1_id1,
6010 rules_rec.level_periods * TO_NUMBER(rules_rec.uom_per_period) --rule_information4)
6011 );
6012 l_rules_ctr := 1;
6013 */
6014 SELECT COUNT(id)
6015 INTO l_bs_rec
6016 FROM oks_level_elements
6017 WHERE cle_id = line_grp_rec.id; -- rul_id = rules_rec.id;
6018
6019 IF l_bs_rec = 0 THEN
6020 -- store SQL error message on message stack
6021 OKC_API.SET_MESSAGE
6022 (
6023 p_app_name => G_APP_NAME,
6024 p_msg_name => 'OKS_LVL_ELEMENT_NOT_EXISTS',
6025 p_token1 => 'TOKEN1',
6026 --p_token1_value => top_line_grp_rec.line_number||'.'||line_grp_rec.line_number
6027 p_token1_value => get_line_name(line_grp_rec.id)
6028 );
6029 x_return_status := OKC_API.G_RET_STS_ERROR;
6030
6031 END IF; --end if of l_bs_rec = 0
6032
6033 --level element validation
6034 --l_lvl_element_count := 0;
6035
6036 FOR level_elements_amt_rec IN level_elements_amt_csr (rules_rec.id)
6037 LOOP
6038
6039 /** Removed check (bug 5358599) as we already check for the product billing
6040 cycle end dates matching the sublines end date.
6041 IF ((rules_rec.level_periods <> level_elements_amt_rec.lvl_count) AND l_ETP_flag <> 'T')
6042 THEN
6043
6044 -- store SQL error message on message stack
6045 OKC_API.SET_MESSAGE
6046 (
6047 p_app_name => G_APP_NAME,
6048 p_msg_name => 'OKS_SL_LVL_PERIOD_MISMATCH',
6049 p_token1 => 'TOKEN1',
6050 p_token1_value => get_line_name(line_grp_rec.id),
6051 p_token2 => 'TOKEN2',
6052 p_token2_value => rules_rec.level_periods, --rule_information3,
6053 p_token3 => 'TOKEN3',
6054 p_token3_value => level_elements_amt_rec.lvl_count
6055 );
6056 x_return_status := OKC_API.G_RET_STS_ERROR;
6057
6058 END IF;
6059 **/
6060
6061 l_lvl_total_amt := l_lvl_total_amt + level_elements_amt_rec.lvl_amt;
6062
6063 END LOOP; -- FOR level_elements_amt_rec IN level_elements_amt_csr
6064 /*
6065 FOR level_elements_billed_rec IN level_elements_billed_csr (rules_rec.id)
6066 LOOP
6067 l_lvl_total_billed_amt := l_lvl_total_billed_amt + level_elements_billed_rec.billed_amt;
6068 END LOOP; -- FOR level_elements_billed_rec IN level_elements_billed_csr
6069 */
6070 END LOOP; --end loop of rules_rec
6071
6072 --Check for subline level element total equal to price negotiated
6073 IF ((oks_extwar_util_pvt.round_currency_amt(NVL(l_lvl_total_amt, 0), l_currency) <>
6074 oks_extwar_util_pvt.round_currency_amt(NVL(line_grp_rec.price_negotiated, 0), l_currency))
6075 AND line_grp_rec.lse_id <> 13)
6076 THEN
6077
6078 -- store SQL error message on message stack
6079 OKC_API.SET_MESSAGE
6080 (
6081 p_app_name => G_APP_NAME,
6082 p_msg_name => 'OKS_SL_LVL_TOT_AMT_MISMATCH',
6083 p_token1 => 'TOKEN1',
6084 p_token1_value => get_line_name(line_grp_rec.id),
6085 p_token2 => 'TOKEN2',
6086 p_token2_value => line_grp_rec.price_negotiated,
6087 p_token3 => 'TOKEN3',
6088 p_token3_value => l_lvl_total_amt
6089 );
6090 x_return_status := OKC_API.G_RET_STS_ERROR;
6091
6092 END IF;
6093
6094 -- Added for bug # 4053552
6095 IF l_ETP_flag IN ('E', 'P') AND nvl(line_grp_rec.price_negotiated, 0) >= 0 THEN
6096 -- Checking for negative level elements for sub lines.
6097 OPEN check_lvl_element(line_grp_rec.id);
6098 FETCH check_lvl_element INTO l_amount;
6099 IF check_lvl_element%FOUND THEN
6100 -- The billing schedule amount for line number LINE_NO is negative.
6101 OKC_API.SET_MESSAGE
6102 (
6103 p_app_name => G_APP_NAME,
6104 p_msg_name => 'OKS_NEG_LVL_ELEM',
6105 p_token1 => 'LINE_NO',
6106 p_token1_value => get_line_number(line_grp_rec.id)
6107 );
6108 x_return_status := OKC_API.G_RET_STS_ERROR;
6109 END IF;
6110 CLOSE check_lvl_element;
6111 END IF;
6112 -- End modification for bug # 4053552
6113
6114 -- checks if the contract is billed and if so is the line price less than
6115 -- the billed amount.
6116 IF line_grp_rec.lse_id <> 13 THEN
6117 OPEN get_line_price(line_grp_rec.id);
6118 FETCH get_line_price INTO l_line_price;
6119 CLOSE get_line_price;
6120
6121 OPEN get_billed_amount(line_grp_rec.id);
6122 FETCH get_billed_amount INTO l_total_billed;
6123 CLOSE get_billed_amount;
6124
6125
6126 IF nvl(l_total_billed, 0) <> 0 THEN
6127 l_temp_total_billed := nvl(l_total_billed, 0);
6128 l_price_negotiated := nvl(l_line_price, 0);
6129 -- If Billed amount and negotiated amount are both negative
6130 IF (l_temp_total_billed < 0 AND
6131 l_price_negotiated < 0 ) THEN
6132 l_temp_total_billed := abs(l_temp_total_billed);
6133 l_price_negotiated := abs(l_price_negotiated);
6134 ELSIF l_price_negotiated < 0 AND l_temp_total_billed > 0 THEN
6135 l_price_negotiated := abs(l_price_negotiated) + l_temp_total_billed;
6136 END IF;
6137
6138 IF (oks_extwar_util_pvt.round_currency_amt(NVL(l_temp_total_billed, 0), l_currency) >
6139 oks_extwar_util_pvt.round_currency_amt(NVL(l_price_negotiated, 0), l_currency))
6140
6141 THEN
6142 OKC_API.SET_MESSAGE
6143 (
6144 p_app_name => G_APP_NAME,
6145 p_msg_name => 'OKS_SL_LVL_BILLED_AMT_MISMATCH',
6146 p_token1 => 'TOKEN1',
6147 p_token1_value => get_line_name(line_grp_rec.id),
6148 p_token2 => 'TOKEN2',
6149 p_token2_value => nvl(l_line_price, 0),
6150 p_token3 => 'TOKEN3',
6151 p_token3_value => nvl(l_total_billed, 0)
6152 );
6153 x_return_status := OKC_API.G_RET_STS_ERROR;
6154 END IF; -- IF ((oks_extwar_util_pvt.round_currency_amt(NVL(l_lvl_total_billed_amt,0),l_currency) >
6155 END IF; -- nvl(l_total_billed, 0) <> 0
6156 END IF; -- line_grp_rec.lse_id <> 13
6157 /*
6158 --Check for price negotiated should not less than billed amount
6159 -- Added so we can have negative prices.
6160 If l_lvl_total_billed_amt is not null and l_lvl_total_billed_amt <> 0 Then
6161 l_price_negotiated := line_grp_rec.price_negotiated;
6162 l_temp_total_billed := l_lvl_total_billed_amt;
6163 -- If Billed amount and negotiated amount are both negative
6164 IF ( l_lvl_total_billed_amt < 0 and
6165 NVL(l_price_negotiated, 0) < 0 ) THEN
6166 l_temp_total_billed := abs(l_temp_total_billed);
6167 l_price_negotiated := abs(l_price_negotiated);
6168 END If;
6169
6170 IF ((oks_extwar_util_pvt.round_currency_amt(NVL(l_temp_total_billed ,0),l_currency) >
6171 oks_extwar_util_pvt.round_currency_amt(NVL(l_price_negotiated,0),l_currency))
6172 AND line_grp_rec.lse_id <> 13)
6173 THEN
6174
6175 -- store SQL error message on message stack
6176 OKC_API.SET_MESSAGE
6177 (
6178 p_app_name => G_APP_NAME,
6179 p_msg_name => 'OKS_SL_LVL_BILLED_AMT_MISMATCH',
6180 p_token1 => 'TOKEN1',
6181 p_token1_value => get_line_name(line_grp_rec.id),
6182 p_token2 => 'TOKEN2',
6183 p_token2_value => line_grp_rec.price_negotiated,
6184 p_token3 => 'TOKEN3',
6185 p_token3_value => l_lvl_total_billed_amt
6186 );
6187 x_return_status := OKC_API.G_RET_STS_ERROR;
6188
6189 END IF;
6190 End If; -- if there is a billed amount
6191
6192 */
6193
6194 --Check for Product billing cycle end date equal to lines end date
6195 -- This check is not done for Top level billing type because the
6196 -- SLL end date in that case might go beyond the line end date.
6197 IF ((l_ETP_flag = 'E' OR l_ETP_flag = 'P')
6198 AND TRUNC(l_SLL_end_date) <> TRUNC(line_grp_rec.end_date))
6199 OR
6200 (l_ETP_flag = 'P' AND TRUNC(l_SLL_start_date) <> TRUNC(line_grp_rec.start_date) )
6201 THEN
6202
6203 OKC_API.SET_MESSAGE
6204 (
6205 p_app_name => G_APP_NAME,
6206 p_msg_name => 'OKS_SUBLINE_SLL_PERIOD_INVALID',
6207 p_token1 => 'TOKEN1',
6208 p_token1_value => get_line_name(line_grp_rec.id)
6209 );
6210 x_return_status := OKC_API.G_RET_STS_ERROR;
6211 END IF;
6212
6213
6214 END IF; --end if of l_sub_line_SLL = 0
6215
6216 -- l_sub_line_price_nego_tot := l_sub_line_price_nego_tot + NVL(line_grp_rec.price_negotiated,0);
6217 -- Compares each sub line price negotiated to sum of level elements for that subline.
6218 /*
6219 IF (l_ETP_flag = 'E' AND top_line_grp_rec.lse_id <> 12)
6220 and (oks_extwar_util_pvt.round_currency_amt(NVL(l_lvl_total_amt,0),l_currency) <>
6221 oks_extwar_util_pvt.round_currency_amt(NVL(line_grp_rec.price_negotiated,0),l_currency))
6222
6223 THEN
6224
6225 OKC_API.SET_MESSAGE
6226 (
6227 p_app_name => G_APP_NAME,
6228 p_msg_name => 'OKS_LVL_TOTAL_PRICE_MIS',
6229 p_token1 => 'TOKEN1',
6230 p_token1_value => get_line_name(line_grp_rec.id), --'2'
6231 p_token2 => 'TOKEN2',
6232 p_token2_value => line_grp_rec.price_negotiated, -- each negotiated sub line
6233 p_token3 => 'TOKEN3',
6234 p_token3_value => l_lvl_total_amt -- sum of subline level elements
6235 );
6236 x_return_status := OKC_API.G_RET_STS_ERROR;
6237 END IF;
6238 */
6239
6240 END LOOP; --end loop of line_grp_rec
6241
6242
6243
6244 END LOOP; --end loop of top_line_grp_rec
6245 END IF;
6246 IF x_return_status = OKC_API.G_RET_STS_SUCCESS
6247 THEN
6248 OKC_API.set_message(
6249 p_app_name => G_APP_NAME,
6250 p_msg_name => 'OKS_QA_SUCCESS');
6251 END IF; -- IF x_return_status = OKC_API.G_RET_STS_SUCCESS
6252
6253
6254 EXCEPTION
6255 WHEN OTHERS THEN
6256 x_return_status := OKC_API.G_RET_STS_ERROR;
6257 OKC_API.SET_MESSAGE
6258 (
6259 p_app_name => G_APP_NAME,
6260 p_msg_name => G_UNEXPECTED_ERROR,
6261 p_token1 => G_SQLCODE_TOKEN,
6262 p_token1_value => SQLCODE,
6263 p_token2 => G_SQLERRM_TOKEN,
6264 p_token2_value => SQLERRM
6265 );
6266 END check_billing_schedule;
6267
6268 /*============================================================================+
6269 | Procedure: Check_product_availability
6270 |
6271 | Purpose: If line status is ENTERED then checks if service is available
6272 | for the covered product or item.
6273 |
6274 | In Parameters: p_chr_id the contract id
6275 | Out Parameters: x_return_status standard return status
6276 |
6277 +============================================================================*/
6278 PROCEDURE Check_product_availability
6279 (
6280 X_Return_Status OUT NOCOPY VARCHAR2,
6281 p_chr_id IN NUMBER
6282 )
6283 IS
6284 service_rec_type OKS_OMINT_PUB.check_service_rec_type;
6285 l_service_id NUMBER;
6286 l_service_item_id NUMBER;
6287 l_product_id NUMBER;
6288 l_product_item_id NUMBER;
6289 l_customer_id NUMBER;
6290 l_msg_Count NUMBER;
6291 l_msg_Data VARCHAR2(50);
6292 l_Return_Status VARCHAR2(1);
6293 l_Available_YN VARCHAR2(1);
6294 l_api_name CONSTANT VARCHAR2(30) := 'Check_product_availability';
6295
6296 --start changes for org id in is_service_available
6297 CURSOR get_auth_org_csr IS
6298 SELECT authoring_org_id
6299 FROM okc_k_headers_all_b
6300 WHERE id = p_chr_id;
6301
6302 get_auth_org_rec get_auth_org_csr%ROWTYPE;
6303 --End changes for org id in is_service_available
6304
6305 /*** Get all service lines for given Contract header id ***/
6306 CURSOR l_csr_get_service_line_id(p_chr_id NUMBER) IS
6307 SELECT cle.id, sts.ste_code sts_code
6308 FROM okc_k_lines_b cle,
6309 okc_statuses_b sts
6310 WHERE cle.dnz_chr_id = p_chr_id
6311 AND sts.code = cle.sts_code
6312 AND cle.lse_id IN (1, 19)
6313 AND cle.date_cancelled IS NULL --Changes [llc]
6314 ;
6315
6316 /*** Get customer id for all the above service lines ***/
6317 -- object1_id1 of CAN rule
6318 CURSOR l_csr_get_customer_id(p_chr_id NUMBER, l_service_id NUMBER) IS
6319 SELECT CUST_ACCT_ID
6320 FROM okc_k_lines_b
6321 WHERE dnz_chr_id = p_chr_id
6322 AND id = l_service_id;
6323
6324
6325
6326 /*** Get service item id for all the service lines from OKC_K_ITEMS_V ***/
6327 CURSOR l_csr_get_service_item_id(p_cle_id IN NUMBER) IS
6328 SELECT object1_id1
6329 FROM okc_k_items_v
6330 WHERE cle_id = p_cle_id ;
6331
6332
6333 /*** Get all product lines and item lines for each service line ***/
6334 CURSOR l_csr_get_product_line_id IS
6335 SELECT id, start_date, lse_id
6336 FROM okc_k_lines_b
6337 WHERE cle_id = l_service_id
6338 AND lse_id IN (9, 25, 7) -- 7 added for bug#2430496
6339 AND date_cancelled IS NULL --Changes [llc]
6340 ;
6341
6342
6343 /*** Get service item id or product item if for all the service lines
6344 *** or product lines from OKC_K_ITEMS_V ***/
6345 -- For a covered item the inventory_item_id is
6346 -- stored inside of object1_id1
6347 -- For covered products the customer_product_id is stored inside of object1_id1
6348 CURSOR l_csr_get_item_id(p_cle_id IN NUMBER) IS
6349 SELECT object1_id1
6350 FROM okc_k_items_v
6351 WHERE cle_id = p_cle_id ;
6352
6353 CURSOR l_product_csr(p_cp_id NUMBER) IS
6354 SELECT inventory_item_id
6355 FROM csi_item_instances
6356 WHERE instance_id = p_cp_id;
6357
6358 l_cp_id NUMBER;
6359 l_sts_code VARCHAR2(100);
6360 l_prod_start_date DATE;
6361 l_lse_id NUMBER;
6362
6363 BEGIN
6364
6365 X_return_status := OKC_API.G_RET_STS_SUCCESS;
6366 /*** Get customer_id ****/
6367
6368 l_service_id := NULL;
6369 l_sts_code := NULL;
6370
6371 --changes for passing org_id in is_service_available
6372 OPEN get_auth_org_csr;
6373 FETCH get_auth_org_csr INTO get_auth_org_rec;
6374 CLOSE get_auth_org_csr;
6375
6376 OPEN l_csr_get_service_line_id(p_chr_id);
6377 LOOP
6378 FETCH l_csr_get_service_line_id INTO l_service_id, l_sts_code;
6379 EXIT WHEN l_csr_get_service_line_id%NOTFOUND;
6380
6381 l_customer_id := NULL;
6382
6383 OPEN l_csr_get_customer_id(p_chr_id, l_service_id);
6384 FETCH l_csr_get_customer_id INTO l_customer_id;
6385 IF l_csr_get_customer_id%NOTFOUND
6386 THEN
6387 x_return_status := 'E';
6388 CLOSE l_csr_get_customer_id;
6389 EXIT;
6390 END IF;
6391 CLOSE l_csr_get_customer_id;
6392
6393 l_service_item_id := NULL;
6394
6395 OPEN l_csr_get_item_id(l_service_id);
6396 FETCH l_csr_get_item_id INTO l_service_item_id;
6397 IF l_csr_get_item_id%NOTFOUND
6398 THEN
6399 x_return_status := 'E';
6400 CLOSE l_csr_get_item_id;
6401 EXIT;
6402 END IF;
6403 CLOSE l_csr_get_item_id;
6404
6405 l_product_id := NULL;
6406 l_prod_start_date := NULL;
6407
6408 -------------------- Product line id loop ---------------------------------
6409 OPEN l_csr_get_product_line_id;
6410 LOOP
6411 FETCH l_csr_get_product_line_id INTO l_product_id, l_prod_start_date, l_lse_id;
6412 EXIT WHEN l_csr_get_product_line_id%NOTFOUND;
6413
6414 l_product_item_id := NULL;
6415
6416 OPEN l_csr_get_item_id(l_product_id);
6417 FETCH l_csr_get_item_id INTO l_product_item_id;
6418 IF l_csr_get_item_id%NOTFOUND THEN
6419 x_return_status := 'E';
6420 CLOSE l_csr_get_item_id;
6421 EXIT;
6422 END IF;
6423 CLOSE l_csr_get_item_id;
6424
6425 l_cp_id := NULL;
6426 -- Fix for bug # 3676448
6427 -- For a covered item the inventory_item_id is
6428 -- stored inside of object1_id1 instead of customer_product_id
6429 -- customer product id is stored in object1_id1 for lse id 25, 9
6430 IF l_lse_id = 7 THEN
6431 l_cp_id := l_product_item_id;
6432 ELSE
6433 OPEN l_product_csr(l_product_item_id);
6434 FETCH l_product_csr INTO l_cp_id;
6435 CLOSE l_product_csr;
6436 END IF;
6437
6438 service_rec_type.service_item_id := l_service_item_id;
6439 service_rec_type.customer_id := l_customer_id;
6440 service_rec_type.product_item_id := l_cp_id;
6441 service_rec_type.request_date := l_prod_start_date;
6442 l_available_YN := NULL;
6443
6444 IF l_sts_code = 'ENTERED' THEN
6445 --changes for passing org_id in is_service_available
6446 OKS_OMINT_PUB.Is_Service_Available
6447 (
6448 p_api_version => 1.0,
6449 p_init_msg_list => 'F',
6450 x_msg_count => l_msg_Count,
6451 x_msg_data => l_msg_Data,
6452 x_return_status => l_Return_Status,
6453 p_check_service_rec => service_rec_type,
6454 x_available_yn => l_available_YN,
6455 p_org_id => get_auth_org_rec.authoring_org_id
6456 );
6457
6458
6459 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6460 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'After Service_Available return_status: '|| x_return_status);
6461 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_msg_data: '|| l_msg_data);
6462 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_msg_count: '|| l_msg_count);
6463 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_available_YN: '|| l_available_YN);
6464 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME || '.' || l_api_name,'l_org_id: '|| get_auth_org_rec.authoring_org_id);
6465 END IF;
6466 IF l_available_yn = 'N' THEN
6467 x_return_status := OKC_API.G_RET_STS_ERROR;
6468
6469 OKC_API.set_message
6470 (
6471 p_app_name => 'OKS',
6472 p_msg_name => 'OKS_PRODUCT_AVAILABILITY',
6473 p_token1 => 'TOKEN1',
6474 --p_token1_value => get_line_name(l_line_rec.line_number),
6475 p_token1_value => get_line_name(l_service_id),
6476 p_token2 => 'TOKEN2',
6477 p_token2_value => get_line_name(l_product_id)
6478 );
6479
6480 END IF;
6481 END IF; --If l_sts_code = 'ENTERED'
6482
6483 END LOOP; /** End loop get product line id **/
6484 CLOSE l_csr_get_product_line_id;
6485 ----------------- Product line id loop -------------------------------
6486
6487 END LOOP; /** End loop get service line id **/
6488 CLOSE l_csr_get_service_line_id;
6489 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
6490 OKC_API.set_message(
6491 p_app_name => G_APP_NAME,
6492 p_msg_name => 'OKS_QA_SUCCESS');
6493 END IF;
6494
6495
6496
6497 EXCEPTION
6498 WHEN G_EXCEPTION_HALT_VALIDATION THEN
6499 -- no processing necessary; validation can continue with next column
6500 NULL;
6501 WHEN OTHERS THEN
6502 -- store SQL error message on message stack
6503 OKC_API.SET_MESSAGE(
6504 p_app_name => G_APP_NAME,
6505 p_msg_name => G_UNEXPECTED_ERROR,
6506 p_token1 => G_SQLCODE_TOKEN,
6507 p_token1_value => SQLCODE,
6508 p_token2 => G_SQLERRM_TOKEN,
6509 p_token2_value => SQLERRM);
6510 -- notify caller of an error as UNEXPETED error
6511 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
6512 -- verify that cursor was closed
6513
6514
6515 END Check_product_availability;
6516
6517 /*============================================================================+
6518 | Procedure: check_customer_avail_loop
6519 |
6520 | Purpose: Helper procedure for check_customer_availability
6521 |
6522 | In Parameters: p_chr_id the contract id
6523 | Out Parameters: x_return_status standard return status
6524 |
6525 +============================================================================*/
6526 PROCEDURE check_customer_avail_loop
6527 (
6528 x_return_status OUT NOCOPY VARCHAR2,
6529 p_cust_acct_id IN NUMBER,
6530 p_chr_id IN NUMBER,
6531 p_line_number IN NUMBER,
6532 p_usage IN VARCHAR2
6533 ) IS
6534
6535 l_cust_acct_id NUMBER := p_cust_acct_id;
6536 l_acct_name VARCHAR2(360);
6537 l_cust_party_id NUMBER;
6538 l_party_id NUMBER;
6539 l_org_id NUMBER;
6540
6541 l_cust_id NUMBER;
6542 l_rel_cust_id NUMBER;
6543 l_rel_cust_flag VARCHAR2 (5) := 'Y';
6544
6545 CURSOR get_cust_id(l_cust_acct_id NUMBER) IS
6546 SELECT P.PARTY_NAME name, CA.PARTY_ID party_id
6547 FROM HZ_CUST_ACCOUNTS CA, HZ_PARTIES P
6548 WHERE CA.PARTY_ID = P.PARTY_ID AND
6549 CA.CUST_ACCOUNT_ID = l_cust_acct_id;
6550
6551 -- This cursor will return the party id of the customer or third party
6552 -- stored on the contract header.
6553 -- If no value is returned then check the related customers
6554 CURSOR cust_exist_csr(cust_id NUMBER) IS
6555 SELECT object1_id1 party_id
6556 FROM okc_k_party_roles_v
6557 WHERE rle_code NOT IN ('VENDOR', 'MERCHANT')
6558 AND object1_id1 = cust_id
6559 AND dnz_chr_id = p_chr_id
6560 AND chr_id = p_chr_id;
6561
6562 CURSOR get_org_id IS
6563 SELECT AUTHORING_ORG_ID
6564 FROM okc_k_headers_all_b
6565 WHERE id = p_chr_id;
6566
6567 CURSOR get_contr_cust IS
6568 SELECT object1_id1 party_id
6569 FROM okc_k_party_roles_v
6570 WHERE rle_code NOT IN ('VENDOR', 'MERCHANT')
6571 AND dnz_chr_id = p_chr_id
6572 AND chr_id = p_chr_id;
6573
6574 -- If the party id does not belong to the customer or third party then
6575 -- it might belong to the related customer account. If not give an error.
6576 -- replaced OKX_CUST_ACCT_RELATE_ALL_V with HZ_CUST_ACCT_RELATE_ALL
6577 -- replaced OKX_CUSTOMER_ACCOUNTS_V with HZ_CUST_ACCOUNTS
6578 CURSOR get_related_cust_acct_id(orgId NUMBER, relatedCustAccId NUMBER,
6579 custPartyId NUMBER) IS
6580 SELECT A.CUST_ACCOUNT_ID, A.RELATED_CUST_ACCOUNT_ID
6581 FROM HZ_CUST_ACCT_RELATE_ALL A,
6582 HZ_CUST_ACCOUNTS CA
6583 WHERE CA.CUST_ACCOUNT_ID = A.CUST_ACCOUNT_ID
6584 AND CA.PARTY_ID = custPartyId
6585 AND A.RELATED_CUST_ACCOUNT_ID = relatedCustAccId
6586 AND CA.STATUS = 'A'
6587 AND A.status = 'A'
6588 AND A.org_id = orgId;
6589
6590 BEGIN
6591 x_return_status := OKC_API.G_RET_STS_SUCCESS;
6592 -- Gets the account name of the party owning the line
6593 OPEN get_cust_id(l_cust_acct_id);
6594 FETCH get_cust_id INTO l_acct_name, l_cust_party_id;
6595 CLOSE get_cust_id;
6596
6597 IF l_cust_party_id IS NOT NULL THEN
6598 -- checks to see if the line party is the same as the header party.
6599 OPEN cust_exist_csr(l_cust_party_id);
6600 FETCH cust_exist_csr INTO l_party_id;
6601 -- if account does not belong to customer or third party then
6602 -- it might belong to related customer.
6603 IF cust_exist_csr%NOTFOUND THEN
6604 OPEN get_org_id;
6605 FETCH get_org_id INTO l_org_id;
6606 CLOSE get_org_id;
6607
6608 -- get's the customer/third party, party id of the contract header.
6609 -- Open get_contr_cust;
6610 -- Fetch get_contr_cust into l_party_id;
6611 -- Bug Fix 4253417
6612 FOR get_contr_rec IN get_contr_cust
6613 LOOP
6614 l_rel_cust_flag := 'N';
6615 l_party_id := get_contr_rec.party_id;
6616 -- makes sure the customer on the contract has a relationship
6617 -- with the related customer.
6618 OPEN get_related_cust_acct_id(l_org_id, l_cust_acct_id, l_party_id);
6619 FETCH get_related_cust_acct_id INTO l_cust_id, l_rel_cust_id;
6620 IF get_related_cust_acct_id%FOUND THEN
6621 CLOSE get_related_cust_acct_id;
6622 l_rel_cust_flag := 'Y';
6623 EXIT;
6624 END IF;
6625 CLOSE get_related_cust_acct_id;
6626 END LOOP;
6627 -- Bug Fix end 4253417
6628 IF l_rel_cust_flag = 'N' THEN
6629 IF p_usage = 'BTO' THEN
6630 OKC_API.set_message(
6631 p_app_name => G_APP_NAME,
6632 p_msg_name => G_BTO_ACCT,
6633 p_token1 => 'ACCOUNT_NAME',
6634 p_token1_value => l_acct_name,
6635 p_token2 => 'LINE_NUMBER',
6636 p_token2_value => p_line_number);
6637 ELSE
6638 OKC_API.set_message(
6639 p_app_name => G_APP_NAME,
6640 p_msg_name => G_STO_ACCT,
6641 p_token1 => 'ACCOUNT_NAME',
6642 p_token1_value => l_acct_name,
6643 p_token2 => 'LINE_NUMBER',
6644 p_token2_value => p_line_number);
6645 END IF;
6646 x_return_status := OKC_API.G_RET_STS_ERROR;
6647 END IF;
6648
6649 END IF; -- cust_exist_csr%NOTFOUND
6650 CLOSE cust_exist_csr;
6651
6652 END IF; -- l_cust_party_id is not null
6653
6654
6655 EXCEPTION
6656 WHEN G_EXCEPTION_HALT_VALIDATION THEN
6657 -- no processing necessary; validation can continue with next column
6658 NULL;
6659 WHEN OTHERS THEN
6660 -- store SQL error message on message stack
6661 OKC_API.SET_MESSAGE(
6662 p_app_name => G_APP_NAME,
6663 p_msg_name => G_UNEXPECTED_ERROR,
6664 p_token1 => G_SQLCODE_TOKEN,
6665 p_token1_value => SQLCODE,
6666 p_token2 => G_SQLERRM_TOKEN,
6667 p_token2_value => SQLERRM);
6668 -- notify caller of an error as UNEXPETED error
6669 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
6670
6671 END check_customer_avail_loop;
6672
6673 /*============================================================================+
6674 | Procedure: check_customer_availability
6675 |
6676 | Purpose: Checks if the account stored on each contract
6677 | line belongs to the customer/subscriber, third party
6678 | or related customer.
6679 |
6680 | In Parameters: p_chr_id the contract id
6681 | Out Parameters: x_return_status standard return status
6682 |
6683 +============================================================================*/
6684 PROCEDURE check_customer_availability
6685 (
6686 x_return_status OUT NOCOPY VARCHAR2,
6687 p_chr_id IN NUMBER
6688 ) IS
6689
6690 --The customer account id, third party account id or the customer related
6691 -- account id used to be stored in the CAN rule for lines.
6692 -- Now it's stored in contract lines.
6693 -- Bug 4915718--
6694 -- We would not be checking Inactive Customer Account for
6695 -- lines that have been terminated (with termination date less than sysdate)
6696
6697 CURSOR get_cust_acct_lines(p_chr_id NUMBER) IS
6698 SELECT cust_acct_id, id, ship_to_site_use_id, line_number
6699 FROM okc_k_lines_b
6700 WHERE dnz_chr_id = p_chr_id
6701 AND cust_acct_id IS NOT NULL
6702 AND chr_id IS NOT NULL
6703 AND date_cancelled IS NULL --Changes [llc]
6704 AND (date_terminated IS NULL OR date_terminated > SYSDATE); -- Bug 4915718
6705
6706
6707 -- gets ship to customber account id
6708 CURSOR get_ship_to_acct(l_site_use_id NUMBER) IS
6709 SELECT CA.cust_account_id
6710 FROM HZ_CUST_SITE_USES_ALL CS, HZ_CUST_ACCT_SITES_ALL CA
6711 WHERE CS.SITE_USE_ID = l_site_use_id
6712 AND CS.site_use_code = 'SHIP_TO'
6713 AND CS.cust_acct_site_id = CA.cust_acct_site_id;
6714
6715 CURSOR is_cust_active(l_cust_acct_id NUMBER) IS
6716 SELECT status
6717 FROM hz_cust_accounts
6718 WHERE cust_account_id = l_cust_acct_id
6719 AND status = 'A';
6720
6721 CURSOR get_contr_cust IS
6722 SELECT object1_id1 party_id, rle_code
6723 FROM okc_k_party_roles_v
6724 WHERE rle_code NOT IN ('VENDOR', 'MERCHANT')
6725 AND dnz_chr_id = p_chr_id
6726 AND chr_id = p_chr_id;
6727
6728 CURSOR is_cust_hdr_active(l_party_id NUMBER) IS
6729 SELECT CA.CUST_ACCOUNT_ID,
6730 ca.status,
6731 decode(CA.ACCOUNT_NAME, NULL, P.PARTY_NAME, CA.Account_NAME) NAME
6732 FROM HZ_CUST_ACCOUNTS CA, HZ_PARTIES P
6733 WHERE CA.PARTY_ID = P.PARTY_ID
6734 AND P.PARTY_ID = l_party_id;
6735
6736 -- GCHADHA --
6737 -- BUG 4138244 --
6738 -- Fetch the Customer Bill to Id and Ship to Id
6739 -- Get the Cust Account Id
6740 -- Validate the whether the Cust_Account_Id is
6741 -- Active or not
6742
6743 CURSOR get_billto_shipto(p_chr_id IN NUMBER) IS
6744 SELECT bill_to_site_use_id, ship_to_site_use_id
6745 FROM okc_k_headers_all_b
6746 WHERE id = p_chr_id ;
6747
6748
6749 CURSOR get_billto_cust_acct(p_bill_to_site_use_id IN NUMBER) IS
6750 SELECT
6751 c.cust_account_id CUST_ID1,
6752 p.party_id party_id
6753
6754 FROM OKX_CUST_SITE_USES_V a,
6755 hz_cust_accounts c,
6756 hz_parties p
6757 WHERE a.id1 = p_bill_to_site_use_id
6758 AND c.cust_account_id = a.cust_account_id
6759 AND a.site_use_code = 'BILL_TO'
6760 AND p.party_id = c.party_id;
6761
6762 CURSOR get_shipto_cust_acct(p_ship_to_site_use_id IN NUMBER) IS
6763 SELECT
6764 c.cust_account_id CUST_ID1,
6765 p.party_id party_id
6766 FROM OKX_CUST_SITE_USES_V a,
6767 hz_cust_accounts c,
6768 hz_parties p
6769 WHERE a.id1 = p_ship_to_site_use_id
6770 AND c.cust_account_id = a.cust_account_id
6771 AND a.site_use_code = 'SHIP_TO'
6772 AND p.party_id = c.party_id;
6773
6774 CURSOR Get_Status_Party (l_cust_acct_id IN NUMBER, l_party_id IN NUMBER) IS
6775 SELECT CA.CUST_ACCOUNT_ID, ca.status,
6776 decode(CA.ACCOUNT_NAME, NULL, P.PARTY_NAME, CA.Account_NAME) NAME
6777 FROM HZ_CUST_ACCOUNTS CA, HZ_PARTIES P
6778 WHERE CA.PARTY_ID = P.PARTY_ID
6779 AND P.PARTY_ID = l_party_id
6780 AND CA.CUST_ACCOUNT_ID = l_cust_acct_id;
6781
6782
6783
6784 CURSOR Get_Relationship(p_chr_id IN NUMBER, p_party_id IN NUMBER) IS
6785 SELECT rle_code
6786 FROM okc_k_party_roles_b
6787 WHERE rle_code NOT IN ('VENDOR', 'MERCHANT')
6788 AND dnz_chr_id = p_chr_id
6789 AND chr_id = p_chr_id
6790 AND object1_id1 = p_party_id;
6791
6792 /*added hint based upon appsperf team suggestion - bug9789087*/
6793 -- Use this Cursor to find Customer /Third Party related to the
6794 -- Customer_account which is inactive
6795 CURSOR get_parent_party (p_org_id IN NUMBER, p_id IN NUMBER) IS
6796 SELECT /*+ index(B.CA HZ_CUST_ACCOUNTS_N2) */ rle_code, B.Status, B.PARTY_STATUS
6797 FROM okc_k_party_roles_b A,
6798 (SELECT CA.PARTY_ID, A.Status, CA.STATUS PARTY_STATUS FROM HZ_CUST_ACCT_RELATE_ALL A,
6799 HZ_CUST_ACCOUNTS CA WHERE CA.CUST_ACCOUNT_ID = A.CUST_ACCOUNT_ID
6800 AND A.RELATED_CUST_ACCOUNT_ID = p_id
6801 AND A.org_id = p_org_id) B
6802 WHERE A.rle_code NOT IN ('VENDOR', 'MERCHANT')
6803 AND A.dnz_chr_id = p_chr_id
6804 AND A.chr_id = p_chr_id
6805 AND A.OBJECT1_ID1 = B.Party_ID
6806 ORDER BY B.STATUS,B.PARTY_STATUS;/*BUG 6719442*/
6807
6808
6809 -- Check whether the customer/third party is active or not.
6810 CURSOR Get_Status_Party_Main (l_party_id IN NUMBER) IS
6811 SELECT CA.CUST_ACCOUNT_ID, ca.status,
6812 decode(CA.ACCOUNT_NAME, NULL, P.PARTY_NAME, CA.Account_NAME) NAME
6813 FROM HZ_CUST_ACCOUNTS CA, HZ_PARTIES P
6814 WHERE CA.PARTY_ID = P.PARTY_ID
6815 AND P.PARTY_ID = l_party_id
6816 AND CA.STATUS = 'A';
6817
6818 CURSOR get_org_id IS
6819 SELECT AUTHORING_ORG_ID
6820 FROM okc_k_headers_all_b
6821 WHERE id = p_chr_id;
6822
6823
6824 l_bill_to_site_use_id NUMBER;
6825
6826 l_ship_to_site_use_id NUMBER;
6827
6828 l_temp_party_id NUMBER;
6829
6830 l_org_id NUMBER;
6831
6832 l_rle_code VARCHAR2(30);
6833
6834 l_flag NUMBER := 0; -- Used for Related Customer.
6835
6836 l_related_status VARCHAR2(10); -- USed to get status of Related Customer
6837
6838 l_cust_inactive NUMBER := 0; -- If the customer itself is inactive set it to 1
6839
6840 -- Flag to Verify whether the Billto /Shipto Related Customer
6841 -- is inactive l_bsto =1 FOR Bill To l_bsto =2 FOR Ship to
6842
6843 l_bto_flag NUMBER := 0;
6844
6845 l_sto_flag NUMBER := 0;
6846
6847
6848 l_party_status VARCHAR2(10); -- Check the party status when checking Related Customer
6849
6850 -- END GCHADHA --
6851
6852
6853
6854 l_cust_acct_id NUMBER;
6855 l_line_number VARCHAR2(150);
6856 l_status VARCHAR2(30);
6857 l_name VARCHAR2(360);
6858 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
6859 l_ship_to_cust_acct_id NUMBER;
6860 l_cust_not_found BOOLEAN;
6861
6862
6863
6864 BEGIN
6865 x_return_status := OKC_API.G_RET_STS_SUCCESS;
6866
6867 l_cust_not_found := TRUE;
6868 -- GCHADHA --
6869 -- BUG 4138244 ---
6870 -- Checks if customer/subscriber or third party are active.
6871 -- First Check whether the Customer/Third Party is Valid or Not
6872 -- Then Check whether the Cust_Account_ID is Valid Or Not
6873
6874
6875 FOR get_cust_rec IN get_contr_cust LOOP
6876 l_cust_not_found := FALSE;
6877 OPEN Get_Status_Party_Main(get_cust_rec.party_id);
6878 FETCH Get_Status_Party_Main INTO l_cust_acct_id, l_status, l_name;
6879 IF Get_Status_Party_Main%NOTFOUND THEN
6880 -- Get the Customer Name
6881 OPEN is_cust_hdr_active(get_cust_rec.party_id);
6882 FETCH is_cust_hdr_active INTO l_cust_acct_id, l_status, l_name;
6883 CLOSE is_cust_hdr_active;
6884 l_cust_inactive := 1;
6885 -- Get the customer name
6886 IF get_cust_rec.rle_code = 'CUSTOMER' THEN
6887 OKC_API.set_message(
6888 p_app_name => G_APP_NAME,
6889 p_msg_name => G_CUST_INACTIVE, -- Customer is not acitive.
6890 p_token1 => 'NAME',
6891 p_token1_value => l_name
6892 );
6893 x_return_status := OKC_API.G_RET_STS_ERROR;
6894 ELSIF get_cust_rec.rle_code = 'THIRD_PARTY' THEN
6895 OKC_API.set_message(
6896 p_app_name => G_APP_NAME,
6897 p_msg_name => G_THIRD_PARTY_INACTIVE, -- Third party is not active.
6898 p_token1 => 'NAME',
6899 p_token1_value => l_name
6900 );
6901 x_return_status := OKC_API.G_RET_STS_ERROR;
6902 ELSIF get_cust_rec.rle_code = 'SUBSCRIBER' THEN
6903 OKC_API.set_message(
6904 p_app_name => G_APP_NAME,
6905 p_msg_name => G_SUB_INACTIVE, -- Subscriber is not active.
6906 p_token1 => 'NAME',
6907 p_token1_value => l_name
6908 );
6909 x_return_status := OKC_API.G_RET_STS_ERROR;
6910 END IF;
6911
6912 END IF;
6913 CLOSE Get_Status_Party_Main;
6914 END LOOP;
6915
6916
6917 OPEN get_billto_shipto(p_chr_id);
6918 FETCH get_billto_shipto INTO l_bill_to_site_use_id, l_ship_to_site_use_id ;
6919 CLOSE get_billto_shipto;
6920
6921
6922 OPEN get_org_id;
6923 FETCH get_org_id INTO l_org_id;
6924 CLOSE get_org_id;
6925
6926 -- Check Bill to Account
6927 IF l_bill_to_site_use_id IS NOT NULL THEN
6928 -- Check the status of the cust_account id using bill to cust account id
6929 l_cust_not_found := FALSE;
6930 OPEN get_billto_cust_acct (l_bill_to_site_use_id) ;
6931 FETCH get_billto_cust_acct INTO l_cust_acct_id, l_temp_party_id;
6932 CLOSE get_billto_cust_acct;
6933
6934 OPEN Get_Relationship(p_chr_id, l_temp_party_id);
6935 FETCH Get_Relationship INTO l_rle_code;
6936 IF Get_Relationship%NOTFOUND THEN
6937 -- Check for Related customer --
6938 OPEN get_parent_party (l_org_id, l_cust_acct_id);
6939 FETCH get_parent_party INTO l_rle_code, l_related_status, l_party_status;
6940 IF l_related_status <> 'A' OR l_party_status <> 'A' THEN
6941 l_flag := 1;
6942 l_bto_flag := 1; -- Missing Bill to
6943 END IF;
6944
6945 CLOSE get_parent_party;
6946 END IF;
6947 CLOSE Get_Relationship;
6948
6949 OPEN Get_Status_Party (l_cust_acct_id, l_temp_party_id);
6950 FETCH Get_Status_Party INTO l_cust_acct_id, l_status, l_name;
6951 IF Get_Status_Party%FOUND THEN
6952 IF l_status <> 'A' AND l_bto_flag <> 1 THEN
6953 OKC_API.set_message(
6954 p_app_name => G_APP_NAME,
6955 p_msg_name => G_BILL_CUST_INACTIVE -- Customer is not acitive.
6956
6957 );
6958 x_return_status := OKC_API.G_RET_STS_ERROR;
6959 END IF;
6960 END IF;
6961 CLOSE Get_Status_Party;
6962
6963
6964 END IF;
6965 -- Check Ship to Account
6966 IF l_ship_to_site_use_id IS NOT NULL THEN
6967 -- Check the status of the cust_account id using bil to and ship to cust account id
6968 l_cust_not_found := FALSE;
6969
6970 OPEN get_shipto_cust_acct (l_ship_to_site_use_id) ;
6971 FETCH get_shipto_cust_acct INTO l_cust_acct_id, l_temp_party_id;
6972 CLOSE get_shipto_cust_acct;
6973
6974 OPEN Get_Relationship(p_chr_id, l_temp_party_id);
6975 FETCH Get_Relationship INTO l_rle_code;
6976 IF Get_Relationship%NOTFOUND THEN
6977 -- Check for Related customer --
6978 OPEN get_parent_party (l_org_id, l_cust_acct_id);
6979 FETCH get_parent_party INTO l_rle_code, l_related_status, l_party_status;
6980 IF l_related_status <> 'A' OR l_party_status <> 'A' THEN
6981 l_flag := 1;
6982 l_sto_flag := 2; -- Missing Ship to
6983 END IF;
6984
6985 CLOSE get_parent_party;
6986 END IF;
6987 CLOSE Get_Relationship;
6988
6989
6990 OPEN Get_Status_Party (l_cust_acct_id, l_temp_party_id);
6991 FETCH Get_Status_Party INTO l_cust_acct_id, l_status, l_name;
6992 IF Get_Status_Party%FOUND THEN
6993 IF l_status <> 'A' AND l_sto_flag <> 2 THEN
6994 OKC_API.set_message(
6995 p_app_name => G_APP_NAME,
6996 p_msg_name => G_SHIP_CUST_INACTIVE -- Bill to Customer Account is not acitive.
6997 );
6998 x_return_status := OKC_API.G_RET_STS_ERROR;
6999 END IF;
7000 END IF;
7001 CLOSE Get_Status_Party;
7002
7003 END IF;
7004
7005
7006
7007 -- l_flag is used to display the error in condition when the
7008 -- billto/shipto account is a related customer and, this customer is
7009 -- inactive.
7010 IF l_flag = 1 THEN
7011 IF l_bto_flag = 1 THEN -- IF THE RELATED CUSTOMER IS IN BILL TO
7012 OKC_API.set_message(
7013 p_app_name => G_APP_NAME,
7014 p_msg_name => G_BILL_CUST_INACTIVE -- Bill To Related Customer is not acitive.
7015 );
7016 x_return_status := OKC_API.G_RET_STS_ERROR;
7017 END IF;
7018 IF l_sto_flag = 2 THEN -- SHIP TO
7019 OKC_API.set_message(
7020 p_app_name => G_APP_NAME,
7021 p_msg_name => G_SHIP_CUST_INACTIVE -- Ship To Related Customer is not acitive.
7022 );
7023 x_return_status := OKC_API.G_RET_STS_ERROR;
7024 END IF;
7025 l_sto_flag := 0;
7026 l_bto_flag := 0;
7027 END IF;
7028 l_flag := 0;
7029
7030
7031 /*
7032 For get_cust_rec in get_contr_cust Loop
7033 l_cust_not_found := false;
7034 Open is_cust_hdr_active(get_cust_rec.party_id);
7035 Fetch is_cust_hdr_active into l_cust_acct_id, l_status, l_name;
7036 If is_cust_hdr_active%FOUND Then
7037 If l_status <> 'A' Then
7038 If get_cust_rec.rle_code = 'CUSTOMER' Then
7039 OKC_API.set_message(
7040 p_app_name => G_APP_NAME,
7041 p_msg_name => G_CUST_INACTIVE, -- Customer is not acitive.
7042 p_token1 => 'NAME',
7043 p_token1_value => l_name
7044 );
7045 x_return_status := OKC_API.G_RET_STS_ERROR;
7046 Elsif get_cust_rec.rle_code = 'THIRD_PARTY' Then
7047 OKC_API.set_message(
7048 p_app_name => G_APP_NAME,
7049 p_msg_name => G_THIRD_PARTY_INACTIVE, -- Third party is not active.
7050 p_token1 => 'NAME',
7051 p_token1_value => l_name
7052 );
7053 x_return_status := OKC_API.G_RET_STS_ERROR;
7054 Elsif get_cust_rec.rle_code = 'SUBSCRIBER' Then
7055 OKC_API.set_message(
7056 p_app_name => G_APP_NAME,
7057 p_msg_name => G_SUB_INACTIVE, -- Subscriber is not active.
7058 p_token1 => 'NAME',
7059 p_token1_value => l_name
7060 );
7061 x_return_status := OKC_API.G_RET_STS_ERROR;
7062 End If;
7063 End If;
7064 End If;
7065 Close is_cust_hdr_active;
7066 End Loop; */
7067
7068
7069 -- END BUG 4138244 --
7070
7071
7072 IF l_cust_not_found THEN
7073 OKC_API.set_message(
7074 p_app_name => G_APP_NAME,
7075 p_msg_name => G_CUST_MISSING
7076 );
7077 x_return_status := OKC_API.G_RET_STS_ERROR;
7078 END IF;
7079
7080 -- Checks bill to and ship to account on each top line
7081 FOR get_cust_rec IN get_cust_acct_lines(p_chr_id) LOOP
7082 l_cust_acct_id := get_cust_rec.cust_acct_id;
7083 OPEN is_cust_active(l_cust_acct_id);
7084 FETCH is_cust_active INTO l_status;
7085 IF is_cust_active%NOTFOUND THEN
7086 OKC_API.set_message(
7087 p_app_name => G_APP_NAME,
7088 p_msg_name => G_CUST_NOT_ACTIVE, --Bill to customer account is inactive on line number ....
7089 p_token1 => 'LINE',
7090 p_token1_value => get_cust_rec.line_number
7091 );
7092 x_return_status := OKC_API.G_RET_STS_ERROR;
7093 END IF;
7094 CLOSE is_cust_active;
7095 check_customer_avail_loop(l_return_status, l_cust_acct_id, p_chr_id, get_cust_rec.line_number, 'BTO');
7096 IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7097 x_return_status := l_return_status;
7098 END IF;
7099
7100 --- Check ship to cust account
7101 OPEN get_ship_to_acct(get_cust_rec.ship_to_site_use_id);
7102 FETCH get_ship_to_acct INTO l_ship_to_cust_acct_id;
7103 IF get_ship_to_acct%FOUND THEN
7104 OPEN is_cust_active(l_ship_to_cust_acct_id);
7105 FETCH is_cust_active INTO l_status;
7106 IF is_cust_active%NOTFOUND THEN
7107 OKC_API.set_message(
7108 p_app_name => G_APP_NAME,
7109 p_msg_name => G_SHIP_CUST_NOT_ACTIVE, --Ship to customer account is inactive on line number ....
7110 p_token1 => 'LINE',
7111 p_token1_value => get_cust_rec.line_number
7112 );
7113 x_return_status := OKC_API.G_RET_STS_ERROR;
7114 END IF;
7115 CLOSE is_cust_active;
7116 check_customer_avail_loop(l_return_status, l_ship_to_cust_acct_id, p_chr_id, get_cust_rec.line_number, 'STO');
7117 IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7118 x_return_status := l_return_status;
7119 END IF;
7120 END IF;
7121 CLOSE get_ship_to_acct;
7122
7123
7124 END LOOP;
7125
7126
7127 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
7128 OKC_API.set_message(
7129 p_app_name => G_APP_NAME,
7130 p_msg_name => 'OKS_QA_SUCCESS');
7131 END IF;
7132
7133 EXCEPTION
7134 WHEN G_EXCEPTION_HALT_VALIDATION THEN
7135 -- no processing necessary; validation can continue with next column
7136 NULL;
7137 WHEN OTHERS THEN
7138 -- store SQL error message on message stack
7139 OKC_API.SET_MESSAGE(
7140 p_app_name => G_APP_NAME,
7141 p_msg_name => G_UNEXPECTED_ERROR,
7142 p_token1 => G_SQLCODE_TOKEN,
7143 p_token1_value => SQLCODE,
7144 p_token2 => G_SQLERRM_TOKEN,
7145 p_token2_value => SQLERRM);
7146 -- notify caller of an error as UNEXPETED error
7147 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7148 IF get_ship_to_acct%ISOPEN THEN
7149 CLOSE get_ship_to_acct;
7150 END IF;
7151
7152 END check_customer_availability;
7153
7154 /*============================================================================+
7155 | Procedure: check_pm
7156 |
7157 | Purpose: This procedure will check PM schedule and PM programs
7158 | effectivity.
7159 |
7160 | In Parameters: p_chr_id the contract id
7161 | Out Parameters: x_return_status standard return status
7162 |
7163 +============================================================================*/
7164 PROCEDURE check_pm
7165 (
7166 x_return_status OUT NOCOPY VARCHAR2,
7167 p_chr_id IN NUMBER
7168 )
7169 IS
7170 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
7171
7172 BEGIN
7173 -- initialize return status
7174 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7175
7176 OKS_PM_PROGRAMS_PVT.check_pm_program_effectivity
7177 (x_return_status => l_return_status,
7178 p_chr_id => p_chr_id);
7179
7180
7181 IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7182 x_return_status := l_return_status;
7183 END IF;
7184
7185 OKS_PM_PROGRAMS_PVT.check_pm_schedule
7186 (x_return_status => l_return_status,
7187 p_chr_id => p_chr_id);
7188
7189 IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7190 x_return_status := l_return_status;
7191 END IF;
7192
7193 OKS_PM_PROGRAMS_PVT.check_pm_new_activities
7194 (x_return_status => l_return_status,
7195 p_chr_id => p_chr_id);
7196
7197 IF l_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
7198 x_return_status := l_return_status;
7199 END IF;
7200
7201 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
7202 OKC_API.set_message(
7203 p_app_name => G_APP_NAME,
7204 p_msg_name => 'OKS_QA_SUCCESS');
7205 END IF;
7206
7207 EXCEPTION
7208 WHEN G_EXCEPTION_HALT_VALIDATION THEN
7209 NULL;
7210 WHEN OTHERS THEN
7211 -- store SQL error message on message stack
7212 OKC_API.SET_MESSAGE(
7213 p_app_name => G_APP_NAME,
7214 p_msg_name => G_UNEXPECTED_ERROR,
7215 p_token1 => G_SQLCODE_TOKEN,
7216 p_token1_value => SQLCODE,
7217 p_token2 => G_SQLERRM_TOKEN,
7218 p_token2_value => SQLERRM);
7219 -- notify caller of an error as UNEXPETED error
7220 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7221 END check_pm;
7222
7223 /*============================================================================+
7224 | Procedure: Check_item_instance_valid
7225 |
7226 | Purpose: This QA check is only for contracts with ccovered
7227 | products that are covering a subscription item.
7228 | 1. It checks if the subscrition item belongs to another
7229 | contract and if so is the other contract active
7230 | or signed.
7231 |
7232 | In Parameters: p_chr_id the contract id
7233 | Out Parameters: x_return_status standard return status
7234 |
7235 +============================================================================*/
7236 PROCEDURE Check_item_instance_valid
7237 (
7238 x_return_status OUT NOCOPY VARCHAR2,
7239 p_chr_id IN NUMBER
7240 ) IS
7241 -- Get sublines with covered products
7242 CURSOR get_cp_lines IS
7243 SELECT id subline_id, start_date, end_date, line_number subline_number, cle_id
7244 FROM okc_k_lines_b
7245 WHERE dnz_chr_id = p_chr_id
7246 AND cle_id IS NOT NULL
7247 AND lse_id = 9
7248 AND date_cancelled IS NULL ; --Changes [llc]
7249
7250 -- Checks if the item it's covering is a subscritpion item and then it gets
7251 -- the item instance
7252 CURSOR get_item_inst(subline_id NUMBER) IS
7253 SELECT a.object1_id1
7254 FROM okc_k_items a, oks_subscr_header_b b
7255 WHERE a.cle_id = subline_id
7256 AND b.instance_id = a.object1_id1;
7257
7258
7259 -- is item instance valid
7260 CURSOR get_subscr(instId NUMBER) IS
7261 SELECT b.dnz_chr_id subscr_chr_id, b.cle_id subscr_line_id
7262 FROM okc_k_headers_all_b a, oks_subscr_header_b b
7263 WHERE b.instance_id = instId AND b.dnz_chr_id = a.id AND
7264 (a.id = p_chr_id OR (a.id <> p_chr_id AND a.sts_code IN ('ACTIVE', 'SIGNED')) );
7265
7266 -- See if the cp dates fall within the the subscription line start date, end date
7267 CURSOR check_effectivity(subscr_line_Id NUMBER, cpStartDate DATE, cpEndDate DATE) IS
7268 SELECT sts_code
7269 FROM okc_k_lines_b
7270 WHERE id = subscr_line_Id AND (cpStartDate BETWEEN start_date AND end_date)
7271 AND (cpEndDate BETWEEN start_date AND end_date) AND lse_id = 46 AND cle_id IS NULL ;
7272
7273 l_inst_id NUMBER;
7274 l_subscr_chr_id NUMBER;
7275 l_subscr_cle_id NUMBER;
7276 l_valid_status VARCHAR2(30);
7277 l_valid_dates VARCHAR2(30);
7278
7279 BEGIN
7280 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7281 -- Gets the sublines with covered products for p_chr_id
7282 FOR get_cp_rec IN get_cp_lines LOOP
7283 -- Gets the item instance
7284 OPEN get_item_inst(get_cp_rec.subline_id);
7285 FETCH get_item_inst INTO l_inst_id;
7286 IF get_item_inst%FOUND THEN
7287 OPEN get_subscr(l_inst_id);
7288 FETCH get_subscr INTO l_subscr_chr_id, l_subscr_cle_id;
7289 IF get_subscr%NOTFOUND THEN
7290 OKC_API.set_message(
7291 p_app_name => G_APP_NAME,
7292 p_msg_name => G_ITEM_INST_INVALID,
7293 p_token1 => 'LINE_NAME',
7294 p_token1_value => get_line_name(get_cp_rec.subline_id));
7295 x_return_status := OKC_API.G_RET_STS_ERROR;
7296 END IF;
7297 CLOSE get_subscr;
7298 END IF; -- get_item_inst%FOUND
7299 CLOSE get_item_inst;
7300 END LOOP;
7301
7302 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
7303 OKC_API.set_message(
7304 p_app_name => G_APP_NAME,
7305 p_msg_name => 'OKS_QA_SUCCESS');
7306 END IF;
7307
7308 EXCEPTION
7309 WHEN OTHERS THEN
7310 IF get_subscr%ISOPEN THEN
7311 CLOSE get_subscr;
7312 END IF;
7313 IF get_item_inst%ISOPEN THEN
7314 CLOSE get_item_inst;
7315 END IF;
7316 -- store SQL error message on message stack
7317 OKC_API.SET_MESSAGE(
7318 p_app_name => G_APP_NAME,
7319 p_msg_name => G_UNEXPECTED_ERROR,
7320 p_token1 => G_SQLCODE_TOKEN,
7321 p_token1_value => SQLCODE,
7322 p_token2 => G_SQLERRM_TOKEN,
7323 p_token2_value => SQLERRM);
7324 -- notify caller of an error as UNEXPETED error
7325 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7326
7327 END Check_item_instance_valid;
7328
7329 /*============================================================================+
7330 | Procedure: check_subscr_element_exist
7331 |
7332 | Purpose: Please note that tangible items have a delivery
7333 | schedule therefore:
7334 | If the subscription line has a tangible item then it
7335 | should have at least one subscription
7336 | element(delivery schedule).
7337 |
7338 | In Parameters: p_chr_id the contract id
7339 | Out Parameters: x_return_status standard return status
7340 |
7341 +============================================================================*/
7342 PROCEDURE check_subscr_element_exist(p_chr_id IN NUMBER,
7343 x_return_status OUT NOCOPY VARCHAR2) IS
7344
7345 CURSOR get_subscr_line IS
7346 SELECT id ,date_terminated -- Added "date_terminated" for Bug 5702660
7347 FROM okc_k_lines_b
7348 WHERE dnz_chr_id = p_chr_id
7349 AND lse_id = 46
7350 AND date_cancelled IS NULL --Changes [llc]
7351 ;
7352
7353 CURSOR is_tangible_item(cleId NUMBER) IS
7354 SELECT a.id
7355 FROM oks_subscr_header_b a
7356 WHERE a.cle_id = cleId AND a.dnz_chr_id = p_chr_id
7357 AND a.fulfillment_channel = 'OM';
7358
7359 CURSOR get_subscr_element(oshId NUMBER, cleId NUMBER) IS
7360 SELECT b.id
7361 FROM oks_subscr_elements b
7362 WHERE b.dnz_cle_id = cleId AND b.dnz_chr_id = p_chr_id
7363 AND b.osh_id = oshId;
7364
7365 l_sh_id NUMBER;
7366 l_subscr_ele_id NUMBER;
7367
7368 BEGIN
7369 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7370 FOR subscr_line_rec IN get_subscr_line LOOP
7371 OPEN is_tangible_item(subscr_line_rec.id);
7372 FETCH is_tangible_item INTO l_sh_id;
7373 IF is_tangible_item%FOUND THEN
7374 OPEN get_subscr_element(l_sh_id, subscr_line_rec.id);
7375 FETCH get_subscr_element INTO l_subscr_ele_id;
7376 --Bug 5702660. Added condition "subscr_line_rec.date_terminated is NULL"
7377 IF get_subscr_element%NOTFOUND and subscr_line_rec.date_terminated is NULL
7378 THEN
7379 OKC_API.set_message(
7380 p_app_name => G_APP_NAME,
7381 p_msg_name => G_SUBSCR_ELEM_MISS,
7382 p_token1 => 'LINE_NAME',
7383 p_token1_value => get_line_name(subscr_line_rec.id));
7384 x_return_status := OKC_API.G_RET_STS_ERROR;
7385 END IF;
7386 CLOSE get_subscr_element;
7387 END IF;
7388 CLOSE is_tangible_item;
7389 END LOOP;
7390
7391 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
7392 OKC_API.set_message(
7393 p_app_name => G_APP_NAME,
7394 p_msg_name => 'OKS_QA_SUCCESS');
7395 END IF;
7396
7397 EXCEPTION
7398 WHEN OTHERS THEN
7399 IF get_subscr_element%ISOPEN THEN
7400 CLOSE get_subscr_element;
7401 END IF;
7402 IF is_tangible_item%ISOPEN THEN
7403 CLOSE is_tangible_item;
7404 END IF;
7405 -- store SQL error message on message stack
7406 OKC_API.SET_MESSAGE(
7407 p_app_name => G_APP_NAME,
7408 p_msg_name => G_UNEXPECTED_ERROR,
7409 p_token1 => G_SQLCODE_TOKEN,
7410 p_token1_value => SQLCODE,
7411 p_token2 => G_SQLERRM_TOKEN,
7412 p_token2_value => SQLERRM);
7413 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7414
7415
7416 END check_subscr_element_exist;
7417
7418 /*============================================================================+
7419 | Procedure: check_subscr_is_shipable
7420 |
7421 | Purpose: If subscription item is shipable then ship to rule and
7422 | ship to address is required for that subscription line.
7423 |
7424 | In Parameters: p_chr_id the contract id
7425 | Out Parameters: x_return_status standard return status
7426 |
7427 +============================================================================*/
7428 PROCEDURE check_subscr_is_shipable(p_chr_id IN NUMBER,
7429 x_return_status OUT NOCOPY VARCHAR2) IS
7430
7431 CURSOR get_subscr_lines IS
7432 SELECT id
7433 FROM okc_k_lines_b
7434 WHERE dnz_chr_id = p_chr_id
7435 AND lse_id = 46
7436 AND date_cancelled IS NULL --Changes [llc]
7437 ;
7438
7439
7440 CURSOR get_shipable_flag(cleId NUMBER) IS
7441 SELECT SHIPPABLE_ITEM_FLAG
7442 FROM mtl_system_items a, okc_k_items b
7443 WHERE b.cle_id = cleId AND a.SHIPPABLE_ITEM_FLAG = 'Y'
7444 AND a.INVENTORY_ITEM_ID = b.object1_id1
7445 AND a.ORGANIZATION_ID = b.object1_id2;
7446
7447
7448 -- Get the ship to rule for the shipable subscription line.
7449 -- OBJECT1_ID1 of STO for lines only
7450 CURSOR get_ship_to_rule(cleId NUMBER) IS
7451 SELECT SHIP_TO_SITE_USE_ID
7452 FROM OKC_K_LINES_B
7453 WHERE id = cleId;
7454
7455
7456 -- Get the ship to address for shipable subscription line.
7457 -- have to use the okx view
7458 CURSOR ship_to_address(p_id IN VARCHAR2, Code VARCHAR2) IS
7459 SELECT a.location_id
7460 FROM Okx_cust_site_uses_v a
7461 WHERE a.id1 = p_id
7462 AND a.site_use_code = Code;
7463
7464 l_shipable VARCHAR2(1);
7465 l_ship_to_id NUMBER;
7466 l_location_id NUMBER;
7467
7468 BEGIN
7469 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7470 -- Loops through each subscription line and checks if it's items are shipable.
7471 FOR subscr_line_rec IN get_subscr_lines LOOP
7472 OPEN get_shipable_flag(subscr_line_rec.id);
7473 FETCH get_shipable_flag INTO l_shipable;
7474 IF get_shipable_flag%FOUND THEN
7475 -- since the subscription item is shipable it has to have a ship to rule.
7476 OPEN get_ship_to_rule(subscr_line_rec.id);
7477 FETCH get_ship_to_rule INTO l_ship_to_id;
7478 IF get_ship_to_rule%NOTFOUND THEN
7479 OKC_API.set_message(
7480 p_app_name => G_APP_NAME,
7481 p_msg_name => G_SHIP_RULE_MISS,
7482 p_token1 => 'LINE_NAME',
7483 p_token1_value => get_line_name(subscr_line_rec.id));
7484 x_return_status := OKC_API.G_RET_STS_ERROR;
7485 ELSE
7486 OPEN ship_to_address(l_ship_to_id, 'SHIP_TO');
7487 FETCH ship_to_address INTO l_location_id;
7488 IF ship_to_address%NOTFOUND THEN
7489 OKC_API.set_message(
7490 p_app_name => G_APP_NAME,
7491 p_msg_name => G_SHIP_ADDR_MISS,
7492 p_token1 => 'LINE_NAME',
7493 p_token1_value => get_line_name(subscr_line_rec.id));
7494 x_return_status := OKC_API.G_RET_STS_ERROR;
7495 END IF;
7496 CLOSE ship_to_address;
7497 END IF; -- get_ship_to_rule%NOTFOUND
7498 CLOSE get_ship_to_rule;
7499 END IF; -- get_shipable_flag%FOUND
7500 CLOSE get_shipable_flag;
7501 END LOOP;
7502
7503 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
7504 OKC_API.set_message(
7505 p_app_name => G_APP_NAME,
7506 p_msg_name => 'OKS_QA_SUCCESS');
7507 END IF;
7508
7509 EXCEPTION
7510 WHEN OTHERS THEN
7511 IF get_shipable_flag%ISOPEN THEN
7512 CLOSE get_shipable_flag;
7513 END IF;
7514 IF get_ship_to_rule%ISOPEN THEN
7515 CLOSE get_ship_to_rule;
7516 END IF;
7517 IF ship_to_address%ISOPEN THEN
7518 CLOSE ship_to_address;
7519 END IF;
7520
7521 -- store SQL error message on message stack
7522 OKC_API.SET_MESSAGE(
7523 p_app_name => G_APP_NAME,
7524 p_msg_name => G_UNEXPECTED_ERROR,
7525 p_token1 => G_SQLCODE_TOKEN,
7526 p_token1_value => SQLCODE,
7527 p_token2 => G_SQLERRM_TOKEN,
7528 p_token2_value => SQLERRM);
7529 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7530
7531 END check_subscr_is_shipable;
7532
7533 /*============================================================================+
7534 | Procedure: check_covered_product
7535 |
7536 | Purpose: Will check the covered product quantity against
7537 | Installedbase.
7538 |
7539 | In Parameters: p_chr_id the contract id
7540 | Out Parameters: x_return_status standard return status
7541 |
7542 +============================================================================*/
7543 PROCEDURE check_covered_product(p_chr_id IN NUMBER,
7544 x_return_status OUT NOCOPY VARCHAR2) IS
7545
7546 CURSOR Get_Covered_Prod(l_chr_id NUMBER) IS
7547 SELECT id
7548 FROM okc_k_lines_b
7549 WHERE lse_id IN (9, 25)
7550 AND dnz_chr_id = l_chr_id
7551 AND date_cancelled IS NULL --Changes [llc]
7552 ;
7553
7554 CURSOR Get_Item_Inst(l_cp_line_id NUMBER) IS
7555 SELECT object1_id1, number_of_items, uom_code
7556 FROM okc_k_items
7557 WHERE cle_id = l_cp_line_id;
7558
7559 l_item_inst Get_Item_Inst%ROWTYPE;
7560
7561 CURSOR is_subscr_item(l_inst_id NUMBER) IS
7562 SELECT b.instance_id
7563 FROM oks_subscr_header_b b
7564 WHERE b.instance_id = l_inst_id;
7565
7566 l_subscr_inst_id is_subscr_item%ROWTYPE;
7567
7568
7569 CURSOR Exact_Item_Inst(l_instance_id NUMBER) IS
7570 SELECT instance_id, quantity, unit_of_measure
7571 FROM csi_item_instances
7572 WHERE instance_id = l_instance_id;
7573
7574 l_exact_item_inst Exact_Item_Inst%ROWTYPE;
7575
7576
7577 BEGIN
7578 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7579 -- This will loop through all the covered product.
7580 -- A contract can have several covered products
7581 FOR get_cp_rec IN Get_Covered_Prod(p_chr_id) LOOP
7582 -- Will get the item_instace
7583 OPEN Get_Item_Inst(get_cp_rec.id);
7584 FETCH Get_Item_Inst INTO l_item_inst;
7585 CLOSE Get_Item_Inst;
7586
7587 -- We won't do any checks if it's a subscription item.
7588 OPEN is_subscr_item(l_item_inst.object1_id1);
7589 FETCH is_subscr_item INTO l_subscr_inst_id;
7590 IF is_subscr_item%NOTFOUND THEN
7591 -- Will try to find the item instance in installedbase
7592 OPEN Exact_Item_Inst(l_item_inst.object1_id1);
7593 FETCH Exact_Item_Inst INTO l_exact_item_inst;
7594 IF Exact_Item_Inst%NOTFOUND THEN
7595 -- G_ITEM_INST_MISS = Item instance ITEM_INST for line LINE_NAME is not found in installedbase.
7596 OKC_API.set_message(
7597 p_app_name => G_APP_NAME,
7598 p_msg_name => G_ITEM_INST_MISS,
7599 p_token1 => 'ITEM_INST',
7600 p_token1_value => l_item_inst.object1_id1,
7601 p_token2 => 'LINE_NAME',
7602 p_token2_value => get_line_name(get_cp_rec.id));
7603 x_return_status := OKC_API.G_RET_STS_ERROR;
7604 ELSE
7605 IF l_exact_item_inst.quantity <> l_item_inst.number_of_items
7606 AND l_exact_item_inst.unit_of_measure <> l_item_inst.uom_code THEN
7607 OKC_API.set_message(
7608 p_app_name => G_APP_NAME,
7609 p_msg_name => G_QUANT_UOM_INVALID,
7610 p_token1 => 'LINE_NAME',
7611 p_token1_value => get_line_name(get_cp_rec.id),
7612 p_token2 => 'QUANTITY',
7613 p_token2_value => l_exact_item_inst.quantity,
7614 p_token3 => 'UOM',
7615 p_token3_value => l_exact_item_inst.unit_of_measure);
7616
7617 x_return_status := OKC_API.G_RET_STS_ERROR;
7618 ELSIF l_exact_item_inst.quantity <> l_item_inst.number_of_items THEN
7619 OKC_API.set_message(
7620 p_app_name => G_APP_NAME,
7621 p_msg_name => G_QUANT_INVALID,
7622 p_token1 => 'LINE_NAME',
7623 p_token1_value => get_line_name(get_cp_rec.id),
7624 p_token2 => 'QUANTITY',
7625 p_token2_value => l_exact_item_inst.quantity);
7626
7627 x_return_status := OKC_API.G_RET_STS_ERROR;
7628 ELSIF l_exact_item_inst.unit_of_measure <> l_item_inst.uom_code THEN
7629 -- G_UOM_INVALID: Covered product unit of measure on line LINE_NAME does not match the value UOM stored in installedbase.
7630 OKC_API.set_message(
7631 p_app_name => G_APP_NAME,
7632 p_msg_name => G_UOM_INVALID,
7633 p_token1 => 'LINE_NAME',
7634 p_token1_value => get_line_name(get_cp_rec.id),
7635 p_token2 => 'UOM',
7636 p_token2_value => l_exact_item_inst.unit_of_measure);
7637
7638 x_return_status := OKC_API.G_RET_STS_ERROR;
7639 END IF;
7640 END IF;
7641 CLOSE Exact_Item_Inst;
7642 END IF;
7643 CLOSE is_subscr_item;
7644
7645 END LOOP;
7646
7647 IF x_return_status = OKC_API.G_RET_STS_SUCCESS
7648 THEN
7649 OKC_API.set_message(
7650 p_app_name => G_APP_NAME,
7651 p_msg_name => 'OKS_QA_SUCCESS');
7652 END IF;
7653
7654 EXCEPTION
7655 WHEN OTHERS THEN
7656 -- store SQL error message on message stack
7657 OKC_API.SET_MESSAGE(
7658 p_app_name => G_APP_NAME,
7659 p_msg_name => G_UNEXPECTED_ERROR,
7660 p_token1 => G_SQLCODE_TOKEN,
7661 p_token1_value => SQLCODE,
7662 p_token2 => G_SQLERRM_TOKEN,
7663 p_token2_value => SQLERRM);
7664 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7665
7666 IF Exact_Item_Inst%ISOPEN THEN
7667 CLOSE Exact_Item_Inst;
7668 END IF;
7669 IF is_subscr_item%ISOPEN THEN
7670 CLOSE is_subscr_item;
7671 END IF;
7672
7673 END check_covered_product;
7674
7675 /*============================================================================+
7676 | Procedure: check_required_PM
7677 |
7678 | Purpose: Check Required Values for Preventive Maintenance
7679 |
7680 | In Parameters: p_chr_id the contract id
7681 | Out Parameters: x_return_status standard return status
7682 |
7683 +============================================================================*/
7684 PROCEDURE check_required_PM(p_chr_id IN NUMBER,
7685 x_return_status OUT NOCOPY VARCHAR2)
7686 IS
7687 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
7688 BEGIN
7689 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7690 OKS_PM_PROGRAMS_PVT.CHECK_PM_REQUIRED_VALUES(x_return_status => l_return_status,
7691 p_chr_id => p_chr_id);
7692
7693 x_return_status := l_return_status;
7694
7695
7696 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
7697 OKC_API.set_message(
7698 p_app_name => G_APP_NAME,
7699 p_msg_name => 'OKS_QA_SUCCESS');
7700 END IF;
7701
7702 EXCEPTION
7703 WHEN OTHERS THEN
7704 -- store SQL error message on message stack
7705 OKC_API.SET_MESSAGE(
7706 p_app_name => G_APP_NAME,
7707 p_msg_name => G_UNEXPECTED_ERROR,
7708 p_token1 => G_SQLCODE_TOKEN,
7709 p_token1_value => SQLCODE,
7710 p_token2 => G_SQLERRM_TOKEN,
7711 p_token2_value => SQLERRM);
7712
7713 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7714
7715 END check_required_PM;
7716
7717 /*============================================================================+
7718 | Procedure: check_price_lock
7719 |
7720 | Purpose: Checks if price lock has been carried over from
7721 | original contract
7722 |
7723 | In Parameters: p_chr_id the contract id
7724 | Out Parameters: x_return_status standard return status
7725 |
7726 +============================================================================*/
7727 PROCEDURE check_pirce_lock(p_chr_id IN NUMBER,
7728 x_return_status OUT NOCOPY VARCHAR2)
7729 IS
7730
7731 CURSOR get_old_chr_id(l_chr_id NUMBER) IS
7732 SELECT orig_system_id1
7733 FROM okc_k_headers_all_b
7734 WHERE id = l_chr_id
7735 AND datetime_cancelled IS NULL; --Changes [llc]
7736
7737 -- Gets old line id's that have a lock
7738 CURSOR get_old_line_id(l_old_chr_id NUMBER) IS
7739 SELECT b.cle_id
7740 FROM okc_k_lines_b a, oks_k_lines_b b
7741 WHERE a.id = b.cle_id
7742 AND b.dnz_chr_id = l_old_chr_id
7743 AND b.dnz_chr_id = a.dnz_chr_id
7744 AND a.lse_id IN (12, 13)
7745 AND b.LOCKED_PRICE_LIST_ID IS NOT NULL
7746 AND b.LOCKED_PRICE_LIST_LINE_ID IS NOT NULL
7747 AND a.date_cancelled IS NULL --Changes [llc]
7748 ;
7749 --and b.prorate is not null; -- prorate is not mandatory
7750
7751 CURSOR get_new_line_id(l_chr_id NUMBER, l_old_line_id NUMBER) IS
7752 SELECT id
7753 FROM okc_k_lines_b
7754 WHERE dnz_chr_id = l_chr_id
7755 AND lse_id IN (12, 13)
7756 AND orig_system_id1 = l_old_line_id;
7757
7758 CURSOR check_lock(l_chr_id NUMBER, l_cle_id NUMBER) IS
7759 SELECT cle_id
7760 FROM oks_k_lines_b
7761 WHERE dnz_chr_id = l_chr_id
7762 AND cle_id = l_cle_id
7763 AND LOCKED_PRICE_LIST_ID IS NOT NULL
7764 AND LOCKED_PRICE_LIST_LINE_ID IS NOT NULL;
7765 --and prorate is not null; -- prorate is not mandatory
7766
7767 l_old_chr_id NUMBER;
7768 l_id NUMBER;
7769 l_return_status VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
7770
7771 BEGIN
7772 l_return_status := OKC_API.G_RET_STS_SUCCESS;
7773
7774 OPEN get_old_chr_id(p_chr_id);
7775 FETCH get_old_chr_id INTO l_old_chr_id;
7776 CLOSE get_old_chr_id;
7777
7778 FOR get_old_id_rec IN get_old_line_id(l_old_chr_id)
7779 LOOP
7780 FOR get_new_id_rec IN get_new_line_id(p_chr_id, get_old_id_rec.cle_id)
7781 LOOP
7782 OPEN check_lock(p_chr_id, get_new_id_rec.id);
7783 FETCH check_lock INTO l_id;
7784 IF check_lock%NOTFOUND THEN
7785 OKC_API.set_message(
7786 p_app_name => G_APP_NAME,
7787 p_msg_name => G_MISS_PRICE_LOCK,
7788 p_token1 => 'NEW_LINE',
7789 p_token1_value => get_line_number(get_new_id_rec.id),
7790 p_token2 => 'CONTRACT_NAME',
7791 p_token2_value => get_contract_name(l_old_chr_id),
7792 p_token3 => 'OLD_LINE',
7793 p_token3_value => get_line_number(get_old_id_rec.cle_id)
7794 );
7795 l_return_status := OKC_API.G_RET_STS_ERROR;
7796 END IF;
7797 CLOSE check_lock;
7798 END LOOP;
7799
7800 END LOOP;
7801 x_return_status := l_return_status;
7802
7803 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
7804 OKC_API.set_message(
7805 p_app_name => G_APP_NAME,
7806 p_msg_name => 'OKS_QA_SUCCESS');
7807 END IF;
7808
7809 EXCEPTION
7810 WHEN OTHERS THEN
7811 -- store SQL error message on message stack
7812 OKC_API.SET_MESSAGE(
7813 p_app_name => G_APP_NAME,
7814 p_msg_name => G_UNEXPECTED_ERROR,
7815 p_token1 => G_SQLCODE_TOKEN,
7816 p_token1_value => SQLCODE,
7817 p_token2 => G_SQLERRM_TOKEN,
7818 p_token2_value => SQLERRM);
7819
7820 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7821
7822
7823 END check_pirce_lock;
7824
7825
7826 --[llc]
7827
7828 /*============================================================================+
7829 | Procedure: Check_Ren_Source_Lines
7830 |
7831 | Purpose: Checks if source lines has lines with renewal
7832 | relationships to lines on original transferred contract
7833 | that are not in a status of Active, Signed, Hold or Expired
7834 |
7835 | In Parameters: p_chr_id the contract id
7836 | Out Parameters: x_return_status standard return status
7837 |
7838 +============================================================================*/
7839
7840 PROCEDURE Check_Ren_Source_Lines (p_chr_id IN NUMBER,
7841 x_return_status OUT NOCOPY VARCHAR2)
7842
7843 IS
7844
7845 l_dummy_data NUMBER;
7846 l_dummy_msg VARCHAR2(200);
7847
7848 CURSOR cur_renewal_source_lines (p_chr_id NUMBER) IS
7849 SELECT 1
7850 FROM okc_operation_lines a, okc_operation_instances b, okc_class_operations c, okc_k_headers_all_b d, okc_statuses_b e
7851 WHERE a.subject_chr_id = p_chr_id
7852 AND c.id = b.cop_id
7853 AND c.opn_code IN('RENEWAL', 'REN_CON')
7854 AND a.oie_id = b.id
7855 AND a.active_yn = 'Y'
7856 AND a.object_chr_id = d.id
7857 AND e.code = d.sts_code
7858 AND e.ste_code NOT IN ('ACTIVE', 'SIGNED', 'HOLD', 'EXPIRED');
7859
7860
7861 BEGIN
7862
7863 x_return_status := OKC_API.G_RET_STS_SUCCESS;
7864
7865 OPEN cur_renewal_source_lines (p_chr_id);
7866 FETCH cur_renewal_source_lines INTO l_dummy_data;
7867
7868 IF cur_renewal_source_lines%FOUND THEN
7869
7870 OKC_API.set_message(
7871 p_app_name => G_APP_NAME,
7872 p_msg_name => 'OKS_CHECK_REN_SOURCE_LINES'
7873 );
7874 -- notify caller of an error
7875 x_return_status := OKC_API.G_RET_STS_ERROR;
7876
7877 END IF;
7878
7879 CLOSE cur_renewal_source_lines;
7880
7881 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
7882 OKC_API.set_message(
7883 p_app_name => G_APP_NAME,
7884 p_msg_name => 'OKS_QA_SUCCESS');
7885 END IF;
7886
7887 EXCEPTION
7888 WHEN OTHERS THEN
7889 -- store SQL error message on message stack
7890 OKC_API.SET_MESSAGE(
7891 p_app_name => G_APP_NAME,
7892 p_msg_name => G_UNEXPECTED_ERROR,
7893 p_token1 => G_SQLCODE_TOKEN,
7894 p_token1_value => SQLCODE,
7895 p_token2 => G_SQLERRM_TOKEN,
7896 p_token2_value => SQLERRM);
7897
7898 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7899
7900 END Check_Ren_Source_Lines;
7901
7902
7903 --[llc]
7904
7905
7906 /*============================================================================+
7907 | Procedure: Check_Ren_Target_Lines
7908 |
7909 | Purpose: Check to see if cancelled lines have a renewal
7910 | relationship to lines on a target contract
7911 |
7912 | In Parameters: p_chr_id the contract id
7913 | Out Parameters: x_return_status standard return status
7914 |
7915 +============================================================================*/
7916
7917 PROCEDURE Check_Ren_Target_Lines (p_chr_id IN NUMBER,
7918 x_return_status OUT NOCOPY VARCHAR2)
7919
7920 IS
7921
7922 l_dummy_data NUMBER;
7923 l_target_contract_id NUMBER;
7924 l_subject_cle_id NUMBER;
7925 l_target_line_number NUMBER;
7926 l_target_contract_number VARCHAR2(120);
7927 l_line_number NUMBER;
7928 l_subline_number VARCHAR2(100);
7929 l_target_subline_number VARCHAR2(100);
7930
7931
7932 CURSOR cur_is_K_renewed IS
7933 SELECT d.id target_contract_id
7934 FROM okc_operation_lines a, okc_operation_instances b, okc_class_operations c, okc_k_headers_all_b d, okc_statuses_b e
7935 WHERE a.object_chr_id = p_chr_id
7936 AND c.id = b.cop_id
7937 AND c.opn_code IN('RENEWAL', 'REN_CON')
7938 AND a.oie_id = b.id
7939 AND a.active_yn = 'Y'
7940 AND a.subject_chr_id = d.id
7941 AND e.code = d.sts_code
7942 AND e.ste_code NOT IN ('ACTIVE', 'SIGNED', 'HOLD', 'EXPIRED');
7943
7944 CURSOR cur_lines_status IS
7945 SELECT b.id, b.line_number, s.ste_code
7946 FROM okc_k_lines_b b, okc_statuses_b s
7947 WHERE dnz_chr_id = p_chr_id
7948 AND cle_id IS NULL
7949 AND s.code = b.sts_code;
7950
7951
7952 CURSOR cur_sublines_status(p_cle_id NUMBER) IS
7953 SELECT b.id, b.line_number, s.ste_code
7954 FROM okc_k_lines_b b, okc_statuses_b s
7955 WHERE cle_id = p_cle_id
7956 AND s.code = b.sts_code
7957 AND s.ste_code = 'CANCELLED';
7958
7959
7960 CURSOR cur_is_subline_renewed (p_cle_id NUMBER) IS
7961 SELECT subject_cle_id
7962 FROM okc_operation_lines
7963 WHERE object_cle_id = p_cle_id;
7964
7965
7966 CURSOR cur_is_topline_renewed (p_cle_id NUMBER) IS
7967 SELECT subject_cle_id
7968 FROM okc_operation_lines a, okc_operation_instances b, okc_class_operations c, okc_k_lines_b d
7969 WHERE a.object_cle_id = d.id
7970 AND a.object_chr_id = d.dnz_chr_id
7971 AND d.cle_id = p_cle_id -- should be a top line id
7972 AND a.object_chr_id = p_chr_id
7973 AND c.id = b.cop_id
7974 AND c.opn_code IN('RENEWAL', 'REN_CON')
7975 AND a.oie_id = b.id
7976 AND a.active_yn = 'Y';
7977
7978
7979 CURSOR cur_target_contract_number (p_contract_id NUMBER) IS
7980 SELECT contract_number
7981 FROM okc_k_headers_all_b
7982 WHERE id = p_contract_id;
7983
7984 CURSOR cur_target_line_number (p_cle_id NUMBER) IS
7985 SELECT line_number
7986 FROM okc_k_lines_b
7987 WHERE id = p_cle_id;
7988
7989 CURSOR cur_target_subline_number (p_cle_id NUMBER) IS
7990 SELECT lines2.line_number || '.' || lines1.line_number
7991 FROM okc_k_lines_b lines1, okc_k_lines_b lines2
7992 WHERE lines1.id = p_cle_id
7993 AND lines1.cle_id = lines2.id;
7994
7995
7996
7997 BEGIN
7998
7999 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8000
8001 OPEN cur_is_K_renewed;
8002 FETCH cur_is_K_renewed INTO l_target_contract_id;
8003
8004 IF cur_is_K_renewed %FOUND THEN
8005 OPEN cur_target_contract_number (l_target_contract_id);
8006 FETCH cur_target_contract_number INTO l_target_contract_number;
8007 CLOSE cur_target_contract_number;
8008
8009 FOR k_cur_lines_status_rec IN cur_lines_status
8010 LOOP
8011
8012 IF k_cur_lines_status_rec.ste_code = 'CANCELLED' THEN
8013
8014 OPEN cur_is_topline_renewed(k_cur_lines_status_rec.id);
8015 FETCH cur_is_topline_renewed INTO l_subject_cle_id;
8016
8017 IF cur_is_topline_renewed%FOUND THEN
8018
8019 OPEN cur_target_line_number(l_subject_cle_id);
8020 FETCH cur_target_line_number INTO l_target_line_number;
8021 CLOSE cur_target_line_number;
8022
8023 OKC_API.SET_MESSAGE
8024 (
8025 p_app_name => G_APP_NAME,
8026 p_msg_name => 'OKS_CHECK_REN_TARGET_LINES',
8027 p_token1 => 'CURRENT_LINE_NUM',
8028 p_token1_value => k_cur_lines_status_rec.line_number,
8029 p_token2 => 'TARGET_LINE_NUM',
8030 p_token2_value => l_target_line_number,
8031 p_token3 => 'TARGET_CONTRACT_NUM',
8032 p_token3_value => l_target_contract_number
8033 );
8034
8035 x_return_status := OKC_API.G_RET_STS_ERROR;
8036
8037 END IF; --cur_is_topline_renewed%FOUND
8038 CLOSE cur_is_topline_renewed;
8039
8040 ELSE
8041
8042 OPEN cur_sublines_status(k_cur_lines_status_rec.id);
8043
8044 IF cur_sublines_status%NOTFOUND THEN
8045 CLOSE cur_sublines_status;
8046 ELSE
8047 CLOSE cur_sublines_status;
8048
8049 FOR k_cur_sublines_status_rec IN cur_sublines_status(k_cur_lines_status_rec.id)
8050 LOOP
8051
8052 OPEN cur_is_subline_renewed(k_cur_sublines_status_rec.id);
8053 FETCH cur_is_subline_renewed INTO l_subject_cle_id;
8054
8055 IF cur_is_subline_renewed%FOUND THEN
8056 l_subline_number := k_cur_lines_status_rec.line_number || '.' || k_cur_sublines_status_rec.line_number;
8057
8058 OPEN cur_target_line_number(l_subject_cle_id);
8059 FETCH cur_target_line_number INTO l_target_line_number;
8060 CLOSE cur_target_line_number;
8061
8062 OPEN cur_target_subline_number(l_subject_cle_id);
8063 FETCH cur_target_subline_number INTO l_target_subline_number;
8064 CLOSE cur_target_subline_number;
8065
8066
8067 OKC_API.SET_MESSAGE
8068 (
8069 p_app_name => G_APP_NAME,
8070 p_msg_name => 'OKS_CHECK_REN_TARGET_LINES',
8071 p_token1 => 'CURRENT_LINE_NUM',
8072 p_token1_value => l_subline_number,
8073 p_token2 => 'TARGET_LINE_NUM',
8074 p_token2_value => l_target_subline_number,
8075 p_token3 => 'TARGET_CONTRACT_NUM',
8076 p_token3_value => l_target_contract_number
8077 );
8078
8079 x_return_status := OKC_API.G_RET_STS_ERROR;
8080
8081 END IF;
8082 CLOSE cur_is_subline_renewed;
8083
8084 END LOOP;
8085
8086 END IF; -- cur_sublines_status%NOTFOUND
8087
8088 END IF; --k_cur_lines_status_rec.ste_code='CANCELLED'
8089
8090 END LOOP;
8091
8092 END IF; --cur_is_K_renewed %FOUND
8093 CLOSE cur_is_K_renewed;
8094
8095 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
8096 OKC_API.set_message(
8097 p_app_name => G_APP_NAME,
8098 p_msg_name => 'OKS_QA_SUCCESS');
8099
8100 END IF;
8101
8102 EXCEPTION
8103 WHEN OTHERS THEN
8104 -- store SQL error message on message stack
8105 OKC_API.SET_MESSAGE(
8106 p_app_name => G_APP_NAME,
8107 p_msg_name => G_UNEXPECTED_ERROR,
8108 p_token1 => G_SQLCODE_TOKEN,
8109 p_token1_value => SQLCODE,
8110 p_token2 => G_SQLERRM_TOKEN,
8111 p_token2_value => SQLERRM);
8112
8113 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
8114
8115 END Check_Ren_Target_Lines;
8116
8117
8118 /*============================================================================+
8119 | Procedure: check_reprice_request
8120 |
8121 | Purpose: Check to see if there is any active request runnning in the background for Reprice
8122 |
8123 | In Parameters: p_chr_id the contract id
8124 | Out Parameters: x_return_status standard return status
8125 |
8126 +============================================================================*/
8127
8128 PROCEDURE check_reprice_request(
8129 p_chr_id IN NUMBER ,
8130 x_return_status OUT NOCOPY VARCHAR2
8131 ) IS
8132
8133 /*
8134 This will check whether there is any active reprice request running in the background.
8135 If reprice is running ,it will issue a Error message
8136 */
8137
8138
8139 Program_ID NUMBER;
8140 Prog_Appl_ID NUMBER;
8141 req_id NUMBER;
8142
8143 CURSOR c_reprice_req(l_chr_id IN NUMBER,l_prog_appl_id IN NUMBER,l_prg_id IN NUMBER) IS
8144 SELECT max(request_id)
8145 FROM fnd_concurrent_requests
8146 WHERE program_application_id = l_prog_appl_id
8147 AND concurrent_program_id = l_prg_id
8148 AND argument2=to_char(l_chr_id)
8149 AND phase_code IN ('P','R');
8150
8151
8152 BEGIN
8153
8154 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8155
8156
8157 SELECT concurrent_program_id, p.application_id
8158 INTO program_id, prog_appl_id
8159 FROM fnd_concurrent_programs P,
8160 fnd_application A
8161 WHERE concurrent_program_name = 'OKSREPCON'
8162 AND P.application_id = A.Application_ID
8163 AND A.application_short_name = 'OKS';
8164
8165 --Check if any request of the concurrent program 'OKSREPCON' is in Pending or Running Phase for the given contract header id
8166 OPEN c_reprice_req(p_chr_id,prog_appl_id,program_id);
8167 FETCH c_reprice_req INTO req_id;
8168 CLOSE c_reprice_req;
8169
8170 IF req_id is not null THEN
8171
8172 OKC_API.set_message(
8173 p_app_name => G_APP_NAME,
8174 p_msg_name => 'OKS_HEADER_REPRICE_CHECK_FAIL',
8175 p_token1 => 'REQUEST_ID',
8176 p_token1_value => req_id
8177 );
8178
8179 x_return_status := OKC_API.G_RET_STS_ERROR;
8180
8181 ELSE
8182
8183 OKC_API.set_message(
8184 p_app_name => G_APP_NAME,
8185 p_msg_name => 'OKS_QA_SUCCESS');
8186
8187 END IF;
8188
8189
8190 EXCEPTION
8191 WHEN OTHERS THEN
8192
8193 -- store SQL error message on message stack
8194 OKC_API.SET_MESSAGE(
8195 p_app_name => G_APP_NAME,
8196 p_msg_name => G_UNEXPECTED_ERROR,
8197 p_token1 => G_SQLCODE_TOKEN,
8198 p_token1_value => SQLCODE,
8199 p_token2 => G_SQLERRM_TOKEN,
8200 p_token2_value => SQLERRM);
8201
8202 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
8203
8204
8205 END CHECK_REPRICE_REQUEST;
8206
8207 /*============================================================================
8208 +
8209 | Procedure: check_qty
8210 |
8211 | Purpose: Checks for the covered level quantity.
8212 |
8213 | In Parameters: p_chr_id the contract id
8214 | Out Parameters: x_return_status standard return status
8215 |
8216
8217 +============================================================================*/
8218 PROCEDURE check_qty(p_chr_id IN NUMBER,
8219 x_return_status OUT NOCOPY VARCHAR2)
8220 IS
8221
8222 CURSOR check_covd_qty(p_chr_id number)
8223 IS
8224 SELECT OKC.LINE_NUMBER line_number,subline.line_number sub_line_number
8225 FROM OKC_K_ITEMS oti,okc_k_lines_b okc,okc_k_lines_b subline
8226 WHERE okc.lse_id IN (1,20)
8227 AND oti.dnz_chr_id =p_chr_id
8228 AND okc.chr_id = subline.dnz_chr_id
8229 AND oti.NUMBER_of_items IS NULL
8230 AND oti.cle_id =subline.id
8231 AND okc.id=subline.cle_id;
8232
8233
8234
8235 BEGIN
8236
8237 -- initialize return status
8238 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8239
8240 for check_covd_qty_rec in check_covd_qty(p_chr_id)
8241 LOOP
8242
8243 OKC_API.set_message
8244 (
8245 p_app_name => 'OKS',
8246 p_msg_name => 'OKS_INVALID_QTY_VALUE',
8247 p_token1 => 'LINE_NUMBER',
8248 p_token1_value =>
8249 check_covd_qty_rec.line_number||'.'||check_covd_qty_rec.sub_line_number);
8250
8251 -- notify caller of an error
8252 x_return_status := OKC_API.G_RET_STS_ERROR;
8253 end loop;
8254
8255 IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
8256 OKC_API.set_message(
8257 p_app_name => G_APP_NAME,
8258 p_msg_name => 'OKS_QA_SUCCESS');
8259 END IF;
8260
8261 EXCEPTION
8262 WHEN G_EXCEPTION_HALT_VALIDATION THEN
8263 -- no processing necessary; validation can continue with next column
8264 NULL;
8265 WHEN OTHERS THEN
8266 -- store SQL error message on message stack
8267 OKC_API.SET_MESSAGE(
8268 p_app_name => G_APP_NAME,
8269 p_msg_name => G_UNEXPECTED_ERROR,
8270 p_token1 => G_SQLCODE_TOKEN,
8271 p_token1_value => SQLCODE,
8272 p_token2 => G_SQLERRM_TOKEN,
8273 p_token2_value => SQLERRM);
8274 -- notify caller of an error as UNEXPETED error
8275 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
8276
8277 END check_qty;
8278
8279 /*11687112 -Cascade ER*/
8280 /*============================================================================+
8281 | Procedure: check_Cascade_request
8282 |
8283 | Purpose: Check to see if there is any active request runnning in the background for cascade attributes
8284 |
8285 | In Parameters: p_chr_id the contract id
8286 | Out Parameters: x_return_status standard return status
8287 |
8288 +============================================================================*/
8289
8290 PROCEDURE check_cascade_request(
8291 p_chr_id IN NUMBER ,
8292 x_return_status OUT NOCOPY VARCHAR2
8293 ) IS
8294
8295 /*
8296 This will check whether there is any active cascade request running in the background.
8297 If cascade is running ,it will issue a Error message
8298 */
8299
8300
8301 Program_ID NUMBER;
8302 Prog_Appl_ID NUMBER;
8303 req_id NUMBER;
8304
8305 CURSOR c_cascade_req(l_chr_id IN NUMBER,l_prog_appl_id IN NUMBER,l_prg_id IN NUMBER) IS
8306 SELECT max(request_id)
8307 FROM fnd_concurrent_requests
8308 WHERE program_application_id = l_prog_appl_id
8309 AND concurrent_program_id = l_prg_id
8310 AND argument1=to_char(l_chr_id)
8311 AND phase_code IN ('P','R');
8312
8313
8314 BEGIN
8315
8316 x_return_status := OKC_API.G_RET_STS_SUCCESS;
8317
8318
8319 SELECT concurrent_program_id, p.application_id
8320 INTO program_id, prog_appl_id
8321 FROM fnd_concurrent_programs P,
8322 fnd_application A
8323 WHERE concurrent_program_name = 'OKSCASCR'
8324 AND P.application_id = A.Application_ID
8325 AND A.application_short_name = 'OKS';
8326
8327 --Check if any request of the concurrent program 'OKSCASCR' is in Pending or Running Phase for the given contract header id
8328 OPEN c_cascade_req(p_chr_id,prog_appl_id,program_id);
8329 FETCH c_cascade_req INTO req_id;
8330 CLOSE c_cascade_req;
8331
8332 IF req_id is not null THEN
8333
8334 OKC_API.set_message(
8335 p_app_name => G_APP_NAME,
8336 p_msg_name => 'OKS_H_L_CASCADE_CHECK_FAIL',
8337 p_token1 => 'REQUEST_ID',
8338 p_token1_value => req_id
8339 );
8340
8341 x_return_status := OKC_API.G_RET_STS_ERROR;
8342
8343 ELSE
8344
8345 OKC_API.set_message(
8346 p_app_name => G_APP_NAME,
8347 p_msg_name => 'OKS_QA_SUCCESS');
8348
8349 END IF;
8350
8351
8352 EXCEPTION
8353 WHEN OTHERS THEN
8354
8355 -- store SQL error message on message stack
8356 OKC_API.SET_MESSAGE(
8357 p_app_name => G_APP_NAME,
8358 p_msg_name => G_UNEXPECTED_ERROR,
8359 p_token1 => G_SQLCODE_TOKEN,
8360 p_token1_value => SQLCODE,
8361 p_token2 => G_SQLERRM_TOKEN,
8362 p_token2_value => SQLERRM);
8363
8364 x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
8365
8366
8367 END CHECK_CASCADE_REQUEST;
8368 /*11687112 -Cascade ER*/
8369
8370 END OKS_QA_DATA_INTEGRITY;