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