DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKL_QA_DATA_INTEGRITY

Source


1 PACKAGE BODY Okl_Qa_Data_Integrity AS
2 /* $Header: OKLRQADB.pls 120.153.12010000.12 2009/02/09 05:26:25 rpillay ship $ */
3 
4     G_MODULE VARCHAR2(255) := 'okl.stream.esg.okl_esg_transport_pvt';
5     G_DEBUG_ENABLED CONSTANT VARCHAR2(10) := OKL_DEBUG_PUB.CHECK_LOG_ENABLED;
6     G_IS_DEBUG_STATEMENT_ON BOOLEAN;
7 --rviriyal Bug#5982201
8 -- sjalasut, added global message constants as part of subsidy pools enhancement. START
9 G_SUB_POOL_NOT_ACTIVE CONSTANT fnd_new_messages.message_name%TYPE DEFAULT 'OKL_SUB_POOL_NOT_ACTIVE';
10 G_SUB_POOL_BALANCE_INVALID CONSTANT fnd_new_messages.message_name%TYPE DEFAULT 'OKL_SUB_POOL_INVALID_BAL';
11 G_SUB_POOL_ASSET_DATES_GAP CONSTANT fnd_new_messages.message_name%TYPE DEFAULT 'OKL_SUB_POOL_ASSET_DATES';
12 -- sjalasut, added global message constants as part of subsidy pools enhancement. END
13 G_PROD_PARAMS_NOT_FOUND   CONSTANT VARCHAR2(200)  := 'OKL_LLA_PDT_PARAM_NOT_FOUND';
14 G_PROD_NAME_TOKEN         CONSTANT VARCHAR2(200)  := 'PRODUCT_NAME';
15 
16 -- bug 6760186 start
17 G_IB_LINE_LTY_ID         NUMBER        := 45;
18 G_TSU_CODE_ENTERED       Varchar2(30)  := 'ENTERED';
19 G_TRX_LINE_TYPE_BOOK     Varchar2(30)  := 'CFA';
20 -- bug 6760186 end
21 
22 
23   -- Start of comments
24   --
25   -- Procedure Name  : check_evergreen_allowed
26   -- Description     : Bug#4917116 For LOAN and LOAN-REVOLVING evergreen
27   --                   eligible should not be set.
28   -- Business Rules  :
29   -- Parameters      :
30   -- Version         : 1.0
31   -- End of comments
32 
33   PROCEDURE check_evergreen_allowed(
34     x_return_status            OUT NOCOPY VARCHAR2,
35     p_chr_id                   IN  NUMBER
36   ) IS
37 
38    l_eg_eligible               OKC_RULES_B.RULE_INFORMATION1%TYPE;
39 
40    --Cursor to get the deal type of the contract
41    CURSOR deal_type_csr (p_chr_id IN NUMBER) IS
42    SELECT DEAL_TYPE
43    FROM   OKL_K_HEADERS
44    WHERE  ID = p_chr_id;
45 
46    --Cursor to get the Evergreen eligible flag
47    CURSOR eligible_csr (p_chr_id IN NUMBER) IS
48    SELECT RULE_INFORMATION1
49    FROM OKC_RULES_B
50    WHERE RULE_INFORMATION_CATEGORY = 'LAEVEL'
51    AND DNZ_CHR_ID = p_chr_id;
52 
53    l_deal_type OKL_K_HEADERS.DEAL_TYPE%TYPE;
54 
55   BEGIN
56 
57    -- initialize return status
58    x_return_status := Okl_Api.G_RET_STS_SUCCESS;
59 
60    OPEN eligible_csr (p_chr_id);
61    FETCH eligible_csr INTO l_eg_eligible;
62    CLOSE eligible_csr;
63 
64    IF (NVL(l_eg_eligible,'N') = 'Y') THEN
65      OPEN deal_type_csr(p_chr_id);
66      FETCH deal_type_csr INTO l_deal_type;
67      CLOSE deal_type_csr;
68 
69      IF (NVL(l_deal_type,'X') IN ('LOAN', 'LOAN-REVOLVING')) THEN
70 
71        Okl_Api.set_message(
72            p_app_name        => G_APP_NAME,
73            p_msg_name        => 'OKL_EVERGREEN_NOT_ALLOWED',
74            p_token1	     => 'DEAL_TYPE',
75            p_token1_value    => l_deal_type);
76 
77        x_return_status := Okl_Api.G_RET_STS_ERROR;
78 
79      END IF;
80    END IF;
81 
82   EXCEPTION
83      WHEN OTHERS THEN
84       -- store SQL error message on message stack
85 	  Okl_Api.SET_MESSAGE(
86           p_app_name        => G_APP_NAME,
87           p_msg_name        => G_UNEXPECTED_ERROR,
88           p_token1	   	    => G_SQLCODE_TOKEN,
89           p_token1_value    => SQLCODE,
90           p_token2          => G_SQLERRM_TOKEN,
91           p_token2_value    => SQLERRM);
92       x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
93 
94        IF eligible_csr%ISOPEN THEN
95          CLOSE eligible_csr;
96        END IF;
97 
98       IF deal_type_csr%ISOPEN THEN
99         CLOSE deal_type_csr;
100       END IF;
101 
102   END check_evergreen_allowed;
103 
104   -- Start of comments
105   --
106   -- Procedure Name  : check_evergreen_pth
107   -- Description     : Bug#4872437 ramurt. Check the fields Evergreen Passthrough Vendor
108   --                   and Evergreen Passthrough Vendor Site for mandatory if
109   --                   the Evergreen Eligible flag is checked in T and C
110   -- Business Rules  :
111   -- Parameters      :
112   -- Version         : 1.0
113   -- End of comments
114 
115   PROCEDURE check_evergreen_pth(
116     x_return_status            OUT NOCOPY VARCHAR2,
117     p_chr_id                   IN  NUMBER
118   ) IS
119 
120    l_eg_eligible               OKC_RULES_B.RULE_INFORMATION1%TYPE;
121    l_eg_passthru_vendor        OKC_RULES_B.OBJECT1_ID1%TYPE;
122    l_eg_passthru_vendor_site   OKC_RULES_B.OBJECT2_ID1%TYPE;
123 
124    --Cursor to get the Evergreen eligible flag
125    CURSOR eligible_csr (p_chr_id IN NUMBER) IS
126    SELECT RULE_INFORMATION1
127    FROM OKC_RULES_B
128    WHERE RULE_INFORMATION_CATEGORY = 'LAEVEL'
129    AND DNZ_CHR_ID = p_chr_id;
130 
131    --Cursor to get the values of Evergreen Passthrough Vendor and Evergreen Passthrough Vendor Site
132    CURSOR evergreen_passthru_csr (p_chr_id IN NUMBER) IS
133    SELECT OBJECT1_ID1,OBJECT2_ID1
134    FROM OKC_RULES_B
135    WHERE RULE_INFORMATION_CATEGORY = 'LAEVPT'
136    AND DNZ_CHR_ID = p_chr_id;
137 
138    --Cursor to get the deal type of the contract
139    CURSOR deal_type_csr (p_chr_id IN NUMBER) IS
140    SELECT DEAL_TYPE
141    FROM   OKL_K_HEADERS
142    WHERE  ID = p_chr_id;
143 
144    l_deal_type OKL_K_HEADERS.DEAL_TYPE%TYPE;
145   BEGIN
146 
147    -- initialize return status
148    x_return_status := Okl_Api.G_RET_STS_SUCCESS;
149 
150   OPEN eligible_csr (p_chr_id);
151   FETCH eligible_csr INTO l_eg_eligible;
152   CLOSE eligible_csr;
153 
154   OPEN deal_type_csr(p_chr_id);
155   FETCH deal_type_csr INTO l_deal_type;
156   CLOSE deal_type_csr;
157 
158    IF (l_eg_eligible = 'Y') THEN
159      IF (NVL(l_deal_type,'X') NOT IN ('LOAN', 'LOAN-REVOLVING')) THEN
160 
161        OPEN evergreen_passthru_csr (p_chr_id);
162        FETCH evergreen_passthru_csr INTO l_eg_passthru_vendor, l_eg_passthru_vendor_site;
163        CLOSE evergreen_passthru_csr;
164 
165        IF (l_eg_passthru_vendor IS NULL OR l_eg_passthru_vendor_site IS NULL) THEN
166 
167          Okl_Api.set_message(
168              p_app_name => G_APP_NAME,
169              p_msg_name => 'OKL_REQ_EVERGREEN_PTH');
170 
171          x_return_status := Okl_Api.G_RET_STS_ERROR;
172        END IF;
173      END IF;
174    END IF;
175 
176   EXCEPTION
177      WHEN OTHERS THEN
178       -- store SQL error message on message stack
179 	  Okl_Api.SET_MESSAGE(
180           p_app_name        => G_APP_NAME,
181           p_msg_name        => G_UNEXPECTED_ERROR,
182           p_token1	   	    => G_SQLCODE_TOKEN,
183           p_token1_value    => SQLCODE,
184           p_token2          => G_SQLERRM_TOKEN,
185           p_token2_value    => SQLERRM);
186       x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
187 
188       IF eligible_csr%ISOPEN THEN
189         CLOSE eligible_csr;
190       END IF;
191 
192       IF deal_type_csr%ISOPEN THEN
193         CLOSE deal_type_csr;
194       END IF;
195 
196       IF evergreen_passthru_csr%ISOPEN THEN
197         CLOSE evergreen_passthru_csr;
198       END IF;
199 
200   END check_evergreen_pth;
201 
202 ------------------------------------------------------------------------------
203 -- PROCEDURE get_bill_to
204 --
205 --  This procedure returns bill to id from contract header
206 --
207 -- Calls:
208 -- Called By:
209 ------------------------------------------------------------------------------
210    PROCEDURE get_bill_to(
211                          x_return_status  OUT NOCOPY VARCHAR2,
212                          p_chr_id         IN  OKC_K_HEADERS_B.ID%TYPE,
213                          x_bill_to_id     OUT NOCOPY OKC_K_HEADERS_B.BILL_TO_SITE_USE_ID%TYPE
214                         ) IS
215 
216    l_proc_name   VARCHAR2(35) := 'GET_BILL_TO';
217 
218    CURSOR bill_to_csr (p_chr_id OKC_K_HEADERS_B.ID%TYPE) IS
219    SELECT bill_to_site_use_id
220    FROM   okc_k_headers_b
221    WHERE  id = p_chr_id;
222 
223    bill_to_failed EXCEPTION;
224 
225    BEGIN
226      x_return_status := Okl_Api.G_RET_STS_SUCCESS;
227 
228      x_bill_to_id := NULL;
229      OPEN bill_to_csr (p_chr_id);
230      FETCH bill_to_csr INTO x_bill_to_id;
231      IF bill_to_csr%NOTFOUND THEN
232         RAISE bill_to_failed;
233      END IF;
234      CLOSE bill_to_csr;
235 
236      IF (x_bill_to_id IS NULL) THEN
237         RAISE bill_to_failed;
238      END IF;
239 
240      RETURN;
241 
242    EXCEPTION
243 
244      WHEN bill_to_failed THEN
245         IF bill_to_csr%ISOPEN THEN
246            CLOSE bill_to_csr;
247         END IF;
248 
249         x_return_status := Okl_Api.G_RET_STS_ERROR;
250 
251      WHEN OTHERS THEN
252        x_return_status := Okc_Api.G_RET_STS_ERROR;
253 
254    END get_bill_to;
255 
256 ------------------------------------------------------------------------------
257 -- PROCEDURE get_cust_account
258 --
259 --  This procedure returns bill to id from contract header
260 --
261 -- Calls:
262 -- Called By:
263 ------------------------------------------------------------------------------
264    PROCEDURE get_cust_account(
265                          x_return_status  OUT NOCOPY VARCHAR2,
266                          p_chr_id         IN  OKC_K_HEADERS_B.ID%TYPE,
267                          x_cust_acc_id    OUT NOCOPY OKC_K_HEADERS_B.CUST_ACCT_ID%TYPE
268                         ) IS
269 
270    l_proc_name   VARCHAR2(35) := 'GET_CUST_ACCOUNT';
271 
272    CURSOR cust_acc_csr (p_chr_id OKC_K_HEADERS_B.ID%TYPE) IS
273    SELECT cust_acct_id
274    FROM   okc_k_headers_b
275    WHERE  id = p_chr_id;
276 
277    cust_acc_failed EXCEPTION;
278 
279    BEGIN
280      x_return_status := Okl_Api.G_RET_STS_SUCCESS;
281 
282      x_cust_acc_id := NULL;
283      OPEN cust_acc_csr (p_chr_id);
284      FETCH cust_acc_csr INTO x_cust_acc_id;
285      IF cust_acc_csr%NOTFOUND THEN
286         RAISE cust_acc_failed;
287      END IF;
288      CLOSE cust_acc_csr;
289 
290      IF (x_cust_acc_id IS NULL) THEN
291         RAISE cust_acc_failed;
292      END IF;
293 
294      RETURN;
295 
296    EXCEPTION
297 
298      WHEN cust_acc_failed THEN
299         IF cust_acc_csr%ISOPEN THEN
300            CLOSE cust_acc_csr;
301         END IF;
302 
303         x_return_status := Okl_Api.G_RET_STS_ERROR;
304 
305      WHEN OTHERS THEN
306        x_return_status := Okc_Api.G_RET_STS_ERROR;
307 
308    END get_cust_account;
309 
310 --Bug# 2833653
311   -- Start of comments
312   --
313   -- Procedure Name  : Are_Assets_Inactive
314   -- Description     : Local function to determine if all the assets on contract are Not active
315   -- Business Rules  :
316   -- Parameters      :
317   -- Version         : 1.0
318   -- End of comments
319   -- Start of comments
320   --
321   FUNCTION Are_Assets_Inactive (p_chr_id IN NUMBER) RETURN  VARCHAR2 IS
322 
323       --Bug# 4928841 :Modified cursor definition
324       /*
325       CURSOR inactive_assets_csr(chrId IN NUMBER) IS
326       SELECT 'Y'
327       FROM   DUAL
328       WHERE  EXISTS
329       (
330       SELECT 'Y'
331       FROM   OKC_K_ITEMS fa_cim,
332              OKC_K_LINES_B fa_cle,
333              OKC_LINE_STYLES_B fa_lse,
334              OKC_STATUSES_B fa_sts
335       WHERE  fa_cim.cle_id = fa_cle.id
336       AND    fa_cim.dnz_chr_id = fa_cle.dnz_chr_id
337       AND    fa_cle.dnz_chr_id = chrid
338       AND    fa_cle.lse_id     = fa_lse.id
339       AND    fa_lse.lty_code   = 'FIXED_ASSET'
340       AND    fa_cle.sts_code   = fa_sts.code
341       AND    fa_sts.ste_code NOT IN ('CANCELLED','TERMINATED','HOLD','EXPIRED')
342       AND    fa_cim.object1_id1 IS NULL
343       AND    EXISTS (SELECT '1'
344                      FROM   OKC_K_LINES_B     fa_cle2,
345                             OKC_LINE_STYLES_B fa_lse2,
346                             OKC_STATUSES_B    fa_sts2
347                      WHERE  fa_cle2.lse_id = fa_lse2.id
348                      AND    fa_lse2.lty_code = 'FIXED_ASSET'
349                      AND    fa_cle2.sts_code = fa_sts2.code
350                      AND    fa_sts2.ste_code NOT IN ('CANCELLED','TERMINATED','HOLD','EXPIRED')
351                      AND    fa_cle2.dnz_chr_id = chrid
352                     )
353       UNION
354       SELECT 'Y'
355       FROM   OKC_K_ITEMS fa_cim,
356              OKC_K_LINES_B fa_cle,
357              OKC_LINE_STYLES_B fa_lse,
358              OKC_STATUSES_B fa_sts
359       WHERE  fa_cim.cle_id = fa_cle.id
360       AND    fa_cim.dnz_chr_id = fa_cle.dnz_chr_id
361       AND    fa_cle.dnz_chr_id = chrid
362       AND    fa_cle.lse_id     = fa_lse.id
363       AND    fa_lse.lty_code   = 'FIXED_ASSET'
364       AND    fa_cle.sts_code   = fa_sts.code
365       AND    fa_sts.ste_code NOT IN ('CANCELLED','TERMINATED','HOLD','EXPIRED')
366       AND    fa_cim.object1_id1 IS NOT NULL
367       AND NOT EXISTS(SELECT '1'
368                      FROM   FA_ADDITIONS_B FAB
369                      WHERE  FAB.Asset_id = TO_NUMBER(fa_cim.object1_id1)
370                     )
371       AND    EXISTS (SELECT '1'
372                      FROM   OKC_K_LINES_B     fa_cle2,
373                             OKC_LINE_STYLES_B fa_lse2,
374                             OKC_STATUSES_B    fa_sts2
375                      WHERE  fa_cle2.lse_id  = fa_lse2.id
376                      AND    fa_lse2.lty_code = 'FIXED_ASSET'
377                      AND    fa_cle2.sts_code = fa_sts2.code
378                      AND    fa_sts2.ste_code NOT IN ('CANCELLED','TERMINATED','HOLD','EXPIRED')
379                      AND    fa_cle2.dnz_chr_id = chrid
380                     ) ); */
381 
382       CURSOR inactive_assets_csr(chrId IN NUMBER) IS
383       SELECT 'Y'
384       FROM   DUAL
385       WHERE  EXISTS
386       (
387 	SELECT 1
388 	FROM OKC_K_LINES_B fa_cle,
389 	OKC_LINE_STYLES_B fa_lse,
390 	OKC_STATUSES_B fa_sts,
391 	OKC_K_ITEMS fa_cim,
392 	FA_ADDITIONS_B FAB
393 	WHERE fa_cim.cle_id = fa_cle.id
394 	AND fa_cim.dnz_chr_id = fa_cle.dnz_chr_id
395 	AND fa_cle.dnz_chr_id =  chrId
396 	AND fa_cle.lse_id = fa_lse.id
397 	AND fa_lse.lty_code = 'FIXED_ASSET'
398 	AND fa_cle.sts_code = fa_sts.code
399 	AND fa_sts.ste_code NOT IN ('CANCELLED','TERMINATED','HOLD','EXPIRED')
400 	AND FAB.Asset_id(+) = fa_cim.object1_id1
401 	AND FAB.Asset_id is null
402       );
403       --End Bug# 4928841 :Modified cursor definition
404 
405       l_inactive_assets VARCHAR2(1) DEFAULT 'N';
406       --cursor to check if there are any lines on the contract
407       CURSOR l_lines_exist_csr(chrid NUMBER) IS
408       SELECT 'Y'
409       FROM    okc_k_headers_b chrb
410       WHERE   chrb.id = chrid
411       AND EXISTS (SELECT '1'
412                   FROM   okc_k_lines_b cleb
413                   WHERE  cleb.chr_id = chrb.id
414                   AND    cleb.dnz_chr_id = chrb.id);
415      l_lines_exist VARCHAR2(1) DEFAULT 'N';
416      l_halt_process EXCEPTION;
417 BEGIN
418     l_inactive_assets := 'N';
419     l_lines_exist := 'N';
420     OPEN l_lines_exist_csr(chrid => p_chr_id);
421     FETCH l_lines_exist_csr INTO l_lines_exist;
422     IF l_lines_exist_csr%NOTFOUND THEN
423         NULL;
424     END IF;
425     CLOSE l_lines_exist_csr;
426 
427     IF l_lines_exist = 'N' THEN
428        l_inactive_assets := 'Y';
429        RAISE l_halt_process;
430     END IF;
431 
432     OPEN inactive_assets_csr(chrid => p_chr_id);
433     FETCH inactive_assets_csr INTO l_inactive_assets;
434     IF inactive_assets_csr%NOTFOUND THEN
435         NULL;
436     END IF;
437     CLOSE inactive_assets_csr;
438     RETURN(l_inactive_assets);
439     EXCEPTION
440     WHEN l_halt_process THEN
441         RETURN(l_inactive_assets);
442     WHEN OTHERS THEN
443          IF inactive_assets_csr%ISOPEN THEN
444              CLOSE inactive_assets_csr;
445          END IF;
446          IF l_lines_exist_csr%ISOPEN THEN
447              CLOSE l_lines_exist_csr;
448          END IF;
449          RETURN('Y');
450 END are_assets_Inactive;
451 --Bug# 2833653
452 
453   -- Procedure Name  : check_service_line_hdr
454   -- Description     :
455   -- Business Rules  :
456   -- Parameters      :
457   -- Version         : 1.0
458   -- End of comments
459 
460   PROCEDURE check_service_line_hdr(
461     x_return_status            OUT NOCOPY VARCHAR2,
462     p_chr_id                   IN  NUMBER
463   ) IS
464 
465     x_msg_count       NUMBER;
466     x_msg_data        VARCHAR2(256);
467     x_link_line_tbl   Okl_Service_Integration_Pub.LINK_LINE_TBL_TYPE;
468     x_service_contract_id  NUMBER;
469 
470     i NUMBER;
471 
472     l_hdr_rec1 l_hdr_csr%ROWTYPE;
473     l_hdr_rec2 l_hdr_csr%ROWTYPE;
474 
475     cust_rec1 cust_csr%ROWTYPE;
476     cust_rec2 cust_csr%ROWTYPE;
477 
478     l_oksrl_rec l_oksrl_csr%ROWTYPE;
479     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
480 
481     l_okl_bill_to_id OKC_K_HEADERS_B.BILL_TO_SITE_USE_ID%TYPE;
482     l_oks_bill_to_id OKC_K_HEADERS_B.BILL_TO_SITE_USE_ID%TYPE;
483 
484   BEGIN
485 
486     -- initialize return status
487     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
488 
489     Okl_Service_Integration_Pub.get_service_link_line (
490                                    p_api_version   => 1.0,
491                                    p_init_msg_list => Okl_Api.G_FALSE,
492                                    x_return_status => x_return_status,
493                                    x_msg_count     => x_msg_count,
494                                    x_msg_data      => x_msg_data,
495                                    p_lease_contract_id => p_chr_id,
496                                    x_link_line_tbl => x_link_line_tbl,
497                                    x_service_contract_id => x_service_contract_id);
498 
499     IF x_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
500         RAISE G_EXCEPTION_HALT_VALIDATION;
501     END IF;
502 
503     IF ( NVL(x_service_contract_id, -1 ) = -1 ) THEN
504         x_return_status := Okl_Api.G_RET_STS_SUCCESS;
505         Okl_Api.set_message(
506           p_app_name      => G_APP_NAME,
507           p_msg_name      => G_QA_SUCCESS);
508 	RETURN;
509     END IF;
510 
511     OPEN l_hdr_csr( p_chr_id );
512     FETCH l_hdr_csr INTO l_hdr_rec1;
513     CLOSE l_hdr_csr;
514 
515     OPEN l_hdr_csr( x_service_contract_id );
516     FETCH l_hdr_csr INTO l_hdr_rec2;
517     CLOSE l_hdr_csr;
518 
519     IF ( l_hdr_rec1.CURRENCY_CODE <> l_hdr_rec2.CURRENCY_CODE ) THEN
520            Okl_Api.set_message(
521               p_app_name     => G_APP_NAME,
522               p_msg_name     => 'OKL_QA_OKL_OKS_CURR');
523            x_return_status := Okl_Api.G_RET_STS_ERROR;
524     END IF;
525 
526     OPEN cust_csr('LESSEE', p_chr_id );
527     FETCH cust_csr INTO cust_rec1;
528     CLOSE cust_csr;
529 
530     OPEN cust_csr('CUSTOMER',  x_service_contract_id );
531     FETCH cust_csr INTO cust_rec2;
532     CLOSE cust_csr;
533 
534     IF ( cust_rec1.Object1_id1 <> cust_rec2.Object1_id1 ) THEN
535            Okl_Api.set_message(
536               p_app_name     => G_APP_NAME,
537               p_msg_name     => 'OKL_QA_OKL_OKS_CUST');
538            x_return_status := Okl_Api.G_RET_STS_ERROR;
539     END IF;
540 
541 /* Rule migration
542 
543     OPEN  l_hdrrl_csr('LABILL', 'BTO', TO_NUMBER(p_chr_id));
544     FETCH l_hdrrl_csr into l_hdrrl_rec;
545     CLOSE l_hdrrl_csr;
546 */
547       get_bill_to(
548                   x_return_status => x_return_status,
549                   p_chr_id        => p_chr_id,
550                   x_bill_to_id    => l_okl_bill_to_id
551                  );
552 
553 /* Rule migration
554     OPEN  l_oksrl_csr('BTO', x_service_contract_id, -1);
555     FETCH l_oksrl_csr into l_oksrl_rec;
556     CLOSE l_oksrl_csr;
557 */
558 
559       get_bill_to(
560                   x_return_status => x_return_status,
561                   p_chr_id        => x_service_contract_id,
562                   x_bill_to_id    => l_oks_bill_to_id
563                  );
564 
565     --If( l_hdrrl_rec.object1_id1 <> l_oksrl_rec.object1_id1 ) Then
566     IF( l_okl_bill_to_id <> l_oks_bill_to_id) THEN
567             Okl_Api.set_message(
568               p_app_name     => G_APP_NAME,
569               p_msg_name     => 'OKL_QA_OKL_OKS_BTO');
570              -- notify caller of an error
571             x_return_status := Okl_Api.G_RET_STS_ERROR;
572     END IF;
573 
574     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
575         Okl_Api.set_message(
576           p_app_name      => G_APP_NAME,
577           p_msg_name      => G_QA_SUCCESS);
578     END IF;
579 
580   EXCEPTION
581 
582   WHEN G_EXCEPTION_HALT_VALIDATION THEN
583     NULL;
584     -- no processing necessary; validation can continue with next column
585   WHEN OTHERS THEN
586     -- store SQL error message on message stack
587     Okl_Api.SET_MESSAGE(
588       p_app_name        => G_APP_NAME,
589       p_msg_name        => G_UNEXPECTED_ERROR,
590       p_token1	        => G_SQLCODE_TOKEN,
591       p_token1_value    => SQLCODE,
592       p_token2          => G_SQLERRM_TOKEN,
593       p_token2_value    => SQLERRM);
594 
595     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
596 
597   END check_service_line_hdr;
598 
599 
600   -- Start of comments
601   --
602   -- Procedure Name  : check_cov_service_lines
603   -- Description     :
604   -- Business Rules  :
605   -- Parameters      :
606   -- Version         : 1.0
607   -- End of comments
608 
609   PROCEDURE check_cov_service_lines(
610     x_return_status            OUT NOCOPY VARCHAR2,
611     p_chr_id                   IN  NUMBER
612   ) IS
613 
614     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
615 
616     x_msg_count       NUMBER;
617     x_msg_data        VARCHAR2(256);
618     x_link_line_tbl   Okl_Service_Integration_Pub.LINK_LINE_TBL_TYPE;
619     x_service_contract_id  NUMBER;
620 
621     l_svclne l_svclne_csr%ROWTYPE;
622 
623     i NUMBER;
624     n NUMBER;
625 
626   BEGIN
627 
628     -- initialize return status
629     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
630 
631     Okl_Service_Integration_Pub.get_service_link_line (
632                                    p_api_version   => 1.0,
633                                    p_init_msg_list => Okl_Api.G_FALSE,
634                                    x_return_status => x_return_status,
635                                    x_msg_count     => x_msg_count,
636                                    x_msg_data      => x_msg_data,
637                                    p_lease_contract_id => p_chr_id,
638                                    x_link_line_tbl => x_link_line_tbl,
639                                    x_service_contract_id => x_service_contract_id);
640 
641     IF x_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
642         RAISE G_EXCEPTION_HALT_VALIDATION;
643     END IF;
644 
645     IF ( NVL(x_service_contract_id, -1 ) = -1 ) THEN
646         x_return_status := Okl_Api.G_RET_STS_SUCCESS;
647         Okl_Api.set_message(
648           p_app_name      => G_APP_NAME,
649           p_msg_name      => G_QA_SUCCESS);
650 	RETURN;
651     END IF;
652 
653     n := 0;
654     FOR l_svclne IN l_svclne_csr( 'COVER_PROD', x_service_contract_id )
655     LOOP
656         n := n+1;
657     END LOOP;
658 
659     IF ( n > x_link_line_tbl.COUNT ) THEN
660            Okl_Api.set_message(
661               p_app_name     => G_APP_NAME,
662               p_msg_name     => 'OKL_QA_OKL_OKS_COV');
663            x_return_status := Okl_Api.G_RET_STS_ERROR;
664     END IF;
665 
666 
667     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
668         Okl_Api.set_message(
669           p_app_name      => G_APP_NAME,
670           p_msg_name      => G_QA_SUCCESS);
671     END IF;
672 
673   EXCEPTION
674 
675   WHEN G_EXCEPTION_HALT_VALIDATION THEN
676     NULL;
677     -- no processing necessary; validation can continue with next column
678   WHEN OTHERS THEN
679     -- store SQL error message on message stack
680     Okl_Api.SET_MESSAGE(
681       p_app_name        => G_APP_NAME,
682       p_msg_name        => G_UNEXPECTED_ERROR,
683       p_token1	        => G_SQLCODE_TOKEN,
684       p_token1_value    => SQLCODE,
685       p_token2          => G_SQLERRM_TOKEN,
686       p_token2_value    => SQLERRM);
687 
688     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
689 
690   END check_cov_service_lines;
691 
692   -- Start of comments
693   --
694   -- Procedure Name  : check_service_lines
695   -- Description     :
696   -- Business Rules  :
697   -- Parameters      :
698   -- Version         : 1.0
699   -- End of comments
700 
701   PROCEDURE check_service_lines(
702     x_return_status            OUT NOCOPY VARCHAR2,
703     p_chr_id                   IN  NUMBER
704   ) IS
705 
706     x_msg_count       NUMBER;
707     x_msg_data        VARCHAR2(256);
708     x_link_line_tbl   Okl_Service_Integration_Pub.LINK_LINE_TBL_TYPE;
709     x_service_contract_id  NUMBER;
710 
711     CURSOR srv_csr (p_serv_top_line_id NUMBER) IS
712     SELECT item_id inventory_item_id,
713            SUM(service_item_qty) quantity
714     FROM   okl_la_cov_asset_uv
715     WHERE  serv_top_line_id = p_serv_top_line_id
716     GROUP BY item_id;
717 
718     l_lne l_lne_csr%ROWTYPE;
719     l_sublne l_subline_csr%ROWTYPE;
720     --l_svclne l_svcline_csr%ROWTYPE;
721     l_svclne srv_csr%ROWTYPE;
722 
723     l_toplne l_toplne_csr%ROWTYPE;
724     l_topsvclne l_topsvclne_csr%ROWTYPE;
725     l_rl_rec1 l_rl_csr1%ROWTYPE;
726 
727     i NUMBER;
728     j NUMBER;
729 
730   BEGIN
731 
732     -- initialize return status
733     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
734 
735     Okl_Service_Integration_Pub.get_service_link_line (
736                                    p_api_version   => 1.0,
737                                    p_init_msg_list => Okl_Api.G_FALSE,
738                                    x_return_status => x_return_status,
739                                    x_msg_count     => x_msg_count,
740                                    x_msg_data      => x_msg_data,
741                                    p_lease_contract_id => p_chr_id,
742                                    x_link_line_tbl => x_link_line_tbl,
743                                    x_service_contract_id => x_service_contract_id);
744 
745     IF x_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
746         RAISE G_EXCEPTION_HALT_VALIDATION;
747     END IF;
748 
749     IF ( NVL(x_service_contract_id, -1 ) = -1 ) THEN
750         x_return_status := Okl_Api.G_RET_STS_SUCCESS;
751         Okl_Api.set_message(
752           p_app_name      => G_APP_NAME,
753           p_msg_name      => G_QA_SUCCESS);
754 	RETURN;
755     END IF;
756 
757     FOR l_svclne IN l_svclne_csr( 'SERVICE', x_service_contract_id )
758     LOOP
759         j := -1;
760         FOR i IN 1..x_link_line_tbl.COUNT
761         LOOP
762 
763             OPEN  l_topsvclne_csr( 'SERVICE', x_service_contract_id, x_link_line_tbl(i).oks_service_line_id );
764 	    FETCH l_topsvclne_csr INTO l_topsvclne;
765 	    CLOSE l_topsvclne_csr;
766 
767 	    IF( l_svclne.id = l_topsvclne.id ) THEN
768 	        j := 0;
769 		EXIT;
770 	    END IF;
771 	END LOOP;
772 
773         IF ( j = -1 ) THEN
774                Okl_Api.set_message(
775                   p_app_name     => G_APP_NAME,
776                   p_msg_name     => 'OKL_QA_OKL_OKS_LNK');
777                x_return_status := Okl_Api.G_RET_STS_ERROR;
778 	       EXIT;
779         END IF;
780     END LOOP;
781 
782     FOR i IN 1..x_link_line_tbl.COUNT
783     LOOP
784 
785 
786         OPEN l_subline_csr( x_link_line_tbl(i).okl_service_line_id);
787 	FETCH l_subline_csr INTO l_sublne;
788 	CLOSE l_subline_csr;
789 
790 /* removed bug 3257597
791         OPEN l_svcline_csr( x_link_line_tbl(i).oks_service_line_id);
792 	FETCH l_svcline_csr INTO l_svclne;
793 	CLOSE l_svcline_csr;
794 */
795         OPEN srv_csr (x_link_line_tbl(i).okl_service_line_id);
796         FETCH srv_csr INTO l_svclne;
797         CLOSE srv_csr;
798 
799         IF ( l_svclne.inventory_item_id <> l_sublne.object1_id1 ) THEN
800 
801             Okl_Api.set_message(
802                   p_app_name     => G_APP_NAME,
803                   p_msg_name     => 'OKL_QA_OKL_OKS_ITMS',
804                   p_token1       => 'line',
805                   p_token1_value => l_sublne.name);
806             x_return_status := Okl_Api.G_RET_STS_ERROR;
807 
808 	END IF;
809 
810         IF ( l_svclne.quantity <> l_sublne.number_of_items ) THEN
811 
812             Okl_Api.set_message(
813                   p_app_name     => G_APP_NAME,
814                   p_msg_name     => 'OKL_QA_OKL_OKS_NITMS',
815                   p_token1       => 'line',
816                   p_token1_value => l_sublne.name);
817 
818             x_return_status := Okl_Api.G_RET_STS_ERROR;
819 
820         END IF;
821 
822 
823         OPEN  l_toplne_csr( 'SOLD_SERVICE', p_chr_id, x_link_line_tbl(i).okl_service_line_id );
824 	FETCH l_toplne_csr INTO l_toplne;
825 	CLOSE l_toplne_csr;
826 
827         OPEN l_rl_csr1( 'LALEVL', 'LASLL', p_chr_id, l_toplne.id);
828 	FETCH l_rl_csr1 INTO l_rl_rec1;
829 	IF ( l_rl_csr1%FOUND ) THEN
830             Okl_Api.set_message(
831                 p_app_name     => G_APP_NAME,
832                 p_msg_name     => 'OKL_QA_OKL_OKS_PYMNTS',
833                 p_token1       => 'line',
834                 p_token1_value => l_toplne.name);
835              x_return_status := Okl_Api.G_RET_STS_ERROR;
836 	END IF;
837 	CLOSE l_rl_csr1;
838 
839     END LOOP;
840 
841     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
842         Okl_Api.set_message(
843           p_app_name      => G_APP_NAME,
844           p_msg_name      => G_QA_SUCCESS);
845     END IF;
846 
847   EXCEPTION
848 
849   WHEN G_EXCEPTION_HALT_VALIDATION THEN
850     IF ( l_toplne_csr%ISOPEN ) THEN
851         CLOSE l_toplne_csr;
852     END IF;
853     -- no processing necessary; validation can continue with next column
854   WHEN OTHERS THEN
855     -- store SQL error message on message stack
856     Okl_Api.SET_MESSAGE(
857       p_app_name        => G_APP_NAME,
858       p_msg_name        => G_UNEXPECTED_ERROR,
859       p_token1	        => G_SQLCODE_TOKEN,
860       p_token1_value    => SQLCODE,
861       p_token2          => G_SQLERRM_TOKEN,
862       p_token2_value    => SQLERRM);
863 
864     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
865 
866     IF ( l_toplne_csr%ISOPEN ) THEN
867         CLOSE l_toplne_csr;
868     END IF;
869 
870   END check_service_lines;
871 
872   -- Start of comments
873   --
874   -- Procedure Name  : check_srvc_amnt
875   -- Description     :
876   -- Business Rules  :
877   -- Parameters      :
878   -- Version         : 1.0
879   -- End of comments
880 
881   PROCEDURE check_srvc_amnt(
882     x_return_status            OUT NOCOPY VARCHAR2,
883     p_chr_id                   IN  NUMBER
884   ) IS
885 
886     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
887 
888     x_msg_count       NUMBER;
889     x_msg_data        VARCHAR2(256);
890     x_link_line_tbl   Okl_Service_Integration_Pub.LINK_LINE_TBL_TYPE;
891     x_service_contract_id  NUMBER;
892 
893     CURSOR srv_amt_csr (p_serv_top_line_id NUMBER) IS
894     SELECT item_id inventory_item_id,
895            SUM(NVL(price_negotiated,0)) amount
896     FROM   okl_la_cov_asset_uv
897     WHERE  serv_top_line_id = p_serv_top_line_id
898     GROUP BY item_id;
899 
900     l_lne l_toplne_csr%ROWTYPE;
901     --l_svclne l_topsvclne_csr%ROWTYPE;
902     l_svclne srv_amt_csr%ROWTYPE;
903 
904     amount1 okl_k_lines.AMOUNT%TYPE;
905     amount2 okl_k_lines.AMOUNT%TYPE;
906 
907     i NUMBER;
908 
909   BEGIN
910 
911     -- initialize return status
912     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
913 
914     Okl_Service_Integration_Pub.get_service_link_line (
915                                    p_api_version   => 1.0,
916                                    p_init_msg_list => Okl_Api.G_FALSE,
917                                    x_return_status => x_return_status,
918                                    x_msg_count     => x_msg_count,
919                                    x_msg_data      => x_msg_data,
920                                    p_lease_contract_id => p_chr_id,
921                                    x_link_line_tbl => x_link_line_tbl,
922                                    x_service_contract_id => x_service_contract_id);
923 
924     IF x_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
925         RAISE G_EXCEPTION_HALT_VALIDATION;
926     END IF;
927 
928     IF ( NVL(x_service_contract_id, -1 ) = -1 ) THEN
929         x_return_status := Okl_Api.G_RET_STS_SUCCESS;
930         Okl_Api.set_message(
931           p_app_name      => G_APP_NAME,
932           p_msg_name      => G_QA_SUCCESS);
933 	RETURN;
934     END IF;
935 
936     FOR i IN 1..x_link_line_tbl.COUNT
937     LOOP
938 
939 /* removed bug# 3257597
940         OPEN l_topsvclne_csr( 'SERVICE', x_service_contract_id, x_link_line_tbl(i).oks_service_line_id );
941 	FETCH l_topsvclne_csr INTO l_svclne;
942 	amount1 := nvl(l_svclne.amount, -1);
943 	CLOSE l_topsvclne_csr;
944 */
945 
946 
947         OPEN l_toplne_csr( 'SOLD_SERVICE', p_chr_id, x_link_line_tbl(i).okl_service_line_id );
948 	FETCH l_toplne_csr INTO l_lne;
949 	amount2 := NVL(l_lne.amount,-1);
950 	CLOSE l_toplne_csr;
951 
952 
953         OPEN srv_amt_csr (l_lne.id); -- pass okl service top line id
954         FETCH srv_amt_csr INTO l_svclne;
955         amount1 := NVL(l_svclne.amount, -1);
956         CLOSE srv_amt_csr;
957 
958         IF ( amount1 <> amount2 ) THEN
959                Okl_Api.set_message(
960                   p_app_name     => G_APP_NAME,
961                   p_msg_name     => 'OKL_QA_OKL_OKS_AMNTS',
962                   p_token1       => 'line',
963                   p_token1_value => l_lne.line_number);
964                x_return_status := Okl_Api.G_RET_STS_ERROR;
965 	END IF;
966 
967     END LOOP;
968 
969     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
970         Okl_Api.set_message(
971           p_app_name      => G_APP_NAME,
972           p_msg_name      => G_QA_SUCCESS);
973     END IF;
974 
975   EXCEPTION
976 
977   WHEN G_EXCEPTION_HALT_VALIDATION THEN
978     IF ( l_toplne_csr%ISOPEN ) THEN
979         CLOSE l_toplne_csr;
980     END IF;
981     -- no processing necessary; validation can continue with next column
982   WHEN OTHERS THEN
983     -- store SQL error message on message stack
984     Okl_Api.SET_MESSAGE(
985       p_app_name        => G_APP_NAME,
986       p_msg_name        => G_UNEXPECTED_ERROR,
987       p_token1	        => G_SQLCODE_TOKEN,
988       p_token1_value    => SQLCODE,
989       p_token2          => G_SQLERRM_TOKEN,
990       p_token2_value    => SQLERRM);
991 
992     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
993 
994     IF ( l_toplne_csr%ISOPEN ) THEN
995         CLOSE l_toplne_csr;
996     END IF;
997 
998   END check_srvc_amnt;
999 
1000   -- Start of comments
1001   --
1002   -- Procedure Name  : check_acceptance_date
1003   -- Description     :
1004   -- Business Rules  :
1005   -- Parameters      :
1006   -- Version         : 1.0
1007   -- End of comments
1008 
1009   PROCEDURE check_acceptance_date(
1010     x_return_status            OUT NOCOPY VARCHAR2,
1011     p_chr_id                   IN  NUMBER
1012   ) IS
1013 
1014     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1015 
1016     l_hdr_rec l_hdr_csr%ROWTYPE;
1017 
1018   BEGIN
1019 
1020     -- initialize return status
1021     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
1022 
1023     OPEN l_hdr_csr( p_chr_id );
1024     FETCH l_hdr_csr INTO l_hdr_rec;
1025     CLOSE l_hdr_csr;
1026 
1027     IF ( l_hdr_rec.accepted_date IS NULL) THEN
1028         Okl_Api.set_message(
1029                   p_app_name     => G_APP_NAME,
1030                   p_msg_name     => 'OKL_QA_NO_ACCPTD_DATE');
1031         x_return_status := Okl_Api.G_RET_STS_ERROR;
1032     END IF;
1033 
1034     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
1035         Okl_Api.set_message(
1036           p_app_name      => G_APP_NAME,
1037           p_msg_name      => G_QA_SUCCESS);
1038     END IF;
1039 
1040   EXCEPTION
1041 
1042   WHEN G_EXCEPTION_HALT_VALIDATION THEN
1043     IF l_hdr_csr%ISOPEN THEN
1044       CLOSE l_hdr_csr;
1045     END IF;
1046     -- no processing necessary; validation can continue with next column
1047   WHEN OTHERS THEN
1048     -- store SQL error message on message stack
1049     Okl_Api.SET_MESSAGE(
1050       p_app_name        => G_APP_NAME,
1051       p_msg_name        => G_UNEXPECTED_ERROR,
1052       p_token1	        => G_SQLCODE_TOKEN,
1053       p_token1_value    => SQLCODE,
1054       p_token2          => G_SQLERRM_TOKEN,
1055       p_token2_value    => SQLERRM);
1056     -- notify caller of an error as UNEXPETED error
1057     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
1058     -- verify that cursor was closed
1059     IF l_hdr_csr%ISOPEN THEN
1060       CLOSE l_hdr_csr;
1061     END IF;
1062 
1063   END check_acceptance_date;
1064 
1065 -- Bug 4865431
1066 PROCEDURE check_payment_schedule(
1067   x_return_status OUT NOCOPY VARCHAR2,
1068   p_chr_id IN NUMBER,
1069   p_stream_purpose_code IN VARCHAR2,
1070   p_message_name IN VARCHAR2) IS
1071 
1072 TYPE l_payment_details_rec IS RECORD (
1073   start_date DATE := NULL,
1074   number_of_periods NUMBER := NULL,
1075   stub_days NUMBER := NULL,
1076   stub_amount NUMBER := NULL,
1077   advance_or_arrears VARCHAR2(1) := NULL
1078 );
1079 TYPE l_payment_details_tbl IS TABLE OF l_payment_details_rec INDEX BY BINARY_INTEGER;
1080 TYPE l_tbl_rec IS RECORD (
1081   kle_id NUMBER,
1082   l_payment_details l_payment_details_tbl
1083 );
1084 TYPE l_tbl_type IS TABLE OF l_tbl_rec INDEX BY BINARY_INTEGER;
1085 
1086 l_pmnt_tab l_tbl_type;
1087 l_pmnt_tab_counter NUMBER;
1088 l_payment_details_counter NUMBER;
1089 
1090 CURSOR l_payment_lines_csr IS
1091     SELECT
1092     rgpb.cle_id kle_id,
1093     rulb2.RULE_INFORMATION2 start_date,
1094     rulb2.RULE_INFORMATION3 level_periods,
1095     rulb2.RULE_INFORMATION7 stub_days,
1096     rulb2.RULE_INFORMATION8 stub_amount,
1097     rulb2.RULE_INFORMATION10 arrear_yn
1098     FROM   okc_k_lines_b     cleb,
1099            okc_rule_groups_b rgpb,
1100            okc_rules_b       rulb,
1101            okc_rules_b       rulb2,
1102            okl_strm_type_b   styb
1103     WHERE  rgpb.chr_id     IS NULL
1104     AND    rgpb.dnz_chr_id = cleb.dnz_chr_id
1105     AND    rgpb.cle_id     = cleb.id
1106     AND    cleb.dnz_chr_id = p_chr_id
1107     AND    rgpb.rgd_code   = 'LALEVL'
1108     AND    rulb.rgp_id     = rgpb.id
1109     AND    rulb.rule_information_category  = 'LASLH'
1110     AND    TO_CHAR(styb.id)                = rulb.object1_id1
1111     AND    rulb2.object2_id1                = TO_CHAR(rulb.id)
1112     AND    rulb2.rgp_id                    = rgpb.id
1113     AND    rulb2.rule_information_category = 'LASLL'
1114     AND    styb.STREAM_TYPE_PURPOSE = p_stream_purpose_code
1115     ORDER BY kle_id, start_date, level_periods;
1116 
1117 TYPE payment_rec_type IS RECORD (kle_id NUMBER,
1118   start_date VARCHAR2(450),
1119   number_of_periods VARCHAR2(450),
1120   stub_days VARCHAR2(450),
1121   stub_amount VARCHAR2(450),
1122   advance_or_arrears VARCHAR2(450)
1123 );
1124 
1125 TYPE payment_table IS TABLE OF payment_rec_type INDEX BY BINARY_INTEGER;
1126 
1127 l_payment_table payment_table;
1128 l_payment_table2 payment_table;
1129 l_payment_table_counter NUMBER;
1130 l_limit NUMBER := 10000;
1131 l_prev_kle_id NUMBER;
1132 l_num_schedules NUMBER;
1133 schedule_mismatch EXCEPTION;
1134 l_start_date DATE;
1135 l_number_of_periods NUMBER;
1136 l_stub_days NUMBER;
1137 l_advance_or_arrears VARCHAR2(30);
1138 
1139 PROCEDURE print_tab(p_table IN l_tbl_type) IS
1140 BEGIN
1141  NULL;
1142  FOR i IN p_table.first..p_table.last
1143  LOOP
1144   IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1145       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'i='||i || '->kle_id='|| p_table(i).kle_id);
1146   END IF;
1147   FOR j IN p_table(i).l_payment_details.first..p_table(i).l_payment_details.last
1148   LOOP
1149     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1150           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'-->j=' || j );
1151       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'------>start_date=' || p_table(i).l_payment_details(j).start_date);
1152       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'------>number_of_periods=' || p_table(i).l_payment_details(j).number_of_periods);
1153       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'------>stub_days=' || p_table(i).l_payment_details(j).stub_days);
1154       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'------>stub_amount=' || p_table(i).l_payment_details(j).stub_amount);
1155       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'------>advance_or_arrears=' || p_table(i).l_payment_details(j).advance_or_arrears);
1156     END IF;
1157   END LOOP;
1158  END LOOP;
1159 END;
1160 
1161 PROCEDURE print_payment_orig_table(p_table IN payment_table) IS
1162 BEGIN
1163  NULL;
1164  IF (p_table.COUNT > 0) THEN
1165  FOR i IN p_table.first..p_table.last
1166  LOOP
1167   IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1168       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'i='||i || '->kle_id='|| p_table(i).kle_id);
1169       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'start_date=' || p_table(i).start_date);
1170       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'number_of_periods=' || p_table(i).number_of_periods);
1171       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'stub_days=' || p_table(i).stub_days);
1172       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'stub_amount=' || p_table(i).stub_amount);
1173       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'advance_or_arrears=' || p_table(i).advance_or_arrears);
1174   END IF;
1175  END LOOP;
1176  END IF;
1177 END;
1178 
1179 BEGIN
1180   x_return_status := Okl_Api.G_RET_STS_SUCCESS;
1181   l_payment_table_counter := 1;
1182   OPEN l_payment_lines_csr;
1183   LOOP
1184     FETCH l_payment_lines_csr BULK COLLECT INTO l_payment_table2 LIMIT l_limit;
1185     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1186           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_payment_table2.count=' || l_payment_table2.COUNT);
1187     END IF;
1188     IF (l_payment_table2.COUNT > 0) THEN
1189       FOR i IN l_payment_table2.FIRST..l_payment_table2.LAST
1190       LOOP
1191         l_payment_table(l_payment_table_counter) := l_payment_table2(i);
1192         l_payment_table_counter := l_payment_table_counter + 1;
1193       END LOOP;
1194     ELSE
1195       EXIT;
1196     END IF;
1197   END LOOP;
1198   CLOSE l_payment_lines_csr;
1199   IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1200       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_payment_table_counter=' || l_payment_table_counter);
1201   END IF;
1202   print_payment_orig_table(l_payment_table);
1203 
1204   IF (l_payment_table.COUNT > 0) THEN
1205     -- Prepare formatted table from l_payment_table
1206     l_pmnt_tab_counter := 0;
1207     l_payment_details_counter := 1;
1208     l_prev_kle_id := 0;
1209 
1210     FOR i IN l_payment_table.first..l_payment_table.last
1211     LOOP
1212       IF (l_prev_kle_id <> l_payment_table(i).kle_id) THEN
1213         l_pmnt_tab_counter := l_pmnt_tab_counter + 1;
1214         l_payment_details_counter := 1;
1215         l_pmnt_tab(l_pmnt_tab_counter).kle_id := l_payment_table(i).kle_id;
1216 
1217         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).start_date := Fnd_Date.canonical_to_date(l_payment_table(i).start_date);
1218         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).number_of_periods := l_payment_table(i).number_of_periods;
1219         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).stub_days := l_payment_table(i).stub_days;
1220         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).stub_amount := l_payment_table(i).stub_amount;
1221         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).advance_or_arrears := l_payment_table(i).advance_or_arrears;
1222 
1223         l_prev_kle_id := l_payment_table(i).kle_id;
1224         l_payment_details_counter := l_payment_details_counter + 1;
1225       ELSE
1226         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).start_date := Fnd_Date.canonical_to_date(l_payment_table(i).start_date);
1227         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).number_of_periods := l_payment_table(i).number_of_periods;
1228         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).stub_days := l_payment_table(i).stub_days;
1229         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).stub_amount := l_payment_table(i).stub_amount;
1230         l_pmnt_tab(l_pmnt_tab_counter).l_payment_details(l_payment_details_counter).advance_or_arrears := l_payment_table(i).advance_or_arrears;
1231 
1232         l_prev_kle_id := l_payment_table(i).kle_id;
1233         l_payment_details_counter := l_payment_details_counter + 1;
1234       END IF;
1235     END LOOP;
1236 
1237     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1238           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'Now Printing l_pmnt_tab...');
1239     END IF;
1240     print_tab(l_pmnt_tab);
1241 
1242     -- Check only if there are at least two asset lines
1243     IF (l_pmnt_tab.COUNT > 1) THEN
1244 
1245       l_num_schedules := l_pmnt_tab(1).l_payment_details.COUNT;
1246       IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1247               OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_num_schedules=' || l_num_schedules);
1248       END IF;
1249       FOR i IN 2..l_pmnt_tab.LAST
1250       LOOP
1251         IF (l_num_schedules <> l_pmnt_tab(i).l_payment_details.COUNT) THEN
1252           RAISE schedule_mismatch;
1253         END IF;
1254       END LOOP;
1255 
1256 
1257       FOR j IN l_pmnt_tab(1).l_payment_details.first..l_pmnt_tab(1).l_payment_details.last
1258       LOOP
1259         l_start_date := l_pmnt_tab(1).l_payment_details(j).start_date;
1260         l_number_of_periods := l_pmnt_tab(1).l_payment_details(j).number_of_periods;
1261         l_stub_days := l_pmnt_tab(1).l_payment_details(j).stub_days;
1262         l_advance_or_arrears := l_pmnt_tab(1).l_payment_details(j).advance_or_arrears;
1263         FOR i IN 2..l_pmnt_tab.LAST
1264         LOOP
1265           IF (Fnd_Date.canonical_to_date(l_start_date) <> Fnd_Date.canonical_to_date(l_pmnt_tab(i).l_payment_details(j).start_date)) OR
1266              (NVL(l_number_of_periods,0) <> NVL(l_pmnt_tab(i).l_payment_details(j).number_of_periods,0)) OR
1267              (NVL(l_stub_days,0) <> NVL(l_pmnt_tab(i).l_payment_details(j).stub_days,0)) OR
1268              (NVL(l_advance_or_arrears,'N') <> NVL(l_pmnt_tab(i).l_payment_details(j).advance_or_arrears,'N')) THEN
1269 
1270             RAISE schedule_mismatch;
1271           END IF;
1272         END LOOP; -- i
1273       END LOOP; -- j
1274     END IF;
1275 
1276   END IF;
1277 
1278 EXCEPTION
1279   WHEN schedule_mismatch
1280   THEN
1281     x_return_status := Okl_Api.G_RET_STS_ERROR;
1282     Okl_Api.set_message(
1283          p_app_name => G_APP_NAME,
1284          p_msg_name => p_message_name);
1285   WHEN OTHERS
1286   THEN
1287     x_return_status := Okl_Api.G_RET_STS_ERROR;
1288     Okl_Api.set_message(
1289          p_app_name => G_APP_NAME,
1290          p_msg_name => p_message_name);
1291 
1292 END;
1293 
1294 
1295 
1296   -- Start of comments
1297   --
1298   -- Procedure Name  : check_payment_type
1299   -- Description     :
1300   -- Business Rules  :
1301   -- Parameters      :
1302   -- Version         : 1.0
1303   -- End of comments
1304 
1305   /* AKP -- Commented out for OKL.H: drop0. */
1306   PROCEDURE check_payment_type(
1307     x_return_status            OUT NOCOPY VARCHAR2,
1308     p_chr_id                   IN  NUMBER
1309   ) IS
1310 
1311     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1312     l_dummy VARCHAR2(1) := '?';
1313     l_count NUMBER := 0;
1314     l_row_notfound BOOLEAN;
1315     l_token VARCHAR2(2000);
1316     x_msg_count NUMBER;
1317     x_msg_data VARCHAR2(2000);
1318     x_pdt_parameter_rec  Okl_Setupproducts_Pub.pdt_parameters_rec_type;
1319 
1320 
1321     -- gboomina modified for Bug 6329395 - Start
1322     CURSOR c_contract_name ( p_id VARCHAR2 ) IS
1323     SELECT contract_number
1324     FROM okc_k_headers_v WHERE id = p_id;
1325     l_contract_number OKC_K_HEADERS_ALL_B.CONTRACT_NUMBER%TYPE;
1326     -- gboomina modified for Bug 6329395 - End
1327 
1328     -- Bug 5114815
1329     CURSOR contract_start_date_csr(p_id NUMBER) IS
1330     SELECT start_date
1331     FROM   okc_k_headers_b
1332     WHERE  id = p_id;
1333     l_contract_start_date DATE;
1334 
1335     l_hdr     l_hdr_csr%ROWTYPE;
1336     l_txl     l_txl_csr%ROWTYPE;
1337     l_txd     l_txd_csr%ROWTYPE;
1338     l_itm     l_itms_csr%ROWTYPE;
1339     l_struct_rec l_struct_csr%ROWTYPE;
1340     l_structure  NUMBER;
1341     l_rl_rec1 l_rl_csr1%ROWTYPE;
1342     i NUMBER;
1343 
1344 
1345     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
1346     l_supp_rec supp_csr%ROWTYPE;
1347     l_lne l_lne_csr%ROWTYPE;
1348     l_fee_strm_type_rec  fee_strm_type_csr%ROWTYPE;
1349     l_strm_name_rec strm_name_csr%ROWTYPE;
1350 
1351     l_inflow_defined_yn VARCHAR2(1);
1352     l_outflow_defined_yn VARCHAR2(1);
1353 
1354     l_deal_type VARCHAR2(30);
1355     l_interest_calculation_basis VARCHAR2(30);
1356     l_revenue_recognition_method VARCHAR2(30);
1357     l_rent_payment_found BOOLEAN := FALSE;
1358     l_principal_payment_found BOOLEAN := FALSE;
1359     l_pricing_engine VARCHAR2(30);
1360     l_payment_in_advance BOOLEAN := FALSE;
1361     l_rent_payment_in_advance BOOLEAN := FALSE;
1362     l_prin_payment_in_advance BOOLEAN := FALSE;
1363     l_int_payment_in_advance BOOLEAN := FALSE;
1364     l_loan_start_date DATE := NULL;
1365     l_variable_start_date DATE := NULL;
1366     l_loan_periods NUMBER := NULL;
1367     l_variable_periods NUMBER := NULL;
1368     l_payment_date DATE;
1369     l_payment_date2 DATE;
1370     l_line_ind NUMBER;
1371     l_base_rate_defined BOOLEAN := FALSE;
1372     l_var_int_schedule_defined BOOLEAN := FALSE;
1373 
1374     CURSOR l_pmnt_strm_hdr(
1375                    rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
1376                    rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
1377                    chrId NUMBER) IS
1378     SELECT crg.cle_id,
1379            crl.id,
1380            stty.stream_type_purpose,
1381            crl.object1_id1,
1382            crl.RULE_INFORMATION1,
1383            crl.RULE_INFORMATION2,
1384            crl.RULE_INFORMATION3,
1385            crl.RULE_INFORMATION4,
1386            crl.RULE_INFORMATION5,
1387            crl.RULE_INFORMATION6,
1388            crl.RULE_INFORMATION10,
1389            crl.RULE_INFORMATION11
1390     FROM   OKC_RULE_GROUPS_B crg,
1391            OKC_RULES_B crl,
1392            OKL_STRM_TYPE_B stty
1393     WHERE  stty.id = crl.object1_id1
1394            AND stty.stream_type_purpose IN (
1395              'RENT', 'PRINCIPAL_PAYMENT', 'VARIABLE_INTEREST_SCHEDULE',
1396              'LOAN_PAYMENT'
1397            )
1398            AND crl.rgp_id = crg.id
1399            AND crg.RGD_CODE = rgcode
1400            AND crl.RULE_INFORMATION_CATEGORY = rlcat
1401            AND crg.dnz_chr_id = chrId;
1402 
1403   l_pmnt_strm_hdr_rec l_pmnt_strm_hdr%ROWTYPE;
1404 
1405     CURSOR l_pmnt_strm_check(
1406                    rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
1407                    rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
1408                    pmnt_strm_purpose OKL_STRM_TYPE_B.STREAM_TYPE_PURPOSE%TYPE,
1409                    chrId NUMBER) IS
1410     SELECT crg.cle_id,
1411            crl.id,
1412            crl.object1_id1,
1413            crl.RULE_INFORMATION1,
1414            crl.RULE_INFORMATION2,
1415            crl.RULE_INFORMATION3,
1416            crl.RULE_INFORMATION4,
1417            crl.RULE_INFORMATION5,
1418            crl.RULE_INFORMATION6,
1419            crl.RULE_INFORMATION10,
1420            crl.RULE_INFORMATION11
1421     FROM   OKC_RULE_GROUPS_B crg,
1422            OKC_RULES_B crl,
1423            OKL_STRM_TYPE_B stty
1424     WHERE  stty.id = crl.object1_id1
1425            AND stty.stream_type_purpose = pmnt_strm_purpose
1426            AND crl.rgp_id = crg.id
1427            AND crg.RGD_CODE = rgcode
1428            AND crl.RULE_INFORMATION_CATEGORY = rlcat
1429            AND crg.dnz_chr_id = chrId;
1430 
1431     CURSOR l_pmnt_strm_check2(
1432                    rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
1433                    rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
1434                    pmnt_strm_purpose OKL_STRM_TYPE_B.STREAM_TYPE_PURPOSE%TYPE,
1435                    chrId NUMBER) IS
1436     SELECT crg.cle_id,
1437            crl.id,
1438            crl.object1_id1,
1439            crl.RULE_INFORMATION1,
1440            crl.RULE_INFORMATION2,
1441            crl.RULE_INFORMATION3,
1442            crl.RULE_INFORMATION4,
1443            crl.RULE_INFORMATION5,
1444            crl.RULE_INFORMATION6,
1445            crl.RULE_INFORMATION10,
1446            crl.RULE_INFORMATION11
1447     FROM   OKC_RULE_GROUPS_B crg,
1448            OKC_RULES_B crl,
1449            OKL_STRM_TYPE_B stty
1450     WHERE  stty.id = crl.object1_id1
1451            AND stty.stream_type_purpose = pmnt_strm_purpose
1452            AND crl.rgp_id = crg.id
1453            AND crg.RGD_CODE = rgcode
1454            AND crl.RULE_INFORMATION_CATEGORY = rlcat
1455            AND crg.dnz_chr_id = chrId;
1456 
1457   l_pmnt_strm_check_rec l_pmnt_strm_check%ROWTYPE;
1458   l_pmnt_strm_check_rec2 l_pmnt_strm_check2%ROWTYPE;
1459     CURSOR l_pmnt_lns_in_hdr(p_id OKC_RULES_B.ID%TYPE, chrId NUMBER) IS
1460     SELECT
1461     crl2.object1_id1,
1462     crl2.object1_id2,
1463     crl2.rule_information2,
1464     NVL(crl2.rule_information3,0) rule_information3,
1465     crl2.rule_information4,
1466     crl2.rule_information5,
1467     crl2.rule_information6,
1468     crl2.rule_information7,
1469     crl2.rule_information8,
1470     crl2.rule_information10
1471     FROM   OKC_RULES_B crl1, OKC_RULES_B crl2
1472     WHERE crl1.id = crl2.object2_id1
1473     AND crl1.id = p_id
1474     AND crl2.RULE_INFORMATION_CATEGORY = 'LASLL'
1475     AND crl1.RULE_INFORMATION_CATEGORY = 'LASLH'
1476     AND crl1.dnz_chr_id = chrId
1477     AND crl2.dnz_chr_id = chrId
1478     ORDER BY crl2.rule_information2 ASC;
1479 
1480     CURSOR l_pmnt_lns_in_hdr2(p_id OKC_RULES_B.ID%TYPE, chrId NUMBER) IS
1481     SELECT
1482     crl2.object1_id1,
1483     crl2.object1_id2,
1484     crl2.rule_information2,
1485     NVL(crl2.rule_information3,0) rule_information3,
1486     crl2.rule_information4,
1487     crl2.rule_information5,
1488     crl2.rule_information6,
1489     crl2.rule_information7,
1490     crl2.rule_information8,
1491     crl2.rule_information10
1492     FROM   OKC_RULES_B crl1, OKC_RULES_B crl2
1493     WHERE crl1.id = crl2.object2_id1
1494     AND crl1.id = p_id
1495     AND crl2.RULE_INFORMATION_CATEGORY = 'LASLL'
1496     AND crl1.RULE_INFORMATION_CATEGORY = 'LASLH'
1497     AND crl1.dnz_chr_id = chrId
1498     AND crl2.dnz_chr_id = chrId
1499     ORDER BY crl2.rule_information2 ASC;
1500 
1501     l_pmnt_lns_in_hdr_rec l_pmnt_lns_in_hdr%ROWTYPE;
1502     l_pmnt_lns_in_hdr_rec2 l_pmnt_lns_in_hdr2%ROWTYPE;
1503 
1504     CURSOR cust_print_lead_days_csr(p_id NUMBER) IS
1505       SELECT term.printing_lead_days
1506          FROM  okc_k_headers_b khr
1507               ,hz_customer_profiles cp
1508               ,ra_terms_b term
1509          WHERE khr.id = p_id
1510          AND khr.bill_to_site_use_id = cp.site_use_id
1511          AND cp.standard_terms = term.term_id;
1512     l_cust_print_lead_days NUMBER := null;
1513 
1514     CURSOR rate_delay_csr(p_id NUMBER) IS
1515       SELECT TO_NUMBER(RULE_INFORMATION3)
1516       FROM OKC_RULES_B RULE,
1517            OKC_RULE_GROUPS_B RGP
1518       WHERE RGP.ID = RULE.RGP_ID
1519       AND   RGP.DNZ_CHR_ID = p_id
1520       AND   RGD_CODE = 'LABILL'
1521       AND   RULE_INFORMATION_CATEGORY = 'LAINVD';
1522 
1523    -- Fix for bug 7131756: Added columns captital_reduction,
1524    --                      capitalize_down_payment_yn,
1525    --                      capital_reduction_percent, OEC
1526    CURSOR oec_csr (p_id NUMBER) IS
1527    SELECT a.capital_amount capital_amount,
1528           b.name asset_number,
1529 	  capital_reduction,
1530           NVL(capitalize_down_payment_yn,'N') capitalize_down_payment_yn,
1531           capital_reduction_percent,
1532 	  oec,
1533           e.ste_code ste_code -- 5264170
1534    FROM   OKL_K_LINES a,
1535           OKC_K_LINES_TL b,
1536           OKC_LINE_STYLES_V C,
1537           OKC_K_LINES_B d,
1538           OKC_STATUSES_B e
1539    WHERE  a.ID = p_id
1540    AND    a.ID = b.ID
1541    AND    b.LANGUAGE = USERENV('LANG')
1542    AND    c.lty_code ='FREE_FORM1'
1543    AND    d.ID = p_ID
1544    AND    d.lse_id = c.id
1545    AND    d.sts_code = e.code;
1546 
1547     l_rate_delay NUMBER := null;
1548     l_rent_start_date DATE;
1549     l_rent_periods NUMBER;
1550     l_principal_start_date DATE;
1551     l_principal_periods NUMBER;
1552     l_curr_cle_id NUMBER;
1553     l_tot_principal_payment NUMBER;
1554     l_capital_amount OKL_K_LINES.CAPITAL_AMOUNT%TYPE;
1555     l_oec_amount OKL_K_LINES.OEC%TYPE;
1556     l_capital_reduction OKL_K_LINES.CAPITAL_REDUCTION%TYPE;
1557     l_capital_reduction_percent OKL_K_LINES.CAPITAL_REDUCTION_PERCENT%TYPE;
1558     l_capitalize_down_payment_yn OKL_K_LINES.CAPITALIZE_DOWN_PAYMENT_YN%TYPE;
1559     l_asset_number OKC_K_LINES_TL.NAME%TYPE;
1560     l_ste_code OKC_STATUSES_B.STE_CODE%TYPE;
1561 
1562     line_ind NUMBER;
1563     ind NUMBER;
1564     l_global_total_periods NUMBER;
1565     l_line_total_periods NUMBER;
1566     l_pmnt_lns_in_hdr_rec_comp l_pmnt_lns_in_hdr%ROWTYPE;
1567     l_pmnt_lns_in_hdr_rec      l_pmnt_lns_in_hdr%ROWTYPE;
1568     l_min_start_date DATE;
1569     l_mismatch_exception EXCEPTION;
1570     l_global_min_start_date DATE;
1571     l_loop_counter NUMBER;
1572     l_pmnt_type VARCHAR2(200);
1573 
1574     l_tot_unsched_prin_payment NUMBER;
1575     -- gboomina Bug 6401848 - Start
1576     l_net_subsidy_amount NUMBER;
1577     -- gboomina Bug 6401848 - End
1578 	l_non_cap_down_payment_amount NUMBER;
1579 
1580     FUNCTION tot_unsched_prin_payment(
1581                                       x_return_status OUT NOCOPY VARCHAR2,
1582                                       p_chr_id IN NUMBER,
1583                                       p_kle_id IN NUMBER) RETURN NUMBER IS
1584     l_tot_amount NUMBER := 0;
1585     BEGIN
1586       IF (G_DEBUG_ENABLED = 'Y') THEN
1587         G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
1588       END IF;
1589      x_return_status := Okl_Api.G_RET_STS_SUCCESS;
1590      IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1591             OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In tot_unsched_prin_payment: 0...');
1592      END IF;
1593      --print('In tot_unsched_prin_payment: p_chr_id= ' || p_chr_id || ' p_kle_id=' || p_kle_id);
1594      FOR l_pmnt_strm_check_rec2 IN l_pmnt_strm_check2('LALEVL','LASLH','UNSCHEDULED_PRINCIPAL_PAYMENT', p_chr_id)
1595      LOOP
1596        --print('In tot_unsched_prin_payment: 1...');
1597        IF (l_pmnt_strm_check_rec2.cle_id = p_kle_id) THEN
1598        --print('In tot_unsched_prin_payment: 2...');
1599          FOR l_pmnt_lns_in_hdr_rec2 IN l_pmnt_lns_in_hdr2(l_pmnt_strm_check_rec2.id ,p_chr_id)
1600          LOOP
1601        --print('In tot_unsched_prin_payment: 3...');
1602            l_tot_amount := l_tot_amount + NVL(l_pmnt_lns_in_hdr_rec2.rule_information8,0);
1603          END LOOP;
1604        END IF;
1605      END LOOP;
1606      --print('Out of main FOR LOOP...');
1607      RETURN(l_tot_amount);
1608 
1609      EXCEPTION WHEN OTHERS THEN
1610        --print('Exception In tot_unsched_prin_payment...sqlcode=' || sqlcode || ' sqlerrm=' || sqlerrm);
1611        x_return_status := Okl_Api.G_RET_STS_ERROR;
1612        RETURN(0);
1613     END; -- tot_unsched_prin_payment
1614 
1615   BEGIN
1616 
1617     -- initialize return status
1618     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
1619 
1620     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1621           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type...');
1622     END IF;
1623 
1624     Okl_K_Rate_Params_Pvt.get_product(
1625       p_api_version         => 1,
1626       p_init_msg_list       => Okc_Api.G_FALSE,
1627       x_return_status       => x_return_status,
1628       x_msg_count           => x_msg_count,
1629       x_msg_data            => x_msg_data,
1630       p_khr_id              => p_chr_id,
1631       x_pdt_parameter_rec   => x_pdt_parameter_rec);
1632 
1633     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1634           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:After get_product...x_return_status='||x_return_status);
1635     END IF;
1636     IF (x_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
1637        Okc_Api.set_message(
1638                            p_app_name     => G_APP_NAME,
1639                            p_msg_name     => G_PROD_PARAMS_NOT_FOUND,
1640                            p_token1       => G_PROD_NAME_TOKEN ,
1641                            p_token1_value => l_deal_type);
1642       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1643     END IF;
1644 
1645     l_deal_type := x_pdt_parameter_rec.deal_type;
1646     l_interest_calculation_basis := x_pdt_parameter_rec.interest_calculation_basis;
1647     l_revenue_recognition_method := x_pdt_parameter_rec.revenue_recognition_method;
1648 
1649     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1650           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before l_pmnt_strm_hdr_rec...x_return_status='||x_return_status);
1651     END IF;
1652     FOR l_pmnt_strm_hdr_rec IN l_pmnt_strm_hdr ( 'LALEVL', 'LASLH', p_chr_id )
1653     LOOP
1654 
1655        FOR l_pmnt_lns_in_hdr_rec IN l_pmnt_lns_in_hdr(l_pmnt_strm_hdr_rec.id ,p_chr_id)
1656         LOOP
1657         IF ( l_pmnt_strm_hdr_rec.stream_type_purpose = 'RENT' ) THEN
1658           l_rent_payment_found := TRUE;
1659           IF (NVL(l_pmnt_lns_in_hdr_rec.rule_information10,'N') = 'N') THEN
1660             l_payment_in_advance := TRUE;
1661             l_rent_payment_in_advance := TRUE;
1662           END IF;
1663           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1664                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'Before assigning l_rent_start_date....');
1665           END IF;
1666           l_rent_start_date := Fnd_Date.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
1667           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1668                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_rent_start_date=' || l_rent_start_date);
1669           END IF;
1670           l_rent_periods := l_pmnt_lns_in_hdr_rec.rule_information3;
1671           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1672                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_rent_periods=' || l_rent_periods);
1673           END IF;
1674         ELSIF ( l_pmnt_strm_hdr_rec.stream_type_purpose = 'PRINCIPAL_PAYMENT' ) THEN
1675           l_principal_payment_found := TRUE;
1676           IF (NVL(l_pmnt_lns_in_hdr_rec.rule_information10,'N') = 'N') THEN
1677             l_payment_in_advance := TRUE;
1678             l_prin_payment_in_advance := TRUE;
1679           END IF;
1680           l_principal_start_date := Fnd_Date.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
1681           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1682                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_principal_start_date=' || l_principal_start_date);
1683           END IF;
1684           l_principal_periods := l_pmnt_lns_in_hdr_rec.rule_information3;
1685           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1686                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_principal_periods=' || l_principal_periods);
1687           END IF;
1688         ELSIF ( l_pmnt_strm_hdr_rec.stream_type_purpose = 'LOAN_PAYMENT' ) THEN
1689           l_loan_start_date := Fnd_Date.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
1690           l_loan_periods := l_hdrrl_rec.rule_information3;
1691         ELSIF ( l_pmnt_strm_hdr_rec.stream_type_purpose = 'VARIABLE_INTEREST_SCHEDULE' ) THEN
1692           l_var_int_schedule_defined := TRUE;
1693           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1694                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'Before assigning l_variable_start_date....');
1695           END IF;
1696           l_variable_start_date := Fnd_Date.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
1697           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1698                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_variable_start_date = ' || l_variable_start_date);
1699           END IF;
1700           l_variable_periods := l_pmnt_lns_in_hdr_rec.rule_information3;
1701           IF (NVL(l_pmnt_lns_in_hdr_rec.rule_information10,'N') = 'N') THEN
1702             l_payment_in_advance := TRUE;
1703             l_int_payment_in_advance := TRUE;
1704           END IF;
1705         END IF;
1706 
1707         -- Bug 4547537 Begin
1708         IF ( l_pmnt_strm_hdr_rec.stream_type_purpose IN
1709              ( 'RENT', 'LOAN_PAYMENT', 'PRINCIPAL_PAYMENT' ) ) THEN
1710           IF ( TRUNC(NVL(l_pmnt_lns_in_hdr_rec.rule_information5,'-1')) <> '0')
1711           THEN
1712             -- non Level
1713             IF (l_pmnt_lns_in_hdr_rec.rule_information7 IS NOT NULL AND
1714                 l_pmnt_lns_in_hdr_rec.rule_information8 IS NOT NULL ) THEN
1715 
1716                Okl_Api.set_message(
1717                     p_app_name     => G_APP_NAME,
1718                     p_msg_name     => 'OKL_QA_PAYMENT_STUB_NA');
1719               x_return_status := Okl_Api.G_RET_STS_ERROR;
1720             END IF;
1721           END IF;
1722         END IF;
1723         -- Bug 4547537 End
1724 
1725       END LOOP;
1726     END LOOP;
1727 
1728     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1729           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before first check...x_return_status='||x_return_status);
1730     END IF;
1731     -- Both RENT and PRINCIPAL_PAYMENT not allowed
1732     IF (l_rent_payment_found AND l_principal_payment_found) THEN
1733        Okl_Api.set_message(
1734                     p_app_name     => G_APP_NAME,
1735                     p_msg_name     => 'OKL_LA_VAR_RATE_PAYMENT');
1736        x_return_status := Okl_Api.G_RET_STS_ERROR;
1737     END IF;
1738     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1739           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before second check...x_return_status='||x_return_status);
1740     END IF;
1741    -- If payment in advance, check rate delays > print lead days
1742    IF (l_payment_in_advance) THEN
1743      NULL; -- Todo: AKP
1744      IF (l_deal_type = 'LOAN' AND
1745        l_interest_calculation_basis = 'FLOAT' AND
1746        l_revenue_recognition_method IN ('ESTIMATED_AND_BILLED', 'ACTUAL')) THEN
1747        Okl_Api.set_message(
1748                     p_app_name     => G_APP_NAME,
1749                     p_msg_name     => 'OKL_LA_VAR_RATE_ADVANCE',
1750                     p_token1       => 'DEAL_TYPE',
1751                     p_token1_value => l_deal_type,
1752                     p_token2       => 'ICB',
1753                     p_token2_value => l_interest_calculation_basis);
1754        x_return_status := Okl_Api.G_RET_STS_ERROR;
1755      END IF;
1756 
1757      -- 4918119: For REAMORT contracts, advance payment is not allowed
1758      -- Disable this QA check: 5114544
1759      IF (l_interest_calculation_basis = 'REAMORT') THEN
1760        IF (l_deal_type IN ('LEASEOP', 'LEASEST', 'LEASEDF') ) THEN
1761          NULL;
1762        ELSE
1763          Okl_Api.set_message(
1764                     p_app_name     => G_APP_NAME,
1765                     p_msg_name     => 'OKL_LA_VAR_RATE_ADVANCE',
1766                     p_token1       => 'DEAL_TYPE',
1767                     p_token1_value => l_deal_type,
1768                     p_token2       => 'ICB',
1769                     p_token2_value => l_interest_calculation_basis);
1770          x_return_status := Okl_Api.G_RET_STS_ERROR;
1771        END IF;
1772      END IF;
1773     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1774           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before rate_delay_csr...');
1775     END IF;
1776      -- get rate delay (rule group/rule)
1777      OPEN rate_delay_csr(p_chr_id);
1778      FETCH rate_delay_csr INTO l_rate_delay;
1779      CLOSE rate_delay_csr;
1780 
1781     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1782           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before print_lead_csr...');
1783     END IF;
1784      -- get cust print lead days
1785      OPEN  cust_print_lead_days_csr(p_chr_id);
1786      FETCH cust_print_lead_days_csr INTO l_cust_print_lead_days;
1787      CLOSE cust_print_lead_days_csr;
1788 
1789      -- gboomina modified for Bug 6329395 - Start
1790      OPEN  c_contract_name(p_chr_id);
1791      FETCH c_contract_name INTO l_contract_number;
1792      CLOSE c_contract_name;
1793      -- gboomina modified for Bug 6329395 - End
1794 
1795      -- udhenuko bug#6786775
1796      -- Added an if condition in OKL_QA_DATA_INTEGRITY.check_payment_type to throw the error message
1797      --for contracts having Interest Calculation Method NOT EQUAL TO Fixed and Revenue Recognition Method NOT EQUAL TO
1798      --'STREAMS' for cases where print lead day value used in payment terms is greater than Rate delay.
1799      IF l_interest_calculation_basis <> 'FIXED'
1800           AND l_revenue_recognition_method <> 'STREAMS'
1801      THEN
1802        IF ((l_rate_delay IS NOT NULL AND l_cust_print_lead_days IS NOT NULL) AND
1803           (l_rate_delay <= l_cust_print_lead_days)) THEN
1804            Okl_Api.set_message(
1805                     p_app_name     => G_APP_NAME,
1806                     p_msg_name     => 'OKL_LLA_VAR_RATE_RATE_DELAY',
1807                     p_token1       => 'CONT_ID',
1808                     p_token1_value => l_contract_number);
1809            x_return_status := Okl_Api.G_RET_STS_ERROR;
1810          END IF;
1811        END IF;
1812      END IF;
1813      -- udhenuko End bug#6786775
1814 
1815     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1816           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before third check...x_return_status='||x_return_status);
1817     END IF;
1818    -- If Principal payment is defined, check if base_rate defined
1819    IF (l_principal_payment_found) THEN
1820      --print('Yes, Principal payment found: Checking base rate...');
1821      Okl_K_Rate_Params_Pvt.check_base_rate(
1822                              p_khr_id => p_chr_id,
1823                              x_base_rate_defined => l_base_rate_defined,
1824                              x_return_status => l_return_status);
1825 
1826      --print('l_return_status=' || l_return_status);
1827      IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
1828        x_return_status := l_return_status;
1829        RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1830      END IF;
1831 
1832      IF NOT(l_base_rate_defined) THEN
1833        -- 4907390
1834        Okl_Api.set_message(Okc_Api.G_APP_NAME, G_REQUIRED_VALUE,
1835                            G_COL_NAME_TOKEN, 'Base Rate');
1836        /*OKL_API.set_message(
1837                     p_app_name     => G_APP_NAME,
1838                     p_msg_name     => 'OKL_LLA_VAR_RATE_BASE_MISSING',
1839                     p_token1       => 'CONT_ID',
1840                     p_token1_value => p_chr_id); */
1841        x_return_status := Okl_Api.G_RET_STS_ERROR;
1842      --ELSE
1843        --print('base_rate defined...');
1844      END IF;
1845    END IF;
1846 
1847      IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1848        	    OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before fourth check...x_return_status='||x_return_status);
1849      END IF;
1850 	   -- Bug 4674139
1851 	   -- Check if variable interest schedule is defined for LOAN FLOAT
1852 	   IF (l_deal_type = 'LOAN' AND
1853 	       l_interest_calculation_basis = 'FLOAT' ) OR
1854 	      -- Bug 4742650 (do it for LOAN-REVOLVING also)
1855 	      (l_deal_type = 'LOAN-REVOLVING' AND
1856 	       l_interest_calculation_basis = 'FLOAT' ) THEN
1857 	     IF NOT(l_var_int_schedule_defined) THEN
1858         IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1859           	       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'Var Int Schedule Not Defined...');
1860         END IF;
1861 	       Okl_Api.set_message(
1862 			    p_app_name     => G_APP_NAME,
1863 			    p_msg_name     => 'OKL_LA_VAR_SCHEDULED_ALLOWED');
1864 	       x_return_status := Okl_Api.G_RET_STS_ERROR;
1865 	     ELSE
1866         IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1867           	       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'Var Int Schedule Defined...');
1868         END IF;
1869 	     END IF;
1870 	   ELSE -- Bug 4742650 (Do not allow var int sched for other type of contracts)
1871 	     IF (l_var_int_schedule_defined) THEN
1872 	       Okl_Api.set_message(
1873 			    p_app_name     => G_APP_NAME,
1874 			    p_msg_name     => 'OKL_LLA_VAR_RATE_SCHEDULE_NA');
1875 	       x_return_status := Okl_Api.G_RET_STS_ERROR;
1876 	     END IF;
1877 	   END IF;
1878 
1879      IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1880        	    OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before fifth check...x_return_status='||x_return_status);
1881      END IF;
1882    -- Bug 4886871
1883    -- Check if variable interest schedule is same as loan payment schedule
1884    /*
1885    IF (l_deal_type = 'LOAN' AND
1886        l_interest_calculation_basis = 'FLOAT' AND
1887        l_revenue_recognition_method = 'ACTUAL') THEN
1888      NULL;
1889      print('l_variable_start_date=' || l_variable_start_date);
1890      print('l_rent_start_date=' || l_rent_start_date);
1891      print('l_principal_start_date=' || l_principal_start_date);
1892      print('l_variable_periods=' || l_variable_periods);
1893      print('l_rent_periods=' || l_rent_periods);
1894      print('l_principal_periods=' || l_principal_periods);
1895      IF ((l_rent_start_date = l_variable_start_date AND
1896           l_rent_periods = l_variable_periods ) OR
1897          (l_principal_start_date = l_variable_start_date AND
1898           l_principal_periods = l_variable_periods )) THEN
1899        NULL;
1900      ELSE
1901        OKL_API.set_message(
1902                     p_app_name     => G_APP_NAME,
1903                     p_msg_name     => 'OKL_LLA_VAR_RATE_SCHEDULE',
1904                     p_token1       => 'CONT_ID',
1905                     p_token1_value => p_chr_id);
1906        x_return_status := OKL_API.G_RET_STS_ERROR;
1907      END IF;
1908    END IF;
1909    */
1910 
1911    -- Bug 5114815
1912    IF (l_deal_type = 'LOAN' AND
1913        l_interest_calculation_basis = 'FLOAT' ) OR
1914       (l_deal_type = 'LOAN-REVOLVING' AND
1915        l_interest_calculation_basis = 'FLOAT' )  THEN
1916      FOR l_cnt_start_date IN contract_start_date_csr(p_chr_id)
1917      LOOP
1918        l_contract_start_date := l_cnt_start_date.start_date;
1919      END LOOP;
1920      IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1921             OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_contract_start_date=' || l_contract_start_date);
1922      END IF;
1923      IF (l_variable_start_date <> l_contract_start_date) THEN
1924        OKL_API.set_message(
1925                     p_app_name     => G_APP_NAME,
1926                     p_msg_name     => 'OKL_LLA_VAR_RATE_SCHEDULE2');
1927        x_return_status := OKL_API.G_RET_STS_ERROR;
1928      END IF;
1929    END IF;
1930 
1931     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1932           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before sixth check...x_return_status='||x_return_status);
1933     END IF;
1934    -- Check same payment date for all assets (RENT currently)
1935    -- Commented this check from here and copied from check_variable_rate_old
1936    /*
1937    IF (l_deal_type = 'LOAN' AND
1938        l_interest_calculation_basis = 'REAMORT') THEN
1939 
1940      FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH','RENT',p_chr_id)
1941      LOOP
1942        l_line_ind := 0;
1943        FOR l_pmnt_lns_in_hdr_rec IN l_pmnt_lns_in_hdr(l_pmnt_strm_check_rec.id ,p_chr_id)
1944        Loop
1945          If ( l_line_ind = 0 ) Then
1946            l_payment_date := FND_DATE.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
1947            print('l_payment_date=' || l_payment_date);
1948            l_line_ind := 1;
1949          ELSE
1950            l_payment_date2 := FND_DATE.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
1951            print('l_payment_date2=' || l_payment_date2);
1952            IF (l_payment_date <> l_payment_date2) THEN
1953              OKL_API.set_message(
1954                     p_app_name     => G_APP_NAME,
1955                     p_msg_name     => 'OKL_LLA_VAR_RATE_PAYMENT_DATE',
1956                     p_token1       => 'CONT_ID',
1957                     p_token1_value => p_chr_id,
1958                     p_token2       => 'PAYMENT_TYPE',
1959                     p_token2_value => 'RENT');
1960              x_return_status := OKL_API.G_RET_STS_ERROR;
1961            END IF;
1962          End If;
1963        END Loop;
1964      END LOOP;
1965    END IF;
1966    */
1967 
1968     /*
1969     -- Bug 4865431
1970     -------------------------------------------------------------
1971     --Reamort Rent stream processing start for Variable rate Contracts.
1972     -------------------------------------------------------------
1973    IF (l_deal_type = 'LOAN' AND
1974        l_interest_calculation_basis = 'REAMORT') THEN
1975 
1976      FOR l_loop_counter IN 1..2
1977      LOOP
1978 
1979         IF (l_loop_counter = 1) THEN
1980           l_pmnt_type := 'RENT';
1981         ELSE
1982           l_pmnt_type := 'PRINCIPAL_PAYMENT';
1983         END IF;
1984 
1985         ind := 0;
1986         l_global_total_periods := 0;
1987         l_line_total_periods := 0;
1988         --FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH','RENT',p_chr_id)
1989         FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH',l_pmnt_type,p_chr_id)
1990         LOOP
1991         BEGIN
1992           line_ind := 0;
1993           FOR l_pmnt_lns_in_hdr_rec IN l_pmnt_lns_in_hdr(l_pmnt_strm_check_rec.id ,p_chr_id)
1994           Loop
1995             If ( ind = 0 ) Then
1996               ind := 1;
1997               l_pmnt_lns_in_hdr_rec_comp := l_pmnt_lns_in_hdr_rec;
1998               -- global min start date is start date for first payment line for that SLH
1999               l_global_min_start_date := FND_DATE.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
2000               print('l_global_min_start_date=' || l_global_min_start_date);
2001             End If;
2002             If (line_ind = 0) Then
2003               l_min_start_date := FND_DATE.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
2004               print('l_min_start_date=' || l_min_start_date);
2005               line_ind := 1;
2006               l_line_total_periods := l_pmnt_lns_in_hdr_rec.rule_information3;
2007             Else
2008               l_line_total_periods := l_line_total_periods + l_pmnt_lns_in_hdr_rec.rule_information3;
2009             End If;
2010             print('l_line_total_periods=' || l_line_total_periods);
2011             If( l_pmnt_lns_in_hdr_rec.rule_information7 IS NULL
2012               AND l_pmnt_lns_in_hdr_rec.rule_information8 IS NULL) Then
2013               If( nvl(l_pmnt_lns_in_hdr_rec.rule_information10,'N') <> 'Y') Then
2014                 RAISE l_mismatch_exception;
2015               End If;
2016               If (ind = 0) Then
2017                 null;--dont compare two records as we are at first record now.
2018               Else
2019                 If ( l_global_min_start_date
2020                        <> l_min_start_date
2021                      OR l_pmnt_lns_in_hdr_rec_comp.rule_information4
2022                        <> l_pmnt_lns_in_hdr_rec.rule_information4
2023                      OR l_pmnt_lns_in_hdr_rec_comp.object1_id1
2024                        <> l_pmnt_lns_in_hdr_rec.object1_id1
2025                      OR l_pmnt_lns_in_hdr_rec_comp.object1_id2
2026                        <> l_pmnt_lns_in_hdr_rec.object1_id2 ) Then
2027                   x_return_status := OKL_API.G_RET_STS_ERROR;
2028                   RAISE l_mismatch_exception;
2029                 End If;
2030               End If;
2031             End If;
2032           End Loop;
2033           -- the sum of all SLL periods across all SLH's should match.
2034           If (l_global_total_periods = 0 ) Then
2035             l_global_total_periods := l_line_total_periods;
2036           Elsif(l_global_total_periods <> l_line_total_periods) Then
2037                RAISE l_mismatch_exception;
2038           END IF;
2039         EXCEPTION WHEN l_mismatch_exception Then
2040           x_return_status := OKL_API.G_RET_STS_ERROR;
2041           --message
2042           OKL_API.set_message(
2043                   p_app_name     => G_APP_NAME,
2044                   p_msg_name     => 'OKL_QA_VARINT_SLL_MISMATCH');
2045         END;
2046         END LOOP;
2047         IF l_pmnt_lns_in_hdr%ISOPEN THEN
2048           CLOSE l_pmnt_lns_in_hdr;
2049         END IF;
2050         IF l_pmnt_strm_check%ISOPEN THEN
2051           CLOSE l_pmnt_strm_check;
2052         END IF;
2053       END LOOP;
2054     END IF;
2055     -------------------------------------------------------------
2056     --End REAMORT processing for rent streams for variable rate contracts.
2057     -------------------------------------------------------------
2058    */
2059 
2060     -- Bug 4865431
2061     -------------------------------------------------------------
2062     --Reamort Rent stream processing start for Variable rate Contracts.
2063     -------------------------------------------------------------
2064    IF (l_deal_type = 'LOAN' AND
2065        l_interest_calculation_basis = 'REAMORT') THEN
2066      check_payment_schedule(
2067            x_return_status => l_return_status,  -- 4907390
2068            p_chr_id => p_chr_id,
2069            p_stream_purpose_code => 'RENT',
2070            p_message_name => 'OKL_QA_VARINT_SLL_MISMATCH');
2071      IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN -- 4907390
2072        x_return_status := l_return_status;
2073      END IF;
2074 
2075 	  --veramach bug 6389295 start
2076  	  IF (l_revenue_recognition_method <> 'STREAMS') then
2077  	  --veramach bug 6389295 end
2078      check_payment_schedule(
2079            x_return_status => l_return_status,  -- 4907390
2080            p_chr_id => p_chr_id,
2081            p_stream_purpose_code => 'PRINCIPAL_PAYMENT',
2082            p_message_name => 'OKL_QA_VARINT_SLL_MISMATCH');
2083      IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN -- 4907390
2084        x_return_status := l_return_status;
2085      END IF;
2086 	  --veramach bug 6389295 start
2087  	  END IF;
2088  	  --veramach bug 6389295 end
2089 
2090    END IF;
2091 
2092 
2093    -- Check same payment date for all assets (PRINCIPAL_PAYMENT currently)
2094    -- FoR LOAN and REAMORT only
2095    -- Also check if principal amount is same as asset capital amount
2096    /*IF (l_deal_type = 'LOAN' AND
2097        l_interest_calculation_basis = 'REAMORT') THEN */
2098 
2099     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2100           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before seventh check...x_return_status='||x_return_status);
2101     END IF;
2102      --FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH','PRINCIPAL_PAYMENT',p_chr_id)
2103      FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH','PRINCIPAL_PAYMENT', p_chr_id)
2104      LOOP
2105        l_line_ind := 0;
2106        l_tot_principal_payment := 0;
2107        l_curr_cle_id := l_pmnt_strm_check_rec.cle_id;
2108        FOR l_pmnt_lns_in_hdr_rec IN l_pmnt_lns_in_hdr(l_pmnt_strm_check_rec.id ,p_chr_id)
2109        LOOP
2110          -- Check same payment date for LOAN REAMORT only
2111          /*
2112          IF (l_deal_type = 'LOAN' AND
2113              l_interest_calculation_basis = 'REAMORT') THEN
2114            If ( l_line_ind = 0 ) Then
2115              l_payment_date := FND_DATE.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
2116              l_line_ind := 1;
2117            ELSE
2118              l_payment_date2 := FND_DATE.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
2119              IF (l_payment_date <> l_payment_date2) THEN
2120                OKL_API.set_message(
2121                     p_app_name     => G_APP_NAME,
2122                     p_msg_name     => 'OKL_LLA_VAR_RATE_PAYMENT_DATE',
2123                     p_token1       => 'CONT_ID',
2124                     p_token1_value => p_chr_id,
2125                     p_token2       => 'PAYMENT_TYPE',
2126                     p_token2_value => 'PRINCIPAL_PAYMENT');
2127                x_return_status := OKL_API.G_RET_STS_ERROR;
2128              END IF;
2129            END IF;
2130          END IF; */
2131 
2132          -- Now get the running principal amount
2133 
2134          l_tot_principal_payment := l_tot_principal_payment +
2135               NVL(l_pmnt_lns_in_hdr_rec.rule_information3,0) * NVL(l_pmnt_lns_in_hdr_rec.rule_information6, 0) +
2136               NVL(l_pmnt_lns_in_hdr_rec.rule_information8, 0);
2137            --print('Inside: rule_information3=' || l_pmnt_lns_in_hdr_rec.rule_information3);
2138            --print('Inside: rule_information6=' || l_pmnt_lns_in_hdr_rec.rule_information6);
2139            --print('Inside: rule_information8=' || l_pmnt_lns_in_hdr_rec.rule_information8);
2140            --print('Inside: l_tot_principal_payment=' || l_tot_principal_payment);
2141 
2142        END LOOP;
2143 
2144        FOR r IN oec_csr(l_curr_cle_id)
2145        LOOP
2146              l_capital_amount := r.capital_amount;
2147              l_asset_number := r.asset_number;
2148              l_ste_code := r.ste_code; -- 5264170
2149 	     -- Fix for bug 7131756
2150        	     l_oec_amount := r.oec;
2151 	     l_capital_reduction := r.capital_reduction;
2152 	     l_capital_reduction_percent := r.capital_reduction_percent;
2153 	     l_capitalize_down_payment_yn := r.capitalize_down_payment_yn;
2154        END LOOP;
2155 
2156        IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2157                 OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_asset_number=' || l_asset_number || ' l_capital_amount=' || l_capital_amount);
2158        END IF;
2159        -- 5264170
2160        IF l_ste_code NOT IN ('CANCELLED','TERMINATED','HOLD','EXPIRED') THEN
2161        IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2162                 OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_tot_principal_payment=' || l_tot_principal_payment);
2163        END IF;
2164        -- Now get total unscheduled principal payment for this line, if any
2165        -- 4887014
2166        l_tot_unsched_prin_payment :=
2167                        tot_unsched_prin_payment(l_return_status, -- 4907390
2168                                          p_chr_id, l_curr_cle_id);
2169        IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2170                 OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_tot_unsched_prin_payment=' || l_tot_unsched_prin_payment);
2171        END IF;
2172 
2173        -- gboomina Bug 6401848 - Start
2174        -- 4898747
2175        Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount(
2176             p_api_version                  => 1.0,
2177             p_init_msg_list                => Okl_Api.G_FALSE,
2178             x_return_status                => l_return_status,
2179             x_msg_count                    => x_msg_count,
2180             x_msg_data                     => x_msg_data,
2181             p_asset_cle_id                 => l_curr_cle_id,
2182             p_accounting_method            => 'NET',
2183             x_subsidy_amount               => l_net_subsidy_amount);
2184 
2185        IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2186                 OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_net_subsidy_amount=' || l_net_subsidy_amount);
2187          OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'l_return_status=' || l_return_status);
2188        END IF;
2189 	   -- Fix for Bug 7131756
2190 	   l_non_cap_down_payment_amount := 0;
2191 	   IF (l_capitalize_down_payment_yn = 'N') THEN
2192 	      IF (l_capital_reduction IS NOT NULL) THEN
2193 	        l_non_cap_down_payment_amount := l_capital_reduction;
2194 	      ELSIF (l_capital_reduction_percent IS NOT NULL) THEN
2195 		    l_non_cap_down_payment_amount := l_capital_reduction_percent/100*l_oec_amount;
2196 	      END IF;
2197 	   END IF;
2198        /* IF (ABS(l_capital_amount -  l_net_subsidy_amount -  -- 4898747
2199              (l_tot_principal_payment+l_tot_unsched_prin_payment)) > 0.01) OR
2200           (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN -- 4907390 */
2201 	   IF (ABS(l_capital_amount - l_non_cap_down_payment_amount  -  -- 7131756
2202              (l_tot_principal_payment+l_tot_unsched_prin_payment)) > 0.01) THEN
2203              Okl_Api.set_message(
2204                     p_app_name     => G_APP_NAME,
2205                     p_msg_name     => 'OKL_QA_PRIN_MISMATCH');
2206              x_return_status := Okl_Api.G_RET_STS_ERROR;
2207        END IF;
2208        -- gboomina Bug 6401848 - End
2209        END IF;
2210        l_tot_principal_payment := 0;
2211 
2212      END LOOP;
2213 
2214    IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2215         OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'Before get_pricing_engine...x_return_status='||x_return_status);
2216    END IF;
2217    Okl_Streams_Util.get_pricing_engine(p_khr_id => p_chr_id,
2218                                        x_pricing_engine => l_pricing_engine,
2219                                        x_return_status => l_return_status);
2220    IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
2221      x_return_status := l_return_status;
2222      RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2223    END IF;
2224 
2225     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2226           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before eighth check...x_return_status='||x_return_status);
2227     END IF;
2228     IF (l_deal_type IN ('LEASEOP', 'LEASEST', 'LEASEDF') ) AND
2229        (l_interest_Calculation_basis IN ('FIXED', 'REAMORT', 'FLOAT_FACTORS'))
2230     THEN
2231       IF NOT(l_rent_payment_found) THEN
2232                 Okl_Api.set_message(
2233                   p_app_name     => G_APP_NAME,
2234                   p_msg_name     => 'OKL_LLA_VAR_RATE_RENT_MISSING');
2235                 x_return_status := Okl_Api.G_RET_STS_ERROR;
2236                 --return;
2237       ELSE -- RENT defined
2238         -- Bug 4748524
2239         IF (l_interest_calculation_basis = 'FLOAT_FACTORS') AND
2240            (l_rent_payment_in_advance) THEN
2241           Okl_Api.set_message(
2242                   p_app_name     => G_APP_NAME,
2243                   p_msg_name     => 'OKL_LLA_VAR_RATE_ARREARS_1');
2244           x_return_status := Okl_Api.G_RET_STS_ERROR;
2245         END IF;
2246       END IF;
2247       IF (l_principal_payment_found) THEN
2248                 Okl_Api.set_message(
2249                   p_app_name     => G_APP_NAME,
2250                   p_msg_name     => 'OKL_LLA_VAR_RATE_PRIN_ERROR');
2251                 x_return_status := Okl_Api.G_RET_STS_ERROR;
2252                 --return;
2253       END IF;
2254     END IF;
2255 
2256     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2257           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before ninth check...x_return_status='||x_return_status);
2258     END IF;
2259     IF (((l_deal_type = 'LOAN') AND
2260          (l_interest_Calculation_basis IN
2261           ('FIXED', 'FLOAT', 'CATCHUP/CLEANUP')))  OR
2262         ((l_deal_type = 'LOAN') AND
2263          (l_interest_Calculation_basis = 'REAMORT')))
2264     THEN
2265       IF NOT(l_rent_payment_found) THEN
2266         IF (l_principal_payment_found) THEN
2267           IF (l_pricing_engine <> 'EXTERNAL') THEN
2268                   Okl_Api.set_message(
2269                     p_app_name     => G_APP_NAME,
2270                     --p_msg_name     => 'OKL_LLA_VAR_RATE_PRIN_MISSING');
2271                     p_msg_name     => 'OKL_LLA_VAR_RATE_PRIN_ISG');
2272                   x_return_status := Okl_Api.G_RET_STS_ERROR;
2273                   --return;
2274           END IF;
2275         ELSE
2276                 Okl_Api.set_message(
2277                   p_app_name     => G_APP_NAME,
2278                   p_msg_name     => 'OKL_LLA_VAR_RATE_RENT_MISSING');
2279                 x_return_status := Okl_Api.G_RET_STS_ERROR;
2280                 --return;
2281         END IF;
2282       END IF;
2283       /*IF (l_principal_payment_found) THEN
2284         IF (l_pricing_engine <> 'EXTERNAL') THEN
2285                 OKL_API.set_message(
2286                   p_app_name     => G_APP_NAME,
2287                   --p_msg_name     => 'OKL_LLA_VAR_RATE_PRIN_MISSING');
2288                   p_msg_name     => 'OKL_LLA_VAR_RATE_PRIN_ISG');
2289                 x_return_status := OKL_API.G_RET_STS_ERROR;
2290                 return;
2291         END IF;*/
2292       /*ELSE
2293         IF (l_pricing_engine = 'INTERNAL') THEN
2294                 OKL_API.set_message(
2295                   p_app_name     => G_APP_NAME,
2296                   p_msg_name     => 'OKL_LLA_VAR_RATE_PRIN_ISG');
2297                 x_return_status := OKL_API.G_RET_STS_ERROR;
2298                 return;
2299         END IF;*/
2300       /*END IF;*/
2301     END IF;
2302 
2303     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2304           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'In Check Payment Type:Before tenth check...x_return_status='||x_return_status);
2305     END IF;
2306     IF ((l_deal_type = 'LOAN-REVONVING' ) AND
2307         (l_interest_Calculation_basis = 'FLOAT'))
2308     THEN
2309       IF (l_rent_payment_found) THEN
2310                 Okl_Api.set_message(
2311                   p_app_name     => G_APP_NAME,
2312                   p_msg_name     => 'OKL_LLA_VAR_RATE_RENT_ERROR');
2313                 x_return_status := Okl_Api.G_RET_STS_ERROR;
2314                 --return;
2315       END IF;
2316       IF (l_principal_payment_found) THEN
2317                 Okl_Api.set_message(
2318                   p_app_name     => G_APP_NAME,
2319                   p_msg_name     => 'OKL_LLA_VAR_RATE_PRIN_ERROR');
2320                 x_return_status := Okl_Api.G_RET_STS_ERROR;
2321                 RETURN;
2322       END IF;
2323     END IF;
2324 
2325   IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2326       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'Before exitting: x_return_status=' || x_return_status);
2327   END IF;
2328   IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
2329       Okl_Api.set_message(
2330         p_app_name      => G_APP_NAME,
2331         p_msg_name      => G_QA_SUCCESS);
2332   END IF;
2333 
2334 
2335   EXCEPTION
2336 
2337   WHEN G_EXCEPTION_HALT_VALIDATION THEN
2338     -- no processing necessary; validation can continue with next column
2339     IF l_rl_csr1%ISOPEN THEN
2340       CLOSE l_rl_csr1;
2341     END IF;
2342   WHEN OTHERS THEN
2343     -- store SQL error message on message stack
2344     Okl_Api.SET_MESSAGE(
2345       p_app_name        => G_APP_NAME,
2346       p_msg_name        => G_UNEXPECTED_ERROR,
2347       p_token1	        => G_SQLCODE_TOKEN,
2348       p_token1_value    => SQLCODE,
2349       p_token2          => G_SQLERRM_TOKEN,
2350       p_token2_value    => SQLERRM);
2351     -- notify caller of an error as UNEXPETED error
2352     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
2353     -- verify that cursor was closed
2354     IF l_lne_csr%ISOPEN THEN
2355       CLOSE l_lne_csr;
2356     END IF;
2357     IF l_hdr_csr%ISOPEN THEN
2358       CLOSE l_hdr_csr;
2359     END IF;
2360     IF l_txl_csr%ISOPEN THEN
2361       CLOSE l_txl_csr;
2362     END IF;
2363 
2364   END check_payment_type;
2365 
2366   -- Start of comments
2367   --
2368   -- Procedure Name  : check_variable_rate
2369   -- Description     :
2370   -- Business Rules  :
2371   -- Parameters      :
2372   -- Version         : 1.0
2373   -- End of comments
2374 
2375 PROCEDURE check_variable_rate(
2376     x_return_status            OUT NOCOPY VARCHAR2,
2377     p_chr_id                   IN  NUMBER
2378 ) IS
2379 x_msg_count NUMBER;
2380 x_msg_data VARCHAR2(2000);
2381 l_return_status VARCHAR2(1);
2382 
2383 BEGIN
2384   IF (G_DEBUG_ENABLED = 'Y') THEN
2385     G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
2386   END IF;
2387   x_return_status := Okl_Api.G_RET_STS_SUCCESS;
2388 
2389   IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2390       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'Before calling validate_k_rate_params...');
2391   END IF;
2392   Okl_K_Rate_Params_Pvt.validate_k_rate_params(
2393     p_api_version    => 1,
2394     p_init_msg_list  => Okl_Api.G_FALSE,
2395     x_return_status  => x_return_status,
2396     x_msg_count      => x_msg_count,
2397     x_msg_data       => x_msg_data,
2398     p_khr_id         => p_chr_id,
2399     p_validate_flag  => 'F');
2400 
2401   IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2402       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'After validate_k_rate_params x_return_status=' || x_return_status);
2403   END IF;
2404   IF (x_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
2405     --RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2406     --RAISE OKL_API.G_EXCEPTION_HALT_VALIDATION;
2407     x_return_status := Okl_Api.G_RET_STS_ERROR;
2408   END IF;
2409 
2410   l_return_status := Okl_Api.G_RET_STS_SUCCESS;
2411   check_payment_type(
2412     x_return_status   => l_return_status,
2413     p_chr_id          => p_chr_id);
2414   IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
2415       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,'After check_payment_type l_return_status=' || l_return_status);
2416   END IF;
2417 
2418   IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
2419     --RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2420     RAISE G_EXCEPTION_HALT_VALIDATION;
2421   END IF;
2422 
2423   EXCEPTION
2424 
2425   WHEN G_EXCEPTION_HALT_VALIDATION THEN
2426     NULL;
2427     x_return_status := Okl_Api.G_RET_STS_ERROR;
2428     -- Close cursors if still open
2429   WHEN OTHERS THEN
2430     -- store SQL error message on message stack
2431     Okl_Api.SET_MESSAGE(
2432       p_app_name        => G_APP_NAME,
2433       p_msg_name        => G_UNEXPECTED_ERROR,
2434       p_token1	        => G_SQLCODE_TOKEN,
2435       p_token1_value    => SQLCODE,
2436       p_token2          => G_SQLERRM_TOKEN,
2437       p_token2_value    => SQLERRM);
2438     -- notify caller of an error as UNEXPETED error
2439     --x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
2440     x_return_status := Okl_Api.G_RET_STS_ERROR;
2441     -- verify that cursor was closed
2442 
2443 END check_variable_rate;
2444 
2445 /* -- AKP: Commented out for OKL.H drop0. */
2446 
2447   -- Start of comments
2448   --
2449   -- Procedure Name  : check_variable_rate_old
2450   -- Description     :
2451   -- Business Rules  :
2452   -- Parameters      :
2453   -- Version         : 1.0
2454   -- End of comments
2455 
2456   PROCEDURE check_variable_rate_old(
2457     x_return_status            OUT NOCOPY VARCHAR2,
2458     p_chr_id                   IN  NUMBER
2459   ) IS
2460 
2461     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
2462 
2463     l_hdr_rec l_hdr_csr%ROWTYPE;
2464     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
2465     index_rec index_csr%ROWTYPE;
2466     index_date DATE;
2467     index_name VARCHAR2(256);
2468     var_meth VARCHAR2(256);
2469     calc_meth VARCHAR2(256);
2470     l_deal_type VARCHAR2(256);
2471 
2472 --Bug#3931587
2473     CURSOR l_pmnt_strm_check(rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
2474                        rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
2475                        --pmnt_strm_name OKL_STRMTYP_SOURCE_V.NAME%TYPE,
2476                        pmnt_strm_purpose OKL_STRM_TYPE_B.STREAM_TYPE_PURPOSE%TYPE,
2477                        chrId NUMBER) IS
2478     SELECT crg.cle_id,
2479            crl.id,
2480            crl.object1_id1,
2481            crl.RULE_INFORMATION1,
2482            crl.RULE_INFORMATION2,
2483            crl.RULE_INFORMATION3,
2484            crl.RULE_INFORMATION4,
2485            crl.RULE_INFORMATION5,
2486            crl.RULE_INFORMATION6,
2487            crl.RULE_INFORMATION10,
2488            crl.RULE_INFORMATION11
2489     FROM   OKC_RULE_GROUPS_B crg,
2490            OKC_RULES_B crl,
2491            OKL_STRM_TYPE_B stty
2492     WHERE  stty.id = crl.object1_id1
2493            --and stty.code = pmnt_strm_name
2494            AND stty.stream_type_purpose = pmnt_strm_purpose
2495            AND crl.rgp_id = crg.id
2496            AND crg.RGD_CODE = rgcode
2497            AND crl.RULE_INFORMATION_CATEGORY = rlcat
2498            AND crg.dnz_chr_id = chrId;
2499   l_pmnt_strm_check_rec l_pmnt_strm_check%ROWTYPE;
2500     CURSOR l_pmnt_lns_in_hdr(p_id OKC_RULES_B.ID%TYPE, chrId NUMBER) IS
2501     SELECT
2502     crl2.object1_id1,
2503     crl2.object1_id2,
2504     crl2.rule_information2,
2505     NVL(crl2.rule_information3,0) rule_information3,
2506     crl2.rule_information4,
2507     crl2.rule_information5,
2508     crl2.rule_information6,
2509     crl2.rule_information7,
2510     crl2.rule_information8,
2511     crl2.rule_information10
2512     FROM   OKC_RULES_B crl1, OKC_RULES_B crl2
2513     WHERE crl1.id = crl2.object2_id1
2514     AND crl1.id = p_id
2515     AND crl2.RULE_INFORMATION_CATEGORY = 'LASLL'
2516     AND crl1.RULE_INFORMATION_CATEGORY = 'LASLH'
2517     AND crl1.dnz_chr_id = chrId
2518     AND crl2.dnz_chr_id = chrId
2519     ORDER BY crl2.rule_information2 ASC;
2520 
2521     l_pmnt_lns_in_hdr_rec l_pmnt_lns_in_hdr%ROWTYPE;
2522 -- this record is required to compare the different records in cursor loop
2523     l_pmnt_lns_in_hdr_rec_comp l_pmnt_lns_in_hdr%ROWTYPE;
2524     variable_int_yn VARCHAR2(256);
2525     ind NUMBER;
2526     l_no_pmnt_lns_found  NUMBER;
2527     line_ind NUMBER;
2528     l_global_min_start_date DATE;
2529     l_min_start_date DATE;
2530     l_global_total_periods NUMBER;
2531     l_line_total_periods NUMBER;
2532     l_mismatch_exception EXCEPTION;
2533     l_variable_int_yn BOOLEAN;
2534     l_var_rate_reamort_exception EXCEPTION;
2535     l_invalid_combination EXCEPTION;
2536     l_loan_rev_var_rate EXCEPTION;
2537     l_process_formula_exception EXCEPTION;
2538 
2539     --Bug#3877032
2540     CURSOR l_hdr_csr1(chrid OKL_K_HEADERS.KHR_ID%TYPE) IS
2541         SELECT CHR.SCS_CODE,
2542                CHR.START_DATE,
2543                CHR.END_DATE,
2544                CHR.DATE_SIGNED,
2545                CHR.CURRENCY_CODE,
2546                CHR.TEMPLATE_YN,
2547                CHR.contract_number,
2548                khr.accepted_date,
2549                khr.syndicatable_yn,
2550                khr.DEAL_TYPE,
2551                khr.term_duration term,
2552 	       NVL(pdt.reporting_pdt_id, -1) report_pdt_id
2553         FROM OKC_K_HEADERS_B CHR,
2554 	     OKL_K_HEADERS khr,
2555 	     OKL_PRODUCTS_V pdt
2556         WHERE CHR.id = chrid
2557            AND CHR.id = khr.id
2558 	   --AND khr.pdt_id = pdt.id(+);
2559 	   AND khr.pdt_id = pdt.id;
2560 
2561     l_hdr_rec1 l_hdr_csr1%ROWTYPE;
2562     lx_return_status  VARCHAR2(1);
2563 
2564     PROCEDURE l_formula_processing(x_return_status  OUT NOCOPY VARCHAR2,
2565                                    p_chr_id IN  OKC_K_HEADERS_B.ID%TYPE) IS
2566     BEGIN
2567       -- initialize return status
2568       x_return_status := Okl_Api.G_RET_STS_SUCCESS;
2569       ind := 0;
2570       --Bug#3931587
2571       --FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH','VARIABLE INTEREST SCHEDULE',p_chr_id)
2572       --FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH','VARIABLE_INTEREST',p_chr_id)
2573       FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH','VARIABLE_INTEREST_SCHEDULE',p_chr_id)
2574       LOOP
2575         ind := ind + 1;
2576         IF (l_pmnt_strm_check_rec.cle_id IS NOT NULL) THEN
2577           x_return_status := Okl_Api.G_RET_STS_ERROR;
2578           --message
2579           Okl_Api.set_message(
2580                   p_app_name     => G_APP_NAME,
2581                   p_msg_name     => 'OKL_QA_VARINT_LINE_LEVEL');
2582         END IF;
2583         l_no_pmnt_lns_found := 0;
2584         FOR l_pmnt_lns_in_hdr_rec IN l_pmnt_lns_in_hdr(l_pmnt_strm_check_rec.id, p_chr_id)
2585         LOOP
2586           l_no_pmnt_lns_found := l_no_pmnt_lns_found + 1 ;
2587           EXIT WHEN l_pmnt_lns_in_hdr%NOTFOUND;
2588           IF ( l_pmnt_lns_in_hdr_rec.rule_information6 <> 0 ) THEN
2589             x_return_status := Okl_Api.G_RET_STS_ERROR;
2590             --message
2591             Okl_Api.set_message(
2592                   p_app_name     => G_APP_NAME,
2593                   p_msg_name     => 'OKL_QA_VARINT_SLL_AMOUNT');
2594           END IF;
2595           IF ( ( l_hdr_rec.deal_type = 'LOAN' OR l_hdr_rec.deal_type = 'LOAN-REVOLVING')
2596              AND
2597              ( NVL(l_pmnt_lns_in_hdr_rec.rule_information10,'N') = 'N' ) ) THEN
2598             x_return_status := Okl_Api.G_RET_STS_ERROR;
2599             --message
2600             Okl_Api.set_message(
2601                   p_app_name     => G_APP_NAME,
2602                   p_msg_name     => 'OKL_QA_VARINT_ADV');
2603           END IF;
2604         END LOOP;
2605         IF(l_no_pmnt_lns_found = 0) THEN
2606           x_return_status := Okl_Api.G_RET_STS_ERROR;
2607           --message
2608           Okl_Api.set_message(
2609                   p_app_name     => G_APP_NAME,
2610                   p_msg_name     => 'OKL_QA_VARINT_NO_SLL');
2611         END IF;
2612       END LOOP;
2613       IF (ind = 0) THEN
2614         x_return_status := Okl_Api.G_RET_STS_ERROR;
2615         --message
2616         Okl_Api.set_message(
2617               p_app_name     => G_APP_NAME,
2618               p_msg_name     => 'OKL_QA_VARINT_NOT_DEFINED');
2619       END IF;
2620 
2621       --IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
2622       --   OKL_API.set_message(
2623       --    p_app_name      => G_APP_NAME,
2624       --    p_msg_name      => G_QA_SUCCESS);
2625       --END IF;
2626 
2627       IF l_pmnt_lns_in_hdr%ISOPEN THEN
2628         CLOSE l_pmnt_lns_in_hdr;
2629       END IF;
2630       IF l_pmnt_strm_check%ISOPEN THEN
2631         CLOSE l_pmnt_strm_check;
2632       END IF;
2633 
2634     EXCEPTION WHEN OTHERS THEN
2635       IF l_pmnt_lns_in_hdr%ISOPEN THEN
2636         CLOSE l_pmnt_lns_in_hdr;
2637       END IF;
2638       IF l_pmnt_strm_check%ISOPEN THEN
2639        CLOSE l_pmnt_strm_check;
2640       END IF;
2641     END l_formula_processing;
2642 
2643   BEGIN
2644 
2645     -- initialize return status
2646     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
2647 
2648     OPEN l_hdr_csr( p_chr_id );
2649     FETCH l_hdr_csr INTO l_hdr_rec;
2650     CLOSE l_hdr_csr;
2651 
2652     OPEN l_hdrrl_csr( 'LAIIND', 'LAINTP', p_chr_id );
2653     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
2654     -- boolean variable to check if interest rate rule exists and if variable rate is Y
2655     l_variable_int_yn := l_hdrrl_csr%FOUND AND (l_hdrrl_rec.rule_information1 = 'Y');
2656     l_deal_type := l_hdr_rec.deal_type;
2657     CLOSE l_hdrrl_csr;
2658 
2659     OPEN l_hdrrl_csr( 'LAIIND', 'LAIVAR', p_chr_id );
2660     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
2661     IF (l_variable_int_yn) THEN -- dedey
2662        IF ( l_hdrrl_csr%NOTFOUND ) OR
2663           ( l_hdrrl_rec.rule_information1 IS NULL ) OR
2664           ( l_hdrrl_rec.rule_information2 IS NULL )  THEN
2665            Okl_Api.set_message(
2666                  p_app_name     => G_APP_NAME,
2667                  p_msg_name     => 'OKL_QA_NO_VARMETH');
2668            x_return_status := Okl_Api.G_RET_STS_ERROR;
2669        END IF;
2670     END IF;
2671     CLOSE l_hdrrl_csr;
2672     var_meth := l_hdrrl_rec.rule_information1;
2673 
2674     OPEN l_hdrrl_csr( 'LAIIND', 'LAICLC', p_chr_id );
2675     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
2676     CLOSE l_hdrrl_csr;
2677     calc_meth := l_hdrrl_rec.rule_information5;
2678 
2679     -------------------------------------------------------------
2680     --Bug#4018298
2681     --Start variable interest processing based on Product.
2682     -------------------------------------------------------------
2683     BEGIN
2684     IF (l_deal_type = 'LOAN') THEN
2685       IF (l_variable_int_yn ) THEN
2686         IF (var_meth = 'FLOAT' AND calc_meth = 'FORMULA') THEN
2687           l_formula_processing(x_return_status => lx_return_status, p_chr_id => p_chr_id) ;
2688               IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
2689                     x_return_status := lx_return_status;
2690               END IF;
2691         ELSIF (var_meth = 'FIXEDADJUST' AND calc_meth = 'REAMORT') THEN
2692           -- variable interest schedule payments not allowed for reamort.
2693           RAISE l_var_rate_reamort_exception;
2694         ELSE
2695           RAISE l_invalid_combination;
2696         END IF;
2697       ELSIF (NOT l_variable_int_yn ) THEN
2698         --return success
2699         Okl_Api.set_message(
2700             p_app_name      => G_APP_NAME,
2701             p_msg_name      => G_QA_SUCCESS);
2702             RETURN;
2703       END IF;
2704     ELSIF(l_deal_type = 'LOAN-REVOLVING') THEN
2705       IF (l_variable_int_yn) THEN
2706         IF (var_meth = 'FLOAT' AND calc_meth = 'FORMULA') THEN
2707           l_formula_processing(x_return_status => lx_return_status, p_chr_id => p_chr_id) ;
2708               IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
2709                     x_return_status := lx_return_status;
2710               END IF;
2711         ELSE
2712           RAISE l_invalid_combination;
2713         END IF;
2714       ELSIF (NOT l_variable_int_yn ) THEN
2715         RAISE l_loan_rev_var_rate;
2716       END IF;
2717     ELSE -- operating, direct finance, sales type leases
2718       IF (l_variable_int_yn ) THEN
2719         IF (var_meth = 'FIXEDADJUST' AND calc_meth = 'REAMORT') THEN
2720           -- variable interest schedule payments not allowed for reamort.
2721           RAISE l_var_rate_reamort_exception;
2722         ELSE
2723           RAISE l_invalid_combination;
2724         END IF;
2725       ELSIF (NOT l_variable_int_yn ) THEN
2726         --return success
2727         Okl_Api.set_message(
2728             p_app_name      => G_APP_NAME,
2729             p_msg_name      => G_QA_SUCCESS);
2730             RETURN;
2731       END IF;
2732     END IF;
2733     -----------------------------------------------
2734     EXCEPTION
2735     -----------------------------------------------
2736     WHEN l_invalid_combination THEN
2737       x_return_status := Okl_Api.G_RET_STS_ERROR;
2738       Okl_Api.set_message(
2739                 p_app_name     => G_APP_NAME,
2740                 p_msg_name     => 'OKL_QA_VARIABLE_INV_COMB',
2741                 p_token1       => 'VAR_METHOD',
2742                 p_token1_value => var_meth,
2743                 p_token2       => 'CALC_METHOD',
2744                 p_token2_value => calc_meth);
2745     WHEN l_loan_rev_var_rate THEN
2746       x_return_status := Okl_Api.G_RET_STS_ERROR;
2747       Okl_Api.set_message(
2748                 p_app_name     => G_APP_NAME,
2749                 p_msg_name     => 'OKL_QA_LV_VARINT');
2750     WHEN l_var_rate_reamort_exception THEN
2751       --Bug#3365616
2752       --Bug#3554026 checking for scs_code instead of deal_type
2753       IF (l_hdr_rec.scs_code = 'LEASE') THEN
2754         --Bug#3931587
2755         --OPEN l_pmnt_strm_check('LALEVL','LASLH','VARIABLE INTEREST SCHEDULE',p_chr_id);
2756         --OPEN l_pmnt_strm_check('LALEVL','LASLH','VARIABLE_INTEREST',p_chr_id);
2757         OPEN l_pmnt_strm_check('LALEVL','LASLH','VARIABLE_INTEREST_SCHEDULE',p_chr_id);
2758         FETCH l_pmnt_strm_check INTO l_pmnt_strm_check_rec;
2759         IF( l_pmnt_strm_check%FOUND) THEN
2760           Okl_Api.set_message(
2761                p_app_name     => G_APP_NAME,
2762                p_msg_name     => 'OKL_QA_LN_VARINT_REAMORT');
2763           x_return_status := Okl_Api.G_RET_STS_ERROR;
2764         END IF;
2765         CLOSE l_pmnt_strm_check;
2766       END IF;
2767     END;
2768     -------------------------------------------------------------
2769     --End variable interest processing based on Product.
2770     -------------------------------------------------------------
2771 
2772     IF l_pmnt_lns_in_hdr%ISOPEN THEN
2773       CLOSE l_pmnt_lns_in_hdr;
2774     END IF;
2775     IF l_pmnt_strm_check%ISOPEN THEN
2776       CLOSE l_pmnt_strm_check;
2777     END IF;
2778 
2779     -------------------------------------------------------------
2780     --Reamort Rent stream processing start for Variable rate Contracts.
2781     -------------------------------------------------------------
2782     IF (l_variable_int_yn) THEN
2783       IF ( calc_meth  = 'REAMORT' ) THEN
2784 
2785         /*
2786         *--Bug#3369032
2787         *If (l_hdr_rec.deal_type = 'LOAN-REVOLVING') Then
2788         *  OKL_API.set_message(
2789         *          p_app_name     => G_APP_NAME,
2790         *          p_msg_name     => 'OKL_QA_LN_REV_REAMORT');
2791         *  x_return_status := OKL_API.G_RET_STS_ERROR;
2792         *End If;
2793         */
2794 
2795         ind := 0;
2796         l_global_total_periods := 0;
2797         l_line_total_periods := 0;
2798         FOR l_pmnt_strm_check_rec IN l_pmnt_strm_check('LALEVL','LASLH','RENT',p_chr_id)
2799         LOOP
2800         BEGIN
2801           line_ind := 0;
2802           FOR l_pmnt_lns_in_hdr_rec IN l_pmnt_lns_in_hdr(l_pmnt_strm_check_rec.id ,p_chr_id)
2803           LOOP
2804             IF ( ind = 0 ) THEN
2805               ind := 1;
2806               l_pmnt_lns_in_hdr_rec_comp := l_pmnt_lns_in_hdr_rec;
2807               -- global min start date is start date for first payment line for that SLH
2808               l_global_min_start_date := Fnd_Date.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
2809             END IF;
2810             IF (line_ind = 0) THEN
2811               l_min_start_date := Fnd_Date.canonical_to_date(l_pmnt_lns_in_hdr_rec.rule_information2);
2812               line_ind := 1;
2813               l_line_total_periods := l_pmnt_lns_in_hdr_rec.rule_information3;
2814             ELSE
2815               l_line_total_periods := l_line_total_periods + l_pmnt_lns_in_hdr_rec.rule_information3;
2816             END IF;
2817             IF( l_pmnt_lns_in_hdr_rec.rule_information7 IS NULL
2818               AND l_pmnt_lns_in_hdr_rec.rule_information8 IS NULL) THEN
2819               IF( NVL(l_pmnt_lns_in_hdr_rec.rule_information10,'N') <> 'Y') THEN
2820                 RAISE l_mismatch_exception;
2821               END IF;
2822               IF (ind = 0) THEN
2823                 NULL;--dont compare two records as we are at first record now.
2824               ELSE
2825                 IF ( l_global_min_start_date
2826                        <> l_min_start_date
2827                      OR l_pmnt_lns_in_hdr_rec_comp.rule_information4
2828                        <> l_pmnt_lns_in_hdr_rec.rule_information4
2829                      OR l_pmnt_lns_in_hdr_rec_comp.object1_id1
2830                        <> l_pmnt_lns_in_hdr_rec.object1_id1
2831                      OR l_pmnt_lns_in_hdr_rec_comp.object1_id2
2832                        <> l_pmnt_lns_in_hdr_rec.object1_id2 ) THEN
2833                   x_return_status := Okl_Api.G_RET_STS_ERROR;
2834                   RAISE l_mismatch_exception;
2835                 END IF;
2836               END IF;
2837             END IF;
2838           END LOOP;
2839           -- the sum of all SLL periods across all SLH's should match.
2840           IF (l_global_total_periods = 0 ) THEN
2841             l_global_total_periods := l_line_total_periods;
2842           ELSIF(l_global_total_periods <> l_line_total_periods) THEN
2843                RAISE l_mismatch_exception;
2844           END IF;
2845         EXCEPTION WHEN l_mismatch_exception THEN
2846           x_return_status := Okl_Api.G_RET_STS_ERROR;
2847           --message
2848           Okl_Api.set_message(
2849                   p_app_name     => G_APP_NAME,
2850                   p_msg_name     => 'OKL_QA_VARINT_SLL_MISMATCH');
2851         END;
2852         END LOOP;
2853         IF l_pmnt_lns_in_hdr%ISOPEN THEN
2854           CLOSE l_pmnt_lns_in_hdr;
2855         END IF;
2856         IF l_pmnt_strm_check%ISOPEN THEN
2857           CLOSE l_pmnt_strm_check;
2858         END IF;
2859       END IF;
2860     END IF;
2861     -------------------------------------------------------------
2862     --End REAMORT processing for rent streams for variable rate contracts.
2863     -------------------------------------------------------------
2864 
2865    /*
2866     OPEN l_hdrrl_csr( 'LAIIND', 'LAINTP', p_chr_id );
2867     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
2868     If ( l_hdrrl_csr%NOTFOUND ) OR
2869        ( nvl(l_hdrrl_rec.rule_information1, 'N') = 'N' )Then
2870         CLOSE l_hdrrl_csr;
2871         OKL_API.set_message(
2872           p_app_name      => G_APP_NAME,
2873           p_msg_name      => G_QA_SUCCESS);
2874 	return;
2875     End If;
2876 
2877     If (l_hdrrl_rec.RULE_INFORMATION1 = 'Y') AND
2878        (INSTR(l_hdr_rec.deal_type,'LOAN') < 1)  Then
2879         OKL_API.set_message(
2880                   p_app_name     => G_APP_NAME,
2881                   p_msg_name     => 'OKL_QA_VAR_RATE_LN');
2882         x_return_status := OKL_API.G_RET_STS_ERROR;
2883         RAISE G_EXCEPTION_HALT_VALIDATION;
2884     End If;
2885     CLOSE l_hdrrl_csr;
2886    */
2887 
2888     OPEN l_hdrrl_csr( 'LAIIND', 'LAIVAR', p_chr_id );
2889     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
2890     CLOSE l_hdrrl_csr;
2891 
2892     var_meth := l_hdrrl_rec.rule_information1;
2893 
2894     FOR index_rec IN index_csr( TO_NUMBER(l_hdrrl_rec.rule_information2) )
2895     LOOP
2896         index_date := NVL(index_rec.datetime_valid, SYSDATE);
2897 	index_name := index_rec.name;
2898 	EXIT;
2899     END LOOP;
2900 
2901     IF ( TRUNC(l_hdr_rec.start_date) < TRUNC(index_date) ) THEN
2902         Okl_Api.set_message(
2903               p_app_name     => G_APP_NAME,
2904               p_msg_name     => 'OKL_QA_INDEXDATE');
2905         x_return_status := Okl_Api.G_RET_STS_ERROR;
2906     END IF;
2907 
2908     OPEN l_hdrrl_csr( 'LAIIND', 'LAICLC', p_chr_id );
2909     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
2910     IF ( l_hdrrl_csr%NOTFOUND ) OR
2911        ( l_hdrrl_rec.rule_information4 IS NULL ) OR
2912        ( l_hdrrl_rec.rule_information5 IS NULL )  THEN
2913         Okl_Api.set_message(
2914               p_app_name     => G_APP_NAME,
2915               p_msg_name     => 'OKL_QA_NO_VARCLC');
2916         x_return_status := Okl_Api.G_RET_STS_ERROR;
2917     END IF;
2918     CLOSE l_hdrrl_csr;
2919 
2920     calc_meth := l_hdrrl_rec.rule_information5;
2921 
2922     OPEN l_hdr_csr1( p_chr_id );
2923     FETCH l_hdr_csr1 INTO l_hdr_rec1;
2924     CLOSE l_hdr_csr1;
2925 
2926     IF ( TRUNC(l_hdr_rec1.start_date)
2927     > TRUNC(Fnd_Date.canonical_to_date(l_hdrrl_rec.rule_information4)) )
2928     OR
2929     ( TRUNC(l_hdr_rec1.end_date)
2930     < TRUNC(Fnd_Date.canonical_to_date(l_hdrrl_rec.rule_information4)) ) THEN
2931       Okl_Api.set_message(
2932               p_app_name     => G_APP_NAME,
2933               p_msg_name     => 'OKL_QA_INT_START_DATE_EFF');
2934         x_return_status := Okl_Api.G_RET_STS_ERROR;
2935     END IF;
2936 
2937     /*If ( l_hdr_rec.start_date < FND_DATE.canonical_to_date(l_hdrrl_rec.rule_information4) ) Then
2938         OKL_API.set_message(
2939               p_app_name     => G_APP_NAME,
2940               p_msg_name     => 'OKL_QA_CLCDATE');
2941         x_return_status := OKL_API.G_RET_STS_ERROR;
2942     End If;
2943    */
2944 
2945     /*
2946     *If ( var_meth = 'FLOAT' ) AND
2947     *   ( calc_meth <> 'FORMULA') Then
2948     *    OKL_API.set_message(
2949     *          p_app_name     => G_APP_NAME,
2950     *          p_msg_name     => 'OKL_QA_VARFLOAT');
2951     *    x_return_status := OKL_API.G_RET_STS_ERROR;
2952     *End If;
2953     */
2954 
2955 /*
2956     If ( var_meth = 'FLOAT' ) AND
2957        ( calc_meth = 'FORMULA' ) Then
2958 
2959         OPEN l_hdrrl_csr( 'LAIIND', 'LAFORM', p_chr_id );
2960         FETCH l_hdrrl_csr INTO l_hdrrl_rec;
2961         If ( l_hdrrl_csr%NOTFOUND ) OR
2962            ( l_hdrrl_rec.rule_information1 IS NULL )  Then
2963             OKL_API.set_message(
2964                   p_app_name     => G_APP_NAME,
2965                   p_msg_name     => 'OKL_QA_VARNOFORM');
2966             x_return_status := OKL_API.G_RET_STS_ERROR;
2967             RAISE G_EXCEPTION_HALT_VALIDATION;
2968         End If;
2969         CLOSE l_hdrrl_csr;
2970 
2971     End If;
2972 
2973 */
2974 
2975     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
2976         Okl_Api.set_message(
2977           p_app_name      => G_APP_NAME,
2978           p_msg_name      => G_QA_SUCCESS);
2979     END IF;
2980 
2981   EXCEPTION
2982 
2983   WHEN G_EXCEPTION_HALT_VALIDATION THEN
2984     IF l_hdr_csr%ISOPEN THEN
2985       CLOSE l_hdr_csr;
2986     END IF;
2987     IF l_hdrrl_csr%ISOPEN THEN
2988       CLOSE l_hdrrl_csr;
2989     END IF;
2990     -- no processing necessary; validation can continue with next column
2991   WHEN OTHERS THEN
2992     -- store SQL error message on message stack
2993     Okl_Api.SET_MESSAGE(
2994       p_app_name        => G_APP_NAME,
2995       p_msg_name        => G_UNEXPECTED_ERROR,
2996       p_token1	        => G_SQLCODE_TOKEN,
2997       p_token1_value    => SQLCODE,
2998       p_token2          => G_SQLERRM_TOKEN,
2999       p_token2_value    => SQLERRM);
3000     -- notify caller of an error as UNEXPETED error
3001     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
3002     -- verify that cursor was closed
3003     IF l_hdr_csr%ISOPEN THEN
3004       CLOSE l_hdr_csr;
3005     END IF;
3006     IF l_hdrrl_csr%ISOPEN THEN
3007       CLOSE l_hdrrl_csr;
3008     END IF;
3009 
3010   END check_variable_rate_old;
3011 
3012   -- Start of comments
3013   --
3014   -- Procedure Name  : check_prefunding_status
3015   -- Description     :
3016   -- Business Rules  :
3017   -- Parameters      :
3018   -- Version         : 1.0
3019   -- End of comments
3020 
3021   PROCEDURE check_prefunding_status(
3022     x_return_status            OUT NOCOPY VARCHAR2,
3023     p_chr_id                   IN  NUMBER
3024   ) IS
3025 
3026     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
3027     l_dummy VARCHAR2(1) := '?';
3028     l_count NUMBER := 0;
3029     l_row_notfound BOOLEAN;
3030     l_token VARCHAR2(2000);
3031 
3032     -- sjalasut, modified the cursor to refer khr_id from okl_txl_ap_inv_lns_all_b
3033     -- instead of okl_trx_ap_invoices_b. changes made as part of OKLR12B
3034     -- disbursements project
3035     CURSOR l_prefund_csr( chrId NUMBER ) IS
3036     SELECT 'Y'
3037     FROM okl_trx_ap_invoices_b hdr
3038         ,okl_txl_ap_inv_lns_all_b tpl
3039     WHERE hdr.funding_type_code = 'PREFUNDING'
3040       AND hdr.trx_status_code NOT IN ('APPROVED', 'PROCESSED', 'ERROR')
3041       AND hdr.id = tpl.tap_id
3042      	AND tpl.khr_id = chrId;
3043 
3044     l_prefund_yn VARCHAR2(1);
3045 
3046   BEGIN
3047 
3048     -- initialize return status
3049     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
3050 
3051     OPEN l_prefund_csr( p_chr_id );
3052     FETCH l_prefund_csr INTO l_prefund_yn;
3053     IF ( l_prefund_csr%FOUND AND (l_prefund_yn = 'Y')) THEN
3054         Okl_Api.set_message(
3055                   p_app_name     => G_APP_NAME,
3056                   p_msg_name     => 'OKL_QA_PREFUND_MIN');
3057         x_return_status := Okl_Api.G_RET_STS_ERROR;
3058     END IF;
3059     CLOSE l_prefund_csr;
3060 
3061   IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
3062       Okl_Api.set_message(
3063         p_app_name      => G_APP_NAME,
3064         p_msg_name      => G_QA_SUCCESS);
3065   END IF;
3066 
3067 
3068   EXCEPTION
3069 
3070   WHEN G_EXCEPTION_HALT_VALIDATION THEN
3071     IF l_prefund_csr%ISOPEN THEN
3072       CLOSE l_prefund_csr;
3073     END IF;
3074     -- no processing necessary; validation can continue with next column
3075   WHEN OTHERS THEN
3076     -- store SQL error message on message stack
3077     Okl_Api.SET_MESSAGE(
3078       p_app_name        => G_APP_NAME,
3079       p_msg_name        => G_UNEXPECTED_ERROR,
3080       p_token1	        => G_SQLCODE_TOKEN,
3081       p_token1_value    => SQLCODE,
3082       p_token2          => G_SQLERRM_TOKEN,
3083       p_token2_value    => SQLERRM);
3084     -- notify caller of an error as UNEXPETED error
3085     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
3086     -- verify that cursor was closed
3087     IF l_prefund_csr%ISOPEN THEN
3088       CLOSE l_prefund_csr;
3089     END IF;
3090 
3091   END check_prefunding_status;
3092 
3093   -- Bug# 4350255
3094   -- Added Validations for Asset Line Passthrough
3095   -- Start of comments
3096   --
3097   -- Procedure Name  : check_fee_service_ast_pth
3098   -- Description     : Check Passthorugh stream type in ASSET, FEE and SERVICE line.
3099   --                   If it is null, raise error
3100   -- Business Rules  :
3101   -- Parameters      :
3102   -- Version         : 1.0
3103   -- End of comments
3104 
3105   PROCEDURE check_fee_service_ast_pth(
3106     x_return_status            OUT NOCOPY VARCHAR2,
3107     p_chr_id                   IN  NUMBER
3108   ) IS
3109 
3110    --Bug 4917691 fmiao start-----------------------------
3111    --1. If evg hdr is defined, vendor params detail is required
3112    --Find out whether contract evg hdr is existing --
3113    CURSOR evg_hdr_csr (p_chr_id IN NUMBER) IS
3114    SELECT '1'
3115    FROM okl_party_payment_hdr
3116    WHERE dnz_chr_id = p_chr_id
3117    AND cle_id IS NULL;
3118 
3119    l_evg_hdr_exist VARCHAR2(1);
3120 
3121    --Find out all the vendors for the contract
3122    CURSOR chr_vendor_csr (p_chr_id IN NUMBER) IS
3123    SELECT object1_id1, po.vendor_name
3124    FROM okc_k_party_roles_b, po_vendors po
3125    WHERE chr_id = p_chr_id
3126    AND rle_code = 'OKL_VENDOR'
3127    AND po.vendor_id = object1_id1;
3128 
3129    -- Find out whether vendor evg pt params exists
3130    CURSOR evg_dtls_csr (p_vendor_id IN NUMBER, p_chr_id IN NUMBER) IS
3131    SELECT '1'
3132    FROM okl_party_payment_dtls ppy, okl_party_payment_hdr pph
3133    WHERE ppy.vendor_id = p_vendor_id
3134    AND ppy.payment_hdr_id = pph.id
3135    AND pph.dnz_chr_id = p_chr_id
3136    AND pph.cle_id IS NULL;
3137 
3138    l_evg_dtls_exist VARCHAR2(1);
3139 
3140    --2. Check the disb amt not exceed line payment amt --
3141    -- Find out lines for a contract
3142    CURSOR lines_csr(p_chr_id IN NUMBER) IS
3143    SELECT cle.id,cle.name,lse.lty_code
3144    FROM okl_k_lines_full_v cle, okc_line_styles_v lse
3145    WHERE cle.dnz_chr_id = p_chr_id
3146    AND cle.lse_id = lse.id
3147    AND lse.lty_code IN ('FREE_FORM1','FEE','SOLD_SERVICE');
3148 
3149    -- Find out the disb fixed amt for each line for all vendors--
3150    CURSOR disb_amt_csr (p_chr_id IN NUMBER, p_cle_id IN NUMBER,
3151                         p_term IN okl_party_payment_hdr.PASSTHRU_TERM%TYPE) IS
3152    SELECT SUM(ppy.disbursement_fixed_amount)
3153    FROM okl_party_payment_dtls ppy, okl_party_payment_hdr pph
3154    WHERE pph.dnz_chr_id = p_chr_id
3155    AND NVL(pph.cle_id, -9999) = p_cle_id
3156    AND pph.id = ppy.payment_hdr_id
3157 	  AND pph.passthru_term = p_term
3158    GROUP BY ppy.payment_hdr_id;
3159 
3160    -- Find out the disb fixed amt for all vendors on the contract--
3161    CURSOR disb_amt_csr1 (p_chr_id IN NUMBER) IS
3162    SELECT SUM(ppy.disbursement_fixed_amount), pph.passthru_term, pph.payout_basis
3163    FROM okl_party_payment_dtls ppy, okl_party_payment_hdr pph
3164    WHERE pph.dnz_chr_id = p_chr_id
3165    AND pph.cle_id IS NULL
3166    AND pph.id = ppy.payment_hdr_id
3167    GROUP BY ppy.payment_hdr_id,pph.passthru_term, pph.payout_basis;
3168 
3169    l_fixed_amt okl_party_payment_dtls.disbursement_fixed_amount%TYPE;
3170    l_payout_basis okl_party_payment_hdr.payout_basis%TYPE;
3171    l_passthru_term okl_party_payment_hdr.passthru_term%TYPE;
3172 
3173    --Found out payout basis
3174    CURSOR payout_basis_csr (p_chr_id IN NUMBER,p_cle_id IN NUMBER )IS
3175    SELECT pph.passthru_term, pph.payout_basis
3176    FROM okl_party_payment_hdr pph
3177    WHERE pph.dnz_chr_id = p_chr_id
3178    AND pph.cle_id = p_cle_id;
3179 
3180    --Find out the payment info for contract line
3181    CURSOR pymnt_amt_csr (p_chr_id IN NUMBER, p_cle_id IN NUMBER) IS
3182    SELECT Fnd_Date.canonical_to_date(sll.rule_information2) start_date,
3183 	         DECODE(sll.rule_information7, NULL,
3184                  (ADD_MONTHS(Fnd_Date.canonical_to_date(sll.rule_information2),
3185                    NVL(TO_NUMBER(sll.rule_information3),1) *
3186                    DECODE(sll.object1_id1, 'M',1,'Q',3,'S',6,'A',12)) - 1),
3187                  Fnd_Date.canonical_to_date(sll.rule_information2) +
3188                    TO_NUMBER(sll.rule_information7) - 1) end_date,
3189          TO_NUMBER(sll.rule_information6) amount
3190     FROM okc_rules_b sll,
3191          okc_rules_b slh,
3192          okc_rule_groups_b rgp
3193     WHERE rgp.dnz_chr_id = p_chr_id
3194     AND rgp.cle_id = p_cle_id
3195     AND rgp.rgd_code = 'LALEVL'
3196     AND slh.rgp_id = rgp.id
3197     AND slh.rule_information_category = 'LASLH'
3198     AND sll.object2_id1 = slh.id
3199     AND sll.rule_information_category = 'LASLL'
3200     AND sll.rgp_id = rgp.id
3201     AND NVL(sll.rule_information6,0) <> 0
3202     ORDER BY start_date, end_date;
3203 
3204     TYPE amt_type IS TABLE OF okc_rules_b.rule_information6%TYPE;
3205     pymnt_amt amt_type;
3206     TYPE sdate_type IS TABLE OF okc_rules_b.rule_information2%TYPE;
3207     start_date sdate_type;
3208     TYPE edate_type IS TABLE OF okc_rules_b.rule_information2%TYPE;
3209     end_date edate_type;
3210     l_payment_amt okc_rules_b.rule_information6%TYPE;
3211 
3212 	--3. Disb basis for all vendors should be same
3213     CURSOR disb_basis_csr (p_chr_id IN NUMBER, p_cle_id IN NUMBER) IS
3214     SELECT ppy.disbursement_basis, po.vendor_name
3215     FROM okl_party_payment_dtls ppy, okl_party_payment_hdr pph, okc_k_party_roles_b rle, po_vendors po
3216     WHERE pph.dnz_chr_id = p_chr_id
3217     AND pph.cle_id = p_cle_id
3218     AND pph.id = ppy.payment_hdr_id
3219 	AND ppy.cpl_id = rle.id
3220     AND rle.rle_code = 'OKL_VENDOR'
3221 	AND rle.object1_id1 = po.vendor_id;
3222 
3223     l_disb_basis okl_party_payment_dtls.disbursement_basis%TYPE;
3224 
3225 	--4. Total process fee fixed amt not exceed line amt
3226     CURSOR proc_fee_amt_csr (p_chr_id IN NUMBER, p_cle_id IN NUMBER) IS
3227     SELECT SUM(ppy.processing_fee_fixed_amount)
3228     FROM okl_party_payment_dtls ppy, okl_party_payment_hdr pph
3229     WHERE pph.dnz_chr_id = p_chr_id
3230     AND pph.cle_id = p_cle_id
3231     AND pph.id = ppy.payment_hdr_id;
3232 
3233     l_proc_fee_amt okl_party_payment_dtls.processing_fee_fixed_amount%TYPE;
3234 
3235     CURSOR pth_amount_csr(p_chr_id IN NUMBER, p_cle_id IN NUMBER) IS
3236     SELECT SUM(ppy.disbursement_fixed_amount)
3237     FROM okl_party_payment_dtls ppy, okl_party_payment_hdr pph
3238     WHERE pph.dnz_chr_id = p_chr_id
3239     AND pph.cle_id = p_cle_id
3240     AND pph.id = ppy.payment_hdr_id;
3241 
3242     l_pth_amt    okl_party_payment_dtls.disbursement_fixed_amount%TYPE;
3243 
3244     --Bug 4917691 fmiao end ------------------------------------
3245 
3246 
3247   CURSOR con_type_csr (p_chr_id OKC_K_HEADERS_V.ID%TYPE) IS
3248   SELECT 'Y'
3249   FROM   okc_k_headers_b
3250   WHERE  orig_system_source_code = 'OKL_REBOOK'
3251   AND    id = p_chr_id;
3252 
3253   --------------
3254   --Bug# 4350255
3255   --------------
3256   CURSOR pth_csr (p_chr_id OKC_K_HEADERS_B.ID%TYPE) IS
3257   SELECT line.id,
3258          DECODE(style.lty_code,'SOLD_SERVICE','SERVICE',style.lty_code) line_type,
3259          NVL(line.name,line.item_description) name,
3260          line.fee_type,
3261          style.name line_style,
3262          line.amount amount,
3263          line.start_date,
3264          line.end_date,
3265          pph.id payment_hdr_id,
3266          pph.passthru_start_date,
3267          pph.passthru_term,
3268          pph.passthru_stream_type_id
3269   FROM   okl_k_lines_full_v line,
3270          okc_line_styles_v style,
3271          okc_statuses_v sts,
3272          okl_party_payment_hdr pph
3273   WHERE  line.lse_id                    = style.id
3274   AND    line.sts_code                  = sts.code
3275   AND    sts.ste_code                   NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
3276   AND    style.lty_code                 IN ('SOLD_SERVICE','FEE','FREE_FORM1')
3277   AND    line.dnz_chr_id                = p_chr_id
3278   AND    pph.cle_id                     = line.id
3279   AND    pph.dnz_chr_id                 = p_chr_id;
3280 
3281   CURSOR pth_dtl_csr(p_payment_hdr_id IN NUMBER) IS
3282   SELECT disbursement_basis,
3283          disbursement_fixed_amount,
3284          disbursement_percent,
3285          payment_start_date,
3286          vendor_id
3287   FROM   okl_party_payment_dtls
3288   WHERE  payment_hdr_id = p_payment_hdr_id;
3289 
3290   CURSOR vendor_csr(p_vendor_id IN NUMBER) IS
3291   SELECT vendor_name
3292   FROM   po_vendors
3293   WHERE  vendor_id = p_vendor_id;
3294 
3295   l_vendor_name po_vendors.vendor_name%TYPE;
3296   l_pct_sum NUMBER;
3297   l_pth_dtl_present_yn VARCHAR2(1);
3298 
3299   --Bug#3877032
3300   /*CURSOR pth_csr (p_chr_id OKC_K_HEADERS_V.ID%TYPE) IS
3301   SELECT line.id,
3302          decode(style.lty_code,'SOLD_SERVICE','SERVICE',style.lty_code) line_type,
3303          nvl(line.name,line.item_description) name,
3304          line.fee_type,
3305          rule.object1_id1,
3306          style.name line_style
3307   FROM   okl_k_lines_full_v line,
3308          okc_line_styles_v style,
3309          okc_statuses_v sts,
3310          okc_rule_groups_b rgp,
3311          okc_rules_b rule
3312   WHERE  rgp.id                         = rule.rgp_id
3313   AND    line.id                        = rgp.cle_id
3314   AND    line.lse_id                    = style.id
3315   AND    line.sts_code                  = sts.code
3316   AND    sts.ste_code                   NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
3317   AND    style.lty_code                 IN ('SOLD_SERVICE','FEE')
3318   AND    rgp.rgd_code                   = 'LAPSTH'
3319   AND    rule.rule_information_category = 'LASTRM'
3320   AND    line.dnz_chr_id                = p_chr_id
3321   AND    rgp.dnz_chr_id                 = p_chr_id;*/
3322 
3323   --------------
3324   --Bug# 4350255
3325   --------------
3326 
3327   l_type VARCHAR2(1);
3328   l_present_yn VARCHAR2(1);
3329   l_strm_name_rec strm_name_csr%ROWTYPE;
3330 
3331   i NUMBER := 1;
3332   l_found NUMBER := 0; -- Added for bug 5201664
3333   BEGIN
3334 
3335     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
3336 
3337     --Bug 4917691 fmiao start ---------------------------------------
3338 
3339     --1.If evg hdr is defined, all the vendors should have evg pt params defined
3340 	l_evg_hdr_exist := NULL;
3341 	OPEN evg_hdr_csr (p_chr_id);
3342 	FETCH evg_hdr_csr INTO l_evg_hdr_exist;
3343 	CLOSE evg_hdr_csr;
3344 
3345 	IF (l_evg_hdr_exist IS NOT NULL) THEN
3346       FOR chr_vendor_rec IN chr_vendor_csr (p_chr_id)
3347       LOOP
3348         OPEN evg_dtls_csr (chr_vendor_rec.object1_id1, p_chr_id);
3349         FETCH evg_dtls_csr INTO l_evg_dtls_exist;
3350         CLOSE evg_dtls_csr;
3351 	-- changed below condition for bug 5201664
3352          IF (l_evg_dtls_exist IS NOT NULL) THEN
3353               l_found := 1;
3354               EXIT;
3355         END IF;
3356         l_evg_dtls_exist := NULL;
3357       END LOOP;
3358 
3359       IF (l_found = 0) THEN
3360 
3361           Okl_Api.set_message(
3362       			p_app_name => G_APP_NAME,
3363       			p_msg_name => 'OKL_QA_EVG_PT_NO_DTLS');
3364       	  x_return_status := Okl_Api.G_RET_STS_ERROR;
3365        END IF;
3366        -- end bug 5201664
3367 	END IF;
3368 
3369     -- 2.Check the disb amt of all vendors for a line not exceed line pymnt amt
3370 
3371     FOR lines_rec IN lines_csr (p_chr_id)
3372     LOOP
3373 
3374       IF (lines_rec.lty_code = 'FREE_FORM1') THEN
3375 
3376 	    FOR payout_basis_rec IN payout_basis_csr (p_chr_id, lines_rec.id)
3377 		 LOOP
3378 
3379 
3380 	    IF (payout_basis_rec.passthru_term IS NULL) THEN
3381 	      OPEN disb_amt_csr1 (p_chr_id);
3382 	      FETCH disb_amt_csr1 INTO l_fixed_amt,l_passthru_term, l_payout_basis;
3383 	      CLOSE disb_amt_csr1;
3384 	    ELSE
3385 	      OPEN disb_amt_csr (p_chr_id, lines_rec.id,payout_basis_rec.passthru_term);
3386           FETCH disb_amt_csr INTO l_fixed_amt;
3387           CLOSE disb_amt_csr;
3388 	    END IF;
3389 
3390         IF (l_fixed_amt IS NOT NULL) THEN
3391 	      OPEN pymnt_amt_csr (p_chr_id, lines_rec.id);
3392 	      FETCH pymnt_amt_csr BULK COLLECT INTO start_date, end_date, pymnt_amt;
3393 	      CLOSE pymnt_amt_csr;
3394 
3395 	      IF (payout_basis_rec.passthru_term = 'EVERGREEN' AND
3396 	        payout_basis_rec.payout_basis IN ('BILLING','FULL_RECEIPT','PARTIAL_RECEIPT')) THEN
3397             FOR i IN pymnt_amt.first..pymnt_amt.last
3398 				LOOP
3399 				  l_payment_amt := pymnt_amt(i);
3400             END LOOP;
3401 	        IF (l_fixed_amt > l_payment_amt) THEN
3402 	          Okl_Api.set_message(
3403                       p_app_name => G_APP_NAME,
3404                       p_msg_name => 'OKL_QA_FIXED_AMT_EXC_PYMNT_AMT',
3405                       p_token1       => 'DISB_AMOUNT',
3406 					  p_token1_value => l_fixed_amt,
3407                       p_token2       => 'TERM',
3408 					  p_token2_value => payout_basis_rec.passthru_term,
3409                       p_token3       => 'PYMNT_AMT',
3410 					  p_token3_value => l_payment_amt,
3411                       p_token4       => 'LINE',
3412 					  p_token4_value => lines_rec.name);
3413 	          x_return_status := Okl_Api.G_RET_STS_ERROR;
3414 	        END IF;
3415 	      END IF;
3416 	    END IF;
3417 		 END LOOP;
3418       ELSE -- 'FEE' 'SOLD_SERVICE'
3419 
3420 	    FOR payout_basis_rec IN payout_basis_csr (p_chr_id, lines_rec.id)
3421 		 LOOP
3422 
3423 	      OPEN disb_amt_csr (p_chr_id, lines_rec.id, payout_basis_rec.passthru_term);
3424 	      FETCH disb_amt_csr INTO l_fixed_amt;
3425 	      CLOSE disb_amt_csr;
3426 
3427 	      IF (l_fixed_amt IS NOT NULL) THEN
3428 	        OPEN pymnt_amt_csr (p_chr_id, lines_rec.id);
3429 	        FETCH pymnt_amt_csr BULK COLLECT INTO start_date, end_date, pymnt_amt;
3430             CLOSE pymnt_amt_csr;
3431 
3432 	        IF (payout_basis_rec.passthru_term = 'EVERGREEN' AND
3433 		        payout_basis_rec.payout_basis IN ('BILLING','FULL_RECEIPT','PARTIAL_RECEIPT')) THEN
3434               FOR i IN pymnt_amt.first..pymnt_amt.last
3435               LOOP
3436                 l_payment_amt := pymnt_amt(i);
3437               END LOOP;
3438 
3439 	          IF (l_fixed_amt > l_payment_amt) THEN
3440 	            Okl_Api.set_message(
3441                       p_app_name => G_APP_NAME,
3442                       p_msg_name => 'OKL_QA_FIXED_AMT_EXC_PYMNT_AMT',
3443                       p_token1       => 'DISB_AMOUNT',
3444 					  p_token1_value => l_fixed_amt,
3445                       p_token2       => 'TERM',
3446 					  p_token2_value => payout_basis_rec.passthru_term,
3447                       p_token3       => 'PYMNT_AMT',
3448 					  p_token3_value => l_payment_amt,
3449                       p_token4       => 'LINE',
3450 					  p_token4_value => lines_rec.name);
3451                 x_return_status := Okl_Api.G_RET_STS_ERROR;
3452 	          END IF;
3453 			 END IF ;
3454 
3455 	        IF (payout_basis_rec.passthru_term = 'BASE' AND
3456 		           payout_basis_rec.payout_basis IN ('BILLING','DUE_DATE','FULL_RECEIPT','PARTIAL_RECEIPT')) THEN
3457 
3458 	          IF  (pymnt_amt.COUNT > 0) THEN -- 5207361
3459 	          l_payment_amt := pymnt_amt(1);
3460 	          ELSE
3461 	          l_payment_amt := NULL;
3462 	          END IF;
3463 
3464 	          IF (l_fixed_amt > l_payment_amt) THEN
3465 	            Okl_Api.set_message(
3466                       p_app_name => G_APP_NAME,
3467                       p_msg_name => 'OKL_QA_FIXED_AMT_EXC_PYMNT_AMT',
3468                       p_token1       => 'DISB_AMOUNT',
3469 					  p_token1_value => l_fixed_amt,
3470                       p_token2       => 'TERM',
3471 					  p_token2_value => payout_basis_rec.passthru_term,
3472                       p_token3       => 'PYMNT_AMT',
3473 					  p_token3_value => l_payment_amt,
3474                       p_token4       => 'LINE',
3475 					  p_token4_value => lines_rec.name);
3476                 x_return_status := Okl_Api.G_RET_STS_ERROR;
3477 	          END IF;
3478 	        END IF;
3479 
3480 	      END IF;
3481 	    END LOOP;
3482       END IF;
3483 
3484       --3.Validate all vendors for 1 line should have the same disb basis
3485 
3486       l_disb_basis := NULL;
3487       FOR disb_basis_rec IN disb_basis_csr (p_chr_id, lines_rec.id)
3488       LOOP
3489 
3490         IF (l_disb_basis IS NOT NULL AND
3491             l_disb_basis <> disb_basis_rec.disbursement_basis) THEN
3492 
3493 		  Okl_Api.set_message(
3494           					  p_app_name => G_APP_NAME,
3495               				  p_msg_name => 'OKL_QA_INVALID_VEND_DISB_BASIS',
3496 							  p_token1       => 'BASIS',
3497 							  p_token1_value => disb_basis_rec.disbursement_basis,
3498 							  p_token2       => 'VENDOR',
3499 							  p_token2_value => disb_basis_rec.vendor_name,
3500 							  p_token3       => 'LINE',
3501 							  p_token3_value => lines_rec.name);
3502           x_return_status := Okl_Api.G_RET_STS_ERROR;
3503         END IF;
3504         l_disb_basis := disb_basis_rec.disbursement_basis;
3505 
3506       END LOOP;
3507 
3508       --4.Validate processing fee amt no greater than line amt
3509       OPEN proc_fee_amt_csr (p_chr_id, lines_rec.id);
3510       FETCH proc_fee_amt_csr INTO l_proc_fee_amt;
3511       CLOSE proc_fee_amt_csr;
3512 
3513       OPEN pth_amount_csr (p_chr_id, lines_rec.id);
3514       FETCH pth_amount_csr INTO l_pth_amt;
3515       CLOSE pth_amount_csr;
3516 
3517       IF (l_proc_fee_amt IS NOT NULL AND l_pth_amt IS NOT NULL AND
3518           l_proc_fee_amt > l_pth_amt) THEN
3519 		    Okl_Api.set_message(
3520         						p_app_name => G_APP_NAME,
3521               					p_msg_name => 'OKL_QA_PROC_FEE_GT_LINE_AMT',
3522 								p_token1       => 'PROC_AMT',
3523 								p_token1_value => l_proc_fee_amt,
3524 								p_token2       => 'PTH_AMT',
3525 								p_token2_value => l_pth_amt,
3526 								p_token3       => 'LINE',
3527 								p_token3_value => lines_rec.name);
3528             x_return_status := Okl_Api.G_RET_STS_ERROR;
3529       END IF;
3530 	END LOOP;
3531 
3532     --Bug 4917691 fmiao end
3533 
3534 
3535     -- Bug# 4350255
3536     /*l_type := '?';
3537     OPEN con_type_csr (p_chr_id);
3538     FETCH con_type_csr INTO l_type;
3539     IF con_type_csr%NOTFOUND THEN
3540       l_type := 'N';
3541     END IF;
3542     CLOSE con_type_csr;*/
3543 
3544     --
3545     -- Do not check for rebook copy contracts
3546     --
3547     -- Bug# 4350255: Checks are needed for rebook copy contracts
3548     -- as Passthrough parameters can be modified on Rebook
3549     --IF (l_type <> 'Y') THEN
3550        FOR pth_rec IN pth_csr (p_chr_id)
3551        LOOP
3552 
3553          -- Bug# 4350255: start
3554          -- Passthru Stream Type is mandatory for Base term
3555          IF (pth_rec.passthru_term = 'BASE') THEN
3556            IF (pth_rec.passthru_stream_type_id IS NULL) THEN
3557                Okl_Api.set_message(
3558                                G_APP_NAME,
3559                                'OKL_QA_PASTH_STRM',
3560                                'LINE_TYPE',
3561                                pth_rec.line_style,
3562                                'STRM_TYPE',
3563                                pth_rec.name
3564                                );
3565                x_return_status := Okl_Api.G_RET_STS_ERROR;
3566            END IF;
3567 
3568            IF (pth_rec.passthru_start_date
3569               NOT BETWEEN pth_rec.start_date AND pth_rec.end_date) THEN
3570                Okl_Api.set_message(p_app_name     => G_APP_NAME,
3571                                    p_msg_name     => 'OKL_QA_PTH_STRT_DATE',
3572                                    p_token1       => 'LINE',
3573                                    p_token1_value => pth_rec.line_style||'/'||pth_rec.name);
3574                x_return_status := Okl_Api.G_RET_STS_ERROR;
3575            END IF;
3576          END IF;
3577 
3578          -- Passthru Stream Type should be valid for the contract's
3579          -- Stream Generation Template
3580          IF (pth_rec.passthru_stream_type_id IS NOT NULL) THEN
3581              --Bug# 3931587
3582              l_present_yn :=   Okl_Streams_Util.strm_tmpt_contains_strm_type
3583                                    (p_khr_id  => p_chr_id,
3584                                     p_sty_id  => pth_rec.passthru_stream_type_id);
3585 
3586              IF (l_present_yn = 'N') THEN
3587 
3588                OPEN  strm_name_csr ( TO_NUMBER(pth_rec.passthru_stream_type_id) );
3589                FETCH strm_name_csr INTO l_strm_name_rec;
3590                IF strm_name_csr%NOTFOUND THEN
3591                  CLOSE strm_name_csr;
3592                  RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
3593                END IF;
3594                CLOSE strm_name_csr;
3595 
3596                Okl_Api.set_message(
3597                   p_app_name     => G_APP_NAME,
3598                   p_msg_name     => 'LLA_QA_PTH_STRM_TMPL',
3599                   p_token1       => 'STRM_NAME',
3600                   p_token1_value => l_strm_name_rec.name,
3601                   p_token2       => 'LINE_TYPE',
3602                   p_token2_value => pth_rec.line_style||'/'||pth_rec.name
3603                  );
3604                x_return_status := Okl_Api.G_RET_STS_ERROR;
3605            END IF;
3606          END IF;
3607 
3608          l_pct_sum := 0;
3609          l_pth_dtl_present_yn := 'N';
3610          FOR pth_dtl_rec IN pth_dtl_csr(p_payment_hdr_id => pth_rec.payment_hdr_id)
3611          LOOP
3612 
3613            l_pth_dtl_present_yn := 'Y';
3614 
3615            IF (pth_dtl_rec.disbursement_basis = 'PERCENT') THEN
3616              l_pct_sum := l_pct_sum +  NVL(pth_dtl_rec.disbursement_percent,0);
3617            END IF;
3618 
3619            IF (pth_rec.passthru_term = 'BASE') THEN
3620              IF (pth_dtl_rec.payment_start_date IS NOT NULL AND
3621                  pth_dtl_rec.payment_start_date NOT BETWEEN pth_rec.start_date AND pth_rec.end_date) THEN
3622 
3623                 OPEN vendor_csr(p_vendor_id => pth_dtl_rec.vendor_id);
3624                 FETCH vendor_csr INTO l_vendor_name;
3625                 CLOSE vendor_csr;
3626 
3627                 Okl_Api.set_message(p_app_name     => G_APP_NAME,
3628                                     p_msg_name     => 'OKL_QA_PYMT_STRT_DATE',
3629                                     p_token1       => 'LINE',
3630                                     p_token1_value => pth_rec.line_style||'/'||pth_rec.name,
3631                                     p_token2       => 'VENDOR',
3632                                     p_token2_value => l_vendor_name);
3633                 x_return_status := Okl_Api.G_RET_STS_ERROR;
3634              END IF;
3635            END IF;
3636 
3637          END LOOP;
3638 
3639          IF (l_pth_dtl_present_yn = 'N') THEN
3640 
3641            IF (pth_rec.passthru_term = 'BASE') THEN
3642              Okl_Api.set_message(
3643                p_app_name     => G_APP_NAME,
3644                p_msg_name     => 'OKL_QA_PTH_BASE_NO_DTL',
3645                p_token1       => 'LINE',
3646                p_token1_value => pth_rec.line_style||'/'||pth_rec.name
3647                );
3648              x_return_status := Okl_Api.G_RET_STS_ERROR;
3649 
3650            ELSIF (pth_rec.passthru_term = 'EVERGREEN') THEN
3651              Okl_Api.set_message(
3652                p_app_name     => G_APP_NAME,
3653                p_msg_name     => 'OKL_QA_PTH_EVGN_NO_DTL',
3654                p_token1       => 'LINE',
3655                p_token1_value => pth_rec.line_style||'/'||pth_rec.name
3656                );
3657              x_return_status := Okl_Api.G_RET_STS_ERROR;
3658            END IF;
3659 
3660          END IF;
3661 
3662          IF (l_pct_sum > 100) THEN
3663 
3664            IF (pth_rec.passthru_term = 'BASE') THEN
3665                Okl_Api.set_message(
3666                   p_app_name     => G_APP_NAME,
3667                   p_msg_name     => 'OKL_QA_BASE_PERCENT_SUM',
3668                   p_token1       => 'LINE',
3669                   p_token1_value => pth_rec.line_style||'/'||pth_rec.name
3670                  );
3671                 x_return_status := Okl_Api.G_RET_STS_ERROR;
3672 
3673            ELSIF (pth_rec.passthru_term = 'EVERGREEN') THEN
3674                 Okl_Api.set_message(
3675                   p_app_name     => G_APP_NAME,
3676                   p_msg_name     => 'OKL_QA_EVGN_PERCENT_SUM',
3677                   p_token1       => 'LINE',
3678                   p_token1_value => pth_rec.line_style||'/'||pth_rec.name
3679                  );
3680                  x_return_status := Okl_Api.G_RET_STS_ERROR;
3681            END IF;
3682 
3683          END IF;
3684          -- Bug# 4350255: end
3685 
3686        END LOOP;
3687     --END IF;
3688 
3689   EXCEPTION
3690 
3691   WHEN OTHERS THEN
3692     -- store SQL error message on message stack
3693     Okl_Api.SET_MESSAGE(
3694       p_app_name        => G_APP_NAME,
3695       p_msg_name        => G_UNEXPECTED_ERROR,
3696       p_token1          => G_SQLCODE_TOKEN,
3697       p_token1_value    => SQLCODE,
3698       p_token2          => G_SQLERRM_TOKEN,
3699       p_token2_value    => SQLERRM);
3700     -- notify caller of an error as UNEXPETED error
3701 
3702     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
3703 
3704   END check_fee_service_ast_pth;
3705 
3706 
3707   -- Start of comments
3708   --
3709   -- Procedure Name  : check_advance_rentals
3710   -- Description     :
3711   -- Business Rules  :
3712   -- Parameters      :
3713   -- Version         : 1.0
3714   -- End of comments
3715 
3716   PROCEDURE check_advanced_rentals(
3717     x_return_status            OUT NOCOPY VARCHAR2,
3718     p_chr_id                   IN  NUMBER
3719   ) IS
3720 
3721     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
3722     l_dummy VARCHAR2(1) := '?';
3723     l_count NUMBER := 0;
3724     l_row_notfound BOOLEAN;
3725     l_token VARCHAR2(2000);
3726 
3727 
3728     CURSOR l_contract_name ( n VARCHAR2 ) IS
3729     SELECT COUNT(*) cnt
3730     FROM okc_k_headers_v WHERE contract_number = n;
3731     l_cn l_contract_name%ROWTYPE;
3732 
3733 
3734     l_hdr     l_hdr_csr%ROWTYPE;
3735     l_txl     l_txl_csr%ROWTYPE;
3736     l_txd     l_txd_csr%ROWTYPE;
3737     l_itm     l_itms_csr%ROWTYPE;
3738     l_struct_rec l_struct_csr%ROWTYPE;
3739     l_structure  NUMBER;
3740     l_rl_rec1 l_rl_csr1%ROWTYPE;
3741     i NUMBER;
3742 
3743 
3744     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
3745     l_supp_rec supp_csr%ROWTYPE;
3746     l_lne l_lne_csr%ROWTYPE;
3747     l_fee_strm_type_rec  fee_strm_type_csr%ROWTYPE;
3748     l_strm_name_rec strm_name_csr%ROWTYPE;
3749 
3750     l_inflow_defined_yn VARCHAR2(1);
3751     l_outflow_defined_yn VARCHAR2(1);
3752 
3753   BEGIN
3754 
3755     -- initialize return status
3756     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
3757 
3758     FOR l_hdrrl_rec IN l_hdrrl_csr ( 'LALEVL', 'LASLH', p_chr_id )
3759     LOOP
3760 
3761         OPEN  strm_name_csr ( l_hdrrl_rec.object1_id1 );
3762         FETCH strm_name_csr INTO l_strm_name_rec;
3763         IF strm_name_csr%NOTFOUND THEN
3764             CLOSE strm_name_csr;
3765             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
3766         END IF;
3767         CLOSE strm_name_csr;
3768 
3769         --Bug#3931587
3770         --If ( l_strm_name_rec.name = 'ADVANCED RENTALS' ) Then
3771         IF ( l_strm_name_rec.stream_type_purpose = 'ADVANCE_RENT' ) THEN
3772 
3773                 Okl_Api.set_message(
3774                   p_app_name     => G_APP_NAME,
3775                   p_msg_name     => 'OKL_QA_NOSUP_ADVRENTS',
3776                   p_token1       => 'line',
3777                   p_token1_value => l_lne.name);
3778                 x_return_status := Okl_Api.G_RET_STS_ERROR;
3779                 RETURN;
3780 
3781         END IF;
3782 
3783     END LOOP;
3784 
3785   IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
3786       Okl_Api.set_message(
3787         p_app_name      => G_APP_NAME,
3788         p_msg_name      => G_QA_SUCCESS);
3789   END IF;
3790 
3791 
3792   EXCEPTION
3793 
3794   WHEN G_EXCEPTION_HALT_VALIDATION THEN
3795     -- no processing necessary; validation can continue with next column
3796     IF l_rl_csr1%ISOPEN THEN
3797       CLOSE l_rl_csr1;
3798     END IF;
3799   WHEN OTHERS THEN
3800     -- store SQL error message on message stack
3801     Okl_Api.SET_MESSAGE(
3802       p_app_name        => G_APP_NAME,
3803       p_msg_name        => G_UNEXPECTED_ERROR,
3804       p_token1	        => G_SQLCODE_TOKEN,
3805       p_token1_value    => SQLCODE,
3806       p_token2          => G_SQLERRM_TOKEN,
3807       p_token2_value    => SQLERRM);
3808     -- notify caller of an error as UNEXPETED error
3809     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
3810     -- verify that cursor was closed
3811     IF l_lne_csr%ISOPEN THEN
3812       CLOSE l_lne_csr;
3813     END IF;
3814     IF l_hdr_csr%ISOPEN THEN
3815       CLOSE l_hdr_csr;
3816     END IF;
3817     IF l_txl_csr%ISOPEN THEN
3818       CLOSE l_txl_csr;
3819     END IF;
3820 
3821   END check_advanced_rentals;
3822 
3823   -- Start of comments
3824   --
3825   -- Procedure Name  : check_est_prop_tax
3826   -- Description     : Check LASLH record for each asset line and raise error
3827   --                   based on existence of payment streams of purpose code
3828   --                   'ESTIMATED_PROPERTY_TAX'
3829   -- Business Rules  :
3830   -- Parameters      :
3831   -- Version         : 1.0
3832   -- End of comments
3833 
3834   PROCEDURE check_est_prop_tax(
3835     x_return_status            OUT NOCOPY VARCHAR2,
3836     p_chr_id                   IN  NUMBER
3837   ) IS
3838 
3839     CURSOR l_lne_csr(ltycode VARCHAR2, chrid OKL_K_HEADERS.KHR_ID%TYPE) IS
3840     SELECT kle.id,
3841            kle.name
3842     FROM OKC_K_LINES_V kle,
3843          OKC_LINE_STYLES_B ls,
3844          OKC_STATUSES_B sts
3845     WHERE kle.lse_id = ls.id
3846     AND ls.lty_code = ltycode
3847     AND kle.dnz_chr_id = chrid
3848     AND sts.code = kle.sts_code
3849     AND sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
3850 
3851     CURSOR l_assetrl_csr( rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
3852                        rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
3853                        chrId NUMBER,
3854                        cleId NUMBER) IS
3855     SELECT crl.RULE_INFORMATION1,
3856            crl.RULE_INFORMATION3
3857     FROM   OKC_RULE_GROUPS_B crg,
3858            OKC_RULES_B crl
3859     WHERE  crl.rgp_id = crg.id
3860     AND crg.RGD_CODE = rgcode
3861     AND crl.RULE_INFORMATION_CATEGORY = rlcat
3862     AND crg.dnz_chr_id = chrId
3863     AND crg.cle_id = cleId;
3864 
3865     CURSOR l_strm_asset_csr(rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
3866                        rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
3867                        pmnt_strm_purpose OKL_STRM_TYPE_B.STREAM_TYPE_PURPOSE%TYPE,
3868                        chrId NUMBER,
3869                        cleId NUMBER) IS
3870     SELECT crl.id,
3871            crl.object1_id1
3872     FROM   OKC_RULE_GROUPS_B crg,
3873            OKC_RULES_B crl,
3874            OKL_STRM_TYPE_B stty
3875     WHERE  stty.id = TO_NUMBER(crl.object1_id1)
3876     AND stty.stream_type_purpose = pmnt_strm_purpose
3877     AND crl.rgp_id = crg.id
3878     AND crg.RGD_CODE = rgcode
3879     AND crl.RULE_INFORMATION_CATEGORY = rlcat
3880     AND crg.cle_id = cleId
3881     AND crg.dnz_chr_id = chrId;
3882 
3883     CURSOR est_head_csr (p_chr_id NUMBER) IS
3884     SELECT 'Y'
3885     FROM   okc_rule_groups_b rgp,
3886            okc_rules_b rule,
3887            okl_strm_type_b stty
3888     WHERE  rgp.id                         = rule.rgp_id
3889     AND    stty.id                        = TO_NUMBER(rule.object1_id1)
3890     AND    rgp.rgd_code                   = 'LALEVL'
3891     AND    rule.rule_information_category = 'LASLH'
3892     AND    rgp.cle_id                     IS NULL
3893     AND    stty.stream_type_purpose       = 'ESTIMATED_PROPERTY_TAX'
3894     AND    rgp.dnz_chr_id                 = p_chr_id;
3895 
3896     l_est_head VARCHAR2(1);
3897 
3898     l_assetrl_rec    l_assetrl_csr%ROWTYPE;
3899     l_strm_asset_rec l_strm_asset_csr%ROWTYPE;
3900     l_rule_not_found  BOOLEAN;
3901     l_fnd_rec fnd_csr%ROWTYPE;
3902     l_fnd_meaning FND_LOOKUPS.MEANING%TYPE;
3903     l_billtx_method FND_LOOKUPS.MEANING%TYPE;
3904 
3905   BEGIN
3906 
3907      x_return_status := Okl_Api.G_RET_STS_SUCCESS;
3908 
3909      OPEN fnd_csr('OKL_STREAM_TYPE_PURPOSE','ESTIMATED_PROPERTY_TAX');
3910      FETCH fnd_csr INTO l_fnd_rec;
3911      CLOSE fnd_csr;
3912      l_fnd_meaning := l_fnd_rec.meaning;
3913 
3914      -- Fix Bug 4088346
3915      l_est_head := '?';
3916      OPEN est_head_csr(p_chr_id);
3917      FETCH est_head_csr INTO l_est_head;
3918      CLOSE est_head_csr;
3919 
3920      IF (l_est_head = 'Y') THEN
3921         Okl_Api.set_message(
3922                   p_app_name     => G_APP_NAME,
3923                   p_msg_name     => 'OKL_QA_EST_HEAD',
3924                   p_token1       => 'PURPOSE_DESC',
3925                   p_token1_value => l_fnd_meaning);
3926         x_return_status := Okl_Api.G_RET_STS_ERROR;
3927      END IF;
3928      -- Fix Bug 4088346
3929 
3930      FOR l_lne_rec IN l_lne_csr('FREE_FORM1', p_chr_id)
3931      LOOP
3932 
3933        l_assetrl_rec := NULL;
3934        OPEN l_assetrl_csr('LAASTX','LAPRTX', p_chr_id, l_lne_rec.id);
3935        FETCH l_assetrl_csr INTO l_assetrl_rec;
3936        l_rule_not_found := l_assetrl_csr%NOTFOUND;
3937        CLOSE l_assetrl_csr;
3938 
3939        IF (l_assetrl_rec.RULE_INFORMATION1 = 'Y'
3940            AND (l_assetrl_rec.RULE_INFORMATION3 = 'ESTIMATED'
3941                 OR l_assetrl_rec.RULE_INFORMATION3 = 'ESTIMATED_AND_ACTUAL') ) THEN
3942          OPEN l_strm_asset_csr('LALEVL','LASLH','ESTIMATED_PROPERTY_TAX',p_chr_id, l_lne_rec.id);
3943          FETCH l_strm_asset_csr INTO l_strm_asset_rec;
3944          IF (l_strm_asset_csr%NOTFOUND) THEN
3945            Okl_Api.set_message(
3946                   p_app_name     => G_APP_NAME,
3947                   p_msg_name     => 'OKL_QA_EST_PROPTAX1',
3948                   p_token1       => 'ASSET_NUM',
3949                   p_token1_value => l_lne_rec.name,
3950                   p_token2       => 'PURPOSE_DESC',
3951                   p_token2_value => l_fnd_meaning);
3952            x_return_status := Okl_Api.G_RET_STS_ERROR;
3953          END IF;
3954          CLOSE l_strm_asset_csr;
3955        ELSIF (l_rule_not_found OR l_assetrl_rec.RULE_INFORMATION1 = 'N') THEN
3956          OPEN l_strm_asset_csr('LALEVL','LASLH','ESTIMATED_PROPERTY_TAX',p_chr_id, l_lne_rec.id);
3957          FETCH l_strm_asset_csr INTO l_strm_asset_rec;
3958          IF (l_strm_asset_csr%FOUND) THEN
3959            Okl_Api.set_message(
3960                   p_app_name     => G_APP_NAME,
3961                   p_msg_name     => 'OKL_QA_EST_PROPTAX2',
3962                   p_token1       => 'ASSET_NUM',
3963                   p_token1_value => l_lne_rec.name,
3964                   p_token2       => 'PURPOSE_DESC',
3965                   p_token2_value => l_fnd_meaning);
3966            x_return_status := Okl_Api.G_RET_STS_ERROR;
3967          END IF;
3968          CLOSE l_strm_asset_csr;
3969        ELSIF ( l_assetrl_rec.RULE_INFORMATION1 = 'Y'
3970               AND (l_assetrl_rec.RULE_INFORMATION3 IS NULL OR
3971                l_assetrl_rec.RULE_INFORMATION3 = 'ACTUAL' OR
3972                l_assetrl_rec.RULE_INFORMATION3 = 'NONE') ) THEN
3973          OPEN l_strm_asset_csr('LALEVL','LASLH','ESTIMATED_PROPERTY_TAX',p_chr_id, l_lne_rec.id);
3974          FETCH l_strm_asset_csr INTO l_strm_asset_rec;
3975          IF (l_strm_asset_csr%FOUND) THEN
3976            IF ( l_assetrl_rec.RULE_INFORMATION3 IS NOT NULL) THEN
3977              OPEN fnd_csr('OKL_PROP_TAX_BILL_METHOD',l_assetrl_rec.RULE_INFORMATION3);
3978              FETCH fnd_csr INTO l_fnd_rec;
3979              CLOSE fnd_csr;
3980              l_billtx_method := l_fnd_rec.meaning;
3981            ELSE
3982              l_billtx_method := ' ';
3983            END IF;
3984            Okl_Api.set_message(
3985                   p_app_name     => G_APP_NAME,
3986                   p_msg_name     => 'OKL_QA_EST_PROPTAX3',
3987                   p_token1       => 'ASSET_NUM',
3988                   p_token1_value => l_lne_rec.name,
3989                   p_token2       => 'PURPOSE_DESC',
3990                   p_token2_value => l_fnd_meaning,
3991                   p_token3       => 'BILL_TAX',
3992                   p_token3_value => l_billtx_method);
3993            x_return_status := Okl_Api.G_RET_STS_ERROR;
3994          END IF;
3995          CLOSE l_strm_asset_csr;
3996        END IF;
3997 
3998      END LOOP;
3999 
4000   EXCEPTION
4001 
4002   WHEN OTHERS THEN
4003     -- store SQL error message on message stack
4004     Okl_Api.SET_MESSAGE(
4005       p_app_name        => G_APP_NAME,
4006       p_msg_name        => G_UNEXPECTED_ERROR,
4007       p_token1          => G_SQLCODE_TOKEN,
4008       p_token1_value    => SQLCODE,
4009       p_token2          => G_SQLERRM_TOKEN,
4010       p_token2_value    => SQLERRM);
4011     -- notify caller of an error as UNEXPETED error
4012 
4013     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
4014 
4015     -- verify that cursor was closed
4016     IF l_lne_csr%ISOPEN THEN
4017       CLOSE l_lne_csr;
4018     END IF;
4019     IF l_assetrl_csr%ISOPEN THEN
4020       CLOSE l_assetrl_csr;
4021     END IF;
4022     IF l_strm_asset_csr%ISOPEN THEN
4023       CLOSE l_strm_asset_csr;
4024     END IF;
4025 
4026   END check_est_prop_tax;
4027 
4028   -- Start of comments
4029   --
4030   -- Procedure Name  : check_stub_payment
4031   -- Description     : Check LASLL records and raise error if it only contains
4032   --                   Stub. There must be atleast one actual payment defined.
4033   -- Business Rules  :
4034   -- Parameters      :
4035   -- Version         : 1.0
4036   -- End of comments
4037 
4038   PROCEDURE check_stub_payment(
4039     x_return_status            OUT NOCOPY VARCHAR2,
4040     p_chr_id                   IN  NUMBER
4041   ) IS
4042 
4043 --Bug#3931587
4044   CURSOR stream_csr (p_slh_id VARCHAR2) IS
4045   SELECT strm.stream_type_purpose
4046   --SELECT strm.name
4047   FROM   okl_strm_type_v strm,
4048          okc_rules_b rule
4049   WHERE  rule.id                        = p_slh_id
4050   AND    rule.rule_information_category = 'LASLH'
4051   AND    rule.object1_id1               = strm.id;
4052 
4053   CURSOR hdr_stub_csr (p_chr_id OKC_K_HEADERS_V.ID%TYPE) IS
4054   SELECT
4055          'Y' only_stub,
4056          rule.object2_id1
4057   FROM   okc_rules_b rule,
4058          okc_rule_groups_b rgp
4059   WHERE  rgp.id                 = rule.rgp_id
4060   AND    rgp.rgd_code           = 'LALEVL'
4061   AND    rgp.chr_id             = p_chr_id
4062   AND    rgp.dnz_chr_id         = rgp.chr_id
4063   AND    rgp.cle_id             IS NULL
4064   AND    rule.rule_information7 IS NOT NULL
4065   AND    NOT EXISTS (
4066                      SELECT 'Y'
4067                      FROM   okc_rules_b rule2
4068                      WHERE  rule2.rule_information3 IS NOT NULL
4069                      AND    rule2.rgp_id      = rgp.id
4070                      AND    rule2.object2_id1 = rule.object2_id1
4071                     );
4072 
4073   --Bug#3877032
4074   CURSOR line_stub_csr (p_chr_id OKC_K_HEADERS_V.ID%TYPE) IS
4075   SELECT style.lty_code,
4076          style.name,
4077          rule.object2_id1,
4078          'Y' stub_only
4079   FROM   okc_rules_b rule,
4080          okc_rule_groups_b rgp,
4081          okc_k_lines_b line,
4082          okc_line_styles_v style,
4083          okc_statuses_b sts
4084   WHERE  rgp.id                 = rule.rgp_id
4085   AND    rgp.rgd_code           = 'LALEVL'
4086   AND    rgp.dnz_chr_id         = p_chr_id
4087   AND    rgp.cle_id             = line.id
4088   AND    line.lse_id            = style.id
4089   AND    line.sts_code          = sts.code
4090   AND    sts.ste_code           NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
4091   AND    rule.rule_information7 IS NOT NULL
4092   AND    NOT EXISTS (
4093                      SELECT 'Y'
4094                      FROM   okc_rules_b rule2
4095                      WHERE  rule2.rule_information3 IS NOT NULL
4096                      AND    rule2.rgp_id      = rgp.id
4097                      AND    rule2.object2_id1 = rule.object2_id1
4098                     );
4099 
4100   l_strm_type okl_strm_type_v.name%TYPE;
4101 
4102   BEGIN
4103 
4104      x_return_status := Okl_Api.G_RET_STS_SUCCESS;
4105      FOR hdr_stub_rec IN hdr_stub_csr (p_chr_id)
4106      LOOP
4107         IF (hdr_stub_rec.only_stub = 'Y') THEN
4108 
4109           OPEN stream_csr (hdr_stub_rec.object2_id1);
4110           FETCH stream_csr INTO l_strm_type;
4111           CLOSE stream_csr;
4112 
4113           --Bug#3931587
4114           --Bug#3925464
4115           --IF (l_strm_type <> 'UNSCHEDULED_PRINCIPAL_PAYMENT') Then
4116           -- Bug 4887014
4117           IF (l_strm_type NOT IN ( 'UNSCHEDULED_PRINCIPAL_PAYMENT',
4118                                    'UNSCHEDULED_LOAN_PAYMENT'     ) ) THEN
4119           Okl_Api.set_message(
4120                   p_app_name     => G_APP_NAME,
4121                   p_msg_name     => 'OKL_QA_HDR_STUB_ONLY',
4122                   p_token1       => 'STREAM_TYPE',
4123                   p_token1_value => l_strm_type);
4124           x_return_status := Okl_Api.G_RET_STS_ERROR;
4125           END IF;
4126         END IF;
4127 
4128      END LOOP;
4129 
4130      -- Now check line
4131      FOR line_stub_rec IN line_stub_csr(p_chr_id)
4132      LOOP
4133         IF (line_stub_rec.stub_only = 'Y') THEN
4134           OPEN stream_csr (line_stub_rec.object2_id1);
4135           FETCH stream_csr INTO l_strm_type;
4136           CLOSE stream_csr;
4137 
4138           --Bug#3931587
4139           --Bug#3925464
4140           --IF (l_strm_type <> 'UNSCHEDULED_PRINCIPAL_PAYMENT') Then
4141           -- Bug 4887014
4142           IF (l_strm_type NOT IN ( 'UNSCHEDULED_PRINCIPAL_PAYMENT',
4143                                    'UNSCHEDULED_LOAN_PAYMENT'     ) ) THEN
4144           Okl_Api.set_message(
4145                   p_app_name     => G_APP_NAME,
4146                   p_msg_name     => 'OKL_QA_LINE_STUB_ONLY',
4147                   p_token1       => 'LINE_TYPE',
4148                   p_token1_value => line_stub_rec.name,
4149                   p_token2       => 'STREAM_TYPE',
4150                   p_token2_value => l_strm_type);
4151           x_return_status := Okl_Api.G_RET_STS_ERROR;
4152           END IF;
4153 
4154         END IF;
4155 
4156      END LOOP;
4157 
4158   EXCEPTION
4159 
4160   WHEN OTHERS THEN
4161     -- store SQL error message on message stack
4162     Okl_Api.SET_MESSAGE(
4163       p_app_name        => G_APP_NAME,
4164       p_msg_name        => G_UNEXPECTED_ERROR,
4165       p_token1          => G_SQLCODE_TOKEN,
4166       p_token1_value    => SQLCODE,
4167       p_token2          => G_SQLERRM_TOKEN,
4168       p_token2_value    => SQLERRM);
4169     -- notify caller of an error as UNEXPETED error
4170 
4171     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
4172 
4173   END check_stub_payment;
4174 
4175   -- Start of comments
4176   --
4177   -- Procedure Name  : check_serial_asset
4178   -- Description     : Check for serialized item attached to asset
4179   --                   Item qty must match the total serial numbers
4180   -- Business Rules  :
4181   -- Parameters      :
4182   -- Version         : 1.0
4183   -- End of comments
4184 
4185   PROCEDURE check_serial_asset(
4186     x_return_status            OUT NOCOPY VARCHAR2,
4187     p_chr_id                   IN  NUMBER
4188   ) IS
4189 
4190   --Bug#3877032
4191   CURSOR serial_csr (p_chr_id OKC_K_HEADERS_B.ID%TYPE) IS
4192   SELECT top.name,
4193          top.id top_id,
4194          item.id item_id,
4195          kitem.object1_id1,
4196          kitem.number_of_items,
4197          mtl.description,
4198          mtl.serial_number_control_code
4199   FROM   okc_k_lines_v top,
4200          okc_k_lines_b item,
4201          okc_line_styles_b item_style,
4202          okc_line_styles_b top_style,
4203          okc_k_items kitem,
4204          mtl_system_items mtl
4205   WHERE  top.dnz_chr_id               = p_chr_id
4206   AND    top.lse_id                   = top_style.id
4207   AND    top_style.lty_code           = 'FREE_FORM1'
4208   AND    top.id                       = item.cle_id
4209   AND    item.id                      = kitem.cle_id
4210   AND    item.dnz_chr_id              = top.dnz_chr_id
4211   AND    item.dnz_chr_id              = kitem.dnz_chr_id
4212   AND    kitem.jtot_object1_code      = 'OKX_SYSITEM'
4213   AND    mtl.inventory_item_id        = kitem.object1_id1
4214   AND    TO_CHAR(mtl.organization_id) = kitem.object1_id2
4215   AND    item.lse_id                  = item_style.id
4216   AND    item_style.lty_code          = 'ITEM';
4217 
4218   --Bug#3877032
4219   CURSOR ib_csr (p_top_cle_id OKC_K_LINES_B.ID%TYPE) IS
4220   SELECT COUNT(inst.serial_number) no_srl
4221   FROM   okc_k_lines_b ib,
4222          okc_k_lines_b f2,
4223          okc_line_styles_b style,
4224          okl_txl_itm_insts inst
4225   WHERE  f2.cle_id      = p_top_cle_id
4226   AND    f2.lse_id      = style.id
4227   AND    f2.dnz_chr_id  = p_chr_id
4228   AND    ib.dnz_chr_id  = p_chr_id
4229   AND    style.lty_code = 'FREE_FORM2'
4230   AND    f2.id          = ib.cle_id
4231   AND    ib.id          = inst.kle_id;
4232 
4233   BEGIN
4234     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
4235 
4236     FOR serial_rec IN serial_csr (p_chr_id)
4237     LOOP
4238        IF (serial_rec.serial_number_control_code <> 1) THEN -- serialized item
4239           FOR ib_rec IN ib_csr (serial_rec.top_id)
4240           LOOP
4241              IF (ib_rec.no_srl <> serial_rec.number_of_items) THEN
4242                  Okl_Api.set_message(
4243                    G_APP_NAME,
4244                    'OKL_QA_SRL_ITEM_ERROR',
4245                    'ASSET_NUM',
4246                    serial_rec.name,
4247                    'ITEM_NUM',
4248                    serial_rec.description,
4249                    'NO_ITEM',
4250                    serial_rec.number_of_items
4251                   );
4252                 x_return_status := Okl_Api.G_RET_STS_ERROR;
4253              END IF;
4254           END LOOP;
4255        END IF;
4256     END LOOP;
4257 
4258   EXCEPTION
4259     WHEN OTHERS THEN
4260     -- store SQL error message on message stack
4261     Okl_Api.SET_MESSAGE(
4262       p_app_name        => G_APP_NAME,
4263       p_msg_name        => G_UNEXPECTED_ERROR,
4264       p_token1          => G_SQLCODE_TOKEN,
4265       p_token1_value    => SQLCODE,
4266       p_token2          => G_SQLERRM_TOKEN,
4267       p_token2_value    => SQLERRM);
4268     -- notify caller of an error as UNEXPETED error
4269 
4270     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
4271 
4272   END check_serial_asset;
4273 
4274 
4275   -- Start of comments
4276   --                  Added by Durga Janaswamy, bug 6760186
4277   -- Procedure Name  : check_ib_location
4278   -- Description     : Match whether the install location in OLM  is same as
4279   --                   that of Install Base Instance for a given serial number of
4280   --                   an asset and inventory item id.
4281   -- Business Rules  :
4282   -- Parameters      :
4283   -- Version         : 1.0
4284   -- End of comments
4285 -- start
4286 
4287 
4288 PROCEDURE check_ib_location (
4289     x_return_status            OUT NOCOPY VARCHAR2,
4290     p_chr_id                   IN  NUMBER
4291   ) IS
4292 
4293 CURSOR ib_line_csr(p_chr_id NUMBER) IS
4294    SELECT cle.id,
4295           cle.cle_id
4296    FROM   okc_k_lines_b cle,
4297           okc_statuses_b sts
4298    WHERE  cle.lse_id = G_IB_LINE_LTY_ID
4299    AND    cle.dnz_chr_id = p_chr_id
4300    AND    cle.sts_code = sts.code
4301    AND    sts.ste_code NOT IN ('HOLD','EXPIRED','TERMINATED','CANCELLED');
4302 
4303 
4304 CURSOR okl_cimv_csr (p_cle_id NUMBER) IS
4305        SELECT
4306             cim.id,
4307             cim.object1_id1,
4308             cim.object1_id2,
4309             cim.jtot_object1_code,
4310             cim.number_of_items
4311       FROM  okc_k_items_v cim
4312       WHERE cle_id = p_cle_id;
4313 
4314 
4315 CURSOR okl_iipv_csr (p_kle_id NUMBER) IS
4316     SELECT id,
4317            kle_id,
4318            tal_type,
4319            instance_number_ib,
4320            object_id1_new,  -- party_site_use_id
4321            object_id2_new,
4322            jtot_object_code_new,
4323            inventory_org_id,
4324            serial_number,
4325            mfg_serial_number_yn,
4326            inventory_item_id,
4327            inv_master_org_id
4328     FROM okl_txl_itm_insts iti
4329     WHERE iti.kle_id  = p_kle_id
4330     AND   iti.tal_type = G_TRX_LINE_TYPE_BOOK
4331     AND   EXISTS (SELECT '1' FROM  okl_trx_assets
4332                    WHERE  okl_trx_assets.tas_type = G_TRX_LINE_TYPE_BOOK
4333                    AND    okl_trx_assets.tsu_code = G_TSU_CODE_ENTERED
4334                    AND    okl_trx_assets.id       = iti.tas_id);
4335 
4336 
4337 CURSOR serialized_csr (p_inv_item_id NUMBER, p_inventory_org_id NUMBER) IS
4338 SELECT 'X'
4339 FROM   mtl_system_items     mtl
4340 WHERE  mtl.inventory_item_id = p_inv_item_id
4341 AND    mtl.organization_id   = p_inventory_org_id
4342 AND    mtl.serial_number_control_code in (2,5,6);
4343 
4344 
4345 CURSOR okl_csi_ib_csr (p_serial_number VARCHAR2, p_inventory_item_id NUMBER,
4346                        p_inv_master_organization_id NUMBER, p_contract_start_date DATE) IS
4347   SELECT instance_id,
4348          install_location_id,
4349          install_location_type_code
4350    FROM csi_item_instances inst,
4351         csi_instance_statuses stat
4352    WHERE inst.serial_number like p_serial_number  -- nullable col
4353    AND inst.inventory_item_id = p_inventory_item_id
4354    AND inst.inv_master_organization_id = p_inv_master_organization_id
4355    AND NVL (inst.active_end_date, (p_contract_start_date + 1)) >   p_contract_start_date
4356    AND stat.instance_status_id = inst.instance_status_id
4357    AND NVL(stat.terminated_flag, 'N')  <> 'Y';
4358 
4359 
4360 -- bug 6795295 changed name of cursor
4361 --CURSOR intall_location_csr (p_party_site_use_id  NUMBER) IS
4362 CURSOR party_site_id_csr (p_party_site_use_id  NUMBER) IS
4363 SELECT party_site_id
4364 FROM   hz_party_site_uses
4365 WHERE party_site_use_id = p_party_site_use_id;
4366 
4367 -- bug 6795295 changed name of cursor
4368 -- CURSOR location_csr (p_party_site_id NUMBER) IS
4369 CURSOR location_id_csr (p_party_site_id NUMBER) IS
4370    SELECT location_id
4371    FROM hz_party_sites
4372    WHERE PARTY_SITE_ID = p_party_site_id;
4373 
4374 
4375 CURSOR asset_num_csr(p_cle_id NUMBER) IS
4376    SELECT name
4377    FROM   okc_k_lines_b cle1,
4378           okc_k_lines_tl cle_tl,
4379           okc_k_lines_b cle2
4380    WHERE  cle_tl.id = cle2.id
4381    AND    cle1.id =  p_cle_id
4382    AND    cle2.id = cle1.cle_id
4383    AND    cle_tl.language = USERENV('LANG');
4384 
4385 
4386 CURSOR location_name_csr (p_location_id NUMBER) IS
4387 SELECT
4388 substr(arp_addr_label_pkg.format_address(null,l.address1,l.address2,l.address3,l.address4,l.city,l.county,
4389 l.state,l.province,l.postal_code,null,l.country,null,null,null,null,null,null,null,'n','n',80,1,1),1,80)
4390 FROM hz_locations l
4391 WHERE l.location_id = p_location_id;
4392 
4393 CURSOR location_for_party_csr (p_party_site_id NUMBER) IS
4394 SELECT
4395 substr(arp_addr_label_pkg.format_address(null,l.address1,l.address2,l.address3,l.address4,l.city,l.county,
4396 l.state,l.province,l.postal_code,null,l.country,null,null,null,null,null,null,null,'n','n',80,1,1),1,80)
4397 FROM hz_locations l,
4398      hz_party_sites site
4399 WHERE site.party_site_id = p_party_site_id
4400 AND l.location_id = site.location_id;
4401 
4402 CURSOR header_details_csr (p_chr_id NUMBER) IS
4403 SELECT h.start_date, mtl.master_organization_id
4404 FROM okc_k_headers_b h,
4405      mtl_parameters mtl
4406 WHERE h.id = p_chr_id
4407 AND   mtl.organization_id = h.inv_organization_id;
4408 
4409 
4410 l_instance_id                   csi_item_instances.instance_id%TYPE;
4411 l_install_location_id           csi_item_instances.install_location_id%TYPE;
4412 l_install_location_type_code    csi_item_instances.install_location_type_code%TYPE;
4413 l_location_id                   hz_party_sites.location_id%TYPE;
4414 l_serial_number_control_code    VARCHAR2(3);
4415 l_trx_line_type_book            VARCHAR2(10);
4416 l_party_site_id                 hz_party_site_uses.party_site_id%TYPE;
4417 l_asset_num                     okc_k_lines_tl.name%TYPE;
4418 l_okl_location_name             VARCHAR2(160);
4419 l_ib_location_name              VARCHAR2(160);
4420 l_contract_start_date           okc_k_headers_b.start_date%TYPE;
4421 l_inv_organization_id           okc_k_headers_b.inv_organization_id%TYPE;
4422 
4423 
4424 BEGIN
4425 
4426      x_return_status := Okl_Api.G_RET_STS_SUCCESS;
4427 
4428    l_contract_start_date:= NULL;
4429    l_inv_organization_id := NULL;
4430 
4431    OPEN header_details_csr (p_chr_id);
4432    FETCH header_details_csr INTO l_contract_start_date, l_inv_organization_id;
4433    CLOSE header_details_csr;
4434 
4435 
4436     FOR ib_line_rec IN ib_line_csr (p_chr_id)
4437          LOOP
4438 
4439             FOR okl_cimv_rec IN okl_cimv_csr (ib_line_rec.id)
4440                 LOOP
4441 
4442                 IF (okl_cimv_rec.jtot_object1_code IS NOT NULL) AND
4443                       (okl_cimv_rec.object1_id1) IS NOT NULL THEN
4444                       --ib instance is already plugged in (do nothing)
4445                    NULL;
4446 
4447                    ELSIF (okl_cimv_csr%NOTFOUND) OR
4448                          (okl_cimv_rec.jtot_object1_code IS NULL OR
4449                          okl_cimv_rec.object1_id1 IS NULL) THEN
4450                     -- Call get_iipv_rec
4451 
4452                        FOR okl_iipv_rec IN okl_iipv_csr (ib_line_rec.id)
4453                            LOOP
4454                                l_serial_number_control_code := NULL;
4455 
4456                                OPEN serialized_csr (okl_iipv_rec.inventory_item_id, okl_iipv_rec.inventory_org_id);
4457                                FETCH serialized_csr INTO l_serial_number_control_code;
4458                                CLOSE serialized_csr;
4459 
4460                                IF l_serial_number_control_code <> 'X' THEN
4461                                    NULL;  -- not serialized
4462 
4463                                ELSIF  ( okl_iipv_rec.serial_number IS NULL) THEN
4464                                       NULL;  -- no serial_number is entered
4465 
4466                                ELSIF  (okl_iipv_rec.object_id1_new IS NULL) THEN
4467                                       NULL;  -- no install location is entered
4468 
4469                                ELSE
4470                                      l_instance_id := NULL;
4471                                      l_install_location_id := NULL;
4472                                      l_install_location_type_code := NULL;
4473 
4474                                     OPEN okl_csi_ib_csr (okl_iipv_rec.serial_number,
4475                                                           okl_iipv_rec.inventory_item_id,
4476                                                           l_inv_organization_id,
4477                                                           l_contract_start_date );
4478                                     FETCH okl_csi_ib_csr INTO l_instance_id,
4479                                        l_install_location_id, l_install_location_type_code;
4480                                     CLOSE okl_csi_ib_csr;
4481 
4482                                    IF (l_instance_id IS NULL) THEN
4483                                           NULL;   -- no ib instance
4484 
4485                                    ELSIF l_install_location_type_code = 'HZ_PARTY_SITES' THEN
4486                                             l_party_site_id := NULL;
4487                                             OPEN party_site_id_csr (okl_iipv_rec.object_id1_new);
4488                                             FETCH party_site_id_csr INTO l_party_site_id;
4489                                             CLOSE party_site_id_csr;
4490 
4491                                             IF l_install_location_id <>  l_party_site_id THEN
4492                                                    l_asset_num := NULL;
4493                                                    OPEN asset_num_csr (ib_line_rec.cle_id);
4494                                                    FETCH asset_num_csr into l_asset_num;
4495                                                    CLOSE asset_num_csr;
4496 
4497                                                    l_okl_location_name := NULL;
4498                                                    l_ib_location_name := NULL;
4499                                                    OPEN location_for_party_csr (l_party_site_id);
4500                                                    FETCH location_for_party_csr INTO l_okl_location_name;
4501                                                    CLOSE location_for_party_csr;
4502 
4503                                                    OPEN location_for_party_csr (l_install_location_id);
4504                                                    FETCH location_for_party_csr INTO l_ib_location_name;
4505                                                    CLOSE location_for_party_csr;
4506 
4507 						   Okl_Api.set_message(
4508                                                          p_app_name => G_APP_NAME,
4509                                                          p_msg_name => 'OKL_QA_IB_LOCATION_ERROR',
4510                                                          p_token1   =>  'ASSET_NUM',
4511                                                          p_token1_value => l_asset_num,
4512                                                          p_token2   =>  'SERIAL_NUM',
4513                                                          p_token2_value => okl_iipv_rec.serial_number,
4514                                                          p_token3   =>  'OKL_INSTALL_SITE',
4515                                                          p_token3_value => l_okl_location_name,
4516                                                          p_token4   =>  'IB_INSTALL_SITE',
4517                                                          p_token4_value => l_ib_location_name
4518                                                              );
4519                                                 x_return_status := Okl_Api.G_RET_STS_ERROR;
4520                                              END IF;
4521 
4522                                      ELSIF l_install_location_type_code = 'HZ_LOCATIONS' THEN
4523                                             l_party_site_id := NULL;
4524                                             l_location_id := NULL;
4525                                             OPEN party_site_id_csr (okl_iipv_rec.object_id1_new);
4526                                             FETCH party_site_id_csr INTO l_party_site_id;
4527                                             CLOSE party_site_id_csr;
4528 
4529                                                 OPEN location_id_csr (l_party_site_id);
4530                                                 FETCH   location_id_csr INTO l_location_id;
4531                                                 CLOSE location_id_csr;
4532 
4533                                               IF l_install_location_id <> l_location_id THEN
4534                                                    l_asset_num := NULL;
4535                                                    OPEN asset_num_csr (ib_line_rec.cle_id);
4536                                                    FETCH asset_num_csr into l_asset_num;
4537                                                    CLOSE asset_num_csr;
4538 
4539                                                    l_okl_location_name := NULL;
4540                                                    l_ib_location_name := NULL;
4541                                                    OPEN location_name_csr (l_location_id);
4542                                                    FETCH location_name_csr INTO l_okl_location_name;
4543                                                    CLOSE location_name_csr;
4544 
4545                                                    OPEN location_name_csr (l_install_location_id);
4546                                                    FETCH location_name_csr INTO l_ib_location_name;
4547                                                    CLOSE location_name_csr;
4548 
4549                                                         Okl_Api.set_message(
4550                                                          p_app_name => G_APP_NAME,
4551                                                          p_msg_name => 'OKL_QA_IB_LOCATION_ERROR',
4552                                                          p_token1   =>  'ASSET_NUM',
4553                                                          p_token1_value => l_asset_num,
4554                                                          p_token2   =>  'SERIAL_NUM',
4555                                                          p_token2_value => okl_iipv_rec.serial_number,
4556                                                          p_token3   =>  'OKL_INSTALL_SITE',
4557                                                          p_token3_value => l_okl_location_name,
4558                                                          p_token4   =>  'IB_INSTALL_SITE',
4559                                                          p_token4_value => l_ib_location_name
4560                                                              );
4561                                                       x_return_status := Okl_Api.G_RET_STS_ERROR;
4562                                                  END IF;
4563                                         END IF;
4564                         END IF;
4565 
4566                      END LOOP;
4567                END IF;
4568              END LOOP;
4569 END LOOP;
4570 
4571 
4572  EXCEPTION
4573     WHEN OTHERS THEN
4574 
4575     IF ib_line_csr%ISOPEN THEN
4576     CLOSE ib_line_csr;
4577     END IF;
4578 
4579     IF okl_cimv_csr%ISOPEN THEN
4580     CLOSE okl_cimv_csr;
4581     END IF;
4582 
4583 
4584     IF okl_iipv_csr%ISOPEN THEN
4585     CLOSE okl_iipv_csr;
4586     END IF;
4587 
4588 
4589     IF serialized_csr%ISOPEN THEN
4590     CLOSE serialized_csr;
4591     END IF;
4592 
4593 
4594     IF okl_csi_ib_csr%ISOPEN THEN
4595     CLOSE okl_csi_ib_csr;
4596     END IF;
4597 
4598 
4599     IF party_site_id_csr%ISOPEN THEN
4600     CLOSE party_site_id_csr;
4601     END IF;
4602 
4603 
4604     IF location_id_csr%ISOPEN THEN
4605     CLOSE location_id_csr;
4606     END IF;
4607 
4608     IF asset_num_csr%ISOPEN THEN
4609     CLOSE asset_num_csr;
4610     END IF;
4611 
4612     IF location_name_csr%ISOPEN THEN
4613     CLOSE location_name_csr;
4614     END IF;
4615 
4616     IF location_for_party_csr%ISOPEN THEN
4617     CLOSE location_for_party_csr;
4618     END IF;
4619 
4620     IF header_details_csr%ISOPEN THEN
4621     CLOSE header_details_csr;
4622     END IF;
4623 
4624     -- store SQL error message on message stack
4625     Okl_Api.SET_MESSAGE(
4626       p_app_name        => G_APP_NAME,
4627       p_msg_name        => G_UNEXPECTED_ERROR,
4628       p_token1          => G_SQLCODE_TOKEN,
4629       p_token1_value    => SQLCODE,
4630       p_token2          => G_SQLERRM_TOKEN,
4631       p_token2_value    => SQLERRM);
4632     -- notify caller of an error as UNEXPETED error
4633 
4634     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
4635 
4636 END check_ib_location;
4637 -- end
4638 
4639   -- Start of comments
4640   --
4641   -- Procedure Name  : check_lessee_as_vendor
4642   -- Description     : Check the presence of lessee vendor mapping for
4643   --                   LOAN-REVOLVING contracts only
4644   -- Business Rules  :
4645   -- Parameters      :
4646   -- Version         : 1.0
4647   -- End of comments
4648 
4649   PROCEDURE check_lessee_as_vendor(
4650     x_return_status            OUT NOCOPY VARCHAR2,
4651     p_chr_id                   IN  NUMBER
4652   ) IS
4653 
4654   --Bug#3877032
4655   CURSOR con_type_csr (p_chr_id OKC_K_HEADERS_V.ID%TYPE) IS
4656   SELECT NVL(okc.orig_system_source_code,'X') orig_system_source_code,
4657          NVL(okl.deal_type,'X') deal_type
4658   --FROM   okl_k_headers_full_v
4659   FROM   okc_k_headers_b okc,
4660          okl_k_headers okl
4661   WHERE  okc.id = p_chr_id
4662   AND    okc.id = okl.id;
4663 
4664   CURSOR check_vendor_csr (p_chr_id IN NUMBER) IS
4665   SELECT 'Y'
4666   FROM   okl_lessee_as_vendors_uv
4667   WHERE  dnz_chr_id = p_chr_id;
4668 
4669   l_type            OKL_K_HEADERS_FULL_V.DEAL_TYPE%TYPE;
4670   l_source          OKL_K_HEADERS_FULL_V.ORIG_SYSTEM_SOURCE_CODE%TYPE;
4671   l_loan_yn         VARCHAR2(1) := 'N';
4672   l_vendor_present  VARCHAR2(1) := 'N';
4673 
4674   BEGIN
4675     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
4676 
4677     l_type   := 'X';
4678     l_source := 'X';
4679     OPEN con_type_csr (p_chr_id);
4680     FETCH con_type_csr INTO l_source,
4681                             l_type;
4682     CLOSE con_type_csr;
4683 
4684     IF (l_type   = 'LOAN-REVOLVING'
4685         AND
4686         l_source <> 'OKL_REBOOK') THEN
4687 
4688        l_vendor_present := 'N';
4689        OPEN check_vendor_csr (p_chr_id);
4690        FETCH check_vendor_csr INTO l_vendor_present;
4691        CLOSE check_vendor_csr;
4692 
4693        IF (l_vendor_present = 'N') THEN
4694           Okl_Api.set_message(
4695                   p_app_name     => G_APP_NAME,
4696                   p_msg_name     => 'OKL_QA_LESSEE_VENDOR'
4697                  );
4698           x_return_status := Okl_Api.G_RET_STS_ERROR;
4699        END IF;
4700 
4701        IF (NVL(Okl_Funding_Pvt.get_total_funded(p_chr_id), 0) <> 0) THEN
4702           Okl_Api.set_message(
4703                   p_app_name     => G_APP_NAME,
4704                   p_msg_name     => 'OKL_LA_OVERFUND_CHK_4RL'
4705                  );
4706           x_return_status := Okl_Api.G_RET_STS_ERROR;
4707        END IF;
4708 
4709     END IF; -- loan_yn
4710 
4711   EXCEPTION
4712 
4713   WHEN OTHERS THEN
4714     -- store SQL error message on message stack
4715     Okl_Api.SET_MESSAGE(
4716       p_app_name        => G_APP_NAME,
4717       p_msg_name        => G_UNEXPECTED_ERROR,
4718       p_token1          => G_SQLCODE_TOKEN,
4719       p_token1_value    => SQLCODE,
4720       p_token2          => G_SQLERRM_TOKEN,
4721       p_token2_value    => SQLERRM);
4722     -- notify caller of an error as UNEXPETED error
4723 
4724     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
4725 
4726   END check_lessee_as_vendor;
4727   -- Start of comments
4728   --
4729   -- Procedure Name  : check_payment_period
4730   -- Description     : Check payment periods for Financial Asset and Fee lines
4731   --                   Consider lines which is not In-activated, terminated etc.
4732   -- Business Rules  :
4733   -- Parameters      :
4734   -- Version         : 1.0
4735   -- End of comments
4736 
4737   PROCEDURE check_payment_period(
4738     x_return_status            OUT NOCOPY VARCHAR2,
4739     p_chr_id                   IN  NUMBER
4740   ) IS
4741 
4742     /*
4743     *CURSOR strm_profile_csr IS
4744     *SELECT fnd_profile.VALUE('OKL_STREAMS_GEN_PATH')
4745     *FROM   dual;
4746     */
4747 
4748     l_strm_profile VARCHAR2(50);
4749     lx_return_status VARCHAR2(1);
4750 
4751     CURSOR c_fin_fee (p_khr_id OKC_K_HEADERS_B.ID%TYPE) IS
4752       SELECT cle.id,
4753              DECODE (lse.lty_code, 'FREE_FORM1', 'ASSET', 'FEE', 'FEE',
4754                                    'SOLD_SERVICE','SERVICE') line_type
4755       FROM   okc_k_lines_b cle,
4756              okc_line_styles_b lse,
4757              okc_statuses_b sts
4758       WHERE  cle.chr_id   = p_khr_id
4759         AND  cle.lse_id   = lse.id
4760         AND  cle.sts_code = sts.code
4761         AND  sts.ste_code NOT IN ('HOLD','EXPIRED','TERMINATED','CANCELLED')
4762         AND  lse.lty_code IN ('FREE_FORM1', 'FEE', 'SOLD_SERVICE');
4763 
4764     CURSOR c_strm_sll (p_khr_id OKC_K_HEADERS_B.ID%TYPE,
4765                        p_kle_id OKC_K_LINES_B.ID%TYPE) IS
4766       SELECT sll.rule_information2 start_date,
4767              SLL.rule_information3 periods,
4768              DECODE(sll.object1_id1, 'M', 1, 'Q', 3, 'S', 6, 'A', 12) mpp,
4769              ( select STYT.NAME from  OKL_STRM_TYPE_B STY ,OKL_STRM_TYPE_TL STYT where STY.ID = STYT.ID AND STYT.LANGUAGE = USERENV ( 'LANG' )
4770                AND to_number(SLH.OBJECT1_ID1) =  STY.ID ) STREAM_TYPE
4771              --styt.name stream_type
4772       FROM   okc_rules_b sll,
4773              okc_rules_b slh,
4774              okc_rule_groups_b rgp
4775              --okl_strm_type_b sty,
4776              --okl_strm_type_tl styt
4777       WHERE  rgp.dnz_chr_id                = p_khr_id
4778         AND  rgp.cle_id                    = p_kle_id
4779         AND  rgp.rgd_code                  = 'LALEVL'
4780         AND  rgp.id                        = slh.rgp_id
4781         AND  slh.rule_information_category = 'LASLH'
4782         AND  rgp.id                        = sll.rgp_id
4783         --AND  slh.object1_id1               = TO_CHAR(sty.id)  4929573
4784         --AND  styt.LANGUAGE                 = USERENV('LANG')
4785         --AND  sty.id                        = styt.id
4786         AND  TO_CHAR(slh.id)               = sll.object2_id1
4787         AND  sll.rule_information_category = 'LASLL';
4788       --ORDER BY fnd_date.canonical_to_date(sll.rule_information2);
4789 
4790 /*
4791     CURSOR c_strm_sll_ext (p_khr_id OKC_K_HEADERS_B.ID%TYPE,
4792                            p_kle_id OKC_K_LINES_B.ID%TYPE) IS
4793       SELECT
4794              SUM(NVL(TO_NUMBER(SLL.rule_information3),0)) periods,
4795              DECODE(sll.object1_id1, 'M', 1, 'Q', 3, 'S', 6, 'A', 12) mpp,
4796              styt.name stream_type
4797       FROM   okc_rules_b sll,
4798              okc_rules_b slh,
4799              okc_rule_groups_b rgp,
4800              okl_strm_type_b sty,
4801              okl_strm_type_tl styt
4802       WHERE  rgp.dnz_chr_id                = p_khr_id
4803         AND  rgp.cle_id                    = p_kle_id
4804         AND  rgp.rgd_code                  = 'LALEVL'
4805         AND  rgp.id                        = slh.rgp_id
4806         AND  slh.rule_information_category = 'LASLH'
4807         AND  slh.object1_id1               = TO_CHAR(sty.id)
4808         AND  styt.language                 = USERENV('LANG')
4809         AND  sty.id                        = styt.id
4810         AND  TO_CHAR(slh.id)               = sll.object2_id1
4811         AND  sll.rule_information_category = 'LASLL'
4812       GROUP BY DECODE(sll.object1_id1, 'M', 1, 'Q', 3, 'S', 6, 'A', 12),
4813                styt.name;
4814 */
4815 
4816     --Bug#3877032
4817     CURSOR c_strm_slh_ext (p_khr_id OKC_K_HEADERS_B.ID%TYPE,
4818                            p_kle_id OKC_K_LINES_B.ID%TYPE) IS
4819     SELECT (select STYT.NAME from OKL_STRM_TYPE_B STY ,OKL_STRM_TYPE_TL STYT
4820             where STY.ID = STYT.ID AND STYT.LANGUAGE = USERENV ( 'LANG' )
4821             AND to_number(RULE.OBJECT1_ID1) =  STY.ID ) STREAM_TYPE,
4822            rule.id rule_id,
4823            rgp.id rgp_id
4824     FROM   okc_rules_b rule,
4825            okc_rule_groups_b rgp
4826            --okl_strm_type_b sty, Bug 4929573
4827            --okl_strm_type_tl styt
4828     WHERE  rgp.cle_id                     = p_kle_id
4829     AND    rgp.dnz_chr_id                 = p_khr_id
4830     AND    rgp.rgd_code                   = 'LALEVL'
4831     AND    rgp.id                         = rule.rgp_id
4832     AND    rule.rule_information_category = 'LASLH'  ;
4833     --AND    rule.object1_id1               = TO_CHAR(sty.id)
4834     --AND    styt.LANGUAGE                  = USERENV('LANG')
4835     --AND    sty.id                         = styt.id;
4836 
4837     CURSOR c_strm_sll_ext (p_rule_id OKC_RULES_B.ID%TYPE,
4838                            p_rgp_id  OKC_RULE_GROUPS_B.ID%TYPE) IS
4839     SELECT sll.rule_information2 start_date,
4840            sll.rule_information3 periods,
4841            sll.rule_information7 stub_day,
4842            DECODE(sll.object1_id1, 'M', 1, 'Q', 3, 'S', 6, 'A', 12) mpp
4843     FROM   okc_rules_b sll
4844     WHERE  sll.rgp_id                    = p_rgp_id
4845     AND    sll.object2_id1               = TO_CHAR(p_rule_id)
4846     AND    sll.rule_information_category = 'LASLL'
4847      -- cklee/mvasudev,06-02-2005,Bug#4392051/okl.h 4437938
4848 	ORDER BY sll.rule_information2	;
4849 
4850 
4851       CURSOR contract_csr (p_khr_id OKC_K_HEADERS_B.ID%TYPE) IS
4852       SELECT start_date,
4853              end_date
4854       FROM   OKC_K_HEADERS_B
4855       WHERE  ID = p_khr_id;
4856 
4857       l_start_date OKC_K_HEADERS_B.START_DATE%TYPE;
4858       l_end_date   OKC_K_HEADERS_B.END_DATE%TYPE;
4859 
4860       l_strm_sll_start_date DATE;
4861       l_strm_sll_periods    NUMBER;
4862 
4863       l_strm_sll_ext_periods     NUMBER;
4864       l_strm_sll_ext_stub_day    NUMBER;
4865       l_strm_sll_ext_mpp         NUMBER;
4866       l_strm_sll_ext_stream_type VARCHAR2(100);
4867       l_pmnt_end_date            DATE;
4868 
4869     -- START: cklee/mvasudev,06-02-2005,Bug#4392051/okl.h 4437938
4870     CURSOR c_strm_sll_count (p_khr_id OKC_K_HEADERS_B.ID%TYPE,
4871                        p_kle_id OKC_K_LINES_B.ID%TYPE) IS
4872       SELECT COUNT(sll.id)
4873       FROM   okc_rules_b sll,
4874              okc_rules_b slh,
4875              okc_rule_groups_b rgp,
4876              okl_strm_type_b sty,
4877              okl_strm_type_tl styt
4878       WHERE  rgp.dnz_chr_id                = p_khr_id
4879         AND  rgp.cle_id                    = p_kle_id
4880         AND  rgp.rgd_code                  = 'LALEVL'
4881         AND  rgp.id                        = slh.rgp_id
4882         AND  slh.rule_information_category = 'LASLH' --| 17-Jan-06 cklee Fixed bug#4956483                                          |
4883         AND  slh.object1_id1               = TO_CHAR(sty.id)
4884         AND  styt.LANGUAGE                 = USERENV('LANG')
4885         AND  sty.id                        = styt.id
4886         AND  TO_CHAR(slh.id)               = sll.object2_id1
4887         AND  sll.rule_information_category = 'LASLL'; --| 17-Jan-06 cklee Fixed bug#4956483                                          |
4888 
4889     CURSOR c_strm_sll_ext_count (p_rule_id OKC_RULES_B.ID%TYPE,
4890                            p_rgp_id  OKC_RULE_GROUPS_B.ID%TYPE) IS
4891     SELECT COUNT(sll.id)
4892     FROM   okc_rules_b sll
4893     WHERE  sll.rgp_id                    = p_rgp_id
4894     AND    sll.object2_id1               = TO_CHAR(p_rule_id)
4895     AND    sll.rule_information_category = 'LASLL'; --| 17-Jan-06 cklee Fixed bug#4956483                                          |
4896 
4897       l_start_day NUMBER;
4898       l_sll_count NUMBER := 0;
4899     -- END: cklee/mvasudev,06-02-2005,Bug#4392051/okl.h 4437938
4900     payment_end_date_invalid EXCEPTION; -- 5189866
4901 
4902 
4903   BEGIN
4904 
4905      x_return_status := Okl_Api.G_RET_STS_SUCCESS;
4906 
4907      --l_strm_profile := 'NONE';
4908      Okl_Streams_Util.get_pricing_engine(p_khr_id => p_chr_id,
4909                                          x_pricing_engine => l_strm_profile,
4910                                          x_return_status => lx_return_status);
4911      IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
4912        x_return_status := lx_return_status;
4913      END IF;
4914 
4915      /*
4916      *OPEN strm_profile_csr;
4917      *FETCH strm_profile_csr INTO l_strm_profile;
4918      *CLOSE strm_profile_csr;
4919      */
4920 
4921      OPEN contract_csr (p_chr_id);
4922      FETCH contract_csr INTO l_start_date,
4923                              l_end_date;
4924      CLOSE contract_csr;
4925 
4926      --IF (l_strm_profile IN ('INTERNAL', 'NONE')) THEN
4927      IF (l_strm_profile = 'INTERNAL') THEN
4928 
4929         FOR l_fin_fee IN c_fin_fee(p_chr_id)
4930         LOOP
4931 
4932         -- START: cklee/mvasudev,06-02-2005,Bug#4392051/okl.h 4437938
4933         l_start_day := NULL;  --vthiruva Bug#4392051.16-jun..resetting for each asset
4934         -- mvasudev,06-02-2005,Bug#4392051
4935         OPEN c_strm_sll_count(p_chr_id,l_fin_fee.id);
4936 		FETCH c_strm_sll_count INTO l_sll_count;
4937 		CLOSE c_strm_sll_count;
4938 
4939 
4940 		IF l_sll_count > 1 THEN
4941             l_start_day := TO_CHAR(l_start_date,'DD');
4942 	    END IF;
4943         -- END: cklee/mvasudev,06-02-2005,Bug#4392051/okl.h 4437938
4944 
4945 
4946           FOR l_strm_sll IN c_strm_sll(p_chr_id,
4947                                        l_fin_fee.id)
4948           LOOP
4949 
4950              l_strm_sll_start_date := Fnd_Date.canonical_to_date(l_strm_sll.start_date);
4951              l_strm_sll_periods    := TO_NUMBER(l_strm_sll.periods);
4952 
4953              IF(l_strm_sll_start_date IS NULL) THEN
4954 
4955                 Okl_Api.set_message(
4956                       G_APP_NAME,
4957                       'OKL_NO_SLL_SDATE'
4958                      );
4959                 x_return_status := Okl_Api.G_RET_STS_ERROR;
4960 
4961              ELSE
4962                 -- START: cklee/mvasudev,06-02-2005,Bug#4392051/okl. 4437938
4963                 --IF (TRUNC(ADD_MONTHS(l_strm_sll_start_date, l_strm_sll_periods*l_strm_sll.mpp) - 1))
4964                      IF (TRUNC(Okl_Lla_Util_Pvt.calculate_end_date(l_strm_sll_start_date,                 l_strm_sll_periods*l_strm_sll.mpp,l_start_day, l_end_date ))) --Bug#5441811
4965 				--IF (TRUNC(Okl_Lla_Util_Pvt.calculate_end_date(l_strm_sll_start_date, l_strm_sll_periods*l_strm_sll.mpp,l_start_day)))
4966                 -- END: cklee/mvasudev,06-02-2005,Bug#4392051/okl. 4437938
4967                                                                                > (TRUNC(l_end_date)) THEN
4968                     Okl_Api.set_message(
4969                       G_APP_NAME,
4970                       'OKL_QA_INVALID_STRM_END_DATE',
4971                       'STRM_TYPE',
4972                       l_strm_sll.stream_type,
4973                       'LINE_TYPE',
4974                       l_fin_fee.line_type
4975                      );
4976                    x_return_status := Okl_Api.G_RET_STS_ERROR;
4977                    exit;
4978                    --raise payment_end_date_invalid; --5189866
4979 
4980                 END IF;
4981 /* already there, check_pmnt_start_dt()
4982 
4983                 IF (l_strm_sll_start_date < l_start_date) THEN
4984                    OKL_API.set_message(
4985                         G_APP_NAME,
4986                         'OKL_QA_INVALID_STRM_START_DATE',
4987                         'STRM_TYPE',
4988                         l_strm_sll.stream_type,
4989                         'LINE_TYPE',
4990                         l_fin_fee.line_type
4991                      );
4992                    x_return_status := OKL_API.G_RET_STS_ERROR;
4993                 END IF;
4994 
4995 */
4996             END IF;
4997 
4998           END LOOP;
4999 
5000         END LOOP;
5001 
5002      --ELSE -- EXTERNAL stream generation
5003      ELSIF (l_strm_profile = 'EXTERNAL') THEN
5004 
5005         FOR l_fin_fee IN c_fin_fee(p_chr_id)
5006         LOOP
5007 
5008           FOR l_strm_slh_ext IN c_strm_slh_ext (p_chr_id,
5009                                                 l_fin_fee.id)
5010           LOOP
5011              l_strm_sll_ext_periods := 0;
5012              l_strm_sll_ext_stub_day := 0;
5013 
5014               -- START: cklee/mvasudev,06-02-2005,Bug#4392051/okl. 4437938
5015               l_pmnt_end_date := l_start_date;
5016 
5017 			         OPEN c_strm_sll_ext_count(l_strm_slh_ext.rule_id,
5018 		                                                  l_strm_slh_ext.rgp_id);
5019 		             FETCH c_strm_sll_ext_count INTO l_sll_count;
5020                      CLOSE c_strm_sll_ext_count;
5021 
5022 
5023 				IF l_sll_count > 1 THEN
5024 		            l_start_day := TO_CHAR(l_start_date,'DD');
5025 			    END IF;
5026                 -- END: cklee/mvasudev,06-02-2005,Bug#4392051/okl. 4437938
5027 
5028 
5029              FOR l_strm_sll_ext IN c_strm_sll_ext(l_strm_slh_ext.rule_id,
5030                                                   l_strm_slh_ext.rgp_id)
5031              LOOP
5032                -- START: cklee/mvasudev, 05/11/2006, Bug#4364266/okl.h 4437938
5033 		/*
5034                  l_strm_sll_ext_periods     := TO_NUMBER(NVL(l_strm_sll_ext.periods, 0)) + l_strm_sll_ext_periods;
5035                  l_strm_sll_ext_mpp         := l_strm_sll_ext.mpp;
5036                  l_strm_sll_ext_stub_day    := TO_NUMBER(NVL(l_strm_sll_ext.stub_day,0)) + l_strm_sll_ext_stub_day;
5037                  */
5038                  -- 5189866
5039                  l_pmnt_end_date := Fnd_Date.canonical_to_date(l_strm_sll_ext.start_date);
5040 		 IF l_sll_count > 1 THEN
5041 		   l_start_day := TO_CHAR(l_pmnt_end_date,'DD');
5042 	         END IF;
5043 
5044 		IF l_strm_sll_ext.stub_day IS NOT NULL THEN
5045                    l_pmnt_end_date := l_pmnt_end_date + TO_NUMBER(NVL(l_strm_sll_ext.stub_day,0));
5046 
5047             --vthiruva Bug#4392051..16-jun start..commented
5048             /*IF l_sll_count > 1 THEN
5049                        l_start_day := TO_CHAR(l_pmnt_end_date,'DD');
5050             END IF;*/
5051             --vthiruva 16-jun end..commented
5052 
5053 		ELSIF l_strm_sll_ext.periods IS NOT NULL THEN
5054              --vthiruva Bug#4392051..16-jun start..including l_start_day if l_sll_count > 1
5055              IF l_sll_count > 1 THEN
5056                    l_pmnt_end_date := Okl_Lla_Util_Pvt.calculate_end_date(l_pmnt_end_date, TO_NUMBER(NVL(l_strm_sll_ext.periods,0)) * l_strm_sll_ext.mpp,l_start_day, l_end_date) + 1; --Bug#5441811
5057                    --l_pmnt_end_date := Okl_Lla_Util_Pvt.calculate_end_date(l_pmnt_end_date, TO_NUMBER(NVL(l_strm_sll_ext.periods,0)) * l_strm_sll_ext.mpp,l_start_day) + 1;
5058              ELSE
5059                    l_pmnt_end_date := Okl_Lla_Util_Pvt.calculate_end_date(l_pmnt_end_date, TO_NUMBER(NVL(l_strm_sll_ext.periods,0)) * l_strm_sll_ext.mpp) + 1;
5060              END IF;
5061              --vthiruva 16-jun end..including l_start_day
5062 		END IF;
5063 
5064              -- 5189866
5065              l_pmnt_end_date := l_pmnt_end_date - 1;
5066              IF ( TRUNC(l_pmnt_end_date) > TRUNC(l_end_date)) THEN
5067 
5068                     Okl_Api.set_message(
5069                          G_APP_NAME,
5070                          'OKL_QA_INVALID_STRM_END_DATE',
5071                          'STRM_TYPE',
5072                          l_strm_slh_ext.stream_type,
5073                          'LINE_TYPE',
5074                          l_fin_fee.line_type
5075                         );
5076                  x_return_status := Okl_Api.G_RET_STS_ERROR;
5077                  --raise payment_end_date_invalid;
5078                  exit;
5079               END IF;
5080 
5081              END LOOP;
5082 
5083              --l_pmnt_end_date := l_pmnt_end_date - 1; -- 5189866
5084 
5085              /*
5086              l_pmnt_end_date := ADD_MONTHS(l_start_date, l_strm_sll_ext_periods * l_strm_sll_ext_mpp) - 1;
5087              IF (l_strm_sll_ext_stub_day <> 0) THEN
5088                 l_pmnt_end_date := l_pmnt_end_date + l_strm_sll_ext_stub_day;
5089              END IF;
5090              */
5091                -- END: cklee/mvasudev, 05/11/2006, Bug#4364266/okl.h 4437938
5092 
5093              --5189866
5094              /*IF ( TRUNC(l_pmnt_end_date) > TRUNC(l_end_date)) THEN
5095 
5096                     Okl_Api.set_message(
5097                          G_APP_NAME,
5098                          'OKL_QA_INVALID_STRM_END_DATE',
5099                          'STRM_TYPE',
5100                          l_strm_slh_ext.stream_type,
5101                          'LINE_TYPE',
5102                          l_fin_fee.line_type
5103                         );
5104                  x_return_status := Okl_Api.G_RET_STS_ERROR;
5105               END IF;*/
5106 
5107           END LOOP;
5108 
5109         END LOOP;
5110      END IF; -- Stream profile
5111 
5112  EXCEPTION
5113 
5114   WHEN payment_end_date_invalid THEN -- 5189866
5115     NULL;
5116   WHEN OTHERS THEN
5117     -- store SQL error message on message stack
5118     Okl_Api.SET_MESSAGE(
5119       p_app_name        => G_APP_NAME,
5120       p_msg_name        => G_UNEXPECTED_ERROR,
5121       p_token1          => G_SQLCODE_TOKEN,
5122       p_token1_value    => SQLCODE,
5123       p_token2          => G_SQLERRM_TOKEN,
5124       p_token2_value    => SQLERRM);
5125     -- notify caller of an error as UNEXPETED error
5126 
5127     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
5128 
5129     -- verify that cursor was closed
5130     /*
5131     *IF strm_profile_csr%ISOPEN THEN
5132     *  CLOSE strm_profile_csr;
5133     *END IF;
5134     */
5135 
5136     IF contract_csr%ISOPEN THEN
5137       CLOSE contract_csr;
5138     END IF;
5139 
5140   END check_payment_period;
5141 
5142 
5143   -- Start of comments
5144   --
5145   -- Procedure Name  : check_fee_lines
5146   -- Description     :
5147   -- Business Rules  :
5148   -- Parameters      :
5149   -- Version         : 1.0
5150   -- End of comments
5151 
5152 /*
5153   PROCEDURE check_fee_lines(
5154     x_return_status            OUT NOCOPY VARCHAR2,
5155     p_chr_id                   IN  NUMBER
5156   ) IS
5157 
5158     l_return_status	VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
5159     l_dummy VARCHAR2(1) := '?';
5160     l_count NUMBER := 0;
5161     l_row_notfound BOOLEAN;
5162     l_token VARCHAR2(2000);
5163 
5164 
5165     CURSOR l_contract_name ( n VARCHAR2 ) IS
5166     Select count(*) cnt
5167     From okc_k_headers_v where contract_number = n;
5168     l_cn l_contract_name%ROWTYPE;
5169 
5170 
5171     l_hdr     l_hdr_csr%ROWTYPE;
5172     l_txl     l_txl_csr%ROWTYPE;
5173     l_txd     l_txd_csr%ROWTYPE;
5174     l_lne     l_lne_csr%ROWTYPE;
5175     l_itm     l_itms_csr%ROWTYPE;
5176     l_struct_rec l_struct_csr%ROWTYPE;
5177     l_structure  NUMBER;
5178     l_rl_rec1 l_rl_csr1%ROWTYPE;
5179     i NUMBER;
5180 
5181 
5182     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
5183     l_supp_rec supp_csr%ROWTYPE;
5184     l_lne l_lne_csr%ROWTYPE;
5185     l_fee_strm_type_rec  fee_strm_type_csr%ROWTYPE;
5186     l_strm_name_rec strm_name_csr%ROWTYPE;
5187 
5188     l_inflow_defined_yn VARCHAR2(1);
5189     l_outflow_defined_yn VARCHAR2(1);
5190 
5191     n NUMBER := 0;
5192 
5193   BEGIN
5194 
5195     -- initialize return status
5196     x_return_status := OKL_API.G_RET_STS_SUCCESS;
5197 
5198     FOR l_lne IN l_lne_csr('FEE', p_chr_id)
5199     LOOP
5200 
5201         l_inflow_defined_yn := 'N';
5202         l_outflow_defined_yn := 'N';
5203 
5204         OPEN  fee_strm_type_csr  ( l_lne.id, 'FEE' );
5205         FETCH fee_strm_type_csr into l_fee_strm_type_rec;
5206         CLOSE fee_strm_type_csr;
5207 
5208       If ( l_fee_strm_type_rec.strm_name <> 'SECURITY DEPOSIT') Then
5209 
5210         OPEN  l_rl_csr1( 'LAFEXP', 'LAFEXP', TO_NUMBER(p_chr_id), l_lne.id );
5211         FETCH l_rl_csr1 into l_rl_rec1;
5212         IF l_rl_csr1%FOUND THEN
5213             l_outflow_defined_yn := 'Y';
5214         END IF;
5215         CLOSE l_rl_csr1;
5216 
5217         n := 0;
5218         FOR l_rl_rec1 in l_rl_csr1( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), l_lne.id )
5219         LOOP
5220             n := n + 1;
5221         END LOOP;
5222 
5223         If ( n > 1 ) Then
5224 
5225                 OKL_API.set_message(
5226                   p_app_name     => G_APP_NAME,
5227                   p_msg_name     => 'OKL_QA_ONLY_1PAY',
5228                   p_token1       => 'line',
5229                   p_token1_value => l_fee_strm_type_rec.strm_name);
5230                 x_return_status := OKL_API.G_RET_STS_ERROR;
5231                 RAISE G_EXCEPTION_HALT_VALIDATION;
5232 
5233         End If;
5234 
5235         OPEN  l_rl_csr1( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), l_lne.id );
5236         FETCH l_rl_csr1 into l_rl_rec1;
5237         IF l_rl_csr1%FOUND THEN
5238             l_inflow_defined_yn := 'Y';
5239         END IF;
5240         CLOSE l_rl_csr1;
5241 
5242         If (  l_inflow_defined_yn = 'Y' ) Then
5243 
5244             OPEN  strm_name_csr ( l_rl_rec1.object1_id1 );
5245             FETCH strm_name_csr into l_strm_name_rec;
5246             IF strm_name_csr%NOTFOUND THEN
5247                 CLOSE strm_name_csr;
5248                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5249             END IF;
5250             CLOSE strm_name_csr;
5251 
5252             If ( l_strm_name_rec.name <> l_fee_strm_type_rec.strm_name ) Then
5253 
5254                     OKL_API.set_message(
5255                       p_app_name     => G_APP_NAME,
5256                       p_msg_name     => 'OKL_QA_STRM_DONT_MATCH',
5257                       p_token1       => 'line',
5258                       p_token1_value => l_fee_strm_type_rec.strm_name);
5259                     x_return_status := OKL_API.G_RET_STS_ERROR;
5260                     RAISE G_EXCEPTION_HALT_VALIDATION;
5261 
5262             End If;
5263 
5264         End If;
5265 
5266         If ( ( l_fee_strm_type_rec.capitalize_yn = 'Y' ) AND
5267              ( l_outflow_defined_yn = 'Y' OR l_inflow_defined_yn = 'Y' ) ) Then
5268 
5269                 OKL_API.set_message(
5270                   p_app_name     => G_APP_NAME,
5271                   p_msg_name     => 'OKL_QA_NO_FLOWS_CAPFEE',
5272                   p_token1       => 'line',
5273                   p_token1_value => l_fee_strm_type_rec.strm_name);
5274                 x_return_status := OKL_API.G_RET_STS_ERROR;
5275                 RAISE G_EXCEPTION_HALT_VALIDATION;
5276 
5277         End If;
5278 
5279         If ( l_fee_strm_type_rec.stream_type_class <> 'EXPENSE'  AND l_outflow_defined_yn = 'Y' ) Then
5280 
5281                 OKL_API.set_message(
5282                   p_app_name     => G_APP_NAME,
5283                   p_msg_name     => 'OKL_QA_NO_OUTFLOWS_EXPENSE',
5284                   p_token1       => 'line',
5285                   p_token1_value => l_fee_strm_type_rec.strm_name);
5286                 x_return_status := OKL_API.G_RET_STS_ERROR;
5287 
5288         End If;
5289 
5290         If (  l_outflow_defined_yn = 'Y' AND l_inflow_defined_yn = 'Y'  ) Then
5291                 OKL_API.set_message(
5292                   p_app_name     => G_APP_NAME,
5293                   p_msg_name     => 'OKL_QA_NO_INOUT_FLOWS',
5294                   p_token1       => 'line',
5295                   p_token1_value => l_fee_strm_type_rec.strm_name);
5296                 x_return_status := OKL_API.G_RET_STS_ERROR;
5297         End If;
5298 
5299       End If;
5300 
5301     END LOOP;
5302 
5303   IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
5304       OKL_API.set_message(
5305         p_app_name      => G_APP_NAME,
5306         p_msg_name      => G_QA_SUCCESS);
5307   END IF;
5308 
5309 
5310   EXCEPTION
5311 
5312   WHEN G_EXCEPTION_HALT_VALIDATION THEN
5313     -- no processing necessary; validation can continue with next column
5314     IF l_rl_csr1%ISOPEN THEN
5315       CLOSE l_rl_csr1;
5316     END IF;
5317   WHEN OTHERS THEN
5318     -- store SQL error message on message stack
5319     OKL_API.SET_MESSAGE(
5320       p_app_name        => G_APP_NAME,
5321       p_msg_name        => G_UNEXPECTED_ERROR,
5322       p_token1	        => G_SQLCODE_TOKEN,
5323       p_token1_value    => SQLCODE,
5324       p_token2          => G_SQLERRM_TOKEN,
5325       p_token2_value    => SQLERRM);
5326     -- notify caller of an error as UNEXPETED error
5327     x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5328     -- verify that cursor was closed
5329     IF l_lne_csr%ISOPEN THEN
5330       CLOSE l_lne_csr;
5331     END IF;
5332     IF l_hdr_csr%ISOPEN THEN
5333       CLOSE l_hdr_csr;
5334     END IF;
5335     IF l_txl_csr%ISOPEN THEN
5336       CLOSE l_txl_csr;
5337     END IF;
5338 
5339   End check_fee_lines;
5340 */
5341 
5342 -- Added for bug 5115701 -- start
5343 
5344  FUNCTION Are_assets_associated (p_chr_id IN NUMBER, p_kle_id in number) RETURN  VARCHAR2 IS
5345 
5346 
5347      CURSOR l_assets_asso_csr(chrId IN NUMBER, kleId in NUMBER) IS
5348     SELECT cleb.id
5349     FROM okc_k_lines_b cleb
5350 
5351     WHERE cleb.dnz_chr_id = chrId
5352     AND cleb.chr_id = chrId
5353     AND CLEB.ID =kleId
5354     and exists
5355     (  SELECT '1'
5356     FROM okc_k_lines_b cleb1,
5357          okc_statuses_b okcsts1
5358     WHERE cleb1.dnz_chr_id = cleb.chr_id
5359     AND cleb1.cle_id = cleb.id
5360     AND okcsts1.code = cleb1.sts_code
5361     AND okcsts1.ste_code NOT IN ('EXPIRED','HOLD','CANCELLED','TERMINATED'));
5362 
5363     l_assets_associated VARCHAR2(1) DEFAULT 'N';
5364 
5365 BEGIN
5366     l_assets_associated := 'N';
5367 
5368 
5369     OPEN l_assets_asso_csr(chrid => p_chr_id,  kleId => p_kle_id);
5370     FETCH l_assets_asso_csr INTO l_assets_associated;
5371     IF l_assets_asso_csr%NOTFOUND THEN
5372         NULL;
5373     END IF;
5374     CLOSE l_assets_asso_csr;
5375     RETURN(l_assets_associated);
5376     EXCEPTION
5377 
5378     WHEN OTHERS THEN
5379          IF l_assets_asso_csr%ISOPEN THEN
5380              CLOSE l_assets_asso_csr;
5381          END IF;
5382          RETURN('Y');
5383 END Are_assets_associated;
5384 -- Added for bug 5115701 -- End
5385 
5386 
5387   PROCEDURE check_fee_lines(
5388                             x_return_status            OUT NOCOPY VARCHAR2,
5389                             p_chr_id                   IN  NUMBER
5390                            ) IS
5391   CURSOR fee_line_csr (p_chrId OKC_K_HEADERS_V.ID%TYPE) IS
5392   SELECT l.id,
5393          l.line_number,
5394          l.start_date,
5395          l.end_date,
5396          l.name,
5397          l.amount,
5398          l.capital_amount,
5399          l.fee_type
5400   FROM   okl_k_lines_full_v l,
5401          okc_line_styles_v sty,
5402          okc_statuses_v sts
5403   WHERE  l.lse_id = sty.id
5404   AND    l.sts_code = sts.code
5405   AND    sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
5406   AND    sty.lty_code = 'FEE'
5407   AND    l.dnz_chr_id = p_chrId;
5408 
5409   CURSOR fee_meaning_csr (p_fee_type_code FND_LOOKUPS.LOOKUP_CODE%TYPE) IS
5410   SELECT meaning
5411   FROM   fnd_lookups
5412   WHERE  lookup_code = p_fee_type_code
5413   AND    lookup_type = 'OKL_FEE_TYPES';
5414 
5415   --------------
5416   --Bug# 4350255
5417   --------------
5418 
5419   CURSOR pth_hdr_csr(p_chr_id IN NUMBER,
5420                      p_cle_id IN NUMBER) IS
5421   SELECT 1
5422   FROM   okl_party_payment_hdr pph
5423   WHERE  cle_id = p_cle_id
5424   AND    dnz_chr_id = p_chr_id
5425   AND    passthru_term = 'BASE';
5426 
5427   --------------
5428   --Bug# 4350255
5429   --------------
5430 
5431   l_fee_type    FND_LOOKUPS.MEANING%TYPE;
5432   l_pmnt_amount NUMBER;
5433 
5434   l_tot_pmnt    NUMBER := 0;
5435   l_exp_present VARCHAR2(1) := 'N';
5436   l_pth_present VARCHAR2(1) := 'N';
5437   l_tot_secdep  NUMBER := 0;
5438 
5439   l_exp_period  NUMBER;
5440   l_exp_amount  NUMBER;
5441   l_exp_freq    VARCHAR2(20);
5442   l_mult_factor NUMBER;
5443 
5444   BEGIN
5445 
5446     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
5447 
5448     l_tot_secdep := 0;
5449     FOR fee_line_rec IN fee_line_csr (p_chr_id)
5450     LOOP
5451 
5452 
5453              -- Get Fee type meaning
5454        FOR fee_meaning_rec IN fee_meaning_csr (fee_line_rec.fee_type)
5455        LOOP
5456           l_fee_type := fee_meaning_rec.meaning;
5457        END LOOP;
5458 
5459        -- gk added
5460      IF fee_line_rec.fee_type NOT IN ('FINANCED','ROLLOVER','CAPITALIZED') THEN
5461 
5462      IF Are_assets_associated(p_chr_id => p_chr_id, p_kle_id => fee_line_rec.ID  ) = 'Y' THEN
5463               Okl_Api.set_message(
5464                   p_app_name     => G_APP_NAME,
5465                   p_msg_name     => 'OKL_QA_ASSET_CANT_ASSOC',
5466                    p_token1       => 'fee_type',
5467                   p_token1_value => l_fee_type,
5468                   p_token2       => 'line',
5469                   p_token2_value => fee_line_rec.name
5470 
5471                  );
5472 
5473           x_return_status := Okl_Api.G_RET_STS_ERROR;
5474      END IF;
5475      END IF;
5476 -- gk added
5477 
5478        --
5479        -- 1. FEE line should have only 1 payment defined
5480        --
5481        l_tot_pmnt := 0;
5482        FOR l_rl_rec1 IN l_rl_csr1( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), fee_line_rec.id )
5483        LOOP
5484           l_tot_pmnt := l_tot_pmnt + 1;
5485        END LOOP;
5486 
5487        IF ( l_tot_pmnt > 1 ) THEN
5488 
5489           Okl_Api.set_message(
5490                   p_app_name     => G_APP_NAME,
5491                   p_msg_name     => 'OKL_QA_ONLY_1PAY',
5492                   p_token1       => 'line',
5493                   p_token1_value => fee_line_rec.name
5494                  );
5495 
5496           x_return_status := Okl_Api.G_RET_STS_ERROR;
5497 
5498        END IF;
5499 
5500        --
5501        -- 2. For FEE_TYPE = Miscellaneous, Security Deposit, Pass through, Financed, Income
5502        --    Payments must be defined
5503        --
5504        --Bug# 4996899: Financed fee payments will be validated separately by check_financed_fees procedure
5505        --IF (fee_line_rec.fee_type IN ('MISCELLANEOUS', 'SECDEPOSIT', 'PASSTHROUGH', 'FINANCED','INCOME')) THEN
5506          IF (fee_line_rec.fee_type IN ('MISCELLANEOUS', 'SECDEPOSIT', 'PASSTHROUGH', 'INCOME')) THEN
5507           l_tot_pmnt := 0;
5508           FOR l_rl_rec1 IN l_rl_csr1( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), fee_line_rec.id )
5509           LOOP
5510              l_tot_pmnt := l_tot_pmnt + 1;
5511           END LOOP;
5512 
5513           IF (l_tot_pmnt = 0) THEN
5514              Okl_Api.set_message(
5515                   p_app_name     => G_APP_NAME,
5516                   p_msg_name     => 'OKL_QA_NO_PMNT',
5517                   p_token1       => 'FEE_TYPE',
5518                   p_token1_value => l_fee_type,
5519                   p_token2       => 'STRM_TYPE',
5520                   p_token2_value => fee_line_rec.name
5521                  );
5522 
5523              x_return_status := Okl_Api.G_RET_STS_ERROR;
5524           END IF;
5525 
5526        END IF; -- check 2
5527 
5528        --
5529        -- 3. For FEE_TYPE = Miscellaneous, Expense, Absorbed, Financed
5530        --    Expense must be defined, expense must be within fee effectivity
5531        --    Also expense amount must be equal to Fee line amount
5532        --
5533        --    Absorbed Fee Type has been removed from financed expense check
5534        --    as per Bug# 3316775
5535        --
5536        IF (fee_line_rec.fee_type IN ('MISCELLANEOUS', 'EXPENSE', 'FINANCED')) THEN
5537 
5538           l_exp_present := '?';
5539           FOR l_rl_rec1 IN l_rl_csr1( 'LAFEXP', 'LAFEXP', TO_NUMBER(p_chr_id), fee_line_rec.id )
5540           LOOP
5541             l_exp_present := 'Y';
5542             l_exp_period  := TO_NUMBER(l_rl_rec1.rule_information1);
5543             l_exp_amount  := TO_NUMBER(l_rl_rec1.rule_information2);
5544           END LOOP;
5545 
5546           FOR l_rl_rec1 IN l_rl_csr1( 'LAFEXP', 'LAFREQ', TO_NUMBER(p_chr_id), fee_line_rec.id )
5547           LOOP
5548             l_exp_freq  := l_rl_rec1.object1_id1;
5549           END LOOP;
5550 
5551           IF (l_exp_present <> 'Y') THEN
5552              Okl_Api.set_message(
5553                   p_app_name     => G_APP_NAME,
5554                   p_msg_name     => 'OKL_QA_NO_EXP',
5555                   p_token1       => 'FEE_TYPE',
5556                   p_token1_value => l_fee_type,
5557                   p_token2       => 'STRM_TYPE',
5558                   p_token2_value => fee_line_rec.name
5559                  );
5560 
5561              x_return_status := Okl_Api.G_RET_STS_ERROR;
5562 
5563           ELSE
5564 
5565              --
5566              -- Expense period between contract effectivity
5567              --
5568              l_mult_factor := 1;
5569              IF (l_exp_freq = 'M') THEN
5570               l_mult_factor := 1;
5571              ELSIF (l_exp_freq = 'Q') THEN
5572               l_mult_factor := 3;
5573              ELSIF (l_exp_freq = 'S') THEN
5574               l_mult_factor := 6;
5575              ELSIF (l_exp_freq = 'A') THEN
5576               l_mult_factor := 12;
5577              END IF;
5578 
5579              IF (TRUNC(fee_line_rec.end_date) < (TRUNC(ADD_MONTHS(fee_line_rec.start_date, l_exp_period * l_mult_factor)-1))) THEN
5580                  Okl_Api.set_message(
5581                                      G_APP_NAME,
5582                                      'OKL_QA_RECUR_PERIOD',
5583                                      'STRM_TYPE',
5584                                      fee_line_rec.name
5585                                     );
5586                  x_return_status := Okl_Api.G_RET_STS_ERROR;
5587              END IF;
5588 
5589              l_exp_amount := l_exp_amount * l_exp_period;
5590              --l_exp_amount := l_exp_amount * l_exp_period * l_mult_factor;
5591 
5592              IF (fee_line_rec.amount <> l_exp_amount) THEN
5593                  Okl_Api.set_message(
5594                                      G_APP_NAME,
5595                                      'OKL_QA_EXP_AMT_MISMATCH',
5596                                      'FEE_TYPE',
5597                                      l_fee_type,
5598                                      'STRM_TYPE',
5599                                      fee_line_rec.name
5600                                     );
5601                  x_return_status := Okl_Api.G_RET_STS_ERROR;
5602              END IF;
5603 
5604          END IF; -- expense
5605 
5606        END IF; -- check 3
5607 
5608        --
5609        -- 4. For FEE_TYPE = Passthrough and Expense
5610        --    Passthrough must be defined
5611        --
5612        IF (fee_line_rec.fee_type = 'PASSTHROUGH') THEN
5613 
5614           -- Bug# 4350255
5615           l_pth_present := '?';
5616           FOR pth_hdr_rec IN pth_hdr_csr( p_chr_id => TO_NUMBER(p_chr_id),
5617                                           p_cle_id => fee_line_rec.id )
5618           LOOP
5619             l_pth_present := 'Y';
5620           END LOOP;
5621 
5622           IF (l_pth_present <> 'Y') THEN
5623              Okl_Api.set_message(
5624                   p_app_name     => G_APP_NAME,
5625                   p_msg_name     => 'OKL_QA_NO_PTH',
5626                   p_token1       => 'STRM_TYPE',
5627                   p_token1_value => fee_line_rec.name
5628                  );
5629 
5630              x_return_status := Okl_Api.G_RET_STS_ERROR;
5631           END IF;
5632 
5633        END IF; -- check 4
5634 
5635        --
5636        -- 5. Only one Security Deposite in a contract
5637        --
5638        IF (fee_line_rec.fee_type = 'SECDEPOSIT') THEN
5639          l_tot_secdep := l_tot_secdep + 1;
5640        END IF;
5641 
5642        --
5643        -- 6. No GENERAL Fee type should be there on a contract
5644        --
5645        IF (fee_line_rec.fee_type = 'GENERAL') THEN
5646           Okl_Api.set_message(
5647                   p_app_name     => G_APP_NAME,
5648                   p_msg_name     => 'OKL_QA_GEN_NOTALLOW'
5649                  );
5650 
5651           x_return_status := Okl_Api.G_RET_STS_ERROR;
5652           --GOTO check_next_line;
5653        END IF;
5654 
5655        --
5656        -- 7. Payment amount for Security Deposite,Passthrough, Income
5657        --    must be equal to Fee line amount
5658        --
5659        IF (fee_line_rec.fee_type IN ('SECDEPOSIT','PASSTHROUGH', 'INCOME') ) THEN
5660 
5661           l_pmnt_amount := 0;
5662           FOR l_rl_rec1 IN l_rl_csr1( 'LALEVL', 'LASLL', TO_NUMBER(p_chr_id), fee_line_rec.id )
5663           LOOP
5664 
5665              IF (l_rl_rec1.rule_information8 IS NOT NULL) THEN
5666                 l_pmnt_amount := l_pmnt_amount + TO_NUMBER(NVL(l_rl_rec1.rule_information8,'0'));
5667              ELSE
5668                 l_pmnt_amount := l_pmnt_amount + ( TO_NUMBER(NVL(l_rl_rec1.rule_information6,'0')) *
5669                                                    TO_NUMBER(NVL(l_rl_rec1.rule_information3,'1')) );
5670              END IF;
5671 
5672              IF (fee_line_rec.fee_type = 'SECDEPOSIT'
5673                  AND
5674                  l_rl_rec1.rule_information7 IS NOT NULL) THEN
5675                   Okl_Api.set_message(
5676                                       G_APP_NAME,
5677                                       'OKL_QA_SECR_STUB',
5678                                       'STRM_TYPE',
5679                                       fee_line_rec.name
5680                                      );
5681                   x_return_status := Okl_Api.G_RET_STS_ERROR;
5682              END IF;
5683           END LOOP;
5684 
5685           IF (l_pmnt_amount <> fee_line_rec.amount) THEN
5686               Okl_Api.set_message(
5687                                   G_APP_NAME,
5688                                   'OKL_QA_SECR_PAYMENT',
5689                                   'FEE_TYPE',
5690                                   l_fee_type,
5691                                   'STRM_TYPE',
5692                                   fee_line_rec.name
5693                                  );
5694               x_return_status := Okl_Api.G_RET_STS_ERROR;
5695           END IF;
5696 
5697        END IF; --7
5698 
5699     END LOOP; -- fee_line_csr
5700 
5701     -- check 5 cont.
5702     IF (l_tot_secdep > 1) THEN
5703        Okl_Api.set_message(
5704                   p_app_name     => G_APP_NAME,
5705                   p_msg_name     => 'OKL_QA_SECDEP_MORE1'
5706                  );
5707 
5708        x_return_status := Okl_Api.G_RET_STS_ERROR;
5709     END IF;
5710 
5711     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
5712       Okl_Api.set_message(
5713         p_app_name      => G_APP_NAME,
5714         p_msg_name      => G_QA_SUCCESS);
5715     END IF;
5716 
5717   EXCEPTION
5718 
5719     WHEN OTHERS THEN
5720       NULL;
5721   END check_fee_lines;
5722 
5723 
5724 
5725 
5726     ----------------------------------------------------------------------------
5727     --start of comments
5728     --API Name    : check_rolloverQuotes
5729     --Description : API called to validate the rollover quote on a contract.
5730     --              Check if the Rollover fee amount is equal to Rollover
5731     --              qupte amount.
5732     --Parameters  : IN  - p_chr_id - Contract Number
5733     --              OUT - x_return_status - Return Status
5734     --History     : 23-Aug-2004 Manu Created
5735     --
5736     --
5737     --end of comments
5738     -----------------------------------------------------------------------------
5739 
5740     PROCEDURE check_rolloverQuotes(
5741     x_return_status            OUT NOCOPY VARCHAR2,
5742     p_chr_id                   IN  NUMBER)  IS
5743 
5744 
5745       l_return_status   VARCHAR2(1)           := Okl_Api.G_RET_STS_SUCCESS;
5746       l_api_version	CONSTANT NUMBER	      := 1.0;
5747       l_init_msg_list   VARCHAR2(1) DEFAULT Okc_Api.G_FALSE;
5748       l_msg_count       NUMBER;
5749       l_msg_data        VARCHAR2(1000);
5750       l_api_name        CONSTANT VARCHAR2(30) := 'CHECK_ROLLOVERQUOTES';
5751 
5752       l_not_found	BOOLEAN := FALSE;
5753       l_amt		NUMBER;
5754       l_found		VARCHAR2(1);
5755 
5756 
5757     /* Cursor to get the top fee line and the rollover quote
5758        for top fee line of a given contract. */
5759 
5760     CURSOR l_rq_top_fee_ln_csr ( chrID IN OKC_K_HEADERS_B.ID%TYPE ) IS
5761     SELECT kle.id, kle.qte_id, kle.amount, cleb.name
5762     FROM okc_k_lines_v cleb,
5763          okl_k_lines kle
5764     WHERE cleb.dnz_chr_id = chrID
5765         AND kle.ID = cleb.ID
5766         AND kle.fee_type = 'ROLLOVER'
5767         -- AND cleb.sts_code NOT IN ('HOLD','EXPIRED','TERMINATED','CANCELLED', 'ABANDONED');
5768         AND    NOT EXISTS (
5769                      SELECT 'Y'
5770                  FROM   okc_statuses_v okcsts
5771                  WHERE  okcsts.code = cleb.sts_code
5772                  AND    okcsts.ste_code IN ('EXPIRED','HOLD','CANCELLED','TERMINATED', 'ABANDONED'));
5773 
5774 
5775     /* Cursor to get the top fee line and the rollover quote
5776        for top fee line of a given contract. */
5777 
5778     CURSOR l_rq_top_fee_ln_csr1 ( chrID IN OKC_K_HEADERS_B.ID%TYPE ) IS
5779     SELECT kle.qte_id
5780     FROM okc_k_lines_b cleb,
5781          okl_k_lines kle
5782     WHERE cleb.dnz_chr_id = chrID
5783         AND kle.ID = cleb.ID
5784         AND kle.fee_type = 'ROLLOVER'
5785         -- AND cleb.sts_code NOT IN ('HOLD','EXPIRED','TERMINATED','CANCELLED', 'ABANDONED');
5786         AND    NOT EXISTS (
5787                      SELECT 'Y'
5788                  FROM   okc_statuses_v okcsts
5789                  WHERE  okcsts.code = cleb.sts_code
5790                  AND    okcsts.ste_code IN ('EXPIRED','HOLD','CANCELLED','TERMINATED', 'ABANDONED'));
5791 
5792 
5793     /* Cursor to get the rollover quote fee sub-lines (applied to assets) for a
5794        given contract. */
5795 
5796     CURSOR l_rq_sub_ln_fee_csr ( chrID IN OKC_K_HEADERS_B.ID%TYPE,
5797                                  feeTopLine IN OKL_K_LINES.ID%TYPE) IS
5798     SELECT kle.id, kle.amount, cleb.end_date
5799     FROM okc_k_lines_b cleb,
5800          okl_k_lines kle
5801     WHERE cleb.dnz_chr_id = chrID
5802         AND kle.ID = cleb.ID
5803         AND cleb.CLE_ID = feeTopLine
5804         -- AND cleb.sts_code NOT IN ('HOLD','EXPIRED','TERMINATED','CANCELLED', 'ABANDONED');
5805         AND    NOT EXISTS (
5806                      SELECT 'Y'
5807                  FROM   okc_statuses_v okcsts
5808                  WHERE  okcsts.code = cleb.sts_code
5809                  --Bug# 4959361: Include Terminated lines when fetching sub-line amount
5810                  --AND    okcsts.ste_code IN ('EXPIRED','HOLD','CANCELLED','TERMINATED', 'ABANDONED'));
5811                  AND    okcsts.ste_code IN ('EXPIRED','HOLD','CANCELLED','ABANDONED'));
5812 
5813 
5814     /* Cursor to get the Quote Number. */
5815 
5816     CURSOR l_qte_number_csr ( qteID IN OKL_TRX_QUOTES_V.ID%TYPE ) IS
5817     SELECT quote_number
5818     FROM okl_trx_quotes_v
5819     WHERE id = qteID;
5820 
5821 
5822     /* Cursor to get the rollover quote fee top/sub-line payments for a
5823        given contract. */
5824 
5825     CURSOR l_rq_fee_pmt_csr ( chrID IN OKC_K_HEADERS_B.ID%TYPE,
5826                               feeLine IN OKL_K_LINES.ID%TYPE) IS
5827 
5828     SELECT sll.rule_information2 start_date,
5829            SLL.rule_information3 periods,
5830            DECODE(sll.object1_id1, 'M', 1, 'Q', 3, 'S', 6, 'A', 12) mpp,
5831            TRUNC(ADD_MONTHS(Fnd_Date.canonical_to_date(sll.rule_information2),
5832              TO_NUMBER(SLL.rule_information3)*DECODE(sll.object1_id1, 'M', 1, 'Q', 3, 'S', 6, 'A', 12)) - 1) end_date,
5833            styt.name stream_type
5834           FROM   okc_rules_b sll,
5835                  okc_rules_b slh,
5836                  okc_rule_groups_b rgp,
5837                  okl_strm_type_b sty,
5838                  okl_strm_type_tl styt
5839           WHERE  rgp.dnz_chr_id                = chrID
5840             AND  rgp.cle_id                    = feeLine
5841             AND  rgp.rgd_code                  = 'LALEVL'
5842             AND  rgp.id                        = slh.rgp_id
5843             AND  slh.rule_information_category = 'LASLH'
5844             AND  slh.object1_id1               = TO_CHAR(sty.id)
5845             AND  styt.LANGUAGE                 = USERENV('LANG')
5846             AND  sty.id                        = styt.id
5847             AND  TO_CHAR(slh.id)               = sll.object2_id1
5848             AND  sll.rule_information_category = 'LASLL';
5849 
5850 
5851     /* Cursor to get the rollover quote fee top/sub-line payments HEADER for a
5852        given contract. */
5853 
5854     CURSOR l_rq_fee_pmtH_csr ( chrID IN OKC_K_HEADERS_B.ID%TYPE,
5855                               feeLine IN OKL_K_LINES.ID%TYPE) IS
5856 
5857     SELECT slh.id
5858           FROM   okc_rules_b slh,
5859                  okc_rule_groups_b rgp,
5860                  okl_strm_type_b sty,
5861                  okl_strm_type_tl styt
5862           WHERE  rgp.dnz_chr_id                = chrID
5863             AND  rgp.cle_id                    = feeLine
5864             AND  rgp.rgd_code                  = 'LALEVL'
5865             AND  rgp.id                        = slh.rgp_id
5866             AND  slh.rule_information_category = 'LASLH'
5867             AND  slh.object1_id1               = TO_CHAR(sty.id)
5868             AND  styt.LANGUAGE                 = USERENV('LANG')
5869             AND  sty.id                        = styt.id;
5870 
5871     l_top_fee_ln_id OKL_K_LINES.ID%TYPE;
5872     l_top_fee_ln_name OKC_K_LINES_V.NAME%TYPE;
5873     l_sub_fee_ln_id OKL_K_LINES.ID%TYPE;
5874     l_qte_id OKL_K_LINES.QTE_ID%TYPE;
5875     l_qte_num OKL_TRX_QUOTES_V.QUOTE_NUMBER%TYPE;
5876     p_term_tbl Okl_Trx_Quotes_Pub.qtev_tbl_type;
5877     x_term_tbl Okl_Trx_Quotes_Pub.qtev_tbl_type;
5878     x_err_msg VARCHAR2(1000);
5879 
5880     l_tq_rec_count NUMBER        := 0; -- Rollover fee line count on a contract
5881     l_rq_sub_ln_fee_cnt   NUMBER := 0;
5882     l_rq_dup_trm_qt_cnt   NUMBER := 0;
5883     l_pmt_dup_sub_ln_cnt  NUMBER := 0; -- Counter for duplicate payments for a sub-line.
5884     l_payment_top_ln_cnt  NUMBER := 0; -- Counter for rollover payments top lines
5885     l_payment_sub_ln_cnt  NUMBER := 0; -- Counter for rollover payments sub-lines
5886     l_rq_top_ln_fee_amt   NUMBER := 0; -- Rollover top line total fee amount.
5887     l_rq_sub_ln_fee_amt   NUMBER := 0; -- Rollover sum of sub-line fee amount.
5888     l_top_ln_pmt_exist   BOOLEAN := FALSE;
5889     l_rq_sln_fee_amt_chk BOOLEAN := FALSE; -- If there are sub-lines payments exists.
5890 
5891   BEGIN
5892       x_return_status := Okl_Api.G_RET_STS_SUCCESS;
5893 
5894       -- OPEN l_rq_top_fee_ln_csr ( chrID => p_chr_id );
5895       FOR l_rq_top_fee_ln IN l_rq_top_fee_ln_csr ( chrID => p_chr_id )
5896       LOOP
5897         --FETCH l_rq_top_fee_ln_csr INTO l_top_fee_ln_id, l_qte_id;
5898         --IF( l_rq_top_fee_ln_csr%FOUND ) THEN
5899 
5900         /* Store the amount for rollover fee top line */
5901         l_rq_top_ln_fee_amt := l_rq_top_fee_ln.amount;
5902 
5903         /* Store the Top Fee Line Name */
5904         l_top_fee_ln_name   := l_rq_top_fee_ln.name;
5905 
5906         /* Call the API to validate the rollover termination quotes
5907            for a given contract. This API is also called before
5908            activating the contract. */
5909 
5910         l_return_status := x_return_status;
5911         Okl_Maintain_Fee_Pvt.validate_rollover_feeLine(
5912             p_api_version     => l_api_version,
5913             p_init_msg_list   => l_init_msg_list,
5914             x_return_status   => l_return_status,
5915             x_msg_count       => l_msg_count,
5916             x_msg_data        => l_msg_data,
5917             p_chr_id          => p_chr_id,
5918             p_qte_id          => l_rq_top_fee_ln.qte_id,
5919             p_for_qa_check    => TRUE);
5920 
5921            -- dedey 01/21/05 Bug 4134571
5922            IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
5923               x_return_status := Okl_Api.G_RET_STS_ERROR;
5924            END IF;
5925 
5926         /* Check Payments for the top fee line if they exist. If there are multiple
5927            payments for the top line error out.
5928            CHECK FOR PAYMENT HEADER. */
5929         FOR l_rq_fee_pmtH IN l_rq_fee_pmtH_csr ( chrID => p_chr_id, feeLine => l_rq_top_fee_ln.id )
5930         LOOP
5931           l_top_ln_pmt_exist := TRUE;
5932           l_payment_top_ln_cnt := l_payment_top_ln_cnt + 1;
5933 
5934 
5935           /* ALREADY CHECKED. Please enter only one payment type per fee line.
5936              (line=SERVICE AND MAINTENANCE)
5937           IF (l_payment_top_ln_cnt > 1) THEN
5938              OPEN l_qte_number_csr(qteID => l_rq_top_fee_ln.qte_id);
5939              FETCH l_qte_number_csr INTO l_qte_num;
5940              CLOSE l_qte_number_csr;
5941              x_return_status := OKL_API.G_RET_STS_ERROR;
5942              OKL_API.set_message(
5943 		                  p_app_name     => G_APP_NAME,
5944 		                  p_msg_name     => 'OKL_QA_RQ_MLTP_PMTS_TOP_LN',
5945          	                  p_token1       => 'quoteNum',
5946                   		  p_token1_value => l_qte_num);
5947           END IF;
5948           ********************************/
5949         END LOOP;
5950         l_payment_top_ln_cnt := 0;
5951 
5952         /* Check for any given contract, each rollover fee line must
5953            point to a different termination quote. */
5954 
5955         l_rq_dup_trm_qt_cnt := 0;
5956         FOR l_rq_top_fee_ln1 IN l_rq_top_fee_ln_csr1 ( chrID => p_chr_id )
5957         LOOP
5958           IF (l_rq_top_fee_ln1.qte_id = l_rq_top_fee_ln.qte_id) THEN
5959             l_rq_dup_trm_qt_cnt := l_rq_dup_trm_qt_cnt + 1;
5960             IF ( l_rq_dup_trm_qt_cnt > 1 ) THEN
5961               OPEN l_qte_number_csr(qteID => l_rq_top_fee_ln.qte_id);
5962               FETCH l_qte_number_csr INTO l_qte_num;
5963               CLOSE l_qte_number_csr;
5964               x_return_status := Okl_Api.G_RET_STS_ERROR;
5965               Okl_Api.set_message(
5966 		                  p_app_name     => G_APP_NAME,
5967 		                  p_msg_name     => 'OKL_QA_DUP_TERM_QUOTE');
5968             END IF;
5969           END IF;
5970         END LOOP;
5971         l_rq_dup_trm_qt_cnt := 0;
5972 
5973         /* Check payments for rollover quote fee sub-line, if it exist both for top
5974            line and sub-line error out. If there are multiple payments for sub-line
5975            error out. If payment end date is past fee line end date error out. */
5976 
5977         FOR l_rq_sub_ln_fee IN l_rq_sub_ln_fee_csr( chrID => p_chr_id, feeTopLine => l_rq_top_fee_ln.id )
5978         LOOP
5979 
5980           l_rq_sub_ln_fee_cnt := l_rq_sub_ln_fee_cnt + 1;
5981 
5982           /* Store the sum of  for rollover fee sub-line amount. */
5983           l_rq_sub_ln_fee_amt := l_rq_sub_ln_fee_amt + l_rq_sub_ln_fee.amount;
5984 
5985           /* Sub-line fees exists. */
5986           l_rq_sln_fee_amt_chk := TRUE;
5987 
5988 	  OPEN l_qte_number_csr(qteID => l_rq_top_fee_ln.qte_id);
5989 	  FETCH l_qte_number_csr INTO l_qte_num;
5990 	  CLOSE l_qte_number_csr;
5991 
5992           /* Check Payments for the rollovr quote fee sub-line if they exist. If there are multiple
5993 	     payments for the sub-line error out.
5994 	     CHECK FOR PAYMENT HEADER. */
5995 
5996 	  FOR l_rq_fee_pmtH IN l_rq_fee_pmtH_csr ( chrID => p_chr_id, feeLine => l_rq_sub_ln_fee.id )
5997 	  LOOP
5998 	    IF (l_top_ln_pmt_exist) THEN
5999               x_return_status := Okl_Api.G_RET_STS_ERROR;
6000 	      Okl_Api.set_message(
6001 	  		          p_app_name     => G_APP_NAME,
6002 	  		          p_msg_name     => 'OKL_QA_RQ_PMTS_TOP_SUB_EXIST',
6003 	           	          p_token1       => 'QUOTE_NUMBER',
6004 	                    	  p_token1_value => l_qte_num);
6005 	    END IF;
6006 
6007 
6008 	    l_payment_sub_ln_cnt := l_payment_sub_ln_cnt + 1;
6009 
6010 
6011 	    /**************
6012 	    l_pmt_dup_sub_ln_cnt := 0;
6013 
6014 	    FOR l_rq_fee_pmt1 IN l_rq_fee_pmt_csr ( chrID => p_chr_id, feeLine => l_rq_sub_ln_fee.id )
6015 	    LOOP
6016 	      IF ( l_rq_fee_pmt.id = l_rq_fee_pmt1.id ) THEN
6017 	        l_pmt_dup_sub_ln_cnt := l_pmt_dup_sub_ln_cnt + 1;
6018 	      END IF;
6019 	    END LOOP;
6020 	    *****************/
6021 
6022 	    /* Check if the there are multiple payments for the rollover quote
6023 	       fee sub-line, if so error out.
6024 
6025 	    IF (l_pmt_dup_sub_ln_cnt > 1) THEN
6026               x_return_status := OKL_API.G_RET_STS_ERROR;
6027 	      OKL_API.set_message(
6028 	  		          p_app_name     => G_APP_NAME,
6029 	  		          p_msg_name     => 'OKL_QA_RQ_MLTP_PMTS_SLN',
6030 	           	          p_token1       => 'quoteNum',
6031 	                    	  p_token1_value => l_qte_num);
6032 	    END IF;
6033 
6034 	    l_pmt_dup_sub_ln_cnt := 0;
6035 	    ******************/
6036 	  END LOOP;
6037 
6038 	  FOR l_rq_fee_pmt IN l_rq_fee_pmt_csr ( chrID => p_chr_id, feeLine => l_rq_sub_ln_fee.id )
6039 	  LOOP
6040 	   /* Check if the payment end date is within in the rollover quote
6041 	       fee sub-line's end date, if not error out. */
6042 
6043 	    IF ( TRUNC(l_rq_fee_pmt.end_date) > TRUNC(l_rq_sub_ln_fee.end_date) ) THEN
6044               x_return_status := Okl_Api.G_RET_STS_ERROR;
6045 	      Okl_Api.set_message(
6046 	  		          p_app_name     => G_APP_NAME,
6047 	  		          p_msg_name     => 'OKL_QA_RQ_SLN_PMT_ED',
6048 	           	          p_token1       => 'QUOTE_NUMBER',
6049 	                    	  p_token1_value => l_qte_num);
6050 	    END IF;
6051 
6052 	  END LOOP;
6053 
6054         END LOOP;
6055 
6056         /* Check if a rollover top line fee amount is not equal to sub-line fee amount,
6057            if exists, if not error out. */
6058 
6059         IF ( (l_rq_sln_fee_amt_chk) AND (l_rq_top_ln_fee_amt <> l_rq_sub_ln_fee_amt) ) THEN
6060           x_return_status := Okl_Api.G_RET_STS_ERROR;
6061 	  Okl_Api.set_message(
6062 	  		      p_app_name     => G_APP_NAME,
6063 	  		      p_msg_name     => 'OKL_QA_RQ_FEE_AMT_NEQ',
6064 	           	      p_token1       => 'QUOTE_NUMBER',
6065 	                      p_token1_value => l_qte_num);
6066         END IF;
6067         l_rq_top_ln_fee_amt := 0;
6068         l_rq_sub_ln_fee_amt := 0;
6069 
6070         /* If no payments are defiend for the fee line then error out. */
6071 
6072         IF ((NOT l_top_ln_pmt_exist) AND (NOT l_rq_sln_fee_amt_chk)) THEN
6073           x_return_status := Okl_Api.G_RET_STS_ERROR;
6074 	  Okl_Api.set_message(
6075 	  		      p_app_name     => G_APP_NAME,
6076 	  		      p_msg_name     => 'OKL_QA_RQ_NO_PMTS',
6077 	           	      p_token1       => 'FEE_LINE',
6078 	                      p_token1_value => l_top_fee_ln_name);
6079 
6080         END IF;
6081 
6082 
6083         /* Check if a payment is defined for EACH of the rollover quote fee sub-lines HEADER,
6084            if not error out. If there are multiple payments defiend for a rollover quote
6085            fee sub-line HEADER error out. */
6086 
6087         IF ((NOT l_top_ln_pmt_exist) AND (l_rq_sub_ln_fee_cnt >  l_payment_sub_ln_cnt)) THEN
6088           x_return_status := Okl_Api.G_RET_STS_ERROR;
6089 	  Okl_Api.set_message(
6090 	  		      p_app_name     => G_APP_NAME,
6091 	  		      p_msg_name     => 'OKL_QA_RQ_PMTS_MISS_SLN',
6092 	           	      p_token1       => 'QUOTE_NUMBER',
6093 	                      p_token1_value => l_qte_num);
6094 	ELSIF ((NOT l_top_ln_pmt_exist) AND (l_rq_sub_ln_fee_cnt <  l_payment_sub_ln_cnt)) THEN
6095           x_return_status := Okl_Api.G_RET_STS_ERROR;
6096 	  Okl_Api.set_message(
6097 	  		      p_app_name     => G_APP_NAME,
6098 	  		      p_msg_name     => 'OKL_QA_RQ_MUL_SLN_PMTS',
6099 	           	      p_token1       => 'QUOTE_NUMBER',
6100 	                      p_token1_value => l_qte_num);
6101         END IF;
6102         l_rq_sub_ln_fee_cnt  := 0;
6103         l_payment_sub_ln_cnt := 0;
6104         -- Bug 3987419
6105         l_top_ln_pmt_exist   := FALSE; -- Setting back to FALSE to check for next fee line.
6106 
6107         -- Bug 4094336
6108         l_rq_sln_fee_amt_chk := FALSE; -- Setting back to FALSE.
6109 
6110       END LOOP;
6111 
6112     --TURN_ON_THE_FUNC_CONSTRAINTS;
6113 
6114      EXCEPTION
6115 
6116           WHEN Okl_Api.G_EXCEPTION_ERROR THEN
6117         	x_return_status := Okl_Api.G_RET_STS_ERROR;
6118 
6119                 IF l_rq_top_fee_ln_csr%ISOPEN THEN
6120   		        CLOSE l_rq_top_fee_ln_csr;
6121   		END IF;
6122 
6123                 IF l_rq_top_fee_ln_csr1%ISOPEN THEN
6124   		        CLOSE l_rq_top_fee_ln_csr1;
6125   		END IF;
6126 
6127                 IF l_rq_sub_ln_fee_csr%ISOPEN THEN
6128   		        CLOSE l_rq_sub_ln_fee_csr;
6129   		END IF;
6130 
6131                 IF l_qte_number_csr%ISOPEN THEN
6132   		        CLOSE l_qte_number_csr;
6133   		END IF;
6134 
6135                 IF l_rq_fee_pmt_csr%ISOPEN THEN
6136   		        CLOSE l_rq_fee_pmt_csr;
6137   		END IF;
6138 
6139           WHEN Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR THEN
6140         	x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
6141 
6142                 IF l_rq_top_fee_ln_csr%ISOPEN THEN
6143   		        CLOSE l_rq_top_fee_ln_csr;
6144   		END IF;
6145 
6146                 IF l_rq_top_fee_ln_csr1%ISOPEN THEN
6147   		        CLOSE l_rq_top_fee_ln_csr1;
6148   		END IF;
6149 
6150                 IF l_rq_sub_ln_fee_csr%ISOPEN THEN
6151   		        CLOSE l_rq_sub_ln_fee_csr;
6152   		END IF;
6153 
6154                 IF l_qte_number_csr%ISOPEN THEN
6155   		        CLOSE l_qte_number_csr;
6156   		END IF;
6157 
6158                 IF l_rq_fee_pmt_csr%ISOPEN THEN
6159   		        CLOSE l_rq_fee_pmt_csr;
6160   		END IF;
6161 
6162           WHEN OTHERS THEN
6163         	x_return_status := Okl_Api.G_RET_STS_ERROR;
6164 
6165                 IF l_rq_top_fee_ln_csr%ISOPEN THEN
6166   		        CLOSE l_rq_top_fee_ln_csr;
6167   		END IF;
6168 
6169                 IF l_rq_top_fee_ln_csr1%ISOPEN THEN
6170   		        CLOSE l_rq_top_fee_ln_csr1;
6171   		END IF;
6172 
6173                 IF l_rq_sub_ln_fee_csr%ISOPEN THEN
6174   		        CLOSE l_rq_sub_ln_fee_csr;
6175   		END IF;
6176 
6177                 IF l_qte_number_csr%ISOPEN THEN
6178   		        CLOSE l_qte_number_csr;
6179   		END IF;
6180 
6181                 IF l_rq_fee_pmt_csr%ISOPEN THEN
6182   		        CLOSE l_rq_fee_pmt_csr;
6183   		END IF;
6184 
6185         	/*
6186 
6187         	x_return_status := OKL_API.HANDLE_EXCEPTIONS(
6188   			p_api_name  => l_api_name,
6189   			p_pkg_name  => g_pkg_name,
6190   			p_exc_name  => 'OTHERS',
6191   			x_msg_count => l_msg_count,
6192   			x_msg_data  => l_msg_data,
6193   			p_api_type  => g_api_type);
6194   		*/
6195 
6196   END check_rolloverQuotes;
6197 
6198       --Bug# 4996899
6199     ----------------------------------------------------------------------------
6200     --start of comments
6201     --API Name    : check_financed_fees
6202     --Description : API called to validate the financed fees on a contract.
6203     --Parameters  : IN  - p_chr_id - Contract Number
6204     --              OUT - x_return_status - Return Status
6205     --History     : 03-Mar-2006 rpillay Created
6206     --
6207     --
6208     --end of comments
6209     -----------------------------------------------------------------------------
6210 
6211     PROCEDURE check_financed_fees(
6212     x_return_status            OUT NOCOPY VARCHAR2,
6213     p_chr_id                   IN  NUMBER)  IS
6214 
6215 
6216       l_return_status   VARCHAR2(1)           := Okl_Api.G_RET_STS_SUCCESS;
6217       l_api_version	CONSTANT NUMBER	      := 1.0;
6218       l_init_msg_list   VARCHAR2(1) DEFAULT Okc_Api.G_FALSE;
6219       l_msg_count       NUMBER;
6220       l_msg_data        VARCHAR2(1000);
6221       l_api_name        CONSTANT VARCHAR2(30) := 'CHECK_FINANCED_FEES';
6222 
6223       l_not_found	BOOLEAN := FALSE;
6224       l_amt		NUMBER;
6225       l_found	VARCHAR2(1);
6226 
6227 
6228     /* Cursor to get the top fee line for financed fees of a given contract. */
6229 
6230     -- R12B Authoring OA Migration
6231     -- Validation of Sales Tax Financed Fee will be done
6232     -- after the Calculate Upfront Tax process
6233     CURSOR l_fn_top_fee_ln_csr ( chrID IN OKC_K_HEADERS_B.ID%TYPE ) IS
6234     SELECT kle.id, kle.amount, cleb.name
6235     FROM okc_k_lines_v cleb,
6236          okl_k_lines kle,
6237          okc_statuses_b okcsts
6238     WHERE cleb.dnz_chr_id = chrID
6239     AND cleb.chr_id = chrID
6240     AND kle.ID = cleb.ID
6241     AND kle.fee_type = 'FINANCED'
6242     AND okcsts.code = cleb.sts_code
6243     AND okcsts.ste_code NOT IN ('EXPIRED','HOLD','CANCELLED','TERMINATED', 'ABANDONED')
6244     AND NVL(kle.fee_purpose_code,'XXX') <> 'SALESTAX';
6245 
6246 
6247     /* Cursor to get the financed fee sub-lines (applied to assets) for a
6248        given contract. */
6249 
6250     CURSOR l_fn_sub_ln_fee_csr ( chrID IN OKC_K_HEADERS_B.ID%TYPE,
6251                                  feeTopLine IN OKL_K_LINES.ID%TYPE) IS
6252     SELECT kle.id, kle.amount, cleb.end_date
6253     ,cleb.start_date   -- added for bug 5115701
6254     FROM okc_k_lines_b cleb,
6255          okl_k_lines kle,
6256          okc_statuses_b okcsts
6257     WHERE cleb.dnz_chr_id = chrID
6258     AND kle.ID = cleb.ID
6259     AND cleb.CLE_ID = feeTopLine
6260     AND okcsts.code = cleb.sts_code
6261     --Bug# 4959361: Include Terminated lines when fetching sub-line amount
6262     AND okcsts.ste_code NOT IN ('EXPIRED','HOLD','CANCELLED','ABANDONED');
6263 
6264 
6265     /* Cursor to get the financed fee top/sub-line payments for a
6266        given contract. */
6267 
6268     CURSOR l_fn_fee_pmt_csr ( chrID IN OKC_K_HEADERS_B.ID%TYPE,
6269                               feeLine IN OKL_K_LINES.ID%TYPE) IS
6270 
6271     SELECT Fnd_Date.canonical_to_date(sll.rule_information2) start_date, -- formated for bug 5115701,
6272            SLL.rule_information3 periods,
6273            DECODE(sll.object1_id1, 'M', 1, 'Q', 3, 'S', 6, 'A', 12) mpp,
6274            TRUNC(ADD_MONTHS(Fnd_Date.canonical_to_date(sll.rule_information2),
6275              TO_NUMBER(SLL.rule_information3)*DECODE(sll.object1_id1, 'M', 1, 'Q', 3, 'S', 6, 'A', 12)) - 1) end_date,
6276            styt.name stream_type
6277           FROM   okc_rules_b sll,
6278                  okc_rules_b slh,
6279                  okc_rule_groups_b rgp,
6280                  okl_strm_type_b sty,
6281                  okl_strm_type_tl styt
6282           WHERE  rgp.dnz_chr_id                = chrID
6283             AND  rgp.cle_id                    = feeLine
6284             AND  rgp.rgd_code                  = 'LALEVL'
6285             AND  rgp.id                        = slh.rgp_id
6286             AND  slh.rule_information_category = 'LASLH'
6287             AND  slh.object1_id1               = TO_CHAR(sty.id)
6288             AND  styt.LANGUAGE                 = USERENV('LANG')
6289             AND  sty.id                        = styt.id
6290             AND  TO_CHAR(slh.id)               = sll.object2_id1
6291             AND  sll.rule_information_category = 'LASLL';
6292 
6293 
6294     /* Cursor to get the financed fee top/sub-line payments HEADER for a
6295        given contract. */
6296 
6297     CURSOR l_fn_fee_pmtH_csr ( chrID IN OKC_K_HEADERS_B.ID%TYPE,
6298                               feeLine IN OKL_K_LINES.ID%TYPE) IS
6299 
6300     SELECT slh.id
6301           FROM   okc_rules_b slh,
6302                  okc_rule_groups_b rgp,
6303                  okl_strm_type_b sty,
6304                  okl_strm_type_tl styt
6305           WHERE  rgp.dnz_chr_id                = chrID
6306             AND  rgp.cle_id                    = feeLine
6307             AND  rgp.rgd_code                  = 'LALEVL'
6308             AND  rgp.id                        = slh.rgp_id
6309             AND  slh.rule_information_category = 'LASLH'
6310             AND  slh.object1_id1               = TO_CHAR(sty.id)
6311             AND  styt.LANGUAGE                 = USERENV('LANG')
6312             AND  sty.id                        = styt.id;
6313 
6314     l_top_fee_ln_id OKL_K_LINES.ID%TYPE;
6315     l_top_fee_ln_name OKC_K_LINES_V.NAME%TYPE;
6316     l_sub_fee_ln_id OKL_K_LINES.ID%TYPE;
6317     x_err_msg VARCHAR2(1000);
6318 
6319     l_fn_sub_ln_fee_cnt   NUMBER := 0;
6320     l_pmt_dup_sub_ln_cnt  NUMBER := 0; -- Counter for duplicate payments for a sub-line.
6321     l_payment_top_ln_cnt  NUMBER := 0; -- Counter for financed payments top lines
6322     l_payment_sub_ln_cnt  NUMBER := 0; -- Counter for financed payments sub-lines
6323     l_fn_top_ln_fee_amt   NUMBER := 0; -- Financed top line total fee amount.
6324     l_fn_sub_ln_fee_amt   NUMBER := 0; -- Financed sum of sub-line fee amount.
6325     l_top_ln_pmt_exist   BOOLEAN := FALSE;
6326     l_fn_sln_fee_amt_chk BOOLEAN := FALSE; -- If there are sub-lines payments exists.
6327 
6328   BEGIN
6329       x_return_status := Okl_Api.G_RET_STS_SUCCESS;
6330 
6331       FOR l_fn_top_fee_ln IN l_fn_top_fee_ln_csr ( chrID => p_chr_id )
6332       LOOP
6333 
6334         /* Store the amount for financed fee top line */
6335         l_fn_top_ln_fee_amt := l_fn_top_fee_ln.amount;
6336 
6337         /* Store the Top Fee Line Name */
6338         l_top_fee_ln_name   := l_fn_top_fee_ln.name;
6339 
6340         /* Check Payments for the top fee line if they exist. */
6341         FOR l_fn_fee_pmtH IN l_fn_fee_pmtH_csr ( chrID => p_chr_id, feeLine => l_fn_top_fee_ln.id )
6342         LOOP
6343           l_top_ln_pmt_exist := TRUE;
6344         END LOOP;
6345 
6346         /* Check payments for financed fee sub-line, if it exist both for top
6347            line and sub-line error out. If payment end date is past fee line end date error out. */
6348 
6349         FOR l_fn_sub_ln_fee IN l_fn_sub_ln_fee_csr( chrID => p_chr_id, feeTopLine => l_fn_top_fee_ln.id )
6350         LOOP
6351 
6352           l_fn_sub_ln_fee_cnt := l_fn_sub_ln_fee_cnt + 1;
6353 
6354           /* Store the sum of financed fee sub-line amount. */
6355           l_fn_sub_ln_fee_amt := l_fn_sub_ln_fee_amt + l_fn_sub_ln_fee.amount;
6356 
6357           /* Sub-line fees exists. */
6358           l_fn_sln_fee_amt_chk := TRUE;
6359 
6360           /* Check Payments for the financed fee sub-line if they exist. */
6361 
6362 	    FOR l_fn_fee_pmtH IN l_fn_fee_pmtH_csr ( chrID => p_chr_id, feeLine => l_fn_sub_ln_fee.id )
6363 	    LOOP
6364 	      IF (l_top_ln_pmt_exist) THEN
6365                 x_return_status := Okl_Api.G_RET_STS_ERROR;
6366 	          Okl_Api.set_message(
6367 	  		          p_app_name     => G_APP_NAME,
6368 	  		          p_msg_name     => 'OKL_QA_FN_PMTS_TOP_SUB_EXIST',
6369 	           	          p_token1       => 'FEE_LINE',
6370 	           	          p_token1_value => l_top_fee_ln_name);
6371 	      END IF;
6372 
6373 	      l_payment_sub_ln_cnt := l_payment_sub_ln_cnt + 1;
6374 
6375 	    END LOOP;
6376 
6377 	    FOR l_fn_fee_pmt IN l_fn_fee_pmt_csr ( chrID => p_chr_id, feeLine => l_fn_sub_ln_fee.id )
6378 	    LOOP
6379 	     /* Check if the payment end date is within in the financed
6380 	         fee sub-line's end date, if not error out. */
6381 
6382 	         -- added for bug 5115701 - start
6383 
6384 	     IF ( TRUNC(l_fn_fee_pmt.start_date) < TRUNC(l_fn_sub_ln_fee.start_date) ) THEN
6385 
6386                 x_return_status := Okl_Api.G_RET_STS_ERROR;
6387 	          Okl_Api.set_message(
6388 	  		          p_app_name     => G_APP_NAME,
6389 	  		          p_msg_name     => 'OKL_QA_FN_SLN_PMT_SD',
6390 	           	          p_token1       => 'FEE_LINE',
6391 	           	          p_token1_value => l_top_fee_ln_name);
6392 	      END IF;
6393 
6394 	       -- added for bug 5115701 - end
6395 
6396 	      IF ( TRUNC(l_fn_fee_pmt.end_date) > TRUNC(l_fn_sub_ln_fee.end_date) ) THEN
6397                 x_return_status := Okl_Api.G_RET_STS_ERROR;
6398 	          Okl_Api.set_message(
6399 	  		          p_app_name     => G_APP_NAME,
6400 	  		          p_msg_name     => 'OKL_QA_FN_SLN_PMT_ED',
6401 	           	          p_token1       => 'FEE_LINE',
6402 	           	          p_token1_value => l_top_fee_ln_name);
6403 	      END IF;
6404 
6405 	    END LOOP;
6406         END LOOP;
6407 
6408         /* Check if a financed top line fee amount is not equal to sub-line fee amount,
6409            if exists, if not error out. */
6410 
6411         IF ( (l_fn_sln_fee_amt_chk) AND (l_fn_top_ln_fee_amt <> l_fn_sub_ln_fee_amt) ) THEN
6412           x_return_status := Okl_Api.G_RET_STS_ERROR;
6413 	    Okl_Api.set_message(
6414 	  		      p_app_name     => G_APP_NAME,
6415 	  		      p_msg_name     => 'OKL_QA_FN_FEE_AMT_NEQ',
6416 	           	      p_token1       => 'FEE_LINE',
6417 	           	      p_token1_value => l_top_fee_ln_name);
6418         END IF;
6419         l_fn_top_ln_fee_amt := 0;
6420         l_fn_sub_ln_fee_amt := 0;
6421 
6422         /* If no payments are defiend for the fee line then error out. */
6423 
6424         IF ((NOT l_top_ln_pmt_exist) AND (NOT l_fn_sln_fee_amt_chk)) THEN
6425           x_return_status := Okl_Api.G_RET_STS_ERROR;
6426 	    Okl_Api.set_message(
6427 	  		      p_app_name     => G_APP_NAME,
6428 	  		      p_msg_name     => 'OKL_QA_RQ_NO_PMTS',
6429 	           	      p_token1       => 'FEE_LINE',
6430 	           	      p_token1_value => l_top_fee_ln_name);
6431 
6432         END IF;
6433 
6434 
6435         /* Check if a payment is defined for EACH of the financed fee sub-lines HEADER,
6436            if not error out. If there are multiple payments defiend for a financed
6437            fee sub-line HEADER error out. */
6438 
6439         IF ((NOT l_top_ln_pmt_exist) AND (l_fn_sub_ln_fee_cnt >  l_payment_sub_ln_cnt)) THEN
6440           x_return_status := Okl_Api.G_RET_STS_ERROR;
6441 	    Okl_Api.set_message(
6442 	  		      p_app_name     => G_APP_NAME,
6443 	  		      p_msg_name     => 'OKL_QA_FN_PMTS_MISS_SLN',
6444 	           	      p_token1       => 'FEE_LINE',
6445 	           	      p_token1_value => l_top_fee_ln_name);
6446 	  ELSIF ((NOT l_top_ln_pmt_exist) AND (l_fn_sub_ln_fee_cnt <  l_payment_sub_ln_cnt)) THEN
6447           x_return_status := Okl_Api.G_RET_STS_ERROR;
6448 	    Okl_Api.set_message(
6449 	  		      p_app_name     => G_APP_NAME,
6450 	  		      p_msg_name     => 'OKL_QA_FN_MUL_SLN_PMTS',
6451 	           	      p_token1       => 'FEE_LINE',
6452 	           	      p_token1_value => l_top_fee_ln_name);
6453         END IF;
6454         l_fn_sub_ln_fee_cnt  := 0;
6455         l_payment_sub_ln_cnt := 0;
6456         -- Bug 3987419
6457         l_top_ln_pmt_exist   := FALSE; -- Setting back to FALSE to check for next fee line.
6458 
6459         -- Bug 4094336
6460         l_fn_sln_fee_amt_chk := FALSE; -- Setting back to FALSE.
6461 
6462       END LOOP;
6463 
6464      EXCEPTION
6465 
6466           WHEN Okl_Api.G_EXCEPTION_ERROR THEN
6467         	x_return_status := Okl_Api.G_RET_STS_ERROR;
6468 
6469             IF l_fn_top_fee_ln_csr%ISOPEN THEN
6470   		        CLOSE l_fn_top_fee_ln_csr;
6471   		END IF;
6472 
6473             IF l_fn_sub_ln_fee_csr%ISOPEN THEN
6474   		        CLOSE l_fn_sub_ln_fee_csr;
6475   		END IF;
6476 
6477             IF l_fn_fee_pmt_csr%ISOPEN THEN
6478   		        CLOSE l_fn_fee_pmt_csr;
6479   		END IF;
6480 
6481           WHEN Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR THEN
6482         	x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
6483 
6484             IF l_fn_top_fee_ln_csr%ISOPEN THEN
6485   		        CLOSE l_fn_top_fee_ln_csr;
6486   		END IF;
6487 
6488             IF l_fn_sub_ln_fee_csr%ISOPEN THEN
6489   		        CLOSE l_fn_sub_ln_fee_csr;
6490   		END IF;
6491 
6492             IF l_fn_fee_pmt_csr%ISOPEN THEN
6493   		        CLOSE l_fn_fee_pmt_csr;
6494   		END IF;
6495 
6496           WHEN OTHERS THEN
6497         	x_return_status := Okl_Api.G_RET_STS_ERROR;
6498 
6499             IF l_fn_top_fee_ln_csr%ISOPEN THEN
6500   		        CLOSE l_fn_top_fee_ln_csr;
6501   		END IF;
6502 
6503             IF l_fn_sub_ln_fee_csr%ISOPEN THEN
6504   		        CLOSE l_fn_sub_ln_fee_csr;
6505   		END IF;
6506 
6507             IF l_fn_fee_pmt_csr%ISOPEN THEN
6508   		        CLOSE l_fn_fee_pmt_csr;
6509   		END IF;
6510 
6511     END check_financed_fees;
6512     --Bug# 4996899
6513 
6514     ----------------------------------------------------------------------------
6515     --start of comments
6516     --API Name    : check_rollover_lines
6517     --Description : API called to give warning in QA checker if the contract
6518     --              has a rollover fee and it's start date is a future date
6519     --              (greater than sysdate).
6520     --Parameters  : IN  - p_chr_id - Contract Number
6521     --              OUT - x_return_status - Return Status
6522     --History     : 17-Nov-2004 Manu Created
6523     --
6524     --
6525     --end of comments
6526     -----------------------------------------------------------------------------
6527   PROCEDURE check_rollover_lines(
6528               x_return_status OUT NOCOPY VARCHAR2,
6529               p_chr_id IN NUMBER) IS
6530 
6531     --p_api_version VARCHAR2(4000) := '1.0';
6532     p_init_msg_list VARCHAR2(4000) DEFAULT Okl_Api.G_FALSE;
6533 
6534     l_return_status   VARCHAR2(1)           := Okl_Api.G_RET_STS_SUCCESS;
6535     l_in_future       BOOLEAN := FALSE;
6536     l_found           VARCHAR2(1);
6537     x_msg_count NUMBER;
6538     x_msg_data  VARCHAR2(256);
6539 
6540     /* Cursor to if the contract start date is not in the future
6541        (less than or equal to SYSDATE). */
6542 
6543     CURSOR l_k_std_csr ( chrID OKC_K_HEADERS_B.ID%TYPE ) IS
6544     SELECT 1
6545         FROM okc_k_lines_b cleb,
6546              okl_k_lines kle,
6547              okc_k_headers_b khr
6548         WHERE khr.id = chrID
6549             AND cleb.dnz_chr_id = khr.id
6550             AND kle.ID = cleb.ID
6551             AND kle.fee_type = 'ROLLOVER'
6552             AND TRUNC(khr.start_date) > SYSDATE
6553             AND    NOT EXISTS (
6554                          SELECT 'Y'
6555                      FROM   okc_statuses_b okcsts
6556                      WHERE  okcsts.code = cleb.sts_code
6557                  AND    okcsts.ste_code IN ('EXPIRED','HOLD','CANCELLED','TERMINATED', 'ABANDONED'));
6558 
6559     BEGIN
6560       x_return_status := Okl_Api.G_RET_STS_SUCCESS;
6561 
6562       /* Check if the if the contract has a rollover fee and it's start date
6563          is not in the future date (less than or equal sysdate). */
6564 
6565       OPEN l_k_std_csr ( p_chr_id );
6566       FETCH l_k_std_csr INTO l_found;
6567       l_in_future := l_k_std_csr%FOUND; -- IN future
6568       CLOSE l_k_std_csr;
6569 
6570       IF( l_in_future ) THEN  -- Contract Start date in future
6571           x_return_status := Okl_Api.G_RET_STS_ERROR;
6572           l_in_future := NULL;
6573           l_found := NULL;
6574           Okl_Api.set_message(
6575                      p_app_name      => G_APP_NAME,
6576                      p_msg_name      => 'OKL_LLA_RQ_SD_IN_FUTURE');
6577           RAISE Okl_Api.G_EXCEPTION_ERROR;
6578       END IF;
6579 
6580     EXCEPTION
6581 
6582        WHEN Okl_Api.G_EXCEPTION_ERROR THEN
6583           x_return_status := Okl_Api.G_RET_STS_ERROR;
6584 
6585           IF l_k_std_csr%ISOPEN THEN
6586             CLOSE l_k_std_csr;
6587   	  END IF;
6588 
6589        WHEN  G_EXCEPTION_HALT_VALIDATION THEN
6590           NULL; -- no processing necessary; validation can continue with next column
6591 
6592           IF l_k_std_csr%ISOPEN THEN
6593             CLOSE l_k_std_csr;
6594   	  END IF;
6595 
6596        WHEN OTHERS THEN
6597          -- store SQL error message on message stack
6598          Okl_Api.SET_MESSAGE(
6599            p_app_name        => G_APP_NAME,
6600            p_msg_name        => G_UNEXPECTED_ERROR,
6601            p_token1	   => G_SQLCODE_TOKEN,
6602            p_token1_value    => SQLCODE,
6603            p_token2          => G_SQLERRM_TOKEN,
6604            p_token2_value    => SQLERRM);
6605 
6606           IF l_k_std_csr%ISOPEN THEN
6607             CLOSE l_k_std_csr;
6608   	  END IF;
6609 
6610          x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
6611 
6612   END check_rollover_lines;
6613 
6614   -- Start of comments
6615   --
6616   -- Procedure Name  : check_stream_template
6617   -- Description     : Bug#3931587 Validating if streams are defined
6618   --                 : in contract product template.
6619   -- Business Rules  :
6620   -- Parameters      :
6621   -- Version         : 1.0
6622   -- End of comments
6623 
6624   PROCEDURE check_stream_template(
6625     x_return_status            OUT NOCOPY VARCHAR2,
6626     p_chr_id                   IN  NUMBER
6627   ) IS
6628 
6629     l_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
6630 
6631     CURSOR l_lne_pmnt_csr(chrid OKL_K_HEADERS.KHR_ID%TYPE) IS
6632         SELECT ls.lty_code,
6633                ls.name line_type,
6634                kle.id,
6635                kle.name
6636         FROM   OKL_K_LINES_FULL_V kle,
6637                OKC_LINE_STYLES_V ls,
6638                OKC_STATUSES_B sts
6639         WHERE  kle.lse_id     = ls.id
6640         AND    ls.lty_code    IN ('FREE_FORM1', 'FEE', 'SOLD_SERVICE')
6641         AND    kle.dnz_chr_id = chrid
6642         AND    sts.code       = kle.sts_code
6643         AND    sts.ste_code   NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
6644 
6645     CURSOR l_fee_strm_csr (chrid OKL_K_HEADERS.KHR_ID%TYPE,
6646                            lineid OKC_K_LINES_B.ID%TYPE) IS
6647     SELECT itm.object1_id1
6648     FROM   okc_k_items itm
6649     WHERE  cle_id = lineid
6650     AND    dnz_chr_id = chrid
6651     AND    jtot_object1_code = 'OKL_STRMTYP';
6652 
6653     CURSOR l_hdr_pmnt_csr (chrid OKL_K_HEADERS.KHR_ID%TYPE) IS
6654     SELECT rule.object1_id1
6655     FROM   okc_rule_groups_v rgp,
6656            okc_rules_v rule
6657     WHERE  rgp.id                         = rule.rgp_id
6658     AND    rgp.cle_id                     IS NULL
6659     AND    rgp.dnz_chr_id                 = chrid
6660     AND    rgp.rgd_code                   = 'LALEVL'
6661     AND    rule.rule_information_category = 'LASLH';
6662 
6663     l_present_yn VARCHAR(1);
6664 
6665     l_fee_strm_type_rec fee_strm_type_csr%ROWTYPE;
6666     l_strm_name_rec strm_name_csr%ROWTYPE;
6667 
6668   BEGIN
6669 
6670     -- initialize return status
6671     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
6672 
6673     -- check for header payment
6674     FOR l_hdr_pmnt_rec IN l_hdr_pmnt_csr (p_chr_id)
6675     LOOP
6676 
6677        l_present_yn :=   Okl_Streams_Util.strm_tmpt_contains_strm_type
6678                                    (p_khr_id  => p_chr_id,
6679                                     p_sty_id  => TO_NUMBER(l_hdr_pmnt_rec.object1_id1));
6680 
6681        IF (l_present_yn = 'N') THEN
6682           OPEN  strm_name_csr ( TO_NUMBER(l_hdr_pmnt_rec.object1_id1) );
6683           FETCH strm_name_csr INTO l_strm_name_rec;
6684           IF strm_name_csr%NOTFOUND THEN
6685              CLOSE strm_name_csr;
6686              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6687           END IF;
6688           CLOSE strm_name_csr;
6689 
6690           Okl_Api.set_message(
6691                          p_app_name     => G_APP_NAME,
6692                          p_msg_name     => 'LLA_QA_HDRPMNT_STRMTMPL',
6693                          p_token1       => 'STRM_NAME',
6694                          p_token1_value => l_strm_name_rec.name
6695                         );
6696           x_return_status := Okl_Api.G_RET_STS_ERROR;
6697         END IF;
6698 
6699     END LOOP;
6700 
6701     FOR l_lne_pmnt IN l_lne_pmnt_csr(p_chr_id)
6702     LOOP
6703 
6704       FOR l_rl_rec1 IN l_rl_csr1 ( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), l_lne_pmnt.id )
6705       LOOP
6706 
6707         --murthy
6708 
6709         l_present_yn :=   Okl_Streams_Util.strm_tmpt_contains_strm_type
6710                                    (p_khr_id  => p_chr_id,
6711                                     p_sty_id  => TO_NUMBER(l_rl_rec1.object1_id1));
6712 
6713         IF (l_present_yn = 'N') THEN
6714 
6715           OPEN  strm_name_csr ( TO_NUMBER(l_rl_rec1.object1_id1) );
6716           FETCH strm_name_csr INTO l_strm_name_rec;
6717           IF strm_name_csr%NOTFOUND THEN
6718               CLOSE strm_name_csr;
6719               RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6720           END IF;
6721           CLOSE strm_name_csr;
6722 
6723           Okl_Api.set_message(
6724                   p_app_name     => G_APP_NAME,
6725                   p_msg_name     => 'LLA_QA_PMNT_STRM_TMPL',
6726                   p_token1       => 'STRM_NAME',
6727                   p_token1_value => l_strm_name_rec.name,
6728                   p_token2       => 'LINE_TYPE',
6729                   p_token2_value => l_lne_pmnt.line_type||'/'||l_lne_pmnt.name
6730                  );
6731           x_return_status := Okl_Api.G_RET_STS_ERROR;
6732         END IF;
6733 
6734       END LOOP;
6735 
6736       -- Check FEE line stream
6737       IF (l_lne_pmnt.lty_code = 'FEE') THEN
6738 
6739          FOR l_fee_strm_rec IN l_fee_strm_csr (p_chr_id,
6740                                                l_lne_pmnt.id)
6741          LOOP
6742             l_present_yn :=   Okl_Streams_Util.strm_tmpt_contains_strm_type
6743                                    (p_khr_id  => p_chr_id,
6744                                     p_sty_id  => TO_NUMBER(l_fee_strm_rec.object1_id1));
6745 
6746             IF (l_present_yn = 'N') THEN
6747 
6748               OPEN  strm_name_csr ( l_fee_strm_rec.object1_id1 );
6749               FETCH strm_name_csr INTO l_strm_name_rec;
6750               IF strm_name_csr%NOTFOUND THEN
6751                   CLOSE strm_name_csr;
6752                   RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6753               END IF;
6754               CLOSE strm_name_csr;
6755 
6756               Okl_Api.set_message(
6757                       p_app_name     => G_APP_NAME,
6758                       p_msg_name     => 'LLA_QA_FEE_STRM_TMPL',
6759                       p_token1       => 'STRM_NAME',
6760                       p_token1_value => l_strm_name_rec.name,
6761                       p_token2       => 'LINE_TYPE',
6762                       p_token2_value => l_lne_pmnt.line_type||'/'||l_lne_pmnt.name
6763                      );
6764               x_return_status := Okl_Api.G_RET_STS_ERROR;
6765             END IF;
6766          END LOOP;
6767       END IF; -- Fee Line
6768 
6769     END LOOP;
6770 
6771   EXCEPTION
6772 
6773   WHEN G_EXCEPTION_HALT_VALIDATION THEN
6774     x_return_status := Okl_Api.G_RET_STS_ERROR;
6775     IF l_hdr_csr%ISOPEN THEN
6776       CLOSE l_hdr_csr;
6777     END IF;
6778     -- no processing necessary; validation can continue with next column
6779   WHEN OTHERS THEN
6780     -- store SQL error message on message stack
6781     Okl_Api.SET_MESSAGE(
6782       p_app_name        => G_APP_NAME,
6783       p_msg_name        => G_UNEXPECTED_ERROR,
6784       p_token1          => G_SQLCODE_TOKEN,
6785       p_token1_value    => SQLCODE,
6786       p_token2          => G_SQLERRM_TOKEN,
6787       p_token2_value    => SQLERRM);
6788     -- notify caller of an error as UNEXPETED error
6789     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
6790     -- verify that cursor was closed
6791     IF l_hdr_csr%ISOPEN THEN
6792       CLOSE l_hdr_csr;
6793     END IF;
6794 
6795   END check_stream_template;
6796 
6797   -- Start of comments
6798   --
6799   -- Procedure Name  : check_residual_value
6800   -- Description     : Bug#4186455
6801   --                 : Throws a message if asset residual value is less than 20%
6802   --                 : and tax owner for the contract is LESSOR. The message
6803   --                 : is conifgurable to error or warning.
6804   -- Business Rules  :
6805   -- Parameters      :
6806   -- Version         : 1.0
6807   -- End of comments
6808 
6809   PROCEDURE check_residual_value(
6810     x_return_status            OUT NOCOPY VARCHAR2,
6811     p_chr_id                   IN  NUMBER
6812   ) IS
6813 
6814   l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
6815   l_tax_owner VARCHAR2(100);
6816 
6817   --Bug# 4631549
6818   l_release_contract_yn VARCHAR2(1);
6819   l_oec                 NUMBER;
6820 
6821   BEGIN
6822     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
6823     OPEN  l_hdrrl_csr('LATOWN', 'LATOWN', TO_NUMBER(p_chr_id));
6824     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
6825     CLOSE l_hdrrl_csr;
6826     l_tax_owner := l_hdrrl_rec.RULE_INFORMATION1;
6827 
6828     --Bug# 4631549
6829     l_release_contract_yn := okl_api.g_false;
6830     l_release_contract_yn := okl_lla_util_pvt.check_release_contract(p_chr_id => p_chr_id);
6831 
6832     FOR l_lne IN l_lne_csr('FREE_FORM1', p_chr_id)
6833     LOOP
6834 
6835       --Bug# 4631549
6836       If l_release_contract_yn = okl_api.g_true then
6837           l_oec := l_lne.expected_asset_cost;
6838       else
6839           l_oec := l_lne.oec;
6840       end if;
6841 
6842       --Bug# 4631549
6843       IF (( nvl(l_lne.residual_value,0) < (0.2 * l_OEC)) AND (l_tax_owner = 'LESSOR')) THEN
6844       --IF (( NVL(l_lne.residual_value,0) < (0.2 * l_lne.OEC)) AND (l_tax_owner = 'LESSOR')) THEN
6845             Okl_Api.set_message(
6846               p_app_name     => G_APP_NAME,
6847               p_msg_name     => 'OKL_QA_RV_OEC_TOWN',
6848               p_token1       => 'line',
6849               p_token1_value => l_lne.name);
6850             x_return_status := Okl_Api.G_RET_STS_ERROR;
6851       END IF;
6852 
6853     END LOOP;
6854 
6855     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
6856         Okl_Api.set_message(
6857           p_app_name      => G_APP_NAME,
6858           p_msg_name      => G_QA_SUCCESS);
6859     END IF;
6860 
6861   EXCEPTION
6862   WHEN OTHERS THEN
6863     -- store SQL error message on message stack
6864     Okl_Api.SET_MESSAGE(
6865       p_app_name        => G_APP_NAME,
6866       p_msg_name        => G_UNEXPECTED_ERROR,
6867       p_token1	        => G_SQLCODE_TOKEN,
6868       p_token1_value    => SQLCODE,
6869       p_token2          => G_SQLERRM_TOKEN,
6870       p_token2_value    => SQLERRM);
6871     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
6872     IF l_hdrrl_csr%ISOPEN THEN
6873       CLOSE l_hdrrl_csr;
6874     END IF;
6875 
6876   END check_residual_value;
6877 
6878   -- Start of comments
6879   --
6880   -- Procedure Name  : check_product_status
6881   -- Description     : Bug#4622438 checking product status
6882   -- Business Rules  :
6883   -- Parameters      :
6884   -- Version         : 1.0
6885   -- End of comments
6886 
6887   PROCEDURE check_product_status(
6888     x_return_status            OUT NOCOPY VARCHAR2,
6889     p_chr_id                   IN  NUMBER
6890   ) IS
6891 
6892     l_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
6893 
6894            CURSOR chk_product_status (p_chr_id IN NUMBER) IS
6895              SELECT
6896               pdt.name
6897               ,pdt.PRODUCT_STATUS_CODE
6898         FROM  okl_products_v    pdt
6899               ,okl_k_headers_v  khr
6900               ,okc_k_headers_b  CHR
6901         WHERE  1=1
6902         AND    khr.id = p_chr_id
6903         AND    pdt_id = pdt.id
6904         AND    khr.id = CHR.id;
6905 
6906         l_product_status_code okl_products_v.PRODUCT_STATUS_CODE%TYPE;
6907         l_product_name  okl_products_v.NAME%TYPE;
6908   BEGIN
6909 
6910     -- initialize return status
6911     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
6912 
6913     -- check for header payment
6914     OPEN chk_product_status (p_chr_id => TO_NUMBER(p_chr_id));
6915     FETCH chk_product_status INTO l_product_name,l_product_status_code;
6916     CLOSE chk_product_status;
6917 
6918     IF (l_product_status_code = 'INVALID') THEN
6919    --   x_return_status := OKL_API.G_RET_STS_SUCCESS;
6920 
6921         Okl_Api.set_message(
6922 			p_app_name	=> G_APP_NAME,
6923 			p_msg_name	=> 'OKL_LLA_INVALID_PRODUCT',
6924 			p_token1	=> 'PRODUCT_NAME',
6925 			p_token1_value	=> l_product_name);
6926         x_return_status := Okl_Api.G_RET_STS_ERROR;
6927 
6928     END IF;
6929     /*IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
6930         OKL_API.set_message(
6931           p_app_name      => G_APP_NAME,
6932           p_msg_name      => G_QA_SUCCESS);
6933     END IF;*/
6934 
6935 
6936 
6937   EXCEPTION
6938 
6939   WHEN  G_EXCEPTION_HALT_VALIDATION THEN
6940         NULL; -- error reported, just exit from this process
6941      WHEN OTHERS THEN
6942        -- store SQL error message on message stack
6943        Okl_Api.SET_MESSAGE(
6944          p_app_name        => G_APP_NAME,
6945          p_msg_name        => G_UNEXPECTED_ERROR,
6946          p_token1	   => G_SQLCODE_TOKEN,
6947          p_token1_value    => SQLCODE,
6948          p_token2          => G_SQLERRM_TOKEN,
6949          p_token2_value    => SQLERRM);
6950 
6951        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
6952 
6953        IF chk_product_status%ISOPEN THEN
6954          CLOSE chk_product_status;
6955        END IF;
6956 
6957 
6958   END check_product_status;
6959 
6960   -- Start of comments
6961   --
6962   -- Procedure Name  : check_loan_payment
6963   -- Description     : Bug#7271259 checking loan payment
6964   -- Business Rules  :
6965   -- Parameters      :
6966   -- Version         : 1.0
6967   -- End of comments
6968 
6969   PROCEDURE check_loan_payment(
6970     x_return_status            OUT NOCOPY VARCHAR2,
6971     p_chr_id                   IN  NUMBER
6972   ) IS
6973 
6974     l_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
6975 
6976        CURSOR chk_deal_type (p_chr_id IN NUMBER) IS
6977        select 'Y'
6978        from okl_k_headers
6979        where id = p_chr_id
6980        and deal_type = 'LOAN';
6981 
6982        CURSOR get_payment_lns (p_chr_id IN NUMBER) IS
6983        SELECT rgp.id,rgp.cle_id
6984        FROM OKC_RULE_GROUPS_B rgp,
6985             OKC_RULES_B crl2,
6986             okc_k_lines_b cleb,
6987             OKL_STRM_TYPE_B stty
6988        WHERE stty.id = crl2.object1_id1
6989        AND stty.stream_type_purpose = 'RENT'
6990        AND rgp.id = crl2.rgp_id
6991        AND crl2.RULE_INFORMATION_CATEGORY = 'LASLH'
6992        AND rgp.rgd_code = 'LALEVL'
6993        and rgp.dnz_chr_id = cleb.dnz_chr_id
6994        AND cleb.dnz_chr_id = p_chr_id
6995        AND cleb.id = rgp.cle_id
6996        AND rgp.cle_id is not null
6997        AND cleb.lse_id = 33
6998        AND NOT EXISTS (
6999                  SELECT 'Y'
7000                  FROM   okc_statuses_v okcsts
7001                  WHERE  okcsts.code = cleb.sts_code
7002                  AND    okcsts.ste_code IN ('EXPIRED','HOLD','CANCELLED','TERMINATED', 'ABANDONED'));
7003 
7004        CURSOR get_line_amt (p_id IN NUMBER) IS
7005         SELECT  nvl(capital_amount,0)  capital_amount, kle.name name
7006         FROM  okl_k_lines_full_v kle
7007         WHERE  kle.id = p_id;
7008 
7009        CURSOR get_payment_line_amt (p_rgp_id IN NUMBER, p_chr_id IN NUMBER) IS
7010 	select nvl(sum(tot_amt),0)
7011         from(
7012           SELECT to_number((NVL(crl2.rule_information3,0) * NVL(crl2.rule_information6,0))) tot_amt
7013           FROM   OKC_RULES_B crl1,
7014 	         OKC_RULES_B crl2
7015           WHERE  crl1.id = crl2.object2_id1
7016           AND crl2.RULE_INFORMATION_CATEGORY = 'LASLL'
7017           AND crl1.RULE_INFORMATION_CATEGORY = 'LASLH'
7018           AND crl1.dnz_chr_id = p_chr_id
7019           AND crl2.dnz_chr_id = p_chr_id
7020           AND crl1.rgp_id = p_rgp_id
7021 	  AND crl2.rgp_id = p_rgp_id
7022 	  union all
7023           SELECT
7024           to_number(nvl(crl2.rule_information8,0))  tot_amt
7025           FROM   OKC_RULES_B crl1,
7026 	         OKC_RULES_B crl2
7027           WHERE crl1.id = crl2.object2_id1
7028           AND crl2.RULE_INFORMATION_CATEGORY = 'LASLL'
7029           AND crl1.RULE_INFORMATION_CATEGORY = 'LASLH'
7030           AND crl1.dnz_chr_id = p_chr_id
7031           AND crl2.dnz_chr_id = p_chr_id
7032           AND crl1.rgp_id = p_rgp_id
7033 	  AND crl2.rgp_id = p_rgp_id
7034 	);
7035 
7036         l_cle_id NUMBER;
7037         l_chr_id NUMBER;
7038         l_capital_amount okl_k_lines.capital_amount%type;
7039         l_ast_name okl_k_lines_full_v.name%type := null;
7040         l_payment_amount okl_k_lines.capital_amount%type;
7041         l_deal_type_yn varchar2(1) := 'N';
7042   BEGIN
7043     -- initialize return status
7044     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
7045 
7046     --chk_deal_type for loan contract
7047     OPEN chk_deal_type (p_chr_id);
7048     FETCH chk_deal_type INTO l_deal_type_yn;
7049     CLOSE chk_deal_type;
7050 
7051     IF (l_deal_type_yn = 'Y') THEN
7052 
7053      FOR l_lne IN get_payment_lns(p_chr_id)
7054       LOOP
7055 
7056      -- check for line payment
7057      OPEN get_line_amt (l_lne.cle_id);
7058      FETCH get_line_amt INTO l_capital_amount,l_ast_name;
7059      CLOSE get_line_amt;
7060 
7061      -- check for payment line payment
7062      OPEN get_payment_line_amt (l_lne.id, p_chr_id);
7063      FETCH get_payment_line_amt INTO l_payment_amount;
7064      CLOSE get_payment_line_amt;
7065 
7066      IF(l_payment_amount < l_capital_amount) THEN
7067         Okl_Api.set_message(
7068 			p_app_name	=> G_APP_NAME,
7069 			p_msg_name	=> 'OKL_LLA_INVALID_PAYMNT_AMT',
7070 			p_token1	=> 'AST_NUMBER',
7071 			p_token1_value	=> l_ast_name);
7072         x_return_status := Okl_Api.G_RET_STS_ERROR;
7073     END IF;
7074 
7075    END LOOP;
7076 
7077   END IF;
7078 
7079   EXCEPTION
7080 
7081   WHEN  G_EXCEPTION_HALT_VALIDATION THEN
7082         NULL; -- error reported, just exit from this process
7083      WHEN OTHERS THEN
7084        -- store SQL error message on message stack
7085        Okl_Api.SET_MESSAGE(
7086          p_app_name        => G_APP_NAME,
7087          p_msg_name        => G_UNEXPECTED_ERROR,
7088          p_token1	   => G_SQLCODE_TOKEN,
7089          p_token1_value    => SQLCODE,
7090          p_token2          => G_SQLERRM_TOKEN,
7091          p_token2_value    => SQLERRM);
7092 
7093        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
7094 
7095   END check_loan_payment;
7096 
7097   --akrangan bug 5362977 start
7098  -- Start of comments
7099      --
7100      -- Procedure Name  : check_service_contracts
7101      -- Description     : Displays a error message if the IB instance that is
7102      --                   going to be expired during Rebook has Service
7103      --                   contracts associated to it.
7104      -- Business Rules  :
7105      -- Parameters      :
7106      -- Version         : 1.0
7107      -- End of comments
7108 
7109      PROCEDURE check_service_contracts(
7110        x_return_status            OUT NOCOPY VARCHAR2,
7111        p_chr_id                   IN  NUMBER
7112      ) IS
7113 
7114        --cursor to check if the contract is undergoing on-line rebook
7115        cursor l_chk_rbk_csr(p_chr_id IN NUMBER) is
7116        SELECT '!',
7117               orig_system_id1
7118        FROM   okc_k_headers_b CHR,
7119               okl_trx_contracts ktrx
7120        WHERE  ktrx.khr_id_new = chr.id
7121        AND    ktrx.tsu_code = 'ENTERED'
7122        AND    ktrx.rbr_code is NOT NULL
7123        AND    ktrx.tcn_type = 'TRBK'
7124 --rkuttiya added for 12.1.1 Multi GAAP
7125        AND    ktrx.representation_type = 'PRIMARY'
7126 --
7127        AND    chr.id = p_chr_id
7128        AND    chr.orig_system_source_code = 'OKL_REBOOK';
7129 
7130        l_rbk_khr      VARCHAR2(1) DEFAULT '?';
7131        l_orig_chr_id  NUMBER;
7132 
7133        CURSOR l_line_csr (p_chr_id IN NUMBER) IS
7134        SELECT model_cle.id                rbk_model_cle_id,
7135               model_cle.orig_system_id1   orig_model_cle_id,
7136               fin_ast_cle.id              rbk_fin_ast_cle_id,
7137               fin_ast_cle.orig_system_id1 orig_fin_ast_cle_id,
7138               fin_ast_cle.name            asset_number
7139        FROM   okc_k_lines_b  model_cle,
7140               okc_k_lines_v  fin_ast_cle,
7141               okc_statuses_b sts
7142        WHERE  fin_ast_cle.chr_id     =  p_chr_id
7143        AND    fin_ast_cle.dnz_chr_id =  p_chr_id
7144        AND    fin_ast_cle.lse_id   = 33 -- Financial Asset Line
7145        AND    model_cle.dnz_chr_id = p_chr_id
7146        AND    model_cle.cle_id     = fin_ast_cle.id
7147        AND    model_cle.lse_id     = 34  --Model Line
7148        and    sts.code = fin_ast_cle.sts_code
7149        and    sts.ste_code NOT IN ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
7150 
7151        CURSOR l_ib_line_csr (p_chr_id IN NUMBER,
7152                              p_fin_ast_cle_id IN NUMBER
7153                               ) IS
7154        SELECT ib_cim.object1_id1  instance_id
7155        FROM   okc_k_lines_b  ib_cle,
7156               okc_k_lines_b  inst_cle,
7157               okc_statuses_b sts,
7158               okc_k_items    ib_cim
7159        WHERE  inst_cle.dnz_chr_id   = p_chr_id
7160        AND    inst_cle.cle_id       = p_fin_ast_cle_id
7161        AND    inst_cle.lse_id       = 43 -- FREE_FORM2 Line
7162        AND    ib_cle.dnz_chr_id     = p_chr_id
7163        AND    ib_cle.cle_id         = inst_cle.id
7164        AND    ib_cle.lse_id         = 45  --IB Line
7165        AND    ib_cim.cle_id         = ib_cle.id
7166        AND    ib_cim.dnz_chr_id     = p_chr_id
7167        AND    sts.code = ib_cle.sts_code
7168        AND    sts.ste_code NOT IN ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
7169 
7170        CURSOR l_item_csr(p_chr_id   IN NUMBER,
7171                          p_cle_id   IN NUMBER) IS
7172        SELECT cim.object1_id1,
7173               cim.object1_id2,
7174               cim.number_of_items
7175        FROM   okc_k_items cim
7176        WHERE  cim.cle_id = p_cle_id
7177        AND    cim.dnz_chr_id = p_chr_id;
7178 
7179        l_rbk_item_rec   l_item_csr%ROWTYPE;
7180        l_orig_item_rec  l_item_csr%ROWTYPE;
7181 
7182        CURSOR srl_num_to_exp_csr(p_orig_fin_ast_cle_id IN NUMBER,
7183                                  p_rbk_fin_ast_cle_id  IN NUMBER,
7184                                  p_orig_chr_id         IN NUMBER,
7185                                  p_rbk_chr_id          IN NUMBER) IS
7186        SELECT orig_ib_cim.object1_id1 instance_id
7187        FROM   okc_k_items         orig_ib_cim,
7188               okc_k_lines_b       orig_ib_cle,
7189               okc_k_lines_b       orig_inst_cle,
7190               okc_statuses_b      inst_sts
7191        WHERE orig_inst_cle.dnz_chr_id = p_orig_chr_id
7192        AND   orig_inst_cle.cle_id = p_orig_fin_ast_cle_id
7193        AND   orig_inst_cle.lse_id = 43
7194        AND   orig_ib_cle.cle_id = orig_inst_cle.id
7195        AND   orig_ib_cle.dnz_chr_id =  p_orig_chr_id
7196        AND   orig_ib_cle.lse_id = 45
7197        AND   orig_ib_cim.cle_id = orig_ib_cle.id
7198        AND   orig_ib_cim.dnz_chr_id = p_orig_chr_id
7199        AND   orig_ib_cim.object1_id1 IS NOT NULL
7200        AND   inst_sts.code = orig_ib_cle.sts_code
7201        AND   inst_sts.ste_code NOT IN ('HOLD', 'EXPIRED', 'TERMINATED', 'CANCELLED')
7202        AND   NOT EXISTS (
7203               SELECT 1
7204               FROM okc_k_lines_b  rbk_inst_cle,
7205                    okc_statuses_b rbk_inst_sts
7206               WHERE rbk_inst_cle.orig_system_id1  = orig_inst_cle.id
7207               AND   rbk_inst_cle.lse_id = 43
7208               AND   rbk_inst_cle.dnz_chr_id = p_rbk_chr_id
7209               AND   rbk_inst_cle.cle_id = p_rbk_fin_ast_cle_id
7210               AND   rbk_inst_sts.code = rbk_inst_cle.sts_code
7211               AND   rbk_inst_sts.ste_code NOT IN ('HOLD', 'EXPIRED', 'TERMINATED', 'CANCELLED'));
7212 
7213        CURSOR check_svc_chr(p_object1_id1 IN VARCHAR2,
7214                             p_jtot_object_code IN VARCHAR2) IS
7215        SELECT svc_cle.dnz_chr_id
7216        FROM okc_k_lines_b   svc_cle,
7217             okc_k_items     svc_item,
7218             okc_statuses_b  sts,
7219             okc_k_headers_b svc_chr
7220        WHERE  svc_item.object1_id1 = p_object1_id1
7221        AND    svc_item.jtot_object1_code =  p_jtot_object_code
7222        AND    svc_cle.id = svc_item.cle_id
7223        AND    svc_cle.dnz_chr_id = svc_item.dnz_chr_id
7224        AND    svc_cle.sts_code = sts.code
7225        AND    sts.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED')
7226        AND    svc_chr.id       = svc_cle.dnz_chr_id
7227        AND    svc_chr.scs_code = 'SERVICE';
7228 
7229        CURSOR check_usage_svc_chr(p_instance_id IN NUMBER,
7230                                   p_jtot_object_code IN VARCHAR2,
7231                                   p_source_object_code IN VARCHAR2) IS
7232        SELECT svc_cle.dnz_chr_id
7233        FROM   okc_k_lines_b   svc_cle,
7234               okc_k_items     svc_item,
7235               okc_statuses_b  sts,
7236               okc_k_headers_b svc_chr,
7237               cs_counter_groups csg,
7238               cs_counters cc
7239        WHERE  svc_item.object1_id1 = TO_CHAR(cc.counter_id)
7240        AND    svc_item.jtot_object1_code =  p_jtot_object_code
7241        AND    svc_cle.id = svc_item.cle_id
7242        AND    svc_cle.dnz_chr_id = svc_item.dnz_chr_id
7243        AND    svc_cle.sts_code = sts.code
7244        AND    sts.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED')
7245        AND    svc_chr.id = svc_cle.dnz_chr_id
7246        AND    svc_chr.scs_code = 'SERVICE'
7247        AND    csg.source_object_id = p_instance_id
7248        AND    csg.source_object_code = p_source_object_code
7249        AND    csg.counter_group_id = cc.counter_group_id;
7250 
7251        i NUMBER;
7252        TYPE l_instance_tbl_type IS TABLE OF VARCHAR(40) INDEX BY BINARY_INTEGER;
7253        l_instance_tbl l_instance_tbl_type;
7254 
7255        l_svc_chr_id NUMBER;
7256        l_svc_chr_exists VARCHAR2(1);
7257      BEGIN
7258 
7259        x_return_status := OKL_API.G_RET_STS_SUCCESS;
7260 
7261        --check for rebook contract
7262        l_rbk_khr := '?';
7263        OPEN l_chk_rbk_csr (p_chr_id => p_chr_id);
7264        FETCH l_chk_rbk_csr INTO l_rbk_khr,l_orig_chr_id;
7265        CLOSE l_chk_rbk_csr;
7266 
7267        If l_rbk_khr = '!' Then
7268 
7269          l_svc_chr_exists := 'N';
7270 
7271          For l_line_rec In l_line_csr(p_chr_id => p_chr_id)
7272          Loop
7273 
7274            OPEN l_item_csr (p_chr_id => p_chr_id,
7275                             p_cle_id => l_line_rec.rbk_model_cle_id);
7276            FETCH l_item_csr INTO l_rbk_item_rec;
7277            CLOSE l_item_csr;
7278 
7279            OPEN l_item_csr (p_chr_id => l_orig_chr_id,
7280                             p_cle_id => l_line_rec.orig_model_cle_id);
7281            FETCH l_item_csr INTO l_orig_item_rec;
7282            CLOSE l_item_csr;
7283 
7284            -- Check for associated service contracts if:
7285            --   1. the Inventory Item has changed
7286            --   2. the Item is serialized and IB lines have been removed.
7287            IF (l_orig_item_rec.object1_id1 <> l_rbk_item_rec.object1_id1) THEN
7288 
7289              i := 1;
7290              FOR l_ib_line_rec in l_ib_line_csr(p_chr_id => l_orig_chr_id,
7291                                                 p_fin_ast_cle_id => l_line_rec.orig_fin_ast_cle_id)
7292              LOOP
7293                l_instance_tbl(i) := l_ib_line_rec.instance_id;
7294                i := i + 1;
7295              END LOOP;
7296 
7297            ELSE
7298              i := 1;
7299              FOR srl_num_to_exp_rec IN
7300                  srl_num_to_exp_csr(p_orig_fin_ast_cle_id => l_line_rec.orig_fin_ast_cle_id,
7301                                     p_rbk_fin_ast_cle_id  => l_line_rec.rbk_fin_ast_cle_id,
7302                                     p_orig_chr_id         => l_orig_chr_id,
7303                                     p_rbk_chr_id          => p_chr_id) LOOP
7304 
7305                l_instance_tbl(i) := srl_num_to_exp_rec.instance_id;
7306                i := i + 1;
7307 
7308              END LOOP;
7309            END IF;
7310 
7311            IF l_instance_tbl.COUNT > 0 THEN
7312              FOR i IN l_instance_tbl.FIRST .. l_instance_tbl.LAST LOOP
7313 
7314                l_svc_chr_id := NULL;
7315                -- Check for Service Contracts
7316                OPEN check_svc_chr(p_object1_id1      => l_instance_tbl(i)
7317                                  ,p_jtot_object_code => 'OKX_CUSTPROD');
7318                FETCH check_svc_chr INTO l_svc_chr_id;
7319                CLOSE check_svc_chr;
7320 
7321                IF l_svc_chr_id IS NULL THEN
7322                  -- Check for Usage based Service Contracts
7323                  OPEN check_usage_svc_chr(p_instance_id        => TO_NUMBER(l_instance_tbl(i))
7324                                          ,p_jtot_object_code   => 'OKX_COUNTER'
7325                                          ,p_source_object_code => 'CP');
7326                  FETCH check_usage_svc_chr INTO l_svc_chr_id;
7327                  CLOSE check_usage_svc_chr;
7328                END IF;
7329 
7330                IF l_svc_chr_id IS NOT NULL THEN
7331                  l_svc_chr_exists := 'Y';
7332                  EXIT;
7333                END IF;
7334 
7335              END LOOP;
7336            END IF;
7337 
7338            IF l_svc_chr_exists = 'Y' THEN
7339              OKL_API.set_message(
7340                     p_app_name     => G_APP_NAME,
7341                     p_msg_name     => 'OKL_QA_CANNOT_DEL_IB_INST',
7342                     p_token1       => 'ASSET_NUMBER',
7343                     p_token1_value => l_line_rec.asset_number);
7344               x_return_status := OKL_API.G_RET_STS_ERROR;
7345               EXIT;
7346            END IF;
7347 
7348          End Loop;
7349        End If;
7350 
7351      EXCEPTION
7352      WHEN OTHERS THEN
7353        -- store SQL error message on message stack
7354        OKL_API.SET_MESSAGE(
7355             p_app_name        => G_APP_NAME,
7356             p_msg_name        => G_UNEXPECTED_ERROR,
7357             p_token1                => G_SQLCODE_TOKEN,
7358             p_token1_value    => SQLCODE,
7359             p_token2          => G_SQLERRM_TOKEN,
7360             p_token2_value    => SQLERRM);
7361 
7362        x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
7363 
7364      END check_service_contracts;
7365 --akrangan  bug 5362977 end
7366 
7367   -- Start of comments
7368   --
7369   -- Procedure Name  : check_sales_quote
7370   -- Description     : Bug#4419339 sales quote validations
7371   -- Business Rules  :
7372   -- Parameters      :
7373   -- Version         : 1.0
7374   -- End of comments
7375 
7376   PROCEDURE check_sales_quote(
7377                                x_return_status            OUT NOCOPY VARCHAR2,
7378                                p_chr_id                   IN  NUMBER
7379                                ) IS
7380   CURSOR l_hdr_csr IS
7381   SELECT tradein_amount
7382   FROM   okl_k_headers_v
7383   WHERE  id = p_chr_id;
7384   l_hdr_rec l_hdr_csr%ROWTYPE;
7385 
7386   CURSOR l_line_csr IS
7387   SELECT cle.id,
7388          cle.name,
7389          kle.tradein_amount,
7390          capital_reduction,
7391          capitalize_down_payment_yn,
7392 	 -- Bug 6417667 Start
7393 	 kle.capital_reduction_percent,
7394 	 kle.oec
7395 	 -- Bug 6417667 End
7396          --down_payment_yes_no
7397   FROM
7398          okl_k_lines kle,
7399          okc_k_lines_v cle,
7400          okc_line_styles_b sty,
7401          okc_statuses_b sts
7402   WHERE  cle.id = kle.id
7403   AND    dnz_chr_id = p_chr_id
7404   AND    cle.lse_id = sty.id
7405   AND    sty.lty_code = 'FREE_FORM1'
7406   AND    cle.sts_code = sts.code
7407   AND    sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
7408 
7409   CURSOR l_down_pmnt_check_csr(p_cle_id OKC_K_LINES_B.ID%TYPE)  IS
7410   SELECT crg.cle_id,
7411          crl.id,
7412          crl.object1_id1,
7413          crl.RULE_INFORMATION6
7414   FROM   OKC_RULE_GROUPS_B crg,
7415          OKC_RULES_B crl,
7416          OKL_STRM_TYPE_B stty
7417   WHERE  stty.id = crl.object1_id1
7418   AND stty.stream_type_purpose = 'DOWN_PAYMENT'
7419   AND crl.rgp_id = crg.id
7420   AND crg.RGD_CODE = 'LALEVL'
7421   AND crl.RULE_INFORMATION_CATEGORY = 'LASLH'
7422   AND crg.cle_id = p_cle_id
7423   AND crg.dnz_chr_id = p_chr_id;
7424   l_down_pmnt_check_rec l_down_pmnt_check_csr%ROWTYPE;
7425 
7426   CURSOR l_down_pmnt_line_csr(p_id OKC_RULES_B.ID%TYPE, p_cle_id OKC_K_LINES_B.ID%TYPE) IS
7427   SELECT crl2.object1_id1,
7428          crl2.object1_id2,
7429          crl2.rule_information2,
7430          NVL(crl2.rule_information3,0) rule_information3,
7431          NVL(crl2.rule_information6,0) rule_information6
7432   FROM   OKC_RULES_B crl1, OKC_RULES_B crl2, OKC_RULE_GROUPS_B rgp
7433   WHERE crl1.id = crl2.object2_id1
7434   AND crl1.id = p_id
7435   AND rgp.cle_id = p_cle_id
7436   AND rgp.id = crl1.rgp_id
7437   AND crl2.RULE_INFORMATION_CATEGORY = 'LASLL'
7438   AND crl1.RULE_INFORMATION_CATEGORY = 'LASLH'
7439   AND crl1.dnz_chr_id = p_chr_id
7440   AND crl2.dnz_chr_id = p_chr_id;
7441 
7442   l_asset_tradein_yes BOOLEAN;
7443   l_exists BOOLEAN;
7444   l_asset_tradein_amt NUMBER;
7445   l_hdr_tradein_amt   NUMBER;
7446   l_num_pmnt_lines    NUMBER;
7447   -- Start fix for bug 7131895
7448   l_pricing_engine    VARCHAR2(30);
7449   l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
7450   l_tax_owner VARCHAR2(100);
7451   l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7452   -- End fix for bug 7131895
7453 
7454   BEGIN
7455 
7456     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
7457     l_asset_tradein_yes := FALSE;
7458     l_asset_tradein_amt := 0;
7459 
7460     l_hdr_tradein_amt := NULL;
7461     OPEN l_hdr_csr;
7462     FETCH l_hdr_csr INTO l_hdr_rec;
7463     l_hdr_tradein_amt := l_hdr_rec.tradein_amount;
7464     CLOSE l_hdr_csr;
7465     -- Start fix for bug 7131895
7466     OPEN  l_hdrrl_csr('LATOWN', 'LATOWN', TO_NUMBER(p_chr_id));
7467     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
7468     CLOSE l_hdrrl_csr;
7469     l_tax_owner := l_hdrrl_rec.RULE_INFORMATION1;
7470     -- End fix for bug 7131895
7471 
7472     IF (l_hdr_tradein_amt IS NULL) THEN
7473         l_asset_tradein_yes := TRUE;
7474     END IF;
7475 
7476     FOR l_line_rec IN l_line_csr
7477     LOOP
7478       IF (l_line_rec.tradein_amount IS NOT NULL) THEN
7479         l_asset_tradein_yes := TRUE;
7480         l_asset_tradein_amt := l_asset_tradein_amt + l_line_rec.tradein_amount;
7481       END IF;
7482 
7483     --Bug 6417667 Start
7484     IF (l_line_rec.capital_reduction IS NOT NULL
7485      OR l_line_rec.capital_reduction_percent IS NOT NULL) THEN  -- Added for bug 5473440
7486     --Bug 6417667 End
7487       IF (l_line_rec.capitalize_down_payment_yn = 'N') THEN
7488 
7489         --check payment line existence with one period having the entire capital_reduction
7490         --in that payment. that is the amounts must be equal.
7491         OPEN l_down_pmnt_check_csr(l_line_rec.id);
7492         FETCH l_down_pmnt_check_csr INTO l_down_pmnt_check_rec;
7493         l_exists := l_down_pmnt_check_csr%FOUND;
7494         CLOSE l_down_pmnt_check_csr;
7495 
7496         IF (NOT l_exists) THEN
7497           --RAISE ERROR no down payments exist.
7498           Okl_Api.set_message(
7499                   p_app_name     => G_APP_NAME,
7500                   p_msg_name     => 'OKL_QA_SQ_NO_DOWN_PMNT');
7501           x_return_status := Okl_Api.G_RET_STS_ERROR;
7502 
7503         END IF;
7504 
7505         IF ( l_down_pmnt_check_rec.cle_id IS NULL) THEN
7506           --RAISE ERROR cannot define at contract header level.
7507           Okl_Api.set_message(
7508                   p_app_name     => G_APP_NAME,
7509                   p_msg_name     => 'OKL_QA_SQ_DOWN_PMNT_HDR');
7510           x_return_status := Okl_Api.G_RET_STS_ERROR;
7511         END IF;
7512 
7513         l_num_pmnt_lines := 0;
7514 
7515         FOR l_down_pmnt_line_rec IN l_down_pmnt_line_csr(l_down_pmnt_check_rec.id, l_line_rec.id)
7516         LOOP
7517           --check for number of payments also.
7518 
7519           l_num_pmnt_lines := l_num_pmnt_lines + 1;
7520           IF(l_down_pmnt_line_rec.rule_information3 <> 1) THEN
7521             Okl_Api.set_message(
7522                   p_app_name     => G_APP_NAME,
7523                   p_msg_name     => 'OKL_QA_SQ_PERIOD_MISMATCH');
7524             x_return_status := Okl_Api.G_RET_STS_ERROR;
7525           END IF;
7526 
7527           --Bug 6417667 Start
7528 	  -- Not using NVL function because Down payment amount or percent value can be zero.
7529 	  IF((l_line_rec.capital_reduction IS NOT NULL AND l_line_rec.capital_reduction <> l_down_pmnt_line_rec.rule_information6)
7530            OR (l_line_rec.capital_reduction_percent IS NOT NULL AND ((l_line_rec.capital_reduction_percent/100)*l_line_rec.oec) <> l_down_pmnt_line_rec.rule_information6)) THEN
7531 	  --Bug 6417667 End
7532             Okl_Api.set_message(
7533                   p_app_name     => G_APP_NAME,
7534                   p_msg_name     => 'OKL_QA_SQ_DOWN_PMNT_MISMATCH');
7535             x_return_status := Okl_Api.G_RET_STS_ERROR;
7536           END IF;
7537 
7538         END LOOP;
7539 
7540         IF (l_num_pmnt_lines > 1) THEN
7541          --RAISE ERROR cannot have more than one down payment line.
7542          Okl_Api.set_message(
7543                 p_app_name     => G_APP_NAME,
7544                 p_msg_name     => 'OKL_QA_SQ_DOWN_PMNT_LN_GT1');
7545          x_return_status := Okl_Api.G_RET_STS_ERROR;
7546         END IF;
7547 
7548       ELSE -- Capitalize Flag = 'Y', Start fix for bug 7131895
7549         Okl_Streams_Util.get_pricing_engine(p_khr_id => p_chr_id,
7550                                             x_pricing_engine => l_pricing_engine,
7551                                             x_return_status => l_return_status);
7552         IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
7553           x_return_status := l_return_status;
7554           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
7555         END IF;
7556 
7557         --RAISE ERROR if pricing engine is 'EXTERNAL' and tax owner='LESSOR'
7558 	IF ((l_pricing_engine = 'EXTERNAL') AND (l_tax_owner ='LESSOR')) THEN
7559             Okl_Api.set_message(
7560                     p_app_name     => G_APP_NAME,
7561                     p_msg_name     => 'OKL_QA_SQ_DOWN_PMNT_TAXOWNER');
7562             x_return_status := Okl_Api.G_RET_STS_ERROR;
7563         END IF;
7564 	-- End fix for bug 7131895
7565         --if payment existence throw error
7566         OPEN l_down_pmnt_check_csr(l_line_rec.id);
7567         FETCH l_down_pmnt_check_csr INTO l_down_pmnt_check_rec;
7568         l_exists := l_down_pmnt_check_csr%FOUND;
7569         CLOSE l_down_pmnt_check_csr;
7570 
7571         IF (l_exists) THEN
7572           --RAISE ERROR no payment required for non capitalized assets.
7573           Okl_Api.set_message(
7574                   p_app_name     => G_APP_NAME,
7575                   p_msg_name     => 'OKL_QA_SQ_CAPITALIZED_AST');
7576           x_return_status := Okl_Api.G_RET_STS_ERROR;
7577 
7578         END IF;
7579 
7580       END IF;
7581 
7582     END IF; --Added for bug#5473440
7583 
7584     END LOOP;
7585 
7586     IF(l_hdr_tradein_amt IS NOT NULL) THEN
7587      IF (l_asset_tradein_amt <> l_hdr_tradein_amt) THEN
7588       Okl_Api.set_message(
7589                 p_app_name     => G_APP_NAME,
7590                 p_msg_name     => 'OKL_QA_SQ_TRADEIN_AMT');
7591       x_return_status := Okl_Api.G_RET_STS_ERROR;
7592      END IF;
7593     END IF;
7594 
7595     IF (NOT l_asset_tradein_yes) THEN
7596       Okl_Api.set_message(
7597                 p_app_name     => G_APP_NAME,
7598                 p_msg_name     => 'OKL_QA_SQ_TRADEIN_ASSOC');
7599       x_return_status := Okl_Api.G_RET_STS_ERROR;
7600     END IF;
7601 
7602   EXCEPTION
7603 
7604   WHEN G_EXCEPTION_HALT_VALIDATION THEN
7605     -- no processing necessary; validation can continue with next column
7606     NULL;
7607   WHEN OTHERS THEN
7608     -- store SQL error message on message stack
7609     Okl_Api.SET_MESSAGE(
7610       p_app_name        => G_APP_NAME,
7611       p_msg_name        => G_UNEXPECTED_ERROR,
7612       p_token1	        => G_SQLCODE_TOKEN,
7613       p_token1_value    => SQLCODE,
7614       p_token2          => G_SQLERRM_TOKEN,
7615       p_token2_value    => SQLERRM);
7616     -- notify caller of an error as UNEXPETED error
7617     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
7618     -- verify that cursor was closed
7619     IF l_hdr_csr%ISOPEN THEN
7620       CLOSE l_hdr_csr;
7621     END IF;
7622     IF l_line_csr%ISOPEN THEN
7623       CLOSE l_line_csr;
7624     END IF;
7625 
7626   END check_sales_quote;
7627 
7628   -- Start of comments
7629   --
7630   -- Procedure Name  : check_functional_constraints
7631   -- Description     :
7632   -- Business Rules  :
7633   -- Parameters      :
7634   -- Version         : 1.0
7635   -- End of comments
7636 
7637   PROCEDURE check_func_constrs_4new(
7638     x_return_status            OUT NOCOPY VARCHAR2,
7639     p_chr_id                   IN  NUMBER
7640   ) IS
7641 
7642     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7643     l_dummy VARCHAR2(1) := '?';
7644     l_count NUMBER := 0;
7645     l_row_notfound BOOLEAN;
7646     l_token VARCHAR2(2000);
7647 
7648 
7649     --Bug#3877032
7650     CURSOR l_contract_name ( n VARCHAR2 ) IS
7651     SELECT 'Y'
7652     --Select count(*) cnt
7653     FROM okc_k_headers_b WHERE contract_number = n;
7654     l_cn l_contract_name%ROWTYPE;
7655 
7656 
7657     l_hdr     l_hdr_csr%ROWTYPE;
7658     l_txl     l_txl_csr%ROWTYPE;
7659     l_txd     l_txd_csr%ROWTYPE;
7660     l_lne     l_lne_csr%ROWTYPE;
7661     l_itm     l_itms_csr%ROWTYPE;
7662     l_struct_rec l_struct_csr%ROWTYPE;
7663     l_structure  NUMBER;
7664     l_rl_rec1 l_rl_csr1%ROWTYPE;
7665     i NUMBER;
7666 
7667 
7668     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
7669     l_supp_rec supp_csr%ROWTYPE;
7670 
7671     l_asst asst_qty_csr%ROWTYPE;
7672     l_ib_qty   NUMBER;
7673 
7674     --Bug#3877032
7675     CURSOR l_rpt_csr( bk VARCHAR2, dat DATE ) IS
7676     SELECT 'Y'
7677        FROM   fa_book_controls
7678        WHERE  book_class = 'TAX'
7679        --and  nvl(initial_date,dat) <= dat Bug#3636801
7680        AND  NVL(date_ineffective,dat+1) > dat
7681        AND  book_type_code = bk;
7682 
7683     l_rpt_rec l_rpt_csr%ROWTYPE;
7684     l_report_tax_book VARCHAR2(256);
7685 
7686     CURSOR party_csr (p_chr_id OKC_K_HEADERS_B.ID%TYPE,
7687                       p_cle_id OKC_K_LINES_B.ID%TYPE) IS
7688     SELECT object1_id1
7689     FROM   okc_k_party_roles_b
7690     WHERE  dnz_chr_id        = p_chr_id
7691     AND    cle_id            = p_cle_id
7692     AND    jtot_object1_code = 'OKX_VENDOR';
7693 
7694     CURSOR passthru_site_csr (p_vendor_id OKX_VENDOR_SITES_V.VENDOR_ID%TYPE,
7695                               p_site_id   OKX_VENDOR_SITES_V.ID1%TYPE) IS
7696     SELECT 'Y'
7697     FROM   okx_vendor_sites_v
7698     WHERE  id1            = p_site_id
7699     AND    vendor_id      = p_vendor_id
7700     AND    status         = 'A'
7701     AND    TRUNC(SYSDATE) >= NVL(TRUNC(start_date_active), TRUNC(SYSDATE));
7702 
7703     CURSOR line_amt_csr (p_chr_id OKC_K_HEADERS_B.ID%TYPE,
7704                          p_lty_code OKC_LINE_STYLES_V.LTY_CODE%TYPE) IS
7705     SELECT line.id,
7706            line.line_number,
7707            line.amount
7708     FROM   okl_k_lines_full_v line,
7709            okc_line_styles_v style,
7710            okc_statuses_b sts
7711     WHERE  line.lse_id     = style.id
7712     AND    style.lty_code  = p_lty_code
7713     AND    sts.code        = line.sts_code
7714     AND    sts.ste_code NOT IN ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
7715     AND    line.dnz_chr_id = p_chr_id;
7716 
7717     CURSOR sub_line_amt_csr (p_line_id OKC_K_LINES_B.ID%TYPE) IS
7718     SELECT SUM(NVL(capital_amount,0))
7719     FROM   okl_k_lines_full_v line
7720     WHERE  line.cle_id = p_line_id;
7721 
7722     CURSOR txd_csr1 (Kleid NUMBER) IS
7723     SELECT
7724           sgn.value book_type,
7725           COUNT(*) book_count
7726     FROM  Okl_txd_assets_v txd,
7727           okl_txl_assets_b txl,
7728           okl_sgn_translations sgn
7729     WHERE txd.tal_id            = txl.id
7730     AND   txl.kle_id            = Kleid
7731     AND   sgn.jtot_object1_code = 'FA_BOOK_CONTROLS'
7732     AND   sgn.object1_id1       = txd.tax_book
7733     AND   sgn.sgn_code          = 'STMP'                -- Bug# 3533552
7734     GROUP BY sgn.value;
7735 
7736     l_tot_sub_line_amt NUMBER;
7737 
7738     l_passthru_site_id   OKC_RULES_B.OBJECT1_ID1%TYPE;
7739     l_passthru_vendor_id OKC_K_PARTY_ROLES_B.OBJECT1_ID1%TYPE;
7740     l_site_valid         VARCHAR2(1) := '?';
7741     l_passthru_present   VARCHAR2(1) := 'N';
7742 
7743     lx_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7744     x_msg_count         NUMBER;
7745     x_msg_data          VARCHAR2(1000);
7746     --l_tax_owner         VARCHAR2(100);
7747 
7748     --------------
7749     --Bug# 4103361
7750     --------------
7751     -- cursor to check valid combination of asset book and category
7752     CURSOR l_bk_cat_csr(p_cat_id IN NUMBER,
7753                         p_book_type_code IN VARCHAR2) IS
7754     SELECT 'Y'
7755     FROM    OKX_AST_CAT_BKS_V
7756     WHERE   category_id     = p_cat_id
7757     AND     book_type_code  = p_book_type_code;
7758 
7759     l_valid_bk_cat   VARCHAR2(1);
7760 
7761     --------------
7762     --Bug# 7131806
7763     --------------
7764     -- cursor to check valid corporate book tied to the ledger
7765     CURSOR l_corpbook_csr(p_book_type_code IN VARCHAR2) IS
7766     SELECT 'Y'
7767     FROM FA_BOOK_CONTROLS fa,
7768          OKL_SYS_ACCT_OPTS sys
7769     WHERE book_class='CORPORATE'
7770     AND   fa.set_of_books_id = sys.set_of_books_id
7771     AND   book_type_code  = p_book_type_code;
7772 
7773     l_valid_corpbook   VARCHAR2(1);
7774 
7775     --cursor to fetch category name for message token
7776     CURSOR l_fa_cat_csr(p_cat_id IN NUMBER) IS
7777     SELECT name
7778     FROM   okx_asst_catgrs_v
7779     WHERE  category_id   = p_cat_id;
7780 
7781     l_fa_cat_name  okx_asst_catgrs_v.name%TYPE;
7782 
7783     --------------
7784     --Bug# 4103361
7785     --------------
7786 
7787     --------------
7788     --Bug# 4350255
7789     --------------
7790     CURSOR pth_hdr_csr(p_chr_id IN NUMBER,
7791                        p_cle_id IN NUMBER) IS
7792     SELECT 1
7793     FROM   okl_party_payment_hdr pph
7794     WHERE  cle_id = p_cle_id
7795     AND    dnz_chr_id = p_chr_id;
7796 
7797     l_pth_present VARCHAR2(1);
7798 
7799     CURSOR pth_dtl_csr(p_chr_id IN NUMBER,
7800                        p_cle_id IN NUMBER) IS
7801     SELECT ppd.vendor_id,
7802            ppd.pay_site_id,
7803            pph.passthru_term
7804     FROM   okl_party_payment_hdr pph,
7805            okl_party_payment_dtls ppd
7806     WHERE  pph.cle_id = p_cle_id
7807     AND    pph.dnz_chr_id = p_chr_id
7808     AND    ppd.payment_hdr_id = pph.id;
7809 
7810     l_vendor_id OKC_K_PARTY_ROLES_B.OBJECT1_ID1%TYPE;
7811 
7812     CURSOR vendor_csr(p_vendor_id IN NUMBER) IS
7813     SELECT vendor_name
7814     FROM   po_vendors
7815     WHERE  vendor_id = p_vendor_id;
7816 
7817     l_vendor_name po_vendors.vendor_name%TYPE;
7818 
7819 
7820     CURSOR l_kle_csr(ltycode VARCHAR2, chrid OKL_K_HEADERS.KHR_ID%TYPE) IS
7821     SELECT NVL(kle.name,kle.item_description) name,
7822 	   kle.id,
7823            ls.name line_style
7824     FROM OKL_K_LINES_FULL_V kle,
7825          OKC_LINE_STYLES_v ls,
7826 	 OKC_STATUSES_B sts
7827      WHERE kle.lse_id = ls.id
7828      AND ls.lty_code = ltycode
7829      AND kle.dnz_chr_id = chrid
7830      AND sts.code = kle.sts_code
7831      AND sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
7832 
7833     --------------
7834     --Bug# 4350255
7835     --------------
7836 
7837     --Bug# 4631549
7838     l_release_contract_yn varchar2(1);
7839     l_oec number;
7840 
7841     -- Bug 5216135 : kbbhavsa : 29-May-06 : start
7842     -- cursor to fecth link line id for top line id
7843     CURSOR l_kle_link_csr(ltycode VARCHAR2, chrid OKL_K_HEADERS.KHR_ID%TYPE, cleid OKL_K_LINES_FULL_V.CLE_ID%TYPE) IS
7844     SELECT kle.id
7845     FROM OKL_K_LINES_FULL_V kle,
7846          OKC_LINE_STYLES_v ls,
7847 	     OKC_STATUSES_B sts
7848      WHERE kle.lse_id = ls.id
7849      AND ls.lty_code = ltycode
7850      AND kle.dnz_chr_id = chrid
7851      AND sts.code = kle.sts_code
7852      AND sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
7853      and kle.cle_id =  cleid;
7854 
7855      l_link_cle_id OKL_K_LINES_FULL_V.ID%TYPE;
7856      -- Bug 5216135 : kbbhavsa : 29-May-06 : End
7857 
7858   CURSOR system_corp_book_csr(p_chr_id NUMBER) IS
7859   SELECT A.ASST_ADD_BOOK_TYPE_CODE,
7860          C.secondary_rep_method secondary_rep_method
7861   FROM   okl_system_params_all a,
7862          okc_k_headers_all_b b,
7863          okl_sys_acct_opts_all c
7864   WHERE  b.id = p_chr_id
7865   AND    b.authoring_org_id = a.org_id
7866   AND    c.org_id = a.org_id;
7867 
7868   l_system_corp_book okl_system_params_all.ASST_ADD_BOOK_TYPE_CODE%TYPE;
7869   l_secondary_rep_method okl_sys_acct_opts_all.secondary_rep_method%TYPE;
7870 
7871 CURSOR chk_rpt_prod_id (p_chr_id IN NUMBER) IS
7872              SELECT
7873               pdt.reporting_pdt_id
7874         FROM  okl_products_v    pdt
7875               ,okl_k_headers_v  khr
7876               ,okc_k_headers_b  CHR
7877         WHERE  1=1
7878         AND    khr.id = p_chr_id
7879         AND    pdt_id = pdt.id
7880         AND    khr.id = CHR.id;
7881 
7882          l_reporting_pdt_id  okl_products_v.reporting_pdt_id%TYPE;
7883 
7884 
7885   BEGIN
7886 
7887     -- initialize return status
7888     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
7889 
7890     /*Bug#4186455
7891     *--Bug#3877032
7892     *OPEN  l_hdrrl_csr('LATOWN', 'LATOWN', TO_NUMBER(p_chr_id));
7893     *FETCH l_hdrrl_csr into l_hdrrl_rec;
7894     *CLOSE l_hdrrl_csr;
7895     *l_tax_owner := l_hdrrl_rec.RULE_INFORMATION1;
7896     */
7897 
7898     OPEN  l_hdr_csr(p_chr_id);
7899     FETCH l_hdr_csr INTO l_hdr;
7900     IF l_hdr_csr%NOTFOUND THEN
7901        CLOSE l_hdr_csr;
7902        RAISE G_EXCEPTION_HALT_VALIDATION;
7903     END IF;
7904     CLOSE l_hdr_csr;
7905 
7906     --MGAAP 7263041
7907     OPEN  system_corp_book_csr(p_chr_id);
7908     FETCH system_corp_book_csr INTO l_system_corp_book,l_secondary_rep_method;
7909     IF system_corp_book_csr%NOTFOUND THEN
7910        CLOSE system_corp_book_csr;
7911        RAISE G_EXCEPTION_HALT_VALIDATION;
7912     END IF;
7913     CLOSE system_corp_book_csr;
7914 
7915     OPEN chk_rpt_prod_id (p_chr_id);
7916     FETCH chk_rpt_prod_id INTO l_reporting_pdt_id;
7917     IF chk_rpt_prod_id%NOTFOUND THEN
7918        CLOSE chk_rpt_prod_id;
7919        RAISE G_EXCEPTION_HALT_VALIDATION;
7920     END IF;
7921     CLOSE chk_rpt_prod_id;
7922 
7923     IF (NVL(l_secondary_rep_method, '?') = 'NOT_APPLICABLE') THEN
7924       IF (l_reporting_pdt_id IS NOT NULL AND
7925           l_reporting_pdt_id <> OKL_API.G_MISS_NUM) THEN
7926             Okl_Api.set_message(
7927               p_app_name     => G_APP_NAME,
7928               p_msg_name     => 'OKL_QA_RPT_MISMATCH'); -- MGAAP 7263041
7929             x_return_status := Okl_Api.G_RET_STS_ERROR;
7930             RAISE G_EXCEPTION_HALT_VALIDATION;
7931       END IF;
7932     END IF;
7933 
7934     /*Bug# 3670104
7935     *If( l_hdr.DATE_SIGNED >= l_hdr.START_DATE) Then
7936     *        OKL_API.set_message(
7937     *          p_app_name     => G_APP_NAME,
7938     *          p_msg_name     => 'OKL_QA_DATESIGNED_LT_START');
7939     *         -- notify caller of an error
7940     *        x_return_status := OKL_API.G_RET_STS_ERROR;
7941     *End If;
7942     */
7943 
7944     OPEN  l_contract_name(l_hdr.contract_number);
7945     FETCH l_contract_name INTO l_cn;
7946     IF l_contract_name%NOTFOUND THEN
7947        CLOSE l_contract_name;
7948        RAISE G_EXCEPTION_HALT_VALIDATION;
7949     END IF;
7950     CLOSE l_contract_name;
7951 
7952     /*
7953     *If( l_cn.cnt > 1) Then
7954     *        OKL_API.set_message(
7955     *          p_app_name     => G_APP_NAME,
7956     *          p_msg_name     => 'OKL_QA_CN_NOTUNQ');
7957     *         -- notify caller of an error
7958     *        x_return_status := OKL_API.G_RET_STS_ERROR;
7959     *End If;
7960     */
7961 
7962 
7963     FOR l_struct_rec IN l_struct_csr ( TO_NUMBER(p_chr_id) )
7964     LOOP
7965 
7966         IF ( l_struct_rec.structure <> -1 ) THEN
7967             l_structure := TO_NUMBER(l_struct_rec.structure);
7968         END IF;
7969 
7970     END LOOP;
7971 
7972     IF( ( l_structure > 3) AND (l_hdr.DEAL_TYPE <> 'LOAN-REVOLVING')) THEN
7973             Okl_Api.set_message(
7974               p_app_name     => G_APP_NAME,
7975               p_msg_name     => 'OKL_QA_STRUCTURE_NA');
7976              -- notify caller of an error
7977             x_return_status := Okl_Api.G_RET_STS_ERROR;
7978     END IF;
7979 
7980     --bug# 2753114
7981     IF( l_hdr.report_pdt_id <> -1 ) THEN
7982 
7983         l_report_tax_book := OKL_SYSTEM_PARAMS_ALL_PUB.get_system_param_value(OKL_SYSTEM_PARAMS_ALL_PUB.G_RPT_PROD_BOOK_TYPE_CODE);
7984 
7985         OPEN  l_rpt_csr( l_report_tax_book, l_hdr.start_date );
7986         FETCH l_rpt_csr INTO l_rpt_rec;
7987         --Bug#3877032
7988         IF ( l_rpt_csr%NOTFOUND ) THEN
7989         --IF ( nvl(l_rpt_rec.isThere, 'N' ) = 'N' ) THEN
7990             Okl_Api.set_message(
7991                p_app_name     => G_APP_NAME,
7992                p_msg_name     => 'OKL_QA_NO_REPTXBK');
7993               -- notify caller of an error
7994             x_return_status := Okl_Api.G_RET_STS_ERROR;
7995         END IF;
7996         CLOSE l_rpt_csr;
7997 
7998     END IF;
7999 
8000     OPEN  l_lne_csr('FREE_FORM1', p_chr_id);
8001     FETCH l_lne_csr INTO l_lne;
8002     IF( (l_hdr.DEAL_TYPE = 'LOAN-REVOLVING') AND l_lne_csr%FOUND AND (l_hdr.report_pdt_id = -1) ) THEN
8003             Okl_Api.set_message(
8004               p_app_name     => G_APP_NAME,
8005               p_msg_name     => 'OKL_QA_ASST_LNR');
8006              -- notify caller of an error
8007             x_return_status := Okl_Api.G_RET_STS_ERROR;
8008 	    CLOSE l_lne_csr;
8009             RAISE G_EXCEPTION_HALT_VALIDATION;
8010     ELSIF( (l_hdr.DEAL_TYPE <> 'LOAN-REVOLVING') AND l_lne_csr%NOTFOUND ) THEN
8011             Okl_Api.set_message(
8012               p_app_name     => G_APP_NAME,
8013               p_msg_name     => 'OKL_QA_NO_ASSETS');
8014              -- notify caller of an error
8015             x_return_status := Okl_Api.G_RET_STS_ERROR;
8016     END IF;
8017     CLOSE l_lne_csr;
8018 
8019     --Bug# 4631549
8020     l_release_contract_yn := okl_api.g_false;
8021     l_release_contract_yn := okl_lla_util_pvt.check_release_contract(p_chr_id => p_chr_id);
8022 
8023     FOR l_lne IN l_lne_csr('FREE_FORM1', p_chr_id)
8024     LOOP
8025 
8026 /* -- not checking for asset number uniquesness. Re-Book !!!
8027       OPEN  l_line_name(l_lne.name);
8028       FETCH l_line_name into l_ln;
8029       IF l_line_name%NOTFOUND THEN
8030          RAISE G_EXCEPTION_HALT_VALIDATION;
8031       END IF;
8032       CLOSE l_line_name;
8033 
8034       If( l_ln.cnt > 1) Then
8035               OKL_API.set_message(
8036                 p_app_name     => G_APP_NAME,
8037                 p_msg_name     => 'OKL_QA_AN_NOTUNQ');
8038                -- notify caller of an error
8039               x_return_status := OKL_API.G_RET_STS_ERROR;
8040       End If;
8041 
8042 */
8043 
8044       --Bug# 4631549
8045      If l_release_contract_yn = okl_api.g_true then
8046          l_oec := l_lne.expected_asset_cost;
8047      else
8048          l_oec := l_lne.oec;
8049      end if;
8050 
8051       --Bug# 4631549
8052       IF ( l_lne.RESIDUAL_VALUE > l_OEC ) Then
8053       --IF ( l_lne.RESIDUAL_VALUE > l_lne.OEC ) THEN
8054             Okl_Api.set_message(
8055               p_app_name     => G_APP_NAME,
8056               p_msg_name     => 'OKL_QA_RES_GT_OEC',
8057               p_token1       => 'line',
8058               p_token1_value => l_lne.name);
8059              -- notify caller of an error
8060             x_return_status := Okl_Api.G_RET_STS_ERROR;
8061       END IF;
8062 
8063       --Bug# 4631549
8064       If ( l_lne.CAPITAL_REDUCTION > l_OEC) Then
8065       --IF ( l_lne.CAPITAL_REDUCTION > l_lne.OEC) THEN
8066             Okl_Api.set_message(
8067               p_app_name     => G_APP_NAME,
8068               p_msg_name     => 'OKL_QA_CAPRED_LT_OEC',
8069               p_token1       => 'line',
8070               p_token1_value => l_lne.name);
8071              -- notify caller of an error
8072             x_return_status := Okl_Api.G_RET_STS_ERROR;
8073       END IF;
8074       --Bug# 4631549
8075       If ( l_lne.TRADEIN_AMOUNT > l_OEC) Then
8076       --IF ( l_lne.TRADEIN_AMOUNT > l_lne.OEC) THEN
8077             Okl_Api.set_message(
8078               p_app_name     => G_APP_NAME,
8079               p_msg_name     => 'OKL_QA_TRADN_LT_CAP',
8080               p_token1       => 'line',
8081               p_token1_value => l_lne.name);
8082             x_return_status := Okl_Api.G_RET_STS_ERROR;
8083       END IF;
8084 
8085       IF (( UPPER(l_lne.residual_code) = 'NONE') AND (l_lne.residual_grnty_amount IS NOT NULL)) THEN
8086             Okl_Api.set_message(
8087               p_app_name     => G_APP_NAME,
8088               p_msg_name     => 'OKL_QA_NO_RESIDUAL_GRNTY',
8089               p_token1       => 'line',
8090               p_token1_value => l_lne.name);
8091             x_return_status := Okl_Api.G_RET_STS_ERROR;
8092       END IF;
8093 
8094       IF ((INSTR( l_hdr.DEAL_TYPE, 'OP' )>0) AND ( l_lne.RVI_PREMIUM IS NOT NULL)) THEN
8095             Okl_Api.set_message(
8096               p_app_name     => G_APP_NAME,
8097               p_msg_name     => 'OKL_QA_OP_NORVINSU',
8098               p_token1       => 'line',
8099               p_token1_value => l_lne.name);
8100             x_return_status := Okl_Api.G_RET_STS_ERROR;
8101       END IF;
8102 
8103       i := 0;
8104       IF ( l_structure > 0 ) THEN
8105           FOR l_rl_rec1 IN l_rl_csr1 ( 'LALEVL', 'LASLL', TO_NUMBER(p_chr_id), l_lne.id )
8106           LOOP
8107               IF( l_rl_rec1.rule_information2 IS NOT NULL) THEN
8108                   i := i + 1;
8109               END IF;
8110           END LOOP;
8111           IF (i > 1) THEN
8112             Okl_Api.set_message(
8113               p_app_name     => G_APP_NAME,
8114               p_msg_name     => 'OKL_QA_GT_ONE_PMT',
8115               p_token1       => 'line',
8116               p_token1_value => l_lne.name);
8117             x_return_status := Okl_Api.G_RET_STS_ERROR;
8118           END IF;
8119       END IF;
8120 
8121       OPEN asst_qty_csr(FinAsstId => l_lne.id);
8122       FETCH asst_qty_csr INTO l_asst;
8123       CLOSE asst_qty_csr;
8124 
8125       IF ((INSTR( l_hdr.DEAL_TYPE, 'OP' )>0) OR
8126           (INSTR( l_hdr.DEAL_TYPE, 'DF' )>0)) OR
8127           (l_hdr.DEAL_TYPE = 'LEASEST')  THEN
8128 
8129           OPEN  l_txl_csr(l_asst.fa_id);
8130           FETCH l_txl_csr INTO l_txl;
8131           IF l_txl_csr%NOTFOUND THEN
8132               CLOSE l_txl_csr;
8133               Okl_Api.set_message(
8134                       p_app_name     => G_APP_NAME,
8135                       p_msg_name     => 'OKL_QA_NO_DEPRECIATION',
8136                       p_token1       => 'line',
8137                       p_token1_value => l_lne.name);
8138               x_return_status := Okl_Api.G_RET_STS_ERROR;
8139               RAISE G_EXCEPTION_HALT_VALIDATION;
8140           END IF;
8141           CLOSE l_txl_csr;
8142 
8143           IF( l_txl.fa_location_id IS NULL ) THEN
8144               Okl_Api.set_message(
8145                   p_app_name     => G_APP_NAME,
8146                   p_msg_name     => 'OKL_QA_NO_FA_LOCATION',
8147                   p_token1       => 'line',
8148                   p_token1_value => l_lne.name);
8149               x_return_status := Okl_Api.G_RET_STS_ERROR;
8150           END IF;
8151 
8152           OPEN  l_txd_csr(l_asst.fa_id);
8153           FETCH l_txd_csr INTO l_txd;
8154           IF l_txd_csr%NOTFOUND THEN
8155               CLOSE l_txd_csr;
8156               Okl_Api.set_message(
8157                       p_app_name     => G_APP_NAME,
8158                       p_msg_name     => 'OKL_QA_NO_TAX',
8159                       p_token1       => 'line',
8160                       p_token1_value => l_lne.name);
8161               x_return_status := Okl_Api.G_RET_STS_ERROR;
8162               RAISE G_EXCEPTION_HALT_VALIDATION;
8163           END IF;
8164           CLOSE l_txd_csr;
8165 
8166 --|start   28-Oct-2008 cklee Fixed Bug 7492324                                      |
8167 
8168           IF((l_txl.life_in_months IS NULL AND l_txl.deprn_rate IS NULL)OR
8169              (l_txl.deprn_method IS NULL)OR(l_txl.in_service_date IS NULL)OR
8170              ((nvl(l_txl.salvage_value,0) IS NULL)AND(nvl(l_txl.percent_salvage_value,0) IS NULL))OR(l_txl.depreciation_cost IS NULL))THEN
8171 --|end   28-Oct-2008 cklee Fixed Bug 7492324                                      |
8172 
8173               Okl_Api.set_message(
8174                   p_app_name     => G_APP_NAME,
8175                   p_msg_name     => 'OKL_QA_NO_DEPRECIATION',
8176                   p_token1       => 'line',
8177                   p_token1_value => l_lne.name);
8178               x_return_status := Okl_Api.G_RET_STS_ERROR;
8179           ELSIF((l_txd.cost IS NULL)OR(l_txd.deprn_method_tax IS NULL))THEN
8180               Okl_Api.set_message(
8181                   p_app_name     => G_APP_NAME,
8182                   p_msg_name     => 'OKL_QA_NO_TAX',
8183                   p_token1       => 'line',
8184                   p_token1_value => l_lne.name);
8185               x_return_status := Okl_Api.G_RET_STS_ERROR;
8186 
8187 /*   made a separate process check_tax_book_cost()
8188 
8189           ElsIf(l_txd.cost < l_txl.depreciation_cost)Then
8190               OKL_API.set_message(
8191                   p_app_name     => G_APP_NAME,
8192                   p_msg_name     => 'OKL_QA_BASISPCNT_GT_100',
8193                   p_token1       => 'line',
8194                   p_token1_value => l_lne.name);
8195               x_return_status := OKL_API.G_RET_STS_ERROR;
8196 */
8197               IF(l_hdr.term > ( 0.75*l_txl.life_in_months))THEN
8198                   Okl_Api.set_message(
8199                       p_app_name     => G_APP_NAME,
8200                       p_msg_name     => 'OKL_QA_OP_TERM_LIM',
8201                       p_token1       => 'line',
8202                       p_token1_value => l_lne.name);
8203                   x_return_status := Okl_Api.G_RET_STS_ERROR;
8204               END IF;
8205           END IF;
8206 
8207           --
8208           -- Check for Tax Book of same type Bug# 3066346
8209           --
8210           FOR l_txd_rec1 IN txd_csr1 (l_asst.fa_id)
8211           LOOP
8212              IF (l_txd_rec1.book_count > 1) THEN
8213               Okl_Api.set_message(
8214                   p_app_name     => G_APP_NAME,
8215                   p_msg_name     => 'OKL_QA_MULTI_TAX_BOOK',
8216                   p_token1       => 'ASSET_NUM',
8217                   p_token1_value => l_lne.name,
8218                   p_token2       => 'BOOK_TYPE',
8219                   p_token2_value => l_txd_rec1.book_type);
8220               x_return_status := Okl_Api.G_RET_STS_ERROR;
8221 
8222              END IF;
8223           END LOOP;
8224 
8225           --------------
8226           --Bug# 7131806
8227           --------------
8228           l_valid_corpbook := '?';
8229           OPEN l_corpbook_csr(p_book_type_code => l_txl.corporate_book);
8230           FETCH l_corpbook_csr INTO l_valid_corpbook;
8231           CLOSE l_corpbook_csr;
8232 
8233           IF l_valid_corpbook = '?' THEN
8234              Okl_Api.set_message(
8235                   p_app_name     => G_APP_NAME,
8236                   p_msg_name     => 'OKL_QA_INVALID_CORP_BOOK',
8237                   p_token1       => 'ASSET_NUMBER',
8238                   p_token1_value => l_lne.name);
8239               x_return_status := Okl_Api.G_RET_STS_ERROR;
8240           END IF;
8241 
8242           IF (l_txl.corporate_book <> l_system_corp_book) THEN
8243              Okl_Api.set_message(
8244                   p_app_name     => G_APP_NAME,
8245                   p_msg_name     => 'OKL_QA_CORP_MISMATCH'); -- MGAAP 7263041
8246               x_return_status := Okl_Api.G_RET_STS_ERROR;
8247           END IF;
8248 
8249           --------------
8250           --Bug# 4103361
8251           --------------
8252           --check asset category book combination for corporate book
8253           l_valid_bk_cat := '?';
8254           OPEN l_bk_cat_csr(p_cat_id         => l_txl.depreciation_id,
8255                             p_book_type_code => l_txl.corporate_book);
8256           FETCH l_bk_cat_csr INTO l_valid_bk_cat;
8257           IF l_bk_cat_csr%NOTFOUND THEN
8258               NULL;
8259           END IF;
8260           CLOSE l_bk_cat_csr;
8261 
8262           IF l_valid_bk_cat = '?' THEN
8263               --get asset category name
8264               OPEN l_fa_cat_csr(p_cat_id => l_txl.depreciation_id);
8265               FETCH l_fa_cat_csr INTO l_fa_cat_name;
8266               IF l_fa_cat_csr%NOTFOUND THEN
8267                  NULL;
8268               END IF;
8269               CLOSE l_fa_cat_csr;
8270 
8271               Okl_Api.set_message(
8272                   p_app_name     => G_APP_NAME,
8273                   p_msg_name     => 'OKL_QA_INVALID_FA_BOOK_CAT',
8274                   p_token1       => 'FA_CATEGORY',
8275                   p_token1_value => l_fa_cat_name,
8276                   p_token2       => 'FA_BOOK',
8277                   p_token2_value => l_txl.corporate_book,
8278                   p_token3       => 'line',
8279                   p_token3_value => l_lne.name);
8280               x_return_status := Okl_Api.G_RET_STS_ERROR;
8281            END IF;
8282 
8283            --check asset category-book combination for tax books
8284            FOR l_txd_rec IN l_txd_csr(kleid => l_asst.fa_id)
8285            LOOP
8286                l_valid_bk_cat := '?';
8287                OPEN l_bk_cat_csr(p_cat_id         => l_txl.depreciation_id,
8288                                  p_book_type_code => l_txd_rec.tax_book);
8289                FETCH l_bk_cat_csr INTO l_valid_bk_cat;
8290                IF l_bk_cat_csr%NOTFOUND THEN
8291                    NULL;
8292                END IF;
8293                CLOSE l_bk_cat_csr;
8294 
8295                IF l_valid_bk_cat = '?' THEN
8296                --get asset category name
8297                    OPEN l_fa_cat_csr(p_cat_id => l_txl.depreciation_id);
8298                    FETCH l_fa_cat_csr INTO l_fa_cat_name;
8299                    IF l_fa_cat_csr%NOTFOUND THEN
8300                        NULL;
8301                    END IF;
8302                    CLOSE l_fa_cat_csr;
8303 
8304                    Okl_Api.set_message(
8305                       p_app_name     => G_APP_NAME,
8306                       p_msg_name     => 'OKL_QA_INVALID_FA_BOOK_CAT',
8307                       p_token1       => 'FA_CATEGORY',
8308                       p_token1_value => l_fa_cat_name,
8309                       p_token2       => 'FA_BOOK',
8310                       p_token2_value => l_txd_rec.tax_book,
8311                       p_token3       => 'line',
8312                       p_token3_value => l_lne.name);
8313                    x_return_status := Okl_Api.G_RET_STS_ERROR;
8314                 END IF;
8315            END LOOP;
8316           --------------
8317           --Bug# 4103361
8318           --------------
8319 
8320       END IF;
8321 
8322 
8323 
8324       IF((INSTR( l_hdr.DEAL_TYPE, 'LOAN' )>0) AND (l_hdr.report_pdt_id = -1)) THEN
8325 
8326           OPEN  l_txl_csr(l_asst.fa_id);
8327           FETCH l_txl_csr INTO l_txl;
8328           CLOSE l_txl_csr;
8329 
8330           IF((l_lne.RESIDUAL_VALUE > 0)OR
8331              (l_txl.salvage_value > 0)OR
8332              (l_txl.percent_salvage_value > 0)) THEN
8333 
8334               Okl_Api.set_message(
8335                   p_app_name     => G_APP_NAME,
8336                   p_msg_name     => 'OKL_QA_LNCTRT_NORVSV',
8337                   p_token1       => 'line',
8338                   p_token1_value => l_lne.name);
8339               x_return_status := Okl_Api.G_RET_STS_ERROR;
8340 
8341           END IF;
8342 
8343           IF( l_txl.fa_location_id IS NOT NULL ) THEN
8344               Okl_Api.set_message(
8345                   p_app_name     => G_APP_NAME,
8346                   p_msg_name     => 'OKL_QA_LOAN_FA_LOCATION',
8347                   p_token1       => 'line',
8348                   p_token1_value => l_lne.name);
8349               x_return_status := Okl_Api.G_RET_STS_ERROR;
8350           END IF;
8351 
8352       END IF;
8353 
8354       OPEN  supp_csr(l_asst.fa_id);
8355       FETCH supp_csr INTO l_supp_rec;
8356       IF supp_csr%NOTFOUND THEN
8357           NULL;
8358       -- bug 5034519. changed from contract start date to asset start date
8359       -- also changed message from OKL_QA_VNDRDATES_GT_STARTDATE
8360       --ELSIF( l_supp_rec.date_invoiced > l_hdr.start_date ) THEN
8361       ELSIF( l_supp_rec.date_invoiced > l_lne.start_date ) THEN
8362           Okl_Api.set_message(
8363               p_app_name     => G_APP_NAME,
8364               --p_msg_name     => 'OKL_QA_VNDRDATES_GT_STARTDATE',
8365               p_msg_name     => 'OKL_QA_INV_SUPPDATE',
8366               p_token1       => 'line',
8367               p_token1_value => l_lne.name);
8368           x_return_status := Okl_Api.G_RET_STS_ERROR;
8369       END IF;
8370       CLOSE supp_csr;
8371 
8372       /*Bug#3877032
8373       *OPEN  l_hdrrl_csr('LATOWN', 'LATOWN', TO_NUMBER(p_chr_id));
8374       *FETCH l_hdrrl_csr into l_hdrrl_rec;
8375       *CLOSE l_hdrrl_csr;
8376       */
8377 
8378       /*Bug#4186455
8379       *If (( l_lne.residual_value < (0.2 * l_lne.OEC)) AND (l_tax_owner = 'LESSOR')) then
8380       *--If (( l_lne.residual_value < (0.2 * l_lne.OEC)) AND (l_hdrrl_rec.RULE_INFORMATION1 = 'LESSOR')) then
8381       *      OKL_API.set_message(
8382       *        p_app_name     => G_APP_NAME,
8383       *        p_msg_name     => 'OKL_QA_RV_OEC_TOWN',
8384       *        p_token1       => 'line',
8385       *        p_token1_value => l_lne.name);
8386       *      x_return_status := OKL_API.G_RET_STS_ERROR;
8387       *END IF;
8388       */
8389 
8390       OPEN  l_rl_csr1( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), l_lne.id );
8391       FETCH l_rl_csr1 INTO l_rl_rec1;
8392       IF l_rl_csr1%NOTFOUND THEN
8393               Okl_Api.set_message(
8394                 p_app_name     => G_APP_NAME,
8395                 p_msg_name     => 'OKL_QA_NO_PAYMENTS',
8396                 p_token1       => 'line',
8397                 p_token1_value => l_lne.name);
8398               x_return_status := Okl_Api.G_RET_STS_ERROR;
8399       END IF;
8400       CLOSE l_rl_csr1;
8401 
8402 
8403     END LOOP;
8404 
8405     FOR l_lne IN l_lne_csr('USAGE', p_chr_id)
8406     LOOP
8407 
8408         i := 0;
8409         l_ib_qty   := 0;
8410         FOR l_itm IN l_itms_csr('LINK_USAGE_ASSET', l_lne.id, p_chr_id)
8411         LOOP
8412             OPEN asst_qty_csr(FinAsstId => l_itm.FinAssetId);
8413             FETCH asst_qty_csr INTO l_asst;
8414             IF asst_qty_csr%NOTFOUND THEN
8415                CLOSE asst_qty_csr;
8416                RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
8417             ELSE
8418                 OPEN ib_qty_csr(FinAsstId => l_itm.FinAssetId);
8419                 FETCH ib_qty_csr INTO l_ib_qty;
8420                 IF ib_qty_csr%NOTFOUND THEN
8421                     CLOSE ib_qty_csr;
8422                     RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
8423                 END IF;
8424                 CLOSE ib_qty_csr;
8425             END IF;
8426             CLOSE asst_qty_csr;
8427             i := i + 1;
8428 
8429             IF l_asst.number_of_items <> l_ib_qty THEN
8430               Okl_Api.set_message(
8431                 p_app_name     => G_APP_NAME,
8432                 p_msg_name     => 'OKL_QA_USAGE_1ITM',
8433                 p_token1       => 'usage line',
8434                 p_token1_value => TO_CHAR(i));
8435               x_return_status := Okl_Api.G_RET_STS_ERROR;
8436             END IF;
8437 
8438         END LOOP;
8439 
8440 
8441         IF ( i = 0 ) THEN
8442               Okl_Api.set_message(
8443                 p_app_name     => G_APP_NAME,
8444                 p_msg_name     => 'OKL_QA_UBB_1ASSET');
8445               x_return_status := Okl_Api.G_RET_STS_ERROR;
8446         END IF;
8447 
8448     END LOOP;
8449 
8450 
8451     --
8452     -- Passthrough validation for FEE and Service line
8453     -- Bug# dedey
8454     --
8455     FOR l_lne IN l_kle_csr('FEE', p_chr_id)
8456     LOOP
8457 
8458        -- Bug# 4350255
8459        FOR pth_dtl_rec IN  pth_dtl_csr(p_chr_id => p_chr_id,
8460                                        p_cle_id => l_lne.id)
8461        LOOP
8462 
8463           l_site_valid := '?';
8464           OPEN passthru_site_csr (pth_dtl_rec.vendor_id,
8465                                   pth_dtl_rec.pay_site_id);
8466           FETCH passthru_site_csr INTO l_site_valid;
8467           CLOSE passthru_site_csr;
8468 
8469           IF (l_site_valid <> 'Y') THEN
8470 
8471              OPEN vendor_csr(p_vendor_id => pth_dtl_rec.vendor_id);
8472              FETCH vendor_csr INTO l_vendor_name;
8473              CLOSE vendor_csr;
8474 
8475              IF (pth_dtl_rec.passthru_term = 'BASE') THEN
8476 
8477                Okl_Api.set_message(
8478                   p_app_name     => G_APP_NAME,
8479                   p_msg_name     => 'OKL_QA_INVLD_BASE_PTH_SITE',
8480                   p_token1       => 'LINE',
8481                   p_token1_value => l_lne.line_style||'/'||l_lne.name,
8482                   p_token2       => 'VENDOR',
8483                   p_token2_value => l_vendor_name);
8484                x_return_status := Okl_Api.G_RET_STS_ERROR;
8485 
8486              ELSIF (pth_dtl_rec.passthru_term = 'EVERGREEN') THEN
8487 
8488                Okl_Api.set_message(
8489                   p_app_name     => G_APP_NAME,
8490                   p_msg_name     => 'OKL_QA_INVLD_EVGN_PTH_SITE',
8491                   p_token1       => 'LINE',
8492                   p_token1_value => l_lne.line_style||'/'||l_lne.name,
8493                   p_token2       => 'VENDOR',
8494                   p_token2_value => l_vendor_name);
8495                x_return_status := Okl_Api.G_RET_STS_ERROR;
8496 
8497              END IF;
8498           END IF;
8499        END LOOP;
8500 
8501     END LOOP; -- FEE line
8502 
8503     FOR l_lne IN l_kle_csr('SOLD_SERVICE', p_chr_id)
8504     LOOP
8505 
8506        -- Bug# 4350255
8507        -- Vendor must be defined for Service line
8508        l_vendor_id := NULL;
8509        OPEN party_csr (p_chr_id,
8510                        l_lne.id);
8511        FETCH party_csr INTO l_vendor_id;
8512        CLOSE party_csr;
8513 
8514        IF (l_vendor_id IS NULL) THEN
8515          Okl_Api.set_message(
8516                              G_APP_NAME,
8517                              'OKL_QA_SERVICE_VENDOR',
8518                              'LINE',
8519                              l_lne.name
8520                             );
8521          x_return_status := Okl_Api.G_RET_STS_ERROR;
8522        END IF;
8523 
8524        -- Payments are mandatory for Service Line if
8525        -- Passthrough has been defined
8526        l_pth_present := '?';
8527        FOR pth_hdr_rec IN pth_hdr_csr( p_chr_id => TO_NUMBER(p_chr_id),
8528                                        p_cle_id => l_lne.id)
8529        LOOP
8530          l_pth_present := 'Y';
8531        END LOOP;
8532 
8533        IF (l_pth_present = 'Y') THEN
8534 
8535 	-- Bug 5216135 : kbbhavsa : 29-May-06 : start
8536        	 OPEN  l_kle_link_csr( 'LINK_SERV_ASSET', p_chr_id, l_lne.id );
8537          FETCH l_kle_link_csr INTO l_link_cle_id;
8538          -- check if service line is linked to Aseet or not
8539          -- if linked then check payment for linked service asset sub line
8540          -- and if not linked then check payment at service top line
8541     	 IF l_kle_link_csr%FOUND THEN
8542 	       OPEN  l_rl_csr1( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), l_link_cle_id );
8543 	     ELSE
8544            OPEN  l_rl_csr1( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), l_lne.id );
8545          END IF;
8546            CLOSE l_kle_link_csr;
8547         -- Bug 5216135 : kbbhavsa : 29-May-06 : end
8548 
8549          FETCH l_rl_csr1 INTO l_rl_rec1;
8550 
8551          IF l_rl_csr1%NOTFOUND THEN
8552 	 -- Bug 5216135 : kbbhavsa : 29-May-06 : start
8553             IF l_link_cle_id IS NULL THEN
8554               -- service not linked to asset, and payment not found at top service line
8555               Okl_Api.set_message(
8556                 p_app_name     => G_APP_NAME,
8557                 p_msg_name     => 'OKL_QA_PTH_NO_PAYMENTS',
8558                 p_token1       => 'LINE',
8559                 p_token1_value => l_lne.name);
8560                 x_return_status := Okl_Api.G_RET_STS_ERROR;
8561             ELSE
8562               -- service linked to asset, and payment not found at linked service asset sub line
8563               IF l_rl_csr1%ISOPEN THEN
8564                 CLOSE l_rl_csr1;
8565               END IF;
8566               -- service linked to asset, now checking payment at top service line
8567               OPEN  l_rl_csr1( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), l_lne.id );
8568               FETCH l_rl_csr1 INTO l_rl_rec1;
8569                 IF l_rl_csr1%NOTFOUND THEN
8570                   -- service linked to asset, and payment not found at top service line
8571                    Okl_Api.set_message(
8572                         p_app_name     => G_APP_NAME,
8573                         p_msg_name     => 'OKL_QA_PTH_NO_PAYMENTS',
8574                         p_token1       => 'LINE',
8575                         p_token1_value => l_lne.name);
8576                         x_return_status := Okl_Api.G_RET_STS_ERROR;
8577                 END IF;
8578             END IF;
8579             -- Bug 5216135 : kbbhavsa : 29-May-06 : end
8580           END IF;
8581         CLOSE l_rl_csr1;
8582        END IF;
8583 
8584        -- Bug# 4350255
8585        FOR pth_dtl_rec IN  pth_dtl_csr(p_chr_id => p_chr_id,
8586                                        p_cle_id => l_lne.id)
8587        LOOP
8588 
8589           l_site_valid := '?';
8590           OPEN passthru_site_csr (pth_dtl_rec.vendor_id,
8591                                   pth_dtl_rec.pay_site_id);
8592           FETCH passthru_site_csr INTO l_site_valid;
8593           CLOSE passthru_site_csr;
8594 
8595           IF (l_site_valid <> 'Y') THEN
8596              OPEN vendor_csr(p_vendor_id => pth_dtl_rec.vendor_id);
8597              FETCH vendor_csr INTO l_vendor_name;
8598              CLOSE vendor_csr;
8599 
8600              IF (pth_dtl_rec.passthru_term = 'BASE') THEN
8601 
8602                Okl_Api.set_message(
8603                   p_app_name     => G_APP_NAME,
8604                   p_msg_name     => 'OKL_QA_INVLD_BASE_PTH_SITE',
8605                   p_token1       => 'LINE',
8606                   p_token1_value => l_lne.line_style||'/'||l_lne.name,
8607                   p_token2       => 'VENDOR',
8608                   p_token2_value => l_vendor_name);
8609                x_return_status := Okl_Api.G_RET_STS_ERROR;
8610 
8611              ELSIF (pth_dtl_rec.passthru_term = 'EVERGREEN') THEN
8612 
8613                Okl_Api.set_message(
8614                   p_app_name     => G_APP_NAME,
8615                   p_msg_name     => 'OKL_QA_INVLD_EVGN_PTH_SITE',
8616                   p_token1       => 'LINE',
8617                   p_token1_value => l_lne.line_style||'/'||l_lne.name,
8618                   p_token2       => 'VENDOR',
8619                   p_token2_value => l_vendor_name);
8620                x_return_status := Okl_Api.G_RET_STS_ERROR;
8621 
8622              END IF;
8623           END IF;
8624        END LOOP;
8625 
8626     END LOOP; -- SERVICE line
8627 
8628     --
8629     -- Passthrough validation for ASSET line
8630     -- Bug# 4350255
8631     --
8632     FOR l_lne IN l_kle_csr('FREE_FORM1', p_chr_id)
8633     LOOP
8634 
8635        -- Bug# 4350255
8636        FOR pth_dtl_rec IN  pth_dtl_csr(p_chr_id => p_chr_id,
8637                                        p_cle_id => l_lne.id)
8638        LOOP
8639 
8640           l_site_valid := '?';
8641           OPEN passthru_site_csr (pth_dtl_rec.vendor_id,
8642                                   pth_dtl_rec.pay_site_id);
8643           FETCH passthru_site_csr INTO l_site_valid;
8644           CLOSE passthru_site_csr;
8645 
8646           IF (l_site_valid <> 'Y') THEN
8647              OPEN vendor_csr(p_vendor_id => pth_dtl_rec.vendor_id);
8648              FETCH vendor_csr INTO l_vendor_name;
8649              CLOSE vendor_csr;
8650 
8651              IF (pth_dtl_rec.passthru_term = 'BASE') THEN
8652 
8653                Okl_Api.set_message(
8654                   p_app_name     => G_APP_NAME,
8655                   p_msg_name     => 'OKL_QA_INVLD_BASE_PTH_SITE',
8656                   p_token1       => 'LINE',
8657                   p_token1_value => l_lne.line_style||'/'||l_lne.name,
8658                   p_token2       => 'VENDOR',
8659                   p_token2_value => l_vendor_name);
8660                x_return_status := Okl_Api.G_RET_STS_ERROR;
8661 
8662              ELSIF (pth_dtl_rec.passthru_term = 'EVERGREEN') THEN
8663 
8664                Okl_Api.set_message(
8665                   p_app_name     => G_APP_NAME,
8666                   p_msg_name     => 'OKL_QA_INVLD_EVGN_PTH_SITE',
8667                   p_token1       => 'LINE',
8668                   p_token1_value => l_lne.line_style||'/'||l_lne.name,
8669                   p_token2       => 'VENDOR',
8670                   p_token2_value => l_vendor_name);
8671                x_return_status := Okl_Api.G_RET_STS_ERROR;
8672 
8673              END IF;
8674           END IF;
8675        END LOOP;
8676 
8677     END LOOP; -- ASSET line
8678 
8679     -- Bug# 3064121
8680     FOR line_amt_rec IN line_amt_csr (p_chr_id,
8681                                       'SOLD_SERVICE')
8682     LOOP
8683        l_tot_sub_line_amt := 0;
8684        OPEN sub_line_amt_csr (line_amt_rec.id);
8685        FETCH sub_line_amt_csr INTO l_tot_sub_line_amt;
8686        CLOSE sub_line_amt_csr;
8687 
8688        IF (l_tot_sub_line_amt <> line_amt_rec.amount) THEN
8689           Okl_Api.set_message(
8690                               G_APP_NAME,
8691                               'OKL_QA_SRV_AMT_MISMATCH',
8692                               'LINE_TYPE',
8693                               'SERVICE',
8694                               'LINE_NUMBER',
8695                               line_amt_rec.line_number
8696                              );
8697           x_return_status := Okl_Api.G_RET_STS_ERROR;
8698        END IF;
8699 
8700     END LOOP;
8701     -- Bug# 3064121
8702 
8703     --
8704     -- Check payment start and end date
8705     --
8706 
8707     check_payment_period(
8708                          p_chr_id        => p_chr_id,
8709                          x_return_status => lx_return_status
8710                         );
8711 
8712     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8713        x_return_status := lx_return_status;
8714     END IF;
8715 
8716     --
8717     -- Bug# 2901495
8718     -- Check credit lines
8719     --
8720     Okl_La_Validation_Util_Pvt.validate_crdtln_err (
8721                          p_api_version    => 1.0,
8722                          p_init_msg_list  => Okl_Api.G_FALSE,
8723                          x_return_status  => lx_return_status,
8724                          x_msg_count      => x_msg_count,
8725                          x_msg_data       => x_msg_data,
8726                          p_chr_id         => p_chr_id
8727                         );
8728 
8729     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8730        x_return_status := lx_return_status;
8731     END IF;
8732 
8733     -- Bug# 4350255
8734     -- Modified the procedure check_fee_service_pth to
8735     -- include validations for Asset line Passthrough
8736     --
8737     -- Check FEE, SERVICE, ASSET passthrough rule
8738     --
8739     check_fee_service_ast_pth(
8740                          p_chr_id        => p_chr_id,
8741                          x_return_status => lx_return_status
8742                         );
8743 
8744     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8745        x_return_status := lx_return_status;
8746     END IF;
8747 
8748     --
8749     -- Check LASLL for stub and actual payments
8750     --
8751     check_stub_payment(
8752                        p_chr_id        => p_chr_id,
8753                        x_return_status => lx_return_status
8754                       );
8755 
8756     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8757        x_return_status := lx_return_status;
8758     END IF;
8759 
8760     --
8761     -- Check for loan revolving contract
8762     --
8763     check_lessee_as_vendor(
8764                            p_chr_id        => p_chr_id,
8765                            x_return_status => lx_return_status
8766                           );
8767 
8768     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8769        x_return_status := lx_return_status;
8770     END IF;
8771 
8772     --
8773     -- Check for serialized item
8774     --
8775 
8776     check_serial_asset(
8777                        p_chr_id        => p_chr_id,
8778                        x_return_status => lx_return_status
8779                       );
8780 
8781     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8782        x_return_status := lx_return_status;
8783     END IF;
8784 
8785     -- bug 6760186 start
8786     -- Check for ib_location
8787     --
8788 
8789     check_ib_location (
8790                        p_chr_id        => p_chr_id,
8791                        x_return_status => lx_return_status
8792                       );
8793 
8794     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8795        x_return_status := lx_return_status;
8796     END IF;
8797     -- bug 6760186 end
8798 
8799     /* Manu 30-Aug-2004 START
8800        Call to Rollover Quotes QA Validation checks. */
8801 
8802     check_rolloverQuotes(
8803                         p_chr_id        => p_chr_id,
8804                         x_return_status => lx_return_status
8805                         );
8806 
8807     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8808        x_return_status := lx_return_status;
8809     END IF;
8810 
8811     /* Manu 30-Aug-2004 END */
8812 
8813     --Bug# 4996899
8814     check_financed_fees(
8815                         p_chr_id        => p_chr_id,
8816                         x_return_status => lx_return_status
8817                         );
8818 
8819     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8820        x_return_status := lx_return_status;
8821     END IF;
8822     --Bug# 4996899
8823 
8824     check_stream_template(
8825                         p_chr_id        => p_chr_id,
8826                         x_return_status => lx_return_status
8827                         );
8828 
8829     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8830        x_return_status := lx_return_status;
8831     END IF;
8832 
8833      --Bug#4622438
8834      check_product_status(
8835                         p_chr_id        => p_chr_id,
8836                         x_return_status => lx_return_status
8837                         );
8838 
8839     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8840        x_return_status := lx_return_status;
8841     END IF;
8842 
8843     --Bug#4373029
8844     Okl_La_Sales_Tax_Pvt.check_sales_tax(
8845                                          p_chr_id        => p_chr_id,
8846                                          x_return_status => lx_return_status
8847                                         );
8848     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8849        x_return_status := lx_return_status;
8850     END IF;
8851 
8852 --akrangan  bug 5362977 starts
8853       check_service_contracts(
8854          p_chr_id        => p_chr_id,
8855          x_return_status => lx_return_status
8856          );
8857 
8858        IF (lx_return_status <> OKL_API.G_RET_STS_SUCCESS) THEN
8859          x_return_status := lx_return_status;
8860        END IF;
8861 --akrangan  bug 5362977 ends
8862 
8863     --Murthy
8864     check_sales_quote(
8865                     p_chr_id        => p_chr_id,
8866                     x_return_status => lx_return_status
8867                    );
8868     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8869        x_return_status := lx_return_status;
8870     END IF;
8871 
8872   IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
8873       Okl_Api.set_message(
8874         p_app_name      => G_APP_NAME,
8875         p_msg_name      => G_QA_SUCCESS);
8876   END IF;
8877 
8878     --Smereddy Bug#7271259
8879     check_loan_payment(
8880                     p_chr_id        => p_chr_id,
8881                     x_return_status => lx_return_status
8882                    );
8883     IF (lx_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
8884        x_return_status := lx_return_status;
8885     END IF;
8886 
8887   IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
8888       Okl_Api.set_message(
8889         p_app_name      => G_APP_NAME,
8890         p_msg_name      => G_QA_SUCCESS);
8891   END IF;
8892 
8893   EXCEPTION
8894 
8895   WHEN G_EXCEPTION_HALT_VALIDATION THEN
8896     -- no processing necessary; validation can continue with next column
8897     IF l_lne_csr%ISOPEN THEN
8898       CLOSE l_lne_csr;
8899     END IF;
8900     IF l_hdr_csr%ISOPEN THEN
8901       CLOSE l_hdr_csr;
8902     END IF;
8903     IF l_txl_csr%ISOPEN THEN
8904       CLOSE l_txl_csr;
8905     END IF;
8906     NULL;
8907   WHEN OTHERS THEN
8908     -- store SQL error message on message stack
8909     Okl_Api.SET_MESSAGE(
8910       p_app_name        => G_APP_NAME,
8911       p_msg_name        => G_UNEXPECTED_ERROR,
8912       p_token1	        => G_SQLCODE_TOKEN,
8913       p_token1_value    => SQLCODE,
8914       p_token2          => G_SQLERRM_TOKEN,
8915       p_token2_value    => SQLERRM);
8916     -- notify caller of an error as UNEXPETED error
8917     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
8918     -- verify that cursor was closed
8919     IF l_lne_csr%ISOPEN THEN
8920       CLOSE l_lne_csr;
8921     END IF;
8922     IF l_hdr_csr%ISOPEN THEN
8923       CLOSE l_hdr_csr;
8924     END IF;
8925     IF l_txl_csr%ISOPEN THEN
8926       CLOSE l_txl_csr;
8927     END IF;
8928 
8929   END check_func_constrs_4new;
8930 
8931   -- Start of comments
8932   --
8933   -- Procedure Name  : check_purchase_option
8934   -- Description     : Generates warning for validation of automatically process fixed
8935   --                   purchase option.
8936   -- Business Rules  :
8937   -- Parameters      :
8938   -- Version         : 1.0
8939   -- End of comments
8940 
8941   PROCEDURE check_purchase_option(
8942     x_return_status            OUT NOCOPY VARCHAR2,
8943     p_chr_id                   IN  NUMBER
8944   ) IS
8945 
8946     --l_hdr      l_hdr_csr%ROWTYPE;
8947     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
8948     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
8949     l_tax_owner okc_rules_b.RULE_INFORMATION1%TYPE;
8950     l_purchase_opt_type okc_rules_b.RULE_INFORMATION11%TYPE;
8951     l_contract_residual_value NUMBER;
8952     l_msg_count NUMBER;
8953     l_msg_data VARCHAR2(2000);
8954 
8955     CURSOR l_asset_csr IS
8956     SELECT cle.id,
8957            name,
8958            kle.residual_value
8959     FROM   okc_k_lines_v cle,
8960            okl_k_lines kle,
8961            okc_line_styles_b sty,
8962            okc_statuses_b sts
8963     WHERE  cle.lse_id = sty.id
8964     AND    cle.dnz_chr_id = p_chr_id
8965     AND    cle.id = kle.id
8966     AND    lty_code = 'FREE_FORM1'
8967     AND    cle.sts_code = sts.code
8968     AND    sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
8969 
8970   BEGIN
8971 
8972     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
8973 
8974     /*
8975     OPEN  l_hdr_csr(p_chr_id);
8976     FETCH l_hdr_csr into l_hdr;
8977     IF l_hdr_csr%NOTFOUND THEN
8978        CLOSE l_hdr_csr;
8979        RAISE G_EXCEPTION_HALT_VALIDATION;
8980     END IF;
8981     CLOSE l_hdr_csr;
8982     */
8983 
8984     OPEN  l_hdrrl_csr('LATOWN', 'LATOWN', TO_NUMBER(p_chr_id));
8985     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
8986     l_tax_owner := l_hdrrl_rec.RULE_INFORMATION1;
8987     CLOSE l_hdrrl_csr;
8988 
8989     -- Bug 5000754: Moved the code later so that RV check is properly done
8990     -- on end of term purchase
8991     /*
8992     OPEN  l_hdrrl_csr('AMTFOC', 'AMBPOC', TO_NUMBER(p_chr_id));
8993     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
8994     IF((l_hdrrl_csr%FOUND) AND (l_hdrrl_rec.RULE_INFORMATION11 IS NOT NULL)) THEN
8995       l_purchase_opt_type := l_hdrrl_rec.RULE_INFORMATION11;
8996     END IF;
8997     CLOSE l_hdrrl_csr;
8998 
8999     IF ((l_purchase_opt_type = '$1BO') AND (l_tax_owner = 'LESSOR')) THEN
9000         Okl_Api.set_message(
9001               p_app_name     => G_APP_NAME,
9002               p_msg_name     => 'OKL_QA_NO_TOWN_1DBO');
9003         x_return_status := Okl_Api.G_RET_STS_ERROR;
9004     END IF;
9005     */
9006 
9007     --Bug#4778020 Tax owner warning message for early termination.
9008     OPEN  l_hdrrl_csr('AMTEOC', 'AMBPOC', TO_NUMBER(p_chr_id));
9009     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9010     IF((l_hdrrl_csr%FOUND) AND (l_hdrrl_rec.RULE_INFORMATION11 IS NOT NULL)) THEN
9011       l_purchase_opt_type := l_hdrrl_rec.RULE_INFORMATION11;
9012     END IF;
9013     CLOSE l_hdrrl_csr;
9014     IF ((l_purchase_opt_type = '$1BO') AND (l_tax_owner = 'LESSOR')) THEN
9015         Okl_Api.set_message(
9016               p_app_name     => G_APP_NAME,
9017               p_msg_name     => 'OKL_QA_NO_TOWN_1DBO');
9018         x_return_status := Okl_Api.G_RET_STS_ERROR;
9019     END IF;
9020 
9021     -- Bug 5000754 : End of term purchase
9022     OPEN  l_hdrrl_csr('AMTFOC', 'AMBPOC', TO_NUMBER(p_chr_id));
9023     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9024     IF((l_hdrrl_csr%FOUND) AND (l_hdrrl_rec.RULE_INFORMATION11 IS NOT NULL)) THEN
9025       l_purchase_opt_type := l_hdrrl_rec.RULE_INFORMATION11;
9026     END IF;
9027     CLOSE l_hdrrl_csr;
9028 
9029     IF ((l_purchase_opt_type = '$1BO') AND (l_tax_owner = 'LESSOR')) THEN
9030         Okl_Api.set_message(
9031               p_app_name     => G_APP_NAME,
9032               p_msg_name     => 'OKL_QA_NO_TOWN_1DBO');
9033         x_return_status := Okl_Api.G_RET_STS_ERROR;
9034     END IF;
9035 
9036     /*OKL_EXECUTE_FORMULA_PUB.EXECUTE(p_api_version   =>1.0
9037                                    ,p_init_msg_list => 'F'
9038                                    ,x_return_status =>l_return_status
9039                                    ,x_msg_count     =>l_msg_count
9040                                    ,x_msg_data      =>l_msg_data
9041                                    ,p_formula_name  =>'CONTRACT_RESIDUAL_VALUE'
9042                                    ,p_contract_id   =>p_chr_id
9043                                    ,x_value         =>l_contract_residual_value);
9044 
9045     IF (l_return_status <> OKL_API.G_RET_STS_SUCCESS) THEN
9046       x_return_status := l_return_status;
9047     END IF;
9048     */
9049 
9050     FOR l_asset_rec IN l_asset_csr
9051     LOOP
9052       IF (l_purchase_opt_type = '$1BO' AND l_asset_rec.residual_value> 1.0) THEN
9053         Okl_Api.set_message(
9054                 p_app_name     => G_APP_NAME,
9055                 p_msg_name     => 'OKL_QA_CNTRCT_RES_VAL_GT1',
9056                 p_token1       => 'ASSET_NUM',
9057                 p_token1_value => l_asset_rec.name);
9058         x_return_status := Okl_Api.G_RET_STS_ERROR;
9059       END IF;
9060     END LOOP;
9061 
9062     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
9063         Okl_Api.set_message(
9064           p_app_name      => G_APP_NAME,
9065           p_msg_name      => G_QA_SUCCESS);
9066     END IF;
9067 
9068   EXCEPTION
9069   WHEN OTHERS THEN
9070     -- store SQL error message on message stack
9071     Okl_Api.SET_MESSAGE(
9072          p_app_name        => G_APP_NAME,
9073          p_msg_name        => G_UNEXPECTED_ERROR,
9074          p_token1	   => G_SQLCODE_TOKEN,
9075          p_token1_value    => SQLCODE,
9076          p_token2          => G_SQLERRM_TOKEN,
9077          p_token2_value    => SQLERRM);
9078 
9079     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
9080 
9081     IF l_hdr_csr%ISOPEN THEN
9082       CLOSE l_hdr_csr;
9083     END IF;
9084 
9085     IF l_hdrrl_csr%ISOPEN THEN
9086       CLOSE l_hdrrl_csr;
9087     END IF;
9088 
9089   END check_purchase_option;
9090 
9091   -- Start of comments
9092   --
9093   -- Procedure Name  : check_rule_constraints
9094   -- Description     :
9095   -- Business Rules  :
9096   -- Parameters      :
9097   -- Version         : 1.0
9098   -- End of comments
9099 
9100   PROCEDURE check_rule_constrs_4new(
9101     x_return_status            OUT NOCOPY VARCHAR2,
9102     p_chr_id                   IN  NUMBER
9103   ) IS
9104 
9105     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
9106     l_dummy VARCHAR2(1) := '?';
9107     l_count NUMBER := 0;
9108     l_row_notfound BOOLEAN;
9109     l_token VARCHAR2(2000);
9110     l_quote_eff_days NUMBER;
9111     l_quote_eff_max_days NUMBER;
9112     l_eot_tolerance_days NUMBER;
9113 
9114 /* Bug 3825314
9115  *
9116  *  Cursor l_synd_csr ( chrId NUMBER ) IS
9117  *  select kl.dnz_chr_id syndId
9118  *  from OKC_K_ITEMS_V ITM,
9119  *       OKC_K_LINES_V KL,
9120  *       OKL_K_HEADERS_FULL_V KHR,
9121  *       OKC_LINE_STYLES_B lse
9122  *  where KL.LSE_ID=lse.id
9123  *     and lse.lty_code='SHARED'
9124  *     AND KL.CHR_ID =KL.DNZ_CHR_ID
9125  *     AND KL.DNZ_CHR_ID = ITM.DNZ_CHR_ID
9126  *     AND ITM.CLE_ID = KL.ID
9127  *     AND to_char(KHR.ID) = ITM.OBJECT1_ID1
9128  *     and khr.id = chrId;
9129  *
9130  *  l_synd_rec l_synd_csr%ROWTYPE;
9131  *
9132  */
9133     CURSOR l_rl_csr( rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
9134                      rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
9135                      chrId OKC_RULE_GROUPS_B.DNZ_CHR_ID%TYPE ) IS
9136         SELECT crl.RULE_INFORMATION1, crl.RULE_INFORMATION2
9137         FROM   OKC_RULE_GROUPS_B crg, OKC_RULES_B crl
9138         WHERE  crl.rgp_id = crg.id
9139            AND crg.RGD_CODE = rgcode
9140            AND crl.RULE_INFORMATION_CATEGORY = rlcat
9141            AND crg.dnz_chr_id = chrId;
9142 
9143     l_hdr      l_hdr_csr%ROWTYPE;
9144 
9145     l_rl l_rl_csr%ROWTYPE;
9146 
9147     TYPE options_rec_type IS RECORD (
9148         purchase_option VARCHAR2(256),
9149         purchase_option_type VARCHAR2(256),
9150         formula_name VARCHAR2(256),
9151         purchase_option_amount NUMBER
9152     );
9153 
9154     TYPE options_tbl_type IS TABLE OF options_rec_type INDEX BY BINARY_INTEGER;
9155 
9156     l_options options_tbl_type;
9157 
9158     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
9159 
9160     cust_site_rec cust_site_csr%ROWTYPE;
9161     cust_rec cust_csr%ROWTYPE;
9162 
9163     CURSOR l_inst_csr( chrId NUMBER ) IS
9164     SELECT inst.object_id1_new
9165     FROM   OKL_TXL_ITM_INSTS inst,
9166            OKL_K_LINES_FULL_V kle,
9167 	   OKC_LINE_STYLES_B lse
9168     WHERE inst.kle_id = kle.id
9169        AND lse.id = kle.lse_id
9170        AND lse.lty_code = 'INST_ITEM'
9171        AND kle.dnz_chr_id = chrId;
9172 
9173     l_inst_rec l_inst_csr%ROWTYPE;
9174 
9175     CURSOR l_shipto_csr( chrId NUMBER ) IS
9176     SELECT inv.shipping_address_id1
9177     FROM   OKL_SUPP_INVOICE_DTLS inv,
9178            OKL_K_LINES_FULL_V kle,
9179 	   OKC_LINE_STYLES_B lse
9180     WHERE inv.cle_id = kle.id
9181        AND lse.id = kle.lse_id
9182        AND lse.lty_code = 'ITEM'
9183        AND kle.dnz_chr_id = chrId;
9184 
9185     l_shipto_rec l_shipto_csr%ROWTYPE;
9186 
9187     CURSOR l_party_uses_csr ( instId NUMBER, ptyId NUMBER, rleCode VARCHAR2 ) IS
9188     SELECT 'Y' isThere
9189     FROM dual
9190     WHERE EXISTS(
9191         SELECT A.party_site_use_id
9192 	FROM   HZ_PARTY_SITE_USES A,
9193 	       HZ_PARTY_SITES     B
9194 	WHERE b.party_site_id = a.party_site_id
9195 	    AND a.party_site_use_id = instId
9196 	    AND a.site_use_type = rleCode
9197 	    AND b.party_id = ptyId);
9198 
9199     l_party_uses_rec l_party_uses_csr%ROWTYPE;
9200 
9201     l_bto_site_use_id NUMBER;
9202     l_cust_acct_id    NUMBER;
9203     l_party_site_id   NUMBER;
9204     l_inst_site_id    NUMBER;
9205     l_shipto_id       NUMBER;
9206 
9207     l_rl1 l_rl_csr1%ROWTYPE;
9208 
9209     i NUMBER;
9210 
9211     fnd_rec fnd_csr%ROWTYPE;
9212 
9213     l_auto_fixed_pur_opt_yn okc_rules_b.RULE_INFORMATION1%TYPE;
9214     l_evergreen_flag okc_rules_b.RULE_INFORMATION1%TYPE;
9215     l_purchase_opt_type okc_rules_b.RULE_INFORMATION11%TYPE;
9216 
9217     l_late_charge_policy OKC_RULES_B.RULE_INFORMATION1%TYPE; -- Bug 4925675
9218     l_rl2 l_rl_csr%ROWTYPE;
9219 /*
9220     CURSOR bill_to_csr (p_cust_acct okx_cust_site_uses_v.cust_account_id%TYPE,
9221                         p_bill_to   okx_cust_site_uses_v.id1%TYPE
9222                        ) IS
9223     SELECT 'Y'
9224     FROM   okx_cust_site_uses_v
9225     WHERE  id1                   = p_bill_to
9226     AND    cust_account_id       = p_cust_acct
9227     AND    site_use_code         = 'BILL_TO'
9228     AND    b_status              = 'A'
9229     AND    cust_acct_site_status = 'A';
9230     --AND    NVL(ORG_ID, -99)      = SYS_CONTEXT('OKC_CONTEXT','ORG_ID');
9231 
9232     --l_cust_acct     okc_rules_b.object1_id1%TYPE;
9233     l_cust_acct     OKC_K_HEADERS_B.CUST_ACCT_ID%TYPE;
9234 
9235     l_bill_to       okc_rules_b.object1_id1%TYPE;
9236     l_bill_to_valid VARCHAR2(1) := 'N';
9237 */
9238 
9239     -- Bug# 8219011
9240     CURSOR pymt_method_csr(p_cust_acct_id   IN NUMBER,
9241                            p_bill_to_id     IN NUMBER,
9242                            p_pymt_method_id IN NUMBER) IS
9243     SELECT 'Y'
9244     FROM  OKX_RECEIPT_METHODS_V
9245     WHERE customer_id = p_cust_acct_id
9246     AND site_use_id = p_bill_to_id
9247     AND id1 = p_pymt_method_id;
9248 
9249     l_pymt_method_valid_yn VARCHAR2(1);
9250 
9251     CURSOR bank_acct_csr(p_cust_acct_id IN NUMBER,
9252                          p_bill_to_id   IN NUMBER,
9253                          p_bank_acct_id IN NUMBER) IS
9254     SELECT 'Y'
9255     FROM okx_rcpt_method_accounts_v okx_custbkac
9256     WHERE SYSDATE < NVL(end_date_active,SYSDATE+1)
9257     AND customer_id = p_cust_acct_id
9258     AND customer_site_use_id = p_bill_to_id
9259     AND id1 = p_bank_acct_id;
9260 
9261     l_bank_acct_valid_yn VARCHAR2(1);
9262     -- Bug# 8219011
9263 
9264   BEGIN
9265 
9266     -- initialize return status
9267     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
9268 
9269     OPEN  l_hdr_csr(p_chr_id);
9270     FETCH l_hdr_csr INTO l_hdr;
9271     IF l_hdr_csr%NOTFOUND THEN
9272        CLOSE l_hdr_csr;
9273        RAISE G_EXCEPTION_HALT_VALIDATION;
9274     END IF;
9275     CLOSE l_hdr_csr;
9276 
9277       get_bill_to(
9278                   x_return_status => x_return_status,
9279                   p_chr_id        => TO_NUMBER(p_chr_id),
9280                   x_bill_to_id    => l_bto_site_use_id
9281                  );
9282 
9283     --If( l_hdrrl_csr%NOTFOUND ) Then
9284     IF( l_bto_site_use_id IS NULL) THEN
9285             Okl_Api.set_message(
9286               p_app_name     => G_APP_NAME,
9287               p_msg_name     => 'OKL_QA_NOBTO');
9288              -- notify caller of an error
9289             x_return_status := Okl_Api.G_RET_STS_ERROR;
9290     ELSE
9291 
9292         get_cust_account(
9293                   x_return_status => x_return_status,
9294                   p_chr_id        => TO_NUMBER(p_chr_id),
9295                   x_cust_acc_id   => l_cust_acct_id
9296                  );
9297 
9298 
9299         OPEN  cust_site_csr(l_bto_site_use_id, l_cust_acct_id, 'BILL_TO');
9300         FETCH cust_site_csr INTO cust_site_rec;
9301 	CLOSE cust_site_csr;
9302 	IF ( NVL(cust_site_rec.isThere, 'N') = 'N' ) THEN
9303             Okl_Api.set_message(
9304               p_app_name     => G_APP_NAME,
9305               p_msg_name     => 'OKL_QA_BILLTO_ACCNT');
9306              -- notify caller of an error
9307             x_return_status := Okl_Api.G_RET_STS_ERROR;
9308 	END IF;
9309 
9310         OPEN  cust_csr('LESSEE', TO_NUMBER(p_chr_id));
9311         FETCH cust_csr INTO cust_rec;
9312 	CLOSE cust_csr;
9313         l_party_site_id := NVL( TO_NUMBER(cust_rec.object1_id1), -1);
9314 
9315 	FOR l_inst_rec IN l_inst_csr ( TO_NUMBER(p_chr_id) )
9316 	LOOP
9317 
9318 	    l_inst_site_id := NVL( TO_NUMBER(l_inst_rec.object_id1_new), -1);
9319 
9320             OPEN  l_party_uses_csr(l_inst_site_id, l_party_site_id, 'INSTALL_AT');
9321             FETCH l_party_uses_csr INTO l_party_uses_rec;
9322 	    CLOSE l_party_uses_csr;
9323 	    IF ( NVL(l_party_uses_rec.isThere, 'N') = 'N' ) THEN
9324                 Okl_Api.set_message(
9325                   p_app_name     => G_APP_NAME,
9326                   p_msg_name     => 'OKL_QA_INST_ACCN');
9327                  -- notify caller of an error
9328                 x_return_status := Okl_Api.G_RET_STS_ERROR;
9329 	    END IF;
9330 
9331 	END LOOP;
9332 
9333 	FOR l_shipto_rec IN l_shipto_csr( TO_NUMBER(p_chr_id) )
9334 	LOOP
9335 
9336 	    l_shipto_id := NVL( TO_NUMBER(l_shipto_rec.shipping_address_id1), -1);
9337 
9338             IF( l_shipto_id <> -1 ) THEN
9339 
9340                 OPEN  cust_site_csr(l_bto_site_use_id, l_shipto_id, 'SHIP_TO');
9341                 FETCH cust_site_csr INTO cust_site_rec;
9342 	        CLOSE cust_site_csr;
9343 	        IF ( NVL(cust_site_rec.isThere, 'N') = 'N' ) THEN
9344                     Okl_Api.set_message(
9345                       p_app_name     => G_APP_NAME,
9346                       p_msg_name     => 'OKL_QA_BTO_SHIPTO');
9347                      -- notify caller of an error
9348                     x_return_status := Okl_Api.G_RET_STS_ERROR;
9349 	        END IF;
9350 
9351 	    END IF;
9352 
9353 	END LOOP;
9354 
9355       --Bug# 8219011
9356       l_hdrrl_rec := NULL;
9357       OPEN l_hdrrl_csr('LABILL', 'LAPMTH', TO_NUMBER(p_chr_id));
9358       FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9359       CLOSE l_hdrrl_csr;
9360 
9361       IF (l_hdrrl_rec.object1_id1 IS NOT NULL) THEN
9362 
9363         l_pymt_method_valid_yn := 'N';
9364         OPEN pymt_method_csr(p_cust_acct_id   => l_cust_acct_id,
9365                              p_bill_to_id     => l_bto_site_use_id,
9366                              p_pymt_method_id => l_hdrrl_rec.object1_id1);
9367         FETCH pymt_method_csr INTO l_pymt_method_valid_yn;
9368         CLOSE pymt_method_csr;
9369 
9370         IF (l_pymt_method_valid_yn = 'N') THEN
9371           Okl_Api.set_message(
9372             p_app_name     => G_APP_NAME,
9373             p_msg_name     => 'OKL_QA_PYMT_METHOD_INVALID');
9374           x_return_status := Okl_Api.G_RET_STS_ERROR;
9375         END IF;
9376       END IF;
9377 
9378       l_hdrrl_rec := NULL;
9379       OPEN l_hdrrl_csr('LABILL', 'LABACC', TO_NUMBER(p_chr_id));
9380       FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9381       CLOSE l_hdrrl_csr;
9382 
9383       IF (l_hdrrl_rec.object1_id1 IS NOT NULL) THEN
9384 
9385         l_bank_acct_valid_yn := 'N';
9386         OPEN bank_acct_csr(p_cust_acct_id => l_cust_acct_id,
9387                            p_bill_to_id   => l_bto_site_use_id,
9388                            p_bank_acct_id => l_hdrrl_rec.object1_id1);
9389         FETCH bank_acct_csr INTO l_bank_acct_valid_yn;
9390         CLOSE bank_acct_csr;
9391 
9392         IF (l_bank_acct_valid_yn = 'N') THEN
9393           Okl_Api.set_message(
9394             p_app_name     => G_APP_NAME,
9395             p_msg_name     => 'OKL_QA_BANK_ACCT_INVALID');
9396           x_return_status := Okl_Api.G_RET_STS_ERROR;
9397         END IF;
9398       END IF;
9399       --Bug# 8219011
9400 
9401     END IF;
9402     IF (l_hdrrl_csr%ISOPEN) THEN
9403        CLOSE l_hdrrl_csr;
9404     END IF;
9405 
9406     --Bug#3947959
9407     check_est_prop_tax(
9408               p_chr_id        => p_chr_id,
9409               x_return_status => l_return_status
9410              );
9411 
9412     IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
9413        x_return_status := l_return_status;
9414     END IF;
9415 
9416     -- Bug 4915341 (redundant check commented out)
9417     /*
9418     -- Bug#4872437 ramurt
9419     check_evergreen_pth(l_return_status, p_chr_id);
9420 
9421     IF (l_return_status <> OKL_API.G_RET_STS_SUCCESS) THEN
9422        x_return_status := l_return_status;
9423     END IF;
9424     -- Bug#4872437 changes end
9425     */
9426 
9427 /*  commented out for bug 5032883
9428     OPEN  l_hdrrl_csr('LALCGR', 'LAHUDT', TO_NUMBER(p_chr_id));
9429     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9430 
9431     IF(( l_hdrrl_csr%FOUND ) AND
9432        (l_hdrrl_rec.RULE_INFORMATION1 IS NOT NULL) AND
9433        ( TRUNC(Fnd_Date.canonical_to_date(l_hdrrl_rec.RULE_INFORMATION1)) < TRUNC(l_hdr.START_DATE) )) THEN
9434             Okl_Api.set_message(
9435               p_app_name     => G_APP_NAME,
9436               p_msg_name     => 'OKL_QA_LATE_CH_DATE');
9437              -- notify caller of an error
9438             x_return_status := Okl_Api.G_RET_STS_ERROR;
9439     END IF;
9440     CLOSE l_hdrrl_csr;
9441 */
9442 /*  commented out for bug 5032883
9443     OPEN  l_hdrrl_csr('LALIGR', 'LAHUDT', TO_NUMBER(p_chr_id));
9444     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9445 
9446     IF(( l_hdrrl_csr%FOUND ) AND
9447        (l_hdrrl_rec.RULE_INFORMATION1 IS NOT NULL) AND
9448        (TRUNC( Fnd_Date.canonical_to_date(l_hdrrl_rec.RULE_INFORMATION1)) < TRUNC(l_hdr.START_DATE) )) THEN
9449             Okl_Api.set_message(
9450               p_app_name     => G_APP_NAME,
9451               p_msg_name     => 'OKL_QA_LATE_INT_DATE');
9452              -- notify caller of an error
9453             x_return_status := Okl_Api.G_RET_STS_ERROR;
9454     END IF;
9455     CLOSE l_hdrrl_csr;
9456 */
9457     OPEN  l_hdrrl_csr('LAREBL', 'LAREBL', TO_NUMBER(p_chr_id));
9458     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9459 
9460     IF((l_hdrrl_csr%FOUND)AND
9461        (l_hdrrl_rec.RULE_INFORMATION1 IS NOT NULL) AND
9462        (TRUNC( Fnd_Date.canonical_to_date(l_hdrrl_rec.RULE_INFORMATION1)) < TRUNC(l_hdr.START_DATE))) THEN
9463             Okl_Api.set_message(
9464               p_app_name     => G_APP_NAME,
9465               p_msg_name     => 'OKL_QA_REBOOK_LMT_DATE');
9466              -- notify caller of an error
9467             x_return_status := Okl_Api.G_RET_STS_ERROR;
9468     END IF;
9469     CLOSE l_hdrrl_csr;
9470 
9471     OPEN  l_hdrrl_csr('AMTEOC', 'AMBPOC', TO_NUMBER(p_chr_id));
9472     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9473 
9474     IF( l_hdrrl_csr%NOTFOUND ) THEN
9475         l_options(1).purchase_option_type :=  NULL;
9476     ELSE
9477         l_options(1).purchase_option_type := l_hdrrl_rec.RULE_INFORMATION11;
9478         l_options(1).purchase_option := l_hdrrl_rec.RULE_INFORMATION1;
9479         IF (NVL(l_hdrrl_rec.RULE_INFORMATION2,-1) <> -1) THEN
9480             l_options(1).purchase_option_amount := TO_NUMBER(l_hdrrl_rec.RULE_INFORMATION2);
9481         END IF;
9482         l_options(1).formula_name := l_hdrrl_rec.RULE_INFORMATION3;
9483     END IF;
9484     CLOSE l_hdrrl_csr;
9485 
9486     OPEN  l_hdrrl_csr('AMTFOC', 'AMBPOC', TO_NUMBER(p_chr_id));
9487     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9488 
9489     IF( l_hdrrl_csr%NOTFOUND ) THEN
9490         l_options(2).purchase_option_type :=  NULL;
9491     ELSE
9492         l_options(2).purchase_option_type := l_hdrrl_rec.RULE_INFORMATION11;
9493         l_options(2).purchase_option := l_hdrrl_rec.RULE_INFORMATION1;
9494         IF (NVL(l_hdrrl_rec.RULE_INFORMATION2,-1) <> -1) THEN
9495             l_options(2).purchase_option_amount := TO_NUMBER(l_hdrrl_rec.RULE_INFORMATION2);
9496         END IF;
9497         l_options(2).formula_name := l_hdrrl_rec.RULE_INFORMATION3;
9498     END IF;
9499     CLOSE l_hdrrl_csr;
9500 
9501     IF(( (INSTR( l_hdr.DEAL_TYPE, 'LOAN' )<1) OR (l_hdr.report_pdt_id <> -1)) AND
9502         (l_options(1).purchase_option_type IS NULL ) AND
9503         (l_options(2).purchase_option_type IS NULL)) THEN
9504             Okl_Api.set_message(
9505               p_app_name     => G_APP_NAME,
9506               p_msg_name     => 'OKL_QA_NO_PURCHASE_OPTNS');
9507              -- notify caller of an error
9508             x_return_status := Okl_Api.G_RET_STS_ERROR;
9509     END IF;
9510 
9511 
9512     IF( INSTR( l_hdr.DEAL_TYPE, 'LOAN' )<1) THEN
9513 
9514   FOR i IN 1..l_options.COUNT
9515   LOOP
9516 
9517     IF((l_options(i).formula_name IS NULL)AND(l_options(i).purchase_option = 'USE_FORMULA')) THEN
9518             Okl_Api.set_message(
9519               p_app_name     => G_APP_NAME,
9520               p_msg_name     => 'OKL_QA_NO_FORMULA');
9521              -- notify caller of an error
9522             x_return_status := Okl_Api.G_RET_STS_ERROR;
9523     END IF;
9524 
9525     IF((INSTR( l_hdr.DEAL_TYPE, 'LOAN' )>0)AND(l_options(i).purchase_option_type <> 'NONE')) THEN
9526                                                                       --FND Lookup change from NONE.
9527             Okl_Api.set_message(
9528               p_app_name     => G_APP_NAME,
9529               p_msg_name     => 'OKL_QA_LNCTRT_NOFMV');
9530              -- notify caller of an error
9531             x_return_status := Okl_Api.G_RET_STS_ERROR;
9532     END IF;
9533 
9534 
9535     IF((l_options(i).purchase_option_type = 'FMV')AND(l_options(i).purchase_option_amount IS NOT NULL)) THEN
9536             Okl_Api.set_message(
9537               p_app_name     => G_APP_NAME,
9538               p_msg_name     => 'OKL_QA_FMV_NO_FLD');
9539              -- notify caller of an error
9540             x_return_status := Okl_Api.G_RET_STS_ERROR;
9541     END IF;
9542 
9543     IF((l_options(i).purchase_option_type = 'FRV')AND(l_options(i).purchase_option_amount IS NOT NULL)) THEN
9544             Okl_Api.set_message(
9545               p_app_name     => G_APP_NAME,
9546               p_msg_name     => 'OKL_QA_FRV_NO_FLD');
9547              -- notify caller of an error
9548             x_return_status := Okl_Api.G_RET_STS_ERROR;
9549     END IF;
9550 
9551 
9552 
9553     IF ((INSTR( l_hdr.DEAL_TYPE,'OP') > 0 ) AND (l_options(i).purchase_option_type = '$1BO')) THEN
9554         Okl_Api.set_message(
9555               p_app_name     => G_APP_NAME,
9556               p_msg_name     => 'OKL_QA_NO_OP_1DBO');
9557              -- notify caller of an error
9558         x_return_status := Okl_Api.G_RET_STS_ERROR;
9559     END IF;
9560 
9561   END LOOP;
9562 
9563 
9564 
9565 -- End of term.
9566     IF((l_options(2).purchase_option_type IS NOT NULL)AND(l_options(2).purchase_option_type <> 'FMV')AND
9567        (l_hdrrl_rec.RULE_INFORMATION1 IS NULL )AND(l_options(2).purchase_option_amount IS NULL)) THEN
9568             Okl_Api.set_message(
9569               p_app_name     => G_APP_NAME,
9570               p_msg_name     => 'OKL_QA_EOTOPTIONS_NOTSET');
9571              -- notify caller of an error
9572             x_return_status := Okl_Api.G_RET_STS_ERROR;
9573     END IF;
9574 
9575   END IF;
9576 
9577     OPEN  l_hdrrl_csr('LATOWN', 'LATOWN', TO_NUMBER(p_chr_id));
9578     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9579     CLOSE l_hdrrl_csr;
9580 
9581 
9582     IF ((INSTR( l_hdr.DEAL_TYPE,'OP') > 0 ) AND (l_hdrrl_rec.RULE_INFORMATION1 <> 'LESSOR')) THEN
9583         Okl_Api.set_message(
9584               p_app_name     => G_APP_NAME,
9585               p_msg_name     => 'OKL_QA_OP_LESSOR');
9586              -- notify caller of an error
9587         x_return_status := Okl_Api.G_RET_STS_ERROR;
9588     END IF;
9589 
9590     /*If ((INSTR( l_hdr.DEAL_TYPE,'ST') > 0 ) AND (l_hdrrl_rec.RULE_INFORMATION1 <> 'LESSEE')) then
9591         OKL_API.set_message(
9592               p_app_name     => G_APP_NAME,
9593               p_msg_name     => 'OKL_QA_ST_LESSEE');
9594              -- notify caller of an error
9595         x_return_status := OKL_API.G_RET_STS_ERROR;
9596     End If;*/
9597 
9598     IF ((l_hdr.DEAL_TYPE = 'LOAN') AND (l_hdrrl_rec.RULE_INFORMATION1 <> 'LESSEE')) THEN
9599         Okl_Api.set_message(
9600               p_app_name     => G_APP_NAME,
9601               p_msg_name     => 'OKL_QA_LOAN_LESSEE');
9602              -- notify caller of an error
9603         x_return_status := Okl_Api.G_RET_STS_ERROR;
9604     END IF;
9605 
9606   /* Bug#4778020 tax owner message for early termination also moved to procedure check_purchase_option.
9607   If( INSTR( l_hdr.DEAL_TYPE, 'LOAN' )<1) Then
9608     --Lessor and $1buyout check: error thrown only for early termination(AMTEOC).
9609     --message for end of terms check(AMTFOC) moved to check_purchase_option which is
9610     --user configurable to warning.
9611     --FOR i in 1..l_options.COUNT
9612     --LOOP
9613     --    If ((l_options(i).purchase_option_type = '$1BO') AND (l_hdrrl_rec.RULE_INFORMATION1 = 'LESSOR')) then
9614         If ((l_options(1).purchase_option_type = '$1BO') AND (l_hdrrl_rec.RULE_INFORMATION1 = 'LESSOR')) then
9615             OKL_API.set_message(
9616                   p_app_name     => G_APP_NAME,
9617                   p_msg_name     => 'OKL_QA_NO_TOWN_1DBO');
9618                  -- notify caller of an error
9619             x_return_status := OKL_API.G_RET_STS_ERROR;
9620         End If;
9621 
9622     --END LOOP;
9623   End If;
9624   */
9625 
9626   --$1Buyout changes Begin
9627   OPEN  l_hdrrl_csr('AMTFOC', 'AMTINV', TO_NUMBER(p_chr_id));
9628   FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9629   IF((l_hdrrl_csr%FOUND) AND (l_hdrrl_rec.RULE_INFORMATION1 IS NOT NULL)) THEN
9630      l_auto_fixed_pur_opt_yn := l_hdrrl_rec.RULE_INFORMATION1;
9631   END IF;
9632   CLOSE l_hdrrl_csr;
9633 
9634   OPEN  l_hdrrl_csr('AMTFOC', 'AMBPOC', TO_NUMBER(p_chr_id));
9635   FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9636   IF((l_hdrrl_csr%FOUND) AND (l_hdrrl_rec.RULE_INFORMATION11 IS NOT NULL)) THEN
9637     l_purchase_opt_type := l_hdrrl_rec.RULE_INFORMATION11;
9638   END IF;
9639   CLOSE l_hdrrl_csr;
9640   IF (NVL(l_auto_fixed_pur_opt_yn,'N') = 'Y'
9641     AND NVL(l_purchase_opt_type,'XXX') NOT IN ('FPO','$1BO')) THEN
9642     --error message
9643     Okl_Api.set_message(
9644               p_app_name     => G_APP_NAME,
9645               p_msg_name     => 'OKL_QA_AUTO_PUR_OPT_TYPE');
9646     x_return_status := Okl_Api.G_RET_STS_ERROR;
9647   END IF;
9648 
9649   OPEN  l_hdrrl_csr('LAEVEL', 'LAEVEL', TO_NUMBER(p_chr_id));
9650   FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9651   IF((l_hdrrl_csr%FOUND) AND (l_hdrrl_rec.RULE_INFORMATION1 IS NOT NULL)) THEN
9652     l_evergreen_flag := l_hdrrl_rec.RULE_INFORMATION1;
9653   END IF;
9654   CLOSE l_hdrrl_csr;
9655 
9656   IF (NVL(l_evergreen_flag,'N') = 'Y' AND NVL(l_auto_fixed_pur_opt_yn,'N') = 'Y')  THEN
9657     --error message
9658     Okl_Api.set_message(
9659               p_app_name     => G_APP_NAME,
9660               p_msg_name     => 'OKL_QA_EVG_AUTO_FIXED_PUR_OPT');
9661     x_return_status := Okl_Api.G_RET_STS_ERROR;
9662   END IF;
9663   --$1Buyout changes End
9664 
9665     OPEN  l_hdrrl_csr('LARVIN', 'LARVAU', TO_NUMBER(p_chr_id));
9666     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9667     IF( l_hdrrl_csr%FOUND AND (NVL(l_hdrrl_rec.RULE_INFORMATION1,'N') = 'Y')) THEN
9668 
9669         CLOSE l_hdrrl_csr;
9670         OPEN  l_hdrrl_csr('LARVIN', 'LARVAM', TO_NUMBER(p_chr_id));
9671         FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9672 
9673         IF ( l_hdrrl_csr%NOTFOUND OR l_hdrrl_rec.RULE_INFORMATION4 IS NULL) THEN
9674             Okl_Api.set_message(
9675                       p_app_name     => G_APP_NAME,
9676                       p_msg_name     => 'OKL_QA_RVI_RATE');
9677             x_return_status := Okl_Api.G_RET_STS_ERROR;
9678         ELSIF(TO_NUMBER(l_hdrrl_rec.RULE_INFORMATION4)  > 100) THEN
9679             Okl_Api.set_message(
9680                       p_app_name     => G_APP_NAME,
9681                       p_msg_name     => 'OKL_QA_RVI_GT_100');
9682                      -- notify caller of an error
9683             x_return_status := Okl_Api.G_RET_STS_ERROR;
9684         END IF;
9685 
9686     END IF;
9687     CLOSE l_hdrrl_csr;
9688 
9689     OPEN l_rl_csr('LARNOP', 'LAEOTR', p_chr_id);
9690     FETCH l_rl_csr INTO l_rl;
9691     IF ((l_rl_csr%FOUND)AND(INSTR(l_hdr.DEAL_TYPE,'DF') > 0) AND (l_rl.RULE_INFORMATION1 = 'FMV')) THEN
9692             Okl_Api.set_message(
9693               p_app_name     => G_APP_NAME,
9694               p_msg_name     => 'OKL_QA_CTRTDF_NOFMV');
9695              -- notify caller of an error
9696             x_return_status := Okl_Api.G_RET_STS_ERROR;
9697     END IF;
9698     CLOSE l_rl_csr;
9699 
9700     OPEN l_rl_csr('LARNOP', 'LAMITR', p_chr_id);
9701     FETCH l_rl_csr INTO l_rl;
9702     IF ((l_rl_csr%FOUND)AND(INSTR( l_hdr.DEAL_TYPE,'DF') > 0) AND (l_rl.RULE_INFORMATION1 = 'FMV')) THEN
9703             Okl_Api.set_message(
9704               p_app_name     => G_APP_NAME,
9705               p_msg_name     => 'OKL_QA_CTRTDF_NOFMV');
9706              -- notify caller of an error
9707             x_return_status := Okl_Api.G_RET_STS_ERROR;
9708     END IF;
9709     CLOSE l_rl_csr;
9710 
9711     OPEN l_rl_csr('LAASTX', 'LAASTX', p_chr_id);
9712     FETCH l_rl_csr INTO l_rl;
9713     IF ((l_rl_csr%FOUND)AND(l_rl.RULE_INFORMATION1 = 'Y') AND (l_rl.RULE_INFORMATION2 IS NULL)) THEN
9714             Okl_Api.set_message(
9715               p_app_name     => G_APP_NAME,
9716               p_msg_name     => 'OKL_QA_EXEMPT');
9717              -- notify caller of an error
9718             x_return_status := Okl_Api.G_RET_STS_ERROR;
9719     END IF;
9720     CLOSE l_rl_csr;
9721 
9722     OPEN l_rl_csr('LAASTX', 'LAAVTX', p_chr_id);
9723     FETCH l_rl_csr INTO l_rl;
9724     IF ((l_rl_csr%FOUND)AND(l_rl.RULE_INFORMATION1 = 'Y') AND (l_rl.RULE_INFORMATION2 IS NULL)) THEN
9725             Okl_Api.set_message(
9726               p_app_name     => G_APP_NAME,
9727               p_msg_name     => 'OKL_QA_EXEMPT');
9728              -- notify caller of an error
9729             x_return_status := Okl_Api.G_RET_STS_ERROR;
9730     END IF;
9731     CLOSE l_rl_csr;
9732 
9733     OPEN l_rl_csr('LAGRNP', 'LAGRNP', p_chr_id);
9734     FETCH l_rl_csr INTO l_rl;
9735     IF ((l_rl_csr%FOUND)AND(l_rl.RULE_INFORMATION1 = 'Y') AND (l_rl.RULE_INFORMATION2 IS NULL)) THEN
9736             Okl_Api.set_message(
9737               p_app_name     => G_APP_NAME,
9738               p_msg_name     => 'OKL_QA_GUARANTEE');
9739             x_return_status := Okl_Api.G_RET_STS_ERROR;
9740     END IF;
9741     CLOSE l_rl_csr;
9742 
9743     OPEN l_rl_csr('LARNOP', 'LAREND', p_chr_id);
9744     FETCH l_rl_csr INTO l_rl;
9745     IF ((l_rl_csr%FOUND)AND(l_rl.RULE_INFORMATION1 = 'Y') AND (l_rl.RULE_INFORMATION2 IS NULL)) THEN
9746             Okl_Api.set_message(
9747               p_app_name     => G_APP_NAME,
9748               p_msg_name     => 'OKL_QA_RENEWAL_NOTICE');
9749             x_return_status := Okl_Api.G_RET_STS_ERROR;
9750     END IF;
9751     CLOSE l_rl_csr;
9752 
9753 /* Bug 3825314
9754  *
9755  *  OPEN l_synd_csr(p_chr_id);
9756  *  FETCH l_synd_csr INTO l_synd_rec;
9757  *  IF(nvl(l_hdr.syndicatable_yn,'N') = 'Y' AND l_synd_csr%FOUND) THEN
9758  *
9759  *      OPEN l_rl_csr('LASYND', 'LASYST', l_synd_rec.syndId);
9760  *      FETCH l_rl_csr INTO l_rl;
9761  *      IF(l_rl_csr%FOUND)AND(to_number(nvl(l_rl.RULE_INFORMATION2,-1)) > 100) THEN
9762  *        OKL_API.set_message(
9763  *          p_app_name     => G_APP_NAME,
9764  *          p_msg_name     => 'OKL_QA_SYND_STAKE');
9765  *          x_return_status := OKL_API.G_RET_STS_ERROR;
9766  *      END IF;
9767  *      CLOSE l_rl_csr;
9768  *
9769  *  END IF;
9770  *  CLOSE l_synd_csr;
9771  *
9772  */
9773 
9774     OPEN l_rl_csr('LAEVEL', 'LAEOTR', p_chr_id);
9775     FETCH l_rl_csr INTO l_rl;
9776     IF ((l_rl_csr%FOUND)AND(l_rl.RULE_INFORMATION1 = 'FMV') AND (l_rl.RULE_INFORMATION2 IS NOT NULL)) THEN
9777             Okl_Api.set_message(
9778               p_app_name     => G_APP_NAME,
9779               p_msg_name     => 'OKL_QA_EVERGREEN');
9780             x_return_status := Okl_Api.G_RET_STS_ERROR;
9781     END IF;
9782     CLOSE l_rl_csr;
9783 
9784     --Check for Termination Quote Rules
9785     l_row_notfound := FALSE;
9786     OPEN l_rl_csr('AMTQPR', 'AMQTEF', p_chr_id);
9787     FETCH l_rl_csr INTO l_rl;
9788     IF (l_rl_csr%NOTFOUND) THEN
9789       l_row_notfound := l_rl_csr%NOTFOUND;
9790     END IF;
9791     CLOSE l_rl_csr;
9792     l_quote_eff_days := l_rl.RULE_INFORMATION1;
9793     l_quote_eff_max_days := l_rl.RULE_INFORMATION2;
9794 
9795     OPEN l_rl_csr('AMTQPR', 'AMTSET', p_chr_id);
9796     FETCH l_rl_csr INTO l_rl;
9797     IF (l_rl_csr%NOTFOUND) THEN
9798       l_row_notfound := l_rl_csr%NOTFOUND;
9799     END IF;
9800     CLOSE l_rl_csr;
9801     l_eot_tolerance_days := l_rl.RULE_INFORMATION1;
9802 
9803     IF (l_row_notfound OR l_quote_eff_days IS NULL OR l_quote_eff_max_days IS NULL
9804         OR l_eot_tolerance_days IS NULL ) THEN
9805             Okl_Api.set_message(
9806               p_app_name     => G_APP_NAME,
9807               p_msg_name     => 'OKL_QA_TERMINATION_QUOTE');
9808             x_return_status := Okl_Api.G_RET_STS_ERROR;
9809     END IF;
9810 
9811 
9812     i := 0;
9813     FOR l_lne IN l_lne_csr('USAGE', p_chr_id)
9814     LOOP
9815 
9816         i := i + 1;
9817 
9818         FOR l_rl1 IN l_rl_csr1('LAUSBB', 'LAUSBB', p_chr_id, l_lne.id)
9819 	LOOP
9820 
9821 	    IF (( NVL(l_rl1.RULE_INFORMATION6, 'XXX') = 'VRT' ) OR ( NVL(l_rl1.RULE_INFORMATION6, 'XXX') = 'QTY' )) AND
9822 	       (( l_rl1.RULE_INFORMATION2 IS NULL  ) OR ( l_rl1.RULE_INFORMATION5 IS NULL )) THEN
9823 
9824                    OPEN fnd_csr('OKS_USAGE_TYPE', l_rl1.RULE_INFORMATION6);
9825                    FETCH fnd_csr INTO fnd_rec;
9826                    CLOSE fnd_csr;
9827 
9828                    Okl_Api.set_message(
9829                          p_app_name     => G_APP_NAME,
9830                          p_msg_name     => 'OKL_QA_USAGE_CHECK',
9831 			 p_token1       => 'LINE_NUM',
9832                          p_token1_value => TO_CHAR(i),
9833 			 p_token2       => 'USAGE_TYPE',
9834 			 p_token2_value => fnd_rec.meaning);
9835 
9836                    x_return_status := Okl_Api.G_RET_STS_ERROR;
9837 
9838 	    ELSIF (( NVL(l_rl1.RULE_INFORMATION6, 'XXX') = 'FRT' ) AND ( l_rl1.RULE_INFORMATION7 IS NULL )) THEN
9839 
9840                    OPEN fnd_csr('OKS_USAGE_TYPE', l_rl1.RULE_INFORMATION6);
9841                    FETCH fnd_csr INTO fnd_rec;
9842                    CLOSE fnd_csr;
9843 
9844                    Okl_Api.set_message(
9845                          p_app_name     => G_APP_NAME,
9846                          p_msg_name     => 'OKL_QA_FIXED_USAGE',
9847 			 p_token1       => 'LINE_NUM',
9848                          p_token1_value => TO_CHAR(i),
9849 			 p_token2       => 'USAGE_TYPE',
9850 			 p_token2_value => fnd_rec.meaning);
9851 
9852                    x_return_status := Okl_Api.G_RET_STS_ERROR;
9853 
9854 	    END IF;
9855 
9856 	END LOOP;
9857 
9858     END LOOP;
9859 
9860     -- Bug 4865510
9861     OPEN l_rl_csr('LARVIN', 'LARVAU', p_chr_id);
9862     FETCH l_rl_csr INTO l_rl;
9863     IF (l_rl_csr%FOUND) THEN
9864       IF (nvl(l_rl.RULE_INFORMATION1,'N') = 'Y') THEN
9865         IF (INSTR( l_hdr.DEAL_TYPE,'DF') > 0) THEN
9866           NULL;
9867         ELSE
9868           Okl_Api.set_message(
9869                 p_app_name     => G_APP_NAME,
9870                 p_msg_name     => 'OKL_QA_RVI_NA',
9871                 p_token1 => 'BOOK_CLASS',
9872                 p_token1_value => l_hdr.deal_type);
9873           x_return_status := Okl_Api.G_RET_STS_ERROR;
9874         END IF;
9875       END IF; -- If 'Y'
9876     END IF; -- IF found
9877     CLOSE l_rl_csr;
9878 
9879     -- Bug 4925675
9880     OPEN l_rl_csr('LALCGR', 'LALCPR', p_chr_id);
9881     FETCH l_rl_csr INTO l_rl;
9882 
9883     IF (l_rl_csr%FOUND) THEN
9884        l_late_charge_policy := l_rl.rule_information1;
9885        CLOSE l_rl_csr;
9886 
9887        OPEN l_rl_csr('LALCGR', 'LALCEX', p_chr_id);
9888        FETCH l_rl_csr INTO l_rl2;
9889        IF (l_rl_csr%FOUND) THEN
9890          CLOSE l_rl_csr;
9891          IF (l_late_charge_policy IS NOT NULL AND
9892              l_rl2.rule_information1 = 'Y') THEN
9893            Okl_Api.set_message(
9894                 p_app_name     => G_APP_NAME,
9895                 p_msg_name     => 'OKL_QA_LATE_CHARGE_ERROR');
9896            x_return_status := Okl_Api.G_RET_STS_ERROR;
9897          END IF;
9898        ELSE
9899          CLOSE l_rl_csr;
9900        END IF;
9901     ELSE
9902       CLOSE l_rl_csr;
9903     END IF;
9904 
9905 
9906   IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
9907       Okl_Api.set_message(
9908         p_app_name      => G_APP_NAME,
9909         p_msg_name      => G_QA_SUCCESS);
9910   END IF;
9911 
9912   EXCEPTION
9913   WHEN G_EXCEPTION_HALT_VALIDATION THEN
9914     -- no processing necessary; validation can continue with next column
9915     IF l_rl_csr%ISOPEN THEN
9916       CLOSE l_rl_csr;
9917     END IF;
9918     IF l_hdr_csr%ISOPEN THEN
9919       CLOSE l_hdr_csr;
9920     END IF;
9921     IF fnd_csr%ISOPEN THEN
9922       CLOSE fnd_csr;
9923     END IF;
9924   WHEN OTHERS THEN
9925     -- store SQL error message on message stack
9926     Okl_Api.SET_MESSAGE(
9927       p_app_name        => G_APP_NAME,
9928       p_msg_name        => G_UNEXPECTED_ERROR,
9929       p_token1	        => G_SQLCODE_TOKEN,
9930       p_token1_value    => SQLCODE,
9931       p_token2          => G_SQLERRM_TOKEN,
9932       p_token2_value    => SQLERRM);
9933     -- notify caller of an error as UNEXPETED error
9934     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
9935     -- verify that cursor was closed
9936     IF l_rl_csr%ISOPEN THEN
9937       CLOSE l_rl_csr;
9938     END IF;
9939     IF l_hdr_csr%ISOPEN THEN
9940       CLOSE l_hdr_csr;
9941     END IF;
9942     IF fnd_csr%ISOPEN THEN
9943       CLOSE fnd_csr;
9944     END IF;
9945   END check_rule_constrs_4new;
9946 
9947   PROCEDURE check_rule_4new_lnrev(
9948     x_return_status            OUT NOCOPY VARCHAR2,
9949     p_chr_id                   IN  NUMBER
9950   ) IS
9951 
9952     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
9953     l_dummy VARCHAR2(1) := '?';
9954     l_count NUMBER := 0;
9955     l_row_notfound BOOLEAN;
9956     l_token VARCHAR2(2000);
9957 
9958     CURSOR l_rl_csr( rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
9959                      rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
9960                      chrid OKC_RULE_GROUPS_B.DNZ_CHR_ID%TYPE ) IS
9961         SELECT crl.RULE_INFORMATION1, crl.RULE_INFORMATION2
9962         FROM   OKC_RULE_GROUPS_B crg, OKC_RULES_B crl
9963         WHERE  crl.rgp_id = crg.id
9964            AND crg.RGD_CODE = rgcode
9965            AND crl.RULE_INFORMATION_CATEGORY = rlcat
9966            AND crg.dnz_chr_id = chrid;
9967 
9968     l_hdr      l_hdr_csr%ROWTYPE;
9969 
9970     l_rl l_rl_csr%ROWTYPE;
9971 
9972     TYPE options_rec_type IS RECORD (
9973         purchase_option VARCHAR2(256),
9974         purchase_option_type VARCHAR2(256),
9975         formula_name VARCHAR2(256),
9976         purchase_option_amount NUMBER
9977     );
9978 
9979     TYPE options_tbl_type IS TABLE OF options_rec_type INDEX BY BINARY_INTEGER;
9980 
9981     l_options options_tbl_type;
9982 
9983     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
9984     i NUMBER;
9985     l_okl_bill_to_id OKC_K_HEADERS_B.BILL_TO_SITE_USE_ID%TYPE;
9986 
9987     -- Bug# 8219011
9988     l_cust_acct_id    NUMBER;
9989     CURSOR pymt_method_csr(p_cust_acct_id   IN NUMBER,
9990                            p_bill_to_id     IN NUMBER,
9991                            p_pymt_method_id IN NUMBER) IS
9992     SELECT 'Y'
9993     FROM  OKX_RECEIPT_METHODS_V
9994     WHERE customer_id = p_cust_acct_id
9995     AND site_use_id = p_bill_to_id
9996     AND id1 = p_pymt_method_id;
9997 
9998     l_pymt_method_valid_yn VARCHAR2(1);
9999 
10000     CURSOR bank_acct_csr(p_cust_acct_id IN NUMBER,
10001                          p_bill_to_id   IN NUMBER,
10002                          p_bank_acct_id IN NUMBER) IS
10003     SELECT 'Y'
10004     FROM okx_rcpt_method_accounts_v okx_custbkac
10005     WHERE SYSDATE < NVL(end_date_active,SYSDATE+1)
10006     AND customer_id = p_cust_acct_id
10007     AND customer_site_use_id = p_bill_to_id
10008     AND id1 = p_bank_acct_id;
10009 
10010     l_bank_acct_valid_yn VARCHAR2(1);
10011     -- Bug# 8219011
10012 
10013   BEGIN
10014 
10015     -- initialize return status
10016     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
10017 
10018     OPEN  l_hdr_csr(p_chr_id);
10019     FETCH l_hdr_csr INTO l_hdr;
10020     IF l_hdr_csr%NOTFOUND THEN
10021        CLOSE l_hdr_csr;
10022        RAISE G_EXCEPTION_HALT_VALIDATION;
10023     END IF;
10024     CLOSE l_hdr_csr;
10025 
10026 /* Rule migration
10027     OPEN  l_hdrrl_csr('LABILL', 'BTO', TO_NUMBER(p_chr_id));
10028     FETCH l_hdrrl_csr into l_hdrrl_rec;
10029 */
10030       get_bill_to(
10031                   x_return_status => x_return_status,
10032                   p_chr_id        => p_chr_id,
10033                   x_bill_to_id    => l_okl_bill_to_id
10034                  );
10035 
10036     --If( l_hdrrl_csr%NOTFOUND ) Then
10037     IF( l_okl_bill_to_id IS NULL ) THEN
10038             Okl_Api.set_message(
10039               p_app_name     => G_APP_NAME,
10040               p_msg_name     => 'OKL_QA_NOBTO');
10041              -- notify caller of an error
10042             x_return_status := Okl_Api.G_RET_STS_ERROR;
10043     END IF;
10044     --CLOSE l_hdrrl_csr;
10045 
10046     --Bug# 8219011
10047     IF (l_okl_bill_to_id IS NOT NULL) THEN
10048 
10049 
10050       get_cust_account(
10051         x_return_status => x_return_status,
10052         p_chr_id        => TO_NUMBER(p_chr_id),
10053         x_cust_acc_id   => l_cust_acct_id
10054       );
10055 
10056       l_hdrrl_rec := NULL;
10057       OPEN l_hdrrl_csr('LABILL', 'LAPMTH', TO_NUMBER(p_chr_id));
10058       FETCH l_hdrrl_csr INTO l_hdrrl_rec;
10059       CLOSE l_hdrrl_csr;
10060 
10061       IF (l_hdrrl_rec.object1_id1 IS NOT NULL) THEN
10062 
10063         l_pymt_method_valid_yn := 'N';
10064         OPEN pymt_method_csr(p_cust_acct_id   => l_cust_acct_id,
10065                              p_bill_to_id     => l_okl_bill_to_id,
10066                              p_pymt_method_id => l_hdrrl_rec.object1_id1);
10067         FETCH pymt_method_csr INTO l_pymt_method_valid_yn;
10068         CLOSE pymt_method_csr;
10069 
10070         IF (l_pymt_method_valid_yn = 'N') THEN
10071           Okl_Api.set_message(
10072             p_app_name     => G_APP_NAME,
10073             p_msg_name     => 'OKL_QA_PYMT_METHOD_INVALID');
10074         END IF;
10075       END IF;
10076 
10077       l_hdrrl_rec := NULL;
10078       OPEN l_hdrrl_csr('LABILL', 'LABACC', TO_NUMBER(p_chr_id));
10079       FETCH l_hdrrl_csr INTO l_hdrrl_rec;
10080       CLOSE l_hdrrl_csr;
10081 
10082       IF (l_hdrrl_rec.object1_id1 IS NOT NULL) THEN
10083 
10084         l_bank_acct_valid_yn := 'N';
10085         OPEN bank_acct_csr(p_cust_acct_id => l_cust_acct_id,
10086                            p_bill_to_id   => l_okl_bill_to_id,
10087                            p_bank_acct_id => l_hdrrl_rec.object1_id1);
10088         FETCH bank_acct_csr INTO l_bank_acct_valid_yn;
10089         CLOSE bank_acct_csr;
10090 
10091         IF (l_bank_acct_valid_yn = 'N') THEN
10092           Okl_Api.set_message(
10093             p_app_name     => G_APP_NAME,
10094             p_msg_name     => 'OKL_QA_BANK_ACCT_INVALID');
10095         END IF;
10096       END IF;
10097     END IF;
10098     --Bug# 8219011
10099 
10100     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
10101         Okl_Api.set_message(
10102           p_app_name      => G_APP_NAME,
10103           p_msg_name      => G_QA_SUCCESS);
10104     END IF;
10105 
10106   EXCEPTION
10107   WHEN G_EXCEPTION_HALT_VALIDATION THEN
10108     -- no processing necessary; validation can continue with next column
10109     NULL;
10110   WHEN OTHERS THEN
10111     -- store SQL error message on message stack
10112     Okl_Api.SET_MESSAGE(
10113       p_app_name        => G_APP_NAME,
10114       p_msg_name        => G_UNEXPECTED_ERROR,
10115       p_token1	        => G_SQLCODE_TOKEN,
10116       p_token1_value    => SQLCODE,
10117       p_token2          => G_SQLERRM_TOKEN,
10118       p_token2_value    => SQLERRM);
10119     -- notify caller of an error as UNEXPETED error
10120     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
10121     -- verify that cursor was closed
10122     IF l_rl_csr%ISOPEN THEN
10123       CLOSE l_rl_csr;
10124     END IF;
10125     IF l_hdr_csr%ISOPEN THEN
10126       CLOSE l_hdr_csr;
10127     END IF;
10128   END check_rule_4new_lnrev;
10129 
10130   PROCEDURE check_rule_constraints(
10131     x_return_status            OUT NOCOPY VARCHAR2,
10132     p_chr_id                   IN  NUMBER
10133   ) IS
10134 
10135     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
10136     l_dummy VARCHAR2(1) := '?';
10137     l_count NUMBER := 0;
10138     l_row_notfound BOOLEAN;
10139     l_token VARCHAR2(2000);
10140 
10141      CURSOR Product_csr (p_contract_id IN okl_products_v.id%TYPE  ) IS
10142         SELECT pdt.id        product_id
10143               ,pdt.name      product_name
10144               ,CHR.sts_code  contract_status
10145               ,khr.deal_type deal_type
10146         FROM  okl_products_v    pdt
10147               ,okl_k_headers_v  khr
10148               ,okc_k_headers_b  CHR
10149         WHERE  1=1
10150         AND    khr.id = p_contract_id
10151         AND    pdt_id = pdt.id
10152         AND    khr.id = CHR.id;
10153 
10154       l_pdt_rec Product_csr%ROWTYPE;
10155       l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
10156 
10157    BEGIN
10158 
10159     -- initialize return status
10160     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
10161 
10162     OPEN  Product_csr(p_chr_id);
10163     FETCH Product_csr INTO l_pdt_rec;
10164     IF Product_csr%NOTFOUND THEN
10165        CLOSE Product_csr;
10166        RAISE G_EXCEPTION_HALT_VALIDATION;
10167     END IF;
10168     CLOSE Product_csr;
10169 
10170     IF ( l_pdt_rec.deal_type <> 'LOAN-REVOLVING' ) THEN
10171         --Bug# 2833653
10172         IF Are_Assets_Inactive(p_chr_id => p_chr_id) = 'Y' THEN
10173             check_rule_constrs_4new(x_return_status, p_chr_id);
10174         END IF;
10175     ELSE
10176         check_rule_4new_lnrev(x_return_status, p_chr_id);
10177     END IF;
10178 
10179     IF (x_return_status = Okl_Api.G_RET_STS_ERROR ) THEN
10180        RAISE G_EXCEPTION_HALT_VALIDATION;
10181     END IF;
10182 
10183     -- Bug 4917116
10184     check_evergreen_allowed(x_return_status, p_chr_id);
10185     IF (x_return_status = Okl_Api.G_RET_STS_ERROR ) THEN
10186        RAISE G_EXCEPTION_HALT_VALIDATION;
10187     END IF;
10188 
10189   EXCEPTION
10190   WHEN G_EXCEPTION_HALT_VALIDATION THEN
10191     -- no processing necessary; validation can continue with next column
10192     NULL;
10193   WHEN OTHERS THEN
10194     -- store SQL error message on message stack
10195     Okl_Api.SET_MESSAGE(
10196       p_app_name        => G_APP_NAME,
10197       p_msg_name        => G_UNEXPECTED_ERROR,
10198       p_token1	        => G_SQLCODE_TOKEN,
10199       p_token1_value    => SQLCODE,
10200       p_token2          => G_SQLERRM_TOKEN,
10201       p_token2_value    => SQLERRM);
10202     -- notify caller of an error as UNEXPETED error
10203     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
10204     -- verify that cursor was closed
10205     IF Product_csr%ISOPEN THEN
10206       CLOSE Product_csr;
10207     END IF;
10208 
10209    END check_rule_constraints;
10210 
10211   PROCEDURE check_functional_constraints(
10212     x_return_status            OUT NOCOPY VARCHAR2,
10213     p_chr_id                   IN  NUMBER
10214   ) IS
10215 
10216     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
10217     l_dummy VARCHAR2(1) := '?';
10218     l_count NUMBER := 0;
10219     l_row_notfound BOOLEAN;
10220     l_token VARCHAR2(2000);
10221     --Added by dpsingh for LE Uptake
10222     l_diff         NUMBER;
10223 
10224     CURSOR con_le_roll_qt_le_csr(p_contract_id  IN NUMBER) IS
10225     SELECT 1 FROM
10226     OKC_K_HEADERS_B chr,
10227     OKL_K_HEADERS khr,
10228     OKL_K_LINES kle,
10229     OKC_K_LINES_B cle,
10230     OKL_TRX_QUOTES_B qte,
10231     OKC_LINE_STYLES_B cls
10232       WHERE cle.id = kle.id
10233            AND chr.id = p_contract_id
10234            AND chr.id = cle.chr_id
10235 	   AND chr.id = cle.dnz_chr_id
10236            AND cls.lty_code = 'FEE'
10237 	   AND cle.lse_id = cls.id
10238 	   AND kle.qte_id = qte.id
10239            AND chr.id = khr.id
10240 	   AND khr.legal_entity_id <> qte.legal_entity_id;
10241 
10242      CURSOR Product_csr (p_contract_id IN okl_products_v.id%TYPE  ) IS
10243         SELECT pdt.id        product_id
10244               ,pdt.name      product_name
10245               ,CHR.sts_code  contract_status
10246               --Bug# 4869443
10247               ,chr.start_date start_date
10248               ,chr.orig_system_source_code orig_system_source_code
10249               ,rul.rule_information1 Release_asset_yn
10250         FROM  okl_products_v    pdt
10251               ,okl_k_headers_v  khr
10252               ,okc_k_headers_b  CHR
10253               ,okc_rules_b      RUL
10254         WHERE  1=1
10255         AND    khr.id = p_chr_id
10256         AND    pdt_id = pdt.id
10257         AND    khr.id = CHR.id
10258         AND    rul.dnz_chr_id = p_chr_id
10259         AND    rul.rule_information_category = 'LARLES';
10260       l_pdt_rec Product_csr%ROWTYPE;
10261 
10262       -------------------
10263       --Bug# 4869443
10264       ------------------
10265       Cursor l_orig_ast_csr (p_chr_id in number) is
10266       select --trunc(orig_cleb.date_terminated) date_terminated,
10267              trunc(decode(sign(orig_cleb.end_date - orig_cleb.date_terminated),-1,orig_cleb.end_date,orig_cleb.date_terminated)) date_terminated,
10268              orig_clet.name asset_number
10269       from   okc_k_lines_b   orig_cleb,
10270              okc_k_lines_tl  orig_clet,
10271              okc_k_lines_b   cleb
10272       where  orig_clet.id  = orig_cleb.id
10273       and    orig_clet.language = userenv('LANG')
10274       and    orig_cleb.id       = cleb.orig_system_id1
10275       and    cleb.chr_id        = p_chr_id
10276       and    cleb.dnz_chr_id    = p_chr_id
10277       and    cleb.sts_code      <> 'ABANDONED'
10278       and    cleb.lse_id        = 33; --for financial asset line
10279 
10280       l_orig_ast_rec l_orig_ast_csr%ROWTYPE;
10281       l_termination_date varchar2(240);
10282       l_k_start_date     varchar2(240);
10283       l_icx_date_format  varchar2(240);
10284       -------------------
10285       --Bug# 4869443
10286       ------------------
10287 --start:|   23-May-2008 cklee fixed bug: 6781324                                     |
10288     cursor l_salvage_csr(p_chr_id in number) is
10289     select txl.id,
10290            txl.asset_number,
10291            txl.original_cost,
10292            txl.salvage_value,
10293            txl.percent_salvage_value
10294     from   okl_txl_assets_b txl
10295     where  txl.dnz_khr_id = p_chr_id;
10296 
10297   ln_comp_prn_oec        NUMBER := 0;
10298   ln_comp_prn_salv       NUMBER := 0;
10299 --end:|   23-May-2008 cklee fixed bug: 6781324                                     |
10300 
10301    BEGIN
10302 
10303     -- initialize return status
10304     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
10305 
10306 --start:|   23-May-2008 cklee fixed bug: 6781324                                     |
10307     For l_salvage_rec In l_salvage_csr(p_chr_id => p_chr_id)
10308     Loop
10309 
10310       IF (l_salvage_rec.original_cost IS NOT NULL AND
10311           l_salvage_rec.salvage_value IS NOT NULL OR
10312           l_salvage_rec.percent_salvage_value IS NOT NULL) THEN
10313           ln_comp_prn_oec := (l_salvage_rec.original_cost/100);
10314        --Bug# 3950089
10315         IF(nvl(l_salvage_rec.salvage_value,0) > l_salvage_rec.original_cost) THEN
10316        --IF(p_talv_rec.salvage_value > p_talv_rec.original_cost) THEN
10317           -- original cost is greater than salvage value
10318           -- halt validation as the above statments are true
10319 --          RAISE G_EXCEPTION_HALT_VALIDATION;
10320          OKC_API.set_message(p_app_name     => G_APP_NAME,
10321                         p_msg_name     => 'OKL_VALIDATE_SALVAGE_VALUE',
10322                         p_token1       => G_COL_NAME_TOKEN,
10323                         p_token1_value => l_salvage_rec.asset_number);
10324 
10325 
10326        --Bug# 3950089
10327         ELSIF (l_salvage_rec.percent_salvage_value > 100) THEN
10328        --ELSIF (p_talv_rec.percent_salvage_value > ln_comp_prn_oec) THEN
10329           -- To Check if computed original_cost is greater than percent_salvage_value
10330           -- halt validation as the above statments are true
10331 --          RAISE G_EXCEPTION_HALT_VALIDATION;
10332          OKC_API.set_message(p_app_name     => G_APP_NAME,
10333                         p_msg_name     => 'OKL_VALIDATE_SALVAGE_VALUE',
10334                         p_token1       => G_COL_NAME_TOKEN,
10335                         p_token1_value => l_salvage_rec.asset_number);
10336         END IF;
10337       ELSIF (l_salvage_rec.original_cost IS NOT NULL
10338          AND l_salvage_rec.salvage_value IS NOT NULL
10339          AND l_salvage_rec.percent_salvage_value IS NOT NULL) THEN
10340          ln_comp_prn_oec := (l_salvage_rec.original_cost/100);
10341          ln_comp_prn_salv := (l_salvage_rec.salvage_value/100);
10342          IF (l_salvage_rec.salvage_value > l_salvage_rec.original_cost) AND
10343           (l_salvage_rec.percent_salvage_value > ln_comp_prn_oec) THEN
10344           -- To Check if computed original_cost is greater than percent_salvage_value
10345           -- And original cost is greater than salvage value
10346           -- halt validation as the above statments are true
10347 --          RAISE G_EXCEPTION_HALT_VALIDATION;
10348          OKC_API.set_message(p_app_name     => G_APP_NAME,
10349                         p_msg_name     => 'OKL_VALIDATE_SALVAGE_VALUE',
10350                         p_token1       => G_COL_NAME_TOKEN,
10351                         p_token1_value => l_salvage_rec.asset_number);
10352          ELSIF (l_salvage_rec.salvage_value > l_salvage_rec.original_cost) OR
10353           (l_salvage_rec.percent_salvage_value > ln_comp_prn_oec) OR
10354           (ln_comp_prn_salv <> l_salvage_rec.percent_salvage_value)  THEN
10355           -- To Check if computed original_cost is greater than percent_salvage_value
10356           -- or original cost is greater than salvage value
10357           -- or the computed salvage value is not equal to percentage salvage value
10358           -- halt validation as the above statments are true
10359 --          RAISE G_EXCEPTION_HALT_VALIDATION;
10360          OKC_API.set_message(p_app_name     => G_APP_NAME,
10361                         p_msg_name     => 'OKL_VALIDATE_SALVAGE_VALUE',
10362                         p_token1       => G_COL_NAME_TOKEN,
10363                         p_token1_value => l_salvage_rec.asset_number);
10364          END IF;
10365       END IF;
10366     End Loop;
10367 --end:|   23-May-2008 cklee fixed bug: 6781324                                     |
10368 
10369     OPEN  Product_csr(p_chr_id);
10370     FETCH Product_csr INTO l_pdt_rec;
10371     IF Product_csr%NOTFOUND THEN
10372        CLOSE Product_csr;
10373        RAISE G_EXCEPTION_HALT_VALIDATION;
10374     END IF;
10375     CLOSE Product_csr;
10376 
10377     --Bug# 4869443
10378     If (nvl(l_pdt_rec.orig_system_source_code,OKL_API.G_MISS_CHAR) <> 'OKL_RELEASE') and
10379        (nvl(l_pdt_rec.release_Asset_yn,'N') = 'Y') then
10380     Open l_orig_ast_csr(p_chr_id => p_chr_id);
10381     Loop
10382         Fetch l_orig_ast_csr into l_orig_ast_rec;
10383         Exit when l_orig_ast_csr%NOTFOUND;
10384         If l_pdt_rec.start_date <= l_orig_ast_rec.date_terminated Then
10385             -- Raise Error: start date of the contract should not be less than or equal to termination
10386             -- date of the asset.
10387             l_icx_date_format := nvl(fnd_profile.value('ICX_DATE_FORMAT_MASK'),'DD-MON-RRRR');
10388 
10389             l_termination_date := to_char(l_orig_ast_rec.date_terminated,l_icx_date_format);
10390             l_k_start_date     := to_char(l_pdt_rec.start_date,l_icx_date_format);
10391 
10392             OKL_API.set_message(p_app_name     => G_APP_NAME,
10393                                   p_msg_name     => 'OKL_LA_RELEASE_AST_TRMN_DATE',
10394                                   p_token1       => 'TERMINATION_DATE',
10395                                   p_token1_value => l_termination_date,
10396                                   p_token2       => 'ASSET_NUMBER',
10397                                   p_token2_value => l_orig_ast_rec.asset_number,
10398                                   p_token3       => 'CONTRACT_START_DATE',
10399                                   p_token3_value => l_k_start_date);
10400              x_return_status := OKL_API.G_RET_STS_ERROR;
10401         End If;
10402     End Loop;
10403     Close l_orig_ast_csr;
10404 
10405     IF (x_return_status = OKL_API.G_RET_STS_ERROR ) THEN
10406        RAISE G_EXCEPTION_HALT_VALIDATION;
10407     END IF;
10408     End If;
10409     --End Bug# 4869443
10410 
10411    --Added by dpsingh for LE Uptake
10412 OPEN con_le_roll_qt_le_csr(p_chr_id);
10413 FETCH con_le_roll_qt_le_csr INTO l_diff;
10414 CLOSE con_le_roll_qt_le_csr;
10415 IF l_diff = 1 THEN
10416     x_return_status := OKL_API.G_RET_STS_ERROR;
10417     OKL_API.set_message(p_app_name     => G_APP_NAME,
10418                                   p_msg_name     => 'OKL_LA_ROLLOVER_QUOTE_CONTRACT');
10419     RAISE G_EXCEPTION_HALT_VALIDATION;
10420 END IF;
10421 
10422     --Bug# 2833653
10423     IF Are_Assets_Inactive(p_chr_id => p_chr_id) = 'Y' THEN
10424         check_func_constrs_4new(x_return_status, p_chr_id);
10425     END IF;
10426 
10427     IF (x_return_status = Okl_Api.G_RET_STS_ERROR ) THEN
10428        RAISE G_EXCEPTION_HALT_VALIDATION;
10429     END IF;
10430 
10431   EXCEPTION
10432   WHEN G_EXCEPTION_HALT_VALIDATION THEN
10433     -- no processing necessary; validation can continue with next column
10434     NULL;
10435   WHEN OTHERS THEN
10436     -- store SQL error message on message stack
10437     Okl_Api.SET_MESSAGE(
10438       p_app_name        => G_APP_NAME,
10439       p_msg_name        => G_UNEXPECTED_ERROR,
10440       p_token1	        => G_SQLCODE_TOKEN,
10441       p_token1_value    => SQLCODE,
10442       p_token2          => G_SQLERRM_TOKEN,
10443       p_token2_value    => SQLERRM);
10444     -- notify caller of an error as UNEXPETED error
10445     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
10446     -- verify that cursor was closed
10447     IF Product_csr%ISOPEN THEN
10448       CLOSE Product_csr;
10449     END IF;
10450     --Bug# 4869443
10451     IF l_orig_ast_csr%ISOPEN THEN
10452       CLOSE l_orig_Ast_csr;
10453     END IF;
10454 
10455    END check_functional_constraints;
10456 
10457   -- Start of comments
10458   --
10459   -- Procedure Name  : check_tax_book_cost
10460   -- Description     : This process checks asset cost at TAX book for OP and DF lease.
10461   --                   If asset cost at TAX book is less than asset cost
10462   --                   at CORPORATE book, raise error
10463   --                   It is a configurable process
10464   -- Business Rules  :
10465   -- Parameters      :
10466   -- Version         : 1.0, dedey
10467   -- End of comments
10468 
10469   PROCEDURE check_tax_book_cost(
10470     x_return_status            OUT NOCOPY VARCHAR2,
10471     p_chr_id                   IN  NUMBER
10472   ) IS
10473 
10474   l_hdr l_hdr_csr%ROWTYPE;
10475   l_txl l_txl_csr%ROWTYPE;
10476   l_asst asst_qty_csr%ROWTYPE;
10477 
10478   --Bug#3877032
10479   CURSOR txd_csr( kleid NUMBER ) IS
10480   SELECT txd.cost,
10481          txd.deprn_method_tax,
10482          txd.tax_book
10483   FROM   okl_txd_assets_b txd,
10484          okl_txl_assets_b txl
10485   WHERE  txd.tal_id = txl.id
10486   AND    txl.kle_id = kleid;
10487 
10488   BEGIN
10489 
10490     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
10491 
10492     OPEN  l_hdr_csr(p_chr_id);
10493     FETCH l_hdr_csr INTO l_hdr;
10494     IF l_hdr_csr%NOTFOUND THEN
10495        CLOSE l_hdr_csr;
10496        RAISE G_EXCEPTION_HALT_VALIDATION;
10497     END IF;
10498     CLOSE l_hdr_csr;
10499 
10500     IF ((INSTR( l_hdr.DEAL_TYPE, 'OP' )>0) OR
10501         (INSTR( l_hdr.DEAL_TYPE, 'DF' )>0))  THEN
10502 
10503       FOR l_lne IN l_lne_csr('FREE_FORM1', p_chr_id)
10504       LOOP
10505 
10506           OPEN asst_qty_csr(FinAsstId => l_lne.id);
10507           FETCH asst_qty_csr INTO l_asst;
10508           CLOSE asst_qty_csr;
10509 
10510           OPEN  l_txl_csr(l_asst.fa_id);
10511           FETCH l_txl_csr INTO l_txl;
10512           IF l_txl_csr%NOTFOUND THEN
10513               CLOSE l_txl_csr;
10514               RAISE G_EXCEPTION_HALT_VALIDATION; -- checking done on func. constraints
10515           END IF;
10516           CLOSE l_txl_csr;
10517 
10518           FOR l_txd_rec IN txd_csr (l_asst.fa_id)
10519           LOOP
10520              IF (l_txd_rec.cost < l_txl.depreciation_cost) THEN
10521                  Okl_Api.set_message(
10522                      p_app_name     => G_APP_NAME,
10523                      p_msg_name     => 'OKL_QA_BASISPCNT_GT_100',
10524                      p_token1       => 'Line',
10525                      p_token1_value => l_lne.name,
10526                      p_token2       => 'Tax Book',
10527                      p_token2_value => l_txd_rec.tax_book);
10528 
10529                  x_return_status := Okl_Api.G_RET_STS_ERROR;
10530              END IF;
10531           END LOOP;
10532 
10533       END LOOP; -- l_lne_csr
10534 
10535     END IF; -- OP and DF lease
10536 
10537 
10538     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
10539         Okl_Api.set_message(
10540           p_app_name      => G_APP_NAME,
10541           p_msg_name      => G_QA_SUCCESS);
10542     END IF;
10543 
10544   EXCEPTION
10545 
10546      WHEN G_EXCEPTION_HALT_VALIDATION THEN
10547 
10548         NULL; -- Do not do anything
10549 
10550      WHEN OTHERS THEN
10551        -- store SQL error message on message stack
10552        Okl_Api.SET_MESSAGE(
10553          p_app_name        => G_APP_NAME,
10554          p_msg_name        => G_UNEXPECTED_ERROR,
10555          p_token1	   => G_SQLCODE_TOKEN,
10556          p_token1_value    => SQLCODE,
10557          p_token2          => G_SQLERRM_TOKEN,
10558          p_token2_value    => SQLERRM);
10559 
10560        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
10561 
10562        IF l_hdr_csr%ISOPEN THEN
10563           CLOSE l_hdr_csr;
10564        END IF;
10565 
10566        IF asst_qty_csr%ISOPEN THEN
10567           CLOSE asst_qty_csr;
10568        END IF;
10569 
10570        IF l_txl_csr%ISOPEN THEN
10571           CLOSE l_txl_csr;
10572        END IF;
10573 
10574        IF l_txd_csr%ISOPEN THEN
10575           CLOSE l_txd_csr;
10576        END IF;
10577 
10578   END check_tax_book_cost;
10579   -- Start of comments
10580   --
10581   -- Procedure Name  : check_capital_fee
10582   -- Description     : This process checks FEE lines with Capitalized Fee type
10583   --                   Validations include:
10584   --                     1. If fee line type stream type is capitalized and fee
10585   --                        line has no sub lines then 'ERROR'
10586   --                     2. Sum of capital_amount on capitalized fee sublines should be
10587   --                        equal to capital_amount on capitalized fee top line, else 'ERROR'.
10588   -- Business Rules  :
10589   -- Parameters      :
10590   -- Version         : 1.0, dedey
10591   -- End of comments
10592 
10593   PROCEDURE check_capital_fee(
10594     x_return_status            OUT NOCOPY VARCHAR2,
10595     p_chr_id                   IN  NUMBER
10596   ) IS
10597 
10598   CURSOR contract_csr (p_chr_id OKC_K_HEADERS_B.ID%TYPE) IS
10599   SELECT start_date
10600   FROM   okc_k_headers_b
10601   WHERE  id = p_chr_id;
10602 
10603   CURSOR fee_topline_csr (p_chr_id OKC_K_HEADERS_V.ID%TYPE) IS
10604   SELECT line.id,
10605          NVL(line.capital_amount,0) capital_amount,
10606          line.start_date,
10607          strm.code strm_type
10608   FROM   okl_k_lines_full_v line,
10609          okc_k_items item,
10610          okl_strmtyp_source_v strm,
10611          okc_line_styles_v style,
10612          okc_statuses_b sts
10613   WHERE  line.dnz_chr_id             = p_chr_id
10614   AND    line.lse_id                 = style.id
10615   AND    line.sts_code               = sts.code
10616   AND    line.id                     = item.cle_id
10617   AND    item.object1_id1            = strm.id1
10618   AND    item.jtot_object1_code      = 'OKL_STRMTYP'
10619   AND    NVL(strm.capitalize_yn,'N') = 'Y'
10620   AND    sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
10621   AND    style.lty_code              = 'FEE'
10622   -- Bug 6497111 Start Udhenuko Added.
10623   AND    NVL(line.fee_purpose_code,'XXX') <> 'SALESTAX';
10624   -- Bug 6497111 End
10625 
10626   CURSOR fee_subline_csr (p_cle_id OKC_K_LINES_V.ID%TYPE) IS
10627   SELECT id,
10628          NVL(capital_amount,0) capital_amount
10629   FROM   okl_k_lines_full_v line,
10630          okc_statuses_b sts
10631   WHERE  line.cle_id   = p_cle_id
10632   AND    line.sts_code = sts.code
10633   --Bug# 4959361: Include Terminated lines when fetching sub-line amount
10634   --AND    sts.ste_code not in ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
10635   AND    sts.ste_code not in ( 'HOLD', 'EXPIRED', 'CANCELLED');
10636 
10637   --Bug#3877032
10638   CURSOR link_asset_csr (p_line_id OKC_K_LINES_B.ID%TYPE) IS
10639   SELECT line.start_date
10640   FROM   okc_k_lines_b line,
10641          okc_k_items item
10642   WHERE  item.cle_id = p_line_id
10643   AND    item.object1_id1       = line.id
10644   AND    item.object1_id2       = '#'
10645   AND    line.dnz_chr_id        = p_chr_id
10646   AND    item.dnz_chr_id        = p_chr_id
10647   AND    item.jtot_object1_code = 'OKX_COVASST';
10648 
10649   l_subline_present     VARCHAR2(1);
10650   l_contract_start_date DATE;
10651   l_asset_start_date    DATE;
10652   l_sub_cap_amt         NUMBER;
10653 
10654   BEGIN
10655 
10656     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
10657 
10658 /*
10659     OPEN contract_csr (p_chr_id);
10660     FETCH contract_csr INTO l_contract_start_date;
10661     CLOSE contract_csr;
10662 */
10663 
10664     FOR fee_topline_rec IN fee_topline_csr(p_chr_id)
10665     LOOP
10666 
10667 /* Checked against linked asset line
10668        IF (l_contract_start_date <> fee_topline_rec.start_date) THEN
10669            OKL_API.set_message(
10670                p_app_name     => G_APP_NAME,
10671                p_msg_name     => 'OKL_QA_CAP_FEE_ST_DATE',
10672                p_token1       => 'FEE_TYPE',
10673                p_token1_value => fee_topline_rec.strm_type
10674               );
10675 
10676            x_return_status := OKL_API.G_RET_STS_ERROR;
10677        END IF;
10678 */
10679        l_subline_present := 'N';
10680        l_sub_cap_amt     := 0;
10681 
10682        FOR fee_subline_rec IN fee_subline_csr (fee_topline_rec.id)
10683        LOOP
10684           l_subline_present := 'Y';
10685           l_sub_cap_amt := l_sub_cap_amt + fee_subline_rec.capital_amount;
10686 
10687 /* removed for rebook change control
10688           OPEN link_asset_csr (fee_subline_rec.id);
10689           FETCH link_asset_csr INTO l_asset_start_date;
10690           CLOSE link_asset_csr;
10691 
10692           IF (l_asset_start_date <> fee_topline_rec.start_date) THEN
10693              OKL_API.set_message(
10694                p_app_name     => G_APP_NAME,
10695                p_msg_name     => 'OKL_QA_CAP_FEE_ST_DATE',
10696                p_token1       => 'FEE_TYPE',
10697                p_token1_value => fee_topline_rec.strm_type
10698               );
10699 
10700              x_return_status := OKL_API.G_RET_STS_ERROR;
10701           END IF;
10702 */
10703        END LOOP;
10704 
10705        IF (l_subline_present = 'N') THEN
10706            Okl_Api.set_message(
10707                p_app_name     => G_APP_NAME,
10708                p_msg_name     => 'OKL_QA_CAP_FEE_NO_SUBLINE',
10709                p_token1       => 'FEE_TYPE',
10710                p_token1_value => fee_topline_rec.strm_type
10711               );
10712 
10713            x_return_status := Okl_Api.G_RET_STS_ERROR;
10714 
10715        ELSIF (fee_topline_rec.capital_amount <> l_sub_cap_amt) THEN
10716            Okl_Api.set_message(
10717                p_app_name     => G_APP_NAME,
10718                p_msg_name     => 'OKL_QA_CAP_FEE_AMT_ERROR',
10719                p_token1       => 'FEE_TYPE',
10720                p_token1_value => fee_topline_rec.strm_type
10721               );
10722 
10723            x_return_status := Okl_Api.G_RET_STS_ERROR;
10724        END IF;
10725 
10726     END LOOP;
10727 
10728     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
10729         Okl_Api.set_message(
10730           p_app_name      => G_APP_NAME,
10731           p_msg_name      => G_QA_SUCCESS);
10732     END IF;
10733 
10734   EXCEPTION
10735      WHEN OTHERS THEN
10736        -- store SQL error message on message stack
10737        Okl_Api.SET_MESSAGE(
10738          p_app_name        => G_APP_NAME,
10739          p_msg_name        => G_UNEXPECTED_ERROR,
10740          p_token1	   => G_SQLCODE_TOKEN,
10741          p_token1_value    => SQLCODE,
10742          p_token2          => G_SQLERRM_TOKEN,
10743          p_token2_value    => SQLERRM);
10744 
10745        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
10746 
10747   END check_capital_fee;
10748 
10749   -- Start of comments
10750   --
10751   -- Procedure Name  : check_fee_service_payment
10752   -- Description     : This process checks for payment type RENT
10753   --                   attached at FEE or SERVICE line level.
10754   --                   In case RENT is defined at FEE and SERVICE line
10755   --                   raise error during QA check
10756   -- Business Rules  :
10757   -- Parameters      :
10758   -- Version         : 1.0, dedey
10759   -- End of comments
10760 
10761   PROCEDURE check_fee_service_payment(
10762     x_return_status            OUT NOCOPY VARCHAR2,
10763     p_chr_id                   IN  NUMBER
10764   ) IS
10765 
10766 --Bug#3931587
10767   CURSOR pmnt_csr (p_chr_id    OKC_K_HEADERS_B.ID%TYPE,
10768                    p_line_type OKC_LINE_STYLES_B.LTY_CODE%TYPE) IS
10769   SELECT COUNT(1)
10770   FROM   okc_rules_b rule,
10771          okc_rule_groups_b rgp,
10772          okc_k_lines_b line,
10773          okc_line_styles_b style,
10774          okl_strm_type_b strm
10775   WHERE  rgp.dnz_chr_id                 = p_chr_id
10776   AND    rgp.cle_id                     IS NOT NULL
10777   AND    rgp.cle_id                     = line.id
10778   AND    line.lse_id                    = style.id
10779   AND    style.lty_code                 = p_line_type
10780   AND    rgp.id                         = rule.rgp_id
10781   AND    rule.rule_information_category = 'LASLH'
10782   AND    rule.jtot_object1_code         = 'OKL_STRMTYP'
10783   AND    rule.object1_id1               = strm.id
10784   --AND    strm.code                      = 'RENT';
10785   AND    strm.stream_type_purpose       = 'RENT';
10786 
10787   l_count NUMBER := 0;
10788 
10789   BEGIN
10790     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
10791 
10792     -- Check for RENT on FEE line
10793 
10794     l_count := 0;
10795     OPEN pmnt_csr (p_chr_id,
10796                    'FEE');
10797     FETCH pmnt_csr INTO l_count;
10798     CLOSE pmnt_csr;
10799 
10800     IF (l_count <> 0) THEN
10801        Okl_Api.set_message(
10802                            G_APP_NAME,
10803                            'OKL_QA_INVALID_PMNT_TYPE',
10804                            'LINE_TYPE',
10805                            'FEE'
10806                           );
10807        x_return_status := Okl_Api.G_RET_STS_ERROR;
10808     END IF;
10809 
10810     -- Check for RENT on SERVICE line
10811     l_count := 0;
10812     OPEN pmnt_csr (p_chr_id,
10813                    'SOLD_SERVICE');
10814     FETCH pmnt_csr INTO l_count;
10815     CLOSE pmnt_csr;
10816 
10817     IF (l_count <> 0) THEN
10818        Okl_Api.set_message(
10819                            G_APP_NAME,
10820                            'OKL_QA_INVALID_PMNT_TYPE',
10821                            'LINE_TYPE',
10822                            'SERVICE'
10823                           );
10824        x_return_status := Okl_Api.G_RET_STS_ERROR;
10825     END IF;
10826 
10827   END check_fee_service_payment;
10828 
10829   -- Start of comments
10830   --
10831   -- Procedure Name  : check_pmnt_start_dt
10832   -- Description     :
10833   -- Business Rules  :
10834   -- Parameters      :
10835   -- Version         : 1.0
10836   -- End of comments
10837 
10838   PROCEDURE check_pmnt_start_dt(
10839     x_return_status            OUT NOCOPY VARCHAR2,
10840     p_chr_id                   IN  NUMBER
10841   ) IS
10842 
10843     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
10844 
10845     CURSOR l_lne_pmnt_csr(ltycode VARCHAR2, chrid OKL_K_HEADERS.KHR_ID%TYPE) IS
10846         SELECT kle.name,
10847                kle.CURRENCY_CODE,
10848                kle.id,
10849                kle.RESIDUAL_VALUE,
10850                kle.TRACKED_RESIDUAL,
10851                kle.CAPITAL_REDUCTION,
10852                kle.TRADEIN_AMOUNT,
10853                kle.RVI_PREMIUM,
10854                kle.OEC,
10855                kle.residual_code,
10856                kle.residual_grnty_amount,
10857                kle.start_date,
10858                kle.end_date
10859         FROM OKL_K_LINES_FULL_V kle,
10860              OKC_LINE_STYLES_B ls,
10861 	     OKC_STATUSES_B sts
10862         WHERE kle.lse_id = ls.id
10863               AND ls.lty_code = ltycode
10864               AND kle.dnz_chr_id = chrid
10865 	      AND sts.code = kle.sts_code
10866 	      AND sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
10867 
10868     l_hdr_rec l_hdr_csr%ROWTYPE;
10869     --l_lne l_lne_csr%ROWTYPE;
10870     l_rl_rec1 l_rl_csr1%ROWTYPE;
10871     l_rl_rec l_rl_csr%ROWTYPE;
10872 
10873     l_fee_strm_type_rec fee_strm_type_csr%ROWTYPE;
10874     l_strm_name_rec strm_name_csr%ROWTYPE;
10875   BEGIN
10876 
10877     -- initialize return status
10878     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
10879 
10880     OPEN l_hdr_csr( p_chr_id );
10881     FETCH l_hdr_csr INTO l_hdr_rec;
10882     CLOSE l_hdr_csr;
10883 
10884     FOR l_lne_pmnt IN l_lne_pmnt_csr('FREE_FORM1', p_chr_id)
10885     LOOP
10886 
10887       FOR l_rl_rec1 IN l_rl_csr1 ( 'LALEVL', 'LASLH', TO_NUMBER(p_chr_id), l_lne_pmnt.id )
10888       LOOP
10889 
10890         OPEN  strm_name_csr ( l_rl_rec1.object1_id1 );
10891         FETCH strm_name_csr INTO l_strm_name_rec;
10892         IF strm_name_csr%NOTFOUND THEN
10893             CLOSE strm_name_csr;
10894             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
10895         END IF;
10896         CLOSE strm_name_csr;
10897 
10898         FOR l_rl_rec IN l_rl_csr (l_rl_rec1.slh_id, 'LALEVL', 'LASLL', TO_NUMBER(p_chr_id), l_lne_pmnt.id )
10899         LOOP
10900            IF(( l_rl_rec.rule_information2 IS NOT NULL) AND
10901               (TRUNC( Fnd_Date.canonical_to_date(l_rl_rec.rule_information2)) < TRUNC(l_lne_pmnt.start_date)))THEN
10902 
10903                Okl_Api.set_message(
10904                   p_app_name     => G_APP_NAME,
10905                   p_msg_name     => 'OKL_QA_PMNT_LN_START_DT',
10906                   p_token1       => 'line',
10907                   p_token1_value => l_lne_pmnt.name,
10908                   p_token2       => 'payment type',
10909                   p_token2_value => l_strm_name_rec.name);
10910                x_return_status := Okl_Api.G_RET_STS_ERROR;
10911            END IF;
10912         END LOOP;
10913       END LOOP;
10914     END LOOP;
10915 
10916     FOR l_lne_pmnt IN l_lne_pmnt_csr('FEE', p_chr_id)
10917     LOOP
10918         FOR l_rl_rec1 IN l_rl_csr1 ( 'LALEVL', 'LASLL', TO_NUMBER(p_chr_id), l_lne_pmnt.id )
10919         LOOP
10920            IF(( l_rl_rec1.rule_information2 IS NOT NULL) AND
10921 	      (TRUNC( Fnd_Date.canonical_to_date(l_rl_rec1.rule_information2)) < TRUNC(l_lne_pmnt.start_date)))THEN
10922 	      --( FND_DATE.canonical_to_date(l_rl_rec1.rule_information2) < l_hdr_rec.start_date))Then
10923 
10924                OPEN  fee_strm_type_csr  ( l_lne_pmnt.id, 'FEE' );
10925                FETCH fee_strm_type_csr INTO l_fee_strm_type_rec;
10926                CLOSE fee_strm_type_csr;
10927 
10928                Okl_Api.set_message(
10929                   p_app_name     => G_APP_NAME,
10930                   p_msg_name     => 'OKL_QA_PMNT_LN_START_DT',
10931                   p_token1       => 'line',
10932                   p_token1_value => l_fee_strm_type_rec.strm_name);
10933                x_return_status := Okl_Api.G_RET_STS_ERROR;
10934            END IF;
10935         END LOOP;
10936     END LOOP;
10937 
10938 
10939     FOR l_lne_pmnt IN l_lne_pmnt_csr('SOLD_SERVICE', p_chr_id)
10940     LOOP
10941         FOR l_rl_rec1 IN l_rl_csr1 ( 'LALEVL', 'LASLL', TO_NUMBER(p_chr_id), l_lne_pmnt.id )
10942         LOOP
10943            IF(( l_rl_rec1.rule_information2 IS NOT NULL) AND
10944 	      ( TRUNC(Fnd_Date.canonical_to_date(l_rl_rec1.rule_information2)) < TRUNC(l_lne_pmnt.start_date)))THEN
10945                Okl_Api.set_message(
10946                   p_app_name     => G_APP_NAME,
10947                   p_msg_name     => 'OKL_QA_PMNT_LN_START_DT',
10948                   p_token1       => 'line',
10949                   p_token1_value => l_lne_pmnt.name);
10950                x_return_status := Okl_Api.G_RET_STS_ERROR;
10951            END IF;
10952         END LOOP;
10953     END LOOP;
10954 
10955     FOR l_rl_rec1 IN l_rl_csr1 ( 'LALEVL', 'LASLL', TO_NUMBER(p_chr_id), -1 )
10956     LOOP
10957        IF(( l_rl_rec1.rule_information2 IS NOT NULL) AND
10958           ( TRUNC(Fnd_Date.canonical_to_date(l_rl_rec1.rule_information2)) < TRUNC(l_hdr_rec.start_date)))THEN
10959            Okl_Api.set_message(
10960               p_app_name     => G_APP_NAME,
10961               p_msg_name     => 'OKL_QA_PMNT_START_DT');
10962            x_return_status := Okl_Api.G_RET_STS_ERROR;
10963        END IF;
10964     END LOOP;
10965 
10966     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
10967         Okl_Api.set_message(
10968           p_app_name      => G_APP_NAME,
10969           p_msg_name      => G_QA_SUCCESS);
10970     END IF;
10971 
10972   EXCEPTION
10973 
10974   WHEN G_EXCEPTION_HALT_VALIDATION THEN
10975     IF l_hdr_csr%ISOPEN THEN
10976       CLOSE l_hdr_csr;
10977     END IF;
10978     -- no processing necessary; validation can continue with next column
10979   WHEN OTHERS THEN
10980     -- store SQL error message on message stack
10981     Okl_Api.SET_MESSAGE(
10982       p_app_name        => G_APP_NAME,
10983       p_msg_name        => G_UNEXPECTED_ERROR,
10984       p_token1	        => G_SQLCODE_TOKEN,
10985       p_token1_value    => SQLCODE,
10986       p_token2          => G_SQLERRM_TOKEN,
10987       p_token2_value    => SQLERRM);
10988     -- notify caller of an error as UNEXPETED error
10989     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
10990     -- verify that cursor was closed
10991     IF l_hdr_csr%ISOPEN THEN
10992       CLOSE l_hdr_csr;
10993     END IF;
10994 
10995   END check_pmnt_start_dt;
10996 
10997   -- Start of comments
10998   --
10999   -- Procedure Name  : check_asset_tax
11000   -- Description     : This process checks tax rules attached to Asset.
11001   --                   1. If Tax status = Override, Override rate must be present
11002   --                   2. If Tax status = Exempt, Exempt number must be present
11003   --                   3. If Tax status = NULL, both override and exempt must be null
11004   --                   4. If both override and exempt are not null raise error
11005   -- Business Rules  :
11006   -- Parameters      :
11007   -- Version         : 1.0, dedey
11008   -- End of comments
11009 
11010   PROCEDURE check_asset_tax(
11011     x_return_status            OUT NOCOPY VARCHAR2,
11012     p_chr_id                   IN  NUMBER
11013   ) IS
11014 
11015   CURSOR asset_line_csr (p_chr_id OKC_K_HEADERS_V.ID%TYPE) IS
11016   SELECT line.id,
11017          line.name
11018   FROM   okl_k_lines_full_v line,
11019          okc_line_styles_v style,
11020          okc_statuses_b sts
11021   WHERE line. dnz_chr_id = p_chr_id
11022   AND   line.lse_id      = style.id
11023   AND   style.lty_code     = 'FREE_FORM1'
11024   AND   line.sts_code    = sts.code
11025   AND   sts.ste_code     NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
11026 
11027   CURSOR tax_rule_csr (rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
11028                        rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
11029                        chrId NUMBER,
11030                        cleId NUMBER) IS
11031   SELECT crl.id slh_id,
11032          crl.object1_id1,
11033          crl.RULE_INFORMATION1,
11034          crl.RULE_INFORMATION2,
11035          crl.RULE_INFORMATION3,
11036          crl.RULE_INFORMATION4,
11037          crl.RULE_INFORMATION5,
11038          crl.RULE_INFORMATION6,
11039          crl.RULE_INFORMATION7,
11040          crl.RULE_INFORMATION10
11041   FROM   OKC_RULE_GROUPS_B crg,
11042          OKC_RULES_B crl
11043   WHERE  crl.rgp_id                        = crg.id
11044          AND crg.RGD_CODE                  = rgcode
11045          AND crl.RULE_INFORMATION_CATEGORY = rlcat
11046          AND crg.cle_id                    = cleId;
11047 
11048   tax_failed EXCEPTION;
11049 
11050   BEGIN
11051 
11052     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
11053 
11054     FOR asset_line_rec IN asset_line_csr (p_chr_id)
11055     LOOP
11056        FOR tax_rule_rec IN tax_rule_csr ('LAASTX',
11057                                          'LAASTX',
11058                                          p_chr_id,
11059                                          asset_line_rec.id)
11060        LOOP
11061 
11062          IF (tax_rule_rec.rule_information1 = 'E'             -- Exempt
11063              AND
11064              tax_rule_rec.rule_information2 IS NULL) THEN
11065                 Okl_Api.set_message(
11066                                 G_APP_NAME,
11067                                 'OKL_QA_EXEMPT_ERROR',
11068                                 'ASSET_NUM',
11069                                 asset_line_rec.name);
11070                 x_return_status := Okl_Api.G_RET_STS_ERROR;
11071                 --RAISE tax_failed;
11072          ELSIF (tax_rule_rec.rule_information1 IS NULL -- Null
11073                 AND
11074                 tax_rule_rec.rule_information2 IS NOT NULL) THEN
11075                 Okl_Api.set_message(
11076                                 G_APP_NAME,
11077                                 'OKL_QA_TAX_NULL',
11078                                 'ASSET_NUM',
11079                                 asset_line_rec.name);
11080                 x_return_status := Okl_Api.G_RET_STS_ERROR;
11081                 --RAISE tax_failed;
11082          END IF;
11083        END LOOP;
11084 
11085     END LOOP;
11086 
11087     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
11088         Okl_Api.set_message(
11089           p_app_name      => G_APP_NAME,
11090           p_msg_name      => G_QA_SUCCESS);
11091     END IF;
11092 
11093   EXCEPTION
11094 
11095      WHEN tax_failed THEN
11096         NULL; -- error reported, just exit from this process
11097      WHEN OTHERS THEN
11098        -- store SQL error message on message stack
11099        Okl_Api.SET_MESSAGE(
11100          p_app_name        => G_APP_NAME,
11101          p_msg_name        => G_UNEXPECTED_ERROR,
11102          p_token1	   => G_SQLCODE_TOKEN,
11103          p_token1_value    => SQLCODE,
11104          p_token2          => G_SQLERRM_TOKEN,
11105          p_token2_value    => SQLERRM);
11106 
11107        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
11108 
11109   END check_asset_tax;
11110 
11111 
11112 PROCEDURE check_subsidies_errors(
11113             x_return_status OUT NOCOPY VARCHAR2,
11114             p_chr_id IN NUMBER) IS
11115 
11116   --p_api_version VARCHAR2(4000) := '1.0';
11117   p_init_msg_list VARCHAR2(4000) DEFAULT Okl_Api.G_FALSE;
11118   x_msg_count NUMBER;
11119   x_msg_data  VARCHAR2(256);
11120   subsidy_applicable_yn VARCHAR2(10);
11121   l_subsidy_id NUMBER;
11122   l_asset_id NUMBER;
11123   x_subsidized VARCHAR2(1);
11124 
11125   CURSOR get_subsidy_for_asset(p_chr_id NUMBER) IS
11126   SELECT kle.subsidy_id   subsidy_id,
11127               cleb.cle_id      asset_cle_id,
11128               clet.name        subsidy_name,
11129               clet_asst.name   asset_number,
11130               cleb.id     subsidy_cle_id,
11131               cleb_asst.start_date asset_start_date,
11132               kle.amount,
11133               kle.subsidy_override_amount
11134   FROM   okl_k_lines       kle,
11135          okc_k_lines_tl    clet,
11136          okc_k_lines_b     cleb,
11137          okc_line_styles_b lseb,
11138          okc_k_lines_tl    clet_asst,
11139          okc_k_lines_b     cleb_asst,
11140          okc_line_styles_b lseb_asst
11141   WHERE  kle.id               =  cleb.id
11142   AND    clet.id              =  cleb.id
11143   AND    clet.LANGUAGE        =  USERENV('LANG')
11144   AND    cleb.cle_id          =  cleb_asst.id
11145   AND    cleb.dnz_chr_id      =  cleb_asst.dnz_chr_id
11146   AND    cleb.sts_code        <> 'ABANDONED'
11147   AND    lseb.id              =  cleb.lse_id
11148   AND    lseb.lty_code        = 'SUBSIDY'
11149   AND    clet_asst.id         = cleb_asst.id
11150   AND    clet_asst.LANGUAGE   = USERENV('LANG')
11151   AND    lseb_asst.id         = cleb_asst.lse_id
11152   AND    lseb_asst.lty_code   = 'FREE_FORM1'
11153   AND    cleb_asst.sts_code   <> 'ABANDONED'
11154   AND    cleb_asst.dnz_chr_id = p_chr_id
11155   AND    cleb_asst.chr_id     = p_chr_id ;
11156   get_subsidy_for_asset_rec get_subsidy_for_asset%ROWTYPE;
11157 
11158   CURSOR check_subsidy_recourse(p_subsidy_id NUMBER) IS
11159   SELECT recourse_yn
11160   FROM okl_subsidies_b
11161   WHERE id = p_subsidy_id;
11162 
11163   recourse_yn VARCHAR2(1);
11164 
11165   CURSOR check_refund_details(p_subsidy_cle_id NUMBER) IS
11166   SELECT pyd.vendor_id
11167   FROM okl_party_payment_dtls pyd,
11168        okc_k_party_roles_b cplb,
11169        okc_k_lines_b cleb
11170   WHERE pyd.cpl_id = cplb.id
11171   AND   cplb.cle_id = cleb.id
11172   AND   cplb.chr_id IS NULL
11173   AND   cplb.RLE_CODE = 'OKL_VENDOR'
11174   AND   cleb.id = p_subsidy_cle_id;
11175 
11176   check_refund_details_rec check_refund_details%ROWTYPE;
11177 
11178   lv_subsidy_pool_applicable_yn VARCHAR2(10);
11179   lx_subsidy_pool_id okl_subsidy_pools_b.id%TYPE;
11180   lx_sub_pool_curr_code okl_subsidy_pools_b.currency_code%TYPE;
11181   lx_pool_status okl_subsidy_pools_b.decision_status_code%TYPE;
11182   lx_pool_balance okl_subsidy_pools_b.total_subsidy_amount%TYPE;
11183   lv_subsidy_amount okl_k_lines.subsidy_override_amount%TYPE;
11184   -- sjalasut, added local variables to support logging
11185   l_module CONSTANT fnd_log_messages.MODULE%TYPE := 'okl.plsql.OKL_QA_DATA_INTEGRITY.CHECK_SUBSIDIES_ERRORS';
11186   l_debug_enabled VARCHAR2(10);
11187   is_debug_statement_on BOOLEAN;
11188 
11189 
11190   BEGIN
11191     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
11192 
11193     -- check if debug is enabled
11194     l_debug_enabled := Okl_Debug_Pub.check_log_enabled;
11195     -- check for logging on STATEMENT level
11196     is_debug_statement_on := Okl_Debug_Pub.check_log_on(l_module,Fnd_Log.LEVEL_STATEMENT);
11197 
11198     Okl_Subsidy_Process_Pvt.is_contract_subsidized(
11199                          p_api_version => 1.0,
11200                          p_init_msg_list => p_init_msg_list,
11201                          x_return_status => x_return_status,
11202                          x_msg_count => x_msg_count,
11203                          x_msg_data => x_msg_data,
11204                          p_chr_id => p_chr_id,
11205                          x_subsidized => x_subsidized);
11206 
11207     IF x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR THEN
11208       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11209     ELSIF x_return_status = Okl_Api.G_RET_STS_ERROR THEN
11210       RAISE Okl_Api.G_EXCEPTION_ERROR;
11211     END IF;
11212 
11213     IF (x_subsidized = Okl_Api.G_FALSE) THEN
11214       Okl_Api.set_message(
11215           p_app_name      => G_APP_NAME,
11216           p_msg_name      => G_QA_SUCCESS);
11217       RETURN;
11218     END IF;
11219 
11220     FOR get_subsidy_for_asset_rec IN get_subsidy_for_asset(p_chr_id)
11221     LOOP
11222       l_subsidy_id := get_subsidy_for_asset_rec.subsidy_id;
11223       l_asset_id := get_subsidy_for_asset_rec.asset_cle_id;
11224 
11225       /*
11226        * sjalasut, Feb 18, 2005: Modified the call to include new parameter p_qa_checker_call and pass it as 'Y'
11227        * this parameter bypasses the subsidy pool check in the validate_subsidy_applicability procedure
11228        * as the same is being called here to pinpoint exact nature of failure in the subsidy / subsidy pool configuration.
11229        * Modification introduced as part of subsidy pools enhancement
11230        * START code changes
11231        */
11232       subsidy_applicable_yn := Okl_Asset_Subsidy_Pvt.validate_subsidy_applicability(p_subsidy_id => l_subsidy_id
11233                                                                                    ,p_asset_cle_id => l_asset_id
11234                                                                                    ,p_qa_checker_call => 'Y');
11235       /*
11236        * END code changes
11237        */
11238 
11239       IF (subsidy_applicable_yn = 'N') THEN
11240           Okl_Api.set_message(
11241                 p_app_name     => G_APP_NAME,
11242                 p_msg_name     => 'OKL_SUBSIDY_CRITERIA_MATCH',
11243                 p_token1       => 'SUBSIDY_NAME',
11244                 p_token1_value => get_subsidy_for_asset_rec.subsidy_name,
11245                 p_token2       => 'ASSET_NUMBER',
11246                 p_token2_value => get_subsidy_for_asset_rec.asset_number);
11247           x_return_status := Okl_Api.G_RET_STS_ERROR;
11248           RAISE G_EXCEPTION_HALT_VALIDATION;
11249       END IF;
11250 
11251       OPEN check_subsidy_recourse(get_subsidy_for_asset_rec.subsidy_id);
11252       FETCH check_subsidy_recourse INTO recourse_yn;
11253       CLOSE check_subsidy_recourse;
11254       IF (recourse_yn = 'Y') THEN
11255         OPEN check_refund_details(get_subsidy_for_asset_rec.subsidy_cle_id);
11256         FETCH check_refund_details INTO check_refund_details_rec;
11257         IF (check_refund_details%NOTFOUND) THEN
11258           x_return_status := Okl_Api.G_RET_STS_ERROR;
11259           Okl_Api.set_message(
11260                p_app_name     => G_APP_NAME,
11261                p_msg_name     => 'OKL_LA_SUBSIDY_PARTY_PYMT',
11262                p_token1       => 'SUBSIDY_NAME',
11263                p_token1_value => get_subsidy_for_asset_rec.subsidy_name ,
11264                p_token2       => 'ASSET_NUMBER',
11265                p_token2_value => get_subsidy_for_asset_rec.asset_number);
11266         END IF;
11267         CLOSE check_refund_details;
11268       END IF;
11269 
11270       /*
11271        * sjalasut, Feb 18, 2005: added code to check for applicability of subsidy pool if the subsidy in context is attached with a subsidy pool.
11272        * code added as part of subsidy pools enhancement START
11273        */
11274       lv_subsidy_pool_applicable_yn := 'N'; -- need to reset this var as this is being used in a loop. the last usage should not be compared
11275       -- check if the subsidy has been associated with a subsidy pool, further pool validation depends only if the
11276       -- subsidy has an association with the pool
11277       lv_subsidy_pool_applicable_yn := Okl_Asset_Subsidy_Pvt.is_sub_assoc_with_pool(p_subsidy_id => l_subsidy_id
11278                                                                                    ,x_subsidy_pool_id => lx_subsidy_pool_id
11279                                                                                    ,x_sub_pool_curr_code => lx_sub_pool_curr_code);
11280       IF(lv_subsidy_pool_applicable_yn = 'Y')THEN
11281         -- write to log
11282         IF(NVL(l_debug_enabled,'N')='Y' AND is_debug_statement_on) THEN
11283           Okl_Debug_Pub.log_debug(Fnd_Log.LEVEL_STATEMENT,
11284                                   l_module,
11285                                   'subsidy '|| l_subsidy_id || ' is attached to subsidy pool '|| lx_subsidy_pool_id
11286                                   );
11287         END IF; -- end of NVL(l_debug_enabled,'N')='Y' AND is_debug_statement_on
11288 
11289         -- is active by code is called first as reading from a column is more economical than comparing date values
11290         -- if the pool status code is not ACTIVE then no date comparision would be done.
11291         lv_subsidy_pool_applicable_yn := Okl_Asset_Subsidy_Pvt.is_sub_pool_active(p_subsidy_pool_id => lx_subsidy_pool_id
11292                                                                                  ,x_pool_status => lx_pool_status );
11293         IF(lv_subsidy_pool_applicable_yn <> 'Y')THEN
11294           x_return_status := Okl_Api.G_RET_STS_ERROR;
11295           Okl_Api.set_message(
11296                p_app_name     => G_APP_NAME,
11297                p_msg_name     => G_SUB_POOL_NOT_ACTIVE,
11298                p_token1       => 'SUBSIDY_NAME',
11299                p_token1_value => get_subsidy_for_asset_rec.subsidy_name ,
11300                p_token2       => 'ASSET_NUMBER',
11301                p_token2_value => get_subsidy_for_asset_rec.asset_number);
11302           RAISE G_EXCEPTION_HALT_VALIDATION;
11303         END IF;
11304         -- validate if the asset start date lies between the effective dates of the subsidy pool
11305         lv_subsidy_pool_applicable_yn := Okl_Asset_Subsidy_Pvt.is_sub_pool_active_by_date(p_subsidy_pool_id => lx_subsidy_pool_id
11306                                                                    ,p_asset_date => get_subsidy_for_asset_rec.asset_start_date );
11307         IF(lv_subsidy_pool_applicable_yn <> 'Y')THEN
11308           x_return_status := Okl_Api.G_RET_STS_ERROR;
11309           Okl_Api.set_message(
11310                p_app_name     => G_APP_NAME,
11311                p_msg_name     => G_SUB_POOL_ASSET_DATES_GAP,
11312                p_token1       => 'SUBSIDY_NAME',
11313                p_token1_value => get_subsidy_for_asset_rec.subsidy_name ,
11314                p_token2       => 'ASSET_NUMBER',
11315                p_token2_value => get_subsidy_for_asset_rec.asset_number);
11316           RAISE G_EXCEPTION_HALT_VALIDATION;
11317         END IF;
11318 
11319         lx_pool_balance := 0;
11320         lv_subsidy_pool_applicable_yn := Okl_Asset_Subsidy_Pvt.is_balance_valid_before_add(p_subsidy_pool_id => lx_subsidy_pool_id
11321                                                                                           ,x_pool_balance => lx_pool_balance);
11322         IF(lv_subsidy_pool_applicable_yn <> 'Y')THEN
11323           x_return_status := Okl_Api.G_RET_STS_ERROR;
11324           Okl_Api.set_message(
11325                p_app_name     => G_APP_NAME,
11326                p_msg_name     => G_SUB_POOL_BALANCE_INVALID,
11327                p_token1       => 'SUBSIDY_NAME',
11328                p_token1_value => get_subsidy_for_asset_rec.subsidy_name ,
11329                p_token2       => 'ASSET_NUMBER',
11330                p_token2_value => get_subsidy_for_asset_rec.asset_number);
11331           RAISE G_EXCEPTION_HALT_VALIDATION;
11332         END IF;
11333         -- the check of subsidy pool balance is valid after addition of the subsidy amount is being written in separate PL/SQL
11334         -- block as we dont stop processing if error occurs here. all the assets should be processed
11335         BEGIN
11336           lv_subsidy_amount := 0;
11337           lv_subsidy_amount := NVL(get_subsidy_for_asset_rec.subsidy_override_amount,NVL(get_subsidy_for_asset_rec.amount,0));
11338           Okl_Asset_Subsidy_Pvt.is_balance_valid_after_add (p_subsidy_id => l_subsidy_id
11339                                 ,p_asset_id => l_asset_id
11340                                 ,p_subsidy_amount => lv_subsidy_amount
11341                                 ,p_subsidy_name => get_subsidy_for_asset_rec.subsidy_name
11342                                 ,x_return_status => x_return_status
11343                                 ,x_msg_count     => x_msg_count
11344                                 ,x_msg_data      => x_msg_data);
11345           -- write to log
11346           IF(NVL(l_debug_enabled,'N')='Y' AND is_debug_statement_on) THEN
11347             Okl_Debug_Pub.log_debug(Fnd_Log.LEVEL_STATEMENT,
11348                                     l_module,
11349                                     'okl_asset_subsidy_pvt.is_balance_valid_after_add returned with '|| x_return_status||' x_msg_data '||x_msg_data
11350                                     );
11351           END IF; -- end of NVL(l_debug_enabled,'N')='Y' AND is_debug_statement_on
11352         EXCEPTION WHEN OTHERS THEN
11353           x_return_status := Okl_Api.G_RET_STS_ERROR;
11354 /*comment out to avoid duplicated error: cklee 09/12/2005
11355           OKL_API.set_message(
11356                p_app_name     => G_APP_NAME,
11357                p_msg_name     => G_SUB_POOL_BALANCE_INVALID,
11358                p_token1       => 'SUBSIDY_NAME',
11359                p_token1_value => get_subsidy_for_asset_rec.subsidy_name ,
11360                p_token2       => 'ASSET_NUMBER',
11361                p_token2_value => get_subsidy_for_asset_rec.asset_number);
11362 */
11363           RAISE G_EXCEPTION_HALT_VALIDATION;
11364         END;
11365       END IF; -- end of lv_subsidy_pool_applicable_yn = 'Y'
11366 
11367       /*
11368        * sjalasut, Feb 18, 2005: added code to check for applicability of subsidy pool if the subsidy in context is attached with a subsidy pool.
11369        * code added as part of subsidy pools enhancement
11370        * END
11371        */
11372     END LOOP;
11373 
11374     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
11375         Okl_Api.set_message(
11376           p_app_name      => G_APP_NAME,
11377           p_msg_name      => G_QA_SUCCESS);
11378     END IF;
11379 
11380   EXCEPTION
11381 
11382      WHEN  G_EXCEPTION_HALT_VALIDATION THEN
11383         NULL; -- error reported, just exit from this process
11384      WHEN OTHERS THEN
11385        -- store SQL error message on message stack
11386        Okl_Api.SET_MESSAGE(
11387          p_app_name        => G_APP_NAME,
11388          p_msg_name        => G_UNEXPECTED_ERROR,
11389          p_token1	   => G_SQLCODE_TOKEN,
11390          p_token1_value    => SQLCODE,
11391          p_token2          => G_SQLERRM_TOKEN,
11392          p_token2_value    => SQLERRM);
11393 
11394        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
11395 
11396        IF check_subsidy_recourse%ISOPEN THEN
11397          CLOSE check_subsidy_recourse;
11398        END IF;
11399 
11400        IF check_refund_details%ISOPEN THEN
11401          CLOSE check_refund_details;
11402        END IF;
11403 
11404   END check_subsidies_errors;
11405 
11406 PROCEDURE check_subsidies(
11407             x_return_status OUT NOCOPY VARCHAR2,
11408             p_chr_id IN NUMBER) IS
11409 
11410   --p_api_version VARCHAR2(4000) := '1.0';
11411   p_init_msg_list VARCHAR2(4000) DEFAULT Okl_Api.G_FALSE;
11412   stored_subsidy_amount NUMBER;
11413   calc_subsidy_amount NUMBER;
11414   x_subsidy_amount NUMBER;
11415   x_msg_count NUMBER;
11416   x_msg_data  VARCHAR2(256);
11417   x_subsidized VARCHAR2(1);
11418 
11419   BEGIN
11420     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
11421 
11422     Okl_Subsidy_Process_Pvt.is_contract_subsidized(
11423                          p_api_version => 1.0,
11424                          p_init_msg_list => p_init_msg_list,
11425                          x_return_status => x_return_status,
11426                          x_msg_count => x_msg_count,
11427                          x_msg_data => x_msg_data,
11428                          p_chr_id => p_chr_id,
11429                          x_subsidized => x_subsidized);
11430 
11431     IF x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR THEN
11432       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11433     ELSIF x_return_status = Okl_Api.G_RET_STS_ERROR THEN
11434       RAISE Okl_Api.G_EXCEPTION_ERROR;
11435     END IF;
11436 
11437     IF (x_subsidized = Okl_Api.G_FALSE) THEN
11438       Okl_Api.set_message(
11439           p_app_name      => G_APP_NAME,
11440           p_msg_name      => G_QA_SUCCESS);
11441       RETURN;
11442     END IF;
11443 
11444     Okl_Subsidy_Process_Pvt.get_contract_subsidy_amount(p_api_version => 1.0,
11445                                           p_init_msg_list => Okl_Api.G_FALSE,
11446                                           x_return_status => x_return_status,
11447                                           x_msg_count => x_msg_count,
11448                                           x_msg_data => x_msg_data,
11449                                           p_chr_id => p_chr_id,
11450                                           x_subsidy_amount => x_subsidy_amount);
11451     IF x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR THEN
11452       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11453     ELSIF x_return_status = Okl_Api.G_RET_STS_ERROR THEN
11454       RAISE Okl_Api.G_EXCEPTION_ERROR;
11455     END IF;
11456 
11457     stored_subsidy_amount := x_subsidy_amount;
11458     Okl_Subsidy_Process_Pvt.calculate_contract_subsidy(p_api_version => 1.0,
11459                                           p_init_msg_list => Okl_Api.G_FALSE,
11460                                           x_return_status => x_return_status,
11461                                           x_msg_count => x_msg_count,
11462                                           x_msg_data => x_msg_data,
11463                                           p_chr_id => p_chr_id,
11464                                           x_subsidy_amount => x_subsidy_amount);
11465 
11466     IF x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR THEN
11467       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11468     ELSIF x_return_status = Okl_Api.G_RET_STS_ERROR THEN
11469       RAISE Okl_Api.G_EXCEPTION_ERROR;
11470     END IF;
11471 
11472     calc_subsidy_amount := x_subsidy_amount;
11473     IF (stored_subsidy_amount <> calc_subsidy_amount) THEN
11474         Okl_Api.set_message(
11475               p_app_name     => G_APP_NAME,
11476               p_msg_name     => 'OKL_SUBSIDY_AMOUNT_MATCH');
11477         x_return_status := Okl_Api.G_RET_STS_ERROR;
11478         RAISE G_EXCEPTION_HALT_VALIDATION;
11479     END IF;
11480 
11481     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
11482         Okl_Api.set_message(
11483           p_app_name      => G_APP_NAME,
11484           p_msg_name      => G_QA_SUCCESS);
11485     END IF;
11486 
11487   EXCEPTION
11488 
11489      WHEN  G_EXCEPTION_HALT_VALIDATION THEN
11490         NULL; -- error reported, just exit from this process
11491      WHEN OTHERS THEN
11492        -- store SQL error message on message stack
11493        Okl_Api.SET_MESSAGE(
11494          p_app_name        => G_APP_NAME,
11495          p_msg_name        => G_UNEXPECTED_ERROR,
11496          p_token1	   => G_SQLCODE_TOKEN,
11497          p_token1_value    => SQLCODE,
11498          p_token2          => G_SQLERRM_TOKEN,
11499          p_token2_value    => SQLERRM);
11500 
11501        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
11502 
11503   END;
11504 
11505   -- Start of comments
11506   --
11507   -- Procedure Name  : check_credit_line
11508   -- Description     :
11509   -- Business Rules  :
11510   -- Parameters      :
11511   -- Version         : 1.0
11512   -- End of comments
11513 
11514   PROCEDURE check_credit_line(
11515     x_return_status            OUT NOCOPY VARCHAR2,
11516     p_chr_id                   IN  NUMBER
11517   ) IS
11518 
11519     l_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11520     x_msg_count         NUMBER;
11521     x_msg_data          VARCHAR2(1000);
11522 
11523   BEGIN
11524     --
11525     -- Check credit lines
11526     --
11527     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
11528 
11529     Okl_La_Validation_Util_Pvt.validate_crdtln_wrng (
11530                          p_api_version    => 1.0,
11531                          p_init_msg_list  => Okl_Api.G_FALSE,
11532                          x_return_status  => l_return_status,
11533                          x_msg_count      => x_msg_count,
11534                          x_msg_data       => x_msg_data,
11535                          p_chr_id         => p_chr_id
11536                         );
11537 
11538     IF (l_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
11539        x_return_status := l_return_status;
11540     END IF;
11541 
11542     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
11543         Okl_Api.set_message(
11544           p_app_name      => G_APP_NAME,
11545           p_msg_name      => G_QA_SUCCESS);
11546     END IF;
11547 
11548   END check_credit_line;
11549 
11550   -- Start of comments
11551   --
11552   -- Procedure Name  : check_invoice_format
11553   -- Description     :
11554   -- Business Rules  :
11555   -- Parameters      :
11556   -- Version         : 1.0
11557   -- End of comments
11558 
11559   PROCEDURE check_invoice_format(
11560     x_return_status            OUT NOCOPY VARCHAR2,
11561     p_chr_id                   IN  NUMBER
11562   ) IS
11563 
11564     l_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11565     x_msg_count         NUMBER;
11566     x_msg_data          VARCHAR2(1000);
11567     l_invoice_format    OKC_RULES_B.RULE_INFORMATION1%TYPE;
11568 
11569     --Bug#3877032
11570     CURSOR l_invoice_format_csr IS
11571     SELECT rule.rule_information1
11572     FROM okc_rules_b rule,
11573          okc_rule_groups_b rgp
11574     WHERE rule.rgp_id = rgp.id
11575     AND   rgp.dnz_chr_id = p_chr_id
11576     AND   rgp.chr_id = p_chr_id
11577     AND   rgp.rgd_code = 'LABILL'
11578     AND   rule.rule_information_category = 'LAINVD';
11579 
11580   BEGIN
11581     --
11582     -- Check invoice format
11583     --
11584     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
11585 
11586     OPEN l_invoice_format_csr;
11587     FETCH l_invoice_format_csr INTO l_invoice_format;
11588     IF (l_invoice_format_csr%NOTFOUND OR l_invoice_format IS NULL) THEN
11589       x_return_status := Okl_Api.G_RET_STS_ERROR;
11590       Okl_Api.set_message(
11591             p_app_name     => G_APP_NAME,
11592             p_msg_name     => 'OKL_QA_NO_INV_FORMAT');
11593     END IF;
11594     CLOSE l_invoice_format_csr;
11595 
11596 
11597     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
11598         Okl_Api.set_message(
11599           p_app_name      => G_APP_NAME,
11600           p_msg_name      => G_QA_SUCCESS);
11601     END IF;
11602 
11603   END check_invoice_format;
11604 
11605   -- Start of comments
11606   --
11607   -- Procedure Name  : check_tax_book_mapping
11608   -- Description     : Checks if tax book mapping exists for the tax book
11609   --                   to identify it as 'FEDERAL' or 'STATE'.
11610   -- Business Rules  :
11611   -- Parameters      :
11612   -- Version         : 1.0
11613   -- End of comments
11614 
11615   PROCEDURE check_tax_book_mapping(
11616     x_return_status            OUT NOCOPY VARCHAR2,
11617     p_chr_id                   IN  NUMBER
11618   ) IS
11619 
11620     CURSOR l_assets_txl_lines IS
11621     SELECT txl.asset_number asset_num,
11622            fa.id fa_id,
11623            txd.tax_book
11624     FROM  okc_k_items cim,
11625           okc_k_lines_V fa,
11626           okc_line_styles_b fa_lse,
11627           OKL_TRX_ASSETS trx,
11628           okl_txl_assets_b  txl,
11629           okl_txd_assets_v  txd,
11630           okc_statuses_b sts
11631     WHERE  cim.cle_id = fa.id
11632     AND  cim.dnz_chr_id = p_chr_id
11633     AND  fa.lse_id      = fa_lse.id
11634     AND  txd.tal_id     = txl.id
11635     AND  txl.kle_id     = fa.id
11636     AND  txl.tas_id     = trx.id
11637     AND  fa_lse.lty_code = 'FIXED_ASSET'
11638     AND  fa.dnz_chr_id = cim.dnz_chr_id
11639     AND  sts.code = fa.sts_code
11640     AND  sts.ste_code NOT IN ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
11641     AND  trx.tsu_code = 'ENTERED'
11642     AND  txl.tal_type = 'CFA';
11643 
11644     --Bug#3877032
11645     CURSOR l_check_tax_map_for_asset(p_tax_book VARCHAR2 ) IS
11646     SELECT 'Y'
11647     FROM  okl_sgn_translations sgn
11648     WHERE sgn.jtot_object1_code = 'FA_BOOK_CONTROLS'
11649     AND   sgn.object1_id1       = p_tax_book
11650     AND   sgn.sgn_code = 'STMP';
11651 
11652     l_assets_txl_lines_rec l_assets_txl_lines%ROWTYPE;
11653     l_tax_mapping_found VARCHAR2(1) DEFAULT 'N';
11654     l_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11655 
11656   BEGIN
11657 
11658     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
11659 
11660     FOR l_assets_txl_lines_rec IN l_assets_txl_lines
11661     LOOP
11662       l_tax_mapping_found := 'N';
11663       OPEN l_check_tax_map_for_asset(l_assets_txl_lines_rec.tax_book);
11664       FETCH l_check_tax_map_for_asset INTO l_tax_mapping_found;
11665         IF (l_check_tax_map_for_asset%NOTFOUND) THEN
11666           Okl_Api.set_message(
11667               p_app_name     => G_APP_NAME,
11668               p_msg_name     => 'OKL_QA_NO_TAX_MAP',
11669               p_token1       => 'TAX_BOOK',
11670               p_token1_value => l_assets_txl_lines_rec.tax_book,
11671               p_token2       => 'ASSET_NUM',
11672               p_token2_value => l_assets_txl_lines_rec.asset_num);
11673           x_return_status := Okl_Api.G_RET_STS_ERROR;
11674         END IF;
11675       CLOSE l_check_tax_map_for_asset;
11676     END LOOP;
11677 
11678     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
11679         Okl_Api.set_message(
11680           p_app_name      => G_APP_NAME,
11681           p_msg_name      => G_QA_SUCCESS);
11682     END IF;
11683 
11684   EXCEPTION
11685   WHEN OTHERS THEN
11686     -- store SQL error message on message stack
11687     Okl_Api.SET_MESSAGE(
11688          p_app_name        => G_APP_NAME,
11689          p_msg_name        => G_UNEXPECTED_ERROR,
11690          p_token1	   => G_SQLCODE_TOKEN,
11691          p_token1_value    => SQLCODE,
11692          p_token2          => G_SQLERRM_TOKEN,
11693          p_token2_value    => SQLERRM);
11694 
11695     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
11696 
11697     IF l_check_tax_map_for_asset%ISOPEN THEN
11698       CLOSE l_check_tax_map_for_asset;
11699     END IF;
11700 
11701   END check_tax_book_mapping;
11702 
11703   --Bug# 3504680
11704   -- Start of comments
11705   --
11706   -- Procedure Name  : check_sales_type_lease
11707   -- Description     : Generates warning if the deal type is sales and the tax owner
11708   --                   is Lessee.
11709   -- Business Rules  :
11710   -- Parameters      :
11711   -- Version         : 1.0
11712   -- End of comments
11713 
11714   PROCEDURE check_sales_type_lease(
11715     x_return_status            OUT NOCOPY VARCHAR2,
11716     p_chr_id                   IN  NUMBER
11717   ) IS
11718 
11719     l_hdr      l_hdr_csr%ROWTYPE;
11720     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
11721     l_return_status	VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11722 
11723   BEGIN
11724 
11725     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
11726 
11727     OPEN  l_hdr_csr(p_chr_id);
11728     FETCH l_hdr_csr INTO l_hdr;
11729     IF l_hdr_csr%NOTFOUND THEN
11730        CLOSE l_hdr_csr;
11731        RAISE G_EXCEPTION_HALT_VALIDATION;
11732     END IF;
11733     CLOSE l_hdr_csr;
11734 
11735     OPEN  l_hdrrl_csr('LATOWN', 'LATOWN', TO_NUMBER(p_chr_id));
11736     FETCH l_hdrrl_csr INTO l_hdrrl_rec;
11737     CLOSE l_hdrrl_csr;
11738 
11739     IF ((INSTR( l_hdr.DEAL_TYPE,'ST') > 0 ) AND (l_hdrrl_rec.RULE_INFORMATION1 <> 'LESSEE')) THEN
11740         Okl_Api.set_message(
11741               p_app_name     => G_APP_NAME,
11742               p_msg_name     => 'OKL_QA_ST_LESSEE');
11743              -- notify caller of an error
11744         x_return_status := Okl_Api.G_RET_STS_ERROR;
11745     END IF;
11746 
11747     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
11748         Okl_Api.set_message(
11749           p_app_name      => G_APP_NAME,
11750           p_msg_name      => G_QA_SUCCESS);
11751     END IF;
11752 
11753   EXCEPTION
11754   WHEN OTHERS THEN
11755     -- store SQL error message on message stack
11756     Okl_Api.SET_MESSAGE(
11757          p_app_name        => G_APP_NAME,
11758          p_msg_name        => G_UNEXPECTED_ERROR,
11759          p_token1	   => G_SQLCODE_TOKEN,
11760          p_token1_value    => SQLCODE,
11761          p_token2          => G_SQLERRM_TOKEN,
11762          p_token2_value    => SQLERRM);
11763 
11764     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
11765 
11766     IF l_hdr_csr%ISOPEN THEN
11767       CLOSE l_hdr_csr;
11768     END IF;
11769 
11770     IF l_hdrrl_csr%ISOPEN THEN
11771       CLOSE l_hdrrl_csr;
11772     END IF;
11773 
11774   END check_sales_type_lease;
11775 
11776   -- Start of comments
11777   --
11778   -- Procedure Name  : check_payment_struct
11779   -- Description     : Bug 3325126,
11780   --                   Check for same payment amount in 2 consiqutive
11781   --                   payment line for LOAN, LOAN-REVOLVING contracts
11782   --                   and for contracts having financed fee line
11783   -- Business Rules  :
11784   -- Parameters      :
11785   -- Version         : 1.0
11786   -- End of comments
11787 
11788   PROCEDURE check_payment_struct (
11789     x_return_status            OUT NOCOPY VARCHAR2,
11790     p_chr_id                   IN  NUMBER
11791   ) IS
11792 
11793     l_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11794     x_msg_count         NUMBER;
11795     x_msg_data          VARCHAR2(1000);
11796     l_invoice_format    OKC_RULES_B.RULE_INFORMATION1%TYPE;
11797 
11798     CURSOR l_chr_csr (p_chr_id NUMBER) IS
11799     SELECT khr.id,
11800            khr.deal_type
11801     FROM   OKL_K_HEADERS khr
11802     WHERE  khr.id        = p_chr_id;
11803 
11804     CURSOR l_lne_csr (p_chr_id NUMBER) IS
11805     SELECT lne.id id,
11806            style.name line_type
11807     FROM   okc_k_lines_b lne,
11808            okc_line_styles_v style
11809     WHERE  dnz_chr_id = p_chr_id
11810     AND    style.id   = lne.lse_id;
11811 
11812     -- R12B Authoring OA Migration
11813     -- Validation of Sales Tax Financed Fee will be done
11814     -- after the Calculate Upfront Tax process
11815 
11816     CURSOR l_financed_csr (p_chr_id NUMBER) IS
11817     SELECT cle.id,
11818            style.name line_type
11819     FROM   okl_k_lines kle,
11820            okc_k_lines_b cle,
11821            okc_line_styles_v style
11822     WHERE  cle.dnz_chr_id = p_chr_id
11823     AND    cle.id         = kle.id
11824     AND    cle.lse_id     = style.id
11825     AND    kle.fee_type   = 'FINANCED'
11826     AND    NVL(kle.fee_purpose_code,'XXX') <> 'SALESTAX';
11827 
11828     --Bug#3877032
11829     CURSOR l_strm_slh_csr (p_khr_id OKC_K_HEADERS_B.ID%TYPE,
11830                            p_kle_id OKC_K_LINES_B.ID%TYPE) IS
11831     SELECT styt.name stream_type,
11832            rule.id rule_id,
11833            rgp.id rgp_id
11834     FROM   okc_rules_b rule,
11835            okc_rule_groups_b rgp,
11836            okl_strm_type_b sty,
11837            okl_strm_type_tl styt
11838     WHERE  NVL(rgp.cle_id, -1)            = p_kle_id
11839     AND    rgp.dnz_chr_id                 = p_khr_id
11840     AND    rgp.rgd_code                   = 'LALEVL'
11841     AND    rgp.id                         = rule.rgp_id
11842     AND    rule.rule_information_category = 'LASLH'
11843     AND    TO_NUMBER(rule.object1_id1)    = sty.id
11844     AND    styt.LANGUAGE                  = USERENV('LANG')
11845     AND    sty.id                         = styt.id;
11846 
11847     CURSOR l_strm_sll_csr (p_rule_id OKC_RULES_B.ID%TYPE,
11848                            p_rgp_id  OKC_RULE_GROUPS_B.ID%TYPE) IS
11849     SELECT Fnd_Date.canonical_to_date(sll.rule_information2) start_date,
11850            sll.rule_information1 seq,
11851            sll.rule_information6 amt,
11852            sll.rule_information7 stub_day,
11853            sll.rule_information13 rate
11854     FROM   okc_rules_b sll
11855     WHERE  sll.rgp_id                    = p_rgp_id
11856     AND    sll.object2_id1               = TO_CHAR(p_rule_id)
11857     AND    sll.rule_information_category = 'LASLL'
11858     ORDER BY 1,2;
11859 
11860     l_prev_pmnt NUMBER;
11861     l_prev_rate NUMBER; -- Bug 4766555
11862   BEGIN
11863     --
11864     -- Check payment lines for similar structure
11865     -- No 2 consecutive payment lines have same amount
11866     --
11867     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
11868 
11869     FOR l_chr_rec IN l_chr_csr (p_chr_id)
11870     LOOP
11871        IF (l_chr_rec.deal_type IN ('LOAN','LOAN-REVOLVING')) THEN
11872            FOR l_lne_rec IN l_lne_csr (p_chr_id)
11873            LOOP
11874               FOR l_strm_slh_rec IN l_strm_slh_csr (p_chr_id,
11875                                                     l_lne_rec.id)
11876               LOOP
11877                  l_prev_pmnt := NULL;
11878                  l_prev_rate := NULL; -- Bug 4766555
11879                  FOR l_strm_sll_rec IN l_strm_sll_csr (l_strm_slh_rec.rule_id,
11880                                                        l_strm_slh_rec.rgp_id)
11881                  LOOP
11882                     IF (l_strm_sll_rec.stub_day IS NOT NULL) THEN -- do not check
11883                         l_prev_pmnt := NULL; -- reset
11884                         l_prev_rate := NULL; -- reset
11885                     ELSE
11886                       -- Check payment amount here
11887                       IF (l_prev_pmnt = TO_NUMBER(NVL(l_strm_sll_rec.amt,'0')))
11888                         AND  -- Bug 4766555
11889                       (TO_NUMBER(NVL(l_prev_rate,0)) = TO_NUMBER(NVL(l_strm_sll_rec.rate,'0')))
11890                       THEN
11891                          -- Error
11892                          Okl_Api.set_message(
11893                                        G_APP_NAME,
11894                                        'OKL_QA_INVALID_PMNT',
11895                                        'LINE_TYPE',
11896                                        l_lne_rec.line_type,
11897                                        'PMNT_TYPE',
11898                                        l_strm_slh_rec.stream_type
11899                                       );
11900                          x_return_status := Okl_Api.G_RET_STS_ERROR;
11901                       ELSE
11902                          l_prev_pmnt := TO_NUMBER(NVL(l_strm_sll_rec.amt,'0'));
11903                          l_prev_rate := TO_NUMBER(NVL(l_strm_sll_rec.rate,'0'));
11904                       END IF; --check
11905 
11906                     END IF; --stub
11907                  END LOOP; --l_strm_sll_csr
11908 
11909               END LOOP; --l_strm_slh_csr
11910 
11911            END LOOP; --l_lne_csr
11912 
11913            -- Check the same for header payment, if any
11914            FOR l_strm_slh_rec IN l_strm_slh_csr (p_chr_id,
11915                                                  -1)
11916            LOOP
11917               l_prev_pmnt := NULL;
11918               FOR l_strm_sll_rec IN l_strm_sll_csr (l_strm_slh_rec.rule_id,
11919                                                     l_strm_slh_rec.rgp_id)
11920               LOOP
11921                  IF (l_strm_sll_rec.stub_day IS NOT NULL) THEN -- do not check
11922                      l_prev_pmnt := NULL; -- reset
11923                  ELSE
11924                    -- Check payment amount here
11925                    IF (l_prev_pmnt = TO_NUMBER(NVL(l_strm_sll_rec.amt,'0'))) THEN
11926                       -- Error
11927                       Okl_Api.set_message(
11928                                     G_APP_NAME,
11929                                     'OKL_QA_INVALID_PMNT_HDR',
11930                                     'PMNT_TYPE',
11931                                     l_strm_slh_rec.stream_type
11932                                    );
11933                       x_return_status := Okl_Api.G_RET_STS_ERROR;
11934                    ELSE
11935                       l_prev_pmnt := TO_NUMBER(NVL(l_strm_sll_rec.amt,'0'));
11936                    END IF; --check
11937 
11938                  END IF; --stub
11939               END LOOP; --l_strm_sll_csr
11940 
11941            END LOOP; --l_strm_slh_csr
11942        ELSE
11943 
11944            -- check for Financed Fee only
11945            FOR l_financed_rec IN l_financed_csr (p_chr_id)
11946            LOOP
11947               FOR l_strm_slh_rec IN l_strm_slh_csr (p_chr_id,
11948                                                     l_financed_rec.id)
11949               LOOP
11950                  l_prev_pmnt := NULL;
11951                  FOR l_strm_sll_rec IN l_strm_sll_csr (l_strm_slh_rec.rule_id,
11952                                                        l_strm_slh_rec.rgp_id)
11953                  LOOP
11954                     IF (l_strm_sll_rec.stub_day IS NOT NULL) THEN -- do not check
11955                         l_prev_pmnt := NULL; -- reset
11956                     ELSE
11957                       -- Check payment amount here
11958                       IF (l_prev_pmnt = TO_NUMBER(NVL(l_strm_sll_rec.amt,'0'))) THEN
11959                          -- Error
11960                          Okl_Api.set_message(
11961                                        G_APP_NAME,
11962                                        'OKL_QA_INVALID_PMNT',
11963                                        'LINE_TYPE',
11964                                        l_financed_rec.line_type,
11965                                        'PMNT_TYPE',
11966                                        l_strm_slh_rec.stream_type
11967                                       );
11968                          x_return_status := Okl_Api.G_RET_STS_ERROR;
11969                       ELSE
11970                          l_prev_pmnt := TO_NUMBER(NVL(l_strm_sll_rec.amt,'0'));
11971                       END IF; --check
11972 
11973                     END IF; --stub
11974                  END LOOP; --l_strm_sll_csr
11975 
11976               END LOOP; --l_strm_slh_csr
11977            END LOOP; --l_financed_csr
11978 
11979        END IF;-- deal_type
11980     END LOOP; --l_chr_csr;
11981 
11982     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
11983         Okl_Api.set_message(
11984           p_app_name      => G_APP_NAME,
11985           p_msg_name      => G_QA_SUCCESS);
11986     END IF;
11987 
11988  EXCEPTION
11989   WHEN OTHERS THEN
11990     -- store SQL error message on message stack
11991     Okl_Api.SET_MESSAGE(
11992          p_app_name        => G_APP_NAME,
11993          p_msg_name        => G_UNEXPECTED_ERROR,
11994          p_token1          => G_SQLCODE_TOKEN,
11995          p_token1_value    => SQLCODE,
11996          p_token2          => G_SQLERRM_TOKEN,
11997          p_token2_value    => SQLERRM);
11998 
11999     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
12000 
12001   END check_payment_struct;
12002 
12003   -- Start of comments
12004   --
12005   -- Procedure Name  : check_contract_dt_signed
12006   -- Description     : Bug 3670104,
12007   --                   Raise warning if contract signed date is not earlier than
12008   --                   contract start date.
12009   -- Business Rules  :
12010   -- Parameters      :
12011   -- Version         : 1.0
12012   -- End of comments
12013 
12014   PROCEDURE check_contract_dt_signed(
12015             x_return_status OUT NOCOPY VARCHAR2,
12016             p_chr_id IN NUMBER) IS
12017 
12018   l_hdr     l_hdr_csr%ROWTYPE;
12019 
12020   BEGIN
12021     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
12022 
12023     OPEN  l_hdr_csr(p_chr_id);
12024     FETCH l_hdr_csr INTO l_hdr;
12025     IF l_hdr_csr%NOTFOUND THEN
12026        CLOSE l_hdr_csr;
12027        RAISE G_EXCEPTION_HALT_VALIDATION;
12028     END IF;
12029     CLOSE l_hdr_csr;
12030 
12031     IF( l_hdr.DATE_SIGNED >= l_hdr.START_DATE) THEN
12032             Okl_Api.set_message(
12033               p_app_name     => G_APP_NAME,
12034               p_msg_name     => 'OKL_QA_DATESIGNED_LT_START');
12035              -- notify caller of an error
12036             x_return_status := Okl_Api.G_RET_STS_ERROR;
12037     END IF;
12038 
12039     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
12040         Okl_Api.set_message(
12041           p_app_name      => G_APP_NAME,
12042           p_msg_name      => G_QA_SUCCESS);
12043     END IF;
12044 
12045   EXCEPTION
12046 
12047      WHEN  G_EXCEPTION_HALT_VALIDATION THEN
12048         NULL; -- error reported, just exit from this process
12049      WHEN OTHERS THEN
12050        -- store SQL error message on message stack
12051        Okl_Api.SET_MESSAGE(
12052          p_app_name        => G_APP_NAME,
12053          p_msg_name        => G_UNEXPECTED_ERROR,
12054          p_token1	   => G_SQLCODE_TOKEN,
12055          p_token1_value    => SQLCODE,
12056          p_token2          => G_SQLERRM_TOKEN,
12057          p_token2_value    => SQLERRM);
12058 
12059        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
12060 
12061        IF l_hdr_csr%ISOPEN THEN
12062          CLOSE l_hdr_csr;
12063        END IF;
12064 
12065   END check_contract_dt_signed;
12066 
12067   --Bug# 4899328: Start
12068   -- Start of comments
12069   --
12070   -- Procedure Name  : check_asset_deprn_cost
12071   -- Description     : Displays a warning message if there is a difference
12072   --                   between the current depreciable cost in FA and the
12073   --                   depreciable cost updated/calculated during online rebook.
12074   -- Business Rules  :
12075   -- Parameters      :
12076   -- Version         : 1.0
12077   -- End of comments
12078 
12079   PROCEDURE check_asset_deprn_cost(
12080     x_return_status            OUT NOCOPY VARCHAR2,
12081     p_chr_id                   IN  NUMBER
12082   ) IS
12083 
12084     --cursor to check if the contract is undergoing on-line rebook
12085     cursor l_chk_rbk_csr(p_chr_id IN NUMBER) is
12086     SELECT '!'
12087     FROM   okc_k_headers_b CHR,
12088            okl_trx_contracts ktrx
12089     WHERE  ktrx.khr_id_new = chr.id
12090     AND    ktrx.tsu_code = 'ENTERED'
12091     AND    ktrx.rbr_code is NOT NULL
12092     AND    ktrx.tcn_type = 'TRBK'
12093 --rkuttiya added for 12.1.1 Multi GAAP
12094     AND    ktrx.representation_type = 'PRIMARY'
12095 --
12096     AND    chr.id = p_chr_id
12097     AND    chr.orig_system_source_code = 'OKL_REBOOK';
12098 
12099     l_rbk_khr      VARCHAR2(1) DEFAULT '?';
12100 
12101     cursor l_corp_book_csr(p_chr_id in number) is
12102     select txl.id                tal_id ,
12103            txl.asset_number      asset_number,
12104            fab.cost              original_cost,
12105            txl.depreciation_cost new_cost
12106     from   okl_trx_assets           trx,
12107            okl_txl_assets_b         txl,
12108            okc_k_lines_b            cleb,
12109            okc_statuses_b sts,
12110            fa_books      fab,
12111            fa_additions  fa
12112     where  trx.id             = txl.tas_id
12113     and    trx.tsu_code       = 'ENTERED'
12114     and    trx.tas_type       = 'CRB'
12115     and    txl.kle_id         = cleb.id
12116     and    txl.tal_type       = 'CRB'
12117     and    cleb.dnz_chr_id    = p_chr_id
12118     and    cleb.lse_id        = 42
12119     and    sts.code           = cleb.sts_code
12120     and    sts.ste_code NOT IN ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
12121     and    fab.book_type_code  = txl.corporate_book
12122     and    fab.asset_id        = fa.asset_id
12123     and    fa.asset_number     = txl.asset_number
12124     and    fab.transaction_header_id_out is null;
12125 
12126     cursor l_tax_book_csr(p_tal_id in number) is
12127     select txd.asset_number,
12128            txd.tax_book,
12129            txd.cost new_cost,
12130            fab.cost original_cost
12131     from   okl_txd_assets_b txd,
12132            fa_books      fab,
12133            fa_additions  fa
12134     where  txd.tal_id          = p_tal_id
12135     and    fab.book_type_code  = txd.tax_book
12136     and    fab.asset_id        = fa.asset_id
12137     and    fa.asset_number     = txd.asset_number
12138     and    fab.transaction_header_id_out is null;
12139 
12140   BEGIN
12141 
12142     x_return_status := OKL_API.G_RET_STS_SUCCESS;
12143 
12144     --check for rebook contract
12145     l_rbk_khr := '?';
12146     OPEN l_chk_rbk_csr (p_chr_id => p_chr_id);
12147     FETCH l_chk_rbk_csr INTO l_rbk_khr;
12148     CLOSE l_chk_rbk_csr;
12149 
12150     If l_rbk_khr = '!' Then
12151 
12152       For l_corp_book_rec In l_corp_book_csr(p_chr_id => p_chr_id)
12153       Loop
12154 
12155         If NVL(l_corp_book_rec.original_cost,0) <> NVL(l_corp_book_rec.new_cost,0) Then
12156 
12157           OKL_API.set_message(
12158               p_app_name     => G_APP_NAME,
12159               p_msg_name     => 'OKL_LA_DEPRN_COST_CHG',
12160               p_token1       => 'ASSET_NUMBER',
12161               p_token1_value => l_corp_book_rec.asset_number);
12162           x_return_status := OKL_API.G_RET_STS_ERROR;
12163 
12164         Else
12165 
12166           For l_tax_book_rec In l_tax_book_csr(p_tal_id => l_corp_book_rec.tal_id)
12167           Loop
12168 
12169             If NVL(l_tax_book_rec.original_cost,0) <> NVL(l_tax_book_rec.new_cost,0) Then
12170               OKL_API.set_message(
12171                 p_app_name     => G_APP_NAME,
12172                 p_msg_name     => 'OKL_LA_DEPRN_COST_CHG',
12173                 p_token1       => 'ASSET_NUMBER',
12174                 p_token1_value => l_tax_book_rec.asset_number);
12175               x_return_status := OKL_API.G_RET_STS_ERROR;
12176 
12177               Exit;
12178             End If;
12179 
12180           End Loop;
12181         End If;
12182       End Loop;
12183     End If;
12184 
12185     IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
12186         OKL_API.set_message(
12187           p_app_name      => G_APP_NAME,
12188           p_msg_name      => G_QA_SUCCESS);
12189     END IF;
12190 
12191   EXCEPTION
12192   WHEN OTHERS THEN
12193     -- store SQL error message on message stack
12194     OKL_API.SET_MESSAGE(
12195          p_app_name        => G_APP_NAME,
12196          p_msg_name        => G_UNEXPECTED_ERROR,
12197          p_token1	         => G_SQLCODE_TOKEN,
12198          p_token1_value    => SQLCODE,
12199          p_token2          => G_SQLERRM_TOKEN,
12200          p_token2_value    => SQLERRM);
12201 
12202     x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
12203 
12204   END check_asset_deprn_cost;
12205   --Bug# 4899328: End
12206 
12207   --Bug# 5032883: Start
12208   -- Start of comments
12209   --
12210   -- Procedure Name  : check_late_int_date
12211   -- Description     : Displays a warning message if the late interest date
12212   --                   : is earlier than contract start date
12213   -- Business Rules  :
12214   -- Parameters      :
12215   -- Version         : 1.0
12216   -- End of comments
12217 
12218   PROCEDURE check_late_int_date(
12219     x_return_status            OUT NOCOPY VARCHAR2,
12220     p_chr_id                   IN  NUMBER
12221   ) IS
12222      l_return_status     VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
12223      l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
12224      l_hdr      l_hdr_csr%ROWTYPE;
12225   BEGIN
12226 
12227     x_return_status := OKL_API.G_RET_STS_SUCCESS;
12228 
12229     OPEN  l_hdr_csr(p_chr_id);
12230     FETCH l_hdr_csr into l_hdr;
12231     IF l_hdr_csr%NOTFOUND THEN
12232        CLOSE l_hdr_csr;
12233        RAISE G_EXCEPTION_HALT_VALIDATION;
12234     END IF;
12235     CLOSE l_hdr_csr;
12236 
12237 
12238     OPEN  l_hdrrl_csr('LALIGR', 'LAHUDT', TO_NUMBER(p_chr_id));
12239     FETCH l_hdrrl_csr into l_hdrrl_rec;
12240 
12241     If(( l_hdrrl_csr%FOUND ) AND
12242        (l_hdrrl_rec.RULE_INFORMATION1 IS NOT NULL) AND
12243        (TRUNC( FND_DATE.canonical_to_date(l_hdrrl_rec.RULE_INFORMATION1)) < TRUNC(l_hdr.START_DATE) )) Then
12244             OKL_API.set_message(
12245               p_app_name     => G_APP_NAME,
12246               p_msg_name     => 'OKL_QA_LATE_INT_DATE');
12247              -- notify caller of an error
12248             x_return_status := OKL_API.G_RET_STS_ERROR;
12249     End If;
12250     CLOSE l_hdrrl_csr;
12251 
12252     IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
12253         OKL_API.set_message(
12254           p_app_name      => G_APP_NAME,
12255           p_msg_name      => G_QA_SUCCESS);
12256     END IF;
12257 
12258   EXCEPTION
12259   WHEN OTHERS THEN
12260     -- store SQL error message on message stack
12261     OKL_API.SET_MESSAGE(
12262          p_app_name        => G_APP_NAME,
12263          p_msg_name        => G_UNEXPECTED_ERROR,
12264          p_token1	         => G_SQLCODE_TOKEN,
12265          p_token1_value    => SQLCODE,
12266          p_token2          => G_SQLERRM_TOKEN,
12267          p_token2_value    => SQLERRM);
12268 
12269     x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
12270 
12271   END check_late_int_date;
12272   -- bug 5032883 end;
12273 
12274   --Bug# 5032883: Start
12275   -- Start of comments
12276   --
12277   -- Procedure Name  : check_late_charge_date
12278   -- Description     : Displays a warning message if the late interest date
12279   --                 : is earlier than contract start date
12280   -- Business Rules  :
12281   -- Parameters      :
12282   -- Version         : 1.0
12283   -- End of comments
12284 
12285   PROCEDURE check_late_charge_date(
12286     x_return_status            OUT NOCOPY VARCHAR2,
12287     p_chr_id                   IN  NUMBER
12288   ) IS
12289      l_return_status     VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
12290      l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
12291      l_hdr      l_hdr_csr%ROWTYPE;
12292   BEGIN
12293 
12294     x_return_status := OKL_API.G_RET_STS_SUCCESS;
12295 
12296     OPEN  l_hdr_csr(p_chr_id);
12297     FETCH l_hdr_csr into l_hdr;
12298     IF l_hdr_csr%NOTFOUND THEN
12299        CLOSE l_hdr_csr;
12300        RAISE G_EXCEPTION_HALT_VALIDATION;
12301     END IF;
12302     CLOSE l_hdr_csr;
12303 
12304 
12305     OPEN  l_hdrrl_csr('LALCGR', 'LAHUDT', TO_NUMBER(p_chr_id));
12306     FETCH l_hdrrl_csr into l_hdrrl_rec;
12307 
12308     If(( l_hdrrl_csr%FOUND ) AND
12309        (l_hdrrl_rec.RULE_INFORMATION1 IS NOT NULL) AND
12310        ( TRUNC(FND_DATE.canonical_to_date(l_hdrrl_rec.RULE_INFORMATION1)) < TRUNC(l_hdr.START_DATE) )) Then
12311             OKL_API.set_message(
12312               p_app_name     => G_APP_NAME,
12313               p_msg_name     => 'OKL_QA_LATE_CH_DATE');
12314              -- notify caller of an error
12315             x_return_status := OKL_API.G_RET_STS_ERROR;
12316     End If;
12317     CLOSE l_hdrrl_csr;
12318 
12319     IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
12320         OKL_API.set_message(
12321           p_app_name      => G_APP_NAME,
12322           p_msg_name      => G_QA_SUCCESS);
12323     END IF;
12324 
12325   EXCEPTION
12326   WHEN OTHERS THEN
12327     -- store SQL error message on message stack
12328     OKL_API.SET_MESSAGE(
12329          p_app_name        => G_APP_NAME,
12330          p_msg_name        => G_UNEXPECTED_ERROR,
12331          p_token1	         => G_SQLCODE_TOKEN,
12332          p_token1_value    => SQLCODE,
12333          p_token2          => G_SQLERRM_TOKEN,
12334          p_token2_value    => SQLERRM);
12335 
12336     x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
12337 
12338   END check_late_charge_date;
12339   -- bug 5032883 end;
12340 
12341 --akrangan  bug 5362977 starts
12342  -- Start of comments
12343      --
12344      -- Procedure Name  : check_asset_category
12345      -- Description     : Displays a warning message if the inventory item has
12346      --                   changed during rebook and the asset category is not
12347      --                   the default for the newly selected item.
12348      -- Business Rules  :
12349      -- Parameters      :
12350      -- Version         : 1.0
12351      -- End of comments
12352 
12353      PROCEDURE check_asset_category(
12354        x_return_status            OUT NOCOPY VARCHAR2,
12355        p_chr_id                   IN  NUMBER
12356      ) IS
12357 
12358        --cursor to check if the contract is undergoing on-line rebook
12359        cursor l_chk_rbk_csr(p_chr_id IN NUMBER) is
12360        SELECT '!',
12361               chr.orig_system_id1
12362        FROM   okc_k_headers_b CHR,
12363               okl_trx_contracts ktrx
12364        WHERE  ktrx.khr_id_new = chr.id
12365        AND    ktrx.tsu_code = 'ENTERED'
12366        AND    ktrx.rbr_code is NOT NULL
12367        AND    ktrx.tcn_type = 'TRBK'
12368 --rkuttiya added for 12.1.1 Multi GAAP
12369        and    ktrx.representation_type = 'PRIMARY'
12370 --
12371        AND    chr.id = p_chr_id
12372        AND    chr.orig_system_source_code = 'OKL_REBOOK';
12373 
12374        l_rbk_khr      VARCHAR2(1) DEFAULT '?';
12375        l_orig_chr_id  okc_k_headers_b.id%TYPE;
12376 
12377        CURSOR l_fin_ast_cle_csr (p_chr_id IN NUMBER) IS
12378        SELECT cle.id,
12379               cle.orig_system_id1
12380        FROM  okc_k_lines_b  cle,
12381              okc_statuses_b sts
12382        WHERE cle.chr_id = p_chr_id
12383        AND   cle.lse_id = 33  --Financial Asset Line
12384        and   sts.code = cle.sts_code
12385        and   sts.ste_code NOT IN ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
12386 
12387        CURSOR l_sub_line_csr(p_chr_id   IN NUMBER
12388                             ,p_lty_code IN VARCHAR2
12389                             ,p_cle_id   IN NUMBER) IS
12390        SELECT cle.id,
12391               cim.object1_id1,
12392               cim.object1_id2
12393        FROM   okc_k_lines_b  cle,
12394               okc_k_items cim,
12395               okc_line_styles_b lse,
12396               okc_statuses_b sts
12397        WHERE cle.dnz_chr_id = p_chr_id
12398        AND   cle.cle_id = p_cle_id
12399        AND   cle.lse_id = lse.id
12400        AND   lse.lty_code = p_lty_code
12401        AND   cim.cle_id = cle.id
12402        AND   cim.dnz_chr_id = cle.dnz_chr_id
12403        AND   sts.code = cle.sts_code
12404        AND   sts.ste_code NOT IN ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
12405 
12406        l_orig_model_line_rec l_sub_line_csr%ROWTYPE;
12407        l_rbk_model_line_rec  l_sub_line_csr%ROWTYPE;
12408        l_fa_line_rec    l_sub_line_csr%ROWTYPE;
12409 
12410        CURSOR l_inv_item_csr(p_inv_item_id IN NUMBER,
12411                              p_org_id IN NUMBER) IS
12412        SELECT asset_category_id
12413        FROM mtl_system_items
12414        WHERE inventory_item_id = p_inv_item_id
12415        AND organization_id = p_org_id;
12416 
12417        l_inv_item_rec l_inv_item_csr%ROWTYPE;
12418 
12419        CURSOR l_fa_csr(p_asset_id IN NUMBER) IS
12420        SELECT asset_category_id,
12421               asset_number
12422        FROM fa_additions
12423        WHERE asset_id = p_asset_id;
12424 
12425        l_fa_rec l_fa_csr%ROWTYPE;
12426 
12427      BEGIN
12428 
12429        x_return_status := OKL_API.G_RET_STS_SUCCESS;
12430 
12431        --check for rebook contract
12432        l_rbk_khr := '?';
12433        OPEN l_chk_rbk_csr (p_chr_id => p_chr_id);
12434        FETCH l_chk_rbk_csr INTO l_rbk_khr,l_orig_chr_id;
12435        CLOSE l_chk_rbk_csr;
12436 
12437        If l_rbk_khr = '!' Then
12438 
12439          For l_fin_ast_cle_rec In l_fin_ast_cle_csr(p_chr_id => p_chr_id)
12440          Loop
12441 
12442            OPEN l_sub_line_csr(p_chr_id => p_chr_id,
12443                                p_lty_code => 'ITEM',
12444                                p_cle_id => l_fin_ast_cle_rec.id);
12445            FETCH l_sub_line_csr INTO l_rbk_model_line_rec;
12446            CLOSE l_sub_line_csr;
12447 
12448            OPEN l_sub_line_csr(p_chr_id => l_orig_chr_id,
12449                                p_lty_code => 'ITEM',
12450                                p_cle_id => l_fin_ast_cle_rec.orig_system_id1);
12451            FETCH l_sub_line_csr INTO l_orig_model_line_rec;
12452            CLOSE l_sub_line_csr;
12453 
12454            -- Inventory Item has been changed during Rebook
12455            IF (l_orig_model_line_rec.object1_id1 <> l_rbk_model_line_rec.object1_id1) THEN
12456 
12457              OPEN l_sub_line_csr(p_chr_id => l_orig_chr_id,
12458                                  p_lty_code => 'FIXED_ASSET',
12459                                  p_cle_id => l_fin_ast_cle_rec.orig_system_id1);
12460              FETCH l_sub_line_csr INTO l_fa_line_rec;
12461              CLOSE l_sub_line_csr;
12462 
12463              OPEN l_inv_item_csr(p_inv_item_id => TO_NUMBER(l_rbk_model_line_rec.object1_id1),
12464                                  p_org_id      => TO_NUMBER(l_rbk_model_line_rec.object1_id2));
12465              FETCH l_inv_item_csr INTO l_inv_item_rec;
12466              CLOSE l_inv_item_csr;
12467 
12468              OPEN l_fa_csr(p_asset_id => TO_NUMBER(l_fa_line_rec.object1_id1));
12469              FETCH l_fa_csr INTO l_fa_rec;
12470              CLOSE l_fa_csr;
12471 
12472              -- Existing Asset Category is different from the Default Asset Category
12473              -- for the new Inventory Item.
12474              IF (l_inv_item_rec.asset_category_id IS NOT NULL AND
12475                  l_inv_item_rec.asset_category_id <> l_fa_rec.asset_category_id) THEN
12476 
12477                OKL_API.set_message(
12478                  p_app_name     => G_APP_NAME,
12479                  p_msg_name     => 'OKL_QA_DFLT_ASSET_CATEGORY',
12480                  p_token1       => 'ASSET_NUMBER',
12481                  p_token1_value => l_fa_rec.asset_number);
12482                x_return_status := OKL_API.G_RET_STS_ERROR;
12483 
12484              END IF;
12485            END IF;
12486          End Loop;
12487        End If;
12488 
12489        IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
12490            OKL_API.set_message(
12491              p_app_name      => G_APP_NAME,
12492              p_msg_name      => G_QA_SUCCESS);
12493        END IF;
12494 
12495      EXCEPTION
12496      WHEN OTHERS THEN
12497        -- store SQL error message on message stack
12498        OKL_API.SET_MESSAGE(
12499             p_app_name        => G_APP_NAME,
12500             p_msg_name        => G_UNEXPECTED_ERROR,
12501             p_token1                => G_SQLCODE_TOKEN,
12502             p_token1_value    => SQLCODE,
12503             p_token2          => G_SQLERRM_TOKEN,
12504             p_token2_value    => SQLERRM);
12505 
12506        x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
12507 
12508      END check_asset_category;
12509 
12510 --akrangan  bug 5362977 ends
12511 
12512 -- rviriyal Bug# 5982201 Start
12513      -- Start of comments
12514      --
12515      -- Procedure Name  : check_vendor_active
12516      -- Description     : Displays an error message if the vendor on the contract is
12517      --                   not active on start date of the contract
12518      -- Business Rules  :
12519      -- Parameters      :
12520      -- Version         : 1.0
12521      -- End of comments
12522    procedure check_vendor_active(
12523                x_return_status OUT NOCOPY VARCHAR2,
12524                p_chr_id IN NUMBER) AS
12525 
12526        cnt_start_date DATE;
12527        cnt_end_date DATE;
12528        vend_start_date DATE;
12529        vend_end_date DATE;
12530        vend_name varchar(240);
12531 
12532    begin
12533        x_return_status := Okl_Api.G_RET_STS_SUCCESS;
12534 
12535        open contract_dtls(p_chr_id);
12536        fetch contract_dtls into cnt_start_date, cnt_end_date;
12537        close contract_dtls;
12538 
12539        for vendor_rec in party_id_csr('OKL_VENDOR', p_chr_id)
12540        loop
12541            open vend_dtls(vendor_rec.OBJECT1_ID1);
12542            fetch vend_dtls into vend_start_date, vend_end_date, vend_name;
12543            close vend_dtls;
12544 
12545        --bug 7213709 start
12546        If vend_end_date is not null then
12547          if (trunc(vend_end_date)>=trunc(cnt_start_date)
12548             and trunc(vend_end_date)<=trunc(cnt_end_date) )
12549             or (trunc(vend_end_date)<trunc(cnt_start_date)) then
12550               Okl_Api.set_message(
12551                   p_app_name     => G_APP_NAME,
12552                   p_msg_name     => 'OKL_QA_VNDR_START_DT',
12553                   p_token1       => 'NAME',
12554                   p_token1_value =>  vend_name);
12555                x_return_status := Okl_Api.G_RET_STS_ERROR;
12556         end if;
12557        end if;
12558 
12559        /*
12560            if( trunc(cnt_start_date) < trunc(vend_start_date) OR
12561                (trunc(cnt_start_date) >= trunc(vend_start_date) AND
12562                 trunc(cnt_start_date) >  trunc(vend_end_date))
12563              )THEN
12564              Okl_Api.set_message(
12565                      p_app_name     => G_APP_NAME,
12566                      p_msg_name     => 'OKL_QA_VNDR_START_DT',
12567                      p_token1       => 'NAME',
12568                      p_token1_value =>  vend_name);
12569                   x_return_status := Okl_Api.G_RET_STS_ERROR;
12570            end if;
12571         */
12572        --bug 7213709 end
12573 
12574        end loop;
12575 
12576        IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
12577            OKL_API.set_message(
12578              p_app_name      => G_APP_NAME,
12579              p_msg_name      => G_QA_SUCCESS);
12580        END IF;
12581 
12582        EXCEPTION
12583         WHEN OTHERS THEN
12584        -- store SQL error message on message stack
12585         OKL_API.SET_MESSAGE(
12586             p_app_name        => G_APP_NAME,
12587             p_msg_name        => G_UNEXPECTED_ERROR,
12588             p_token1                => G_SQLCODE_TOKEN,
12589             p_token1_value    => SQLCODE,
12590             p_token2          => G_SQLERRM_TOKEN,
12591             p_token2_value    => SQLERRM);
12592 
12593            x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
12594    End check_vendor_active;
12595 
12596    -- Start of comments
12597      --
12598      -- Procedure Name  : check_vendor_end_date
12599      -- Description     : Displays a warning message if the vendor on the contract
12600      --                   becomes inactive before the end date of the contract
12601      -- Business Rules  :
12602      -- Parameters      :
12603      -- Version         : 1.0
12604      -- End of comments
12605    procedure check_vendor_end_date(
12606                x_return_status OUT NOCOPY VARCHAR2,
12607                p_chr_id IN NUMBER) AS
12608 
12609        cnt_start_date DATE;
12610        cnt_end_date DATE;
12611        vend_start_date DATE;
12612        vend_end_date DATE;
12613        vend_name varchar(240);
12614 
12615    begin
12616 
12617        x_return_status := Okl_Api.G_RET_STS_SUCCESS;
12618        open contract_dtls(p_chr_id);
12619        fetch contract_dtls into cnt_start_date, cnt_end_date;
12620        close contract_dtls;
12621 
12622        for vendor_rec in party_id_csr('OKL_VENDOR', p_chr_id)
12623        loop
12624            open vend_dtls(vendor_rec.OBJECT1_ID1);
12625            fetch vend_dtls into vend_start_date, vend_end_date, vend_name;
12626            close vend_dtls;
12627 
12628            if( trunc(cnt_start_date) >= trunc(vend_start_date) AND
12629                trunc(cnt_start_date) <=  trunc(vend_end_date)  AND
12630                trunc(cnt_end_date) >    trunc(vend_end_date)
12631              )THEN
12632 
12633               Okl_Api.set_message(
12634                      p_app_name     => G_APP_NAME,
12635                      p_msg_name     => 'OKL_QA_VNDR_END_DT',
12636                      p_token1       => 'NAME',
12637                      p_token1_value =>  vend_name,
12638                      p_token2       => 'VNDR_END_DT',
12639                      p_token2_value =>  to_char(vend_end_date));
12640                   x_return_status := Okl_Api.G_RET_STS_ERROR;
12641 
12642 
12643            end if;
12644 
12645        end loop;
12646 
12647        IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
12648            OKL_API.set_message(
12649              p_app_name      => G_APP_NAME,
12650              p_msg_name      => G_QA_SUCCESS);
12651        END IF;
12652 
12653        EXCEPTION
12654         WHEN OTHERS THEN
12655        -- store SQL error message on message stack
12656         OKL_API.SET_MESSAGE(
12657             p_app_name        => G_APP_NAME,
12658             p_msg_name        => G_UNEXPECTED_ERROR,
12659             p_token1                => G_SQLCODE_TOKEN,
12660             p_token1_value    => SQLCODE,
12661             p_token2          => G_SQLERRM_TOKEN,
12662             p_token2_value    => SQLERRM);
12663 
12664            x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
12665    End check_vendor_end_date;
12666 
12667    -- Start of comments
12668      --
12669      -- Procedure Name  : check_cust_active
12670      -- Description     : Displays an error message if customer and/or customer account
12671      --                   selected on the contract are inactive.
12672      -- Business Rules  :
12673      -- Parameters      :
12674      -- Version         : 1.0
12675      -- End of comments
12676    procedure check_cust_active(
12677                x_return_status OUT NOCOPY VARCHAR2,
12678                p_chr_id IN NUMBER) AS
12679 
12680        cursor cust_dtls(OBJECT1_ID1 NUMBER) is
12681        select STATUS, name
12682        from OKX_PARTIES_V
12683        where Id1 = OBJECT1_ID1;
12684 
12685        cust_status varchar(1);
12686        cust_name varchar(240);
12687 
12688        cursor cust_acct_dtls(p_chr_id NUMBER) is
12689        select STATUS, DESCRIPTION
12690        from OKX_CUSTOMER_ACCOUNTS_V
12691        where Id1 = (select cust_acct_id from okc_k_headers_b where id =p_chr_id);
12692 
12693        cust_acct_status varchar(1);
12694        cust_acct_desc varchar(30);
12695 
12696    begin
12697        x_return_status := Okl_Api.G_RET_STS_SUCCESS;
12698 
12699        for party_rec in party_id_csr('LESSEE', p_chr_id)
12700        loop
12701            open cust_dtls(party_rec.OBJECT1_ID1);
12702            fetch cust_dtls into cust_status, cust_name;
12703            close cust_dtls;
12704 
12705            if( cust_status is not null AND cust_status <> 'A')THEN
12706              Okl_Api.set_message(
12707                      p_app_name     => G_APP_NAME,
12708                      p_msg_name     => 'OKL_QA_CUST_NOT_ACTIVE'
12709                      );
12710                   x_return_status := Okl_Api.G_RET_STS_ERROR;
12711 
12712            end if;
12713 
12714        end loop;
12715        IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
12716            open cust_acct_dtls(p_chr_id);
12717            fetch cust_acct_dtls into cust_acct_status, cust_acct_desc;
12718            close cust_acct_dtls;
12719 
12720            if(cust_acct_status is not null and cust_acct_status <> 'A')THEN
12721 
12722               Okl_Api.set_message(
12723                      p_app_name     => G_APP_NAME,
12724                      p_msg_name     => 'OKL_QA_CUST_ACCT_INACTIVE',
12725                      p_token1       => 'ACCT',
12726                      p_token1_value =>  cust_acct_desc
12727                     );
12728                   x_return_status := Okl_Api.G_RET_STS_ERROR;
12729 
12730 
12731            end if;
12732        END IF;
12733 
12734        IF x_return_status = OKL_API.G_RET_STS_SUCCESS THEN
12735            OKL_API.set_message(
12736              p_app_name      => G_APP_NAME,
12737              p_msg_name      => G_QA_SUCCESS);
12738        END IF;
12739 
12740        EXCEPTION
12741         WHEN OTHERS THEN
12742        -- store SQL error message on message stack
12743         OKL_API.SET_MESSAGE(
12744             p_app_name        => G_APP_NAME,
12745             p_msg_name        => G_UNEXPECTED_ERROR,
12746             p_token1                => G_SQLCODE_TOKEN,
12747             p_token1_value    => SQLCODE,
12748             p_token2          => G_SQLERRM_TOKEN,
12749             p_token2_value    => SQLERRM);
12750 
12751            x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
12752    End check_cust_active;
12753    --rviriyal Bug# 5982201 End
12754    -- Start of comments
12755   --
12756   -- Procedure Name  : check_book_class_cmptblty
12757   -- Description     : Bug 6711559  ,
12758   --                   Raise Warning Message if the Present Value of rent is
12759   --                   the same or higher than the Asset Comparison amount.
12760   --                   The message should read "Present Value of Rent is 90% or
12761   --                   higher than Fair Value of Assets.  This is inconsistent
12762   --                   with Operating Lease Product ZZZ".
12763   -- Business Rules  :
12764   -- Parameters      :
12765   -- Version         : 1.0
12766   -- End of comments
12767 
12768   PROCEDURE check_book_class_cmptblty(
12769             x_return_status OUT NOCOPY VARCHAR2,
12770             p_chr_id IN NUMBER) IS
12771 
12772   l_hdr     l_hdr_csr%ROWTYPE;
12773   x_msg_count         NUMBER;
12774   x_msg_data          VARCHAR2(1000);
12775   x_total_pv_rent     NUMBER;
12776   x_fair_value_assets NUMBER;
12777 
12778 
12779  CURSOR chk_product_status (p_chr_id IN NUMBER) IS
12780              SELECT
12781               pdt.name
12782         FROM  okl_products_v    pdt
12783               ,okl_k_headers_v  khr
12784               ,okc_k_headers_b  CHR
12785         WHERE  1=1
12786         AND    khr.id = p_chr_id
12787         AND    pdt_id = pdt.id
12788         AND    khr.id = CHR.id;
12789 
12790          l_product_name  okl_products_v.NAME%TYPE;
12791          l_lne     l_lne_csr%ROWTYPE;
12792 
12793   BEGIN
12794     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
12795 
12796     OPEN  l_hdr_csr(p_chr_id);
12797     FETCH l_hdr_csr INTO l_hdr;
12798     IF l_hdr_csr%NOTFOUND THEN
12799        CLOSE l_hdr_csr;
12800        RAISE G_EXCEPTION_HALT_VALIDATION;
12801     END IF;
12802     CLOSE l_hdr_csr;
12803 
12804     OPEN chk_product_status (p_chr_id);
12805     FETCH chk_product_status INTO l_product_name;
12806     CLOSE chk_product_status;
12807 
12808     OPEN  l_lne_csr('FREE_FORM1', p_chr_id);
12809     FETCH l_lne_csr INTO l_lne;
12810     IF ( l_lne_csr%NOTFOUND ) THEN
12811             Okl_Api.set_message(
12812               p_app_name     => G_APP_NAME,
12813               p_msg_name     => 'OKL_QA_NO_ASSETS');
12814              -- notify caller of an error
12815             x_return_status := Okl_Api.G_RET_STS_ERROR;
12816 
12817    ELSE
12818 
12819     OKL_GENERATE_PV_RENT_PVT.generate_total_pv_rent
12820        (p_api_version => 1.0
12821        ,p_init_msg_list  => Okl_Api.G_FALSE
12822        ,p_khr_id         =>   p_chr_id
12823        ,x_total_pv_rent  =>    x_total_pv_rent
12824        ,x_return_status => x_return_status
12825        ,x_msg_count => x_msg_count
12826        ,x_msg_data => x_msg_data
12827        );
12828 
12829     IF x_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
12830         RAISE G_EXCEPTION_HALT_VALIDATION;
12831     END IF;
12832 
12833     OKL_EXECUTE_FORMULA_PUB.EXECUTE(p_api_version   =>1.0
12834                                    ,p_init_msg_list => Okl_Api.G_FALSE
12835                                    ,x_return_status =>x_return_status
12836                                    ,x_msg_count     =>x_msg_count
12837                                    ,x_msg_data      =>x_msg_data
12838                                    ,p_formula_name  =>'FAIR_VALUE_ASSETS'
12839                                    ,p_contract_id   =>p_chr_id
12840                                    ,x_value         =>x_fair_value_assets);
12841 
12842     IF x_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
12843         RAISE G_EXCEPTION_HALT_VALIDATION;
12844     END IF;
12845 
12846     x_fair_value_assets := x_fair_value_assets * 0.9;
12847   IF (l_hdr.DEAL_TYPE = 'LEASEOP') THEN
12848       IF (x_total_pv_rent >= x_fair_value_assets) THEN
12849        Okl_Api.set_message(
12850            p_app_name        => G_APP_NAME,
12851            p_msg_name        => 'OKL_QA_OP_FASB_MSG',
12852            p_token1	         => 'PRODUCT_NAME',
12853            p_token1_value    => l_product_name);
12854 
12855        x_return_status := Okl_Api.G_RET_STS_ERROR;
12856 
12857        END IF;
12858     ELSIF (l_hdr.DEAL_TYPE IN  ('LEASEDF','LEASEST')) THEN
12859       IF (x_total_pv_rent < x_fair_value_assets) THEN
12860 
12861        Okl_Api.set_message(
12862            p_app_name        => G_APP_NAME,
12863            p_msg_name        => 'OKL_QA_DF_FASB_MSG',
12864            p_token1	         => 'PRODUCT_NAME',
12865            p_token1_value    => l_product_name);
12866 
12867        x_return_status := Okl_Api.G_RET_STS_ERROR;
12868 
12869        END IF;
12870      END IF;
12871  END IF;
12872     CLOSE l_lne_csr;
12873     IF x_return_status = Okl_Api.G_RET_STS_SUCCESS THEN
12874         Okl_Api.set_message(
12875           p_app_name      => G_APP_NAME,
12876           p_msg_name      => G_QA_SUCCESS);
12877     END IF;
12878 
12879   EXCEPTION
12880 
12881      WHEN  G_EXCEPTION_HALT_VALIDATION THEN
12882         x_return_status := Okl_Api.G_RET_STS_ERROR;
12883         IF l_hdr_csr%ISOPEN THEN
12884 	   CLOSE l_hdr_csr;
12885 	END IF;
12886        IF l_lne_csr%ISOPEN THEN
12887 	   CLOSE l_lne_csr;
12888        END IF;
12889        IF chk_product_status%ISOPEN THEN
12890 	   CLOSE chk_product_status;
12891        END IF;
12892 
12893         -- error reported, just exit from this process
12894      WHEN OTHERS THEN
12895        -- store SQL error message on message stack
12896        Okl_Api.SET_MESSAGE(
12897          p_app_name        => G_APP_NAME,
12898          p_msg_name        => G_UNEXPECTED_ERROR,
12899          p_token1	   => G_SQLCODE_TOKEN,
12900          p_token1_value    => SQLCODE,
12901          p_token2          => G_SQLERRM_TOKEN,
12902          p_token2_value    => SQLERRM);
12903 
12904        x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
12905 
12906         IF l_hdr_csr%ISOPEN THEN
12907 	   CLOSE l_hdr_csr;
12908 	END IF;
12909        IF l_lne_csr%ISOPEN THEN
12910 	   CLOSE l_lne_csr;
12911        END IF;
12912        IF chk_product_status%ISOPEN THEN
12913 	   CLOSE chk_product_status;
12914        END IF;
12915 
12916 
12917   END check_book_class_cmptblty;
12918 
12919 
12920 END Okl_Qa_Data_Integrity;