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