DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKS_QA_DATA_INTEGRITY

Source


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