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