DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKL_SEEDED_FUNCTIONS_PVT

Source


1 PACKAGE BODY      Okl_Seeded_Functions_Pvt AS
2 /* $Header: OKLRSFFB.pls 120.125.12010000.7 2009/01/12 23:24:25 apaul 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 
8 -- mvasudev, 10/10/2003
9 ----------------------------------------------------------------------------
10 -- Global Constants
11 ----------------------------------------------------------------------------
12  G_FINAL_DATE   CONSTANT    DATE    	:= TO_DATE('1','j') + 5300000;
13 
14 ----------------------------------------------------------------------------
15 -- Procedures and Functions
16 ----------------------------------------------------------------------------
17 
18 ---------------------------------------------------------------------------
19 -- Start of Comments
20 --  FUNCTION: INS_MONTHLY_PREMIUM
21 --  DESC   : It returns monthly insurance premium
22 --  IN     : p_contract_id ,p_contract_line_id
23 --  OUT    : Monthly Premium
24 -- Created By: Dalip Khandel        (dkhandel)
25 -- Version: 1.0
26 -- End of Commnets
27 ----------------------------------------------------------------------------------------------------
28 
29 FUNCTION INS_MONTHLY_PREMIUM(
30  p_contract_id                   IN NUMBER
31  ,p_contract_line_id             IN NUMBER
32 ) RETURN NUMBER
33 IS
34   l_amount NUMBER := 0;
35   ls_payment_freq VARCHAR2(30) ;
36   l_monthly_premium NUMBER := 0;
37   l_freq_factor  NUMBER := 0;
38   date_to   DATE ;
39   date_from DATE ;
40 
41   CURSOR c_monthly_premium (p_contract_id  NUMBER,p_contract_line_id NUMBER )
42   IS
43   SELECT PREMIUM , IPF_CODE, DATE_TO , DATE_FROM
44   FROM OKL_INS_POLICIES_B IPYB
45   WHERE IPYB.kle_id = p_contract_line_id
46   AND IPYB.khr_id = p_contract_id  ;
47 
48 BEGIN
49 
50   OPEN c_monthly_premium (p_contract_id,p_contract_line_id );
51     FETCH c_monthly_premium INTO l_amount, ls_payment_freq, date_to, date_from;
52     IF(c_monthly_premium%NOTFOUND) THEN
53          Okc_Api.set_message(G_APP_NAME, G_INVALID_CONTRACT_LINE,
54          G_COL_NAME_TOKEN,p_contract_line_id);
55         -- x_return_status := OKC_API.G_RET_STS_ERROR ;
56          CLOSE c_monthly_premium ;
57          RAISE OKC_API.G_EXCEPTION_ERROR;
58    END IF ;
59    CLOSE c_monthly_premium;
60 
61   	IF(ls_payment_freq = 'MONTHLY') THEN
62 		l_freq_factor := 1;
63 	ELSIF(ls_payment_freq = 'BI_MONTHLY') THEN
64 		l_freq_factor := 1/2;
65 	ELSIF(ls_payment_freq = 'HALF_YEARLY') THEN
66 	   l_freq_factor := 6;	--- ETC.
67 	ELSIF(ls_payment_freq = 'QUARTERLY') THEN
68 	 	l_freq_factor := 3;
69 	ELSIF(ls_payment_freq = 'YEARLY') THEN
70 	 	l_freq_factor := 12;
71 	ELSIF(ls_payment_freq = 'LUMP_SUM') THEN
72                 -- Bug# 4056484 PAGARG removing rounding
73 	 	l_freq_factor :=   MONTHS_BETWEEN( date_to,date_from);
74 	END IF;
75     l_monthly_premium   := l_amount / l_freq_factor ;
76   RETURN l_monthly_premium;
77   EXCEPTION
78     WHEN OTHERS THEN
79       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
80                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
81                           p_token1        => 'OKL_SQLCODE',
82                           p_token1_value  => SQLCODE,
83                           p_token2        => 'OKL_SQLERRM',
84                           p_token2_value  => SQLERRM);
85       RETURN NULL;
86 
87 END;
88 
89   ----------------------------------------------------------------------------------------------------
90 
91 
92 ---------------------------------------------------------------------------
93 -- Start of Comments
94 --  FUNCTION: INS_REFUNDABLE_MONTHS
95 --  DESC   : It returns number of months to be refunded
96 --  IN     : p_contract_id ,p_contract_line_id
97 --  OUT    : Number of months
98 -- Created By: Dalip Khandel        (dkhandel)
99 -- Version: 1.0
100 -- End of Commnets
101 ----------------------------------------------------------------------------------------------------
102 
103 FUNCTION INS_REFUNDABLE_MONTHS(
104  p_contract_id                   IN NUMBER
105  -- ,p_contract_line_id             IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
106  ,p_contract_line_id             IN NUMBER
107 )
108 RETURN NUMBER
109  IS
110 
111 
112    CURSOR c_total_amount_paid (p_sty_id NUMBER)
113    IS
114    SELECT COUNT(*)
115    FROM  okl_strm_elements STRE, OKL_STREAMS STR
116    WHERE STR.ID =  STRE.STM_ID
117     AND STR.STY_ID = p_sty_id
118     AND STRE.DATE_BILLED IS NOT NULL
119     AND STR.KHR_ID = p_contract_id
120     AND STR.KLE_ID = p_contract_line_id;
121 
122      CURSOR  C_OKL_STRM_TYPE_REC_V IS
123       SELECT ID
124       FROM OKL_STRM_TYPE_TL
125       WHERE NAME = 'INSURANCE RECEIVABLE'
126       AND LANGUAGE = 'US';
127 
128   CURSOR c_monthly_premium (p_contract_id  NUMBER,p_contract_line_id NUMBER )
129   IS
130   SELECT  IPF_CODE, DATE_TO , DATE_FROM --, CANCELLATION_DATE --++Effective DatedTermination ++---
131   FROM OKL_INS_POLICIES_B IPYB
132   WHERE IPYB.kle_id = p_contract_line_id
133   AND IPYB.khr_id = p_contract_id  ;
134 
135 
136   ls_payment_freq  OKL_INS_POLICIES_B.IPF_CODE%TYPE;
137   date_to   OKL_INS_POLICIES_B.DATE_TO%TYPE ;
138   date_from OKL_INS_POLICIES_B.DATE_FROM%TYPE ;
139   cancel_date OKL_INS_POLICIES_B.CANCELLATION_DATE%TYPE;
140   l_stm_type_id     OKL_STRM_TYPE_TL.ID%TYPE := 0;
141 
142 
143   l_profile_value NUMBER := 0;
144   l_months_to_refund NUMBER := 0;
145 
146   l_no_of_rec      NUMBER := 0;
147   l_freq_factor NUMBER;
148   l_total_num_months_paid NUMBER;
149   l_total_consumed_months NUMBER;
150   l_unconsumed_months NUMBER;
151   l_cancellation_date DATE; ---++ Ins Effective Dated Term Changes ++----
152   l_cancellation_reason VARCHAR2(30);---++ Ins Effective Dated Term Changes ++----
153   l_return_status                        VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
154 
155 BEGIN
156         -- ********************************************
157 	-- Extract Insurance Cancellation Date from global variables
158 	-- ********************************************
159 	IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(1)
160 	AND okl_execute_formula_pub.g_additional_parameters(1).name = ' CANCELLATION DATE'
161 	AND okl_execute_formula_pub.g_additional_parameters(1).value IS NOT NULL
162 	THEN
163 		l_cancellation_date := TO_DATE
164 			(okl_execute_formula_pub.g_additional_parameters(1).value, 'MM/DD/YYYY');
165 	END IF;
166 IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(2)
167 	AND okl_execute_formula_pub.g_additional_parameters(2).name = ' CANCELLATION REASON'
168 	AND okl_execute_formula_pub.g_additional_parameters(2).value IS NOT NULL
169 	THEN
170 		l_cancellation_reason := TO_char
171 			(okl_execute_formula_pub.g_additional_parameters(2).value);
172 	END IF;
173         ---++ Ins Effective Dated Term Changes End ++----
174 
175   -- GET profile value
176   l_profile_value := fnd_profile.value('OKLINMAXTERMFORINS');
177 
178   IF(( l_profile_value =  NULL) OR (l_profile_value = OKC_API.G_MISS_NUM )) THEN
179      l_unconsumed_months := 0 ;
180   END IF;
181 
182     /*OPEN C_OKL_STRM_TYPE_REC_V ;
183     FETCH C_OKL_STRM_TYPE_REC_V INTO l_stm_type_id;
184     IF(C_OKL_STRM_TYPE_REC_V%NOTFOUND) THEN
185          Okc_Api.set_message(G_APP_NAME, 'OKL_NO_TRANSACTION',
186          G_COL_NAME_TOKEN,'Billing');
187          CLOSE C_OKL_STRM_TYPE_REC_V ;
188          RAISE OKC_API.G_EXCEPTION_ERROR;
189    END IF ;
190     CLOSE C_OKL_STRM_TYPE_REC_V;*/
191   -- cursor fetch replaced with the streams util call, change
192   -- done for user defined streams impacts, bug 3924300
193   -- begin changes for bug 3924300
194 
195    OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
196                                                    'INSURANCE_RECEIVABLE',
197                                                    l_return_status,
198                                                    l_stm_type_id);
199    IF (l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
200                    RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
201    ELSIF (l_return_status = OKC_API.G_RET_STS_ERROR) THEN
202           Okc_Api.set_message(G_APP_NAME, 'OKL_NO_STREAM_TYPE', G_PURPOSE_TOKEN,'INSURANCE_RECEIVABLE'); -- bug 4024785
203                    RAISE OKC_API.G_EXCEPTION_ERROR;
204    END IF;
205   -- end changes for bug 3924300
206 
207 
208      OPEN c_total_amount_paid(l_stm_type_id) ;
209     FETCH c_total_amount_paid INTO l_no_of_rec;
210     IF(c_total_amount_paid%NOTFOUND) THEN
211          l_no_of_rec := 0;
212    END IF ;
213    CLOSE c_total_amount_paid;
214 
215 
216    OPEN c_monthly_premium (p_contract_id,p_contract_line_id );
217     FETCH c_monthly_premium INTO  ls_payment_freq, date_to, date_from;--, cancel_date;--++ Effective Dated TErmination ++--
218     IF(c_monthly_premium%NOTFOUND) THEN
219          Okc_Api.set_message(G_APP_NAME, G_INVALID_CONTRACT_LINE,
220          G_COL_NAME_TOKEN,p_contract_line_id);
221         -- x_return_status := OKC_API.G_RET_STS_ERROR ;
222          CLOSE c_monthly_premium ;
223          RAISE OKC_API.G_EXCEPTION_ERROR;
224    END IF ;
225    CLOSE c_monthly_premium;
226 
227    ---++ Ins Effective Dated Term Changes Start ++----
228   IF(( l_cancellation_date IS  NULL) OR (l_cancellation_date = OKC_API.G_MISS_DATE )) THEN
229      cancel_date := SYSDATE ;
230    ELSE
231      cancel_date := l_cancellation_date;
232    END IF;
233    ---++ Ins Effective Dated Term Changes End ++----
234 
235      IF(ls_payment_freq = 'MONTHLY') THEN
236 		l_freq_factor := 1;
237 	ELSIF(ls_payment_freq = 'BI_MONTHLY') THEN
238 		l_freq_factor := 1/2;
239 	ELSIF(ls_payment_freq = 'HALF_YEARLY') THEN
240 			   l_freq_factor := 6;	--- ETC.
241 	ELSIF(ls_payment_freq = 'QUARTERLY') THEN
242 			 	l_freq_factor := 3;
243 	ELSIF(ls_payment_freq = 'YEARLY') THEN
244 			 	l_freq_factor := 12;
245 	ELSIF(ls_payment_freq = 'LUMP_SUM') THEN
246                  --Bug# 4056484 PAGARG removing rounding
247 	 	l_freq_factor :=   MONTHS_BETWEEN( date_to,date_from);
248 	END IF;
249 
250     l_total_num_months_paid := l_freq_factor * l_no_of_rec;
251     IF(( l_total_num_months_paid IS NULL) OR (l_total_num_months_paid = OKC_API.G_MISS_NUM )) THEN
252      l_total_num_months_paid := 0 ;
253    END IF;
254         --- ++++ Eff Dated Term Qte Changes +++++ ----------
255                     IF cancel_date < date_from THEN
256                     --** If Eff date of Termination is earlier than Policy start date then
257                     --** calculate consumed months as insurance start to SYSDATE
258                      IF date_from < SYSDATE THEN
259                         l_total_consumed_months := MONTHS_BETWEEN(SYSDATE ,date_from);
260                      ELSIF date_from > SYSDATE THEN
261                         l_total_consumed_months := 0;
262                      ELSE
263                      -- Bug# 4056484 PAGARG removing rounding
264                         l_total_consumed_months := MONTHS_BETWEEN( cancel_date,date_from);
265                      END IF;
266                     ELSE
267                       -- Bug# 4056484 PAGARG removing rounding
268                      l_total_consumed_months := MONTHS_BETWEEN( cancel_date,date_from);
269                     END IF;
270         --- ++++ Eff Dated Term Qte Changes +++++ ----------
271 
272     IF(( l_total_consumed_months IS  NULL) OR (l_total_consumed_months = OKC_API.G_MISS_NUM )) THEN
273          l_total_consumed_months := 0 ;
274    END IF;
275 
276     l_unconsumed_months := l_total_num_months_paid - l_total_consumed_months ;
277    IF(( l_unconsumed_months IS  NULL) OR (l_unconsumed_months = OKC_API.G_MISS_NUM )) THEN
278      l_unconsumed_months := 0 ;
279    END IF;
280 
281     IF (l_unconsumed_months > l_profile_value) AND
282            (l_cancellation_reason = 'CANCELED_BY_CUSTOMER') THEN --Eff Dated Term Changes ++---
283       RETURN l_profile_value;
284     ELSE
285      RETURN  l_unconsumed_months;
286     END IF;
287 
288   EXCEPTION
289     WHEN OTHERS THEN
290       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
291                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
292                           p_token1        => 'OKL_SQLCODE',
293                           p_token1_value  => SQLCODE,
294                           p_token2        => 'OKL_SQLERRM',
295                           p_token2_value  => SQLERRM);
296       RETURN NULL;
297 
298 END;
299 
300 ------------------------------------------------------------------------------
301   -- Start of Comments
302   -- Created By:    sechawla 6651621
303   -- Function Name: line_taxable_basis
304   -- Description:   Returns taxable basis amount for a transaction line.
305   --                For header level Booking, Rebook and Sales Quote transactions,
306   --                0 amount is returned. For line level transactions, the default
307   --                taxable basis amount is returned. Default taxable basis amount
308   --                is passed to this function from okl_process_sales_tax_pvt, by
309   --                populating default_taxable_basis additional parameter. This function
310   --                extracts the amount from this parameter and returns it back.
311   -- Parameters:    IN:  p_khr_id, p_kle_id
312   --                     additional parameters stored in g_additional_parameters
313   --                OUT: amount
314   -- Version:       1.0
315   -- History      : 03-Jan-07 sechawla 6651621 - Created
316   -- End of Commnets
317 ------------------------------------------------------------------------------
318 
319 FUNCTION line_taxable_basis (
320 	p_khr_id		IN NUMBER,
321 	p_kle_id	    IN NUMBER)
322 	RETURN NUMBER IS
323 
324     l_source_trx_name               VARCHAR2(150);
325     l_line_name                     VARCHAR2(150);
326     l_line_taxable_basis            NUMBER;
327 BEGIN
328 
329    --  Validate additional parameters availability
330     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
331       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
332 	  LOOP
333         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'SOURCE_TRX_NAME'
334            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
335                 l_source_trx_name := okl_execute_formula_pub.g_additional_parameters(I).value;
336         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'LINE_NAME'
337            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
338                 l_line_name :=okl_execute_formula_pub.g_additional_parameters(I).value;
339         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'DEFAULT_TAXABLE_BASIS'
340            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
341                 l_line_taxable_basis := to_number(okl_execute_formula_pub.g_additional_parameters(I).value);
342         END IF;
343       END LOOP;
344 	ELSE
345 	     -- Additional parameters are needed to evaluate taxable basis override formula LINE_TAXABLE_BASIS.
346          OKL_API.set_message(p_app_name      => 'OKL',
347                              p_msg_name      => 'OKL_TX_NO_TBO_PARAMS');
348          RAISE Okl_Api.G_EXCEPTION_ERROR;
349 
350 	END IF;
351 
352     IF l_source_trx_name IS NULL THEN
353        OKL_API.set_message( p_app_name      => 'OKC',
354                             p_msg_name      => G_REQUIRED_VALUE,
355                             p_token1        => G_COL_NAME_TOKEN,
356                             p_token1_value  => 'SOURCE_TRX_NAME');
357 
358        RAISE Okl_Api.G_EXCEPTION_ERROR;
359     END IF;
360 
361     IF  l_line_taxable_basis IS NULL THEN
362         OKL_API.set_message( p_app_name     => 'OKC',
363                             p_msg_name      => G_REQUIRED_VALUE,
364                             p_token1        => G_COL_NAME_TOKEN,
365                             p_token1_value  => 'DEFAULT_TAXABLE_BASIS');
366 
367         RAISE Okl_Api.G_EXCEPTION_ERROR;
368     END IF;
369 
370     IF l_source_trx_name IN ('Booking','Rebook','Sales Quote') AND l_line_name IS NULL THEN
371         --Contract Header or Sales Quote Header level tax call
372           RETURN 0;
373     ELSE
374           RETURN l_line_taxable_basis;
375     END IF;
376 
377 EXCEPTION
378 
379     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
380           RETURN NULL;
381 
382 	WHEN OTHERS THEN
383 
384 		OKL_API.SET_MESSAGE (
385 			p_app_name	=> OKL_API.G_APP_NAME,
386 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
387 			p_token1	=> 'SQLCODE',
388 			p_token1_value	=> SQLCODE,
389 			p_token2	=> 'SQLERRM',
390 			p_token2_value	=> SQLERRM);
391 
392 		RETURN NULL;
393 
394 END line_taxable_basis;
395 
396   ----------------------------------------------------------------------------------------------------
397 
398     -- Start of Comments
399     -- Created By:       Santhosh Siruvole (ssiruvol)
400     -- Function Name  contract_sumofrents
401     -- Description:   returns the sum of amount on stream type - Rent.
402     -- Dependencies:
403     -- Parameters: contract id.
404     -- Version: 1.0
405     -- End of Commnets
406 
407 ----------------------------------------------------------------------------------------------------
408   FUNCTION contract_sum_of_rents(
409             p_chr_id          IN  NUMBER,
410             p_line_id         IN  NUMBER) RETURN NUMBER  IS
411 
412     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_SUM_OF_RENTS';
413     l_api_version	CONSTANT NUMBER	      := 1;
414     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
415     x_msg_count         NUMBER;
416     x_msg_data          VARCHAR2(256);
417 
418     l_rents NUMBER := 0;
419 
420     CURSOR l_line_rents_csr (chrId NUMBER ) IS
421     SELECT NVL(str.link_hist_stream_id,-1) link_hist_stream_id,
422            NVL(SUM(sele.amount),0) amount
423     FROM okl_strm_elements sele,
424          okl_streams str,
425          --okl_strm_type_tl sty,
426          okl_strm_type_v sty,
427          okl_K_lines_full_v kle,
428          okc_statuses_b sts
429     WHERE sele.stm_id = str.id
430        AND str.sty_id = sty.id
431        --AND UPPER(sty.name) = 'RENT'
432        AND sty.stream_type_purpose = 'RENT'
433        --AND sty.LANGUAGE = 'US'
434        AND str.say_code = 'CURR'
435        AND str.active_yn = 'Y'
436        AND NVL( str.purpose_code, 'XXXX' ) = 'XXXX'
437        AND str.khr_id = chrId
438        AND str.kle_id = kle.id
439        AND kle.chr_id = chrId
440        AND kle.sts_code = sts.code
441        AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
442     GROUP BY str.link_hist_stream_id;
443 
444     CURSOR l_line_rents_adj_csr (p_stm_id NUMBER) IS
445     SELECT NVL(SUM(sele.amount),0) amount
446     FROM   okl_strm_elements sele
447     WHERE  stm_id = p_stm_id
448     AND    date_billed IS NOT NULL;
449 
450     CURSOR l_chr_rents_csr (chrId NUMBER ) IS
451     SELECT NVL(SUM(sele.amount),0) amount
452     FROM okl_strm_elements sele,
453          okl_streams str,
454          --okl_strm_type_tl sty
455          okl_strm_type_v sty
456     WHERE sele.stm_id = str.id
457        AND str.sty_id = sty.id
458        --AND UPPER(sty.name) = 'RENT'
459        AND sty.stream_type_purpose = 'RENT'
460        --AND sty.LANGUAGE = 'US'
461        AND str.say_code = 'CURR'
462        AND str.active_yn = 'Y'
463        AND NVL( str.purpose_code, 'XXXX' ) = 'XXXX'
464        AND str.khr_id = chrId
465        AND NVL(str.kle_id, -1) = -1;
466 
467     l_chr_rents_rec l_chr_rents_csr%ROWTYPE;
468     l_line_rents_amount NUMBER;
469     l_rent_adj_amount   NUMBER;
470 
471   BEGIN
472 
473        IF ( p_chr_id IS NULL ) THEN
474            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
475        END IF;
476 
477        l_line_rents_amount := 0;
478        FOR l_line_rents_rec IN l_line_rents_csr (p_chr_id)
479        LOOP
480           l_line_rents_amount := NVL(l_line_rents_amount,0) + l_line_rents_rec.amount;
481 
482           IF (l_line_rents_rec.link_hist_stream_id <> -1) THEN
483              l_rent_adj_amount := 0;
484              OPEN l_line_rents_adj_csr (l_line_rents_rec.link_hist_stream_id);
485              FETCH l_line_rents_adj_csr INTO l_rent_adj_amount;
486              CLOSE l_line_rents_adj_csr;
487 
488              l_line_rents_amount := l_line_rents_amount - NVL(l_rent_adj_amount,0);
489           END IF;
490        END LOOP;
491 
492        /*
493        OPEN l_chr_rents_csr( p_chr_id );
494        FETCH l_chr_rents_csr INTO l_chr_rents_rec;
495        CLOSE l_chr_rents_csr;
496        */
497 
498        l_rents := l_line_rents_amount;
499 
500       RETURN l_rents;
501 
502 
503     EXCEPTION
504 	WHEN OTHERS  THEN
505                Okl_Api.SET_MESSAGE(
506                         p_app_name     => G_APP_NAME,
507                         p_msg_name     => G_UNEXPECTED_ERROR,
508                         p_token1       => G_SQLCODE_TOKEN,
509                         p_token1_value => SQLCODE,
510                         p_token2       => G_SQLERRM_TOKEN,
511                         p_token2_value => SQLERRM);
512                 RETURN NULL;
513 
514   END contract_sum_of_rents;
515 
516 ----------------------------------------------------------------------------------------------------
517 
518     -- Start of Comments
519     -- Created By:       Santhosh Siruvole (ssiruvol)
520     -- Function Name  contract_income
521     -- Description:   returns sum of all incomes of financial asset lines of a contract
522     -- Dependencies:
523     -- Parameters: contract id.
524     -- Version: 1.0
525     -- End of Commnets
526 
527 ----------------------------------------------------------------------------------------------------
528   FUNCTION contract_income(
529             p_chr_id          IN  NUMBER,
530             p_line_id          IN  NUMBER) RETURN NUMBER  IS
531 
532     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_INCOME';
533     l_api_version	CONSTANT NUMBER	      := 1;
534     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
535     x_msg_count         NUMBER;
536     x_msg_data          VARCHAR2(256);
537 
538     l_income NUMBER := 0;
539 
540   BEGIN
541 
542        IF ( p_chr_id IS NULL ) THEN
543            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
544        END IF;
545 --
546 -- Note: User defined stream: This stream type has been identified as
547 --       "Not being used" and hence not modified with its purpose
548 --
549       SELECT NVL(SUM(sele.amount),0) INTO l_income
550       FROM okl_strm_elements sele,
551            okl_streams str,
552            okl_strm_type_v sty,
553 	   okl_K_lines_full_v kle,
554 	   okc_statuses_b sts
555       WHERE sele.stm_id = str.id
556            AND str.sty_id = sty.id
557            AND UPPER(sty.name) = 'UNEARNED INCOME'
558            AND str.khr_id = p_chr_id
559 	   AND kle.sts_code = sts.code
560 	   AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
561 
562       RETURN l_income;
563 
564 
565     EXCEPTION
566 
567 	WHEN OTHERS THEN
568                Okl_Api.SET_MESSAGE(
569                         p_app_name     => G_APP_NAME,
570                         p_msg_name     => G_UNEXPECTED_ERROR,
571                         p_token1       => G_SQLCODE_TOKEN,
572                         p_token1_value => SQLCODE,
573                         p_token2       => G_SQLERRM_TOKEN,
574                         p_token2_value => SQLERRM);
575                 RETURN NULL;
576 
577 
578   END contract_income;
579 
580 --Bug# 3638568 : Function modifieed to conditionally include TERMINATED lines if called from pricing
581 ----------------------------------------------------------------------------------------------------
582 
583     -- Start of Comments
584     -- Created By:       Santhosh Siruvole (ssiruvol)
585     -- Function Name  line_residualvalue
586     -- Description:   returns the residual_value of the a financial asset line.
587     -- Dependencies:
588     -- Parameters: contract id and line id
589     -- Version: 1.0
590     -- SECHAWLA 05-MAY-04 3578894 : Modified to accomodate additional parameters for Reporting product
591     -- SECHAWLA 02-FEB-05 4141411 : Added unexpected error exception handling block
592     -- PRASJAIN Bug 6030917 : Added Proration Logic
593     -- End of Commnets
594 
595 ----------------------------------------------------------------------------------------------------
596   FUNCTION line_residual_value(
597             p_chr_id          IN  NUMBER,
598             p_line_id         IN  NUMBER) RETURN NUMBER  IS
599 
600     l_api_name          CONSTANT VARCHAR2(30) := 'RETURN_LINE_RESIDUAL_VALUE';
601     l_api_version       CONSTANT NUMBER       := 1;
602     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
603     x_msg_count         NUMBER;
604     x_msg_data          VARCHAR2(256);
605 
606     l_residual_value NUMBER := 0.0;
607     l_oec            NUMBER := 0.0;
608 
609     CURSOR residual_csr( chrId NUMBER, lineId NUMBER ) IS
610     SELECT NVL(kle.residual_value,0) Value,
611            NVL(kle.residual_percentage,0) Percent
612     FROM OKC_LINE_STYLES_B LS,
613          okl_K_lines_full_v kle,
614          okc_statuses_b sts
615     WHERE  LS.ID = KLE.LSE_ID
616          AND LS.LTY_CODE ='FREE_FORM1'
617          AND KLE.ID = lineId
618          AND KLE.DNZ_CHR_ID = chrId
619          AND kle.sts_code = sts.code
620          AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
621 
622     CURSOR residual_csr_incl_terminated( chrId NUMBER, lineId NUMBER ) IS
623     SELECT NVL(kle.residual_value,0) Value,
624            NVL(kle.residual_percentage,0) Percent
625     FROM OKC_LINE_STYLES_B LS,
626          okl_K_lines_full_v kle,
627          okc_statuses_b sts
628     WHERE  LS.ID = KLE.LSE_ID
629          AND LS.LTY_CODE ='FREE_FORM1'
630          AND KLE.ID = lineId
631          AND KLE.DNZ_CHR_ID = chrId
632          AND kle.sts_code = sts.code
633          AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
634 
635    residual_rec residual_csr%ROWTYPE;
636    --SECHAWLA 05-MAY-04 3578894 : new declarations
637     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
638     l_trx_date   DATE;
639     l_k_end_date  DATE;
640 
641     -- get the K end date
642     CURSOR  l_contract_csr(cp_chr_id IN NUMBER) IS
643     SELECT  END_DATE
644     FROM    okc_k_headers_b
645     WHERE   id = cp_chr_id;
646 
647     l_discount_incl_terminated BOOLEAN := FALSE;
648     l_proration_factor         NUMBER;
649 
650   BEGIN
651 
652       IF ( ( p_chr_id IS NULL ) OR ( p_line_id IS NULL ) ) THEN
653           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
654 
655       END IF;
656 
657       -- SECHAWLA 05-MAY-04 3578894 : check the additional parameter for rep product
658       --Validate additional parameters availability
659       IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
660         FOR I IN
661 Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.FIRST..Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.LAST LOOP
662            IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
663                AND  Okl_Execute_Formula_Pub.g_additional_parameters(I).value IS NOT NULL THEN
664                 l_rep_prod_streams_yn := Okl_Execute_Formula_Pub.g_additional_parameters(I).value;
665            ELSIF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
666                AND  Okl_Execute_Formula_Pub.g_additional_parameters(I).value IS NOT NULL THEN
667                 l_trx_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
668 
669            -- Start : Bug 6030917 : prasjain
670            --added for getting the proration factor for partial unit termination
671            ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'proration_factor'
672            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
673            l_proration_factor := to_number(okl_execute_formula_pub.g_additional_parameters(I).value);
674            -- End : Bug 6030917 : prasjain
675 
676            END IF;
677         END LOOP;
678           ELSE
679          l_rep_prod_streams_yn := 'N';
680           END IF;
681 
682       IF l_rep_prod_streams_yn = 'Y' THEN
683          IF l_trx_date IS NULL THEN
684          -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
685             Okl_Api.Set_Message(p_app_name     => g_app_name,
686                                 p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
687             RAISE Okl_Api.G_EXCEPTION_ERROR;
688          END IF;
689       END IF;
690 
691       IF l_rep_prod_streams_yn = 'Y' THEN
692          OPEN  l_contract_csr(p_chr_id);
693          FETCH l_contract_csr INTO l_k_end_date;
694          CLOSE l_contract_csr;
695 
696          IF l_k_end_date <= l_trx_date THEN
697             RETURN 0;
698          END IF;
699       END IF;
700 
701     ----------
702 
703        -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
704        --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
705        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
706 
707     -- rmunjulu 4042892
708     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
709       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
710 	  LOOP
711         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
712           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
713 		  l_discount_incl_terminated := TRUE;
714         END IF;
715       END LOOP;
716     END IF;
717            -- rmunjulu 4042892
718        IF l_discount_incl_terminated THEN
719          OPEN residual_csr_incl_terminated( p_chr_id, p_line_id );
720          FETCH residual_csr_incl_terminated INTO residual_rec;
721          IF( residual_csr_incl_terminated%NOTFOUND ) THEN
722              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
723          END IF;
724          CLOSE residual_csr_incl_terminated;
725     ELSE
726          OPEN residual_csr( p_chr_id, p_line_id );
727          FETCH residual_csr INTO residual_rec;
728          IF( residual_csr%NOTFOUND ) THEN
729              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
730          END IF;
731          CLOSE residual_csr;
732     END IF;
733 
734       IF ( residual_rec.Value <> 0 ) THEN
735         l_residual_value := residual_rec.Value;
736       ELSE
737         l_oec := line_oec( p_chr_id, p_line_id );
738         IF ( l_oec IS NULL ) THEN
739           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
740         END IF;
741         l_residual_value := residual_rec.Percent * l_oec / 100.00;
742       END IF;
743 
744      -- Start : Bug 6030917 : prasjain
745      IF nvl(l_proration_factor,1) <> 1 THEN
746        l_residual_value := l_residual_value * l_proration_factor;
747      END IF;
748      -- End : Bug 6030917 : prasjain
749 
750       RETURN l_residual_value;
751 
752     EXCEPTION
753     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
754         IF residual_csr%ISOPEN THEN
755            CLOSE residual_csr;
756         END IF;
757 
758         IF l_contract_csr%ISOPEN THEN
759            CLOSE l_contract_csr;
760         END IF;
761 
762         RETURN NULL;
763     -- SECHAWLA 02-FEB-05 4141411 : Added unexpected error exception handling block
764     WHEN Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR THEN
765         IF residual_csr%ISOPEN THEN
766            CLOSE residual_csr;
767         END IF;
768 
769         IF l_contract_csr%ISOPEN THEN
770            CLOSE l_contract_csr;
771         END IF;
772 
773         RETURN NULL;
774     WHEN OTHERS THEN
775         IF residual_csr%ISOPEN THEN
776            CLOSE residual_csr;
777         END IF;
778 
779         IF l_contract_csr%ISOPEN THEN
780            CLOSE l_contract_csr;
781         END IF;
782 
783         Okl_Api.SET_MESSAGE(
784                         p_app_name     => G_APP_NAME,
785                         p_msg_name     => G_UNEXPECTED_ERROR,
786                         p_token1       => G_SQLCODE_TOKEN,
787                         p_token1_value => SQLCODE,
788                         p_token2       => G_SQLERRM_TOKEN,
789                         p_token2_value => SQLERRM);
790         RETURN NULL;
791 
792 
793   END line_residual_value;
794 
795 ----------------------------------------------------------------------------------------------------
796 
797     -- Start of Comments
798     -- Created By:       Santhosh Siruvole (ssiruvol)
799     -- Function Name  contract_residualvalue
800     -- Description:   returns the sum of residual_value of all financial asset lines of a contract.
801     -- Dependencies:
802     -- Parameters: contract id.
803     -- Version: 1.0
804     -- End of Commnets
805 
806 ----------------------------------------------------------------------------------------------------
807   FUNCTION contract_residual_value(
808             p_chr_id          IN  NUMBER,
809             p_line_id         IN  NUMBER) RETURN NUMBER  IS
810 
811     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_RESIDUAL_VALUE';
812     l_api_version	CONSTANT NUMBER	      := 1;
813     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
814     x_msg_count         NUMBER;
815     x_msg_data          VARCHAR2(256);
816 
817     l_residual_value NUMBER := 0.0;
818     l_lne_res_value  NUMBER := 0.0;
819 
820     CURSOR lines_csr( chrId NUMBER ) IS
821     SELECT kle.id lineId
822     FROM OKC_LINE_STYLES_B LS,
823 	 okl_K_lines_full_v kle,
824 	 okc_statuses_b sts
825     WHERE LS.ID = KLE.LSE_ID
826          AND LS.LTY_CODE ='FREE_FORM1'
827          AND KLE.DNZ_CHR_ID = chrId
828 	 AND kle.sts_code = sts.code
829 	 AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
830 
831     line_rec lines_csr%ROWTYPE;
832 
833   BEGIN
834 
835        IF ( p_chr_id IS NULL ) THEN
836            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
837        END IF;
838 
839        FOR line_rec IN lines_csr( p_chr_id )
840        LOOP
841            IF( lines_csr%NOTFOUND ) THEN
842                RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
843            END IF;
844            l_lne_res_value := line_residual_value( p_chr_id, line_rec.lineId );
845            IF ( l_lne_res_value IS NULL ) THEN
846                RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
847            END IF;
848            l_residual_value := l_residual_value + l_lne_res_value;
849        END LOOP;
850 
851       RETURN l_residual_value;
852 
853     EXCEPTION
854 
855 	WHEN OTHERS THEN
856                Okl_Api.SET_MESSAGE(
857                         p_app_name     => G_APP_NAME,
858                         p_msg_name     => G_UNEXPECTED_ERROR,
859                         p_token1       => G_SQLCODE_TOKEN,
860                         p_token1_value => SQLCODE,
861                         p_token2       => G_SQLERRM_TOKEN,
862                         p_token2_value => SQLERRM);
863                 RETURN NULL;
864 
865   END contract_residual_value;
866 
867 
868 ----------------------------------------------------------------------------------------------------
869 
870     -- Start of Comments
871     -- Created By:       Santhosh Siruvole (ssiruvol)
872     -- Function Name  contract_oec
873     -- Description:   returns the OEC of a contract.
874     -- Dependencies:
875     -- Parameters: contract id.
876     -- Version: 1.0
877     -- End of Commnets
878 
879 ----------------------------------------------------------------------------------------------------
880   FUNCTION contract_oec(
881             p_chr_id          IN  NUMBER,
882             p_line_id         IN  NUMBER) RETURN NUMBER  IS
883 
884     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_OEC';
885     l_api_version	CONSTANT NUMBER	      := 1;
886     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
887     x_msg_count         NUMBER;
888     x_msg_data          VARCHAR2(256);
889 
890   BEGIN
891       IF ( p_line_id IS NULL ) THEN
892           RETURN line_oec( p_chr_id, NULL);
893       ELSE
894           RETURN line_oec( p_chr_id, p_line_id);
895       END IF;
896   END;
897 
898 --Bug# 3638568 : This formula modified to conditionally include terminated lines
899 -----------------------------------------------------------------------------------
900 -- Start of Commnets
901 -- Badrinath Kuchibholta
902 
903 -- Procedure Name       : FUNCTION_oec_calc
904 -- Description          : FUNCTION_oec_calc
905 -- Business Rules       :
906 -- Parameters           :
907 -- Version              : 1.0
908 -- End of Commnets
909 
910   FUNCTION  line_oec(p_dnz_chr_id IN  OKC_K_LINES_V.DNZ_CHR_ID%TYPE,
911                      --p_cle_id     IN  OKC_K_LINES_V.CLE_ID%TYPE DEFAULT Okl_Api.G_MISS_NUM)
912                      p_cle_id     IN  OKC_K_LINES_V.CLE_ID%TYPE )
913   RETURN NUMBER IS
914     G_APP_NAME                   CONSTANT  VARCHAR2(3)   :=  Okl_Api.G_APP_NAME;
915     G_PKG_NAME                   CONSTANT  VARCHAR2(200) := 'OKL_FORMULA_PVT';
916     G_UNEXPECTED_ERROR           CONSTANT  VARCHAR2(200) := 'OKL_UNEXPECTED_ERROR';
917     G_COL_NAME_TOKEN             CONSTANT  VARCHAR2(200) := Okl_Api.G_COL_NAME_TOKEN;
918     G_SQLERRM_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLerrm';
919     G_SQLCODE_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLcode';
920     G_REQUIRED_VALUE             CONSTANT  VARCHAR2(200) := 'OKL_REQUIRED_VALUE';
921     G_NO_MATCHING_RECORD         CONSTANT  VARCHAR2(200) := 'OKL_LLA_NO_MATCHING_RECORD';
922     G_LINE_RECORD                CONSTANT  VARCHAR2(200) := 'OKL_LLA_LINE_RECORD';
923     G_INVALID_CRITERIA           CONSTANT  VARCHAR2(200) := 'OKL_LLA_INVALID_CRITERIA';
924     G_EXCEPTION_HALT_VALIDATION            EXCEPTION;
925     G_EXCEPTION_STOP_VALIDATION            EXCEPTION;
926     G_FIN_LINE_LTY_CODE                    OKC_LINE_STYLES_V.LTY_CODE%TYPE := 'FREE_FORM1';
927     G_MODEL_LINE_LTY_CODE                  OKC_LINE_STYLES_V.LTY_CODE%TYPE := 'ITEM';
928     G_ADDON_LINE_LTY_CODE                  OKC_LINE_STYLES_V.LTY_CODE%TYPE := 'ADD_ITEM';
929     G_LEASE_SCS_CODE                       OKC_K_HEADERS_V.SCS_CODE%TYPE := 'LEASE';
930     G_LOAN_SCS_CODE                        OKC_K_HEADERS_V.SCS_CODE%TYPE := 'LOAN';
931     l_return_status                        VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
932     l_api_name                   CONSTANT  VARCHAR2(30)  := 'FUNCTION_OEC_CALC';
933     ln_contract_oec                        OKL_K_LINES_V.OEC%TYPE := 0;
934     lv_lty_code                            OKC_LINE_STYLES_V.LTY_CODE%TYPE;
935     ln_model_line_oec                      OKL_K_LINES_V.OEC%TYPE := 0;
936     ln_addon_line_oec                      OKL_K_LINES_V.OEC%TYPE := 0;
937     ln_total_line_oec                      OKL_K_LINES_V.OEC%TYPE := 0;
938         l_capred_incl_terminated BOOLEAN := FALSE;
939     -- Cursor to get the lty_code
940     CURSOR get_lty_code(p_cle_id IN OKC_K_LINES_V.ID%TYPE) IS
941     SELECT lse.lty_code
942     FROM okc_k_lines_b cle,
943          okc_line_styles_b lse
944     WHERE cle.id = p_cle_id
945     AND cle.lse_id = lse.id;
946     -- Cursor to sum up oec for contract
947     CURSOR c_contract_oec_calc(p_dnz_chr_id   OKC_K_HEADERS_V.ID%TYPE) IS
948     SELECT SUM(kle.oec) oec
949     FROM OKL_K_LINES_V kle,
950          OKC_K_LINES_V cle,
951          OKC_K_HEADERS_V CHR
952     WHERE CHR.id = p_dnz_chr_id
953     AND CHR.id = cle.dnz_chr_id
954     AND cle.sts_code NOT IN ( 'ABANDONED', 'TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
955     AND cle.id = kle.id;
956 
957     CURSOR c_contract_oec_calc_incl_term(p_dnz_chr_id   OKC_K_HEADERS_V.ID%TYPE) IS
958     SELECT SUM(kle.oec) oec
959     FROM OKL_K_LINES_V kle,
960          OKC_K_LINES_V cle,
961          OKC_K_HEADERS_V CHR
962     WHERE CHR.id = p_dnz_chr_id
963     AND CHR.id = cle.dnz_chr_id
964     AND cle.sts_code NOT IN ( 'ABANDONED', 'EXPIRED', 'CANCELLED', 'HOLD')
965     AND cle.id = kle.id;
966     -- Cursor to sum up oec for given model line
967     CURSOR c_model_oec_calc(p_top_cle_id OKC_K_LINES_V.CLE_ID%TYPE,
968                             p_dnz_chr_id OKC_K_LINES_V.DNZ_CHR_ID%TYPE) IS
969     SELECT SUM(cle.price_unit * cim.number_of_items) oec
970     FROM okc_subclass_top_line stl,
971          okc_line_styles_b lse2,
972          okc_line_styles_b lse1,
973          okc_k_items_v cim,
974          okc_k_lines_v cle
975     WHERE cle.cle_id = p_top_cle_id
976     AND cle.dnz_chr_id = p_dnz_chr_id
977     AND cle.id = cim.cle_id
978     AND cle.dnz_chr_id = cim.dnz_chr_id
979     AND cle.lse_id = lse1.id
980     AND lse1.lty_code = G_MODEL_LINE_LTY_CODE
981     AND lse1.lse_parent_id = lse2.id
982     AND lse2.lty_code = G_FIN_LINE_LTY_CODE
983     AND lse2.id = stl.lse_id
984     AND stl.scs_code IN (G_LEASE_SCS_CODE,G_LOAN_SCS_CODE);
985     -- Cursor to sum up oec of addon line for a given top line
986     CURSOR c_addon_oec_calc(p_top_cle_id OKC_K_LINES_V.CLE_ID%TYPE,
987                             p_dnz_chr_id OKC_K_LINES_V.DNZ_CHR_ID%TYPE) IS
988     SELECT SUM(cle.price_unit* cim.number_of_items) oec
989     FROM okc_subclass_top_line stl,
990          okc_line_styles_b lse3,
991          okc_line_styles_b lse2,
992          okc_line_styles_b lse1,
993          okc_k_items_v cim,
994          okc_k_lines_b cle
995     WHERE cle.dnz_chr_id = p_dnz_chr_id
996     AND cle.dnz_chr_id = cim.dnz_chr_id
997     AND cle.id = cim.cle_id
998     AND cle.lse_id = lse1.id
999     AND lse1.lty_code = G_ADDON_LINE_LTY_CODE
1000     AND lse1.lse_parent_id = lse2.id
1001     AND lse2.lty_code = G_MODEL_LINE_LTY_CODE
1002     AND lse2.lse_parent_id = lse3.id
1003     AND lse3.lty_code = G_FIN_LINE_LTY_CODE
1004     AND lse3.id = stl.lse_id
1005     AND stl.scs_code IN (G_LEASE_SCS_CODE,G_LOAN_SCS_CODE)
1006     --AND cle.cle_id IN (SELECT cle.id
1007     AND exists (SELECT 1   --cle.id
1008                        FROM okc_subclass_top_line stlx,
1009                             okc_line_styles_b lse2x,
1010                             okc_line_styles_b lse1x,
1011                             okc_k_lines_b clex
1012                        WHERE clex.cle_id = p_top_cle_id
1013                        AND clex.dnz_chr_id = p_dnz_chr_id
1014 
1015                        AND clex.lse_id = lse1x.id
1016                        AND lse1x.lty_code = G_MODEL_LINE_LTY_CODE
1017                        AND lse1x.lse_parent_id = lse2x.id
1018                        AND lse2x.lty_code = G_FIN_LINE_LTY_CODE
1019                        AND lse2x.id = stlx.lse_id
1020                        AND stlx.scs_code IN (G_LEASE_SCS_CODE,G_LOAN_SCS_CODE)
1021                        AND clex.id = cle.cle_id);
1022 
1023   --Bug 4631549
1024   --cursor to find if this is a re-lease contract
1025   Cursor l_chrb_csr (p_chr_id in number) is
1026   SELECT chrb.orig_system_source_code
1027   FROM   okc_k_headers_b chrb
1028   where  chrb.id = p_chr_id;
1029 
1030   l_chrb_rec l_chrb_csr%ROWTYPE;
1031 
1032   --cursor to get expected asset value for contract
1033   cursor l_chr_expcost_trmn_csr(p_chr_id in number) is
1034   SELECT SUM(kle.expected_asset_cost) expected_asset_cost
1035   FROM   OKL_K_LINES kle,
1036          OKC_K_LINES_B cleb
1037   WHERE  kle.id = cleb.id
1038   AND    cleb.dnz_chr_id = p_chr_id
1039   AND    cleb.lse_id     = 33
1040   AND    cleb.sts_code NOT IN ( 'ABANDONED', 'EXPIRED', 'CANCELLED', 'HOLD');
1041 
1042   cursor l_chr_expcost_csr(p_chr_id in number) is
1043   SELECT SUM(kle.expected_asset_cost) expected_asset_cost
1044   FROM   OKL_K_LINES kle,
1045          OKC_K_LINES_B cleb
1046   WHERE  kle.id = cleb.id
1047   AND    cleb.dnz_chr_id = p_chr_id
1048   AND    cleb.lse_id     = 33
1049   AND    cleb.sts_code NOT IN ( 'ABANDONED', 'TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1050 
1051 
1052   --cursor to get expected asset value for asset
1053   cursor l_cle_expcost_csr (p_cle_id in number) is
1054   Select nvl(kle.expected_asset_cost,0) expected_asset_cost
1055   from   okl_k_lines kle
1056   where  kle.id  = p_cle_id;
1057 
1058 
1059 ----------------------------------------------------------------------------------------------------
1060   -- Start of Commnets
1061   -- Badrinath Kuchibholta
1062   -- Procedure Name       : validate_dnz_chr_id
1063   -- Description          : validation with OKC_K_LINES_V
1064   -- Business Rules       :
1065   -- Parameters           :
1066   -- Version              : 1.0
1067   -- End of Commnets
1068 
1069   PROCEDURE validate_dnz_chr_id(p_dnz_chr_id IN OKC_K_LINES_V.DNZ_CHR_ID%TYPE,
1070                                 x_return_status OUT NOCOPY VARCHAR2) IS
1071     ln_dummy      NUMBER := 0;
1072     CURSOR c_dnz_chr_id_validate(p_dnz_chr_id OKC_K_LINES_V.DNZ_CHR_ID%TYPE) IS
1073     SELECT 1
1074     --FROM DUAL
1075     --WHERE EXISTS (SELECT 1
1076                   FROM OKC_K_HEADERS_B CHR
1077                   WHERE CHR.id = p_dnz_chr_id; --);
1078   BEGIN
1079     -- initialize return status
1080     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
1081     -- data is required
1082     IF (p_dnz_chr_id = Okl_Api.G_MISS_NUM) OR
1083        (p_dnz_chr_id IS NULL) THEN
1084        -- store SQL error message on message stack
1085       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1086                           p_msg_name     => G_REQUIRED_VALUE,
1087                           p_token1       => G_COL_NAME_TOKEN,
1088                           p_token1_value => 'P_DNZ_CHR_ID');
1089        -- halt validation as it is a required field
1090        RAISE G_EXCEPTION_STOP_VALIDATION;
1091     END IF;
1092     -- Enforce Foreign Key
1093     -- since we are creating a asset line
1094     -- we assume the cle_id will not null
1095     -- as the same is not top line and it will be sub line
1096     OPEN  c_dnz_chr_id_validate(p_dnz_chr_id);
1097     IF c_dnz_chr_id_validate%NOTFOUND THEN
1098       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1099                           p_msg_name     => G_NO_MATCHING_RECORD,
1100                           p_token1       => G_COL_NAME_TOKEN,
1101                           p_token1_value => 'P_DNZ_CHR_ID');
1102       -- halt validation as it has no parent record
1103       RAISE G_EXCEPTION_HALT_VALIDATION;
1104     END IF;
1105     FETCH c_dnz_chr_id_validate INTO ln_dummy;
1106     CLOSE c_dnz_chr_id_validate;
1107     IF (ln_dummy = 0) THEN
1108       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1109                           p_msg_name     => G_NO_MATCHING_RECORD,
1110                           p_token1       => G_COL_NAME_TOKEN,
1111                           p_token1_value => 'P_DNZ_CHR_ID');
1112        -- halt validation as it has no parent record
1113        RAISE G_EXCEPTION_HALT_VALIDATION;
1114     END IF;
1115   EXCEPTION
1116     WHEN G_EXCEPTION_STOP_VALIDATION THEN
1117     -- We are here since the field is required
1118     -- Notify Error
1119     x_return_status := Okl_Api.G_RET_STS_ERROR;
1120     WHEN G_EXCEPTION_HALT_VALIDATION THEN
1121      -- If the cursor is open then it has to be closed
1122      IF c_dnz_chr_id_validate%ISOPEN THEN
1123        CLOSE c_dnz_chr_id_validate;
1124      END IF;
1125     x_return_status := Okl_Api.G_RET_STS_ERROR;
1126     WHEN OTHERS THEN
1127     -- store SQL error message on message stack
1128     Okl_Api.SET_MESSAGE(p_app_name     => G_APP_NAME,
1129                         p_msg_name     => G_UNEXPECTED_ERROR,
1130                         p_token1       => G_SQLCODE_TOKEN,
1131                         p_token1_value => SQLCODE,
1132                         p_token2       => G_SQLERRM_TOKEN,
1133                         p_token2_value => SQLERRM);
1134     -- If the cursor is open then it has to be closed
1135     IF c_dnz_chr_id_validate%ISOPEN THEN
1136        CLOSE c_dnz_chr_id_validate;
1137     END IF;
1138     -- notify caller of an error as UNEXPETED error
1139     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
1140   END validate_dnz_chr_id;
1141 ----------------------------------------------------------------------------------------------------
1142   BEGIN
1143     -- We need to validate the dnz_chr_id first
1144     -- We are taking care of the validating p_cle_id via cursor we use for calculations of oec
1145     validate_dnz_chr_id(p_dnz_chr_id    => p_dnz_chr_id,
1146                         x_return_status => l_return_status);
1147     IF (l_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
1148       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1149     ELSIF (l_return_status = Okl_Api.G_RET_STS_ERROR) THEN
1150       RAISE Okl_Api.G_EXCEPTION_ERROR;
1151     END IF;
1152 
1153     --Bug# 4631549
1154     --Find out if re-lease contract
1155     open l_chrb_csr(p_chr_id => p_dnz_chr_id);
1156     fetch l_chrb_csr into l_chrb_rec;
1157     close l_chrb_csr;
1158     --Bug# 4631549
1159 
1160         --Check whether terminated lines should be included
1161        -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1162        --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1163          -- AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1164                   --l_capred_incl_terminated := TRUE;
1165            --END IF;
1166 
1167            -- rmunjulu 4042892
1168     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1169       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1170 	  LOOP
1171         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1172           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1173 		  l_capred_incl_terminated := TRUE;
1174         END IF;
1175       END LOOP;
1176     END IF;
1177 
1178     -- Now we start calculations of the OEC
1179     IF (p_dnz_chr_id IS NOT NULL OR
1180        p_dnz_chr_id <> Okl_Api.G_MISS_NUM) AND
1181       (p_cle_id IS NULL OR
1182        p_cle_id = Okl_Api.G_MISS_NUM) THEN
1183       -- To get the OEC of the contract
1184 
1185           --Bug# 4631549 :
1186           If nvl(l_chrb_rec.orig_system_source_code,okl_api.g_miss_char) = 'OKL_RELEASE' Then
1187              If l_capred_incl_terminated = TRUE Then
1188                 OPEN l_chr_expcost_trmn_csr (p_chr_id => p_dnz_chr_id);
1189                 FETCH l_chr_expcost_trmn_csr into ln_contract_oec;
1190                 If l_chr_expcost_trmn_csr%NOTFOUND then
1191                     Okl_Api.set_message(p_app_name     => G_APP_NAME,
1192                                p_msg_name     => G_NO_MATCHING_RECORD,
1193                                p_token1       => G_COL_NAME_TOKEN,
1194                                p_token1_value => 'p_dnz_chr_id');
1195                     RAISE Okl_Api.G_EXCEPTION_ERROR;
1196                 End If;
1197                 Close l_chr_expcost_trmn_csr;
1198              Else
1199                 OPEN l_chr_expcost_csr (p_chr_id => p_dnz_chr_id);
1200                 FETCH l_chr_expcost_csr into ln_contract_oec;
1201                 If l_chr_expcost_csr%NOTFOUND then
1202                     Okl_Api.set_message(p_app_name     => G_APP_NAME,
1203                                p_msg_name     => G_NO_MATCHING_RECORD,
1204                                p_token1       => G_COL_NAME_TOKEN,
1205                                p_token1_value => 'p_dnz_chr_id');
1206                     RAISE Okl_Api.G_EXCEPTION_ERROR;
1207                 End If;
1208                 Close l_chr_expcost_csr;
1209              End If;
1210           Else
1211           --End Bug 4631549
1212           IF l_capred_incl_terminated = TRUE THEN
1213              OPEN  c_contract_oec_calc_incl_term(p_dnz_chr_id => p_dnz_chr_id);
1214          IF c_contract_oec_calc_incl_term%NOTFOUND THEN
1215            Okl_Api.set_message(p_app_name     => G_APP_NAME,
1216                                p_msg_name     => G_NO_MATCHING_RECORD,
1217                                p_token1       => G_COL_NAME_TOKEN,
1218                                p_token1_value => 'p_dnz_chr_id');
1219            RAISE Okl_Api.G_EXCEPTION_ERROR;
1220          END IF;
1221          FETCH c_contract_oec_calc_incl_term INTO ln_contract_oec;
1222          CLOSE c_contract_oec_calc_incl_term;
1223           ELSE
1224          OPEN  c_contract_oec_calc(p_dnz_chr_id => p_dnz_chr_id);
1225          IF c_contract_oec_calc%NOTFOUND THEN
1226            Okl_Api.set_message(p_app_name     => G_APP_NAME,
1227                                p_msg_name     => G_NO_MATCHING_RECORD,
1228                                p_token1       => G_COL_NAME_TOKEN,
1229                                p_token1_value => 'p_dnz_chr_id');
1230            RAISE Okl_Api.G_EXCEPTION_ERROR;
1231          END IF;
1232          FETCH c_contract_oec_calc INTO ln_contract_oec;
1233          CLOSE c_contract_oec_calc;
1234           END IF;
1235       End If; -- Bug# 4631549
1236       -- Final Total Contract OEC
1237       ln_contract_oec := NVL(ln_contract_oec,0);
1238       RETURN(ln_contract_oec);
1239     ELSIF (p_dnz_chr_id IS NOT NULL OR
1240        p_dnz_chr_id <> Okl_Api.G_MISS_NUM) AND
1241       (p_cle_id IS NOT NULL OR
1242        p_cle_id <> Okl_Api.G_MISS_NUM) THEN
1243       -- To get the Line Style Code
1244       OPEN  get_lty_code(p_cle_id => p_cle_id);
1245       IF get_lty_code%NOTFOUND THEN
1246         Okl_Api.set_message(p_app_name     => G_APP_NAME,
1247                             p_msg_name     => G_NO_MATCHING_RECORD,
1248                             p_token1       => G_COL_NAME_TOKEN,
1249                             p_token1_value => 'Financial Asset Line');
1250         RAISE Okl_Api.G_EXCEPTION_ERROR;
1251       END IF;
1252       FETCH get_lty_code INTO lv_lty_code;
1253       CLOSE get_lty_code;
1254       IF lv_lty_code = G_FIN_LINE_LTY_CODE THEN
1255         --Bug# 4631549
1256         If l_chrb_rec.orig_system_source_code = 'OKL_RELEASE' then
1257            Open l_cle_expcost_csr (p_cle_id => p_cle_id);
1258            Fetch l_cle_expcost_csr into ln_total_line_oec;
1259            If l_cle_expcost_csr%NOTFOUND Then
1260                Okl_Api.set_message(p_app_name     => G_APP_NAME,
1261                                    p_msg_name     => G_NO_MATCHING_RECORD,
1262                                    p_token1       => G_COL_NAME_TOKEN,
1263                                    p_token1_value => 'Financial Asset Line');
1264                RAISE Okl_Api.G_EXCEPTION_ERROR;
1265            End If;
1266            Close l_cle_expcost_csr;
1267            ln_total_line_oec := nvl(ln_total_line_oec,0);
1268         Else --Bug# 4631549 end
1269         -- To get the OEC of the model Line
1270         OPEN c_model_oec_calc(p_top_cle_id => p_cle_id,
1271                               p_dnz_chr_id => p_dnz_chr_id);
1272         IF c_model_oec_calc%NOTFOUND THEN
1273           Okl_Api.set_message(p_app_name     => G_APP_NAME,
1274                               p_msg_name     => G_NO_MATCHING_RECORD,
1275                               p_token1       => G_COL_NAME_TOKEN,
1276                               p_token1_value => 'Model Line');
1277           RAISE Okl_Api.G_EXCEPTION_ERROR;
1278         END IF;
1279         FETCH c_model_oec_calc INTO ln_model_line_oec;
1280         CLOSE c_model_oec_calc;
1281         -- To get the OEC of the Addon line
1282 -- DJANASWA change begin 11/12/08
1283 /*        OPEN c_addon_oec_calc(p_top_cle_id => p_cle_id,
1284                               p_dnz_chr_id => p_dnz_chr_id);
1285         FETCH c_addon_oec_calc INTO ln_addon_line_oec;
1286         CLOSE c_addon_oec_calc;
1287 */
1288         ln_addon_line_oec := Okl_Seeded_Functions_Pvt.total_asset_addon_cost(
1289                               p_contract_id => p_dnz_chr_id, p_contract_line_id => p_cle_id);
1290 -- DJANASWA change end 11/12/08
1291 
1292         ln_total_line_oec := NVL(ln_model_line_oec,0) + NVL(ln_addon_line_oec,0);
1293       End If; --Bug# 4631549
1294       ELSE
1295         Okl_Api.set_message(p_app_name     => G_APP_NAME,
1296                             p_msg_name     => G_LINE_RECORD);
1297         RAISE Okl_Api.G_EXCEPTION_ERROR;
1298       END IF;
1299       RETURN(ln_total_line_oec);
1300     ELSE
1301       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1302                           p_msg_name     => G_INVALID_CRITERIA);
1303       RAISE Okl_Api.G_EXCEPTION_ERROR;
1304     END IF;
1305   EXCEPTION
1306     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
1307     -- If the cursor is open then it has to be closed
1308     IF get_lty_code%ISOPEN THEN
1309        CLOSE get_lty_code;
1310     END IF;
1311     IF c_contract_oec_calc%ISOPEN THEN
1312        CLOSE c_contract_oec_calc;
1313     END IF;
1314     IF c_contract_oec_calc_incl_term%ISOPEN THEN
1315        CLOSE c_contract_oec_calc_incl_term;
1316     END IF;
1317     IF c_model_oec_calc%ISOPEN THEN
1318        CLOSE c_model_oec_calc;
1319     END IF;
1320     IF c_addon_oec_calc%ISOPEN THEN
1321        CLOSE c_addon_oec_calc;
1322     END IF;
1323     RETURN(0);
1324     WHEN Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR THEN
1325     -- If the cursor is open then it has to be closed
1326     IF get_lty_code%ISOPEN THEN
1327        CLOSE get_lty_code;
1328     END IF;
1329     IF c_contract_oec_calc%ISOPEN THEN
1330        CLOSE c_contract_oec_calc;
1331     END IF;
1332     IF c_contract_oec_calc_incl_term%ISOPEN THEN
1333        CLOSE c_contract_oec_calc_incl_term;
1334     END IF;
1335     IF c_model_oec_calc%ISOPEN THEN
1336        CLOSE c_model_oec_calc;
1337     END IF;
1338     IF c_addon_oec_calc%ISOPEN THEN
1339        CLOSE c_addon_oec_calc;
1340     END IF;
1341     RETURN(0);
1342     WHEN OTHERS THEN
1343 
1344     -- If the cursor is open then it has to be closed
1345     IF get_lty_code%ISOPEN THEN
1346        CLOSE get_lty_code;
1347     END IF;
1348     IF c_contract_oec_calc%ISOPEN THEN
1349        CLOSE c_contract_oec_calc;
1350     END IF;
1351     IF c_contract_oec_calc_incl_term%ISOPEN THEN
1352        CLOSE c_contract_oec_calc_incl_term;
1353     END IF;
1354     IF c_model_oec_calc%ISOPEN THEN
1355        CLOSE c_model_oec_calc;
1356     END IF;
1357     IF c_addon_oec_calc%ISOPEN THEN
1358        CLOSE c_addon_oec_calc;
1359     END IF;
1360     RETURN(0);
1361   END line_oec;
1362 
1363 --Bug# 3638568 : This formula modified to conditionally include terminated lines
1364 ----------------------------------------------------------------------------------------------------
1365 
1366     -- Start of Comments
1367     -- Created By:       Santhosh Siruvole (ssiruvol)
1368     -- Function Name  contract_tradein
1369     -- Description:   returns the sum of tradein values of all financial asset lines of a contract.
1370     -- Dependencies:
1371     -- Parameters: contract id.
1372     -- Version: 1.0
1373     -- End of Commnets
1374 
1375 ----------------------------------------------------------------------------------------------------
1376   FUNCTION contract_tradein(
1377             p_chr_id          IN  NUMBER,
1378             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1379 
1380     l_api_name          CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_TRADEIN_VALUE';
1381     l_api_version       CONSTANT NUMBER       := 1;
1382     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1383     x_msg_count         NUMBER;
1384     x_msg_data          VARCHAR2(256);
1385 
1386     l_tradeIn_value NUMBER := 0;
1387 
1388     l_discount_incl_terminated BOOLEAN := FALSE;
1389 
1390   BEGIN
1391 
1392        IF ( p_chr_id IS NULL ) THEN
1393            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1394        END IF;
1395 
1396            -- rmunjulu 4042892
1397     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1398       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1399 	  LOOP
1400         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1401           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1402 		  l_discount_incl_terminated := TRUE;
1403         END IF;
1404       END LOOP;
1405     END IF;
1406 
1407     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
1408       -- AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1409       -- AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1410            -- rmunjulu 4042892
1411 	IF l_discount_incl_terminated THEN
1412       SELECT NVL(SUM(kle.tradein_amount),0) INTO l_tradeIn_value
1413       FROM OKC_LINE_STYLES_B LS,
1414            okl_K_lines_full_v kle,
1415            okc_statuses_b sts
1416       WHERE LS.ID = KLE.LSE_ID
1417            AND LS.LTY_CODE ='FREE_FORM1'
1418            AND KLE.dnz_chr_iD = p_chr_id
1419            AND kle.sts_code = sts.code
1420            AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1421     ELSE
1422       SELECT NVL(SUM(kle.tradein_amount),0) INTO l_tradeIn_value
1423       FROM OKC_LINE_STYLES_B LS,
1424            okl_K_lines_full_v kle,
1425            okc_statuses_b sts
1426       WHERE LS.ID = KLE.LSE_ID
1427            AND LS.LTY_CODE ='FREE_FORM1'
1428            AND KLE.dnz_chr_iD = p_chr_id
1429            AND kle.sts_code = sts.code
1430            AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1431         END IF;
1432 
1433     RETURN l_tradeIn_value;
1434 
1435 
1436     EXCEPTION
1437 
1438         WHEN OTHERS THEN
1439                Okl_Api.SET_MESSAGE(
1440                         p_app_name     => G_APP_NAME,
1441                         p_msg_name     => G_UNEXPECTED_ERROR,
1442                         p_token1       => G_SQLCODE_TOKEN,
1443                         p_token1_value => SQLCODE,
1444                         p_token2       => G_SQLERRM_TOKEN,
1445                         p_token2_value => SQLERRM);
1446                 RETURN NULL;
1447 
1448 
1449   END contract_tradein;
1450 
1451 --Bug# 3638568 : This function modified to conditionally include terminated lines if called from pricing
1452 ----------------------------------------------------------------------------------------------------
1453 
1454     -- Start of Comments
1455     -- Created By:       Santhosh Siruvole (ssiruvol)
1456     -- Function Name  line_tradein
1457     -- Description:   returns the tradein of a financial asset line.
1458     -- Dependencies:
1459     -- Parameters: contract id and line id.
1460     -- Version: 1.0
1461     -- End of Commnets
1462 
1463 ----------------------------------------------------------------------------------------------------
1464   FUNCTION line_tradein(
1465             p_chr_id          IN  NUMBER,
1466             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1467 
1468     l_api_name          CONSTANT VARCHAR2(30) := 'RETURN_LINE_TRADEIN_VALUE';
1469     l_api_version       CONSTANT NUMBER       := 1;
1470     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1471     x_msg_count         NUMBER;
1472     x_msg_data          VARCHAR2(256);
1473 
1474     l_tradeIn_value NUMBER := 0.0;
1475 
1476     CURSOR trdinval_csr( chrID NUMBER, lineID NUMBER) IS
1477     SELECT NVL(kle.tradein_amount,0.0) amnt,
1478            kle.dnz_chr_id chrId,
1479            kle.id lneId
1480       FROM OKC_LINE_STYLES_B LS,
1481            okl_K_lines_full_v kle,
1482            okc_statuses_b sts
1483       WHERE LS.ID = kLE.LSE_ID
1484            AND LS.LTY_CODE ='FREE_FORM1'
1485            AND kLE.dnz_chr_id = chrID
1486            AND kLE.ID = lineID
1487            AND kle.sts_code = sts.code
1488            AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1489 
1490     CURSOR trdinval_csr_incl_terminated( chrID NUMBER, lineID NUMBER) IS
1491     SELECT NVL(kle.tradein_amount,0.0) amnt,
1492            kle.dnz_chr_id chrId,
1493            kle.id lneId
1494       FROM OKC_LINE_STYLES_B LS,
1495            okl_K_lines_full_v kle,
1496            okc_statuses_b sts
1497       WHERE LS.ID = kLE.LSE_ID
1498            AND LS.LTY_CODE ='FREE_FORM1'
1499            AND kLE.dnz_chr_id = chrID
1500            AND kLE.ID = lineID
1501            AND kle.sts_code = sts.code
1502            AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1503 
1504    l_trdinval_rec trdinval_csr%ROWTYPE;
1505 
1506    l_discount_incl_terminated BOOLEAN := FALSE;
1507 
1508   BEGIN
1509 
1510     IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL))THEN
1511            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1512     END IF;
1513 
1514            -- rmunjulu 4042892
1515     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1516       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1517 	  LOOP
1518         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1519           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1520 		  l_discount_incl_terminated := TRUE;
1521         END IF;
1522       END LOOP;
1523     END IF;
1524 
1525     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
1526           --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1527           --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1528 
1529     IF  l_discount_incl_terminated THEN
1530                   OPEN  trdinval_csr_incl_terminated ( p_chr_id, p_line_id );
1531               FETCH trdinval_csr_incl_terminated INTO l_trdinval_rec;
1532               IF( trdinval_csr_incl_terminated%NOTFOUND ) THEN
1533                  RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1534               END IF;
1535               CLOSE trdinval_csr_incl_terminated;
1536     ELSE
1537           OPEN  trdinval_csr ( p_chr_id, p_line_id );
1538           FETCH trdinval_csr INTO l_trdinval_rec;
1539           IF( trdinval_csr%NOTFOUND ) THEN
1540              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1541           END IF;
1542           CLOSE trdinval_csr;
1543         END IF;
1544 
1545     l_tradeIn_value := l_trdinval_rec.amnt;
1546     RETURN l_tradeIn_value;
1547 
1548 
1549    EXCEPTION
1550         WHEN OTHERS THEN
1551       IF trdinval_csr_incl_terminated%ISOPEN THEN
1552              CLOSE trdinval_csr_incl_terminated;
1553           END IF;
1554       IF trdinval_csr%ISOPEN THEN
1555              CLOSE trdinval_csr;
1556           END IF;
1557             Okl_Api.SET_MESSAGE(
1558                       p_app_name     => G_APP_NAME,
1559                       p_msg_name     => G_UNEXPECTED_ERROR,
1560                       p_token1       => G_SQLCODE_TOKEN,
1561                       p_token1_value => SQLCODE,
1562                       p_token2       => G_SQLERRM_TOKEN,
1563                       p_token2_value => SQLERRM);
1564              RETURN NULL;
1565 
1566   END line_tradein;
1567 
1568 --Bug# 3638568 : This function modified to conditionally include terminated lines if called from pricing
1569 ----------------------------------------------------------------------------------------------------
1570 
1571     -- Start of Comments
1572     -- Created By:       Santhosh Siruvole (ssiruvol)
1573     -- Function Name  contract_capreduction
1574     -- Description:   returns the sum of capital reduction of financial asset lines of a contract.
1575     -- Dependencies:
1576     -- Parameters: contract id.
1577     -- Version: 1.0
1578     -- End of Commnets
1579 
1580 ----------------------------------------------------------------------------------------------------
1581   FUNCTION contract_capital_reduction(
1582             p_chr_id          IN  NUMBER,
1583             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1584 
1585     l_api_name          CONSTANT VARCHAR2(60) := 'RETURN_CONTRACT_CAPITAL_REDUCTION_VALUE';
1586     l_api_version       CONSTANT NUMBER       := 1;
1587     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1588     x_msg_count         NUMBER;
1589     x_msg_data          VARCHAR2(256);
1590 
1591     l_capred_value NUMBER := 0;
1592 
1593      CURSOR l_lines_csr( chrId NUMBER ) IS
1594      SELECT kle.id
1595      FROM  okc_line_styles_b ls,
1596            okl_K_lines_full_v kle,
1597            okc_statuses_b sts
1598      WHERE ls.id = kle.lse_id
1599           AND ls.lty_code = 'FREE_FORM1'
1600           AND kle.dnz_chr_id = chrId
1601           AND kle.sts_code = sts.code
1602 -- start: cklee: okl.h Sales Quote IA Authoring
1603           AND kle.CAPITALIZE_DOWN_PAYMENT_YN = 'Y'
1604 -- end: cklee: okl.h Sales Quote IA Authoring
1605           AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1606 
1607 
1608      CURSOR l_lines_csr_incl_terminated( chrId NUMBER ) IS
1609      SELECT kle.id
1610      FROM  okc_line_styles_b ls,
1611            okl_K_lines_full_v kle,
1612            okc_statuses_b sts
1613      WHERE ls.id = kle.lse_id
1614           AND ls.lty_code = 'FREE_FORM1'
1615           AND kle.dnz_chr_id = chrId
1616           AND kle.sts_code = sts.code
1617 -- start: cklee: okl.h Sales Quote IA Authoring
1618           AND kle.CAPITALIZE_DOWN_PAYMENT_YN = 'Y'
1619 -- end: cklee: okl.h Sales Quote IA Authoring
1620           AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1621 
1622 
1623     l_lines_rec l_lines_csr%ROWTYPE;
1624 
1625     l_discount_incl_terminated BOOLEAN := FALSE;
1626   BEGIN
1627 
1628        IF ( p_chr_id IS NULL ) THEN
1629            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1630        END IF;
1631 
1632            -- rmunjulu 4042892
1633     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1634       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1635 	  LOOP
1636         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1637           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1638 		  l_discount_incl_terminated := TRUE;
1639         END IF;
1640       END LOOP;
1641     END IF;
1642 
1643    -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
1644         --  AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1645          -- AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1646     IF l_discount_incl_terminated THEN
1647        FOR l_lines_rec IN l_lines_csr_incl_terminated ( p_chr_id )
1648        LOOP
1649 
1650            l_capred_value := l_capred_value + line_capital_reduction(p_chr_id, l_lines_rec.id);
1651 
1652        END LOOP;
1653     ELSE
1654        FOR l_lines_rec IN l_lines_csr ( p_chr_id )
1655        LOOP
1656 
1657            l_capred_value := l_capred_value + line_capital_reduction(p_chr_id, l_lines_rec.id);
1658 
1659        END LOOP;
1660     END IF;
1661 
1662     RETURN l_capred_value;
1663 
1664 
1665     EXCEPTION
1666 
1667         WHEN OTHERS THEN
1668             IF l_lines_csr_incl_terminated%ISOPEN THEN
1669                    CLOSE l_lines_csr_incl_terminated;
1670                 END IF;
1671             IF l_lines_csr%ISOPEN THEN
1672                    CLOSE l_lines_csr;
1673                 END IF;
1674                Okl_Api.SET_MESSAGE(
1675                         p_app_name     => G_APP_NAME,
1676                         p_msg_name     => G_UNEXPECTED_ERROR,
1677                         p_token1       => G_SQLCODE_TOKEN,
1678                         p_token1_value => SQLCODE,
1679                         p_token2       => G_SQLERRM_TOKEN,
1680                         p_token2_value => SQLERRM);
1681                 RETURN NULL;
1682 
1683   END contract_capital_reduction;
1684 
1685 --Bug# 3638568 : This function modified to conditionally include TERMINATED lines if called from pricing
1686 ----------------------------------------------------------------------------------------------------
1687 
1688     -- Start of Comments
1689     -- Created By:       Santhosh Siruvole (ssiruvol)
1690     -- Function Name  line_capreduction
1691     -- Description:   returns the capital reduction of a financial asset line.
1692     -- Dependencies:
1693     -- Parameters: contract id and line id
1694     -- Version: 1.0
1695     -- End of Commnets
1696 
1697 ----------------------------------------------------------------------------------------------------
1698   FUNCTION line_capital_reduction(
1699             p_chr_id          IN  NUMBER,
1700             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1701 
1702 
1703     l_api_name          CONSTANT VARCHAR2(60) := 'RETURN_LINE_CAPITAL_REDUCTION_VALUE';
1704     l_api_version       CONSTANT NUMBER       := 1;
1705     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1706     x_msg_count         NUMBER;
1707     x_msg_data          VARCHAR2(256);
1708 
1709     l_capred_value NUMBER := 0;
1710     l_capred_percent NUMBER := 0;
1711         l_capred_incl_terminated BOOLEAN := FALSE;
1712         l_caplitalize_flag varchar2(3);
1713 
1714 -- start: cklee: okl.h Sales Quote IA Authoring
1715      CURSOR l_lines_csr(p_chr_id  number,
1716                         p_line_id number)
1717           IS
1718       SELECT NVL(kle.capital_reduction,0) capital_reduction,
1719              NVL(kle.capital_reduction_percent,0) capital_reduction_percent,
1720              NVL(kle.CAPITALIZE_DOWN_PAYMENT_YN, 'N') CAPITALIZE_DOWN_PAYMENT_YN,
1721              sts.ste_code
1722       FROM OKC_LINE_STYLES_B LS,
1723            okl_K_lines_full_v kle,
1724            okc_statuses_b sts
1725       WHERE LS.ID = KLE.LSE_ID
1726            AND LS.LTY_CODE ='FREE_FORM1'
1727            AND KLE.dnz_chr_id = p_chr_id
1728            AND KLE.ID = p_line_id
1729            AND kle.sts_code = sts.code
1730            ;
1731 -- end: cklee: okl.h Sales Quote IA Authoring
1732 
1733   BEGIN
1734 
1735     IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL))THEN
1736       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1737     END IF;
1738 
1739    -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
1740        --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1741        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1742                   --l_capred_incl_terminated := TRUE;
1743     --END IF;
1744 
1745            -- rmunjulu 4042892
1746     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1747       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1748 	  LOOP
1749         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1750           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1751 		  l_capred_incl_terminated := TRUE;
1752         END IF;
1753       END LOOP;
1754     END IF;
1755 
1756     IF l_capred_incl_terminated = TRUE THEN
1757 
1758 -- start: cklee: okl.h Sales Quote IA Authoring
1759       FOR this_row IN l_lines_csr(p_chr_id, p_line_id) LOOP
1760         IF this_row.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD') AND
1761            this_row.CAPITALIZE_DOWN_PAYMENT_YN = 'Y' THEN
1762            l_capred_value := this_row.capital_reduction;
1763         END IF;
1764       END LOOP;
1765 /*      SELECT NVL(kle.capital_reduction,0) INTO l_capred_value
1766       FROM OKC_LINE_STYLES_B LS,
1767            okl_K_lines_full_v kle,
1768            okc_statuses_b sts
1769       WHERE LS.ID = KLE.LSE_ID
1770            AND LS.LTY_CODE ='FREE_FORM1'
1771            AND KLE.dnz_chr_id = p_chr_id
1772            AND KLE.ID = p_line_id
1773            AND kle.sts_code = sts.code
1774            AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1775 */
1776 -- end: cklee: okl.h Sales Quote IA Authoring
1777     ELSE
1778 -- start: cklee: okl.h Sales Quote IA Authoring
1779       FOR this_row IN l_lines_csr(p_chr_id, p_line_id) LOOP
1780         IF this_row.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD') AND
1781            this_row.CAPITALIZE_DOWN_PAYMENT_YN = 'Y' THEN
1782            l_capred_value := this_row.capital_reduction;
1783         END IF;
1784       END LOOP;
1785 
1786 /*      SELECT NVL(kle.capital_reduction,0) INTO l_capred_value
1787       FROM OKC_LINE_STYLES_B LS,
1788            okl_K_lines_full_v kle,
1789            okc_statuses_b sts
1790       WHERE LS.ID = KLE.LSE_ID
1791            AND LS.LTY_CODE ='FREE_FORM1'
1792            AND KLE.dnz_chr_id = p_chr_id
1793            AND KLE.ID = p_line_id
1794            AND kle.sts_code = sts.code
1795            AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1796 */
1797     END IF;
1798 
1799 -- end: cklee: okl.h Sales Quote IA Authoring
1800     IF( l_capred_value = 0) THEN
1801        IF l_capred_incl_terminated = TRUE THEN
1802 -- start: cklee: okl.h Sales Quote IA Authoring
1803       FOR this_row IN l_lines_csr(p_chr_id, p_line_id) LOOP
1804         IF this_row.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD') AND
1805            this_row.CAPITALIZE_DOWN_PAYMENT_YN = 'Y' THEN
1806            l_capred_percent := this_row.capital_reduction_percent;
1807         END IF;
1808       END LOOP;
1809 
1810 /*          SELECT NVL(kle.capital_reduction_percent,0) INTO l_capred_percent
1811           FROM OKC_LINE_STYLES_B LS,
1812                okl_K_lines_full_v kle,
1813                okc_statuses_b sts
1814           WHERE LS.ID = KLE.LSE_ID
1815              AND LS.LTY_CODE ='FREE_FORM1'
1816              AND KLE.dnz_chr_id = p_chr_id
1817              AND KLE.ID = p_line_id
1818              AND kle.sts_code = sts.code
1819              AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1820 */
1821 -- end: cklee: okl.h Sales Quote IA Authoring
1822        ELSE
1823 -- start: cklee: okl.h Sales Quote IA Authoring
1824       FOR this_row IN l_lines_csr(p_chr_id, p_line_id) LOOP
1825         IF this_row.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD') AND
1826            this_row.CAPITALIZE_DOWN_PAYMENT_YN = 'Y' THEN
1827            l_capred_percent := this_row.capital_reduction_percent;
1828         END IF;
1829       END LOOP;
1830 
1831 /*          SELECT NVL(kle.capital_reduction_percent,0) INTO l_capred_percent
1832           FROM OKC_LINE_STYLES_B LS,
1833                okl_K_lines_full_v kle,
1834                okc_statuses_b sts
1835           WHERE LS.ID = KLE.LSE_ID
1836              AND LS.LTY_CODE ='FREE_FORM1'
1837              AND KLE.dnz_chr_id = p_chr_id
1838              AND KLE.ID = p_line_id
1839              AND kle.sts_code = sts.code
1840              AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1841 */
1842 -- end: cklee: okl.h Sales Quote IA Authoring
1843        END IF;
1844 
1845        IF( l_capred_percent <> 0) THEN
1846          l_capred_value := line_oec( p_chr_id, p_line_id ) * l_capred_percent / 100.00;
1847        END IF;
1848 
1849      END IF;
1850 
1851      RETURN l_capred_value;
1852 
1853 
1854     EXCEPTION
1855 
1856         WHEN OTHERS THEN
1857                Okl_Api.SET_MESSAGE(
1858                         p_app_name     => G_APP_NAME,
1859                         p_msg_name     => G_UNEXPECTED_ERROR,
1860                         p_token1       => G_SQLCODE_TOKEN,
1861                         p_token1_value => SQLCODE,
1862                         p_token2       => G_SQLERRM_TOKEN,
1863                         p_token2_value => SQLERRM);
1864 
1865                 RETURN NULL;
1866 
1867   END line_capital_reduction;
1868 
1869 --Bug# 3638568 : This function modified to conditionally include TERMINATED lines if called from pricing
1870 ----------------------------------------------------------------------------------------------------
1871 
1872     -- Start of Comments
1873     -- Created By:       Santhosh Siruvole (ssiruvol)
1874     -- Function Name  line_feescapitalized
1875     -- Description:   returns the capitalized fees of a financial asset line.
1876     -- Dependencies:
1877     -- Parameters: contract id and line id
1878     -- Version: 1.0
1879     -- End of Commnets
1880 
1881 ----------------------------------------------------------------------------------------------------
1882   FUNCTION line_fees_capitalized(
1883             p_chr_id          IN  NUMBER,
1884             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1885 
1886     l_api_name          CONSTANT VARCHAR2(60) := 'RETURN_LINE_FEES_CAPITAL_AMOUNT_VALUE';
1887     l_api_version       CONSTANT NUMBER       := 1;
1888     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1889     x_msg_count         NUMBER;
1890     x_msg_data          VARCHAR2(256);
1891 
1892     l_fees_value NUMBER := 0;
1893 
1894     CURSOR l_fee_csr( kleId NUMBER) IS
1895     SELECT NVL(SUM(kle_cov.capital_amount),0) CapAmountLines
1896        FROM   OKC_LINE_STYLES_B  LSEB,
1897               OKC_K_ITEMS        CIM,
1898               OKL_K_LINES        KLE_COV,
1899               OKC_K_LINES_B      CLEB_COV,
1900               OKC_STATUSES_B     STSB
1901         WHERE LSEB.ID               = CLEB_COV.LSE_ID
1902         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
1903         AND   CIM.jtot_object1_code = 'OKX_COVASST'
1904         AND   CLEB_COV.id           =  CIM.cle_id
1905         AND   KLE_COV.id            =  CLEB_COV.ID
1906         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
1907         AND   cim.object1_id1       =  to_char(kleId)
1908         AND   CLEB_COV.sts_code     =  STSB.code
1909         AND   STSB.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1910 
1911     CURSOR l_fee_csr_incl_terminated( kleId NUMBER) IS
1912     SELECT NVL(SUM(kle_cov.capital_amount),0) CapAmountLines
1913        FROM   OKC_LINE_STYLES_B  LSEB,
1914               OKC_K_ITEMS        CIM,
1915               OKL_K_LINES        KLE_COV,
1916               OKC_K_LINES_B      CLEB_COV,
1917               OKC_STATUSES_B     STSB
1918         WHERE LSEB.ID               = CLEB_COV.LSE_ID
1919         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
1920         AND   CIM.jtot_object1_code = 'OKX_COVASST'
1921         AND   CLEB_COV.id           =  CIM.cle_id
1922         AND   KLE_COV.id            =  CLEB_COV.ID
1923         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
1924         AND   cim.object1_id1       =  to_char(kleId)
1925         AND   CLEB_COV.sts_code     =  STSB.code
1926         AND   STSB.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1927 
1928 --Bug# 5150150 -- start
1929     CURSOR l_sys_source_code_csr (p_chr_id NUMBER) IS
1930     SELECT ID,ORIG_SYSTEM_SOURCE_CODE
1931     FROM OKC_K_HEADERS_B
1932     WHERE ID = p_chr_id;
1933 
1934    l_chr_id okc_k_headers_b.id%type;
1935    l_orig_systm_source_code okc_k_headers_b.orig_system_source_code%type;
1936 --Bug# 5150150 -- end
1937    l_feeline_rec l_fee_csr%ROWTYPE;
1938    l_discount_incl_terminated BOOLEAN := FALSE;
1939 
1940   BEGIN
1941 
1942        IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL)) THEN
1943            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1944        END IF;
1945 
1946 --Bug# 5150150 -- start
1947        OPEN  l_sys_source_code_csr ( p_chr_id );
1948        FETCH l_sys_source_code_csr INTO l_chr_id, l_orig_systm_source_code;
1949        CLOSE l_sys_source_code_csr;
1950 
1951        if ((l_orig_systm_source_code is not null) and (l_orig_systm_source_code = 'OKL_RELEASE')) then
1952                 l_fees_value := 0.0;
1953        else
1954 --Bug# 5150150 -- end
1955            -- rmunjulu 4042892
1956     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1957       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1958 	  LOOP
1959         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1960           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1961 		  l_discount_incl_terminated := TRUE;
1962         END IF;
1963       END LOOP;
1964     END IF;
1965 
1966     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
1967       -- AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1968        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1969     IF l_discount_incl_terminated THEN
1970                   OPEN  l_fee_csr_incl_terminated ( p_line_id );
1971               FETCH l_fee_csr_incl_terminated INTO l_feeline_rec;
1972           IF( l_fee_csr_incl_terminated%NOTFOUND ) THEN
1973              l_fees_value := 0.0;
1974           END IF;
1975               CLOSE l_fee_csr_incl_terminated;
1976     ELSE
1977           OPEN  l_fee_csr( p_line_id );
1978           FETCH l_fee_csr INTO l_feeline_rec;
1979           IF( l_fee_csr%NOTFOUND ) THEN
1980              l_fees_value := 0.0;
1981           END IF;
1982           CLOSE l_fee_csr;
1983         END IF;
1984 
1985     l_fees_value := l_feeline_rec.CapAmountLines;
1986 
1987    end if;
1988     RETURN l_fees_value;
1989 
1990 
1991     EXCEPTION
1992 
1993         WHEN OTHERS THEN
1994             IF l_fee_csr_incl_terminated%ISOPEN THEN
1995           CLOSE l_fee_csr_incl_terminated;
1996         END IF;
1997             IF l_fee_csr%ISOPEN THEN
1998           CLOSE l_fee_csr;
1999         END IF;
2000 
2001                 Okl_Api.SET_MESSAGE(
2002                         p_app_name     => G_APP_NAME,
2003                         p_msg_name     => G_UNEXPECTED_ERROR,
2004                         p_token1       => G_SQLCODE_TOKEN,
2005                         p_token1_value => SQLCODE,
2006                         p_token2       => G_SQLERRM_TOKEN,
2007                         p_token2_value => SQLERRM);
2008         RETURN NULL;
2009 
2010   END line_fees_capitalized;
2011 
2012 --Bug# 3638568 : This function modified to conditionally include TERMINATED lines if called from pricing
2013 ----------------------------------------------------------------------------------------------------
2014 
2015     -- Start of Comments
2016     -- Created By:       Santhosh Siruvole (ssiruvol)
2017     -- Function Name  contract_feescapitalized
2018     -- Description:   returns the sum of capitalized fees of all financial asset lines of a contract.
2019     -- Dependencies:
2020     -- Parameters: contract id.
2021     -- Version: 1.0
2022     -- End of Commnets
2023 
2024 ----------------------------------------------------------------------------------------------------
2025   FUNCTION contract_fees_capitalized(
2026             p_chr_id          IN  NUMBER,
2027             p_line_id         IN  NUMBER) RETURN NUMBER  IS
2028 
2029     l_api_name          CONSTANT VARCHAR2(60) := 'RETURN_LINE_FEES_CAPITAL_AMOUNT_VALUE';
2030     l_api_version       CONSTANT NUMBER       := 1;
2031     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
2032     x_msg_count         NUMBER;
2033     x_msg_data          VARCHAR2(256);
2034 
2035 
2036      CURSOR l_lines_csr( chrId NUMBER ) IS
2037      SELECT kle.id
2038      FROM   okc_line_styles_b ls,
2039             okl_K_lines_full_v kle,
2040             okc_statuses_b sts
2041      WHERE ls.id = kle.lse_id
2042           AND ls.lty_code = 'FREE_FORM1'
2043           AND kle.dnz_chr_id = chrId
2044           AND kle.sts_code = sts.code
2045           AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2046 
2047      CURSOR l_lines_csr_incl_terminated( chrId NUMBER ) IS
2048      SELECT kle.id
2049      FROM   okc_line_styles_b ls,
2050             okl_K_lines_full_v kle,
2051             okc_statuses_b sts
2052      WHERE ls.id = kle.lse_id
2053           AND ls.lty_code = 'FREE_FORM1'
2054           AND kle.dnz_chr_id = chrId
2055           AND kle.sts_code = sts.code
2056           AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
2057 
2058 
2059 
2060     l_lines_rec l_lines_csr%ROWTYPE;
2061 
2062     l_fees_value NUMBER := 0;
2063 
2064     l_discount_incl_terminated BOOLEAN := FALSE;
2065 
2066   BEGIN
2067 
2068        IF ( p_chr_id IS NULL ) THEN
2069            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2070        END IF;
2071 
2072            -- rmunjulu 4042892
2073     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
2074       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
2075 	  LOOP
2076         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
2077           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
2078 		  l_discount_incl_terminated := TRUE;
2079         END IF;
2080       END LOOP;
2081     END IF;
2082 
2083     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
2084       -- AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
2085        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
2086     IF l_discount_incl_terminated THEN
2087            FOR l_lines_rec IN l_lines_csr_incl_terminated ( p_chr_id )
2088        LOOP
2089 
2090            l_fees_value := l_fees_value + line_fees_capitalized(p_chr_id, l_lines_rec.id);
2091 
2092        END LOOP;
2093     ELSE
2094        FOR l_lines_rec IN l_lines_csr ( p_chr_id )
2095        LOOP
2096 
2097            l_fees_value := l_fees_value + line_fees_capitalized(p_chr_id, l_lines_rec.id);
2098 
2099        END LOOP;
2100     END IF;
2101 
2102     RETURN l_fees_value;
2103 
2104 
2105     EXCEPTION
2106 
2107         WHEN OTHERS THEN
2108            IF l_lines_csr_incl_terminated%ISOPEN THEN
2109              CLOSE l_lines_csr_incl_terminated;
2110            END IF;
2111            IF l_lines_csr%ISOPEN THEN
2112              CLOSE l_lines_csr;
2113            END IF;
2114        Okl_Api.SET_MESSAGE(p_app_name     => G_APP_NAME,
2115                            p_msg_name     => G_UNEXPECTED_ERROR,
2116                            p_token1       => G_SQLCODE_TOKEN,
2117                            p_token1_value => SQLCODE,
2118                            p_token2       => G_SQLERRM_TOKEN,
2119                            p_token2_value => SQLERRM);
2120        RETURN NULL;
2121 
2122   END contract_fees_capitalized;
2123 
2124 ----------------------------------------------------------------------------------------------------
2125 
2126     -- Start of Comments
2127     -- Created By:       Santhosh Siruvole (ssiruvol)
2128     -- Function Name  line_servicecapitalized
2129     -- Description:   returns the capitalized service fees of a financial asset line.
2130     -- Dependencies:
2131     -- Parameters: contract id and line id
2132     -- Version: 1.0
2133     -- End of Commnets
2134 
2135 ----------------------------------------------------------------------------------------------------
2136   FUNCTION line_service_capitalized(
2137             p_chr_id          IN  NUMBER,
2138             p_line_id         IN  NUMBER) RETURN NUMBER  IS
2139 
2140     l_api_name		CONSTANT VARCHAR2(60) := 'RETURN_LINE_SVC_CAP_AMNT_VALUE';
2141     l_api_version	CONSTANT NUMBER	      := 1;
2142     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
2143     x_msg_count         NUMBER;
2144     x_msg_data          VARCHAR2(256);
2145 
2146     l_srvcs_value NUMBER := 0;
2147 
2148 
2149     CURSOR l_srvcline_csr ( kleId NUMBER ) IS
2150     SELECT NVL(SUM(kle.capital_amount),0) CapAmountSubLines
2151     FROM OKC_LINE_STYLES_B LS,
2152          okc_k_items cim,
2153 	 okl_K_lines_full_v kle,
2154 	 okc_statuses_b sts
2155     WHERE LS.ID = KLE.LSE_ID
2156           AND ls.lty_code = 'LINK_SERV_ASSET'
2157           AND cim.jtot_object1_code = 'OKX_COVASST'
2158           AND kle.id = cim.cle_id
2159           AND cim.object1_id1 = to_char(kleId)
2160 	  AND kle.sts_code = sts.code
2161 	  AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2162 
2163     CURSOR srvc_strm_type_csr ( kleid NUMBER ) IS
2164     SELECT sty.capitalize_yn,
2165            sty.name
2166     FROM okl_strm_type_v sty,
2167          okc_k_items cim,
2168          okc_line_styles_b ls,
2169 	 okl_K_lines_full_v kle,
2170 	 okc_statuses_b sts
2171     WHERE cim.cle_id = kle.id
2172          AND ls.id = kle.lse_id
2173          AND ls.lty_code = 'SOLD_SERVICE'
2174          AND cim.object1_id1 = sty.id
2175          AND cim.object1_id2 = '#'
2176          AND kle.id = kleid
2177 	 AND kle.sts_code = sts.code
2178 	 AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2179 
2180 
2181    l_srvcline_rec l_srvcline_csr%ROWTYPE;
2182    l_srvcstrm_rec srvc_strm_type_csr%ROWTYPE;
2183 
2184   BEGIN
2185 
2186        IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL))THEN
2187            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2188        END IF;
2189 
2190       OPEN  srvc_strm_type_csr( p_line_id );
2191       FETCH srvc_strm_type_csr INTO l_srvcstrm_rec;
2192       IF( srvc_strm_type_csr%NOTFOUND ) THEN
2193           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2194       END IF;
2195       CLOSE srvc_strm_type_csr;
2196 
2197       IF( UPPER(l_srvcstrm_rec.capitalize_YN) = 'N' ) THEN
2198           RETURN 0.0;
2199       END IF;
2200 
2201       OPEN  l_srvcline_csr( p_line_id );
2202       FETCH l_srvcline_csr INTO l_srvcline_rec;
2203       IF( l_srvcline_csr%NOTFOUND ) THEN
2204           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2205       END IF;
2206       CLOSE l_srvcline_csr;
2207 
2208       l_srvcs_value := l_srvcline_rec.CapAmountSubLines;
2209 
2210       RETURN l_srvcs_value;
2211 
2212 
2213     EXCEPTION
2214 
2215 	WHEN OTHERS THEN
2216                Okl_Api.SET_MESSAGE(
2217                         p_app_name     => G_APP_NAME,
2218                         p_msg_name     => G_UNEXPECTED_ERROR,
2219                         p_token1       => G_SQLCODE_TOKEN,
2220                         p_token1_value => SQLCODE,
2221                         p_token2       => G_SQLERRM_TOKEN,
2222                         p_token2_value => SQLERRM);
2223                 RETURN NULL;
2224 
2225 
2226   END line_service_capitalized;
2227 
2228 ------------------------------------------------------------------------------
2229 -- Start of comments
2230 --
2231 -- Procedure Name  : contract_total_adjustments
2232 -- Description     : Sum of all approved requests for specfiic contract where type = prefunding
2233 --                   and amount is negative
2234 -- Business Rules  :
2235 -- Parameters      :IN: p_contract_id, OUT: amount
2236 -- Version         : 1.0
2237 -- History         : 20-MAY-02 [email protected] -- Created
2238 --
2239 -- End of comments
2240 ------------------------------------------------------------------------------
2241 FUNCTION contract_total_adjustments(
2242  p_contract_id                   IN NUMBER
2243  ,p_contract_line_id             IN NUMBER
2244 ) RETURN NUMBER
2245 IS
2246   l_amount NUMBER := 0;
2247   -- sjalasut, modified the cursor to have khr_id referred from okl_txl_ap_inv_lns_all_b
2248   -- changes made as part of OKLR12B project.
2249 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2250 /*
2251   CURSOR C (p_contract_id  NUMBER)
2252   IS
2253   SELECT NVL(SUM(A.amount),0)
2254   FROM okl_trx_ap_invoices_b A
2255       ,okl_txl_ap_inv_lns_all_b B
2256   WHERE A.id = B.tap_id
2257     AND B.khr_id = p_contract_id
2258     AND A.funding_type_code = 'PREFUNDING'
2259     AND A.trx_status_code IN ('APPROVED', 'PROCESSED')
2260     AND A.amount < 0;
2261 */
2262 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2263 
2264 BEGIN
2265 
2266 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2267 /*
2268   OPEN C (p_contract_id);
2269   FETCH C INTO l_amount;
2270   CLOSE C;
2271 */
2272   l_amount := okl_funding_pvt.get_chr_funded_adjs(p_contract_id);
2273 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2274 
2275   RETURN l_amount;
2276   EXCEPTION
2277     WHEN OTHERS THEN
2278       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2279       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2280                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2281                           p_token1        => 'OKL_SQLCODE',
2282                           p_token1_value  => SQLCODE,
2283                           p_token2        => 'OKL_SQLERRM',
2284                           p_token2_value  => SQLERRM);
2285       RETURN NULL;
2286 
2287 END;
2288 
2289 ------------------------------------------------------------------------------
2290 -- Start of comments
2291 --
2292 -- Procedure Name  : contract_amount_prefunded
2293 -- Description     : Sum of all approved requests for specfiic contract where type = prefunding
2294 -- Business Rules  :
2295 -- Parameters      :IN: p_contract_id, OUT: amount
2296 -- Version         : 1.0
2297 -- History         :13-JAN-02 [email protected] -- Created
2298 --                  22-Jan-07 sjalasut modified cursor c to have khr_id referred
2299 --                  from okl_txl_Ap_inv_lns_all_b
2300 --
2301 -- End of comments
2302 ------------------------------------------------------------------------------
2303 FUNCTION contract_amount_prefunded(
2304  p_contract_id                   IN NUMBER
2305  ,p_contract_line_id             IN NUMBER
2306 ) RETURN NUMBER
2307 IS
2308   l_amount NUMBER := 0;
2309 
2310   -- sjalasut, modified the cursor to include khr_id from the okl_Txl_ap_inv_lns_all_b
2311   -- changes made as part of OKLR12B disbursements project
2312 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2313 /*
2314   CURSOR C (p_contract_id  NUMBER)
2315   IS
2316   SELECT NVL(SUM(A.amount),0)
2317   FROM okl_trx_ap_invoices_b A
2318       ,okl_Txl_ap_inv_lns_all_b B
2319   WHERE A.id = B.tap_id
2320   AND B.khr_id = p_contract_id
2321   AND A.funding_type_code = 'PREFUNDING'
2322   AND A.trx_status_code IN ('APPROVED', 'PROCESSED')
2323   AND A.amount > 0;
2324 */
2325 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2326 
2327 BEGIN
2328 
2329 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2330 /*
2331   OPEN C (p_contract_id);
2332   FETCH C INTO l_amount;
2333   CLOSE C;*/
2334   l_amount := okl_funding_pvt.get_amount_prefunded(p_contract_id);
2335 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2336 
2337   RETURN l_amount;
2338   EXCEPTION
2339     WHEN OTHERS THEN
2340       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2341       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2342                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2343                           p_token1        => 'OKL_SQLCODE',
2344                           p_token1_value  => SQLCODE,
2345                           p_token2        => 'OKL_SQLERRM',
2346                           p_token2_value  => SQLERRM);
2347       RETURN NULL;
2348 
2349 END;
2350 ------------------------------------------------------------------------------
2351 -- Start of comments
2352 --
2353 -- Procedure Name  : contract_total_funded
2354 -- Description     : Sum of all approved requests for specific contract
2355 -- Business Rules  :
2356 -- Parameters      :IN: p_contract_id, OUT: amount
2357 -- Version         : 1.0
2358 -- History         :13-JAN-02 [email protected] -- Created
2359 --                  22-Jan-07 sjalasut modified cursor c to have khr_id referred
2360 --                  from okl_txl_Ap_inv_lns_all_b
2361 --
2362 -- End of comments
2363 ------------------------------------------------------------------------------
2364 FUNCTION contract_total_funded(
2365  p_contract_id                   IN NUMBER
2366  ,p_contract_line_id             IN NUMBER
2367 ) RETURN NUMBER
2368 IS
2369   l_amount NUMBER := 0;
2370 
2371   -- sjalasut, modified the cursor to include khr_id from the okl_Txl_ap_inv_lns_all_b
2372   -- changes made as part of OKLR12B disbursements project
2373 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2374 /*
2375   CURSOR C (p_contract_id  NUMBER)
2376   IS
2377   SELECT NVL(SUM(A.amount),0)
2378   FROM okl_trx_ap_invoices_b A
2379       ,okl_txl_ap_inv_lns_all_b B
2380   WHERE A.id = B.TAP_ID
2381   AND A.khr_id = p_contract_id
2382   AND A.funding_type_code NOT IN ('SUPPLIER_RETENTION', 'MANUAL_DISB')
2383   AND A.trx_status_code IN ('APPROVED', 'PROCESSED');
2384 */
2385 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2386 
2387 BEGIN
2388 
2389 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2390 /*  OPEN C (p_contract_id);
2391   FETCH C INTO l_amount;
2392   CLOSE C;*/
2393   l_amount := okl_funding_pvt.get_total_funded(p_contract_id);
2394 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2395 
2396   RETURN l_amount;
2397   EXCEPTION
2398     WHEN OTHERS THEN
2399       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2400       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2401                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2402                           p_token1        => 'OKL_SQLCODE',
2403                           p_token1_value  => SQLCODE,
2404                           p_token2        => 'OKL_SQLERRM',
2405                           p_token2_value  => SQLERRM);
2406       RETURN NULL;
2407 
2408 END;
2409 ------------------------------------------------------------------------------
2410 -- Start of comments
2411 --
2412 -- Procedure Name  : contract_total_debits
2413 -- Description     : Sum of all approved requests for specific contract where amount is negative (A/P debits)
2414 -- Business Rules  :
2415 -- Parameters      :IN: p_contract_id, OUT: amount
2416 -- Version         : 1.0
2417 -- History         :13-JAN-02 [email protected] -- Created
2418 --                  22-Jan-07 sjalasut modified cursor c to have khr_id referred
2419 --                  from okl_txl_Ap_inv_lns_all_b
2420 --
2421 -- End of comments
2422 ------------------------------------------------------------------------------
2423 FUNCTION contract_total_debits(
2424  p_contract_id                   IN NUMBER
2425  ,p_contract_line_id             IN NUMBER
2426 ) RETURN NUMBER
2427 IS
2428   l_amount NUMBER := 0;
2429 
2430   -- sjalasut, modified the cursor to include khr_id from the okl_Txl_ap_inv_lns_all_b
2431   -- changes made as part of OKLR12B disbursements project
2432 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2433 /*
2434   CURSOR C (p_contract_id  NUMBER)
2435   IS
2436   SELECT NVL(SUM(B.amount),0)
2437   FROM okl_trx_ap_invoices_b A,
2438        okl_txl_ap_inv_lns_all_b B
2439   WHERE A.id = B.tap_id
2440   AND B.khr_id = p_contract_id
2441   AND A.trx_status_code IN ('APPROVED', 'PROCESSED')
2442   AND A.funding_type_code = 'SUPPLIER_RETENTION';
2443 */
2444 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2445 BEGIN
2446 
2447 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2448 /*
2449   OPEN C (p_contract_id);
2450   FETCH C INTO l_amount;
2451   CLOSE C;*/
2452   l_amount := okl_funding_pvt.get_total_retention(p_contract_id);
2453 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2454 
2455   RETURN l_amount;
2456 
2457   EXCEPTION
2458     WHEN OTHERS THEN
2459       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2460       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2461                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2462                           p_token1        => 'OKL_SQLCODE',
2463                           p_token1_value  => SQLCODE,
2464                           p_token2        => 'OKL_SQLERRM',
2465                           p_token2_value  => SQLERRM);
2466       RETURN NULL;
2467 
2468 END;
2469 -----------------------------------------------------------------------
2470 -- Start of comments
2471 --
2472 -- Procedure Name  : creditline_total_limit
2473 -- Description     : Sum of all credit limit (contract line) for specfiic
2474 --                   contract entity scs_code = 'CREDITLINE_CONTRACT'
2475 -- Business Rules  :
2476 -- Parameters      :IN: p_contract_id, OUT: amount
2477 -- Version         : 1.0
2478 -- History         :13-JAN-02 [email protected] -- Created
2479 --
2480 -- End of comments
2481 ------------------------------------------------------------------------------
2482  FUNCTION creditline_total_limit(
2483  p_contract_id                   IN NUMBER
2484  ,p_contract_line_id             IN NUMBER
2485  ) RETURN NUMBER
2486 IS
2487   l_amount NUMBER := 0;
2488   l_amount_add NUMBER := 0;
2489   l_amount_new NUMBER := 0;
2490   l_amount_reduce NUMBER := 0;
2491 
2492 BEGIN
2493 
2494   l_amount_add := NVL(creditline_total_addition(p_contract_id),0);
2495   l_amount_new := NVL(creditline_total_new_limit(p_contract_id),0);
2496   l_amount_reduce := NVL(creditline_total_reduction(p_contract_id),0);
2497 
2498   l_amount := l_amount_new + l_amount_add - l_amount_reduce;
2499 
2500   RETURN l_amount;
2501   EXCEPTION
2502     WHEN OTHERS THEN
2503       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2504       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2505                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2506                           p_token1        => 'OKL_SQLCODE',
2507                           p_token1_value  => SQLCODE,
2508                           p_token2        => 'OKL_SQLERRM',
2509                           p_token2_value  => SQLERRM);
2510       RETURN NULL;
2511 
2512 END;
2513 ------------------------------------------------------------------------------
2514 -- Start of comments
2515 --
2516 -- Procedure Name  : creditline_total_remaining
2517 -- Description     : Sum of all credit limit (contract line) for specfiic contract
2518 --                   scs_code = 'CREDITLINE_CONTRACT' and substract from Funding total
2519 -- Business Rules  :
2520 -- Parameters      :IN: p_contract_id, OUT: amount
2521 -- Version         : 1.0
2522 -- History         :13-JAN-02 [email protected] -- Created
2523 --
2524 -- End of comments
2525 ------------------------------------------------------------------------------
2526  FUNCTION creditline_total_remaining(
2527  p_contract_id                   IN NUMBER
2528  ,p_contract_line_id             IN NUMBER
2529  ) RETURN NUMBER
2530 IS
2531   l_amount NUMBER := 0;
2532 --  l_amount_funded NUMBER := 0;
2533 --  l_amount_limit NUMBER := 0;
2534 --  l_amount_remain NUMBER := 0;
2535 
2536   x_return_status	 VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
2537   l_api_version      NUMBER	:= 1.0;
2538   x_msg_count		 NUMBER;
2539   x_msg_data	        VARCHAR2(4000);
2540   l_init_msg_list    VARCHAR2(10) := OKL_API.G_FALSE;
2541 
2542   x_value NUMBER := 0;
2543 
2544 BEGIN
2545 
2546 /*
2547   --l_amount_funded := nvl(creditline_total_funded(p_contract_id),0);
2548   l_amount_limit := NVL(creditline_total_limit(p_contract_id),0);
2549 
2550 --  l_amount_remain := OKL_PAY_INVOICES_DISB_PVT.credit_check
2551   l_amount_remain := OKL_BPD_CREDIT_CHECK_PVT.credit_check -- cklee 08/28/03
2552                  (p_api_version    => l_api_version
2553                   ,p_init_msg_list => l_init_msg_list
2554                   ,x_return_status => x_return_status
2555                   ,x_msg_count     => x_msg_count
2556                   ,x_msg_data      => x_msg_data
2557                   ,p_creditline_id => p_contract_id
2558                   ,p_credit_max    => l_amount_limit);
2559 
2560   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2561     --RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2562     l_amount_remain := 0;
2563   ELSIF (x_return_Status = OKL_API.G_RET_STS_ERROR)  THEN
2564     --RAISE OKL_API.G_EXCEPTION_ERROR;
2565     l_amount_remain := 0;
2566   END IF;
2567 
2568   l_amount := l_amount_remain;
2569 
2570 */
2571 
2572     --------------------------------------------------
2573     -- Credit limt Remaining check
2574     --------------------------------------------------
2575   OKL_EXECUTE_FORMULA_PUB.EXECUTE(
2576       p_api_version   => l_api_version,
2577       p_init_msg_list => l_init_msg_list,
2578       x_return_status => x_return_status,
2579       x_msg_count     => x_msg_count,
2580       x_msg_data      => x_msg_data,
2581       p_formula_name  => 'CREDIT_CHECK',
2582       p_contract_id   => p_contract_id,
2583       x_value         => x_value);
2584 
2585   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2586       --RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2587       x_value := 0;
2588   ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2589       --RAISE OKL_API.G_EXCEPTION_ERROR;
2590       x_value := 0;
2591   END IF;
2592 
2593   l_amount := x_value;
2594 
2595   RETURN l_amount;
2596   EXCEPTION
2597     WHEN OTHERS THEN
2598       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2599       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2600                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2601                           p_token1        => 'OKL_SQLCODE',
2602                           p_token1_value  => SQLCODE,
2603                           p_token2        => 'OKL_SQLERRM',
2604                           p_token2_value  => SQLERRM);
2605       RETURN NULL;
2606 
2607 END;
2608 ------------------------------------------------------------------------------
2609 -- Start of comments
2610 --
2611 -- Procedure Name  : creditline_total_new_limit
2612 -- Description     : Sum of all credit new limit (contract line) for specfiic contract
2613 --                   scs_code = 'CREDITLINE_CONTRACT'
2614 -- Business Rules  :
2615 -- Parameters      :IN: p_contract_id, OUT: amount
2616 -- Version         : 1.0
2617 -- History         :13-JAN-02 [email protected] -- Created
2618 --
2619 -- End of comments
2620 ------------------------------------------------------------------------------
2621  FUNCTION creditline_total_new_limit(
2622  p_contract_id                   IN NUMBER
2623  --,p_contract_line_id             IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
2624  ,p_contract_line_id             IN NUMBER
2625  ) RETURN NUMBER
2626 IS
2627   l_amount NUMBER := 0;
2628 
2629   CURSOR C (p_contract_id  NUMBER)
2630   IS
2631   SELECT NVL(SUM(A.amount),0)
2632   FROM OKL_K_LINES_FULL_V A
2633   WHERE A.dnz_chr_id = p_contract_id
2634   AND   A.credit_nature = 'NEW'
2635   AND   NVL(TRUNC(A.start_date),TRUNC(SYSDATE)) <= TRUNC(SYSDATE) -- fixed trunc issues
2636   ;
2637 
2638 BEGIN
2639 
2640   OPEN C (p_contract_id);
2641   FETCH C INTO l_amount;
2642   CLOSE C;
2643 
2644   RETURN l_amount;
2645   EXCEPTION
2646     WHEN OTHERS THEN
2647       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2648       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2649                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2650                           p_token1        => 'OKL_SQLCODE',
2651                           p_token1_value  => SQLCODE,
2652                           p_token2        => 'OKL_SQLERRM',
2653                           p_token2_value  => SQLERRM);
2654       RETURN NULL;
2655 
2656 END;
2657 ------------------------------------------------------------------------------
2658 -- Start of comments
2659 --
2660 -- Procedure Name  : creditline_total_addition
2661 -- Description     : Sum of all credit addition (contract line) for specfiic contract
2662 --                   scs_code = 'CREDITLINE_CONTRACT'
2663 -- Business Rules  :
2664 -- Parameters      :IN: p_contract_id, OUT: amount
2665 -- Version         : 1.0
2666 -- History         :13-JAN-02 [email protected] -- Created
2667 --
2668 -- End of comments
2669 ------------------------------------------------------------------------------
2670  FUNCTION creditline_total_addition(
2671  p_contract_id                   IN NUMBER
2672  --,p_contract_line_id             IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
2673  ,p_contract_line_id             IN NUMBER
2674  ) RETURN NUMBER
2675 IS
2676   l_amount NUMBER := 0;
2677 
2678   CURSOR C (p_contract_id  NUMBER)
2679   IS
2680   SELECT NVL(SUM(A.amount),0)
2681   FROM OKL_K_LINES_FULL_V A
2682   WHERE A.dnz_chr_id = p_contract_id
2683   AND   A.credit_nature = 'ADD'
2684   AND   NVL(TRUNC(A.start_date),TRUNC(SYSDATE)) <= TRUNC(SYSDATE) -- fixed trunc issues
2685   ;
2686 
2687 BEGIN
2688 
2689   OPEN C (p_contract_id);
2690   FETCH C INTO l_amount;
2691   CLOSE C;
2692 
2693   RETURN l_amount;
2694   EXCEPTION
2695     WHEN OTHERS THEN
2696       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2697       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2698                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2699                           p_token1        => 'OKL_SQLCODE',
2700                           p_token1_value  => SQLCODE,
2701                           p_token2        => 'OKL_SQLERRM',
2702                           p_token2_value  => SQLERRM);
2703       RETURN NULL;
2704 
2705 END;
2706 ------------------------------------------------------------------------------
2707 -- Start of comments
2708 --
2709 -- Procedure Name  : creditline_total_reduction
2710 -- Description     : Sum of all credit addition (contract line) for specfiic contract
2711 --                   scs_code = 'CREDITLINE_CONTRACT'
2712 -- Business Rules  :
2713 -- Parameters      :IN: p_contract_id, OUT: amount
2714 -- Version         : 1.0
2715 -- History         :13-JAN-02 [email protected] -- Created
2716 --
2717 -- End of comments
2718 ------------------------------------------------------------------------------
2719  FUNCTION creditline_total_reduction(
2720  p_contract_id                   IN NUMBER
2721  --,p_contract_line_id             IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
2722  ,p_contract_line_id             IN NUMBER
2723  ) RETURN NUMBER
2724 IS
2725   l_amount NUMBER := 0;
2726 
2727   CURSOR C (p_contract_id  NUMBER)
2728   IS
2729   SELECT NVL(SUM(A.amount),0)
2730   FROM OKL_K_LINES_FULL_V A
2731   WHERE A.dnz_chr_id = p_contract_id
2732   AND   A.credit_nature = 'REDUCE'
2733   AND   NVL(TRUNC(A.start_date),TRUNC(SYSDATE)) <= TRUNC(SYSDATE) -- fixed trunc issues
2734   ;
2735 
2736 BEGIN
2737 
2738   OPEN C (p_contract_id);
2739   FETCH C INTO l_amount;
2740   CLOSE C;
2741 
2742   RETURN l_amount;
2743   EXCEPTION
2744     WHEN OTHERS THEN
2745       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2746       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2747                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2748                           p_token1        => 'OKL_SQLCODE',
2749                           p_token1_value  => SQLCODE,
2750                           p_token2        => 'OKL_SQLERRM',
2751                           p_token2_value  => SQLERRM);
2752       RETURN NULL;
2753 
2754 END;
2755 
2756  /*FUNCTION line_capitalcost(
2757             p_chr_id           IN  NUMBER,
2758             p_line_id          IN  NUMBER,
2759             p_capred         IN  NUMBER,
2760             p_capred_per         IN  NUMBER,
2761             p_trd_amnt         IN  NUMBER) RETURN NUMBER  IS
2762 
2763     l_api_name		CONSTANT VARCHAR2(60) := 'RETURN_LINE_CAP_AMNT_VALUE';
2764     l_api_version	CONSTANT NUMBER	      := 1;
2765     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
2766     x_msg_count         NUMBER;
2767     x_msg_data          VARCHAR2(256);
2768 
2769     l_capamnt_value NUMBER := 0;
2770     l_oec_value NUMBER := 0;
2771     l_oec           NUMBER;
2772     l_tradeIn       NUMBER;
2773     l_capred        NUMBER;
2774     l_feecap        NUMBER;
2775     l_servc         NUMBER;
2776 
2777 
2778   BEGIN
2779 
2780       IF ( ( p_chr_id IS NULL ) OR ( p_line_id IS NULL ) ) THEN
2781           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2782       END IF;
2783 
2784       l_oec_value := line_oec( p_chr_id, p_line_id);
2785       IF (  l_oec_value IS NULL  ) THEN
2786           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2787       END IF;
2788 
2789       l_capred := p_capred;
2790       IF(( p_capred IS NULL ) OR ( p_capred = 0)) THEN
2791           IF (( p_capred_per IS NULL) OR ( p_capred_per = 0)) THEN
2792               l_capred := 0.0;
2793           ELSE
2794               l_capred := ( l_oec_value * p_capred_per ) / 100.00;
2795           END IF;
2796       END IF;
2797 
2798       IF (p_trd_amnt IS NULL) THEN
2799           l_tradeIn := 0.0;
2800       ELSE
2801           l_tradeIn := p_trd_amnt;
2802       END IF;
2803 
2804       l_capamnt_value := l_oec_value - l_capred - l_tradeIn;
2805 
2806       RETURN l_capamnt_value;
2807 
2808     EXCEPTION
2809 	WHEN OTHERS THEN
2810                Okl_Api.SET_MESSAGE(
2811                         p_app_name     => G_APP_NAME,
2812                         p_msg_name     => G_UNEXPECTED_ERROR,
2813                         p_token1       => G_SQLCODE_TOKEN,
2814                         p_token1_value => SQLCODE,
2815                         p_token2       => G_SQLERRM_TOKEN,
2816                         p_token2_value => SQLERRM);
2817                 RETURN NULL;
2818 
2819 
2820   END line_capitalcost;
2821 
2822 */
2823 
2824 ----------------------------------------------------------------------------------------------------
2825 
2826     -- Start of Comments
2827     -- Created By     : Shri Iyer
2828     -- Function Name  : CONTRACT_DAYS_TO_ACCRUE
2829     -- Description    : This function returns the number of days to accrue
2830     -- Dependencies   : None
2831     -- Parameters     : contract id, contract line id
2832     -- Version        : 1.0
2833     -- End of Commnets
2834 
2835 ----------------------------------------------------------------------------------------------------
2836 
2837 FUNCTION CONTRACT_DAYS_TO_ACCRUE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
2838 
2839     l_days_to_accrue     NUMBER;
2840     l_last_int_calc_date DATE;
2841     l_period_end_date    DATE;
2842     l_period_start_date  DATE;
2843     l_days_in_month      VARCHAR2(100);
2844     l_contract_number    VARCHAR2(2000);
2845     l_days_in_year       VARCHAR2(100);
2846     l_advance_arrears    VARCHAR2(1);
2847     l_return_status      VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
2848 
2849     -- Fetch contract days in a month
2850     CURSOR days_in_month IS
2851     SELECT days_in_a_month_code
2852     FROM OKL_K_RATE_PARAMS
2853     WHERE khr_id = p_khr_id
2854 	AND parameter_type_code = 'ACTUAL'
2855     AND effective_to_date IS NULL;
2856 
2857     -- cursor to get the contract number
2858     CURSOR contract_num_csr IS
2859     SELECT  contract_number
2860     FROM OKC_K_HEADERS_B
2861     WHERE id = p_khr_id;
2862 
2863     -- Fetch contract days in a year
2864     CURSOR days_in_year IS
2865     SELECT days_in_a_year_code
2866     FROM OKL_K_RATE_PARAMS
2867     WHERE khr_id = p_khr_id
2868 	AND parameter_type_code = 'ACTUAL'
2869     AND effective_to_date IS NULL;
2870 
2871     CURSOR adv_arr_csr IS
2872     SELECT
2873     rulb2.RULE_INFORMATION10 arrears_yn
2874     FROM   okc_k_lines_b     cleb,
2875            okc_rule_groups_b rgpb,
2876            okc_rules_b       rulb,
2877            okc_rules_b       rulb2,
2878            okl_strm_type_b   styb
2879     WHERE  rgpb.chr_id     IS NULL
2880     AND    rgpb.dnz_chr_id = cleb.dnz_chr_id
2881     AND    rgpb.cle_id     = cleb.id
2882     AND    cleb.dnz_chr_id = p_khr_id
2883     AND    rgpb.rgd_code   = 'LALEVL'
2884     AND    rulb.rgp_id     = rgpb.id
2885     AND    rulb.rule_information_category  = 'LASLH'
2886     AND    TO_CHAR(styb.id)                = rulb.object1_id1
2887     AND    rulb2.object2_id1                = TO_CHAR(rulb.id)
2888     AND    rulb2.rgp_id                    = rgpb.id
2889     AND    rulb2.rule_information_category = 'LASLL';
2890 
2891   BEGIN
2892     --Validate additional parameters availability
2893     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
2894       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
2895 	  LOOP
2896         IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_last_int_calc_date' THEN
2897           l_last_int_calc_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
2898         ELSIF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_period_end_date' THEN
2899           l_period_end_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
2900         END IF;
2901       END LOOP;
2902 	ELSE
2903       Okl_Api.Set_Message(p_app_name     => g_app_name,
2904                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
2905       RAISE Okl_Api.G_EXCEPTION_ERROR;
2906 	END IF;
2907 
2908     -- Validate parameters
2909     IF l_period_end_date IS NULL THEN
2910       Okl_Api.Set_Message(p_app_name     => g_app_name,
2911                           p_msg_name     => 'OKL_AGN_FE_PERD_END_DATE');
2912       RAISE Okl_Api.G_EXCEPTION_ERROR;
2913 	END IF;
2914 
2915     IF l_last_int_calc_date IS NULL THEN
2916       Okl_Api.Set_Message(p_app_name     => g_app_name,
2917                           p_msg_name     => 'OKL_AGN_FE_INT_CALC_DATE');
2918       RAISE Okl_Api.G_EXCEPTION_ERROR;
2919 	END IF;
2920 
2921     --Bug 5081876. Adding a day to last int calc date.
2922     --Bug 5162929. Undoing changes made for bug 5081876. One day is being added in accrual program
2923     --l_last_int_calc_date := l_last_int_calc_date + 1;
2924 
2925     --Bug 5046184. ***Additional Code START***
2926     FOR y in contract_num_csr
2927     LOOP
2928       l_contract_number := y.contract_number;
2929     END LOOP;
2930 
2931     IF l_contract_number IS NULL THEN
2932       Okl_Api.set_message(p_app_name     => g_app_name,
2933                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
2934       RAISE OKL_API.G_EXCEPTION_ERROR;
2935     END IF;
2936 
2937     FOR x IN days_in_month
2938     LOOP
2939       l_days_in_month := x.days_in_a_month_code;
2940     END LOOP;
2941 
2942     IF l_days_in_month IS NULL THEN
2943       Okl_Api.Set_Message(p_app_name     => g_app_name,
2944                           p_msg_name     => 'OKL_AGN_FE_DAYSIN_MTH',
2945                           p_token1       => 'CONTRACT_NUMBER',
2946                           p_token1_value => l_contract_number);
2947       RAISE Okl_Api.G_EXCEPTION_ERROR;
2948 	END IF;
2949 
2950     FOR z IN days_in_year
2951     LOOP
2952       l_days_in_year := z.days_in_a_year_code;
2953     END LOOP;
2954 
2955     IF l_days_in_year IS NULL THEN
2956       Okl_Api.Set_Message(p_app_name     => g_app_name,
2957                           p_msg_name     => 'OKL_AGN_FE_DAYSIN_YR',
2958                           p_token1       => 'CONTRACT_NUMBER',
2959                           p_token1_value => l_contract_number);
2960       RAISE Okl_Api.G_EXCEPTION_ERROR;
2961 	END IF;
2962 
2963     FOR i in adv_arr_csr
2964     LOOP
2965       l_advance_arrears := NVL(i.arrears_yn, 'N');
2966     END LOOP;
2967 
2968     l_days_to_accrue := okl_pricing_utils_pvt.get_day_count
2969                          (l_days_in_month,
2970                           l_days_in_year,
2971                           l_last_int_calc_date,
2972                           l_period_end_date,
2973                           l_advance_arrears,
2974                           l_return_status);
2975 
2976     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
2977       Okl_Api.set_message(p_app_name     => g_app_name,
2978                           p_msg_name     => 'OKL_GET_DAY_CNT_ERROR');
2979 
2980       RAISE OKL_API.G_EXCEPTION_ERROR;
2981     END IF;
2982     --Bug 5046184. ***Additional Code START***
2983 
2984     --Bug 5046184. Commenting below calculation
2985     --l_days_to_accrue := l_period_end_date - l_last_int_calc_date;
2986 
2987     RETURN l_days_to_accrue;
2988 
2989   EXCEPTION
2990     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
2991       RETURN NULL;
2992 
2993 	WHEN OTHERS THEN
2994       Okl_Api.SET_MESSAGE(
2995                         p_app_name     => G_APP_NAME,
2996                         p_msg_name     => G_UNEXPECTED_ERROR,
2997                         p_token1       => G_SQLCODE_TOKEN,
2998                         p_token1_value => SQLCODE,
2999                         p_token2       => G_SQLERRM_TOKEN,
3000                         p_token2_value => SQLERRM);
3001       RETURN NULL;
3002 
3003   END CONTRACT_DAYS_TO_ACCRUE;
3004 
3005 ----------------------------------------------------------------------------------------------------
3006 
3007     -- Start of Comments
3008     -- Created By     : Shri Iyer
3009     -- Function Name  : CONTRACT_DAYS_IN_YEAR
3010     -- Description    : This function returns the number of days in a year
3011     -- Dependencies   : None
3012     -- Parameters     : contract id, contract line id
3013     -- Version        : 1.0
3014     -- End of Commnets
3015 
3016 ----------------------------------------------------------------------------------------------------
3017 
3018   FUNCTION CONTRACT_DAYS_IN_YEAR(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3019     l_days NUMBER;
3020     l_lookup_code VARCHAR2(2000);
3021     l_accrual_date DATE;
3022 	l_year NUMBER;
3023     l_contract_number VARCHAR2(2000);
3024 
3025     -- cursor to get the contract number
3026     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
3027     SELECT  contract_number
3028     FROM OKC_K_HEADERS_B
3029     WHERE id = p_ctr_id;
3030 
3031 --     BUG 4730646. Changing cursor.
3032 --     CURSOR lookup_csr(p_ctr_id NUMBER) IS
3033 --     SELECT rule_information1
3034 --     FROM okc_rules_b okc
3035 --     WHERE okc.dnz_chr_id = p_ctr_id
3036 --     AND okc.rule_information_category = 'LAICLC';
3037 
3038     -- Fetch contract days in a year
3039     CURSOR lookup_csr(p_ctr_id NUMBER) IS
3040     SELECT days_in_a_year_code
3041     FROM OKL_K_RATE_PARAMS
3042     WHERE khr_id = p_ctr_id
3043 	AND parameter_type_code = 'ACTUAL'
3044     AND effective_to_date IS NULL;
3045 
3046   BEGIN
3047     OPEN contract_num_csr(p_khr_id);
3048     FETCH contract_num_csr INTO l_contract_number;
3049     IF contract_num_csr%NOTFOUND THEN
3050       CLOSE contract_num_csr;
3051       Okl_Api.set_message(p_app_name     => g_app_name,
3052                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3053       RAISE OKL_API.G_EXCEPTION_ERROR;
3054 	END IF;
3055     CLOSE contract_num_csr;
3056 
3057     OPEN lookup_csr(p_khr_id);
3058 	FETCH lookup_csr INTO l_lookup_code;
3059     CLOSE lookup_csr;
3060 
3061     IF l_lookup_code IS NULL THEN
3062       Okl_Api.Set_Message(p_app_name     => g_app_name,
3063                           p_msg_name     => 'OKL_AGN_FE_DAYSIN_YR',
3064                           p_token1       => 'CONTRACT_NUMBER',
3065                           p_token1_value => l_contract_number);
3066       RAISE Okl_Api.G_EXCEPTION_ERROR;
3067 	END IF;
3068 
3069     IF l_lookup_code = 'ACTUAL' THEN
3070       IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3071         FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3072 	    LOOP
3073           IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_accrual_date' THEN
3074             l_accrual_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3075 	      END IF;
3076         END LOOP;
3077 	  ELSE
3078         Okl_Api.Set_Message(p_app_name     => g_app_name,
3079 
3080 
3081                             p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3082         RAISE Okl_Api.G_EXCEPTION_ERROR;
3083 	  END IF;
3084 
3085       IF l_accrual_date IS NULL THEN
3086         Okl_Api.Set_Message(p_app_name     => g_app_name,
3087                             p_msg_name     => 'OKL_AGN_FE_ACCRUAL_DATE');
3088         RAISE Okl_Api.G_EXCEPTION_ERROR;
3089 	  END IF;
3090 
3091 
3092 	  l_year := TO_NUMBER(TO_CHAR(l_accrual_date, 'RRRR'));
3093 
3094 	  IF MOD(l_year,4) = 0 THEN
3095 	    l_days := 366;
3096 	  ELSE
3097 	    l_days := 365;
3098 	  END IF;
3099 	ELSE
3100 	  l_days := TO_NUMBER(l_lookup_code);
3101 	END IF;
3102 
3103     RETURN l_days;
3104 
3105   EXCEPTION
3106     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3107       RETURN NULL;
3108 
3109 	WHEN OTHERS THEN
3110       IF lookup_csr%ISOPEN THEN
3111         CLOSE lookup_csr;
3112       END IF;
3113                Okl_Api.SET_MESSAGE(
3114                         p_app_name     => G_APP_NAME,
3115                         p_msg_name     => G_UNEXPECTED_ERROR,
3116                         p_token1       => G_SQLCODE_TOKEN,
3117                         p_token1_value => SQLCODE,
3118                         p_token2       => G_SQLERRM_TOKEN,
3119                         p_token2_value => SQLERRM);
3120                 RETURN NULL;
3121 
3122   END CONTRACT_DAYS_IN_YEAR;
3123 
3124 ----------------------------------------------------------------------------------------------------
3125 
3126     -- Start of Comments
3127     -- Created By     : Shri Iyer
3128     -- Function Name  : CONTRACT_INTEREST_RATE
3129     -- Description    : This function returns the rate of interest on the given date or closest to that date
3130     -- Dependencies   : None
3131     -- Parameters     : contract id, contract line id
3132     -- Version        : 1.0
3133     -- End of Commnets
3134 
3135 ----------------------------------------------------------------------------------------------------
3136 
3137   FUNCTION CONTRACT_INTEREST_RATE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3138     l_accrual_date DATE;
3139     l_interest_rate NUMBER;
3140     l_adder_rate NUMBER;
3141     l_total_rate NUMBER;
3142     l_contract_number VARCHAR2(2000);
3143 
3144     -- cursor to get the contract number
3145     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
3146     SELECT  contract_number
3147     FROM OKC_K_HEADERS_B
3148     WHERE id = p_ctr_id;
3149 
3150 
3151 --     Bug 4737551. Commenting below cursor and writing new select statement. SGIYER.
3152 --     CURSOR interest_rate_csr(p_ctr_id NUMBER, p_accrual_date DATE) IS
3153 --     SELECT idv.value
3154 --     FROM OKC_RULES_B rule,
3155 --          OKL_INDEX_VALUES idv,
3156 --          OKL_INDICES idx
3157 --     WHERE rule.rule_information_category = 'LAIVAR'
3158 --       AND rule.dnz_chr_id = p_ctr_id
3159 --       AND TO_NUMBER(rule.rule_information2) = idx.id
3160 --       AND idx.ID   = idv.idx_id
3161 --       AND idv.datetime_valid = (SELECT MAX(idv.datetime_valid)
3162 --                              FROM OKL_INDEX_VALUES idv ,
3163 --                                   OKL_INDICES idx,
3164 --                                   OKC_RULES_B rules
3165 --                              WHERE rules.rule_information_category = 'LAIVAR'
3166 --                              AND rules.dnz_chr_id = p_ctr_id
3167 --                              AND rules.rule_information2 = idx.id
3168 --                              AND idx.id =  idv.idx_id
3169 --                              AND   idv.datetime_valid <= p_accrual_date);
3170 
3171     -- cursor to get interest rate
3172     CURSOR interest_rate_csr(p_ctr_id NUMBER, p_accrual_date DATE) IS
3173     SELECT idv.value
3174     FROM OKL_K_RATE_PARAMS okl,
3175          OKL_INDEX_VALUES idv,
3176          OKL_INDICES idx
3177     WHERE okl.khr_id = p_ctr_id
3178       AND okl.parameter_type_code = 'ACTUAL'
3179       AND okl.effective_to_date IS NULL
3180       AND okl.interest_index_id = idx.id
3181       AND idx.ID   = idv.idx_id
3182       AND idv.datetime_valid = (SELECT MAX(idv.datetime_valid)
3183                              FROM OKL_INDEX_VALUES idv ,
3184                                   OKL_INDICES idx,
3185                                   OKL_K_RATE_PARAMS rate
3186                              WHERE rate.khr_id = p_ctr_id
3187                              AND rate.parameter_type_code = 'ACTUAL'
3188                              AND rate.effective_to_date IS NULL
3189                              AND rate.interest_index_id = idx.id
3190                              AND idx.id =  idv.idx_id
3191                              AND idv.datetime_valid <= p_accrual_date);
3192 
3193     -- Bug# 2920174
3194     -- cursor to get adder rate
3195 --     Bug 4737551. Commenting below cursor and writing new select statement. SGIYER.
3196 --     CURSOR adder_rate_csr(p_ctr_id NUMBER) IS
3197 --     SELECT TO_NUMBER(rule_information4)
3198 --     FROM OKC_RULES_B
3199 --     WHERE rule_information_category = 'LAIVAR'
3200 --     AND dnz_chr_id = p_ctr_id;
3201 
3202     -- cursor to get adder rate
3203     -- Bug 4737551.
3204      CURSOR adder_rate_csr(p_ctr_id NUMBER) IS
3205      SELECT adder_rate
3206      FROM OKL_K_RATE_PARAMS
3207      WHERE khr_id = p_ctr_id
3208      AND parameter_type_code = 'ACTUAL'
3209      AND effective_to_date IS NULL;
3210 
3211   BEGIN
3212 
3213 	OPEN contract_num_csr(p_khr_id);
3214     FETCH contract_num_csr INTO l_contract_number;
3215     IF contract_num_csr%NOTFOUND THEN
3216       CLOSE contract_num_csr;
3217       Okl_Api.set_message(p_app_name     => g_app_name,
3218                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3219       RAISE OKL_API.G_EXCEPTION_ERROR;
3220 	END IF;
3221     CLOSE contract_num_csr;
3222 
3223     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3224       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3225 	  LOOP
3226   	  IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_accrual_date' THEN
3227         l_accrual_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3228 	  END IF;
3229       END LOOP;
3230 	ELSE
3231       Okl_Api.Set_Message(p_app_name     => g_app_name,
3232                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3233       RAISE Okl_Api.G_EXCEPTION_ERROR;
3234 	END IF;
3235 
3236     IF l_accrual_date IS NULL THEN
3237       Okl_Api.Set_Message(p_app_name     => g_app_name,
3238                           p_msg_name     => 'OKL_AGN_FE_ACCRUAL_DATE');
3239       RAISE Okl_Api.G_EXCEPTION_ERROR;
3240 	END IF;
3241 
3242 	OPEN interest_rate_csr(p_khr_id, l_accrual_date);
3243 	FETCH interest_rate_csr INTO l_interest_rate;
3244     IF interest_rate_csr %NOTFOUND THEN
3245       Okl_Api.Set_Message(p_app_name     => g_app_name,
3246                           p_msg_name     => 'OKL_AGN_FE_INT_RATE',
3247                           p_token1       => 'CONTRACT_NUMBER',
3248                           p_token1_value => l_contract_number);
3249       CLOSE interest_rate_csr;
3250 	  RAISE Okl_Api.G_EXCEPTION_ERROR;
3251 	END IF;
3252 	CLOSE interest_rate_csr;
3253 
3254 	OPEN adder_rate_csr(p_khr_id);
3255 	FETCH adder_rate_csr INTO l_adder_rate;
3256     IF adder_rate_csr %NOTFOUND THEN
3257       Okl_Api.Set_Message(p_app_name     => g_app_name,
3258                           p_msg_name     => 'OKL_AGN_FE_ADDER_RATE',
3259                           p_token1       => 'CONTRACT_NUMBER',
3260                           p_token1_value => l_contract_number);
3261       CLOSE interest_rate_csr;
3262 	  RAISE Okl_Api.G_EXCEPTION_ERROR;
3263 	END IF;
3264 	CLOSE adder_rate_csr;
3265 
3266     -- Bug# 2920174
3267     -- get adder rate, add to interest rate and return total.
3268     l_total_rate := (l_interest_rate + l_adder_rate)/100;
3269 
3270     RETURN l_total_rate;
3271 
3272   EXCEPTION
3273     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3274       RETURN NULL;
3275 
3276 	WHEN OTHERS THEN
3277       IF interest_rate_csr%ISOPEN THEN
3278 	    CLOSE interest_rate_csr;
3279       END IF;
3280 
3281       IF adder_rate_csr%ISOPEN THEN
3282 	    CLOSE adder_rate_csr;
3283       END IF;
3284 
3285       IF contract_num_csr%ISOPEN THEN
3286 	    CLOSE contract_num_csr;
3287       END IF;
3288 
3289       Okl_Api.SET_MESSAGE(
3290                         p_app_name     => G_APP_NAME,
3291                         p_msg_name     => G_UNEXPECTED_ERROR,
3292                         p_token1       => G_SQLCODE_TOKEN,
3293                         p_token1_value => SQLCODE,
3294                         p_token2       => G_SQLERRM_TOKEN,
3295                         p_token2_value => SQLERRM);
3296       RETURN NULL;
3297 
3298   END CONTRACT_INTEREST_RATE;
3299 
3300 ----------------------------------------------------------------------------------------------------
3301 
3302     -- Start of Comments
3303     -- Created By     : Shri Iyer
3304     -- Function Name  : CONTRACT_PRINCIPAL_BALANCE
3305     -- Description    : This function returns the principal balance for a contract as of that date
3306     -- Dependencies   : None
3307     -- Parameters     : contract id, contract line id
3308     -- Version        : 1.0
3309     -- End of Commnets
3310 
3311 ----------------------------------------------------------------------------------------------------
3312 
3313   FUNCTION CONTRACT_PRINCIPAL_BALANCE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3314 
3315     l_period_start_date   DATE;
3316     l_period_end_date     DATE;
3317     l_principal_bal       NUMBER;
3318     l_contract_number     VARCHAR2(2000);
3319     l_last_int_calc_date  DATE;
3320     l_return_status       VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3321     l_kle_id              NUMBER;
3322 --  Bug 5055714.
3323 --  l_prin_bal_id         NUMBER;
3324 
3325     -- cursor to get the contract number
3326     CURSOR contract_num_csr IS
3327     SELECT  contract_number
3328     FROM OKC_K_HEADERS_B
3329     WHERE id = p_khr_id;
3330 
3331 -- Bug 5055714. Commenting below derivation. Using utility provided instead.
3332 -- 	CURSOR principal_bal_csr(p_ctr_id NUMBER, p_start_date DATE, p_end_date DATE, p_prin_bal_id NUMBER) IS
3333 --     SELECT SUM(ste.amount)
3334 --       FROM OKL_STRM_TYPE_B sty,
3335 --            OKL_STREAMS stm,
3336 --            OKL_STRM_ELEMENTS ste
3337 --         WHERE stm.khr_id = p_ctr_id
3338 --           AND stm.active_yn = 'Y'
3339 --           AND stm.say_code = 'CURR'
3340 --           AND sty.id = p_prin_bal_id
3341 --           AND stm.sty_id = sty.id
3342 --           AND ste.stm_id = stm.id
3343 --           AND ste.stream_element_date BETWEEN p_start_date AND p_end_date;
3344 
3345 -- cursor for retrieveing earlier principal balance amount if principal balance
3346 -- for given period is not found
3347 -- 	CURSOR prior_prin_bal_csr(p_ctr_id NUMBER, p_start_date DATE, p_prin_bal_id NUMBER) IS
3348 --     SELECT SUM(ste.amount)
3349 --     FROM OKL_STRM_TYPE_B sty,
3350 --          OKL_STREAMS stm,
3351 --          OKL_STRM_ELEMENTS ste
3352 --     WHERE stm.khr_id = p_ctr_id
3353 --     AND stm.active_yn = 'Y'
3354 --     AND stm.say_code = 'CURR'
3355 --     AND sty.id = p_prin_bal_id
3356 --     AND stm.sty_id = sty.id
3357 --     AND ste.stm_id = stm.id
3358 --     AND ste.stream_element_date = (SELECT MAX(stream_element_date)
3359 -- 		                           FROM OKL_STRM_TYPE_B sty,
3360 --                                         OKL_STREAMS stm,
3361 --                                         OKL_STRM_ELEMENTS ste
3362 --                                    WHERE stm.khr_id = p_ctr_id
3363 --                                    AND stm.active_yn = 'Y'
3364 -- 								   AND stm.say_code = 'CURR'
3365 --                                    AND sty.id = p_prin_bal_id
3366 --                                    AND stm.sty_id = sty.id
3367 --                                    AND ste.stm_id = stm.id
3368 --                                    AND stream_element_date < p_start_date);
3369 
3370   BEGIN
3371 
3372 	FOR i IN contract_num_csr
3373     LOOP
3374       l_contract_number := i.contract_number;
3375     END LOOP;
3376 
3377     IF l_contract_number IS NULL THEN
3378       Okl_Api.set_message(p_app_name     => g_app_name,
3379                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3380       RAISE OKL_API.G_EXCEPTION_ERROR;
3381 	END IF;
3382 
3383     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3384       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3385 	  LOOP
3386 --      Bug 5055714. Commenting below. Need Last int calc date
3387 -- 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_period_start_date' THEN
3388 --           l_period_start_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3389 -- 	    ELSIF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_period_end_date' THEN
3390 --           l_period_end_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3391 --         END IF;
3392         IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_last_int_calc_date' THEN
3393           l_last_int_calc_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3394         END IF;
3395       END LOOP;
3396 	ELSE
3397       Okl_Api.Set_Message(p_app_name     => g_app_name,
3398                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3399       RAISE Okl_Api.G_EXCEPTION_ERROR;
3400 	END IF;
3401 
3402     IF l_last_int_calc_date IS NULL THEN
3403       Okl_Api.Set_Message(p_app_name     => g_app_name,
3404                           p_msg_name     => 'OKL_AGN_FE_INT_CALC_DATE');
3405       RAISE Okl_Api.G_EXCEPTION_ERROR;
3406     END IF;
3407 
3408 -- Bug 5055714.No validation needed.
3409 --     IF l_period_end_date IS NULL THEN
3410 --       Okl_Api.Set_Message(p_app_name     => g_app_name,
3411 --                           p_msg_name     => 'OKL_AGN_FE_PERD_END_DATE');
3412 --       RAISE Okl_Api.G_EXCEPTION_ERROR;
3413 -- 	END IF;
3414 --
3415 --     IF l_period_start_date IS NULL THEN
3416 --       Okl_Api.Set_Message(p_app_name     => g_app_name,
3417 --                           p_msg_name     => 'OKL_AGN_FE_PERD_START_DATE');
3418 --       RAISE Okl_Api.G_EXCEPTION_ERROR;
3419 -- 	END IF;
3420 
3421     -- SGIYER
3422     -- UDS Impact
3423 -- Bug 5055714.
3424 --     OKL_STREAMS_UTIL.get_dependent_stream_type(
3425 --             p_khr_id  		   	    => p_khr_id,
3426 --             p_primary_sty_purpose   => 'RENT',
3427 --             p_dependent_sty_purpose => 'PRINCIPAL_BALANCE',
3428 --             x_return_status		    => l_return_status,
3429 --             x_dependent_sty_id      => l_prin_bal_id);
3430 --
3431 --     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3432 --       Okl_Api.set_message(p_app_name     => g_app_name,
3433 --                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
3434 --                           p_token1       => 'STREAM_NAME',
3435 -- 	                      p_token1_value => 'PRINCIPAL BALANCE');
3436 --       RAISE Okl_Api.G_EXCEPTION_ERROR;
3437 --     END IF;
3438 
3439 --  Bug 5055714. Commenting below derivation. Using utility provided instead.
3440 --  OPEN principal_bal_csr (p_khr_id, l_period_start_date, l_period_end_date, l_prin_bal_id);
3441 --  FETCH principal_bal_csr INTO l_principal_bal;
3442 --  CLOSE principal_bal_csr;
3443 
3444     -- Bug 5060624. Passing l_kle_id which is null and not okl_api.g_miss_num
3445     l_principal_bal := OKL_VARIABLE_INT_UTIL_PVT.get_principal_bal(
3446          x_return_status  => l_return_status,
3447          p_khr_id         => p_khr_id,
3448          p_kle_id         => l_kle_id,
3449          p_date           => l_last_int_calc_date);
3450 
3451     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3452       Okl_Api.Set_Message(p_app_name     => g_app_name,
3453                           p_msg_name     => 'OKL_AGN_VAR_PB_ERROR');
3454     END IF;
3455 
3456     IF l_principal_bal IS NULL THEN
3457       Okl_Api.Set_Message(p_app_name     => g_app_name,
3458                           p_msg_name     => 'OKL_AGN_FE_PRIN_BAL',
3459                           p_token1       => 'CONTRACT_NUMBER',
3460                           p_token1_value => l_contract_number);
3461 	  RAISE Okl_Api.G_EXCEPTION_ERROR;
3462     END IF;
3463 
3464       -- Bug#2920344. Commenting error message.
3465       -- If principal balance for period range not found then retrieve
3466       -- principal balance for available prior period. MMITTAL.
3467       --Okl_Api.Set_Message(p_app_name     => g_app_name,
3468       --                    p_msg_name     => 'OKL_AGN_FE_PRIN_BAL',
3469       --                    p_token1       => 'CONTRACT_NUMBER',
3470       --                    p_token1_value => l_contract_number);
3471       --CLOSE principal_bal_csr;
3472 	  --RAISE Okl_Api.G_EXCEPTION_ERROR;
3473 
3474       -- If principal balance not found for date range, get prior principal balance.
3475       -- As per MMITTAL.
3476 --       OPEN prior_prin_bal_csr(p_khr_id, l_period_start_date,l_prin_bal_id);
3477 --       FETCH prior_prin_bal_csr INTO l_principal_bal;
3478 --       CLOSE prior_prin_bal_csr;
3479 --       IF l_principal_bal IS NULL THEN
3480 --         Okl_Api.Set_Message(p_app_name     => g_app_name,
3481 --                             p_msg_name     => 'OKL_AGN_FE_PRIN_BAL',
3482 --                             p_token1       => 'CONTRACT_NUMBER',
3483 --                             p_token1_value => l_contract_number);
3484 -- 	    RAISE Okl_Api.G_EXCEPTION_ERROR;
3485 --       END IF;
3486 --	END IF;
3487 
3488     RETURN l_principal_bal;
3489 
3490   EXCEPTION
3491     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3492       RETURN NULL;
3493 
3494 	WHEN OTHERS THEN
3495       Okl_Api.SET_MESSAGE(
3496                         p_app_name     => G_APP_NAME,
3497                         p_msg_name     => G_UNEXPECTED_ERROR,
3498                         p_token1       => G_SQLCODE_TOKEN,
3499                         p_token1_value => SQLCODE,
3500                         p_token2       => G_SQLERRM_TOKEN,
3501                         p_token2_value => SQLERRM);
3502       RETURN NULL;
3503   END CONTRACT_PRINCIPAL_BALANCE;
3504 
3505 ----------------------------------------------------------------------------------------------------
3506 
3507     -- Start of Comments
3508     -- Created By     : Shri Iyer
3509     -- Function Name  : CONTRACT_UNBILLED_RECEIVABLES
3510     -- Description    : This function returns the unbilled receivables balance for a contract as of a given date
3511     -- Dependencies   : None
3512     -- Parameters     : contract id, contract line id
3513     -- Version        : 1.0
3514     -- End of Commnets
3515 
3516 ----------------------------------------------------------------------------------------------------
3517 
3518   FUNCTION CONTRACT_UNBILLED_RECEIVABLES(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3519     l_rent_strm_bal       NUMBER := 0;
3520     l_contract_number     VARCHAR2(2000);
3521     l_provision_date      DATE;
3522     l_sty_id              NUMBER;
3523     l_return_status       VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3524 
3525     -- cursor to get the contract number
3526     -- 02-Oct-2003. SGIYER. Added condition ste.stream_element_date >= p_date
3527     -- on product management's instructions.
3528     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
3529     SELECT  contract_number
3530     FROM OKL_K_HEADERS_FULL_V
3531     WHERE id = p_ctr_id;
3532 
3533     -- SGIYER
3534     -- modifying cursor for user defind streams project
3535     CURSOR get_unb_rec_csr(p_ctr_id NUMBER, p_date DATE, p_sty_id NUMBER) IS
3536     SELECT SUM(ste.amount)
3537     FROM OKL_STREAMS stm,
3538          OKL_STRM_ELEMENTS ste,
3539          OKL_STRM_TYPE_B sty
3540     WHERE stm.khr_id = p_ctr_id
3541     AND stm.sty_id = sty.id
3542     AND sty.id = p_sty_id
3543     AND stm.active_yn = 'Y'
3544     AND stm.say_code ='CURR'
3545     AND ste.stm_id = stm.id
3546     AND ste.stream_element_date >= p_date
3547     AND ste.date_billed IS NULL;
3548 
3549   BEGIN
3550 	OPEN contract_num_csr(p_khr_id);
3551     FETCH contract_num_csr INTO l_contract_number;
3552     CLOSE contract_num_csr;
3553 
3554     IF l_contract_number IS NULL THEN
3555       Okl_Api.set_message(p_app_name     => g_app_name,
3556                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3557       RAISE OKL_API.G_EXCEPTION_ERROR;
3558 	END IF;
3559 
3560     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3561       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3562 	  LOOP
3563 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_provision_date' THEN
3564           l_provision_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3565         END IF;
3566       END LOOP;
3567 	ELSE
3568       Okl_Api.Set_Message(p_app_name     => g_app_name,
3569                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3570       RAISE Okl_Api.G_EXCEPTION_ERROR;
3571 	END IF;
3572 
3573     IF l_provision_date IS NULL THEN
3574       Okl_Api.Set_Message(p_app_name     => g_app_name,
3575                           p_msg_name     => 'OKL_GLP_PROV_DATE_ERROR');
3576       RAISE Okl_Api.G_EXCEPTION_ERROR;
3577 	END IF;
3578 
3579     -- SGIYER
3580     -- UDS Impact
3581     OKL_STREAMS_UTIL.get_primary_stream_type(
3582       p_khr_id  		   	=> p_khr_id,
3583       p_primary_sty_purpose => 'RENT',
3584       x_return_status		=> l_return_status,
3585       x_primary_sty_id 		=> l_sty_id);
3586 
3587     IF l_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
3588       Okl_Api.set_message(p_app_name     => g_app_name,
3589                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
3590                           p_token1       => 'STREAM_NAME',
3591                           p_token1_value => 'RENT');
3592       RAISE Okl_Api.G_EXCEPTION_ERROR;
3593     END IF;
3594 
3595     OPEN get_unb_rec_csr(p_khr_id, l_provision_date, l_sty_id);
3596 	FETCH get_unb_rec_csr INTO l_rent_strm_bal;
3597     CLOSE get_unb_rec_csr;
3598 
3599     -- Bug 2969989. Return zero explicitly if nothing found.
3600     IF l_rent_strm_bal IS NULL THEN
3601       l_rent_strm_bal := 0;
3602 	END IF;
3603     RETURN l_rent_strm_bal;
3604 
3605   EXCEPTION
3606     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3607       RETURN NULL;
3608 
3609 	WHEN OTHERS THEN
3610       IF get_unb_rec_csr%ISOPEN THEN
3611         CLOSE get_unb_rec_csr;
3612       END IF;
3613       IF contract_num_csr%ISOPEN THEN
3614         CLOSE contract_num_csr;
3615       END IF;
3616       Okl_Api.SET_MESSAGE(
3617                         p_app_name     => G_APP_NAME,
3618                         p_msg_name     => G_UNEXPECTED_ERROR,
3619                         p_token1       => G_SQLCODE_TOKEN,
3620                         p_token1_value => SQLCODE,
3621                         p_token2       => G_SQLERRM_TOKEN,
3622                         p_token2_value => SQLERRM);
3623       RETURN NULL;
3624   END CONTRACT_UNBILLED_RECEIVABLES;
3625 
3626 ----------------------------------------------------------------------------------------------------
3627 
3628     -- Start of Comments
3629     -- Created By     : Shri Iyer
3630     -- Function Name  : CONTRACT_UNEARNED_REVENUE
3631     -- Description    : This function returns the unearned income for a contract as of a given date
3632     -- Dependencies   : None
3633     -- Parameters     : contract id, contract line id
3634     -- Version        : 1.0
3635     -- End of Commnets
3636 
3637 ----------------------------------------------------------------------------------------------------
3638 
3639   FUNCTION CONTRACT_UNEARNED_REVENUE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3640     l_income_strm_bal       NUMBER := 0;
3641     l_contract_number       VARCHAR2(2000);
3642     l_provision_date        DATE;
3643     l_rent_sty_id           NUMBER;
3644     l_lease_inc_sty_id      NUMBER;
3645     l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3646 
3647     -- cursor to get the contract number
3648     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
3649     SELECT  contract_number
3650     FROM OKL_K_HEADERS_FULL_V
3651     WHERE id = p_ctr_id;
3652 
3653     -- changing stream type name from INCOME to PRE TAX INCOME as suggested by PM. BUG# 2671223
3654     -- correcting name. Its hould be PRE-TAX INCOME (with hyphen)
3655     -- Bug 2969989. Pre-Tax amount is negative by default. So taking absolute value.
3656     -- Bug 3126427. Removing absolute function.
3657     -- 02-Oct-2003. SGIYER. Added condition ste.stream_element_date >= p_date
3658     -- on product management's instructions.
3659     -- SGIYER. User defined streams project changes.09/22/04
3660     CURSOR get_unearn_rev_csr (p_ctr_id NUMBER, p_date DATE, p_rent_sty_id NUMBER, p_lease_inc_sty_id NUMBER) IS
3661     SELECT SUM(ste.amount)
3662     FROM OKL_STREAMS stm,
3663          OKL_STRM_ELEMENTS ste,
3664          OKL_STRM_TYPE_B sty
3665     WHERE stm.khr_id = p_ctr_id
3666     AND stm.sty_id = sty.id
3667     AND sty.id = p_lease_inc_sty_id
3668     AND stm.active_yn = 'Y'
3669     AND stm.say_code = 'CURR'
3670     AND ste.stm_id = stm.id
3671     AND ste.stream_element_date >=
3672       (SELECT TRUNC(MIN(ste.stream_element_date),'MM')
3673        FROM OKL_STREAMS stm,
3674             OKL_STRM_ELEMENTS ste,
3675             OKL_STRM_TYPE_B sty
3676        WHERE stm.khr_id = p_ctr_id
3677        AND stm.sty_id = sty.id
3678        AND sty.id = l_rent_sty_id
3679        AND stm.active_yn = 'Y'
3680        AND ste.stm_id = stm.id
3681 	   AND ste.stream_element_date >= p_date
3682        AND ste.date_billed IS NULL)
3683     AND ste.stream_element_date <=
3684        (SELECT LAST_DAY(MAX(ste.stream_element_date))
3685        FROM OKL_STREAMS stm,
3686             OKL_STRM_ELEMENTS ste,
3687             OKL_STRM_TYPE_B sty
3688        WHERE stm.khr_id = p_ctr_id
3689        AND stm.sty_id = sty.id
3690 	   AND sty.id = l_rent_sty_id
3691        AND stm.active_yn = 'Y'
3692        AND ste.stm_id = stm.id
3693        AND ste.stream_element_date >= p_date
3694        AND ste.date_billed IS NULL);
3695 
3696   BEGIN
3697 	OPEN contract_num_csr(p_khr_id);
3698     FETCH contract_num_csr INTO l_contract_number;
3699     CLOSE contract_num_csr;
3700     IF l_contract_number IS NULL THEN
3701       Okl_Api.set_message(p_app_name     => g_app_name,
3702                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3703       RAISE OKL_API.G_EXCEPTION_ERROR;
3704 	END IF;
3705 
3706     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3707       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3708 	  LOOP
3709 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_provision_date' THEN
3710           l_provision_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3711         END IF;
3712       END LOOP;
3713 	ELSE
3714       Okl_Api.Set_Message(p_app_name     => g_app_name,
3715                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3716       RAISE Okl_Api.G_EXCEPTION_ERROR;
3717 	END IF;
3718 
3719     IF l_provision_date IS NULL THEN
3720       Okl_Api.Set_Message(p_app_name     => g_app_name,
3721                           p_msg_name     => 'OKL_GLP_PROV_DATE_ERROR');
3722       RAISE Okl_Api.G_EXCEPTION_ERROR;
3723 	END IF;
3724 
3725     -- SGIYER
3726     -- UDS Impact
3727     OKL_STREAMS_UTIL.get_primary_stream_type(
3728       p_khr_id  		   	=> p_khr_id,
3729       p_primary_sty_purpose => 'RENT',
3730       x_return_status		=> l_return_status,
3731       x_primary_sty_id 		=> l_rent_sty_id);
3732     IF l_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
3733       Okl_Api.set_message(p_app_name     => g_app_name,
3734                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
3735                           p_token1       => 'STREAM_NAME',
3736                           p_token1_value => 'RENT');
3737       RAISE Okl_Api.G_EXCEPTION_ERROR;
3738     END IF;
3739 
3740     -- SGIYER
3741     -- UDS Impact
3742     OKL_STREAMS_UTIL.get_dependent_stream_type(
3743             p_khr_id  		   	    => p_khr_id,
3744             p_primary_sty_purpose   => 'RENT',
3745             p_dependent_sty_purpose => 'LEASE_INCOME',
3746             x_return_status		    => l_return_status,
3747             x_dependent_sty_id      => l_lease_inc_sty_id);
3748     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3749       -- store SQL error message on message stack for caller and entry in log file
3750       Okl_Api.set_message(p_app_name     => g_app_name,
3751                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
3752 	                      p_token1       => 'STREAM_NAME',
3753 	                      p_token1_value => 'LEASE INCOME');
3754       RAISE Okl_Api.G_EXCEPTION_ERROR;
3755     END IF;
3756 
3757     OPEN get_unearn_rev_csr (p_khr_id, l_provision_date, l_rent_sty_id, l_lease_inc_sty_id);
3758     FETCH get_unearn_rev_csr INTO l_income_strm_bal;
3759     CLOSE get_unearn_rev_csr;
3760 
3761     -- Bug 2969989. Return zero explicitly if nothing found.
3762     IF l_income_strm_bal IS NULL THEN
3763       l_income_strm_bal := 0;
3764 	END IF;
3765 
3766     RETURN l_income_strm_bal;
3767 
3768   EXCEPTION
3769     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3770 	RETURN NULL;
3771 
3772 	WHEN OTHERS THEN
3773       IF get_unearn_rev_csr%ISOPEN THEN
3774         CLOSE get_unearn_rev_csr;
3775       END IF;
3776       IF contract_num_csr%ISOPEN THEN
3777         CLOSE contract_num_csr;
3778       END IF;
3779       Okl_Api.SET_MESSAGE(
3780                         p_app_name     => G_APP_NAME,
3781                         p_msg_name     => G_UNEXPECTED_ERROR,
3782                         p_token1       => G_SQLCODE_TOKEN,
3783                         p_token1_value => SQLCODE,
3784                         p_token2       => G_SQLERRM_TOKEN,
3785                         p_token2_value => SQLERRM);
3786       RETURN NULL;
3787   END CONTRACT_UNEARNED_REVENUE;
3788 
3789 ----------------------------------------------------------------------------------------------------
3790 
3791     -- Start of Comments
3792     -- Created By     : Shri Iyer
3793     -- Function Name  : CONTRACT_UNGUARANTEED_RESIDUAL
3794     -- Description    : This function returns the unguaranteed residual for a contract
3795     -- Dependencies   : None
3796     -- Parameters     : contract id, contract line id
3797     -- Version        : 1.0
3798     -- End of Commnets
3799 
3800 ----------------------------------------------------------------------------------------------------
3801 
3802   FUNCTION CONTRACT_UNGUARANTEED_RESIDUAL(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3803     l_unguaranteed_residual  NUMBER := 0;
3804     l_contract_number VARCHAR2(2000);
3805 
3806     -- cursor to get the contract number
3807     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
3808     SELECT  contract_number
3809     FROM OKL_K_HEADERS_FULL_V
3810     WHERE id = p_ctr_id;
3811 
3812     CURSOR get_ung_res_csr(p_ctr_id NUMBER) IS
3813     SELECT SUM(NVL(RESIDUAL_VALUE,0)) - SUM(NVL(RESIDUAL_GRNTY_AMOUNT, 0))
3814     FROM OKL_K_LINES_FULL_V
3815     WHERE DNZ_CHR_ID = p_ctr_id;
3816 
3817   BEGIN
3818 	OPEN contract_num_csr(p_khr_id);
3819     FETCH contract_num_csr INTO l_contract_number;
3820     IF contract_num_csr%NOTFOUND THEN
3821       CLOSE contract_num_csr;
3822       Okl_Api.set_message(p_app_name     => g_app_name,
3823                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3824       RAISE OKL_API.G_EXCEPTION_ERROR;
3825 	END IF;
3826     CLOSE contract_num_csr;
3827 
3828     OPEN get_ung_res_csr(p_khr_id);
3829     FETCH get_ung_res_csr INTO l_unguaranteed_residual;
3830     IF get_ung_res_csr%NOTFOUND THEN
3831       Okl_Api.Set_Message(p_app_name     => g_app_name,
3832                           p_msg_name     => 'OKL_LPV_FE_UNG_RES',
3833                           p_token1       => 'CONTRACT_NUMBER',
3834                           p_token1_value => l_contract_number);
3835       CLOSE get_ung_res_csr;
3836 	  RAISE OKL_API.G_EXCEPTION_ERROR;
3837 	END IF;
3838 	CLOSE get_ung_res_csr;
3839 
3840     -- Bug 2969989. Return zero explicitly if nothing found.
3841     IF l_unguaranteed_residual IS NULL THEN
3842       l_unguaranteed_residual := 0;
3843 	END IF;
3844 
3845     RETURN l_unguaranteed_residual;
3846 
3847   EXCEPTION
3848     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3849 	RETURN NULL;
3850 
3851 	WHEN OTHERS THEN
3852                Okl_Api.SET_MESSAGE(
3853                         p_app_name     => G_APP_NAME,
3854                         p_msg_name     => G_UNEXPECTED_ERROR,
3855                         p_token1       => G_SQLCODE_TOKEN,
3856                         p_token1_value => SQLCODE,
3857                         p_token2       => G_SQLERRM_TOKEN,
3858                         p_token2_value => SQLERRM);
3859                 RETURN NULL;
3860   END CONTRACT_UNGUARANTEED_RESIDUAL;
3861 
3862 ----------------------------------------------------------------------------------------------------
3863 
3864     -- Start of Comments
3865     -- Created By     : Shri Iyer
3866     -- Function Name  : CONTRACT_UNACCRUED_SUBSIDY
3867     -- Description    : This function returns the unaccrued portion of the subsidy streams for a
3868     --                  given contract on a particular date
3869     -- Dependencies   : None
3870     -- Parameters     : contract id, contract line id
3871     -- Version        : 1.0
3872     -- End of Commnets
3873 
3874 ----------------------------------------------------------------------------------------------------
3875 
3876   FUNCTION CONTRACT_UNACCRUED_SUBSIDY(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3877     l_unaccrued_subsidy       NUMBER := 0;
3878     l_contract_number         VARCHAR2(2000);
3879 	l_provision_date          DATE;
3880     l_subsidy_inc_id          NUMBER;
3881     l_return_status           VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3882 
3883     -- cursor to get the contract number
3884     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
3885     SELECT  contract_number
3886     FROM OKL_K_HEADERS_FULL_V
3887     WHERE id = p_ctr_id;
3888 
3889     -- cursor to get unaccrued subsidy for a contract
3890     CURSOR unaccrued_subsidy_csr(p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE, p_date DATE, p_subsidy_inc_id NUMBER) IS
3891     SELECT SUM(ste.amount)
3892     FROM OKL_STRM_ELEMENTS ste,
3893          OKL_STRM_TYPE_B sty,
3894          OKL_STREAMS stm
3895     WHERE stm.khr_id = p_ctr_id
3896     AND stm.sty_id = sty.id
3897     AND sty.id = p_subsidy_inc_id
3898     AND stm.active_yn = 'Y'
3899     AND stm.say_code = 'CURR'
3900     AND stm.id = ste.stm_id
3901     AND ste.accrued_yn IS NULL
3902     AND ste.stream_element_date <= p_date;
3903 
3904 
3905   BEGIN
3906 
3907 	OPEN contract_num_csr(p_khr_id);
3908     FETCH contract_num_csr INTO l_contract_number;
3909     CLOSE contract_num_csr;
3910 
3911     IF l_contract_number IS NULL THEN
3912       Okl_Api.set_message(p_app_name     => g_app_name,
3913                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3914       RAISE OKL_API.G_EXCEPTION_ERROR;
3915 	END IF;
3916 
3917     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3918       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3919 	  LOOP
3920 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_provision_date' THEN
3921           l_provision_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3922         END IF;
3923       END LOOP;
3924 	ELSE
3925       Okl_Api.Set_Message(p_app_name     => g_app_name,
3926                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3927       RAISE Okl_Api.G_EXCEPTION_ERROR;
3928 	END IF;
3929 
3930     IF l_provision_date IS NULL THEN
3931       Okl_Api.Set_Message(p_app_name     => g_app_name,
3932                           p_msg_name     => 'OKL_GLP_PROV_DATE_ERROR');
3933       RAISE Okl_Api.G_EXCEPTION_ERROR;
3934 	END IF;
3935 
3936     -- Bug 4053623.
3937 	-- Modifying error handling.
3938     OKL_STREAMS_UTIL.get_dependent_stream_type(
3939             p_khr_id  		   	    => p_khr_id,
3940             p_primary_sty_purpose   => 'SUBSIDY',
3941             p_dependent_sty_purpose => 'SUBSIDY_INCOME',
3942             x_return_status		    => l_return_status,
3943             x_dependent_sty_id      => l_subsidy_inc_id);
3944     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3945       IF l_return_status = OKL_API.G_RET_STS_ERROR THEN
3946         -- subsidy income stream not defined for the contract
3947         l_unaccrued_subsidy := 0;
3948         RETURN l_unaccrued_subsidy;
3949       ELSIF l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
3950         -- store SQL error message on message stack for caller and entry in log file
3951         Okl_Api.set_message(p_app_name     => g_app_name,
3952                             p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
3953 	                        p_token1       => 'STREAM_NAME',
3954 	                        p_token1_value => 'SUBSIDY INCOME');
3955         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3956       END IF;
3957     END IF;
3958 
3959     IF l_subsidy_inc_id IS NOT NULL THEN
3960       OPEN unaccrued_subsidy_csr (p_khr_id, l_provision_date, l_subsidy_inc_id);
3961       FETCH unaccrued_subsidy_csr INTO l_unaccrued_subsidy;
3962       CLOSE unaccrued_subsidy_csr;
3963     END IF;
3964     IF l_unaccrued_subsidy IS NULL THEN
3965       l_unaccrued_subsidy := 0;
3966 	END IF;
3967 
3968     RETURN l_unaccrued_subsidy;
3969 
3970   EXCEPTION
3971     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3972       RETURN NULL;
3973 
3974 	WHEN OTHERS THEN
3975       IF unaccrued_subsidy_csr%ISOPEN THEN
3976         CLOSE unaccrued_subsidy_csr;
3977       END IF;
3978       IF contract_num_csr%ISOPEN THEN
3979         CLOSE contract_num_csr;
3980       END IF;
3981       Okl_Api.SET_MESSAGE(
3982                         p_app_name     => G_APP_NAME,
3983                         p_msg_name     => G_UNEXPECTED_ERROR,
3984                         p_token1       => G_SQLCODE_TOKEN,
3985                         p_token1_value => SQLCODE,
3986                         p_token2       => G_SQLERRM_TOKEN,
3987                         p_token2_value => SQLERRM);
3988       RETURN NULL;
3989   END CONTRACT_UNACCRUED_SUBSIDY;
3990 
3991   FUNCTION CONTRACT_TOTAL_ACTUAL_INT(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3992 
3993 	l_accrual_date            DATE;
3994     l_total_actual_int      NUMBER;
3995     l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3996 
3997   BEGIN
3998 
3999 
4000     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
4001       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
4002 	  LOOP
4003 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_accrual_date' THEN
4004           l_accrual_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
4005         END IF;
4006       END LOOP;
4007 	ELSE
4008       Okl_Api.Set_Message(p_app_name     => g_app_name,
4009                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
4010       RAISE Okl_Api.G_EXCEPTION_ERROR;
4011 	END IF;
4012 
4013     IF l_accrual_date IS NULL THEN
4014       Okl_Api.Set_Message(p_app_name     => g_app_name,
4015                           p_msg_name     => 'OKL_AGN_DATE_ERROR');
4016       RAISE Okl_Api.G_EXCEPTION_ERROR;
4017 	END IF;
4018 
4019     l_total_actual_int := OKL_VARIABLE_INT_UTIL_PVT.get_interest_due(
4020                                x_return_status => l_return_status,
4021                                p_khr_id => p_khr_id,
4022                                p_to_date => l_accrual_date);
4023 
4024     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4025       -- store SQL error message on message stack for caller and entry in log file
4026       Okl_Api.set_message(p_app_name     => g_app_name,
4027                          p_msg_name     => 'OKL_AGN_VAR_INT_UTIL_ERROR',
4028                          p_token1       => 'ERROR_STATUS',
4029                          p_token1_value => l_return_status);
4030       RAISE Okl_Api.G_EXCEPTION_ERROR;
4031     ELSE
4032       IF (l_total_actual_int IS NULL) OR (l_total_actual_int = 0) THEN
4033         Okl_Api.Set_Message(p_app_name     => g_app_name,
4034                             p_msg_name     => 'OKL_AGN_TOT_VAR_INT_ERROR');
4035         RAISE OKL_API.G_EXCEPTION_ERROR;
4036       END IF;
4037     END IF;
4038 
4039     RETURN l_total_actual_int;
4040 
4041   EXCEPTION
4042     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4043       RETURN NULL;
4044 
4045 	WHEN OTHERS THEN
4046       Okl_Api.SET_MESSAGE(
4047                         p_app_name     => G_APP_NAME,
4048                         p_msg_name     => G_UNEXPECTED_ERROR,
4049                         p_token1       => G_SQLCODE_TOKEN,
4050                         p_token1_value => SQLCODE,
4051                         p_token2       => G_SQLERRM_TOKEN,
4052                         p_token2_value => SQLERRM);
4053       RETURN NULL;
4054 
4055   END CONTRACT_TOTAL_ACTUAL_INT;
4056 
4057 ----------------------------------------------------------------------------------------------------
4058 
4059     -- Start of Comments
4060     -- Created By     : Shri Iyer
4061     -- Function Name  : CONTRACT_TOTAL_ACCRUED_INT
4062     -- Description    : This function returns the total accrued amount for a
4063     --                  given contract on a particular date
4064     -- Dependencies   : None
4065     -- Parameters     : contract id, contract line id
4066     -- Version        : 1.0
4067     -- End of Commnets
4068 
4069 ----------------------------------------------------------------------------------------------------
4070 
4071   FUNCTION CONTRACT_TOTAL_ACCRUED_INT(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
4072     l_total_accrued           NUMBER := 0;
4073     l_contract_number         VARCHAR2(2000);
4074 	l_accrual_date            DATE;
4075     l_sty_id                  NUMBER;
4076     l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4077 
4078     -- cursor to get the contract number
4079     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
4080     SELECT  contract_number
4081     FROM OKL_K_HEADERS_FULL_V
4082     WHERE id = p_ctr_id;
4083 
4084     -- cursor to get unaccrued subsidy for a contract
4085     CURSOR total_accrued_csr(p_ctr_id NUMBER, p_date DATE, p_sty_id NUMBER) IS
4086     SELECT SUM(trx.amount)
4087     FROM OKL_TRX_CONTRACTS trx,
4088          OKL_TRX_TYPES_V try,
4089          OKL_TXL_CNTRCT_LNS txl
4090     WHERE trx.khr_id = p_ctr_id
4091  --Fixed Bug 5707866 SLA Uptake Project by nikshah, changed tsu_code to PROCESSED from ENTERED
4092     AND trx.tsu_code ='PROCESSED'
4093     AND trx.try_id = try.id
4094     AND trx.representation_type = 'PRIMARY' -- MGAAP OTHER 7263041
4095     AND try.name = 'Accrual'
4096     AND trx.date_transaction_occurred <= p_date
4097     AND trx.id = txl.tcn_id
4098     AND txl.sty_id = p_sty_id;
4099 
4100   BEGIN
4101 
4102 	OPEN contract_num_csr(p_khr_id);
4103     FETCH contract_num_csr INTO l_contract_number;
4104     CLOSE contract_num_csr;
4105 
4106     IF l_contract_number IS NULL THEN
4107       Okl_Api.set_message(p_app_name     => g_app_name,
4108                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
4109       RAISE OKL_API.G_EXCEPTION_ERROR;
4110 	END IF;
4111 
4112     OKL_STREAMS_UTIL.get_dependent_stream_type(
4113             p_khr_id  		   	    => p_khr_id,
4114             p_primary_sty_purpose   => 'RENT',
4115             p_dependent_sty_purpose => 'ACTUAL_INCOME_ACCRUAL',
4116             x_return_status		    => l_return_status,
4117             x_dependent_sty_id      => l_sty_id);
4118 
4119     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4120       -- store SQL error message on message stack for caller and entry in log file
4121       Okl_Api.set_message(p_app_name     => g_app_name,
4122                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
4123                           p_token1       => 'STREAM_NAME',
4124 	                      p_token1_value => 'Actual Income Accrual');
4125       RAISE Okl_Api.G_EXCEPTION_ERROR;
4126     END IF;
4127 
4128     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
4129       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
4130 	  LOOP
4131 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_accrual_date' THEN
4132           l_accrual_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
4133         END IF;
4134       END LOOP;
4135 	ELSE
4136       Okl_Api.Set_Message(p_app_name     => g_app_name,
4137                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
4138       RAISE Okl_Api.G_EXCEPTION_ERROR;
4139 	END IF;
4140 
4141     IF l_accrual_date IS NULL THEN
4142       Okl_Api.Set_Message(p_app_name     => g_app_name,
4143                           p_msg_name     => 'OKL_AGN_DATE_ERROR');
4144       RAISE Okl_Api.G_EXCEPTION_ERROR;
4145 	END IF;
4146 
4147 	OPEN total_accrued_csr(p_khr_id, l_accrual_date, l_sty_id);
4148     FETCH total_accrued_csr INTO l_total_accrued;
4149     CLOSE total_accrued_csr;
4150 
4151     IF l_total_accrued IS NULL THEN
4152       l_total_accrued := 0;
4153     END IF;
4154 
4155     RETURN l_total_accrued;
4156 
4157   EXCEPTION
4158     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4159       RETURN NULL;
4160 
4161 	WHEN OTHERS THEN
4162       IF total_accrued_csr%ISOPEN THEN
4163         CLOSE total_accrued_csr;
4164       END IF;
4165       Okl_Api.SET_MESSAGE(
4166                         p_app_name     => G_APP_NAME,
4167                         p_msg_name     => G_UNEXPECTED_ERROR,
4168                         p_token1       => G_SQLCODE_TOKEN,
4169                         p_token1_value => SQLCODE,
4170                         p_token2       => G_SQLERRM_TOKEN,
4171                         p_token2_value => SQLERRM);
4172       RETURN NULL;
4173   END CONTRACT_TOTAL_ACCRUED_INT;
4174 
4175 ------------------------------------------------------------------------------
4176   -- Start of Comments
4177   -- Created By:    [email protected] - 20-FEB-2002
4178   -- Function Name: contract_estimate_tax
4179   -- Description:   Estimate tax using ARP-CRM integration routines
4180   -- Dependencies:  OKL building blocks AMTX and AMUV,
4181   -- Parameters:    IN:  p_contract_id, p_contract_line_id,
4182   --                     taxable_amount (stored in g_additional_parameters(1))
4183   --                OUT: amount
4184   -- History        : RMUNJULU 3394507 Get the loc_id for location_id and pass to Tax engine
4185   --                : RMUNJULU 3394507 Performance fix, changed cursor to query fron base tables
4186   --                  instead of _uv
4187   --                : RMUNJULU 3394507 added code
4188   --                  to reset the arp_tax.tax_info_rec before it is called
4189   --                  Also added code to set the location_id based on bill_to_site
4190   --                  for contract level quote line tax calculation
4191   --                : GKADARKA 3569441 Added union in cursor l_item_loc_csr
4192   --                : rmunjulu 3682465 Changed to get and set the bill_to_postal_code
4193   -- Version:       1.0
4194   -- End of Commnets
4195 ------------------------------------------------------------------------------
4196 
4197 FUNCTION contract_estimate_tax (
4198 	p_contract_id		IN NUMBER,
4199 	p_contract_line_id	IN NUMBER)
4200 	RETURN NUMBER IS
4201 
4202 	-- Get location of all Installed Base items
4203 	-- linked to the Financial Asset Line
4204     -- RMUNJULU 3394507 Changed the cursor to get the loc_id (location ccid) for
4205     -- org_id and location_id
4206     -- RMUNJULU 3394507 Performance fix, query from base tables instead of
4207     -- from _uv
4208 /*
4209 	CURSOR l_item_loc_csr (cp_fin_asset_cle_id NUMBER) IS
4210     SELECT DISTINCT LOA.loc_id location_id, LOC.postal_code -- 3682465
4211     FROM OKC_K_LINES_B        KLE_FA,
4212          OKC_LINE_STYLES_B    LSE_FA,
4213          OKC_K_LINES_B        KLE_IL,
4214          OKC_LINE_STYLES_B    LSE_IL,
4215          OKC_K_LINES_B        KLE_IB,
4216          OKC_LINE_STYLES_B    LSE_IB,
4217          OKC_K_ITEMS          ITE,
4218          CSI_ITEM_INSTANCES   CII,
4219          HZ_PARTY_SITES       PSI,
4220          HZ_LOCATIONS         LOC,
4221       --   HZ_PARTIES           PAR,
4222          HZ_PARTY_SITE_USES   PSU,
4223          HZ_LOC_ASSIGNMENTS   LOA
4224     WHERE kle_fa.id	=  cp_fin_asset_cle_id
4225     AND   lse_fa.id = kle_fa.lse_id
4226     AND   lse_fa.lty_code = 'FREE_FORM1'
4227     AND   kle_il.cle_id = kle_fa.id
4228     AND   lse_il.id = kle_il.lse_id
4229     AND   lse_il.lty_code = 'FREE_FORM2'
4230     AND   kle_ib.cle_id = kle_il.id
4231     AND   lse_ib.id = kle_ib.lse_id
4232     AND   lse_ib.lty_code = 'INST_ITEM'
4233     AND   ite.cle_id = kle_ib.id
4234     AND   ite.jtot_object1_code = 'OKX_IB_ITEM'
4235     AND   cii.instance_id = ite.object1_id1
4236     AND   cii.install_location_type_code = 'HZ_PARTY_SITES'
4237     AND   psi.party_site_id = cii.install_location_id
4238     AND   loc.location_id = psi.location_id
4239  --   AND   par.party_id = psi.party_id
4240     AND   psu.party_site_id = psi.party_site_id
4241     AND   psu.site_use_type = 'INSTALL_AT'
4242     AND   loc.location_id = loa.location_id
4243     UNION
4244     SELECT DISTINCT LOA.loc_id location_id, LOC.postal_code -- 3682465
4245     FROM OKC_K_LINES_B        KLE_FA,
4246          OKC_LINE_STYLES_B    LSE_FA,
4247          OKC_K_LINES_B        KLE_IL,
4248          OKC_LINE_STYLES_B    LSE_IL,
4249          OKC_K_LINES_B        KLE_IB,
4250          OKC_LINE_STYLES_B    LSE_IB,
4251          OKC_K_ITEMS          ITE,
4252          CSI_ITEM_INSTANCES   CII,
4253          --HZ_PARTY_SITES       PSI,
4254          HZ_LOCATIONS         LOC,
4255          --HZ_PARTIES           PAR,
4256          --HZ_PARTY_SITE_USES   PSU,
4257          HZ_LOC_ASSIGNMENTS   LOA
4258     WHERE kle_fa.id	=  cp_fin_asset_cle_id
4259     AND   lse_fa.id = kle_fa.lse_id
4260     AND   lse_fa.lty_code = 'FREE_FORM1'
4261     AND   kle_il.cle_id = kle_fa.id
4262     AND   lse_il.id = kle_il.lse_id
4263     AND   lse_il.lty_code = 'FREE_FORM2'
4264     AND   kle_ib.cle_id = kle_il.id
4265     AND   lse_ib.id = kle_ib.lse_id
4266     AND   lse_ib.lty_code = 'INST_ITEM'
4267     AND   ite.cle_id = kle_ib.id
4268     AND   ite.jtot_object1_code = 'OKX_IB_ITEM'
4269     AND   cii.instance_id = ite.object1_id1
4270     AND   cii.install_location_type_code = 'HZ_LOCATIONS'
4271     AND   loc.location_id = cii.install_location_id
4272     --AND   loc.location_id = psi.location_id
4273     --AND   par.party_id = psi.party_id
4274     --AND   psu.party_site_id = psi.party_site_id
4275     --AND   psu.site_use_type = 'INSTALL_AT'
4276     AND   loc.location_id = loa.location_id
4277     AND   EXISTS (SELECT 1
4278                   FROM   HZ_PARTY_SITES psi,
4279                          HZ_PARTY_SITE_USES psu
4280                   WHERE  psi.location_id = loc.location_id
4281                   AND    psu.party_site_id = psi.party_site_id
4282                   AND    psu.site_use_type = 'INSTALL_AT');
4283 
4284   -- RMUNJULU 3394507 Added cursor to get the location for the LESSEE bill to
4285   -- Get the location_id (location_ccid) for the customer bill_to
4286   CURSOR  item_loc_csr ( p_bill_to_site_use_id IN NUMBER, p_cust_acct_id IN NUMBER) IS
4287   SELECT  loc_assign.loc_id  location_id, LOC.postal_code -- 3682465
4288   FROM    HZ_PARTY_SITES            party_site,
4289           HZ_LOC_ASSIGNMENTS        loc_assign,
4290           HZ_LOCATIONS              loc,
4291           HZ_CUST_ACCT_SITES_ALL    acct_site,
4292           HZ_PARTIES                party,
4293           HZ_CUST_ACCOUNTS          cust_acct,
4294           HZ_CUST_SITE_USES         cust_site_uses
4295   WHERE   acct_site.party_site_id     = party_site.party_site_id
4296   AND     loc.location_id             = party_site.location_id
4297   AND     loc.location_id             = loc_assign.location_id
4298   AND     acct_site.cust_acct_site_id = cust_site_uses.cust_acct_site_id
4299   AND     party.party_id              = cust_acct.party_id
4300   AND     cust_site_uses.site_use_id  = p_bill_to_site_use_id
4301   AND     cust_acct.cust_account_id   = p_cust_acct_id;
4302 
4303 	-- Get line name to use in the error messages
4304 	CURSOR l_cle_csr (cp_cle_id NUMBER) IS
4305 		SELECT	l.name
4306 		FROM	okc_k_lines_v l
4307 		WHERE	l.id = cp_cle_id;
4308 
4309 	-- Get header number to use in error messages
4310 	CURSOR l_chr_csr (cp_chr_id NUMBER) IS
4311 		SELECT	h.contract_number
4312 		FROM	okc_k_headers_v h
4313 		WHERE	h.id = cp_chr_id;
4314 
4315 	l_result_amount		NUMBER		:= 0;
4316 	l_no_taxable_amount	EXCEPTION;
4317 	l_no_sys_params		EXCEPTION;
4318 	l_tax_tbl		ARP_TAX.om_tax_out_tab_type;
4319 	l_bill_to_rec		okx_cust_site_uses_v%ROWTYPE;
4320 	l_return_status		VARCHAR2(1)	:= OKL_API.G_RET_STS_SUCCESS;
4321 	l_overall_status	VARCHAR2(1)	:= OKL_API.G_RET_STS_SUCCESS;
4322 	l_object_name		VARCHAR2(200);
4323 	l_token			VARCHAR2(30);
4324 
4325 	-- Variables to pass to taxation API
4326 	l_taxable_amount	NUMBER		:= NULL;
4327 	l_org_id		NUMBER		:= NULL;
4328 	l_sob_id		NUMBER		:= NULL;
4329 	l_currency		VARCHAR2(15)	:= NULL;
4330 	l_precision		NUMBER		:= NULL;
4331 	l_min_acc_unit		NUMBER		:= NULL;
4332 	l_cust_site_use_id	NUMBER		:= NULL;
4333 	l_cust_account_id	NUMBER		:= NULL;
4334 	l_location_id		NUMBER		:= NULL;
4335 
4336     -- RMUNJULU 3394507 Declared variable for tax_info_rec_type which will be used
4337     -- to reset the global variable
4338     l_tax_rec   arp_tax.tax_info_rec_type;
4339     l_postal_code HZ_LOCATIONS.postal_code%TYPE; -- 3682465
4340 */
4341 BEGIN
4342 
4343 	-- ***********************************
4344 	-- Get Object to use in error messages
4345 	-- ***********************************
4346 /*
4347 	IF p_contract_line_id IS NOT NULL THEN
4348 		OPEN	l_cle_csr (p_contract_line_id);
4349 		FETCH	l_cle_csr INTO l_object_name;
4350 		CLOSE	l_cle_csr;
4351 		l_token	:= 'contract_line_id';
4352 	ELSE
4353 		OPEN	l_chr_csr (p_contract_id);
4354 		FETCH	l_chr_csr INTO l_object_name;
4355 		CLOSE	l_chr_csr;
4356 		l_token	:= 'contract_id';
4357 	END IF;
4358 
4359 	IF l_object_name IS NULL THEN
4360 		l_overall_status := OKL_API.G_RET_STS_ERROR;
4361 		OKC_API.SET_MESSAGE (
4362 			p_app_name	=> OKC_API.G_APP_NAME,
4363 			p_msg_name	=> OKC_API.G_INVALID_VALUE,
4364 			p_token1	=> OKC_API.G_COL_NAME_TOKEN,
4365 			p_token1_value	=> l_token);
4366 	END IF;
4367 
4368 	-- ********************************************
4369 	-- Extract Taxable Amount from global variables
4370 	-- ********************************************
4371 
4372 	BEGIN
4373 
4374 	    IF  okl_execute_formula_pub.g_additional_parameters(1).name
4375 			= 'TAXABLE AMOUNT'
4376 	    AND okl_execute_formula_pub.g_additional_parameters(1).value
4377 			IS NOT NULL
4378 	    THEN
4379 		l_taxable_amount := TO_NUMBER
4380 			(okl_execute_formula_pub.g_additional_parameters(1).value);
4381 	    ELSE
4382 		RAISE l_no_taxable_amount;
4383 	    END IF;
4384 
4385 	    IF  NVL (l_taxable_amount, 0) = 0 THEN
4386 		RAISE l_no_taxable_amount;
4387 	    END IF;
4388 
4389 	EXCEPTION
4390 	    WHEN OTHERS THEN
4391 		l_overall_status := OKL_API.G_RET_STS_ERROR;
4392 		OKL_API.SET_MESSAGE (
4393 			p_app_name	=> OKL_API.G_APP_NAME,
4394 			p_msg_name	=> 'OKL_AM_TAX_NO_TAXABLE_AMOUNT',
4395 			p_token1	=> 'OBJECT',
4396 			p_token1_value	=> l_object_name);
4397 	END;
4398 
4399 	-- **************************************************
4400 	-- Get all generic parameters required by taxation API
4401 	-- **************************************************
4402 
4403 	BEGIN
4404 
4405 	    l_org_id   := okl_am_util_pvt.get_chr_org_id (p_contract_id);
4406 	    l_sob_id   := okc_currency_api.get_ou_sob (l_org_id);
4407 	    l_currency := okc_currency_api.get_sob_currency (l_sob_id);
4408 	    okl_am_util_pvt.get_currency_info
4409 			(l_currency, l_precision, l_min_acc_unit);
4410 
4411 	    IF l_sob_id IS NULL OR l_precision IS NULL THEN
4412 		RAISE l_no_sys_params;
4413 	    END IF;
4414 
4415 	EXCEPTION
4416 	    WHEN OTHERS THEN
4417 		l_overall_status := OKL_API.G_RET_STS_ERROR;
4418 		OKL_API.SET_MESSAGE (
4419 			p_app_name	=> OKL_API.G_APP_NAME,
4420 			p_msg_name	=> 'OKL_AM_TAX_NO_PARAMS',
4421 			p_token1	=> 'OBJECT',
4422 			p_token1_value	=> l_object_name);
4423 	END;
4424 
4425 	-- *****************************************************
4426 	-- Get line specific parameters required by taxation API
4427 	-- *****************************************************
4428 
4429 	IF  (p_contract_line_id IS NOT NULL)
4430 	AND (l_object_name IS NOT NULL) THEN
4431 
4432 		OPEN	l_item_loc_csr (p_contract_line_id);
4433 
4434 		LOOP
4435 			FETCH	l_item_loc_csr INTO l_location_id, l_postal_code; -- 3682465
4436 			EXIT  WHEN l_item_loc_csr%NOTFOUND
4437 				OR l_item_loc_csr%ROWCOUNT > 1;
4438 		END LOOP;
4439 
4440 		IF l_item_loc_csr%ROWCOUNT <> 1
4441 		OR l_location_id IS NULL THEN
4442 			l_overall_status := OKL_API.G_RET_STS_ERROR;
4443 			OKL_API.SET_MESSAGE (
4444 				p_app_name	=> OKL_API.G_APP_NAME,
4445 				p_msg_name	=> 'OKL_AM_TAX_NO_LOCATION',
4446 				p_token1	=> 'OBJECT',
4447 				p_token1_value	=> l_object_name);
4448 		END IF;
4449 
4450 		CLOSE	l_item_loc_csr;
4451 
4452 	-- *********************************************************
4453 	-- Get contract specific parameters required by taxation API
4454 	-- *********************************************************
4455 
4456 	ELSIF (p_contract_line_id IS NULL) THEN
4457 
4458 		okl_am_util_pvt.get_bill_to_address (
4459 			p_contract_id		=> p_contract_id,
4460 			p_message_yn		=> FALSE,
4461 			x_bill_to_address_rec	=> l_bill_to_rec,
4462 			x_return_status		=> l_return_status);
4463 
4464 		IF l_return_status = OKL_API.G_RET_STS_SUCCESS THEN
4465 			l_cust_site_use_id := l_bill_to_rec.id1;
4466 			l_cust_account_id  := l_bill_to_rec.cust_account_id;
4467 		END IF;
4468 
4469 		IF l_return_status <> OKL_API.G_RET_STS_SUCCESS
4470 		OR l_cust_site_use_id IS NULL
4471 		OR l_cust_account_id  IS NULL THEN
4472 			l_overall_status := OKL_API.G_RET_STS_ERROR;
4473 			OKL_API.SET_MESSAGE (
4474 				p_app_name	=> OKL_API.G_APP_NAME,
4475 				p_msg_name	=> 'OKL_AM_TAX_NO_BILL_TO',
4476 				p_token1	=> 'OBJECT',
4477 				p_token1_value	=> l_object_name);
4478 		END IF;
4479 
4480 	END IF;
4481 
4482 	-- *****************
4483 	-- Call taxation API
4484 	-- *****************
4485 
4486     -- RMUNJULU 3394507 Reset the GLOBAL tax_info_rec rec type with empty rec type
4487     arp_tax.tax_info_rec := l_tax_rec;
4488 
4489 	-- Calculate tax for positive amounts
4490 	IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS
4491 	AND l_taxable_amount > 0 THEN
4492 
4493 	    arp_tax.tax_info_rec.trx_date		:= SYSDATE;
4494 	    arp_tax.tax_info_rec.extended_amount	:= l_taxable_amount;
4495 	    arp_tax.tax_info_rec.trx_currency_code	:= l_currency;
4496 	    arp_tax.tax_info_rec.PRECISION		:= l_precision;
4497 	    arp_tax.tax_info_rec.minimum_accountable_unit := l_min_acc_unit;
4498 
4499 	    IF p_contract_line_id IS NOT NULL THEN
4500 
4501 		    arp_tax.tax_info_rec.bill_to_location_id := l_location_id;
4502 
4503             arp_tax.tax_info_rec.bill_to_postal_code := l_postal_code; -- 3682465
4504 
4505 	    ELSE
4506 		    arp_tax.tax_info_rec.bill_to_site_use_id := l_cust_site_use_id;
4507 		    arp_tax.tax_info_rec.bill_to_cust_id	 := l_cust_account_id;
4508 
4509             -- RMUNJULU  3394507 Found that Tax engine also needs the location_id
4510             -- for the bill to location, added code to get and set that value
4511             -- get the location for the LESSEE bill to
4512             OPEN item_loc_csr ( l_cust_site_use_id, l_cust_account_id);
4513             FETCH item_loc_csr INTO l_location_id, l_postal_code; -- 3682465
4514             CLOSE item_loc_csr;
4515 
4516             -- raise message if site location not found
4517             IF l_location_id IS NULL THEN
4518 			 OKL_API.SET_MESSAGE (
4519 				p_app_name	=> OKL_API.G_APP_NAME,
4520 				p_msg_name	=> 'OKL_AM_TAX_NO_LOCATION',
4521 				p_token1	=> 'OBJECT',
4522 				p_token1_value	=> l_object_name);
4523             END IF;
4524 
4525             -- set the tax_info_rec with location id
4526 		    arp_tax.tax_info_rec.bill_to_location_id := l_location_id;
4527 
4528             arp_tax.tax_info_rec.bill_to_postal_code := l_postal_code; -- 3682465
4529 
4530 	    END IF;
4531 
4532 	    BEGIN
4533 		arp_tax_crm_integration_pkg.summary
4534 			(p_set_of_books_id 	=>	l_sob_id
4535 			,x_crm_tax_out_tbl	=>	l_tax_tbl
4536 			,p_new_tax_amount	=>	l_result_amount);
4537 	    EXCEPTION
4538 		WHEN OTHERS THEN
4539 		    l_overall_status := OKL_API.G_RET_STS_ERROR;
4540 		    OKL_API.SET_MESSAGE (
4541 			p_app_name	=> OKL_API.G_APP_NAME,
4542 			p_msg_name	=> 'OKL_AM_TAX_ARP_FAILED',
4543 			p_token1	=> 'OBJECT',
4544 			p_token1_value	=> l_object_name);
4545 	    END;
4546 
4547 	END IF;
4548 
4549 	RETURN NVL (l_result_amount, 0);
4550 */
4551 return 0;
4552 EXCEPTION
4553 	WHEN OTHERS THEN
4554 /*
4555 		-- Close open cursors
4556 
4557 		IF l_item_loc_csr%ISOPEN THEN
4558 			CLOSE l_item_loc_csr;
4559 		END IF;
4560 
4561 		IF l_cle_csr%ISOPEN THEN
4562 			CLOSE l_cle_csr;
4563 		END IF;
4564 
4565 		IF l_chr_csr%ISOPEN THEN
4566 			CLOSE l_chr_csr;
4567 		END IF;
4568 
4569         -- RMUNJULU 3394507 close cursor if open
4570 		IF item_loc_csr%ISOPEN THEN
4571 			CLOSE item_loc_csr;
4572 		END IF;
4573 
4574 		-- store SQL error message on message stack for caller
4575 
4576 		OKL_API.SET_MESSAGE (
4577 			p_app_name	=> OKL_API.G_APP_NAME,
4578 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
4579 			p_token1	=> 'SQLCODE',
4580 			p_token1_value	=> SQLCODE,
4581 			p_token2	=> 'SQLERRM',
4582 			p_token2_value	=> SQLERRM);
4583 */
4584 		RETURN NULL;
4585 
4586 END contract_estimate_tax;
4587 
4588 
4589 ------------------------------------------------------------------------------
4590   -- Start of Comments
4591   -- Created By:    [email protected] - 20-FEB-2002
4592   -- Function Name: line_estimate_tax
4593   -- Description:   Estimate tax using ARP-CRM integration routines
4594   -- Dependencies:  OKL building blocks AMTX and AMUV,
4595   -- Parameters:    IN:  p_contract_id, p_contract_line_id,
4596   --                     taxable_amount (stored in g_additional_parameters(1))
4597   --                OUT: amount
4598   -- Version:       1.0
4599   -- End of Commnets
4600 ------------------------------------------------------------------------------
4601 
4602 FUNCTION line_estimate_tax (
4603 	p_contract_id		IN NUMBER,
4604 	p_contract_line_id	IN NUMBER)
4605 	RETURN NUMBER IS
4606 BEGIN
4607 	-- To avoid code repetition, both header
4608 	-- and line are handled in one routine
4609 	RETURN (contract_estimate_tax (p_contract_id, p_contract_line_id));
4610 END line_estimate_tax;
4611 
4612 
4613 ------------------------------------------------------------------------------
4614   -- Start of Comments
4615   -- Created By:    [email protected] - 20-FEB-2002
4616   -- Function Name: line_estimated_property_tax
4617   -- Description:   Estimate property tax based on previous records
4618   -- Dependencies:  OKL building blocks AMTX and AMUV,
4619   -- Parameters:    IN:  p_contract_id, p_contract_line_id,
4620   --                OUT: amount
4621   -- Version:       1.0
4622   -- History:       21-MAR-2002 RDRAGUIL - Cursor based on Billing TRXs
4623   --                05 Nov 2004 PAGARG Bug# 3925492
4624   --                Modified the procedure to call BPD API for formula value.
4625   -- End of Commnets
4626 ------------------------------------------------------------------------------
4627 
4628 FUNCTION line_estimated_property_tax (
4629 	p_contract_id		IN NUMBER,
4630 	p_contract_line_id	IN NUMBER)
4631 	RETURN NUMBER IS
4632 
4633 	l_result_amount		NUMBER;
4634 
4635     --Bug# 3925492: pagarg +++ Estd. Prop Tax +++++++ Start ++++++++++
4636     CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
4637     SELECT trunc(qte.date_effective_from) date_effective_from
4638     FROM   okl_trx_quotes_b  qte
4639     WHERE  qte.id = p_quote_id;
4640 
4641     l_quote_id        NUMBER;
4642     l_quote_date_eff  DATE;
4643     l_sysdate         DATE;
4644     l_api_version     NUMBER;
4645     l_init_msg_list   VARCHAR2(1);
4646     l_return_status   VARCHAR2(1);
4647     l_msg_count       NUMBER;
4648     l_msg_data        VARCHAR2(2000);
4649     l_input_tbl       OKL_BPD_TERMINATION_ADJ_PVT.input_tbl_type;
4650     lx_baj_tbl        OKL_BPD_TERMINATION_ADJ_PVT.baj_tbl_type;
4651     l_tbl_cnt         NUMBER;
4652 BEGIN
4653     l_api_version := '1.0';
4654     l_init_msg_list := OKL_API.G_FALSE;
4655     l_result_amount := 0;
4656 
4657     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
4658       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
4659       LOOP
4660         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
4661            l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
4662         END IF;
4663       END LOOP;
4664     END IF;
4665 
4666     IF  l_quote_id IS NOT NULL
4667     AND l_quote_id <> OKL_API.G_MISS_NUM THEN
4668        OPEN get_quote_date_csr (l_quote_id);
4669        FETCH get_quote_date_csr INTO l_quote_date_eff;
4670        CLOSE get_quote_date_csr;
4671     END IF;
4672 
4673     SELECT SYSDATE INTO l_sysdate FROM DUAL;
4674 
4675     IF l_quote_date_eff IS NULL
4676     OR l_quote_date_eff = OKL_API.G_MISS_DATE
4677     THEN
4678        l_quote_date_eff := l_sysdate;
4679     END IF;
4680 
4681     l_input_tbl(0).khr_id := p_contract_id;
4682     l_input_tbl(0).kle_id := p_contract_line_id;
4683     l_input_tbl(0).term_date_from := l_quote_date_eff;
4684 
4685     OKL_BPD_TERMINATION_ADJ_PVT.get_unbilled_prop_tax(
4686         p_api_version        => l_api_version,
4687         p_init_msg_list      => l_init_msg_list,
4688         p_input_tbl          => l_input_tbl,
4689         x_baj_tbl            => lx_baj_tbl,
4690         x_return_status      => l_return_status,
4691         x_msg_count          => l_msg_count,
4692         x_msg_data           => l_msg_data);
4693 
4694     IF lx_baj_tbl.COUNT > 0
4695     THEN
4696         FOR l_tbl_cnt IN lx_baj_tbl.FIRST..lx_baj_tbl.LAST
4697         LOOP
4698             l_result_amount := l_result_amount + lx_baj_tbl(l_tbl_cnt).amount;
4699         END LOOP;
4700     END IF;
4701     --Bug# 3925492: pagarg +++ Estd. Prop Tax +++++++ End ++++++++++
4702 
4703 	RETURN NVL (l_result_amount, 0);
4704 EXCEPTION
4705 	WHEN OTHERS THEN
4706 		-- store SQL error message on message stack for caller
4707 		OKL_API.SET_MESSAGE (
4708 			p_app_name	=> OKL_API.G_APP_NAME,
4709 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
4710 			p_token1	=> 'SQLCODE',
4711 			p_token1_value	=> SQLCODE,
4712 			p_token2	=> 'SQLERRM',
4713 			p_token2_value	=> SQLERRM);
4714 
4715 		RETURN NULL;
4716 END line_estimated_property_tax;
4717 
4718 ------------------------------------------------------------------------------
4719   -- Start of Comments
4720   -- Created By:    [email protected] - 20-FEB-2002
4721   -- Function Name: contract_remaining_sec_dep
4722   -- Description:   If security deposit disposition is allowed to be included
4723   --                into a quote, return original security deposit amount
4724   --                minus any credit memos against security deposit invoices
4725   -- Dependencies:  OKL building blocks AMTX and AMUV,
4726   -- Parameters:    IN:  p_contract_id
4727   --                OUT: amount
4728   -- Version:       1.0
4729   -- End of Commnets
4730 ------------------------------------------------------------------------------
4731 
4732 FUNCTION contract_remaining_sec_dep (
4733 	p_contract_id		IN NUMBER,
4734 	p_contract_line_id	IN NUMBER)
4735 	RETURN NUMBER IS
4736 
4737 	l_sdd_tbl		okl_am_invoices_pvt.sdd_tbl_type;
4738 	l_tld_tbl		okl_am_invoices_pvt.tld_tbl_type;
4739 	l_total_amount		NUMBER;
4740 
4741 BEGIN
4742 
4743 	okl_am_invoices_pvt.contract_remaining_sec_dep (
4744 		p_contract_id	=> p_contract_id,
4745 		p_contract_line_id => p_contract_line_id,
4746 		x_sdd_tbl	=> l_sdd_tbl,
4747 		x_tld_tbl	=> l_tld_tbl,
4748 		x_total_amount	=> l_total_amount);
4749 
4750 	RETURN NVL (l_total_amount, 0);
4751 
4752 EXCEPTION
4753 
4754 	WHEN OTHERS THEN
4755 
4756 		-- store SQL error message on message stack for caller
4757 
4758 		OKL_API.SET_MESSAGE (
4759 			p_app_name	=> OKL_API.G_APP_NAME,
4760 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
4761 			p_token1	=> 'SQLCODE',
4762 			p_token1_value	=> SQLCODE,
4763 			p_token2	=> 'SQLERRM',
4764 			p_token2_value	=> SQLERRM);
4765 
4766 		RETURN NULL;
4767 
4768 END contract_remaining_sec_dep;
4769 
4770 
4771 ------------------------------------------------------------------------------
4772   -- Start of Comments
4773   -- Created By:    [email protected] - 10-JUL-2002
4774   -- Function Name: line_unbilled_streams
4775   -- Description:   Calculate unbilled streams
4776   -- Dependencies:  OKL building blocks AMTX and AMUV,
4777   -- Parameters:    IN:  p_contract_id, p_contract_line_id,
4778   --                     stream_type_id (stored in g_additional_parameters(1))
4779   --                OUT: amount
4780   -- Version:       1.0
4781   -- History        SECHAWLA 04-MAR-03 : Restrict the calculation of unbilled
4782   --                receivables to only billable streams
4783   -- End of Commnets
4784 ------------------------------------------------------------------------------
4785 
4786 FUNCTION line_unbilled_streams (
4787 	p_contract_id		IN NUMBER,
4788 	p_contract_line_id	IN NUMBER)
4789 	RETURN NUMBER IS
4790 
4791 	-- Get Unbilled Streams
4792 	CURSOR l_unbill_stream_csr (
4793 			cp_contract_id			NUMBER,
4794 			cp_contract_line_id		NUMBER,
4795 			cp_stream_type_id		NUMBER) IS
4796 		SELECT	SUM (NVL (ste.amount, 0))	amount_due
4797 	   	FROM	okl_streams			stm,
4798                 okl_strm_type_b     sty, -- SECHAWLA 04-MAR-03 Added this table to get the billable_yn flag
4799 			    okl_strm_elements		ste
4800 		WHERE	stm.khr_id			= cp_contract_id
4801 		AND	stm.kle_id			= cp_contract_line_id
4802 		AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
4803 		AND	stm.active_yn			= 'Y'
4804 		AND	stm.say_code			= 'CURR'
4805 		AND	ste.stm_id			= stm.id
4806 		AND	ste.date_billed			IS NULL
4807 		AND	NVL (ste.amount, 0)	<> 0
4808   -- SECHAWLA 04-MAR-03 Added the following 3 conditions to restrict the unbilled receivables calculation to only
4809   -- billable streams
4810         AND sty.id              = stm.sty_id
4811         AND sty.billable_yn     = 'Y';
4812        -- AND sty.capitalize_yn   = 'N'
4813 
4814 	l_result_amount		NUMBER		:= 0;
4815 	l_stream_type_id	NUMBER;
4816 
4817 BEGIN
4818 
4819 	-- ********************************************
4820 	-- Extract Stream Type Id from global variables
4821 	-- ********************************************
4822 
4823 	IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(1)
4824 	AND okl_execute_formula_pub.g_additional_parameters(1).name = 'STREAM TYPE'
4825 	AND okl_execute_formula_pub.g_additional_parameters(1).value IS NOT NULL
4826 	THEN
4827 		l_stream_type_id := TO_NUMBER
4828 			(okl_execute_formula_pub.g_additional_parameters(1).value);
4829 	ELSE
4830 		l_stream_type_id := NULL;
4831 	END IF;
4832 
4833 	-- ****************
4834 	-- Calculate result
4835 	-- ****************
4836 
4837 	OPEN	l_unbill_stream_csr (p_contract_id, p_contract_line_id, l_stream_type_id);
4838 	FETCH	l_unbill_stream_csr INTO l_result_amount;
4839 	CLOSE	l_unbill_stream_csr;
4840 
4841 	RETURN NVL (l_result_amount, 0);
4842 
4843 EXCEPTION
4844 
4845 	WHEN OTHERS THEN
4846 
4847 		-- Close open cursors
4848 
4849 		IF l_unbill_stream_csr%ISOPEN THEN
4850 			CLOSE l_unbill_stream_csr;
4851 		END IF;
4852 
4853 
4854 		-- store SQL error message on message stack for caller
4855 
4856 		OKL_API.SET_MESSAGE (
4857 			p_app_name	=> OKL_API.G_APP_NAME,
4858 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
4859 			p_token1	=> 'SQLCODE',
4860 			p_token1_value	=> SQLCODE,
4861 			p_token2	=> 'SQLERRM',
4862 			p_token2_value	=> SQLERRM);
4863 
4864 		RETURN NULL;
4865 
4866 END line_unbilled_streams;
4867 
4868 
4869 ------------------------------------------------------------------------------
4870   -- Start of Comments
4871   -- Created By:    [email protected] - 24-APR-2002
4872   -- Function Name: line_unbilled_rent
4873   -- Description:   Returns the unbilled rent amount for a given contract line
4874   -- Dependencies:  OKL building blocks AMTX and AMUV
4875   -- Parameters:    IN:  p_contract_id, p_line_id
4876   --                     stream_type_id (stored in g_additional_parameters(1))
4877   --                OUT: amount
4878   -- Version:       1.0
4879   -- History  : SECHAWLA 05-MAY-04 3578894 : Modified to evaluate reporting streams
4880   --                based upon additional parameters
4881   --              : 31-Dec-2004 PAGARG Bug# 4097591
4882   --              : UDS impact to obtain stream type id
4883   -- End of Commnets
4884 ------------------------------------------------------------------------------
4885 
4886 FUNCTION line_unbilled_rent (
4887 	p_contract_id		IN NUMBER,
4888 	p_contract_line_id	IN NUMBER)
4889 	RETURN NUMBER IS
4890 
4891     --SECHAWLA 05-MAY-04 3578894 : new declarations
4892     -- Get Unbilled Streams (moved from line_unbilled_streams)
4893 	CURSOR  l_unbill_stream_csr (
4894 			cp_contract_id			NUMBER,
4895 			cp_contract_line_id		NUMBER,
4896 			cp_stream_type_id		NUMBER) IS
4897 	SELECT	SUM (NVL (ste.amount, 0))	amount_due
4898 	FROM	okl_streams			stm,
4899             okl_strm_type_b     sty, -- SECHAWLA 04-MAR-03 Added this table to get the billable_yn flag
4900 			okl_strm_elements		ste
4901 	WHERE	stm.khr_id			= cp_contract_id
4902 	AND	stm.kle_id			= cp_contract_line_id
4903 	AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
4904 	AND	stm.active_yn			= 'Y'
4905 	AND	stm.say_code			= 'CURR'
4906 	AND	ste.stm_id			= stm.id
4907 	AND	ste.date_billed			IS NULL
4908 	AND	NVL (ste.amount, 0)	<> 0
4909     -- SECHAWLA 04-MAR-03 Added the following 3 conditions to restrict the unbilled receivables calculation to only
4910     -- billable streams
4911     AND sty.id              = stm.sty_id
4912     AND sty.billable_yn     = 'Y';
4913        -- AND sty.capitalize_yn   = 'N'
4914 
4915     -- Get Unbilled Streams for Reporting product
4916 	CURSOR l_unbill_reporting_stream_csr (
4917 			cp_contract_id			NUMBER,
4918 			cp_contract_line_id		NUMBER,
4919 			cp_stream_type_id		NUMBER,
4920             cp_trx_date             DATE) IS
4921 	SELECT	SUM (NVL (ste.amount, 0))	amount_due
4922 	FROM	okl_streams			stm,
4923                 okl_strm_type_b     sty,
4924 			    okl_strm_elements		ste
4925 	WHERE	stm.khr_id			= cp_contract_id
4926 	AND	stm.kle_id			= cp_contract_line_id
4927 	AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
4928 	AND	stm.active_yn			= 'N'  -- reporting strems are inactive
4929 	AND	stm.say_code			= 'CURR'  -- reporting streams are current
4930 	AND	ste.stm_id			= stm.id
4931 	AND	ste.date_billed			IS NULL  -- reporting streams never get billed
4932 	AND	NVL (ste.amount, 0)	<> 0
4933     AND sty.id              = stm.sty_id
4934     AND sty.billable_yn     = 'Y' -- reporting streams are billable
4935        -- AND sty.capitalize_yn   = 'N'
4936     AND stm.purpose_code = 'REPORT'
4937     AND ste.STREAM_ELEMENT_DATE > cp_trx_date;
4938 
4939     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
4940     l_trx_date   DATE;
4941 
4942     ---SECHAWLA 05-MAY-04 3578894 : end new declarations
4943 
4944 	l_result_amount		NUMBER		:= 0;
4945 	l_stream_type_id	NUMBER;
4946 	l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
4947 BEGIN
4948     --PAGARG 31-Dec-2004 Bug# 4097591 Start
4949     --UDS impact. Obtain stream type id and pass it to cursor
4950 
4951     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
4952                                              'RENT',
4953                                              l_return_status,
4954                                              l_stream_type_id);
4955 
4956     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
4957     THEN
4958         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4959     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
4960     THEN
4961         RAISE OKL_API.G_EXCEPTION_ERROR;
4962     END IF;
4963     --PAGARG 31-Dec-2004 Bug# 4097591 End
4964 
4965     /*  SECHAWLA 05-MAY-04 3578894
4966 	okl_execute_formula_pub.g_additional_parameters(1).name  := 'STREAM TYPE';
4967 	okl_execute_formula_pub.g_additional_parameters(1).value := l_stream_type_id;
4968 
4969 	l_result_amount	:= line_unbilled_streams (p_contract_id, p_contract_line_id);
4970 
4971 	RETURN NVL (l_result_amount, 0);
4972     */
4973 
4974     --Validate additional parameters availability
4975     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
4976       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
4977 	  LOOP
4978         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
4979            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
4980                 l_rep_prod_streams_yn := okl_execute_formula_pub.g_additional_parameters(I).value;
4981         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
4982            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
4983                 l_trx_date := TO_DATE(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
4984         END IF;
4985       END LOOP;
4986 	ELSE
4987       l_rep_prod_streams_yn := 'N';
4988 
4989 	END IF;
4990 
4991     IF l_rep_prod_streams_yn = 'Y' THEN
4992        IF l_trx_date IS NULL THEN
4993        -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
4994           Okl_Api.Set_Message(p_app_name     => g_app_name,
4995                               p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
4996           RAISE Okl_Api.G_EXCEPTION_ERROR;
4997        END IF;
4998     END IF;
4999 
5000 
5001 	-- ****************
5002 	-- Calculate result
5003 	-- ****************
5004 
5005     IF l_rep_prod_streams_yn = 'Y' THEN
5006        OPEN  l_unbill_reporting_stream_csr(p_contract_id, p_contract_line_id, l_stream_type_id,l_trx_date );
5007        FETCH l_unbill_reporting_stream_csr INTO  l_result_amount;
5008        CLOSE l_unbill_reporting_stream_csr;
5009     ELSE
5010 
5011 	   OPEN  l_unbill_stream_csr (p_contract_id, p_contract_line_id, l_stream_type_id);
5012 	   FETCH l_unbill_stream_csr INTO l_result_amount;
5013 	   CLOSE l_unbill_stream_csr;
5014     END IF;
5015 
5016 	RETURN NVL (l_result_amount, 0);
5017 
5018 
5019 EXCEPTION
5020     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
5021         -- Close open cursors
5022         IF l_unbill_stream_csr%ISOPEN THEN
5023             CLOSE l_unbill_stream_csr;
5024         END IF;
5025 
5026         IF l_unbill_reporting_stream_csr%ISOPEN THEN
5027             CLOSE l_unbill_reporting_stream_csr;
5028         END IF;
5029 
5030         RETURN NULL;
5031 
5032 	WHEN OTHERS THEN
5033 		-- Close open cursors
5034         IF l_unbill_stream_csr%ISOPEN THEN
5035             CLOSE l_unbill_stream_csr;
5036         END IF;
5037 
5038         IF l_unbill_reporting_stream_csr%ISOPEN THEN
5039             CLOSE l_unbill_reporting_stream_csr;
5040         END IF;
5041 		-- store SQL error message on message stack for caller
5042 		OKL_API.SET_MESSAGE (
5043 			p_app_name	=> OKL_API.G_APP_NAME,
5044 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
5045 			p_token1	=> 'SQLCODE',
5046 			p_token1_value	=> SQLCODE,
5047 			p_token2	=> 'SQLERRM',
5048 			p_token2_value	=> SQLERRM);
5049 
5050 		RETURN NULL;
5051 
5052 END line_unbilled_rent;
5053 
5054 
5055 -- Start of comments
5056 --
5057 -- Procedure Name  : get_reporting_product
5058 -- Description     : This procedure checks if there is a reporting product attached to the contract and returns
5059 --                   the deal type of the reporting product and MG reporting book
5060 -- Business Rules  :
5061 -- Parameters      :  p_contract_id - Contract ID
5062 -- Version         : 1.0
5063 -- History         : sechawla 12-Dec-07  - 6671849 Created
5064 -- End of comments
5065 
5066 PROCEDURE get_reporting_product(p_api_version           IN  	NUMBER,
5067            		 	              p_init_msg_list         IN  	VARCHAR2,
5068            			              x_return_status         OUT 	NOCOPY VARCHAR2,
5069            			              x_msg_count             OUT 	NOCOPY NUMBER,
5070            			              x_msg_data              OUT 	NOCOPY VARCHAR2,
5071                                   p_contract_id 		  IN 	NUMBER,
5072                                   x_rep_product_id           OUT   NOCOPY VARCHAR2) IS
5073 
5074 
5075   -- Get the financial product of the contract
5076   CURSOR l_get_fin_product(cp_khr_id IN NUMBER) IS
5077   SELECT a.start_date, a.contract_number, b.pdt_id
5078   FROM   okc_k_headers_b a, okl_k_headers b
5079   WHERE  a.id = b.id
5080   AND    a.id = cp_khr_id;
5081 
5082   SUBTYPE pdtv_rec_type IS OKL_SETUPPRODUCTS_PUB.pdtv_rec_type;
5083   SUBTYPE pdt_parameters_rec_type IS OKL_SETUPPRODUCTS_PUB.pdt_parameters_rec_type;
5084 
5085   l_fin_product_id          NUMBER;
5086   l_start_date              DATE;
5087   lp_pdtv_rec               pdtv_rec_type;
5088   lp_empty_pdtv_rec         pdtv_rec_type;
5089   lx_no_data_found          BOOLEAN;
5090   lx_pdt_parameter_rec      pdt_parameters_rec_type ;
5091   l_contract_number         VARCHAR2(120);
5092 
5093   --mg_error                  EXCEPTION;
5094   l_reporting_product       OKL_PRODUCTS_V.NAME%TYPE;
5095   l_reporting_product_id    NUMBER;
5096 
5097 
5098 
5099   BEGIN
5100     -- get the financial product of the contract
5101     OPEN  l_get_fin_product(p_contract_id);
5102     FETCH l_get_fin_product INTO l_start_date, l_contract_number, l_fin_product_id;
5103     CLOSE l_get_fin_product;
5104 
5105     lp_pdtv_rec.id := l_fin_product_id;
5106 
5107     -- check if the fin product has a reporting product
5108     OKL_SETUPPRODUCTS_PUB.Getpdt_parameters( p_api_version                  => p_api_version,
5109   				  			               p_init_msg_list                => OKC_API.G_FALSE,
5110 						                   x_return_status                => x_return_status,
5111 							               x_no_data_found                => lx_no_data_found,
5112 							               x_msg_count                    => x_msg_count,
5113 							               x_msg_data                     => x_msg_data,
5114 							               p_pdtv_rec                     => lp_pdtv_rec,
5115 							               p_product_date                 => l_start_date,
5116 							               p_pdt_parameter_rec            => lx_pdt_parameter_rec);
5117 
5118     IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
5119         -- Error getting financial product parameters for contract CONTRACT_NUMBER.
5120         OKC_API.set_message(  p_app_name      => 'OKL',
5121                            p_msg_name      => 'OKL_AM_FIN_PROD_PARAM_ERR',
5122                            p_token1        =>  'CONTRACT_NUMBER',
5123                            p_token1_value  =>  l_contract_number);
5124 
5125     ELSE
5126 
5127         l_reporting_product := lx_pdt_parameter_rec.reporting_product;
5128         l_reporting_product_id := lx_pdt_parameter_rec.reporting_pdt_id;
5129 
5130         IF l_reporting_product IS NOT NULL AND l_reporting_product <> OKC_API.G_MISS_CHAR THEN
5131             -- Contract has a reporting product
5132             x_rep_product_id :=  l_reporting_product_id;
5133         END IF;
5134     END IF;
5135   EXCEPTION
5136       --WHEN mg_error THEN
5137       --   IF l_get_fin_product%ISOPEN THEN
5138       --      CLOSE l_get_fin_product;
5139       --   END IF;
5140       --   x_return_status := OKL_API.G_RET_STS_ERROR;
5141       WHEN OTHERS THEN
5142          IF l_get_fin_product%ISOPEN THEN
5143             CLOSE l_get_fin_product;
5144          END IF;
5145          OKL_API.set_message(p_app_name      => 'OKC',
5146                          p_msg_name      => g_unexpected_error,
5147                          p_token1        => g_sqlcode_token,
5148                          p_token1_value  => sqlcode,
5149                          p_token2        => g_sqlerrm_token,
5150                          p_token2_value  => sqlerrm);
5151           x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5152 END get_reporting_product;
5153 
5154 
5155 ------------------------------------------------------------------------------
5156   -- Start of Comments
5157   -- Created By:    [email protected] - 24-APR-2002
5158   -- Function Name: line_unearned_income
5159   -- Description:   Returns the unearned income amount for a given contract line
5160   -- Dependencies:  OKL building blocks AMTX and AMUV
5161   -- Parameters:    IN:  p_contract_id, p_line_id
5162   --                     stream_type_id (stored in g_additional_parameters(1))
5163   --                OUT: amount
5164   -- Version:       1.0
5165   --                SECHAWLA 05-MAY-04 3578894 : Modified to accomodate additional parameters for reporting product
5166   --              : 31-Dec-2004 PAGARG Bug# 4097591
5167   --              : UDS impact to obtain stream type id
5168   --                sechawla 05-dec-07 6671849 : Modified the dependent stream type check
5169   -- End of Commnets
5170 ------------------------------------------------------------------------------
5171 FUNCTION line_unearned_income (
5172 	p_contract_id		IN NUMBER,
5173 	p_contract_line_id	IN NUMBER)
5174 	RETURN NUMBER IS
5175 
5176         l_unearned_income       NUMBER  := 0;
5177         --Code changed by rvaduri for bug 3536862
5178         --This code will return the Pre-tax income at line level
5179         -- and will return values only contracts booked using ISG.
5180     --PAGARG 31-Dec-2004 Bug# 4097591
5181     --Instead of using stream name, join the sty id passed to cursor
5182     CURSOR line_csr (c_contract_line_id NUMBER, p_sty_id NUMBER) IS
5183       SELECT NVL(SUM(sel.amount),0)
5184       FROM okl_strm_elements sel,
5185            okl_streams stm,
5186            okl_strm_type_v sty
5187       WHERE sty.id = p_sty_id
5188         AND stm.sty_id = sty.id
5189         AND stm.say_code = 'CURR'
5190         AND stm.active_yn = 'Y'
5191         AND stm.purpose_code IS NULL
5192         AND stm.kle_id = c_contract_line_id
5193         AND sel.stm_id = stm.id;
5194 
5195     --SECHAWLA 05-MAY-04 3578894 : new declarations
5196     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
5197     l_trx_date   DATE;
5198 
5199     -- SECHAWLA 05-MAY-04 3578894 : Created this cursor to evaluat ereporting streams based upon additional parameters
5200     --PAGARG 31-Dec-2004 Bug# 4097591
5201     --Instead of using stream name, join the sty id passed to cursor
5202     CURSOR line_reporting_csr (c_contract_line_id IN NUMBER, cp_trx_date IN DATE, p_sty_id NUMBER) IS
5203       SELECT NVL(SUM(sel.amount),0)
5204       FROM okl_strm_elements sel,
5205            okl_streams stm,
5206            okl_strm_type_v sty
5207       WHERE sty.id = p_sty_id
5208         AND stm.sty_id = sty.id
5209         AND stm.say_code = 'CURR' -- reporting streams are current
5210         AND stm.active_yn = 'N'  -- reporting strems are inactive
5211         AND stm.purpose_code IS NULL
5212         AND	sel.date_billed	IS NULL  -- reporting streams never get billed
5213         --AND sty.billable_yn     = 'N'  -- PRE-TAX streams are not billable
5214         AND stm.kle_id = c_contract_line_id
5215         AND sel.stm_id = stm.id
5216         AND stm.purpose_code = 'REPORT'
5217         AND sel.STREAM_ELEMENT_DATE > cp_trx_date;
5218 
5219 	l_stream_type_id	NUMBER;
5220 	l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
5221 
5222 	-- sechawla 05-dec-07 6057301 - Added
5223 	lx_rep_product_id           OKL_PRODUCTS_V.ID%TYPE;
5224     l_api_version               NUMBER := 1;
5225     l_init_msg_list             VARCHAR2(1) := OKL_API.G_FALSE;
5226     l_msg_count                 NUMBER;
5227     l_msg_data                  VARCHAR2(100);
5228 BEGIN
5229     -- SECHAWLA 05-MAY-04 3578894 : Validate additional parameters availability
5230     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
5231       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
5232 	  LOOP
5233         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
5234            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
5235                 l_rep_prod_streams_yn := okl_execute_formula_pub.g_additional_parameters(I).value;
5236         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
5237            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
5238                 l_trx_date := TO_DATE(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
5239         END IF;
5240       END LOOP;
5241 	ELSE
5242 
5243       l_rep_prod_streams_yn := 'N';
5244 
5245 	END IF;
5246 
5247     -- sechawla 05-dec-07 6671849 : START
5248 	IF l_rep_prod_streams_yn = 'Y' THEN
5249 
5250 	      get_reporting_product(
5251                                   p_api_version           => l_api_version,
5252            		 	              p_init_msg_list         => OKC_API.G_FALSE,
5253            			              x_return_status         => l_return_status,
5254            			              x_msg_count             => l_msg_count,
5255            			              x_msg_data              => l_msg_data,
5256                                   p_contract_id 		  => p_contract_id,
5257                                   x_rep_product_id        => lx_rep_product_id);
5258 
5259 
5260           OKL_STREAMS_UTIL.get_dependent_stream_type(p_khr_id            => p_contract_id,
5261                                                p_product_id            => lx_rep_product_id,
5262                                                p_primary_sty_purpose   => 'RENT',
5263                                                p_dependent_sty_purpose => 'LEASE_INCOME',
5264                                                x_return_status         => l_return_status,
5265                                                x_dependent_sty_id      => l_stream_type_id);
5266      ELSE
5267      -- sechawla 05-dec-07 6671849 : END
5268 
5269         --PAGARG 31-Dec-2004 Bug# 4097591 Start
5270         --UDS impact. Obtain stream type id and pass it to cursor
5271          OKL_STREAMS_UTIL.get_dependent_stream_type(p_khr_id                => p_contract_id,
5272                                                p_primary_sty_purpose   => 'RENT',
5273                                                p_dependent_sty_purpose => 'LEASE_INCOME',
5274                                                x_return_status         => l_return_status,
5275                                                x_dependent_sty_id      => l_stream_type_id);
5276 
5277          IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5278             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5279          ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
5280             RAISE OKL_API.G_EXCEPTION_ERROR;
5281          END IF;
5282          --PAGARG 31-Dec-2004 Bug# 4097591 End
5283 
5284     END IF; -- sechawla 05-dec-07 6671849 : added
5285 
5286     IF l_rep_prod_streams_yn = 'Y' THEN
5287        IF l_trx_date IS NULL THEN
5288        -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
5289           Okl_Api.Set_Message(p_app_name     => g_app_name,
5290                               p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
5291           RAISE Okl_Api.G_EXCEPTION_ERROR;
5292        END IF;
5293     END IF;
5294 
5295     --SECHAWLA 05-MAY-04 3578894 : check if streams required for reporting  product
5296     IF l_rep_prod_streams_yn = 'Y' THEN
5297        --PAGARG 31-Dec-2004 Bug# 4097591, Pass stream type id to cursor
5298        OPEN  line_reporting_csr(p_contract_line_id, l_trx_date, l_stream_type_id);
5299        FETCH line_reporting_csr INTO l_unearned_income;
5300 	   CLOSE line_reporting_csr;
5301     ELSE
5302     -- SECHAWLA 05-MAY-04 3578894 : end new code
5303        --PAGARG 31-Dec-2004 Bug# 4097591, Pass stream type id to cursor
5304 	   OPEN  line_csr(p_contract_line_id, l_stream_type_id);
5305 	   FETCH line_csr INTO l_unearned_income;
5306 	   CLOSE line_csr;
5307     END IF;
5308 
5309         --Code commented by rvaduri.
5310 /*
5311 	OPEN	l_str_type_csr ('UNEARNED INCOME');
5312 	FETCH	l_str_type_csr INTO l_stream_type_id;
5313 	CLOSE	l_str_type_csr;
5314 
5315 	okl_execute_formula_pub.g_additional_parameters(1).name  := 'STREAM TYPE';
5316 	okl_execute_formula_pub.g_additional_parameters(1).value := l_stream_type_id;
5317 
5318 	l_result_amount	:= line_unbilled_streams (p_contract_id, p_contract_line_id);
5319 
5320 	RETURN NVL (l_result_amount, 0);
5321 */
5322         RETURN NVL(l_unearned_income,0);
5323 
5324 EXCEPTION
5325     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
5326         IF line_csr%ISOPEN THEN
5327 			CLOSE line_csr;
5328 		END IF;
5329 
5330         IF line_reporting_csr%ISOPEN THEN
5331             CLOSE line_reporting_csr;
5332         END IF;
5333 
5334         RETURN NULL;
5335 
5336 	WHEN OTHERS THEN
5337 
5338 		-- Close open cursors
5339 
5340 		IF line_csr%ISOPEN THEN
5341 			CLOSE line_csr;
5342 		END IF;
5343 
5344         IF line_reporting_csr%ISOPEN THEN
5345             CLOSE line_reporting_csr;
5346         END IF;
5347 
5348 		-- store SQL error message on message stack for caller
5349 
5350 		OKL_API.SET_MESSAGE (
5351 			p_app_name	=> OKL_API.G_APP_NAME,
5352 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
5353 			p_token1	=> 'SQLCODE',
5354 			p_token1_value	=> SQLCODE,
5355 			p_token2	=> 'SQLERRM',
5356 			p_token2_value	=> SQLERRM);
5357 
5358 		RETURN NULL;
5359 
5360 END line_unearned_income;
5361 
5362 
5363 ------------------------------------------------------------------------------
5364   -- Start of Comments
5365   -- Created By:    [email protected] - 24-APR-2002
5366   -- Function Name: line_calculate_fmv
5367   -- Description:   Returns the fair market value for a given contract line
5368   --                using an hook to an external system.
5369   --                Just a shell for now
5370   -- Dependencies:
5371   -- Parameters:    IN:  p_contract_id, p_line_id
5372   --                OUT: amount
5373   -- Version:       1.0
5374   -- End of Commnets
5375 ------------------------------------------------------------------------------
5376 
5377 FUNCTION line_calculate_fmv (
5378 	p_contract_id		IN NUMBER,
5379 	p_contract_line_id	IN NUMBER)
5380 	RETURN NUMBER IS
5381 BEGIN
5382 	RETURN 0;
5383 END line_calculate_fmv;
5384 
5385 ------------------------------------------------------------------------------
5386   -- Start of Comments
5387   -- Created By:    [email protected] - 24-APR-2002
5388   -- Function Name: line_calculate_residual_value
5389   -- Description:   Returns the residual value for a given contract line
5390   --                using an hook to an external system.
5391   --                Just a shell for now
5392   -- Dependencies:
5393   -- Parameters:    IN:  p_contract_id, p_line_id
5394   --                OUT: amount
5395   -- Version:       1.0
5396   -- End of Commnets
5397 ------------------------------------------------------------------------------
5398 
5399 FUNCTION line_calculate_residual_value (
5400 	p_contract_id		IN NUMBER,
5401 	p_contract_line_id	IN NUMBER)
5402 	RETURN NUMBER IS
5403 BEGIN
5404 	RETURN 0;
5405 END line_calculate_residual_value;
5406 
5407 ---------------------------------------------
5408 -- CS Functions
5409 ---------------------------------------------
5410 
5411 ----------------------------------------------------------------------------------------------------
5412 
5413     -- Start of Comments
5414     -- Created By:       Ranu Srivastava (rsrivast)
5415     -- Function Name  contract_security_deposit
5416     -- Description:   returns the security deposit for given contract
5417     -- Dependencies:
5418     -- Parameters: contract id,contract line id
5419     -- Version: 1.0
5420     -- End of Commnets
5421 
5422 ----------------------------------------------------------------------------------------------------
5423 
5424 FUNCTION contract_security_deposit( p_contract_id           IN  NUMBER
5425                                    ,p_contract_line_id      IN NUMBER) RETURN NUMBER
5426     IS
5427   l_security_deposit NUMBER := 0;
5428 
5429 -- select changed to filter streams based on purpose instead of on type
5430 -- enhancement done for user defined streams impacts, bug 3924303
5431 
5432   CURSOR C (p_contract_id  NUMBER)
5433   IS
5434    SELECT NVL(SUM(sele.amount),0)
5435          FROM okl_strm_elements sele,
5436            okl_streams str,
5437            okl_strm_type_v sty
5438       WHERE sele.stm_id = str.id
5439            AND str.sty_id = sty.id
5440            AND UPPER(sty.stream_type_purpose) = 'SECURITY_DEPOSIT'
5441            AND str.say_code = 'CURR'
5442 	   --multigaap changes
5443            AND STR.ACTIVE_YN = 'Y'
5444            AND STR.PURPOSE_CODE IS NULL
5445 	   --end multigaap changes
5446            AND str.khr_id = p_contract_id;
5447 
5448 BEGIN
5449 
5450   OPEN C (p_contract_id);
5451   FETCH C INTO l_security_deposit;
5452   CLOSE C;
5453 
5454   RETURN l_security_deposit;
5455   EXCEPTION
5456     WHEN OTHERS THEN
5457       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
5458       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
5459                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
5460                           p_token1        => 'OKL_SQLCODE',
5461                           p_token1_value  => SQLCODE,
5462                           p_token2        => 'OKL_SQLERRM',
5463                           p_token2_value  => SQLERRM);
5464       RETURN NULL;
5465 
5466 END;
5467 
5468 ----------------------------------------------------------------------------------------------------
5469 
5470     -- Start of Comments
5471     -- Created By:       Ranu Srivastava (rsrivast)
5472     -- Function Name  contract_residual_amount
5473     -- Description:   returns the residual value for given contract
5474     -- Dependencies:
5475     -- Parameters: contract id,contract line id
5476     -- Version: 1.0
5477     -- 20-Dec-02 rsrivast Added new cursor line to calculate contract residual amount for line
5478     -- 27-Oct-04 PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
5479     -- End of Commnets
5480 ----------------------------------------------------------------------------------------------------
5481 
5482 FUNCTION contract_residual_amount( p_contract_id           IN  NUMBER
5483                                  ,p_contract_line_id      IN NUMBER) RETURN NUMBER
5484     IS
5485   l_residual_value NUMBER := 0;
5486 
5487   CURSOR C (p_contract_id  NUMBER)
5488 
5489   IS
5490            SELECT NVL(SUM(RESIDUAL_VALUE),0)
5491            FROM  okl_k_lines_full_v
5492            WHERE dnz_chr_id= p_contract_id
5493            AND sts_code <> 'TERMINATED';
5494 
5495  --Commented this code by rvaduri for bug 3487920
5496   /*
5497  SELECT NVL(SUM(cs.amount),0)
5498  FROM okl_streams_v asv,okl_strm_type_v bs,
5499  okl_strm_elements_v cs,
5500  okl_streams str,
5501  okl_strm_type_v sty
5502  WHERE cs.stm_id = asv.id AND bs.id = asv.sty_id
5503  AND str.sty_id = sty.id
5504  AND UPPER(sty.name) = 'RESIDUAL VALUE'
5505  AND str.say_code = 'CURR'
5506  --multigaap changes
5507  AND STR.ACTIVE_YN = 'Y'
5508  AND STR.PURPOSE_CODE is NULL --end multigaap changes AND
5509  cs.stream_element_date >= SYSDATE AND
5510  asv.khr_id = p_contract_id; */
5511 
5512     CURSOR line(p_contract_line_id   NUMBER)
5513     IS
5514     SELECT NVL(RESIDUAL_VALUE,0)
5515     FROM okl_k_lines
5516     WHERE id = p_contract_line_id;
5517 
5518 
5519 BEGIN
5520   IF p_contract_line_id IS NOT NULL
5521   AND p_contract_line_id <> OKL_API.G_MISS_NUM THEN -- PAGARG bug#3974997 -- check for G_MISS when checking for NULL
5522     OPEN line (p_contract_line_id);
5523     FETCH line INTO l_residual_value;
5524     CLOSE line;
5525   ELSE
5526     OPEN C (p_contract_id);
5527     FETCH C INTO l_residual_value;
5528     CLOSE C;
5529   END IF;
5530   RETURN l_residual_value;
5531   EXCEPTION
5532     WHEN OTHERS THEN
5533       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
5534       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
5535                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
5536                           p_token1        => 'OKL_SQLCODE',
5537                           p_token1_value  => SQLCODE,
5538                           p_token2        => 'OKL_SQLERRM',
5539                           p_token2_value  => SQLERRM);
5540       RETURN NULL;
5541 
5542 END;
5543 
5544 ----------------------------------------------------------------------------------------------------
5545 
5546     -- Start of Comments
5547     -- Created By:       Ranu Srivastava (rsrivast)
5548     -- Function Name  contract_Rent_amount
5549     -- Description:   returns the rent amount for given contract
5550     -- Dependencies:
5551     -- Parameters: contract id,contract line id
5552     -- Version: 1.0
5553     -- 20-Dec-02 rsrivast Added new cursor line to calculate contract rent amount for line
5554     -- 27-Oct-04 PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
5555     -- 04-dec-08 sechawla : Updated curosr 'line', to query for stream type purpsoe instead of stream type,
5556     --	                        added p_contract_id parameter to cursor 'line'
5557     -- End of Commnets
5558 ----------------------------------------------------------------------------------------------------
5559 
5560 FUNCTION contract_rent_amount( p_contract_id           IN  NUMBER
5561                               ,p_contract_line_id      IN NUMBER) RETURN NUMBER
5562     IS
5563   l_rent_amount NUMBER := 0;
5564 
5565   --Get all the future unbilled receivables for the contract.
5566 
5567  -- select changed to filter streams based on purpose instead of on name
5568  -- enhancement done for user defined streams impacts, bug 3924303
5569 
5570   CURSOR C (p_contract_id  NUMBER)
5571   IS
5572   SELECT NVL(SUM(sele.amount),0)
5573   FROM okl_strm_elements sele,
5574            okl_streams str,
5575            okl_strm_type_v sty
5576       WHERE sele.stm_id = str.id
5577            AND str.sty_id = sty.id
5578            AND UPPER(sty.stream_type_purpose) = 'RENT'
5579            AND str.say_code = 'CURR'
5580            AND STR.ACTIVE_YN = 'Y'
5581            AND STR.PURPOSE_CODE IS NULL
5582            AND SELE.DATE_BILLED IS NULL
5583            AND SELE.STREAM_ELEMENT_DATE > SYSDATE
5584            AND str.khr_id = p_contract_id;
5585 
5586 
5587   --Get all the future unbilled receivables for the line.
5588   CURSOR line (p_contract_id NUMBER, p_contract_line_id NUMBER)  IS --sechawla 04-dec-08 : added p_contract_id
5589   SELECT NVL(SUM(sele.amount),0)
5590   FROM okl_strm_elements sele,
5591            okl_streams str,
5592            okl_strm_type_v sty
5593       WHERE sele.stm_id = str.id
5594            AND str.sty_id = sty.id
5595            --AND UPPER(sty.name) = 'RENT' --sechawla 04-dec-08 : remoevd
5596            AND UPPER(sty.stream_type_purpose) = 'RENT' --sechawla 04-dec-08 : added
5597            AND str.say_code = 'CURR'
5598            AND STR.ACTIVE_YN = 'Y'
5599            AND STR.PURPOSE_CODE IS NULL
5600            AND SELE.DATE_BILLED IS NULL
5601            AND SELE.STREAM_ELEMENT_DATE > SYSDATE
5602            AND str.khr_id = p_contract_id --sechawla 04-dec-08 : added
5603            AND str.kle_id = p_contract_line_id;
5604 BEGIN
5605   IF p_contract_line_id IS NOT NULL
5606   AND p_contract_line_id <> OKL_API.G_MISS_NUM THEN -- PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
5607     OPEN line (p_contract_id, p_contract_line_id); --sechawla 04-dec-08 : added p_contract_id
5608     FETCH line INTO l_rent_amount;
5609     CLOSE line;
5610   ELSE
5611     OPEN C (p_contract_id);
5612     FETCH C INTO l_rent_amount;
5613     CLOSE C;
5614   END IF;
5615   RETURN l_rent_amount;
5616   EXCEPTION
5617     WHEN OTHERS THEN
5618       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
5619       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
5620                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
5621                           p_token1        => 'OKL_SQLCODE',
5622                           p_token1_value  => SQLCODE,
5623                           p_token2        => 'OKL_SQLERRM',
5624                           p_token2_value  => SQLERRM);
5625       RETURN NULL;
5626 
5627 END;
5628 
5629 ----------------------------------------------------------------------------------------------------
5630 
5631     -- Start of Comments
5632     -- Created By:       Ranu Srivastava (rsrivast)
5633     -- Function Name  contract_unearned_income
5634     -- Description:   returns the security deposit for given contract
5635     -- Dependencies:
5636     -- Parameters: contract id,contract line id
5637     -- Version: 1.0
5638     -- 20-Dec-02 rsrivast Added new cursor line to calculate contract unearned income for line
5639     -- 27-Oct-04 PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
5640     -- End of Commnets
5641 ----------------------------------------------------------------------------------------------------
5642 
5643 FUNCTION contract_unearned_income( p_contract_id IN  NUMBER
5644                                   ,p_contract_line_id      IN NUMBER) RETURN NUMBER
5645     IS
5646   l_unearned_income NUMBER := 0;
5647 
5648   -- select changed to filter streams based on purpose 'LEASE_INCOME' instead of on type
5649   -- 'PRE-TAX INCOME', changes done for user defined streams impacts, bug 3924303
5650 
5651   CURSOR C (p_contract_id  NUMBER)
5652   IS
5653   SELECT NVL(SUM(sele.amount),0)
5654   FROM okl_strm_elements sele,
5655            --okl_streams str,  MGAAP 7263041
5656            okl_streams_rep_v str,
5657            okl_strm_type_v sty
5658       WHERE sele.stm_id = str.id
5659            AND str.sty_id = sty.id
5660            AND UPPER(sty.stream_type_purpose) = 'LEASE_INCOME'
5661            AND str.say_code = 'CURR'
5662            AND STR.ACTIVE_YN = 'Y'
5663            AND (STR.PURPOSE_CODE IS NULL OR STR.PURPOSE_CODE='REPORT')
5664            AND (sele.accrued_yn IS NULL OR sele.accrued_yn = 'N')
5665            AND SELE.STREAM_ELEMENT_DATE > SYSDATE
5666            AND str.khr_id = p_contract_id;
5667 
5668   --Commented by rvaduri for bug 3536862
5669 /*
5670    SELECT NVL(SUM(sele.amount),0)
5671          FROM okl_strm_elements sele,
5672            okl_streams str,
5673            okl_strm_type_v sty
5674       WHERE sele.stm_id = str.id
5675            AND str.sty_id = sty.id
5676            AND UPPER(sty.name) = 'UNEARNED INCOME'
5677            AND str.say_code = 'CURR'
5678 	   --multigaap changes
5679            AND STR.ACTIVE_YN = 'Y'
5680            AND STR.PURPOSE_CODE IS NULL
5681 	   --end multigaap changes
5682            AND str.khr_id = p_contract_id;
5683 */
5684 
5685     CURSOR line (p_contract_line_id      NUMBER) IS
5686   SELECT NVL(SUM(sele.amount),0)
5687   FROM okl_strm_elements sele,
5688            --okl_streams str,  MGAAP 7263041
5689            okl_streams_rep_v str,
5690            okl_strm_type_v sty
5691       WHERE sele.stm_id = str.id
5692            AND str.sty_id = sty.id
5693            AND UPPER(sty.name) = 'PRE-TAX INCOME'
5694            AND str.say_code = 'CURR'
5695            AND STR.ACTIVE_YN = 'Y'
5696            AND STR.PURPOSE_CODE IS NULL
5697            AND (sele.accrued_yn IS NULL OR sele.accrued_yn = 'N')
5698            AND SELE.STREAM_ELEMENT_DATE > SYSDATE
5699            AND str.kle_id = p_contract_line_id;
5700   --Commented by rvaduri for bug 3536862
5701 /*
5702  *
5703       SELECT NVL(SUM(sel.amount),0)
5704       FROM okl_strm_elements sel,
5705            okl_streams stm,
5706            okl_strm_type_v sty
5707       WHERE sty.name = 'PRE-TAX INCOME'
5708         AND stm.sty_id = sty.id
5709         AND stm.say_code = 'CURR'
5710         AND stm.active_yn = 'Y'
5711         AND stm.kle_id = p_contract_line_id
5712         AND sel.stm_id = stm.id
5713         AND sel.stream_element_date > SYSDATE;
5714 */
5715 
5716 BEGIN
5717   IF p_contract_line_id IS NOT NULL
5718   AND p_contract_line_id <> OKL_API.G_MISS_NUM THEN -- PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
5719     OPEN line (p_contract_line_id);
5720     FETCH line INTO l_unearned_income;
5721     CLOSE line;
5722   ELSE
5723     OPEN C (p_contract_id);
5724     FETCH C INTO l_unearned_income;
5725     CLOSE C;
5726   END IF;
5727   RETURN l_unearned_income;
5728   EXCEPTION
5729     WHEN OTHERS THEN
5730       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
5731       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
5732                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
5733                           p_token1        => 'OKL_SQLCODE',
5734                           p_token1_value  => SQLCODE,
5735                           p_token2        => 'OKL_SQLERRM',
5736                           p_token2_value  => SQLERRM);
5737       RETURN NULL;
5738 
5739 END;
5740 
5741 ----------------------------------------------------------------------------------------------------
5742 
5743     -- Start of Comments
5744     -- Created By:       Ranu Srivastava (rsrivast)
5745     -- Function Name  contract_depriciation_amount
5746     -- Description:   returns the depriciation amount for given contract
5747     -- Dependencies:
5748     -- Parameters: contract id,contract line id
5749     -- Version: 1.0
5750     -- End of Commnets
5751 
5752 ----------------------------------------------------------------------------------------------------
5753 
5754 FUNCTION contract_depriciation_amount( p_contract_id IN  NUMBER
5755                                       ,p_contract_line_id      IN NUMBER) RETURN NUMBER
5756     IS
5757 /** NOTE: This Function is exactly the same as contract_acc_depreciation,
5758  * since the existing function code was wrong. Changed the code in pls
5759  * instead of changing the formula to use a different operand due to
5760  * operational issues of following up for getting the new operand seeded
5761  * Done for bug 3646679 */
5762 
5763 
5764         l_unearned_income NUMBER := 0;
5765         l_depreciation NUMBER := 0;
5766         l_depn_contract NUMBER := 0;
5767         l_converted_amount NUMBER := 0;
5768         p_return_status VARCHAR2(1);
5769         p_contract_start_date DATE;
5770         p_contract_currency             okl_k_headers_full_v.currency_code%TYPE;
5771         p_currency_conversion_type     okl_k_headers_full_v.currency_conversion_type%TYPE;
5772         p_currency_conversion_rate     okl_k_headers_full_v.currency_conversion_rate%TYPE;
5773         p_currency_conversion_date     okl_k_headers_full_v.currency_conversion_date%TYPE;
5774 
5775    --Cursor to get the parent line id for a contract
5776   CURSOR parent_line_id_csr (p_contract_id  NUMBER)
5777   IS
5778    SELECT line.id parent_line_id
5779     FROM okc_k_lines_b line
5780      ,okc_line_styles_v lse
5781     WHERE line.lse_id=lse.id
5782         AND lse.lty_code= 'FREE_FORM1'
5783         AND line.sts_code <> 'ABANDONED'
5784         AND dnz_chr_id = p_contract_id;
5785 
5786 
5787  -- line asset id and corporate book from FA
5788  CURSOR asset_details_csr(p_contract_line_id  NUMBER)
5789  IS
5790  SELECT CORPORATE_BOOK, ASSET_ID
5791  FROM OKX_ASSET_LINES_V
5792  WHERE OKX_ASSET_LINES_V.PARENT_LINE_ID = p_contract_line_id;
5793 
5794  -- total depreciation for the corporate book from FA
5795  CURSOR deprn_details_csr(p_asset_id  NUMBER, p_corporate_book_code VARCHAR2)
5796  IS
5797  SELECT NVL(SUM(deprn_amount), 0) deprn_amount
5798  FROM   OKX_AST_DPRTNS_V
5799  WHERE  Asset_id = p_asset_id
5800  AND    book_type_code = p_corporate_book_code
5801  AND    status = 'A'
5802  AND    NVL(start_date_active,SYSDATE) <= SYSDATE
5803  AND    NVL(end_date_active,SYSDATE + 1) > SYSDATE;
5804 
5805 
5806  -- contract start date
5807  CURSOR contract_start_date_csr(p_khr_id NUMBER)
5808  IS
5809  SELECT start_date FROM okc_k_headers_b
5810  WHERE id = p_khr_id;
5811 
5812  l_streams_repo_policy VARCHAR2(80); -- MGAAP 7263041
5813 
5814 BEGIN
5815 
5816   l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
5817 
5818   -- calculate asset line level depreciation
5819   IF(p_contract_line_id IS NOT NULL) THEN
5820    FOR p_asset_details_csr IN asset_details_csr(p_contract_line_id)
5821    LOOP
5822         FOR p_deprn_details_csr IN deprn_details_csr(p_asset_details_csr.ASSET_ID,
5823                                                 p_asset_details_csr.CORPORATE_BOOK)
5824         LOOP
5825                 l_depreciation := p_deprn_details_csr.deprn_amount;
5826         END LOOP;
5827 
5828    END LOOP;
5829 
5830 
5831    -- convert amount into contract currency
5832    OPEN contract_start_date_csr(p_contract_id);
5833    FETCH contract_start_date_csr INTO p_contract_start_date;
5834    CLOSE contract_start_date_csr;
5835 
5836    okl_accounting_util.convert_to_contract_currency(
5837                                 p_khr_id  => p_contract_id,
5838                                 p_from_currency  => NULL,
5839                                 p_transaction_date => p_contract_start_date,
5840                                 p_amount => l_depreciation,
5841                                 x_return_status => p_return_status,
5842                                 x_contract_currency => p_contract_currency,
5843                                 x_currency_conversion_type => p_currency_conversion_type,
5844                                 x_currency_conversion_rate => p_currency_conversion_rate,
5845                                 x_currency_conversion_date => p_currency_conversion_date,
5846                                 x_converted_amount => l_converted_amount);
5847 
5848    IF(p_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
5849            Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
5850                                p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
5851            RAISE Okl_Api.G_EXCEPTION_ERROR;
5852    END IF;
5853 
5854    RETURN l_converted_amount;
5855 
5856   ELSE
5857   FOR p_parent_line_id_csr  IN parent_line_id_csr(p_contract_id) LOOP
5858      --Get the Parent_line_id based on the contract id
5859    FOR p_asset_details_csr IN asset_details_csr(p_parent_line_id_csr.parent_line_id)
5860    LOOP
5861         FOR p_deprn_details_csr IN deprn_details_csr(p_asset_details_csr.ASSET_ID,
5862                                                         p_asset_details_csr.CORPORATE_BOOK)
5863         LOOP
5864                 --Depreciation Amount from FA
5865                 l_depreciation := p_deprn_details_csr.deprn_amount;
5866         END LOOP;
5867    END LOOP;
5868    l_depn_contract := l_depn_contract + l_depreciation;
5869   END LOOP;
5870    -- convert amount into contract currency
5871    OPEN contract_start_date_csr(p_contract_id);
5872    FETCH contract_start_date_csr INTO p_contract_start_date;
5873    CLOSE contract_start_date_csr;
5874 
5875    okl_accounting_util.convert_to_contract_currency(
5876                                 p_khr_id  => p_contract_id,
5877                                 p_from_currency  => NULL,
5878                                 p_transaction_date => p_contract_start_date,
5879                                 p_amount => l_depn_contract,
5880                                 x_return_status => p_return_status,
5881                                 x_contract_currency => p_contract_currency,
5882                                 x_currency_conversion_type => p_currency_conversion_type,
5883                                 x_currency_conversion_rate => p_currency_conversion_rate,
5884                                 x_currency_conversion_date => p_currency_conversion_date,
5885                                 x_converted_amount => l_converted_amount);
5886 
5887    IF(p_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
5888            Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
5889                                p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
5890            RAISE Okl_Api.G_EXCEPTION_ERROR;
5891    END IF;
5892    RETURN l_converted_amount;
5893 
5894   END IF;
5895 
5896   EXCEPTION
5897     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
5898         RETURN 0;
5899 
5900     WHEN OTHERS THEN
5901       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
5902                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
5903                           p_token1        => 'OKL_SQLCODE',
5904                           p_token1_value  => SQLCODE,
5905                           p_token2        => 'OKL_SQLERRM',
5906                           p_token2_value  => SQLERRM);
5907       RETURN 0;
5908 
5909 END contract_depriciation_amount;
5910 
5911 ----------------------------------------------------------------------------------------------------
5912 
5913     -- Start of Comments
5914     -- Created By:       Ranu Srivastava (rsrivast)
5915     -- Function Name  contract_principal_amount
5916     -- Description:   returns the Principal amount for given contract
5917     -- Dependencies:
5918     -- Parameters: contract id,contract line id
5919     -- Version: 1.0
5920     -- End of Commnets
5921 
5922 ----------------------------------------------------------------------------------------------------
5923 
5924 FUNCTION contract_principal_amount( p_contract_id           IN  NUMBER
5925 
5926                                  ,p_contract_line_id      IN NUMBER) RETURN NUMBER
5927     IS
5928   l_amount NUMBER := 0;
5929 
5930 /*
5931   CURSOR c (p_contract_id  NUMBER)
5932   IS
5933    SELECT NVL(cs.amount,0)
5934    FROM okl_streams_v asv,okl_strm_type_v bs,
5935         okl_strm_elements_v cs,
5936         okl_streams str,
5937         okl_strm_type_v sty,
5938 	okc_k_headers_v okh
5939    WHERE cs.stm_id = asv.id AND bs.id = asv.sty_id
5940      AND str.sty_id = sty.id
5941      AND UPPER(sty.name) = 'PRINCIPAL BALANCE'
5942      AND str.say_code = 'CURR'
5943    --multigaap changes
5944      AND STR.ACTIVE_YN = 'Y'
5945      AND STR.PURPOSE_CODE is NULL
5946    --end multigaap changes
5947      AND cs.stream_element_date >= SYSDATE
5948 	 AND  cs.stream_element_date BETWEEN okh.start_date AND okh.end_date
5949 	 AND asv.khr_id = okh.id
5950 	 AND asv.khr_id =  p_contract_id;
5951 */
5952 -- query changed to filter streams based on purpose instead of on type
5953 -- changes done for user defined streams impacts, bug 3924303
5954 
5955   CURSOR C (p_contract_id  NUMBER)
5956   IS
5957     --It should be sum because we have to get the Principal balance on
5958     -- all the assets for the contract
5959       SELECT NVL(SUM(sel.amount),0)
5960       FROM okl_strm_elements sel,
5961            okl_streams stm,
5962            okl_strm_type_v sty
5963       WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
5964         AND stm.sty_id = sty.id
5965         AND stm.say_code = 'CURR'
5966         AND stm.active_yn = 'Y'
5967         AND stm.purpose_code IS NULL
5968         AND stm.khr_id = p_contract_id
5969         AND sel.stm_id = stm.id
5970         AND sel.stream_element_date =
5971                    ( SELECT NVL(MAX(sel.stream_element_date), SYSDATE)
5972                      FROM okl_strm_elements sel,okl_streams stm,
5973                           okl_strm_type_v sty
5974                      WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
5975                        AND stm.sty_id = sty.id
5976                        AND stm.say_code = 'CURR'
5977                        AND stm.active_yn = 'Y'
5978                        AND stm.purpose_code IS NULL
5979                        AND stm.khr_id = p_contract_id
5980                        AND sel.stm_id = stm.id
5981                        AND sel.stream_element_date <= SYSDATE);
5982 BEGIN
5983 
5984   OPEN C (p_contract_id);
5985   FETCH C INTO l_amount;
5986   CLOSE C;
5987 
5988   RETURN l_amount;
5989   EXCEPTION
5990     WHEN OTHERS THEN
5991       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
5992       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
5993                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
5994                           p_token1        => 'OKL_SQLCODE',
5995                           p_token1_value  => SQLCODE,
5996                           p_token2        => 'OKL_SQLERRM',
5997                           p_token2_value  => SQLERRM);
5998       RETURN NULL;
5999 
6000 END;
6001 
6002 --rkraya added
6003 ----------------------------------------------------------------------------------------------------
6004 
6005     -- Start of Comments
6006     -- Created By:       Reeshma Kuttiyat (rkuttiya/rkraya)
6007     -- Function Name:   Unpaid Invoices
6008     -- Description:     Function returns the sum of unpaid invoices for the asset line
6009     -- Dependencies:
6010     -- Parameters: contract id,contract line id
6011     -- Version: 1.0
6012     -- End of Commnets
6013 
6014 ----------------------------------------------------------------------------------------------------
6015 
6016 FUNCTION unpaid_invoices( p_contract_id           IN  NUMBER
6017                          ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6018     IS
6019   l_unpaid_inv   NUMBER := 0;
6020   CURSOR c_unpaid_inv(p_contract_line_id IN NUMBER) IS
6021   SELECT SUM(APS.AMOUNT_DUE_REMAINING)
6022   FROM
6023   AR_PAYMENT_SCHEDULES_ALL APS,
6024 /*
6025   16-Aug-2007, ankushar Bug# 5499193
6026   start changes, modified the cursor to replace reference to okl_cnsld_ar_strms_b
6027  */
6028   okl_bpd_tld_ar_lines_v LSM,
6029 --  OKC_K_HEADERS_B CHR, commenting unused table, ankushar Bug# 5499193
6030 /* 16-Aug-2007 ankushar end changes */
6031   OKC_K_LINES_B CLE,
6032   OKC_LINE_STYLES_B LSE
6033   WHERE
6034   LSM.KLE_ID = p_contract_line_id
6035   AND LSM.CUSTOMER_TRX_ID = APS.CUSTOMER_TRX_ID
6036   AND APS.STATUS = 'OP'
6037   AND APS.CLASS IN ('INV')
6038   AND LSM.KLE_ID = CLE.CLE_ID
6039   AND CLE.LSE_ID = LSE.ID
6040   AND LSE.LTY_CODE = 'FIXED_ASSET';
6041 
6042 BEGIN
6043 
6044   OPEN c_unpaid_inv (p_contract_line_id);
6045   FETCH c_unpaid_inv INTO l_unpaid_inv;
6046   CLOSE c_unpaid_inv;
6047 
6048   RETURN l_unpaid_inv;
6049   EXCEPTION
6050     WHEN OTHERS THEN
6051       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6052       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6053                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6054                           p_token1        => 'OKL_SQLCODE',
6055                           p_token1_value  => SQLCODE,
6056                           p_token2        => 'OKL_SQLERRM',
6057                           p_token2_value  => SQLERRM);
6058       RETURN NULL;
6059 
6060 END;
6061 
6062 ----------------------------------------------------------------------------------------------------
6063 
6064     -- Start of Comments
6065     -- Created By:       Reeshma Kuttiyat (rkuttiya/rkraya)
6066     -- Function Name:   Unapplied Credit Memos
6067     -- Description:     Function returns the sum of unapplied credit memos for the asset line
6068     -- Dependencies:
6069     -- Parameters: contract id,contract line id
6070     -- Version: 1.0
6071     -- End of Commnets
6072 
6073 ----------------------------------------------------------------------------------------------------
6074 
6075  FUNCTION unapplied_credit_memos( p_contract_id           IN  NUMBER
6076                                 ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6077   IS
6078 
6079   l_unapplied_credit  NUMBER :=0;
6080   CURSOR c_unapplied_credit(p_contract_line_id IN NUMBER) IS
6081   SELECT SUM(APS.AMOUNT_DUE_REMAINING)
6082   FROM
6083   AR_PAYMENT_SCHEDULES_ALL APS,
6084 /*
6085   16-Aug-2007, ankushar Bug# 5499193
6086   start changes, modified the cursor to replace reference to okl_cnsld_ar_strms_b
6087  */
6088   okl_bpd_tld_ar_lines_v LSM,
6089 --  OKC_K_HEADERS_B CHR, commenting unused table, ankushar Bug# 5499193
6090 /* 16-Aug-2007 ankushar end changes */
6091   OKC_K_LINES_B CLE,
6092   OKC_LINE_STYLES_B LSE
6093   WHERE
6094   LSM.KLE_ID = p_contract_line_id
6095   AND LSM.CUSTOMER_TRX_ID = APS.CUSTOMER_TRX_ID
6096   AND APS.STATUS = 'OP'
6097   AND APS.CLASS IN ('CM')
6098   AND LSM.KLE_ID = CLE.CLE_ID
6099   AND CLE.LSE_ID = LSE.ID
6100   AND LSE.LTY_CODE = 'FIXED_ASSET';
6101 
6102 BEGIN
6103 
6104   OPEN c_unapplied_credit(p_contract_line_id);
6105   FETCH c_unapplied_credit INTO l_unapplied_credit;
6106   CLOSE c_unapplied_credit;
6107 
6108   l_unapplied_credit := 0 - l_unapplied_credit;
6109 
6110   RETURN l_unapplied_credit;
6111   EXCEPTION
6112     WHEN OTHERS THEN
6113       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6114       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6115                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6116                           p_token1        => 'OKL_SQLCODE',
6117                           p_token1_value  => SQLCODE,
6118                           p_token2        => 'OKL_SQLERRM',
6119                           p_token2_value  => SQLERRM);
6120       RETURN NULL;
6121 
6122 END;
6123 
6124 
6125 ----------------------------------------------------------------------------------------------------
6126 
6127     -- Start of Comments
6128     -- Created By:       Ravikumar Vaduri
6129     -- Function Name  contract_prin_balance
6130     -- Description:   returns the Principal balance for given contract
6131     -- Dependencies:
6132     -- Parameters: contract id,contract line id
6133     --  the parameter Contract line id is not used for anything.
6134     -- Version: 1.0
6135     -- 20-Dec-02 rsrivast Added new cursor line to calculate contract principal balance for line
6136     -- 01-Dec-04 rmunjulu Modified to get quote id and from that the quote eff from date and use that
6137     -- End of Commnets
6138 
6139 ----------------------------------------------------------------------------------------------------
6140 FUNCTION contract_prin_balance( p_contract_id           IN  NUMBER
6141                                  ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6142 
6143 IS
6144 -- select changed to filter streams based on purpose instead of on type
6145 -- enhancement done for user defined streams impacts, bug 3924303
6146 
6147   CURSOR C (p_contract_id  NUMBER, p_date DATE) -- rmunjulu EDAT
6148   IS
6149     --It should be sum because we have to get the Principal balance on
6150     -- all the assets for the contract
6151       SELECT NVL(SUM(sel.amount),0)
6152       FROM okl_strm_elements sel,
6153            okl_streams stm,
6154            okl_strm_type_v sty
6155       WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6156         AND stm.sty_id = sty.id
6157         AND stm.say_code = 'CURR'
6158         AND stm.active_yn = 'Y'
6159         AND stm.purpose_code IS NULL
6160         AND stm.khr_id = p_contract_id
6161         AND sel.stm_id = stm.id
6162         AND sel.stream_element_date =
6163                    ( SELECT NVL(MAX(sel.stream_element_date), SYSDATE)
6164                      FROM okl_strm_elements sel,okl_streams stm,
6165                           okl_strm_type_v sty
6166                      WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6167                        AND stm.sty_id = sty.id
6168                        AND stm.say_code = 'CURR'
6169                        AND stm.active_yn = 'Y'
6170                        AND stm.purpose_code IS NULL
6171                        AND stm.khr_id = p_contract_id
6172                        AND sel.stm_id = stm.id
6173                        AND sel.stream_element_date <= p_date); -- rmunjulu EDAT
6174 
6175 -- select changed to filter streams based on purpose instead of on type
6176 -- enhancement done for user defined streams impacts, bug 3924303
6177 
6178      CURSOR line (p_contract_line_id NUMBER, p_date DATE) IS
6179       SELECT NVL(sel.amount,0)
6180       FROM okl_strm_elements sel,
6181            okl_streams stm,
6182            okl_strm_type_v sty
6183       WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6184         AND stm.sty_id = sty.id
6185         AND stm.say_code = 'CURR'
6186         AND stm.active_yn = 'Y'
6187         AND stm.purpose_code IS NULL
6188         AND stm.kle_id = p_contract_line_id
6189         AND sel.stm_id = stm.id
6190         AND sel.stream_element_date =
6191                    ( SELECT NVL(MAX(sel.stream_element_date), SYSDATE)
6192                      FROM okl_strm_elements sel,okl_streams stm,
6193                           okl_strm_type_v sty
6194                      WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6195                        AND stm.sty_id = sty.id
6196                        AND stm.say_code = 'CURR'
6197                        AND stm.active_yn = 'Y'
6198                        AND stm.kle_id = p_contract_line_id
6199                        AND stm.purpose_code IS NULL
6200                        AND sel.stm_id = stm.id
6201                        AND sel.stream_element_date <= p_date); -- rmunjulu EDAT
6202 
6203     l_principal_balance NUMBER;
6204 
6205         -- rmunjulu EDAT
6206         CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
6207         SELECT trunc(qte.date_effective_from) date_effective_from
6208         FROM   okl_trx_quotes_b  qte
6209         WHERE  qte.id = p_quote_id;
6210 
6211 		-- rmunjulu EDAT
6212         l_quote_id NUMBER;
6213         l_quote_date DATE;
6214         l_sysdate DATE;
6215 
6216 BEGIN
6217 
6218   -- rmunjulu EDAT  Get additional parameter if found
6219   IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
6220       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
6221 	  LOOP
6222         -- rmunjulu EDAT -- get quote id
6223         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_id' THEN
6224           l_quote_id := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
6225         END IF;
6226       END LOOP;
6227   END IF;
6228 
6229   -- rmunjulu EDAT
6230   SELECT SYSDATE INTO l_sysdate FROM dual;
6231 
6232   -- rmunjulu EDAT  -- get eff date for quote
6233   IF  l_quote_id IS NOT NULL
6234   AND l_quote_id <> OKL_API.G_MISS_NUM THEN
6235 
6236 	   FOR get_quote_date_rec IN get_quote_date_csr (l_quote_id) LOOP
6237 	      l_quote_date := get_quote_date_rec.date_effective_from;
6238 	   END LOOP;
6239 
6240   END IF;
6241 
6242   -- rmunjulu EDAT Default the l_quote_date to sysdate if quote id not found
6243   IF l_quote_date IS NULL
6244   OR l_quote_date = OKL_API.G_MISS_DATE THEN
6245        l_quote_date := l_sysdate;
6246   END IF;
6247 
6248   IF p_contract_line_id IS NOT NULL THEN
6249     OPEN line (p_contract_line_id, l_quote_date); -- rmunjulu EDAT
6250     FETCH line INTO l_principal_balance;
6251     CLOSE line;
6252   ELSE
6253 
6254     OPEN C(p_contract_id, l_quote_date); -- rmunjulu EDAT
6255     FETCH C INTO l_principal_balance;
6256     CLOSE C;
6257 
6258   END IF;
6259 
6260   RETURN l_principal_balance;
6261 END contract_prin_balance;
6262 
6263 ----------------------------------------------------------------------------------------------------
6264 
6265     -- Start of Comments
6266     -- Created By:       Sridhar Moduga
6267     -- Function Name  get_asset_subsidy_amount
6268     -- Description:   returns the asset subsidy amount for given contract
6269     -- Dependencies:
6270     -- Parameters: contract id,accounting method
6271     --
6272     -- Version: 1.0
6273     --
6274     -- End of Comments
6275 
6276 ----------------------------------------------------------------------------------------------------
6277 FUNCTION get_asset_subsidy_amount(
6278     p_contract_id                 IN  NUMBER,
6279     p_accounting_method           IN  VARCHAR2)
6280 RETURN NUMBER IS
6281 
6282     lx_return_status        VARCHAR2(1)  DEFAULT OKL_API.G_RET_STS_SUCCESS;
6283     l_api_name             CONSTANT     VARCHAR2(30) := 'GET_ASSET_SUBSIDY';
6284     l_api_version          CONSTANT     NUMBER := 1.0;
6285     l_init_msg_list                     VARCHAR2(1) := OKL_API.G_FALSE;
6286     lx_msg_count                        NUMBER := OKL_API.G_MISS_NUM;
6287     lx_msg_data                         VARCHAR2(2000);
6288 
6289     x_subsidy_amount       NUMBER;
6290 
6291     l_asset_subsidy_amount NUMBER;
6292 
6293     --cursor to fetch all the subsidies attached to financial asset
6294     --smoduga modified to set 0 when sub_kle.amount is null
6295     -- passing accounting method as input parameter
6296     CURSOR l_sub_csr(c_contract_id IN NUMBER,c_accounting_method IN  VARCHAR2) IS
6297     SELECT NVL(SUM(NVL(sub_kle.subsidy_override_amount, sub_kle.amount)),0)
6298     FROM   okl_subsidies_b    subb,
6299            okl_k_lines        sub_kle,
6300            okc_k_lines_b      sub_cle,
6301            okc_line_styles_b  sub_lse
6302     WHERE  subb.id                     = sub_kle.subsidy_id
6303     AND    subb.accounting_method_code = NVL(UPPER(c_accounting_method),subb.accounting_method_code)
6304     AND    sub_kle.id                  = sub_cle.id
6305     AND    sub_cle.lse_id              = sub_lse.id
6306     AND    sub_lse.lty_code            = 'SUBSIDY'
6307     AND    sub_cle.sts_code            <> 'ABANDONED'
6308     AND    sub_cle.dnz_chr_id          = c_contract_id
6309     AND    subb.customer_visible_yn    = 'Y'
6310     ;
6311 
6312 -- START: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6313     l_accounting_method okl_subsidies_b.accounting_method_code%TYPE;
6314 -- END: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6315     l_subsidy_cle_id NUMBER;
6316 BEGIN
6317 
6318 	l_asset_subsidy_amount := 0;
6319 -- START: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6320     IF(p_accounting_method = OKL_API.G_MISS_NUM OR p_accounting_method = OKL_API.G_MISS_CHAR) THEN
6321         l_accounting_method := NULL;
6322     END IF;
6323 -- END: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6324     --------------------------------------------------------------
6325     --get all the subsidies associated to asset and get amount
6326     --------------------------------------------------------------
6327     --smoduga added accountingmethod as in parameter
6328 --    OPEN l_sub_csr(p_contract_id , p_accounting_method);
6329 -- START: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6330     OPEN l_sub_csr(p_contract_id , l_accounting_method);
6331 -- END: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6332     LOOP
6333         FETCH l_sub_csr INTO l_asset_subsidy_amount;
6334         EXIT WHEN l_sub_csr%NOTFOUND;
6335     END LOOP;
6336     CLOSE l_sub_csr;
6337 
6338     x_subsidy_amount := l_asset_subsidy_amount;
6339 
6340     RETURN x_subsidy_amount;
6341 
6342     EXCEPTION
6343     WHEN OKL_API.G_EXCEPTION_ERROR THEN
6344     lx_return_status := OKL_API.HANDLE_EXCEPTIONS(
6345                                l_api_name,
6346                                G_PKG_NAME,
6347                                'OKL_API.G_RET_STS_ERROR',
6348                                lx_msg_count,
6349                                lx_msg_data,
6350                                '_PVT');
6351     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
6352     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
6353                               l_api_name,
6354                               G_PKG_NAME,
6355                               'OKL_API.G_RET_STS_UNEXP_ERROR',
6356                               lx_msg_count,
6357                               lx_msg_data,
6358                               '_PVT');
6359     WHEN OTHERS THEN
6360     IF l_sub_csr%ISOPEN THEN
6361         CLOSE l_sub_csr;
6362     END IF;
6363     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
6364                               l_api_name,
6365                               G_PKG_NAME,
6366                               'OTHERS',
6367                               lx_msg_count,
6368                               lx_msg_data,
6369                               '_PVT');
6370 
6371 END get_asset_subsidy_amount;
6372 
6373 
6374 ----------------------------------------------------------------------------------------------------
6375 
6376     -- Start of Comments
6377     -- Created By:       Ravikumar Vaduri
6378     -- Function Name  contract_acc_depreciation
6379     -- Description:   returns the acc depreciation for a contract from FA
6380     --                this function is used in calculation of NET INVESTMENT for
6381     --                  OP LEASE
6382     -- Dependencies:
6383     -- Parameters: contract id,contract line id
6384     -- Version: 1.0
6385     -- 17-MAR-04 rvaduri  Created the Function
6386     -- End of Commnets
6387 
6388 ----------------------------------------------------------------------------------------------------
6389 
6390 FUNCTION contract_acc_depreciation( p_contract_id IN  NUMBER
6391                                     ,p_contract_line_id      IN NUMBER)
6392          RETURN NUMBER IS
6393 
6394         l_unearned_income NUMBER := 0;
6395         l_depreciation NUMBER := 0;
6396         l_depn_contract NUMBER := 0;
6397         l_converted_amount NUMBER := 0;
6398         p_return_status VARCHAR2(1);
6399         p_contract_start_date DATE;
6400         p_contract_currency             okl_k_headers_full_v.currency_code%TYPE;
6401         p_currency_conversion_type okl_k_headers_full_v.currency_conversion_type%TYPE;
6402         p_currency_conversion_rate okl_k_headers_full_v.currency_conversion_rate%TYPE;
6403         p_currency_conversion_date okl_k_headers_full_v.currency_conversion_date%TYPE;
6404 
6405    --Cursor to get the parent line id for a contract
6406   CURSOR parent_line_id_csr (p_contract_id  NUMBER)
6407   IS
6408    SELECT line.id parent_line_id
6409     FROM okc_k_lines_b line
6410      ,okc_line_styles_v lse
6411     WHERE line.lse_id=lse.id
6412         AND lse.lty_code= 'FREE_FORM1'
6413         AND line.sts_code <> 'ABANDONED'
6414         AND dnz_chr_id = p_contract_id;
6415 
6416 
6417  -- line asset id and corporate book from FA
6418  CURSOR asset_details_csr(p_contract_line_id  NUMBER)
6419  IS
6420  SELECT CORPORATE_BOOK, ASSET_ID
6421  FROM OKX_ASSET_LINES_V
6422  WHERE OKX_ASSET_LINES_V.PARENT_LINE_ID = p_contract_line_id;
6423 
6424  -- total depreciation for the corporate book from FA
6425  CURSOR deprn_details_csr(p_asset_id  NUMBER, p_corporate_book_code VARCHAR2)
6426  IS
6427  SELECT NVL(SUM(deprn_amount), 0) deprn_amount
6428  FROM   OKX_AST_DPRTNS_V
6429  WHERE  Asset_id = p_asset_id
6430  AND    book_type_code = p_corporate_book_code
6431  AND    status = 'A'
6432  AND    NVL(start_date_active,SYSDATE) <= SYSDATE
6433  AND    NVL(end_date_active,SYSDATE + 1) > SYSDATE;
6434 
6435 
6436  -- contract start date
6437  CURSOR contract_start_date_csr(p_khr_id NUMBER)
6438  IS
6439  SELECT start_date FROM okc_k_headers_b
6440  WHERE id = p_khr_id;
6441 
6442  l_streams_repo_policy VARCHAR2(80); -- MGAAP 7263041
6443 BEGIN
6444 
6445   l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
6446   -- calculate asset line level depreciation
6447   IF(p_contract_line_id IS NOT NULL) THEN
6448    FOR p_asset_details_csr IN asset_details_csr(p_contract_line_id)
6449    LOOP
6450         FOR p_deprn_details_csr IN deprn_details_csr(p_asset_details_csr.ASSET_ID,
6451                                                 p_asset_details_csr.CORPORATE_BOOK)
6452         LOOP
6453                 l_depreciation := p_deprn_details_csr.deprn_amount;
6454         END LOOP;
6455 
6456    END LOOP;
6457 
6458 
6459    -- convert amount into contract currency
6460    OPEN contract_start_date_csr(p_contract_id);
6461    FETCH contract_start_date_csr INTO p_contract_start_date;
6462    CLOSE contract_start_date_csr;
6463 
6464    okl_accounting_util.convert_to_contract_currency(
6465                                 p_khr_id  => p_contract_id,
6466                                 p_from_currency  => NULL,
6467                                 p_transaction_date => p_contract_start_date,
6468                                 p_amount => l_depreciation,
6469                                 x_return_status => p_return_status,
6470                                 x_contract_currency => p_contract_currency,
6471                                 x_currency_conversion_type => p_currency_conversion_type,
6472                                 x_currency_conversion_rate => p_currency_conversion_rate,
6473                                 x_currency_conversion_date => p_currency_conversion_date,
6474                                 x_converted_amount => l_converted_amount);
6475 
6476    IF(p_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
6477            Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
6478                                p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
6479            RAISE Okl_Api.G_EXCEPTION_ERROR;
6480    END IF;
6481 
6482    RETURN l_converted_amount;
6483 
6484   ELSE
6485   FOR p_parent_line_id_csr  IN parent_line_id_csr(p_contract_id) LOOP
6486      --Get the Parent_line_id based on the contract id
6487    FOR p_asset_details_csr IN asset_details_csr(p_parent_line_id_csr.parent_line_id)
6488    LOOP
6489         FOR p_deprn_details_csr IN deprn_details_csr(p_asset_details_csr.ASSET_ID,
6490                                                         p_asset_details_csr.CORPORATE_BOOK)
6491         LOOP
6492                 --Depreciation Amount from FA
6493                 l_depreciation := p_deprn_details_csr.deprn_amount;
6494         END LOOP;
6495    END LOOP;
6496    l_depn_contract := l_depn_contract + l_depreciation;
6497   END LOOP;
6498    -- convert amount into contract currency
6499    OPEN contract_start_date_csr(p_contract_id);
6500    FETCH contract_start_date_csr INTO p_contract_start_date;
6501    CLOSE contract_start_date_csr;
6502 
6503 --rkuttiya modified for bug#4367682 changed l_depreciation to l_depn_contract
6504    okl_accounting_util.convert_to_contract_currency(
6505                                 p_khr_id  => p_contract_id,
6506                                 p_from_currency  => NULL,
6507                                 p_transaction_date => p_contract_start_date,
6508                                 p_amount => l_depn_contract,
6509                                 x_return_status => p_return_status,
6510                                 x_contract_currency => p_contract_currency,
6511                                 x_currency_conversion_type => p_currency_conversion_type,
6512                                 x_currency_conversion_rate => p_currency_conversion_rate,
6513                                 x_currency_conversion_date => p_currency_conversion_date,
6514                                 x_converted_amount => l_converted_amount);
6515 
6516    IF(p_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
6517            Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
6518                                p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
6519            RAISE Okl_Api.G_EXCEPTION_ERROR;
6520    END IF;
6521    RETURN l_converted_amount;
6522 
6523   END IF;
6524 
6525   EXCEPTION
6526     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
6527         RETURN 0;
6528 
6529     WHEN OTHERS THEN
6530       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6531                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6532                           p_token1        => 'OKL_SQLCODE',
6533                           p_token1_value  => SQLCODE,
6534                           p_token2        => 'OKL_SQLERRM',
6535                           p_token2_value  => SQLERRM);
6536       RETURN 0;
6537 
6538 END contract_acc_depreciation;
6539 
6540 ----------------------------------------------------------------------------------------------------
6541 
6542     -- Start of Comments
6543     -- Created By:       Ravikumar Vaduri
6544     -- Function Name  pv_of_unbilled_rents
6545     -- Description:   returns the Present value of Unbilled Rent for a contract
6546     --                this function is used in calculation of NET INVESTMENT for
6547     --                  DF LEASE
6548     -- Dependencies:
6549     -- Parameters: contract id,contract line id
6550     -- Version: 1.0
6551     -- 17-MAR-04 rvaduri  Created the Function
6552     -- End of Commnets
6553 
6554 ----------------------------------------------------------------------------------------------------
6555 
6556 FUNCTION pv_of_unbilled_rents(
6557             p_contract_id           IN  NUMBER
6558            ,p_contract_line_id      IN NUMBER) RETURN NUMBER  IS
6559 
6560     l_api_name          CONSTANT VARCHAR2(30) := 'PV_OF_UNBILLED_RENTS';
6561     l_api_version       CONSTANT NUMBER       := 1;
6562     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
6563     x_msg_count         NUMBER;
6564     x_msg_data          VARCHAR2(256);
6565     l_cash_flow_tbl     OKL_STREAM_GENERATOR_PVT.cash_flow_tbl;
6566     i                   NUMBER := 0;
6567     l_total_rent        NUMBER := 0;
6568     l_rent              NUMBER := 0;
6569     l_rate              NUMBER := 0;
6570     x_pv_amount         NUMBER := 0;
6571     l_due_date          DATE;
6572     l_currency          VARCHAR2(30);
6573     l_kle_id              NUMBER := 0;
6574     l_slh_id              NUMBER := 0;
6575     l_freq             VARCHAR2(10);
6576 
6577 -- select changed to filter streams based on purpose instead of on type
6578 -- enhancement done for user defined streams impacts, bug 3924303
6579 
6580     CURSOR contract_unbilled_rent_csr(c_contract_id NUMBER)
6581     IS
6582       SELECT sel.amount rent
6583             ,sel.stream_element_date due_date
6584             ,stm.kle_id
6585       FROM okl_strm_elements sel,
6586            okl_streams stm,
6587            okl_strm_type_v sty
6588       WHERE sty.stream_type_purpose = 'RENT'
6589         AND stm.sty_id = sty.id
6590         AND stm.say_code = 'CURR'
6591         AND stm.active_yn = 'Y'
6592         AND stm.purpose_code IS NULL
6593         AND stm.khr_id = c_contract_id
6594         AND sel.stm_id = stm.id
6595         AND sel.date_billed IS NULL;
6596 
6597 
6598 -- select changed to filter streams based on purpose instead of on type
6599 -- enhancement done for user defined streams impacts, bug 3924303
6600 
6601     CURSOR line_unbilled_rent_csr(c_contract_line_id NUMBER)
6602     IS
6603      SELECT sel.amount rent
6604             ,sel.stream_element_date due_date
6605       FROM okl_strm_elements sel,
6606            okl_streams stm,
6607            okl_strm_type_v sty
6608       WHERE sty.stream_type_purpose = 'RENT'
6609         AND stm.sty_id = sty.id
6610         AND stm.say_code = 'CURR'
6611         AND stm.active_yn = 'Y'
6612         AND stm.purpose_code IS NULL
6613         AND stm.kle_id = c_contract_line_id
6614         AND sel.stm_id = stm.id
6615         AND sel.date_billed IS NULL;
6616 
6617 
6618 
6619     CURSOR c_get_rent_slh_id(c_line_id NUMBER,c_khr_id NUMBER)
6620     IS
6621         SELECT rl.id
6622         FROM okc_rule_groups_v rg,
6623              okc_rules_v rl
6624         WHERE rl.rgp_id = rg.id
6625           AND rl.dnz_chr_id = rg.dnz_chr_id
6626           AND rg.cle_id = c_line_id
6627           AND rg.rgd_code = 'LALEVL'
6628           AND rl.rule_information_category = 'LASLH'
6629           AND rl.dnz_chr_id = c_khr_id
6630           AND rl.object1_id1=(SELECT id FROM okl_strm_type_b WHERE code='RENT');
6631 
6632     CURSOR c_get_freq(c_line_id NUMBER,c_khr_id NUMBER,c_rent_slh_id NUMBER)
6633     IS
6634         SELECT rl.object1_id1 frequency
6635         FROM okc_rule_groups_v rg,
6636              okc_rules_v rl
6637         WHERE rl.rgp_id = rg.id
6638           AND rl.dnz_chr_id = rg.dnz_chr_id
6639           AND rg.cle_id = c_line_id
6640           AND rg.rgd_code = 'LALEVL'
6641           AND rl.rule_information_category = 'LASLL'
6642           AND rl.dnz_chr_id = c_khr_id
6643           AND rl.object2_id1=c_rent_slh_id
6644           AND ROWNUM = 1;
6645 
6646 
6647     CURSOR contract_rate_csr (c_contract_id NUMBER)
6648     IS
6649     SELECT implicit_interest_rate
6650     FROM okl_k_headers
6651     WHERE id=c_contract_id;
6652 
6653 
6654     CURSOR k_curr_code (c_contract_id NUMBER)
6655     IS
6656     SELECT currency_code
6657     FROM okc_k_headers_b
6658     WHERE id=c_contract_id;
6659 
6660 
6661 
6662     BEGIN
6663 
6664         --Get the contract currency Code.
6665         OPEN k_curr_code(p_contract_id);
6666         FETCH k_curr_code INTO l_currency;
6667         CLOSE k_curr_code;
6668 
6669         --Get the Interest Rate on the contract.
6670         OPEN contract_rate_csr(p_contract_id);
6671         FETCH contract_rate_csr INTO l_rate;
6672         CLOSE contract_rate_csr;
6673 
6674         IF l_rate IS NULL THEN
6675            Okl_Api.set_message(p_app_name     => G_APP_NAME,
6676                           p_msg_name     => G_REQUIRED_VALUE,
6677                           p_token1       => G_COL_NAME_TOKEN,
6678                           p_token1_value => 'RATE');
6679 
6680            RAISE OKC_API.G_EXCEPTION_ERROR;
6681         END IF;
6682 
6683         IF p_contract_line_id IS NOT NULL THEN
6684 
6685             FOR cur_rec IN line_unbilled_rent_csr(p_contract_line_id) LOOP
6686                 l_due_date := cur_rec.due_date;
6687                 l_rent     := cur_rec.rent;
6688 
6689                 IF l_due_date < SYSDATE THEN
6690                 --The Due date is in the past, i.e no billing has been run
6691                 --so the present value of the rent is the actual value
6692                 --that is present in the streams table.
6693                         l_total_rent := l_total_rent + l_rent;
6694                 ELSE
6695                     i := i + 1;
6696                 --The Due date is in the future, so we have to calculate the
6697                 --present value of the rent.
6698                     OPEN c_get_rent_slh_id(p_contract_line_id,p_contract_id);
6699                     FETCH c_get_rent_slh_id INTO l_slh_id;
6700                     CLOSE c_get_rent_slh_id;
6701 
6702 
6703                     OPEN c_get_freq(p_contract_line_id,p_contract_id,l_slh_id);
6704                     FETCH c_get_freq INTO l_freq;
6705                     CLOSE c_get_freq;
6706 
6707 
6708 
6709                 --Populate the pl/sql table for the calculation of PV of rent.
6710 
6711                         l_cash_flow_tbl(i).cf_date   := l_due_date;
6712                         l_cash_flow_tbl(i).cf_amount := l_rent;
6713                         l_cash_flow_tbl(i).cf_frequency   := l_freq;
6714                 END IF;
6715             END LOOP;
6716                 --Call the API that does the PV calculation.
6717 
6718              IF  l_cash_flow_tbl.COUNT > 0 THEN
6719                   OKL_STREAM_GENERATOR_PVT.get_present_value(
6720                                    p_api_version          => l_api_version,
6721                                    p_init_msg_list        => OKL_API.G_TRUE,
6722                                    p_cash_flow_tbl        => l_cash_flow_tbl,
6723                                    p_rate                 => l_rate,
6724                                    p_pv_date              => SYSDATE,
6725                                    x_pv_amount            => x_pv_amount,
6726                                    x_return_status        => x_return_status,
6727                                    x_msg_count            => x_msg_count,
6728                                    x_msg_data             => x_msg_data);
6729 
6730                 IF (x_return_status = okl_api.G_RET_STS_UNEXP_ERROR) THEN
6731                     RAISE okl_api.G_EXCEPTION_UNEXPECTED_ERROR;
6732                 ELSIF (x_return_status = okl_api.G_RET_STS_ERROR) THEN
6733                     RAISE okl_api.G_EXCEPTION_ERROR;
6734                 END IF;
6735              END IF;
6736 
6737                 l_total_rent := l_total_rent + NVL(x_pv_amount,0);
6738 
6739         ELSE
6740 
6741             FOR cur_rec IN contract_unbilled_rent_csr(p_contract_id) LOOP
6742 
6743                 l_due_date := cur_rec.due_date;
6744                 l_rent     := cur_rec.rent;
6745                 l_kle_id   := cur_rec.kle_id;
6746                 IF l_due_date < SYSDATE THEN
6747                 --The Due date is in the past, i.e no billing has been run
6748                 --so the present value of the rent is the actual value
6749                 --that is present in the streams table.
6750                         l_total_rent := l_total_rent + l_rent;
6751                 ELSE
6752                     i := i + 1;
6753                 --The Due date is in the future, so we have to calculate the
6754                 --present value of the rent.
6755                     OPEN c_get_rent_slh_id(l_kle_id,p_contract_id);
6756                     FETCH c_get_rent_slh_id INTO l_slh_id;
6757                     CLOSE c_get_rent_slh_id;
6758 
6759 
6760                     OPEN c_get_freq(l_kle_id,p_contract_id,l_slh_id);
6761                     FETCH c_get_freq INTO l_freq;
6762                     CLOSE c_get_freq;
6763 
6764 
6765                 --Populate the pl/sql table for the calculation of PV of rent.
6766                         l_cash_flow_tbl(i).cf_date   := l_due_date;
6767                         l_cash_flow_tbl(i).cf_amount := l_rent;
6768                         l_cash_flow_tbl(i).cf_frequency   := l_freq;
6769                 END IF;
6770             END LOOP;
6771                 --Call the API that does the PV calculation.
6772              IF  l_cash_flow_tbl.COUNT > 0 THEN
6773                     OKL_STREAM_GENERATOR_PVT.get_present_value(
6774                                    p_api_version          => l_api_version,
6775                                    p_init_msg_list        => OKL_API.G_TRUE,
6776                                    p_cash_flow_tbl        => l_cash_flow_tbl,
6777                                    p_rate                 => l_rate,
6778                                    p_pv_date              => SYSDATE,
6779                                    x_pv_amount            => x_pv_amount,
6780                                    x_return_status        => x_return_status,
6781                                    x_msg_count            => x_msg_count,
6782                                    x_msg_data             => x_msg_data);
6783 
6784                 IF (x_return_status = okl_api.G_RET_STS_UNEXP_ERROR) THEN
6785                     RAISE okl_api.G_EXCEPTION_UNEXPECTED_ERROR;
6786                 ELSIF (x_return_status = okl_api.G_RET_STS_ERROR) THEN
6787                     RAISE okl_api.G_EXCEPTION_ERROR;
6788                 END IF;
6789             END IF;
6790                 l_total_rent := l_total_rent + NVL(x_pv_amount,0);
6791         END IF;
6792 
6793         --Round the amount before returning it.
6794         RETURN  OKL_ACCOUNTING_UTIL.round_amount(l_total_rent,l_currency);
6795 
6796 
6797    EXCEPTION
6798    WHEN OKL_API.G_EXCEPTION_ERROR THEN
6799     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
6800                                l_api_name,
6801                                G_PKG_NAME,
6802                                'OKL_API.G_RET_STS_ERROR',
6803                                x_msg_count,
6804                                x_msg_data,
6805                                '_PVT');
6806     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
6807     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
6808                               l_api_name,
6809                               G_PKG_NAME,
6810                               'OKL_API.G_RET_STS_UNEXP_ERROR',
6811                               x_msg_count,
6812                               x_msg_data,
6813                               '_PVT');
6814     WHEN OTHERS THEN
6815     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
6816                               l_api_name,
6817                               G_PKG_NAME,
6818                               'OTHERS',
6819                               x_msg_count,
6820                               x_msg_data,
6821                               '_PVT');
6822 END pv_of_unbilled_rents;
6823 
6824 
6825 ---------------------------------------------
6826 -- End CS Functions
6827 ---------------------------------------------
6828 
6829 -----------------------------------------------------------------------
6830 -- Functions By pdevaraj -start
6831 -----------------------------------------------------------------------
6832 -----------------------------------------------------------------------
6833 -- Start of Comments
6834 -- Created By:    Punitharaj Devaraju (pdevaraj)
6835 -- Function Name: contract_net_investment
6836 -- Description:   Get net investment for a contract.
6837 -- Dependencies:  OKL_SEEDED_FUNCTIONS_PVT.contract_residual_value
6838 --                OKL_SEEDED_FUNCTIONS_PVT.contract_sum_of_rents
6839 --                OKL_SEEDED_FUNCTIONS_PVT.contract_income
6840 -- Parameters:    contract id.
6841 -- Version:       1.0
6842 -- End of Commnets
6843 -----------------------------------------------------------------------
6844 
6845 FUNCTION contract_net_investment
6846   (
6847      p_chr_id     IN NUMBER
6848     ,p_line_id    IN NUMBER
6849   )
6850 RETURN NUMBER IS
6851   l_api_version      NUMBER;
6852   l_return_status    VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
6853   l_msg_count        NUMBER;
6854   l_msg_data         VARCHAR2(2000);
6855   l_rent             NUMBER := 0;
6856   l_residual         NUMBER := 0;
6857   l_income           NUMBER := 0;
6858   l_net_investment   NUMBER := 0;
6859 
6860 BEGIN
6861 
6862   -- Get Residual Value
6863   l_residual := Okl_Seeded_Functions_Pvt.contract_residual_value(p_chr_id => p_chr_id, p_line_id => NULL);
6864 
6865   -- Get Rent
6866   l_rent := Okl_Seeded_Functions_Pvt.contract_sum_of_rents(p_chr_id, NULL);
6867 
6868   -- Get Rent
6869   l_income := Okl_Seeded_Functions_Pvt.contract_income(p_chr_id, NULL);
6870 
6871   -- Calculate Net Investment
6872   l_net_investment := l_rent + l_residual - l_income;
6873 
6874   RETURN l_net_investment;
6875   EXCEPTION
6876     WHEN OTHERS THEN
6877       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
6878                           ,p_msg_name     => G_UNEXPECTED_ERROR
6879                           ,p_token1       => G_SQLCODE_TOKEN
6880                           ,p_token1_value => SQLCODE
6881                           ,p_token2       => G_SQLERRM_TOKEN
6882                           ,p_token2_value => SQLERRM);
6883 
6884        RETURN NULL;
6885 END contract_net_investment;
6886 
6887 -----------------------------------------------------------------------
6888 -- Start of Comments
6889 -- Created By:    Punitharaj Devaraju (pdevaraj)
6890 -- Function Name: contract_cures_in_possession
6891 -- Description:   Get cures in possession a contract.
6892 -- Dependencies:
6893 -- Parameters:    contract id.
6894 -- Version:       1.0
6895 -- End of Commnets
6896 -----------------------------------------------------------------------
6897 FUNCTION contract_cures_in_possession
6898   (
6899     p_chr_id     IN NUMBER
6900   )
6901 RETURN NUMBER IS
6902   -- Cursor to get Cures in Possession
6903   CURSOR cures_in_possession_csr(p_chr_id IN NUMBER) IS
6904     SELECT NVL(SUM(amount),0)
6905     FROM   OKL_CURE_PAYMENT_LINES
6906     WHERE  chr_id = p_chr_id
6907     AND    status = 'CURES_IN_POSSESSION'
6908     AND    cured_flag = 'Y';
6909 
6910   l_cures_in_possession   NUMBER := 0;
6911 
6912 BEGIN
6913 
6914   OPEN  cures_in_possession_csr(p_chr_id);
6915   FETCH cures_in_possession_csr INTO l_cures_in_possession;
6916   CLOSE cures_in_possession_csr;
6917 
6918   RETURN l_cures_in_possession;
6919 
6920   EXCEPTION
6921     WHEN OTHERS THEN
6922       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
6923                           ,p_msg_name     => G_UNEXPECTED_ERROR
6924                           ,p_token1       => G_SQLCODE_TOKEN
6925                           ,p_token1_value => SQLCODE
6926                           ,p_token2       => G_SQLERRM_TOKEN
6927 
6928                           ,p_token2_value => SQLERRM);
6929       RETURN NULL;
6930 
6931 END contract_cures_in_possession;
6932 
6933 -----------------------------------------------------------------------
6934 -- Start of Comments
6935 -- Created By:    Punitharaj Devaraju (pdevaraj)
6936 -- Function Name: contract_outstanding_amount
6937 -- Description:   Get contract outstanding amount.
6938 -- Dependencies:
6939 -- Parameters:    contract id, contract line id.
6940 -- Version:       1.0
6941 -- End of Commnets
6942 -----------------------------------------------------------------------
6943 FUNCTION contract_outstanding_amount
6944   (
6945     p_chr_id     IN NUMBER,
6946     p_line_id    IN NUMBER
6947   )
6948 
6949 RETURN NUMBER IS
6950   -- Cursor for outstanding amount
6951     -- Bug 5897792
6952   /*CURSOR outstanding_amount_csr (p_chr_id IN NUMBER) IS
6953     SELECT NVL(SUM(amount_due_remaining), 0)
6954     FROM   okl_bpd_leasing_payment_trx_v
6955     WHERE  contract_id = p_chr_id;*/
6956 
6957   CURSOR outstanding_amount_csr (p_chr_id IN NUMBER) IS
6958     SELECT NVL(SUM(amount_due_remaining), 0)
6959     FROM   okl_bpd_ar_inv_lines_v
6960     WHERE  contract_id = p_chr_id;
6961 
6962 
6963   l_outstanding_amount  NUMBER := 0;
6964 
6965 BEGIN
6966 
6967   OPEN  outstanding_amount_csr (p_chr_id);
6968   FETCH outstanding_amount_csr INTO l_outstanding_amount;
6969   CLOSE outstanding_amount_csr;
6970 
6971   RETURN l_outstanding_amount;
6972 
6973   EXCEPTION
6974     WHEN OTHERS THEN
6975       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
6976                           ,p_msg_name     => G_UNEXPECTED_ERROR
6977                           ,p_token1       => G_SQLCODE_TOKEN
6978                           ,p_token1_value => SQLCODE
6979                           ,p_token2       => G_SQLERRM_TOKEN
6980                           ,p_token2_value => SQLERRM);
6981       RETURN NULL;
6982 
6983 END contract_outstanding_amount;
6984 
6985 -----------------------------------------------------------------------
6986 -- Start of Comments
6987 -- Created By:    Punitharaj Devaraju (pdevaraj)
6988 -- Function Name: contract_full_cure
6989 -- Description:   Get full cure amount for a contract.
6990 -- Dependencies:  OKL_SEEDED_FUNCTIONS_PVT.contract_rent_amount
6991 --                OKL_SEEDED_FUNCTIONS_PVT.contract_outstanding_amount
6992 --                OKL_SEEDED_FUNCTIONS_PVT.contract_cures_in_possession
6993 -- Parameters:    contract id.
6994 -- Version:       1.0
6995 -- End of Commnets
6996 -----------------------------------------------------------------------
6997 FUNCTION contract_full_cure
6998   (
6999      p_chr_id     IN NUMBER
7000   )
7001 RETURN NUMBER IS
7002   l_api_version         NUMBER;
7003   l_return_status       VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7004   l_msg_count           NUMBER;
7005   l_msg_data            VARCHAR2(2000);
7006   l_current_rent        NUMBER;
7007   l_cures_in_possession NUMBER := 0;
7008   l_outstanding_amount  NUMBER := 0;
7009   l_full_cure           NUMBER := 0;
7010 
7011 BEGIN
7012 
7013   -- Get Current Rent
7014   l_current_rent := Okl_Seeded_Functions_Pvt.contract_rent_amount(p_chr_id, NULL);
7015 
7016   -- Get Cures in Possession
7017   l_cures_in_possession := Okl_Seeded_Functions_Pvt.contract_cures_in_possession
7018                              (p_chr_id);
7019 
7020   l_outstanding_amount := Okl_Seeded_Functions_Pvt.contract_outstanding_amount
7021                                        ( p_chr_id
7022                                         ,NULL );
7023 
7024   l_full_cure := l_outstanding_amount -
7025                  l_current_rent -
7026                  l_cures_in_possession;
7027 
7028   RETURN l_full_cure;
7029 
7030   EXCEPTION
7031     WHEN OTHERS THEN
7032       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7033                           ,p_msg_name     => G_UNEXPECTED_ERROR
7034                           ,p_token1       => G_SQLCODE_TOKEN
7035                           ,p_token1_value => SQLCODE
7036                           ,p_token2       => G_SQLERRM_TOKEN
7037                           ,p_token2_value => SQLERRM);
7038        RETURN NULL;
7039 END contract_full_cure;
7040 
7041 -----------------------------------------------------------------------
7042 -- Start of Comments
7043 -- Created By:    Punitharaj Devaraju (pdevaraj)
7044 -- Function Name: contract_interest_cure
7045 -- Description:   Get interest cure amount for a contract.
7046 -- Dependencies:  okl_contract_info.get_rule_value
7047 --                okl_contract_info_pvt.get_days_past_due
7048 -- Parameters:    contract id.
7049 -- Version:       1.0
7050 -- End of Commnets
7051 -----------------------------------------------------------------------
7052 FUNCTION contract_interest_cure
7053   (
7054      p_chr_id     IN NUMBER
7055   )
7056 RETURN NUMBER IS
7057   l_api_version      NUMBER;
7058   l_return_status    VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7059   l_msg_count        NUMBER;
7060   l_msg_data         VARCHAR2(2000);
7061   l_contract_rate    NUMBER := 0.0;
7062   l_net_investment   NUMBER := 0;
7063   l_interest_cure    NUMBER := 0;
7064   l_current_date     DATE := TRUNC(SYSDATE);
7065   l_days_past_due    NUMBER := 0;
7066   l_last_due_date    DATE;
7067   l_months_requiring_cure   NUMBER := 0;
7068   l_value            VARCHAR2(200);
7069   l_id1              VARCHAR2(40);
7070   l_id2              VARCHAR2(200);
7071 
7072 
7073 BEGIN
7074 
7075 -- Get Net Investment
7076   l_net_investment := Okl_Seeded_Functions_Pvt.contract_net_investment
7077                            (p_chr_id, NULL);
7078 
7079 -- Get Contract rate from rule
7080   l_return_status := okl_contract_info.get_rule_value
7081                                           (
7082                                              p_contract_id => p_chr_id
7083                                             ,p_rule_group_code => 'COCURP'
7084                                             ,p_rule_code => 'COCURE'
7085                                             ,p_segment_number => 7
7086                                             ,x_id1 => l_id1
7087                                             ,x_id2 => l_id2
7088                                             ,x_value => l_value
7089                                           );
7090 
7091   IF (l_return_status = okl_api.G_RET_STS_UNEXP_ERROR) THEN
7092     RAISE okl_api.G_EXCEPTION_UNEXPECTED_ERROR;
7093   ELSIF (l_return_status = okl_api.G_RET_STS_ERROR) THEN
7094     RAISE okl_api.G_EXCEPTION_ERROR;
7095   END IF;
7096 
7097   l_contract_rate := ROUND(TO_NUMBER(l_value)/100, 3);
7098 
7099   l_return_status := okl_contract_info.get_days_past_due
7100                                           (  p_chr_id
7101                                             ,l_days_past_due );
7102 
7103   IF (l_return_status = okl_api.G_RET_STS_UNEXP_ERROR) THEN
7104     RAISE okl_api.G_EXCEPTION_UNEXPECTED_ERROR;
7105   ELSIF (l_return_status = okl_api.G_RET_STS_ERROR) THEN
7106     RAISE okl_api.G_EXCEPTION_ERROR;
7107   END IF;
7108 
7109   -- Get the furthest due date from current date
7110   -- when customer stopped paying
7111   l_last_due_date := l_current_date - l_days_past_due;
7112   l_months_requiring_cure :=
7113                  FLOOR(MONTHS_BETWEEN(l_current_date,l_last_due_date));
7114 
7115   l_interest_cure := (( l_net_investment * l_contract_rate )/12) *
7116                        l_months_requiring_cure;
7117 
7118   RETURN l_interest_cure;
7119 
7120   EXCEPTION
7121     WHEN OTHERS THEN
7122       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7123                           ,p_msg_name     => G_UNEXPECTED_ERROR
7124                           ,p_token1       => G_SQLCODE_TOKEN
7125                           ,p_token1_value => SQLCODE
7126                           ,p_token2       => G_SQLERRM_TOKEN
7127                           ,p_token2_value => SQLERRM);
7128        RETURN NULL;
7129 
7130 END contract_interest_cure;
7131 
7132   ---------------------------------------------------------------------------
7133   -- FUNCTION get_unrefunded_cures
7134   ---------------------------------------------------------------------------
7135   FUNCTION get_unrefunded_cures(
7136      p_contract_id		IN NUMBER,
7137      x_unrefunded_cures	      OUT NOCOPY NUMBER)
7138   RETURN VARCHAR2
7139   IS
7140 
7141     -- Get unrefunded cures for a contract
7142     /*CURSOR unrefunded_cures_csr(p_contract_id NUMBER) IS
7143       SELECT SUM(amount)
7144       FROM   OKL_cure_payment_lines_v
7145       WHERE  chr_id = p_contract_id
7146       AND    status = 'CURES_IN_POSSESSION'; */
7147 
7148     l_unrefunded_cures NUMBER := 0;
7149     l_api_version      NUMBER;
7150     l_return_status    VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7151     l_msg_count        NUMBER;
7152     l_msg_data         VARCHAR2(2000);
7153 
7154   BEGIN
7155 
7156     --OPEN  unrefunded_cures_csr(p_contract_id);
7157     --FETCH unrefunded_cures_csr INTO l_unrefunded_cures;
7158     --CLOSE unrefunded_cures_csr;
7159 
7160     x_unrefunded_cures := l_unrefunded_cures;
7161 
7162     RETURN l_return_status;
7163     EXCEPTION
7164     WHEN OTHERS THEN
7165       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7166                           ,p_msg_name     => G_UNEXPECTED_ERROR
7167                           ,p_token1       => G_SQLCODE_TOKEN
7168                           ,p_token1_value => SQLCODE
7169                           ,p_token2       => G_SQLERRM_TOKEN
7170                           ,p_token2_value => SQLERRM);
7171       l_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7172       RETURN(l_return_status);
7173 
7174   END get_unrefunded_cures;
7175 
7176   ---------------------------------------------------------------------------
7177   -- FUNCTION get_unrefunded_cures
7178   ---------------------------------------------------------------------------
7179   FUNCTION get_cured_status (p_contract_number IN NUMBER)
7180     RETURN VARCHAR2 IS
7181   CURSOR c_cured (p_chr_id NUMBER)  IS
7182     SELECT 'Y'
7183     FROM    OKL_CURE_PAYMENT_LINES
7184     WHERE EXISTS (SELECT 1
7185                   FROM   OKL_CURE_PAYMENT_LINES
7186                   WHERE  status = 'CURES_IN_POSSESSION'
7187                   AND    cured_flag = 'Y'
7188                   AND    chr_id = p_chr_id);
7189     ls_cured_flag  VARCHAR2(1) := 'N';
7190   BEGIN
7191     OPEN c_cured(p_contract_number );
7192     FETCH c_cured INTO ls_cured_flag;
7193     IF(c_cured%NOTFOUND) THEN
7194        ls_cured_flag := 'N' ;
7195          CLOSE c_cured ;
7196          RETURN(ls_cured_flag);
7197     END IF ;
7198     CLOSE c_cured;
7199       RETURN(ls_cured_flag);
7200   END get_cured_status;
7201 
7202 -----------------------------------------------------------------------
7203 -- Functions By pdevaraj -end
7204 -----------------------------------------------------------------------
7205 
7206   ----------------------------------------------------------------------------------------------------
7207 
7208     -- Start of Comments
7209     -- Created By:       Santhosh Siruvole (ssiruvol)
7210     -- Function Name  investor_account_amount
7211     -- Description:   returns the investor account amount for the syndication.
7212     -- Dependencies:
7213     -- Parameters: contract id.
7214     -- Version: 1.0
7215     -- End of Commnets
7216 
7217 ----------------------------------------------------------------------------------------------------
7218   FUNCTION investor_account_amount(
7219             p_chr_id          IN  NUMBER,
7220             p_line_id         IN  NUMBER) RETURN NUMBER  IS
7221 
7222     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_SUM_OF_RENTS';
7223     l_api_version	CONSTANT NUMBER	      := 1;
7224     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7225     x_msg_count         NUMBER;
7226     x_msg_data          VARCHAR2(256);
7227 
7228     l_inv_accnt_amnt NUMBER := 0;
7229     l_cap_amnt       NUMBER := 0;
7230     l_pcnt_inv       NUMBER := 0;
7231     l_stake_amnt     NUMBER := 0;
7232 
7233     CURSOR l_hdrrl_csr( rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
7234                        rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
7235                        chrId NUMBER) IS
7236     SELECT crl.object1_id1,
7237            crl.RULE_INFORMATION1,
7238            crl.RULE_INFORMATION2,
7239            crl.RULE_INFORMATION3,
7240            crl.RULE_INFORMATION4,
7241            crl.RULE_INFORMATION5,
7242            crl.RULE_INFORMATION6,
7243            crl.RULE_INFORMATION10,
7244            crl.RULE_INFORMATION11
7245     FROM   OKC_RULE_GROUPS_B crg,
7246            OKC_RULES_B crl
7247     WHERE  crl.rgp_id = crg.id
7248            AND crg.RGD_CODE = rgcode
7249            AND crl.RULE_INFORMATION_CATEGORY = rlcat
7250            AND crg.dnz_chr_id = chrId;
7251 
7252     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
7253 
7254   BEGIN
7255 
7256        IF ( p_chr_id IS NULL ) THEN
7257            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
7258        END IF;
7259 
7260        l_cap_amnt := contract_oec( p_chr_id, NULL)
7261                      - contract_tradein( p_chr_id, NULL)
7262                      - contract_capital_reduction( p_chr_id, NULL)
7263                      + contract_fees_capitalized( p_chr_id, NULL);
7264 
7265        OPEN l_hdrrl_csr( 'LASYND', 'LASYST',p_chr_id );
7266        FETCH l_hdrrl_csr INTO l_hdrrl_rec;
7267        CLOSE l_hdrrl_csr;
7268 
7269        l_stake_amnt := TO_NUMBER(NVL( l_hdrrl_rec.RULE_INFORMATION1, 0.0));
7270        l_pcnt_inv   := TO_NUMBER(NVL( l_hdrrl_rec.RULE_INFORMATION2, 0.0)) / 100.00;
7271        l_inv_accnt_amnt := l_stake_amnt - l_cap_amnt * l_pcnt_inv;
7272 
7273        RETURN l_inv_accnt_amnt;
7274 
7275     EXCEPTION
7276 	WHEN OTHERS  THEN
7277                Okl_Api.SET_MESSAGE(
7278                         p_app_name     => G_APP_NAME,
7279                         p_msg_name     => G_UNEXPECTED_ERROR,
7280                         p_token1       => G_SQLCODE_TOKEN,
7281                         p_token1_value => SQLCODE,
7282                         p_token2       => G_SQLERRM_TOKEN,
7283                         p_token2_value => SQLERRM);
7284                 RETURN NULL;
7285 
7286   END investor_account_amount;
7287 
7288 
7289   ----------------------------------------------------------------------------------------------------
7290 
7291     -- Start of Comments
7292     -- Created By:       Santhosh Siruvole (ssiruvol)
7293     -- Function Name  contract_capitalized_interest
7294     -- Description:   returns the total capitalized interest for the contract.
7295     -- Dependencies:
7296     -- Parameters: contract id.
7297     -- Version: 1.0
7298     -- End of Commnets
7299 
7300 ----------------------------------------------------------------------------------------------------
7301   FUNCTION contract_capitalized_interest(
7302             p_chr_id          IN  NUMBER,
7303             p_line_id         IN  NUMBER) RETURN NUMBER  IS
7304 
7305     l_api_name		CONSTANT VARCHAR2(256) := 'RETURN_CONTRACT_CAPITALIZED_INTEREST';
7306     l_api_version	CONSTANT NUMBER	      := 1;
7307     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7308     x_msg_count         NUMBER;
7309     x_msg_data          VARCHAR2(256);
7310 
7311     l_capz_int NUMBER := 0.0;
7312 
7313     CURSOR capz_csr( chrId NUMBER ) IS
7314     SELECT NVL( SUM(kle.capitalized_interest), 0.0)
7315     FROM OKC_LINE_STYLES_B LS,
7316          OKL_K_LINES_FULL_V KLE,
7317          okc_statuses_b sts
7318     WHERE  LS.ID = KLE.LSE_ID
7319          AND LS.LTY_CODE ='FREE_FORM1'
7320          AND KLE.DNZ_CHR_ID = chrId
7321 -- start: cklee 05/18/2004 fixed for bug#3625609
7322          AND KLE.sts_code     = sts.code
7323          AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
7324 -- end: cklee 05/18/2004 fixed for bug#3625609
7325 
7326   BEGIN
7327 
7328        IF ( p_chr_id IS NULL ) THEN
7329            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
7330        END IF;
7331 
7332        OPEN capz_csr( p_chr_id );
7333        FETCH capz_csr INTO l_capz_int;
7334        CLOSE capz_csr;
7335 
7336        RETURN l_capz_int;
7337 
7338     EXCEPTION
7339 
7340 	WHEN OTHERS THEN
7341                Okl_Api.SET_MESSAGE(
7342                         p_app_name     => G_APP_NAME,
7343                         p_msg_name     => G_UNEXPECTED_ERROR,
7344                         p_token1       => G_SQLCODE_TOKEN,
7345                         p_token1_value => SQLCODE,
7346                         p_token2       => G_SQLERRM_TOKEN,
7347                         p_token2_value => SQLERRM);
7348                 RETURN NULL;
7349 
7350   END contract_capitalized_interest;
7351 
7352   ----------------------------------------------------------------------------------------------------
7353 
7354     -- Start of Comments
7355     -- Created By:       Santhosh Siruvole (ssiruvol)
7356     -- Function Name  line_capitalized_interest
7357     -- Description:   returns the total capitalized interest for the contract.
7358     -- Dependencies:
7359     -- Parameters: contract id.
7360     -- Version: 1.0
7361     -- End of Commnets
7362 
7363 ----------------------------------------------------------------------------------------------------
7364   FUNCTION line_capitalized_interest(
7365             p_chr_id          IN  NUMBER,
7366             p_line_id         IN  NUMBER) RETURN NUMBER  IS
7367 
7368     l_api_name		CONSTANT VARCHAR2(256) := 'RETURN_CONTRACT_CAPITALIZED_INTEREST';
7369     l_api_version	CONSTANT NUMBER	      := 1;
7370     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7371     x_msg_count         NUMBER;
7372     x_msg_data          VARCHAR2(256);
7373 
7374     l_capz_int NUMBER := 0.0;
7375 
7376     CURSOR capz_csr( chrId NUMBER, kleId NUMBER ) IS
7377     SELECT NVL( kle.capitalized_interest, 0.0)
7378     FROM OKC_LINE_STYLES_B LS,
7379          OKL_K_LINES_FULL_V KLE
7380     WHERE  LS.ID = KLE.LSE_ID
7381          AND LS.LTY_CODE ='FREE_FORM1'
7382          AND KLE.DNZ_CHR_ID = chrId
7383          AND KLE.id = kleId;
7384 
7385   BEGIN
7386 
7387        IF (( p_chr_id IS NULL ) OR ( p_line_id IS NULL ) ) THEN
7388            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
7389        END IF;
7390 
7391        OPEN capz_csr( p_chr_id, p_line_id );
7392        FETCH capz_csr INTO l_capz_int;
7393        CLOSE capz_csr;
7394 
7395        RETURN l_capz_int;
7396 
7397     EXCEPTION
7398 
7399 	WHEN OTHERS THEN
7400                Okl_Api.SET_MESSAGE(
7401                         p_app_name     => G_APP_NAME,
7402                         p_msg_name     => G_UNEXPECTED_ERROR,
7403                         p_token1       => G_SQLCODE_TOKEN,
7404                         p_token1_value => SQLCODE,
7405                         p_token2       => G_SQLERRM_TOKEN,
7406                         p_token2_value => SQLERRM);
7407                 RETURN NULL;
7408 
7409   END line_capitalized_interest;
7410 
7411   ---------------------------------------------
7412   -- Functions for Securitization
7413   -- mvasudev, 04/02/2003
7414   ---------------------------------------------
7415 
7416   FUNCTION ASSET_UNDISBURSED_STREAMS(p_dnz_chr_id IN NUMBER -- Lease Contract ID
7417                                              ,p_kle_id     IN NUMBER -- Lease Contract-Asset ID
7418                                              )
7419   RETURN NUMBER
7420   IS
7421     CURSOR l_okl_inv_payment_event_csr(p_khr_id IN NUMBER)
7422     IS
7423     SELECT rulb.rule_information2 payment_event
7424     FROM   okc_rules_b rulb
7425           ,okc_rule_groups_b rgpb
7426     WHERE  rgpb.dnz_chr_id                = p_khr_id
7427 	AND    rgpb.chr_id                    = p_khr_id
7428     AND    rgpb.rgd_code                  = 'LASEIR'
7429     AND    rgpb.id                        = rulb.rgp_id
7430     AND    rulb.rule_information_category = 'LASEIR';
7431 
7432     CURSOR l_okl_unbilled_streams_csr(p_dnz_chr_id IN NUMBER
7433                                      ,p_kle_id IN NUMBER
7434                                      ,p_sty_id IN NUMBER)
7435     IS
7436     SELECT NVL(SUM(selb.amount),0) total_amount
7437     FROM   okl_strm_elements selb
7438           ,okl_streams       stmb
7439           ,okl_pool_contents pocb
7440           ,okl_strm_type_v styv --ankushar --Bug 6594724
7441           ,okc_k_headers_b chrb --ankushar --Bug 6594724
7442     WHERE stmb.khr_id = p_dnz_chr_id
7443     AND   stmb.kle_id = p_kle_id
7444     AND   stmb.sty_id = p_sty_id
7445     AND   selb.stm_id = stmb.id
7446 	AND   stmb.active_yn = 'Y'
7447 	AND   stmb.say_code = 'CURR'
7448     AND   selb.date_billed IS NULL
7449     AND   pocb.kle_id = p_kle_id
7450     AND   pocb.sty_id = p_sty_id
7451 	-- mvasudev, 03/30/2004
7452 	AND   pocb.status_Code = 'ACTIVE'
7453   /*
7454     ankushar --Bug 6594724: Unable to terminate Investor Agreement with Residual Streams
7455     Start changes
7456    */
7457     AND stmb.sty_id = styv.id
7458     AND pocb.khr_id = chrb.id
7459     AND(selb.stream_element_date > SYSDATE
7460         OR
7461           (styv.stream_type_subclass = 'RESIDUAL'
7462            and chrb.STS_CODE IN ('TERMINATED','EXPIRED')
7463           )
7464        )
7465   /* ankushar Bug 6594724
7466      End Changes
7467    */
7468 	-- end, mvasudev, 03/30/2004
7469     AND   (selb.stream_element_date BETWEEN pocb.streams_from_date
7470                                     AND NVL(pocb.streams_to_date,G_FINAL_DATE)
7471            );
7472 
7473     CURSOR l_okl_unreceived_streams_csr(p_dnz_chr_id IN NUMBER
7474                                        ,p_kle_id IN NUMBER
7475                                        ,p_sty_id IN NUMBER)
7476     IS
7477     SELECT NVL(SUM(amount_due_original - amount_due_remaining),0) total_amount
7478     FROM   okl_bpd_leasing_payment_trx_v
7479 	WHERE  contract_id = p_dnz_chr_id
7480 	AND    contract_line_id = p_kle_id
7481 	AND    stream_type_id = p_sty_id
7482 	AND    amount_due_original <> amount_due_remaining;
7483 
7484  CURSOR l_okl_unbilled_strms_pndg_csr(p_dnz_chr_id IN NUMBER
7485                                      ,p_kle_id IN NUMBER
7486                                      ,p_sty_id IN NUMBER)
7487     IS
7488     SELECT NVL(SUM(selb.amount),0) total_amount
7489     FROM   okl_strm_elements selb
7490           ,okl_streams       stmb
7491           ,okl_pool_contents pocb
7492     WHERE stmb.khr_id = p_dnz_chr_id
7493     AND   stmb.kle_id = p_kle_id
7494     AND   stmb.sty_id = p_sty_id
7495     AND   selb.stm_id = stmb.id
7496     AND   stmb.active_yn = 'Y'
7497     AND   stmb.say_code = 'CURR'
7498     AND   selb.date_billed IS NULL
7499     AND   pocb.kle_id = p_kle_id
7500     AND   pocb.sty_id = p_sty_id
7501     AND   pocb.status_code = 'PENDING'
7502     AND   selb.stream_element_date > SYSDATE
7503     AND   (selb.stream_element_date BETWEEN pocb.streams_from_date
7504                                     AND NVL(pocb.streams_to_date,G_FINAL_DATE) );
7505 
7506 	l_total_amount NUMBER := 0;
7507 	l_khr_id NUMBER;
7508 	l_sty_id NUMBER;
7509 	l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
7510 
7511   BEGIN
7512 
7513     --Validate additional parameters availability
7514     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
7515       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
7516 	  LOOP
7517         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_khr_id' THEN
7518           l_khr_id := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
7519         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_sty_id' THEN
7520           l_sty_id := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
7521         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
7522           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
7523         END IF;
7524       END LOOP;
7525       ELSE
7526       Okl_Api.Set_Message(p_app_name     => G_APP_NAME,
7527                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
7528       RAISE OKL_API.G_EXCEPTION_ERROR;
7529       END IF;
7530 
7531 	FOR l_okl_inv_payment_event_rec IN l_okl_inv_payment_event_csr(l_khr_id)
7532 	LOOP
7533 	  IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
7534 	    FOR l_okl_unbilled_strms_pndg_rec IN l_okl_unbilled_strms_pndg_csr(p_dnz_chr_id,p_kle_id,l_sty_id)
7535             LOOP
7536 		l_total_amount := l_total_amount + l_okl_unbilled_strms_pndg_rec.total_amount;
7537 	  END LOOP; -- unbilled streams for pending pool contents
7538 	  ELSE
7539 	  FOR l_okl_unbilled_streams_rec IN l_okl_unbilled_streams_csr(p_dnz_chr_id,p_kle_id,l_sty_id)
7540           LOOP
7541 		l_total_amount := l_total_amount + l_okl_unbilled_streams_rec.total_amount;
7542 	  END LOOP; -- unbilled streams
7543 	  END IF;
7544 
7545 	  IF l_okl_inv_payment_event_rec.payment_event = 'RECEIPT' THEN
7546 	    FOR l_okl_unreceived_streams_rec IN l_okl_unreceived_streams_csr(p_dnz_chr_id,p_kle_id,l_sty_id)
7547 	    LOOP
7548     	    l_total_amount := l_total_amount + l_okl_unreceived_streams_rec.total_amount;
7549 		END LOOP; -- unreceived streams
7550 	  END IF;
7551 
7552 	END LOOP; -- payment basis
7553 
7554 	RETURN l_total_amount;
7555 
7556   EXCEPTION
7557   WHEN OTHERS THEN
7558     IF l_okl_inv_payment_event_csr%ISOPEN THEN
7559       CLOSE l_okl_inv_payment_event_csr;
7560     END IF;
7561     IF l_okl_unbilled_streams_csr%ISOPEN THEN
7562       CLOSE l_okl_unbilled_streams_csr;
7563     END IF;
7564     IF l_okl_unreceived_streams_csr%ISOPEN THEN
7565       CLOSE l_okl_unreceived_streams_csr;
7566     END IF;
7567     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
7568                         p_msg_name     => G_UNEXPECTED_ERROR,
7569                         p_token1       => G_SQLCODE_TOKEN,
7570                         p_token1_value => SQLCODE,
7571                         p_token2       => G_SQLERRM_TOKEN,
7572                         p_token2_value => SQLERRM);
7573     RETURN NULL;
7574   END ASSET_UNDISBURSED_STREAMS;
7575 
7576   -- mvasudev, 10/14/2003
7577   FUNCTION INVESTORS_PV_AMOUNT(p_chr_id IN NUMBER -- Investor Agreement ID
7578                                     ,p_line_id     IN NUMBER)
7579   RETURN NUMBER
7580   IS
7581   -- mvasudev, 09/29/2004, Bug#3909240
7582   CURSOR l_okl_pv_amounts_csr(p_sty_purpose IN VARCHAR2)
7583       IS
7584       SELECT NVL(SUM(selb.amount),0) total_amount
7585       FROM   okl_strm_elements selb
7586                   ,okl_streams       stmb
7587                   ,okl_strm_type_v   styv
7588                   ,okl_pool_contents pocb
7589       WHERE stmb.source_id = p_chr_id
7590       AND   styv.stream_type_purpose = p_sty_purpose
7591       AND   stmb.sty_id = styv.id
7592       AND   selb.stm_id = stmb.id
7593       AND   stmb.active_yn = 'Y'
7594       AND   stmb.say_code = 'CURR'
7595      AND   pocb.status_code <> 'PENDING'
7596      AND pocb.khr_id = stmb.khr_id
7597      AND pocb.kle_id = stmb.kle_id;
7598 
7599     CURSOR l_okl_pv_amounts_pending_csr(p_sty_purpose IN VARCHAR2)
7600       IS
7601       SELECT NVL(SUM(selb.amount),0) total_amount
7602       FROM  okl_strm_elements selb
7603                  ,okl_streams       stmb
7604                  ,okl_strm_type_v   styv
7605                  ,okl_pool_contents pocb
7606       WHERE stmb.source_id = p_chr_id
7607       AND   styv.stream_type_purpose = p_sty_purpose
7608       AND   stmb.sty_id = styv.id
7609       AND   selb.stm_id = stmb.id
7610       AND   stmb.active_yn = 'Y'
7611       AND   stmb.say_code = 'CURR'
7612       AND   pocb.status_code = 'PENDING'
7613       AND pocb.khr_id = stmb.khr_id
7614       AND pocb.kle_id = stmb.kle_id;
7615 
7616    /* fmiao , 09/6/2005 , Bug#4561645
7617         cursor change for stream_type_subclass filtering
7618     */
7619    CURSOR l_okl_percent_stake_csr(p_sty_subclass IN VARCHAR2)
7620    IS
7621    SELECT DISTINCT kleb.percent_stake,clet.id
7622    FROM   okl_k_lines kleb,
7623           okc_k_lines_b clet,
7624           okc_k_lines_b cles
7625    WHERE  kleb.id = cles.id
7626    AND    cles.cle_id = clet.id
7627    AND    clet.dnz_chr_id = p_chr_id
7628    --AND    kleb.sty_id = styb.id
7629    AND    kleb.stream_type_subclass = p_sty_subclass;
7630 
7631    l_total_amount NUMBER := 0;
7632    l_total_percent NUMBER := 0;
7633    l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
7634 
7635   BEGIN
7636 
7637      l_total_percent := 0;
7638 
7639     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
7640       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
7641       LOOP
7642         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
7643           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
7644         END IF;
7645       END LOOP;
7646      END IF;
7647 
7648       /* fmiao , 09/6/2005 , Bug#4561645
7649         change the stream_type_purpose PV_RENT_SECURITIZED and PV_RV_SECURITIZED
7650       */
7651       IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
7652         FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_RENT_SECURITIZED')
7653         LOOP
7654           FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RENT')
7655           LOOP
7656             l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7657           END LOOP;
7658           IF (l_total_percent >0 AND l_total_percent <=100) THEN
7659             l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
7660           END IF;
7661         END LOOP; -- PV_RENT_SECURITIZED
7662       ELSE
7663       FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_RENT_SECURITIZED')
7664       LOOP
7665         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RENT')
7666         LOOP
7667           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7668         END LOOP;
7669         IF (l_total_percent >0 AND l_total_percent <=100) THEN
7670           l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
7671         END IF;
7672       END LOOP; -- PV_RENT_SECURITIZED
7673      END IF;
7674      l_total_percent := 0;
7675 
7676      IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
7677        FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_RV_SECURITIZED')
7678        LOOP
7679          FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RESIDUAL')
7680          LOOP
7681            l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7682          END LOOP;
7683          IF (l_total_percent >0 AND l_total_percent <=100) THEN
7684            l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
7685          END IF;
7686        END LOOP; -- PV_RV_SECURITIZED
7687      ELSE
7688        FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_RV_SECURITIZED')
7689        LOOP
7690          FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RESIDUAL')
7691          LOOP
7692            l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7693          END LOOP;
7694          IF (l_total_percent >0 AND l_total_percent <=100) THEN
7695            l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
7696          END IF;
7697        END LOOP; -- PV_RV_SECURITIZED
7698      END IF;
7699   --Bug # 6740000 ssdeshpa Added for Addition of Loan Contract into the Pool
7700   --Calculate the PV Amount for Principal Sec of Loan Contracts
7701   l_total_percent := 0;
7702   IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
7703      FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_PRINCIPAL_SECURITIZED')
7704      LOOP
7705         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
7706         LOOP
7707             l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7708         END LOOP;
7709         IF (l_total_percent >0 AND l_total_percent <=100) THEN
7710             l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
7711         END IF;
7712      END LOOP; -- PV_PRINCIPAL_SECURITIZED
7713   ELSE
7714      FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_PRINCIPAL_SECURITIZED')
7715      LOOP
7716         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
7717         LOOP
7718           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7719         END LOOP;
7720         IF (l_total_percent >0 AND l_total_percent <=100) THEN
7721           l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
7722         END IF;
7723      END LOOP; -- PV_PRINCIPAL_SECURITIZED
7724   END IF;
7725    --Calculate the PV Amount for Interest Sec of Loan Contracts
7726   l_total_percent := 0;
7727   IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
7728      FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_INTEREST_SECURITIZED')
7729      LOOP
7730         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
7731         LOOP
7732             l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7733         END LOOP;
7734         IF (l_total_percent >0 AND l_total_percent <=100) THEN
7735             l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
7736         END IF;
7737      END LOOP; -- PV_INTEREST_SECURITIZED
7738   ELSE
7739      FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_INTEREST_SECURITIZED')
7740      LOOP
7741         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
7742         LOOP
7743           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7744         END LOOP;
7745         IF (l_total_percent >0 AND l_total_percent <=100) THEN
7746           l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
7747         END IF;
7748      END LOOP; -- PV_INTEREST_SECURITIZED
7749   END IF;
7750   --Calculate the PV Value for Unscheduled Principal Paydown(PPD) Payment
7751   l_total_percent := 0;
7752   IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
7753      FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_UNSCHEDULED_PMT_SECURITIZED')
7754      LOOP
7755           FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
7756           LOOP
7757               l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7758           END LOOP;
7759           IF (l_total_percent >0 AND l_total_percent <=100) THEN
7760               l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
7761           END IF;
7762        END LOOP; -- PV_UNSCHEDULED_PMT_SECURITIZED
7763   ELSE
7764      FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_UNSCHEDULED_PMT_SECURITIZED')
7765      LOOP
7766           FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
7767           LOOP
7768              l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
7769           END LOOP;
7770           IF (l_total_percent >0 AND l_total_percent <=100) THEN
7771              l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
7772           END IF;
7773      END LOOP; -- PV_UNSCHEDULED_PMT_SECURITIZED
7774   END IF;
7775    --Bug # 6740000 ssdeshpa Added for Addition of Loan Contract into the Pool
7776 
7777   RETURN l_total_amount;
7778 
7779   EXCEPTION
7780   WHEN OTHERS THEN
7781     IF l_okl_pv_amounts_csr%ISOPEN THEN
7782       CLOSE l_okl_pv_amounts_csr;
7783     END IF;
7784     IF l_okl_pv_amounts_pending_csr%ISOPEN THEN
7785       CLOSE l_okl_pv_amounts_pending_csr;
7786     END IF;
7787     IF l_okl_percent_stake_csr%ISOPEN THEN
7788       CLOSE l_okl_percent_stake_csr;
7789     END IF;
7790 
7791     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
7792                         p_msg_name     => G_UNEXPECTED_ERROR,
7793                         p_token1       => G_SQLCODE_TOKEN,
7794                         p_token1_value => SQLCODE,
7795                         p_token2       => G_SQLERRM_TOKEN,
7796                         p_token2_value => SQLERRM);
7797     RETURN NULL;
7798   END INVESTORS_PV_AMOUNT;
7799 
7800 
7801   ---------------------------------------------
7802   -- END,Functions for Securitization
7803   -- mvasudev, 04/02/2003
7804   ---------------------------------------------
7805 
7806 -- 06/02/03 cklee start
7807 ----------------------------------------------------------------------------------
7808 -- Start of comments
7809 --
7810 -- Procedure Name  : investor_rent_accural_amout
7811 -- Description     : get total rent accural amount by associated agreement's pool contracts
7812 -- Business Rules  :
7813 -- Parameters      :
7814 -- Created By      : chenkuang.lee
7815 -- last modified by: ssdeshpa
7816 -- Version         : 2.0 modified to use Accrual Adjustment streams instead of Accrual streams
7817 --                 : 3.0 modified for Addition of Loan Contract into the Pool
7818 -- End of comments
7819 ----------------------------------------------------------------------------------
7820 FUNCTION investor_rent_accural_amout(
7821    p_contract_id         IN okc_k_headers_b.id%TYPE
7822   ,p_contract_line_id    IN NUMBER
7823   ) RETURN NUMBER
7824  IS
7825 
7826      l_rent_accrual          NUMBER;
7827 
7828    -- mvasudev, 09/29/2004, Bug#3909240
7829  CURSOR c_rent_accrual(p_contract_id okc_k_headers_b.id%TYPE) IS
7830  SELECT NVL(SUM(SELB.AMOUNT),0)
7831  FROM
7832    OKL_STREAMS STMB,
7833    OKL_STRM_ELEMENTS SELB,
7834    OKL_STRM_TYPE_V STYV
7835  WHERE STMB.ID = SELB.STM_ID
7836  AND STMB.STY_ID = STYV.ID
7837  AND STYV.STREAM_TYPE_PURPOSE IN ('INVESTOR_PRETAX_INCOME','INVESTOR_RENTAL_ACCRUAL','INVESTOR_INTEREST_INCOME')
7838  AND STMB.SAY_CODE = 'CURR'
7839  AND STMB.ACTIVE_YN = 'Y'
7840  AND EXISTS (SELECT 1
7841              FROM OKL_POOL_CONTENTS POC,
7842                   OKL_POOLS POL,
7843                   OKL_STRM_TYPE_V STYS
7844              WHERE  POC.POL_ID = POL.ID
7845              AND    POC.KHR_ID = STMB.KHR_ID
7846              AND    POL.KHR_ID = P_CONTRACT_ID
7847              AND    POC.STY_ID = STYS.ID
7848              AND    STYS.STREAM_TYPE_SUBCLASS IN ('RENT','LOAN_PAYMENT') --Bug # 6740000 ssdeshpa--For Loan Contracts Addition into the Pool
7849              AND  POC.status_code <> Okl_Pool_Pvt.G_POC_STS_PENDING  --Added by VARANGAN -Pool Contents Impact(Bug#6658065)
7850 	     );
7851 
7852  CURSOR c_rent_accrual_pending(p_contract_id okc_k_headers_b.id%TYPE) IS
7853  SELECT NVL(SUM(SELB.AMOUNT),0)
7854  FROM
7855    OKL_STREAMS STMB,
7856    OKL_STRM_ELEMENTS SELB,
7857    OKL_STRM_TYPE_V STYV
7858  WHERE STMB.ID = SELB.STM_ID
7859  AND STMB.STY_ID = STYV.ID
7860  AND STYV.STREAM_TYPE_PURPOSE IN ('INVESTOR_PRETAX_INCOME','INVESTOR_RENTAL_ACCRUAL','INVESTOR_INTEREST_INCOME')
7861  AND STMB.SAY_CODE = 'CURR'
7862  AND STMB.ACTIVE_YN = 'Y'
7863  AND EXISTS (SELECT 1 FROM OKL_POOL_CONTENTS POC,
7864                            OKL_POOLS POL,
7865                            OKL_STRM_TYPE_V STYS
7866              WHERE  POC.POL_ID = POL.ID
7867              AND    POC.KHR_ID = STMB.KHR_ID
7868              AND    POL.KHR_ID = P_CONTRACT_ID
7869              AND    POC.STY_ID = STYS.ID
7870              AND    STYS.STREAM_TYPE_SUBCLASS IN ('RENT','LOAN_PAYMENT') --Bug # 6740000 ssdeshpa--For Loan Contracts Addition into the Pool
7871              AND  POC.status_code = Okl_Pool_Pvt.G_POC_STS_PENDING);
7872 
7873  l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
7874 
7875  BEGIN
7876     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
7877       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
7878       LOOP
7879         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
7880           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
7881         END IF;
7882       END LOOP;
7883     END IF;
7884 
7885     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
7886      OPEN c_rent_accrual_pending (p_contract_id);
7887      FETCH c_rent_accrual_pending INTO l_rent_accrual;
7888      CLOSE c_rent_accrual_pending;
7889     ELSE
7890      OPEN c_rent_accrual (p_contract_id);
7891      FETCH c_rent_accrual INTO l_rent_accrual;
7892      CLOSE c_rent_accrual;
7893     END IF;
7894 
7895    RETURN l_rent_accrual;
7896 
7897    EXCEPTION
7898      WHEN OTHERS THEN
7899       --Bug # 6740000 ssdeshpa added Start
7900       IF c_rent_accrual_pending%ISOPEN THEN
7901          CLOSE c_rent_accrual_pending;
7902       END IF;
7903       IF c_rent_accrual%ISOPEN THEN
7904          CLOSE c_rent_accrual;
7905       END IF;
7906       --Bug # 6740000 ssdeshpa added End
7907       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
7908       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
7909                            p_msg_name      => 'OKL_UNEXPECTED_ERROR',
7910                            p_token1        => 'OKL_SQLCODE',
7911                            p_token1_value  => SQLCODE,
7912                            p_token2        => 'OKL_SQLERRM',
7913                            p_token2_value  => SQLERRM);
7914        RETURN NULL;
7915 
7916 END investor_rent_accural_amout;
7917 
7918 ----------------------------------------------------------------------------------
7919 -- Start of comments
7920 --
7921 -- Procedure Name  : investor_user_amount_stake
7922 -- Description     : get total investor stake by associated agreement from user enter amount
7923 -- Business Rules  :
7924 -- Parameters      :
7925 -- Created By      : chenkuang.lee
7926 -- Version         : 1.0
7927 -- End of comments
7928 ----------------------------------------------------------------------------------
7929  FUNCTION investor_user_amount_stake(
7930   p_contract_id         IN okc_k_headers_b.id%TYPE
7931  ,p_contract_line_id    IN NUMBER
7932  ) RETURN NUMBER
7933 IS
7934     l_amount         NUMBER;
7935 
7936 CURSOR c_amt_stake(p_contract_id okc_k_headers_b.id%TYPE) IS
7937 SELECT
7938   NVL(SUM(NVL(KLEB.AMOUNT,0)),0)
7939 FROM
7940   OKL_K_LINES KLEB,
7941   OKC_K_LINES_B CLEB,
7942   OKC_LINE_STYLES_B LSEB
7943 WHERE
7944   CLEB.ID = KLEB.ID AND
7945   CLEB.LSE_ID = LSEB.ID AND
7946   LSEB.LTY_CODE = 'INVESTMENT'   AND
7947   CLEB.DNZ_CHR_ID = p_contract_id;
7948 -- akjain 01-28-2004
7949 -- modified the cursor to simplify the query, removed join with OKX_PARTY
7950 
7951 CURSOR c_add_amt_stake(p_contract_id okc_k_headers_b.id%TYPE) IS
7952 SELECT
7953   NVL(SUM(NVL(KLEB.AMOUNT_STAKE,0)),0)
7954 FROM
7955   OKL_K_LINES KLEB,
7956   OKC_K_LINES_B CLEB,
7957   OKC_LINE_STYLES_B LSEB
7958 WHERE
7959   CLEB.ID = KLEB.ID AND
7960   CLEB.LSE_ID = LSEB.ID AND
7961   LSEB.LTY_CODE = 'INVESTMENT'   AND
7962   CLEB.DNZ_CHR_ID = p_contract_id;
7963 
7964 l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
7965 
7966 BEGIN
7967 
7968     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
7969       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
7970       LOOP
7971         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
7972           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
7973         END IF;
7974      END LOOP;
7975   END IF;
7976 
7977   IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
7978     OPEN c_add_amt_stake (p_contract_id);
7979     FETCH c_add_amt_stake INTO l_amount;
7980     CLOSE c_add_amt_stake;
7981   ELSE
7982     OPEN c_amt_stake (p_contract_id);
7983     FETCH c_amt_stake INTO l_amount;
7984     CLOSE c_amt_stake;
7985   END IF;
7986 
7987   RETURN l_amount;
7988 
7989   EXCEPTION
7990     WHEN OTHERS THEN
7991     --Bug # 6740000 ssdeshpa added Start
7992     IF c_add_amt_stake%ISOPEN THEN
7993        CLOSE c_add_amt_stake;
7994     END IF;
7995     --Bug # 6740000 ssdeshpa added End
7996     --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
7997     OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
7998                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
7999                           p_token1        => 'OKL_SQLCODE',
8000                           p_token1_value  => SQLCODE,
8001                           p_token2        => 'OKL_SQLERRM',
8002                           p_token2_value  => SQLERRM);
8003       RETURN NULL;
8004 
8005 END investor_user_amount_stake;
8006 
8007 ----------------------------------------------------------------------------------
8008 -- Start of comments
8009 --
8010 -- Procedure Name  : investor_stream_amount
8011 -- Description     : get total investor stream amount by associated agreement's pool contents
8012 -- Business Rules  :
8013 -- Parameters      : p_contract_id
8014 -- Created By      : chenkuang.lee
8015 -- last modified by: ssdeshpa
8016 -- Version         : 2.0
8017 -- comments        : modified for the subclass changes 01-28-2004
8018 -- returns         : Total securitized streams amount * revenue share percent
8019 -- Version         : 3.0
8020 -- comments        : Bug # 6740000 modified for the Addition of Loan Contracts into the Pool changes
8021 -- End of comments
8022 ----------------------------------------------------------------------------------
8023   FUNCTION investor_stream_amount(
8024    p_contract_id         IN okc_k_headers_b.id%TYPE
8025   ,p_contract_line_id    IN NUMBER
8026   ) RETURN NUMBER
8027  IS
8028 
8029    x_value          NUMBER;
8030    l_pol_id         okl_pools.id%TYPE;
8031    l_percent_stake  NUMBER;
8032    G_FINAL_DATE   CONSTANT    DATE    	:= TO_DATE('1','j') + 5300000;
8033 
8034 
8035  CURSOR l_khr_csr(p_khr_id okc_k_headers_b.id%TYPE) IS
8036    SELECT polb.id
8037  FROM okl_pools polb
8038  WHERE polb.khr_id = p_khr_id;
8039 
8040  -- get revenue share by subclass
8041  CURSOR l_okl_percent_stake_csr(p_sty_subclass IN VARCHAR2)
8042     IS
8043     SELECT DISTINCT kleb.percent_stake,clet.id
8044     FROM   okl_k_lines kleb,
8045            okc_k_lines_b clet,
8046            okc_k_lines_b cles
8047     WHERE  kleb.id = cles.id
8048     AND    cles.cle_id = clet.id
8049     AND    clet.dnz_chr_id = p_contract_id
8050     AND    kleb.stream_type_subclass = p_sty_subclass;
8051 
8052  -- get pool streams amount by subclass
8053    CURSOR l_streams_amount_csr (p_pol_id  NUMBER, p_stm_sub_class VARCHAR2)
8054    IS
8055  SELECT
8056   NVL(SUM(NVL(selb.AMOUNT,0)),0) AMOUNT
8057  FROM
8058        okl_strm_type_v  styv,
8059        okl_streams       stmb,
8060        okl_strm_elements selb,
8061        okl_pool_contents pocb
8062  WHERE  styv.stream_type_subclass = p_stm_sub_class
8063  AND    styv.id = stmb.sty_id
8064  AND    stmb.id       = selb.stm_id
8065  AND    pocb.pol_id   = p_pol_id
8066  AND    stmb.ID   = pocb.STM_ID
8067  AND    stmb.say_code = 'CURR'
8068  AND    stmb.active_yn = 'Y'
8069  AND    selb.STREAM_ELEMENT_DATE
8070         BETWEEN pocb.STREAMS_FROM_DATE AND NVL(pocb.STREAMS_TO_DATE, G_FINAL_DATE)
8071   AND  pocb.status_code <> Okl_Pool_Pvt.G_POC_STS_PENDING ; --Added by VARANGAN -Pool Contents Impact(Bug#6658065)
8072 
8073  -- get pool streams amount by subclass
8074    CURSOR l_streams_amount_pending_csr (p_pol_id  NUMBER, p_stm_sub_class VARCHAR2)
8075    IS
8076  SELECT
8077   NVL(SUM(NVL(selb.AMOUNT,0)),0) AMOUNT
8078  FROM
8079        okl_strm_type_v  styv,
8080        okl_streams       stmb,
8081        okl_strm_elements selb,
8082        okl_pool_contents pocb
8083  WHERE  styv.stream_type_subclass = p_stm_sub_class
8084  AND    styv.id = stmb.sty_id
8085  AND    stmb.id       = selb.stm_id
8086  AND    pocb.pol_id   = p_pol_id
8087  AND    stmb.ID   = pocb.STM_ID
8088  AND    stmb.say_code = 'CURR'
8089  AND    stmb.active_yn = 'Y'
8090  AND    selb.STREAM_ELEMENT_DATE
8091         BETWEEN pocb.STREAMS_FROM_DATE AND NVL(pocb.STREAMS_TO_DATE, G_FINAL_DATE)
8092   AND  pocb.status_code = Okl_Pool_Pvt.G_POC_STS_PENDING ;
8093 
8094  l_total_percent NUMBER := 0;
8095  l_total_sec_amount  NUMBER := 0;
8096  l_per_subclass_amount NUMBER := 0;
8097  l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
8098 
8099  BEGIN
8100 
8101    FOR l_khr_csr_rec IN l_khr_csr(p_contract_id)
8102    LOOP
8103      l_pol_id := l_khr_csr_rec.id;
8104    END LOOP;
8105 
8106    IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
8107        FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
8108        LOOP
8109          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
8110            l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8111          END IF;
8112        END LOOP;
8113      END IF;
8114 
8115    IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8116       FOR l_streams_amount_pending_rec IN l_streams_amount_pending_csr(l_pol_id, 'RENT')
8117      LOOP
8118        l_per_subclass_amount := l_streams_amount_pending_rec.amount;
8119        FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RENT')
8120        LOOP
8121          l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8122        END LOOP;
8123      END LOOP;
8124    ELSE
8125      FOR l_streams_amount_csr_rec IN l_streams_amount_csr(l_pol_id, 'RENT')
8126      LOOP
8127        l_per_subclass_amount := l_streams_amount_csr_rec.amount;
8128        FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RENT')
8129        LOOP
8130          l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8131        END LOOP;
8132      END LOOP;
8133     END IF;
8134      l_total_sec_amount := (l_total_percent/100) * l_per_subclass_amount;
8135      l_total_percent := 0;
8136      l_per_subclass_amount := 0;
8137 
8138    IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8139      FOR l_streams_amount_pending_rec IN l_streams_amount_pending_csr(l_pol_id, 'RESIDUAL')
8140      LOOP
8141        l_per_subclass_amount := l_streams_amount_pending_rec.amount;
8142        FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RESIDUAL')
8143        LOOP
8144          l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8145        END LOOP;
8146       END LOOP;
8147    ELSE
8148      FOR l_streams_amount_csr_rec IN l_streams_amount_csr(l_pol_id, 'RESIDUAL')
8149      LOOP
8150        l_per_subclass_amount := l_streams_amount_csr_rec.amount;
8151        FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RESIDUAL')
8152        LOOP
8153          l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8154        END LOOP;
8155       END LOOP;
8156     END IF;
8157     --Bug # 6740000 Changes for Adding the Loan Contracts Into Pool
8158     l_total_sec_amount := l_total_sec_amount + ((l_total_percent/100) * l_per_subclass_amount);
8159     l_total_percent := 0;
8160     l_per_subclass_amount := 0;
8161 
8162     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8163       FOR l_streams_amount_pending_rec IN l_streams_amount_pending_csr(l_pol_id, 'LOAN_PAYMENT')
8164       LOOP
8165         l_per_subclass_amount := l_streams_amount_pending_rec.amount;
8166         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8167         LOOP
8168           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8169         END LOOP;
8170       END LOOP;
8171     ELSE
8172       FOR l_streams_amount_csr_rec IN l_streams_amount_csr(l_pol_id, 'LOAN_PAYMENT')
8173       LOOP
8174         l_per_subclass_amount := l_streams_amount_csr_rec.amount;
8175         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8176         LOOP
8177           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8178         END LOOP;
8179       END LOOP;
8180     END IF;
8181    l_total_sec_amount := l_total_sec_amount + ((l_total_percent/100) * l_per_subclass_amount);
8182     --Bug # 6740000 Changes for Adding the Loan Contracts Into Pool End
8183    x_value := l_total_sec_amount;
8184 
8185    RETURN x_value;
8186 
8187    EXCEPTION
8188      WHEN OTHERS THEN
8189       --Bug # 6740000 ssdeshpa added Start
8190       IF l_khr_csr%ISOPEN THEN
8191          CLOSE l_khr_csr;
8192       END IF;
8193       IF l_okl_percent_stake_csr%ISOPEN THEN
8194          CLOSE l_okl_percent_stake_csr;
8195       END IF;
8196       IF l_streams_amount_csr%ISOPEN THEN
8197          CLOSE l_streams_amount_csr;
8198       END IF;
8199       IF l_streams_amount_pending_csr%ISOPEN THEN
8200          CLOSE l_streams_amount_pending_csr;
8201       END IF;
8202       --Bug # 6740000 ssdeshpa added End
8203       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
8204        OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
8205                            p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8206                            p_token1        => 'OKL_SQLCODE',
8207                            p_token1_value  => SQLCODE,
8208                            p_token2        => 'OKL_SQLERRM',
8209                            p_token2_value  => SQLERRM);
8210        RETURN NULL;
8211 
8212 END investor_stream_amount;
8213 
8214 
8215 ----------------------------------------------------------------------------------
8216 -- Start of comments
8217 --
8218 -- Procedure Name  : fee_idc_amount
8219 -- Description     : gets the sum of fee idc amount for a given contract
8220 -- Business Rules  :
8221 -- Parameters      :
8222 -- Created By      : smereddy
8223 -- Version         : 1.0
8224 -- End of comments
8225 ----------------------------------------------------------------------------------
8226  FUNCTION fee_idc_amount(
8227   p_dnz_chr_id         IN NUMBER
8228  ,p_kle_id             IN NUMBER
8229  ) RETURN NUMBER
8230 IS
8231 
8232 l_sum_idc_amt  NUMBER;
8233 
8234 -- smereddy 06/17/03 calculates sum of fee idc
8235 CURSOR sum_idc_csr(l_dnz_chr_id okc_k_headers_b.id%TYPE) IS
8236 SELECT
8237   NVL(SUM(NVL(KLEB.initial_direct_cost,0)),0)
8238 FROM
8239   OKL_K_LINES KLEB,
8240   OKC_K_LINES_B CLEB,
8241   OKC_LINE_STYLES_B LSEB
8242 WHERE
8243   KLEB.ID = CLEB.ID AND
8244   CLEB.LSE_ID = LSEB.ID AND
8245   LSEB.LTY_CODE = 'FEE' AND
8246   KLEB.FEE_TYPE IN ('EXPENSE','MISCELLANEOUS') AND
8247   CLEB.CHR_ID = l_dnz_chr_id AND
8248   CLEB.STS_CODE IN ('APPROVED', 'COMPLETE');
8249 -- added COMPLETE to resolve bug # 3152093
8250 
8251 BEGIN
8252 
8253   OPEN sum_idc_csr (p_dnz_chr_id);
8254   FETCH sum_idc_csr INTO l_sum_idc_amt;
8255   CLOSE sum_idc_csr;
8256 
8257   RETURN l_sum_idc_amt;
8258 
8259   EXCEPTION
8260     WHEN OTHERS THEN
8261       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
8262       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
8263                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8264                           p_token1        => 'OKL_SQLCODE',
8265                           p_token1_value  => SQLCODE,
8266                           p_token2        => 'OKL_SQLERRM',
8267                           p_token2_value  => SQLERRM);
8268       RETURN NULL;
8269 
8270 END fee_idc_amount;
8271 
8272 
8273 -- 09/05/03 jsanju start
8274 --for cure calculation
8275 
8276  FUNCTION contract_delinquent_amt (
8277   p_contract_id         IN okc_k_headers_b.id%TYPE
8278  ,p_contract_line_id    IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
8279  ) RETURN NUMBER IS
8280 
8281 -- ASHIM CHANGE - START
8282 
8283 /*
8284   CURSOR c_amount_past_due(p_contract_id IN NUMBER,
8285                            p_grace_days  IN NUMBER) IS
8286     SELECT SUM(NVL(aps.amount_due_remaining, 0)) past_due_amount
8287     FROM   okl_cnsld_ar_strms_b ocas
8288            ,ar_payment_schedules aps
8289            , okl_strm_type_v sm
8290     WHERE  ocas.khr_id = p_contract_id
8291     AND    ocas.receivables_invoice_id = aps.customer_trx_id
8292     AND    aps.class ='INV'
8293     AND    (aps.due_date + p_grace_days) < SYSDATE
8294     AND    NVL(aps.amount_due_remaining, 0) > 0
8295     AND    sm.id = ocas.STY_ID
8296     AND    sm.name <> 'CURE';*/
8297 
8298   CURSOR c_amount_past_due(p_contract_id IN NUMBER,
8299                            p_grace_days  IN NUMBER) IS
8300     SELECT SUM(NVL(aps.amount_due_remaining, 0)) past_due_amount
8301     FROM   okl_bpd_tld_ar_lines_v ocas
8302            ,ar_payment_schedules aps
8303            , okl_strm_type_v sm
8304     WHERE  ocas.khr_id = p_contract_id
8305     AND    ocas.customer_trx_id = aps.customer_trx_id
8306     AND    aps.class ='INV'
8307     AND    (aps.due_date + p_grace_days) < SYSDATE
8308     AND    NVL(aps.amount_due_remaining, 0) > 0
8309     AND    sm.id = ocas.STY_ID
8310     AND    sm.name <> 'CURE';
8311 
8312 -- ASHIM CHANGE - END
8313 
8314   l_contract_number okc_k_headers_b.contract_number%TYPE;
8315   l_rule_name     VARCHAR2(200);
8316   l_rule_value    VARCHAR2(2000);
8317   l_return_Status VARCHAR2(1):=FND_Api.G_RET_STS_SUCCESS;
8318   l_id1           VARCHAR2(40);
8319   l_id2           VARCHAR2(200);
8320   l_days_allowed  NUMBER :=0;
8321   l_program_id okl_k_headers.khr_id%TYPE;
8322   l_delinquent_amount NUMBER :=0;
8323 
8324 
8325  BEGIN
8326    IF (G_DEBUG_ENABLED = 'Y') THEN
8327      G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
8328    END IF;
8329 
8330        SELECT khr_id INTO l_program_id
8331        FROM okl_k_headers
8332        WHERE id=p_contract_id;
8333 
8334 
8335       l_return_status := okl_contract_info.get_rule_value(
8336                               p_contract_id     => l_program_id
8337                              ,p_rule_group_code => 'COCURP'
8338                              ,p_rule_code		=> 'COCURE'
8339                              ,p_segment_number	=> 3
8340                              ,x_id1             => l_id1
8341                              ,x_id2             => l_id2
8342                              ,x_value           => l_rule_value);
8343 
8344          l_days_allowed :=NVL(l_rule_value,0);
8345 
8346 
8347 
8348       -- Get Past Due Amount with maximium days allowed
8349       OPEN  c_amount_past_due (p_contract_id,l_days_allowed);
8350       FETCH c_amount_past_due INTO l_delinquent_amount;
8351       CLOSE c_amount_past_due;
8352       RETURN l_delinquent_amount;
8353 
8354  EXCEPTION
8355  WHEN OTHERS THEN
8356 
8357      IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
8358             OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, ' in   contract_delinquent_amt'||SQLERRM);
8359      END IF;
8360      OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
8361                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8362                           p_token1        => 'OKL_SQLCODE',
8363                           p_token1_value  => SQLCODE,
8364                           p_token2        => 'OKL_SQLERRM',
8365                           p_token2_value  => SQLERRM);
8366       RETURN l_delinquent_amount;
8367 
8368  END contract_delinquent_amt;
8369 
8370  FUNCTION cumulative_vendor_invoice_amt (
8371   p_contract_id         IN okc_k_headers_b.id%TYPE
8372  ,p_contract_line_id    IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
8373  ) RETURN NUMBER IS
8374 
8375   CURSOR c_vendor_invoice_amt (p_contract_id IN NUMBER) IS
8376   SELECT NVL(SUM(negotiated_amount),0)
8377   FROM  okl_cure_amounts
8378   WHERE chr_id =p_contract_id
8379   AND   status ='CURESINPROGRESS';
8380 
8381   l_vendor_invoice_amt NUMBER;
8382 
8383  BEGIN
8384       OPEN  c_vendor_invoice_amt(p_contract_id);
8385       FETCH c_vendor_invoice_amt INTO l_vendor_invoice_amt;
8386       CLOSE c_vendor_invoice_amt;
8387 
8388       RETURN l_vendor_invoice_amt;
8389 
8390  END cumulative_vendor_invoice_amt;
8391 
8392 
8393  FUNCTION contract_short_fund_amt (
8394   p_contract_id         IN okc_k_headers_b.id%TYPE
8395  ,p_contract_line_id    IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
8396  ) RETURN NUMBER IS
8397 
8398   CURSOR c_get_short_fund_amt (p_contract_id IN NUMBER) IS
8399   SELECT NVL(SUM(short_fund_amount),0)
8400   FROM  okl_cure_amounts
8401   WHERE chr_id =p_contract_id
8402   AND   status ='CURESINPROGRESS';
8403 
8404   l_short_fund_amt NUMBER;
8405 
8406  BEGIN
8407       OPEN  c_get_short_fund_amt(p_contract_id);
8408       FETCH c_get_short_fund_amt INTO l_short_fund_amt;
8409       CLOSE c_get_short_fund_amt;
8410 
8411       RETURN l_short_fund_amt;
8412 
8413  END contract_short_fund_amt;
8414 
8415 -- 09/05/03 jsanju end
8416 
8417 ------------------------------------------
8418 --Bug# 3143522 avsingh : 11.5.10 Subsidies
8419 ------------------------------------------
8420 --Bug# 3638568 : Modified function to conditionally include terminated lines if called from pricing
8421 --------------------------------------------------------------------------------
8422 --start of comments
8423 --Name        : line_discount
8424 --Purpose     : To calculate total discount on a financial asset line
8425 --Parameters  : IN - p_chr_id  contract header id
8426 --                 - p_line id financial asset line id
8427 -- Return     : Total line discount
8428 -- History    : 16-SEP-2003  avsingh Creation
8429 --end of comments
8430 --------------------------------------------------------------------------------
8431 FUNCTION line_discount(
8432            p_chr_id    IN NUMBER,
8433            p_line_id   IN NUMBER) RETURN NUMBER IS
8434 
8435 l_api_version    NUMBER DEFAULT 1.0;
8436 l_return_status  VARCHAR2(1) DEFAULT Okl_Api.G_RET_STS_SUCCESS;
8437 l_msg_count      NUMBER;
8438 l_msg_data       VARCHAR2(2000);
8439 
8440 l_line_discount NUMBER;
8441 l_discount      NUMBER;
8442 l_discount_incl_terminated BOOLEAN := FALSE;
8443 
8444   --cursor to get line_sts
8445   CURSOR l_line_sts_csr (p_cle_id IN NUMBER) IS
8446   SELECT stsb.ste_code
8447   FROM   okc_statuses_b stsb,
8448          okc_k_lines_b  cleb
8449   WHERE  stsb.code      = cleb.sts_code
8450   AND    cleb.id        = p_cle_id;
8451 
8452   l_line_sts_rec     l_line_sts_csr%ROWTYPE;
8453 
8454   --cursor to get financial asset lines on a contract (without terminated lines)
8455   CURSOR l_cleb_csr (p_chr_id IN NUMBER) IS
8456   SELECT cleb.id
8457   FROM   okc_k_lines_b cleb,
8458          okc_statuses_b stsb,
8459          okc_line_styles_b lseb
8460   WHERE  cleb.chr_id     = p_chr_id
8461   AND    cleb.lse_id     = lseb.id
8462   AND    lseb.lty_code   = 'FREE_FORM1'
8463   AND    cleb.sts_code   = stsb.code
8464   AND    stsb.ste_code   NOT IN ('HOLD','EXPIRED','TERMINATED','CANCELLED');
8465 
8466   --cursor to get financial asset lines on a contract (with terminated lines)
8467   CURSOR l_cleb_termn_csr (p_chr_id IN NUMBER) IS
8468   SELECT cleb.id
8469   FROM   okc_k_lines_b cleb,
8470          okc_statuses_b stsb,
8471          okc_line_styles_b lseb
8472   WHERE  cleb.chr_id     = p_chr_id
8473   AND    cleb.lse_id     = lseb.id
8474   AND    lseb.lty_code   = 'FREE_FORM1'
8475   AND    cleb.sts_code   = stsb.code
8476   AND    stsb.ste_code   NOT IN ('HOLD','EXPIRED','CANCELLED');
8477 
8478   l_cle_id    okc_k_lines_b.ID%TYPE;
8479 
8480 
8481 BEGIN
8482 
8483     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
8484        --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
8485        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
8486 		 -- l_discount_incl_terminated := TRUE;
8487     --END IF;
8488 
8489            -- rmunjulu 4042892
8490     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
8491       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
8492 	  LOOP
8493         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
8494           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
8495 		  l_discount_incl_terminated := TRUE;
8496         END IF;
8497       END LOOP;
8498     END IF;
8499 
8500      IF p_line_id IS NOT NULL THEN
8501          --Get the line status
8502          OPEN l_line_sts_csr(p_cle_id => p_line_id);
8503          FETCH l_line_sts_csr INTO l_line_sts_rec;
8504          CLOSE l_line_sts_csr;
8505 
8506          IF l_line_sts_rec.ste_code IS NULL THEN
8507              l_line_discount := 0;
8508          ELSIF (l_line_sts_rec.ste_code IN ('HOLD','EXPIRED','CANCELLED'))
8509                OR   (l_line_sts_rec.ste_code = 'TERMINATED' AND
8510                      NOT (l_discount_incl_terminated)) THEN
8511              l_line_discount := 0;
8512          ELSIF (l_line_sts_rec.ste_code NOT IN ('HOLD','EXPIRED','TERMINATED''CANCELLED'))
8513                 OR (l_line_sts_rec.ste_code = 'TERMINATED' AND
8514                     (l_discount_incl_terminated)) THEN
8515 
8516              Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
8517                                      (p_api_version       => l_api_version,
8518                                       p_init_msg_list     => Okl_Api.G_FALSE,
8519                                       x_msg_data           => l_msg_data,
8520                                       x_msg_count          => l_msg_count,
8521                                       x_return_status      => l_return_status,
8522                                       p_asset_cle_id       => p_line_id,
8523                                       p_accounting_method  => 'NET',
8524                                       x_subsidy_amount     => l_line_discount);
8525              IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
8526                 RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
8527              END IF;
8528          END IF;
8529 
8530       ELSIF (p_line_id IS NULL) AND (p_chr_id IS NOT NULL) THEN
8531          l_line_discount := 0;
8532          IF (l_discount_incl_terminated) THEN
8533              OPEN l_cleb_termn_csr(p_chr_id => p_chr_id);
8534              LOOP
8535                  FETCH l_cleb_termn_csr INTO l_cle_id;
8536                  EXIT WHEN l_cleb_termn_csr%NOTFOUND;
8537                  Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
8538                                  (p_api_version       => l_api_version,
8539                                   p_init_msg_list     => Okl_Api.G_FALSE,
8540                                   x_msg_data           => l_msg_data,
8541                                   x_msg_count          => l_msg_count,
8542                                   x_return_status      => l_return_status,
8543                                   p_asset_cle_id       => l_cle_id,
8544                                   p_accounting_method  => 'NET',
8545                                   x_subsidy_amount     => l_discount);
8546                  IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
8547                      RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
8548                  END IF;
8549                  l_line_discount := l_line_discount + l_discount;
8550              END LOOP;
8551              CLOSE l_cleb_termn_csr;
8552          ELSIF NOT  (l_discount_incl_terminated) THEN
8553              OPEN l_cleb_csr(p_chr_id => p_chr_id);
8554              LOOP
8555                  FETCH l_cleb_csr INTO l_cle_id;
8556                  EXIT WHEN l_cleb_csr%NOTFOUND;
8557                  Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
8558                                  (p_api_version       => l_api_version,
8559                                   p_init_msg_list     => Okl_Api.G_FALSE,
8560                                   x_msg_data           => l_msg_data,
8561                                   x_msg_count          => l_msg_count,
8562                                   x_return_status      => l_return_status,
8563                                   p_asset_cle_id       => l_cle_id,
8564                                   p_accounting_method  => 'NET',
8565                                   x_subsidy_amount     => l_discount);
8566                  IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
8567                      RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
8568                  END IF;
8569                  l_line_discount := l_line_discount + l_discount;
8570              END LOOP;
8571              CLOSE l_cleb_csr;
8572          END IF;
8573       ELSIF (p_line_id IS NULL) AND (p_chr_id IS NULL) THEN
8574              RAISE Okl_Api.G_EXCEPTION_ERROR;
8575       END IF;
8576       RETURN (l_line_discount);
8577 
8578      EXCEPTION
8579      WHEN OTHERS THEN
8580      IF l_cleb_csr%ISOPEN THEN
8581          CLOSE l_cleb_csr;
8582      END IF;
8583      IF l_cleb_termn_csr%ISOPEN THEN
8584          CLOSE l_cleb_termn_csr;
8585      END IF;
8586      IF l_line_sts_csr%ISOPEN THEN
8587          CLOSE l_line_sts_csr;
8588      END IF;
8589      Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
8590                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8591                           p_token1        => 'OKL_SQLCODE',
8592                           p_token1_value  => SQLCODE,
8593                           p_token2        => 'OKL_SQLERRM',
8594                           p_token2_value  => SQLERRM);
8595       RETURN NULL;
8596 END line_discount;
8597 --------------------------------------------------------------------------------
8598 --start of comments
8599 --Name        : contract_discount
8600 --Purpose     : To calculate total discount on a contract
8601 --Parameters  : IN - p_chr_id  contract header id
8602 --                 - p_line id financial asset line id
8603 -- Return     : Total contract discount
8604 -- History    : 16-SEP-2003  avsingh Creation
8605 --end of comments
8606 --------------------------------------------------------------------------------
8607 FUNCTION contract_discount(
8608            p_chr_id    IN NUMBER,
8609            p_line_id   IN NUMBER) RETURN NUMBER IS
8610 
8611 l_api_version    NUMBER DEFAULT 1.0;
8612 l_return_status  VARCHAR2(1) DEFAULT OKL_API.G_RET_STS_SUCCESS;
8613 l_msg_count      NUMBER;
8614 l_msg_data       VARCHAR2(2000);
8615 
8616 l_contract_discount NUMBER;
8617 BEGIN
8618      IF (p_line_id IS NOT NULL) OR (p_chr_id IS NOT NULL)  THEN
8619         l_contract_discount := line_discount(p_chr_id,p_line_id);
8620       ELSIF (p_line_id IS NULL) AND (p_chr_id IS NULL) THEN
8621           RAISE OKL_API.G_EXCEPTION_ERROR;
8622       END IF;
8623       RETURN (l_contract_discount);
8624      EXCEPTION
8625      WHEN OTHERS THEN
8626      OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
8627                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8628                           p_token1        => 'OKL_SQLCODE',
8629                           p_token1_value  => SQLCODE,
8630                           p_token2        => 'OKL_SQLERRM',
8631                           p_token2_value  => SQLERRM);
8632       RETURN NULL;
8633 END contract_discount;
8634 ----------------------------------------------
8635 --End Bug# 3143522 avsingh : 11.5.10 Subsidies
8636 ----------------------------------------------
8637 -----------------------------------------------------------------------
8638 --Start Bug# 3036581 : avsingh new formula CONTRACT_AMORTIZED_EXPENSES
8639 -----------------------------------------------------------------------
8640 ----------------------------------------------------------------------------------------------------
8641 
8642     -- Start of Comments
8643     -- Created By:    avsingh
8644     -- Function Name  contract_amortized_expenses
8645     -- Description:   returns the sum of amount on stream type - Amortized Expense.
8646     -- Dependencies:
8647     -- Parameters: contract id.
8648     -- Version: 1.0
8649     -- End of Commnets
8650 
8651 ----------------------------------------------------------------------------------------------------
8652   FUNCTION contract_amortized_expenses(
8653             p_chr_id          IN  NUMBER,
8654             p_line_id         IN  NUMBER) RETURN NUMBER  IS
8655 
8656     l_api_name          CONSTANT VARCHAR2(30) := 'CONTRACT_AMORTIZED_EXPENSES';
8657     l_api_version       CONSTANT NUMBER       := 1;
8658     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
8659     x_msg_count         NUMBER;
8660     x_msg_data          VARCHAR2(2000);
8661 
8662     l_amortized_expenses NUMBER := 0;
8663 
8664     ---------------------------------------------------
8665     --cursor to get sum of line level amortized expenses
8666     ---------------------------------------------------
8667     CURSOR l_line_amortexp_csr (chrId NUMBER ) IS
8668     SELECT NVL(SUM(sele.amount),0) amount
8669     FROM okl_strm_elements sele,
8670          okl_streams str,
8671          --okl_strm_type_tl sty,
8672          okl_strm_type_v sty,
8673          okl_K_lines_full_v kle,
8674          okc_statuses_b sts
8675     WHERE sele.stm_id = str.id
8676        AND str.sty_id = sty.id
8677        --AND UPPER(sty.name)  = 'AMORTIZED EXPENSE'
8678        AND sty.stream_type_purpose = 'AMORTIZED_FEE_EXPENSE'
8679        --AND sty.LANGUAGE = 'US'
8680        AND str.say_code = 'CURR'
8681        AND str.active_yn = 'Y'
8682        AND NVL( str.purpose_code, 'XXXX' ) <>  'REPORT'
8683        AND str.khr_id = chrId
8684        AND NVL(str.kle_id,-9999) = kle.id
8685        AND kle.dnz_chr_id = chrId
8686        AND kle.sts_code = sts.code
8687        AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
8688 
8689         l_line_amortexp_rec l_line_amortexp_csr%ROWTYPE;
8690 
8691     -----------------------------------------------------
8692     --Cursor to get sum of contract level amortized expenses
8693     -----------------------------------------------------
8694     CURSOR l_chr_amortexp_csr (chrId NUMBER) IS
8695     SELECT NVL(SUM(sele.amount),0) amount
8696     FROM okl_strm_elements sele,
8697          okl_streams str,
8698          --okl_strm_type_tl sty
8699          okl_strm_type_v sty
8700     WHERE sele.stm_id = str.id
8701        AND str.sty_id = sty.id
8702        --AND UPPER(sty.name) = 'AMORTIZED EXPENSE'
8703        AND sty.stream_type_purpose = 'AMORTIZED_FEE_EXPENSE'
8704        --AND sty.LANGUAGE = 'US'
8705        AND str.say_code = 'CURR'
8706        AND str.active_yn = 'Y'
8707        AND NVL( str.purpose_code, 'XXXX' ) <> 'REPORT'
8708        AND str.khr_id = chrId
8709        AND NVL(str.kle_id, -9999) = -9999;
8710 
8711     l_chr_amortexp_rec    l_chr_amortexp_csr%ROWTYPE;
8712 
8713 BEGIN
8714 
8715        IF ( NVL(p_chr_id,OKL_API.G_MISS_NUM)  = OKL_API.G_MISS_NUM ) THEN
8716            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
8717        END IF;
8718 
8719        OPEN l_line_amortexp_csr( p_chr_id );
8720        FETCH l_line_amortexp_csr INTO l_line_amortexp_rec;
8721        CLOSE l_line_amortexp_csr;
8722 
8723        OPEN l_chr_amortexp_csr( p_chr_id );
8724        FETCH l_chr_amortexp_csr INTO l_chr_amortexp_rec;
8725        CLOSE l_chr_amortexp_csr;
8726 
8727        l_amortized_expenses := l_line_amortexp_rec.amount + l_chr_amortexp_rec.amount;
8728 
8729       RETURN l_amortized_expenses;
8730 
8731 
8732     EXCEPTION
8733         WHEN OTHERS  THEN
8734                Okl_Api.SET_MESSAGE(
8735                         p_app_name     => G_APP_NAME,
8736                         p_msg_name     => G_UNEXPECTED_ERROR,
8737                         p_token1       => G_SQLCODE_TOKEN,
8738                         p_token1_value => SQLCODE,
8739                         p_token2       => G_SQLERRM_TOKEN,
8740                         p_token2_value => SQLERRM);
8741                 RETURN NULL;
8742 
8743 END contract_amortized_expenses;
8744 -------------------------------------------------
8745 --End Bug# 3036581 avsingh : 11.5.10
8746 -------------------------------------------------
8747 
8748 -------------------------------------------------
8749 --Bug# 3143522 mdokal : 11.5.10 AM Securitization
8750 -------------------------------------------------
8751 
8752 ------------------------------------------------------------------------------
8753   -- Start of Comments
8754   -- Created By:    Manjit Dokal - 18-JUL-2003
8755   -- Function Name: investor_rent_factor
8756   -- Description:   Calculate Investor Rent Factor
8757   -- Dependencies:  OKL building blocks AMTX and AMUV,
8758   -- Parameters:    IN:  p_contract_id, p_contract_line_id (optional)
8759   --                OUT: amount
8760   -- History        rmunjulu EDAT Changed to get unbilled streams after
8761   --                quote eff date and ALL undisbursed amount
8762   --              : PAGARG Bug# 4012614 User Defined Streams impact
8763   --              : 06-Dec-2004 PAGARG Bug# 3948473
8764   --              : obtain investor agreement id from additional parameters and
8765   --              : and use it to get stream id for INVESTOR_RENT_DISB_BASIS
8766   --              : 07-Jan-2004 PAGARG Bug# 3948473. Removed the billable_yn
8767   --              : accrual_yn joins from undisbursed investor rent streams cursor
8768   --              : gboomina bug 4775555 Modified to get FUTURE BILLS (billed and not billed from term date onwards)
8769   --                and FUTURE DISBURSEMENTS (disbursed and not disbursed from term date onwards)
8770 
8771   -- Version:       1.0
8772   -- End of Commnets
8773 ------------------------------------------------------------------------------
8774 
8775 FUNCTION investor_rent_factor (
8776 	p_contract_id		IN NUMBER,
8777 	p_contract_line_id	IN NUMBER)
8778 	RETURN NUMBER IS
8779 
8780     --Bug# 4012614 PAGARG modified the cursor for User Defined Streams Impact
8781 	-- Get Unbilled Streams
8782 	-- rmunjulu EDAT unbilled after quote eff from date
8783 CURSOR l_unbill_stream_csr (
8784                                              cp_contract_id NUMBER,
8785                                              cp_contract_line_id NUMBER,
8786                                              cp_date DATE,
8787                                              cp_sty_id NUMBER) IS
8788 SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_due
8789 FROM okl_streams stm,
8790            okl_strm_type_b sty,
8791            okl_strm_elements ste
8792           ,okl_pool_contents pocb
8793 WHERE stm.khr_id      = cp_contract_id
8794 AND	stm.kle_id	= NVL(cp_contract_line_id, stm.kle_id)
8795 AND	stm.active_yn = 'Y'
8796 AND	stm.say_code = 'CURR'
8797 AND	ste.stm_id	= stm.id
8798 AND NVL (ste.amount, 0)	<> 0
8799 AND sty.id              = stm.sty_id
8800 AND sty.id              = cp_sty_id
8801 AND sty.billable_yn     = 'Y'
8802 AND ste.stream_element_date > cp_date -- rmunjulu EDAT
8803 AND pocb.status_Code <> 'PENDING'
8804 AND pocb.khr_id = stm.khr_id
8805 AND pocb.kle_id = stm.kle_id
8806 AND pocb.sty_id = stm.sty_id;
8807 
8808     --Bug# 4012614 PAGARG modified the cursor for User Defined Streams Impact
8809 -- Get Undisbursed Investor Rent Streams
8810 CURSOR l_undisb_rent_stream_csr (
8811                                                       cp_contract_id NUMBER,
8812                                                       cp_contract_line_id NUMBER,
8813                                                       cp_sty_id NUMBER,
8814                                                       cp_date  DATE) IS --gboomina bug 4775555
8815 SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_payable
8816 FROM okl_streams stm,
8817           okl_strm_type_b     sty,
8818           okl_strm_elements ste
8819           ,okl_pool_contents pocb
8820 WHERE stm.khr_id  = cp_contract_id
8821 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
8822 AND stm.active_yn = 'Y'
8823 AND stm.say_code= 'CURR'
8824 AND	ste.stm_id	= stm.id
8825 AND NVL (ste.amount, 0)	<> 0
8826 AND sty.id              = stm.sty_id
8827 AND sty.id              = cp_sty_id
8828 AND ste.stream_element_date > cp_date -- gboomina bug 4775555 -- check for disbs after termination
8829 AND pocb.status_Code <> 'PENDING'
8830 AND pocb.khr_id = stm.khr_id
8831 AND pocb.kle_id = stm.kle_id
8832 AND pocb.sty_id = stm.sty_id;
8833 
8834 CURSOR l_unbill_stream_pending_csr (
8835                                                          cp_contract_id NUMBER,
8836                                                          cp_contract_line_id NUMBER,
8837                                                          cp_date DATE,
8838                                                          cp_sty_id NUMBER) IS
8839 SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_due
8840 FROM okl_streams stm,
8841            okl_strm_type_b sty,
8842            okl_strm_elements ste
8843            ,okl_pool_contents pocb
8844 WHERE stm.khr_id = cp_contract_id
8845 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
8846 AND stm.active_yn = 'Y'
8847 AND stm.say_code = 'CURR'
8848 AND ste.stm_id = stm.id
8849 AND NVL (ste.amount, 0) <> 0
8850 AND sty.id  = stm.sty_id
8851 AND sty.id              = cp_sty_id
8852 AND sty.billable_yn     = 'Y'
8853 AND ste.stream_element_date > cp_date
8854 AND pocb.status_Code = 'PENDING'
8855 AND pocb.khr_id = stm.khr_id
8856 AND pocb.kle_id = stm.kle_id
8857 AND pocb.sty_id = stm.sty_id;
8858 
8859   -- Get Undisbursed Investor Rent Streams
8860 CURSOR l_undisb_rent_strm_pndg_csr (
8861                                                                    cp_contract_id NUMBER,
8862                                                                    cp_contract_line_id NUMBER,
8863                                                                    cp_sty_id NUMBER,
8864                                                                    cp_date DATE) IS
8865 SELECT	NVL(SUM (NVL (ste.amount, 0)),0)  amount_payable
8866 FROM okl_streams stm,
8867            okl_strm_type_b sty,
8868            okl_strm_elements ste
8869            ,okl_pool_contents pocb
8870 WHERE stm.khr_id = cp_contract_id
8871 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
8872 AND	stm.active_yn = 'Y'
8873 AND stm.say_code = 'CURR'
8874 AND	ste.stm_id = stm.id
8875 AND NVL (ste.amount, 0)	<> 0
8876 AND sty.id = stm.sty_id
8877 AND sty.id              = cp_sty_id
8878 AND ste.stream_element_date > cp_date
8879 AND pocb.status_Code = 'PENDING'
8880 AND pocb.khr_id = stm.khr_id
8881 AND pocb.kle_id = stm.kle_id
8882 AND pocb.sty_id = stm.sty_id;
8883 
8884 
8885 l_unbill_rent_amount		NUMBER		:= 0;
8886 l_undisb_rent_amount		NUMBER		:= 0;
8887 l_result_amount             NUMBER      := 0;
8888 l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
8889 
8890 -- rmunjulu EDAT
8891 CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
8892 SELECT trunc(qte.date_effective_from) date_effective_from
8893 FROM   okl_trx_quotes_b  qte
8894 WHERE  qte.id = p_quote_id;
8895 
8896  -- rmunjulu EDAT
8897         l_quote_id NUMBER;
8898         l_quote_date DATE;
8899         l_sysdate DATE;
8900         l_sty_id            OKL_STRM_TYPE_TL.ID%TYPE := 0;
8901         l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
8902     --06-Dec-2004 PAGARG Bug# 3948473 variable to store investor agreement id
8903     l_inv_agr_id    NUMBER;
8904 BEGIN
8905 	-- ****************
8906 	-- Calculate result
8907 	-- ****************
8908 	-- rmunjulu EDAT
8909     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
8910       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
8911       LOOP
8912         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
8913            l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
8914         --06-Dec-2004 PAGARG Bug# 3948473 obtain investor agreement id
8915         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'inv_agr_id' THEN
8916            l_inv_agr_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
8917         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
8918           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8919         END IF;
8920       END LOOP;
8921     END IF;
8922 
8923     -- rmunjulu EDAT
8924     select sysdate into l_sysdate from dual;
8925 
8926     -- rmunjulu EDAT
8927 	IF  l_quote_id IS NOT NULL
8928 	AND l_quote_id <> OKL_API.G_MISS_NUM THEN
8929 
8930 	   FOR get_quote_date_rec IN get_quote_date_csr (l_quote_id) LOOP
8931 	      l_quote_date := get_quote_date_rec.date_effective_from;
8932 	   END LOOP;
8933     END IF;
8934 
8935 	-- rmunjulu EDAT
8936     IF l_quote_date IS NULL
8937     OR l_quote_date = OKL_API.G_MISS_DATE THEN
8938        l_quote_date := l_sysdate;
8939     END IF;
8940 
8941     --PAGARG 19-Nov-2004 Bug# 4012614
8942     --UDS impact. Obtain stream type id and pass it to cursor
8943     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
8944                                             'RENT',
8945                                             l_return_status,
8946                                             l_sty_id);
8947 
8948     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
8949     THEN
8950         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8951     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
8952     THEN
8953         RAISE OKL_API.G_EXCEPTION_ERROR;
8954     END IF;
8955 
8956         IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8957           OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
8958           FETCH l_unbill_stream_pending_csr INTO l_unbill_rent_amount;
8959           CLOSE l_unbill_stream_pending_csr;
8960         ELSE
8961           OPEN l_unbill_stream_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
8962           FETCH l_unbill_stream_csr INTO l_unbill_rent_amount;
8963           CLOSE l_unbill_stream_csr;
8964         END IF;
8965 
8966     --06-Dec-2004 PAGARG Bug# 3948473 Pass investor agreement id to obtain stream id
8967     OKL_STREAMS_UTIL.get_primary_stream_type(l_inv_agr_id,
8968                                             'INVESTOR_RENT_DISB_BASIS',
8969                                             l_return_status,
8970                                             l_sty_id);
8971 
8972     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
8973     THEN
8974         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8975     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
8976     THEN
8977         RAISE OKL_API.G_EXCEPTION_ERROR;
8978     END IF;
8979 
8980     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8981       OPEN	l_undisb_rent_strm_pndg_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date);
8982       FETCH l_undisb_rent_strm_pndg_csr INTO l_undisb_rent_amount;
8983       CLOSE l_undisb_rent_strm_pndg_csr;
8984     ELSE
8985       OPEN	l_undisb_rent_stream_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date); -- gboomina bug 4775555 pass term date
8986       FETCH l_undisb_rent_stream_csr INTO l_undisb_rent_amount;
8987       CLOSE l_undisb_rent_stream_csr;
8988     END IF;
8989 
8990     -- this condition is included to prevent 'ORA-01476: divisor is equal to zero' error
8991     -- need to seed a new message
8992     IF l_unbill_rent_amount = 0 THEN
8993         l_result_amount := 0;
8994     ELSE
8995         l_result_amount := l_undisb_rent_amount/l_unbill_rent_amount;
8996     END IF;
8997 
8998  RETURN l_result_amount;
8999 
9000 EXCEPTION
9001 
9002 	WHEN OTHERS THEN
9003 
9004            -- Close open cursors
9005            IF l_unbill_stream_csr%ISOPEN THEN
9006 		CLOSE l_unbill_stream_csr;
9007            END IF;
9008            IF l_undisb_rent_stream_csr%ISOPEN THEN
9009            	CLOSE l_undisb_rent_stream_csr;
9010            END IF;
9011            IF l_unbill_stream_pending_csr%ISOPEN THEN
9012 		CLOSE l_unbill_stream_pending_csr;
9013            END IF;
9014            IF l_undisb_rent_strm_pndg_csr%ISOPEN THEN
9015 		CLOSE l_undisb_rent_strm_pndg_csr;
9016            END IF;
9017 	-- store SQL error message on message stack for caller
9018 	OKL_API.SET_MESSAGE (
9019 		p_app_name	=> OKL_API.G_APP_NAME,
9020 		p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
9021 		p_token1	=> 'SQLCODE',
9022 		p_token1_value	=> SQLCODE,
9023 		p_token2	=> 'SQLERRM',
9024 		p_token2_value	=> SQLERRM);
9025 
9026 		RETURN NULL;
9027 
9028 END investor_rent_factor;
9029 
9030 
9031 ------------------------------------------------------------------------------
9032   -- Start of Comments
9033   -- Created By:    Manjit Dokal - 18-JUL-2003
9034   -- Function Name: investor_rv_factor
9035   -- Description:   Calculate Investor Residual Value Factor
9036   -- Dependencies:  OKL building blocks AMTX and AMUV,
9037   -- Parameters:    IN:  p_contract_id, p_contract_line_id (optional)
9038   --                OUT: amount
9039   -- History        rmunjulu EDAT Changed to get all residual streams amount
9040   --              : PAGARG 19-Nov-2004 Bug# 4012614
9041   --              : Fetching the l_unbill_stream_csr value into correct variable
9042   --              : UDS impact and modified to use correct stream type purpose
9043   -- Version:       1.0
9044   -- End of Commnets
9045 ------------------------------------------------------------------------------
9046 
9047 FUNCTION investor_rv_factor (
9048 	p_contract_id		IN NUMBER,
9049 	p_contract_line_id	IN NUMBER)
9050 	RETURN NUMBER IS
9051 
9052     --Bug# 4012614 PAGARG modified the cursor for User Defined Streams Impact
9053 -- Get Residual Streams
9054 -- Get Residual Streams
9055 CURSOR l_unbill_stream_csr (
9056                                              cp_contract_id NUMBER,
9057                                              cp_contract_line_id NUMBER,
9058                                              cp_sty_id NUMBER) IS
9059 SELECT NVL(SUM (NVL (ste.amount, 0)), 0) amount_due
9060 FROM okl_streams stm,
9061            okl_strm_type_b sty,
9062            okl_strm_elements ste,
9063            okl_pool_contents pocb
9064 WHERE stm.khr_id = cp_contract_id
9065 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9066 AND stm.active_yn = 'Y'
9067 AND stm.say_code = 'CURR'
9068 AND	ste.stm_id	= stm.id
9069 AND ste.date_billed IS NULL
9070 AND	NVL (ste.amount, 0)	<> 0
9071 AND sty.id              = stm.sty_id
9072 AND sty.id              = cp_sty_id
9073 AND sty.billable_yn     = 'N'
9074 AND pocb.status_Code <> 'PENDING'
9075 AND pocb.khr_id = stm.khr_id
9076 AND pocb.kle_id = stm.kle_id
9077 AND pocb.sty_id = stm.sty_id;
9078 
9079 -- Get Residual Streams
9080 CURSOR l_unbill_stream_pending_csr (
9081                                              cp_contract_id NUMBER,
9082                                              cp_contract_line_id NUMBER,
9083                                              cp_sty_id NUMBER) IS
9084 SELECT NVL(SUM (NVL (ste.amount, 0)), 0) amount_due
9085 FROM okl_streams stm,
9086            okl_strm_type_b sty,
9087            okl_strm_elements ste,
9088            okl_pool_contents pocb
9089 WHERE stm.khr_id = cp_contract_id
9090 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9091 AND stm.active_yn = 'Y'
9092 AND stm.say_code = 'CURR'
9093 AND	ste.stm_id	= stm.id
9094 AND ste.date_billed IS NULL
9095 AND	NVL (ste.amount, 0)	<> 0
9096 AND sty.id              = stm.sty_id
9097 AND sty.id              = cp_sty_id
9098 AND sty.billable_yn     = 'N'
9099 AND pocb.status_Code = 'PENDING'
9100 AND pocb.khr_id = stm.khr_id
9101 AND pocb.kle_id = stm.kle_id
9102 AND pocb.sty_id = stm.sty_id;
9103 
9104 l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
9105 l_residual_amount	NUMBER		:= 0;
9106 l_result_amount		NUMBER		:= 0;
9107 l_sty_id            OKL_STRM_TYPE_TL.ID%TYPE := 0;
9108 l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
9109 
9110 BEGIN
9111 	-- ****************
9112 	-- Calculate result
9113 	-- ****************
9114     --PAGARG 19-Nov-2004 Bug# 4012614
9115     --UDS impact. Obtain stream type id and pass it to cursor
9116     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
9117                                             'RESIDUAL_VALUE',
9118                                             l_return_status,
9119                                             l_sty_id);
9120 
9121     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9122     THEN
9123         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9124     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9125     THEN
9126         RAISE OKL_API.G_EXCEPTION_ERROR;
9127     END IF;
9128 
9129     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
9130       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
9131       LOOP
9132         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
9133           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
9134         END IF;
9135       END LOOP;
9136      END IF;
9137 
9138     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9139       OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id, l_sty_id);
9140        FETCH l_unbill_stream_pending_csr INTO l_residual_amount;
9141        CLOSE l_unbill_stream_pending_csr;
9142     ELSE
9143     --PAGARG 19-Nov-2004 Bug# 4012614
9144     --Fetch cursor value into correct variable l_residual_amount
9145        OPEN	l_unbill_stream_csr (p_contract_id, p_contract_line_id, l_sty_id);
9146        FETCH	l_unbill_stream_csr INTO l_residual_amount;
9147        CLOSE	l_unbill_stream_csr;
9148       END IF;
9149 
9150     -- this condition is included to prevent 'ORA-01476: divisor is equal to zero' error
9151     -- need to seed a new message
9152     IF l_residual_amount = 0 THEN
9153         l_result_amount := 0;
9154     ELSE
9155         l_result_amount := l_residual_amount/l_residual_amount;
9156     END IF;
9157 
9158 	RETURN l_result_amount;
9159 
9160 EXCEPTION
9161 
9162 	WHEN OTHERS THEN
9163 
9164 		-- Close open cursors
9165 
9166 		IF l_unbill_stream_csr%ISOPEN THEN
9167 		   CLOSE l_unbill_stream_csr;
9168 		END IF;
9169 		IF l_unbill_stream_pending_csr%ISOPEN THEN
9170 		   CLOSE l_unbill_stream_pending_csr;
9171 		END IF;
9172 
9173 		-- store SQL error message on message stack for caller
9174 
9175 		OKL_API.SET_MESSAGE (
9176 			p_app_name	=> OKL_API.G_APP_NAME,
9177 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
9178 			p_token1	=> 'SQLCODE',
9179 			p_token1_value	=> SQLCODE,
9180 			p_token2	=> 'SQLERRM',
9181 			p_token2_value	=> SQLERRM);
9182 
9183 		RETURN NULL;
9184 
9185 END investor_rv_factor;
9186 
9187 
9188 ------------------------------------------------------------------------------
9189   -- Start of Comments
9190   -- Created By:    Sushil Deshpande
9191   -- Function Name: investor_loan_factor
9192   -- Description:   Calculate Investor Loan Factor
9193   -- Dependencies:  OKL building blocks AMTX and AMUV,
9194   -- Parameters:    IN:  p_contract_id, p_contract_line_id (optional)
9195   --                OUT: amount
9196   -- History
9197   -- Version:       1.0
9198   -- End of Commnets
9199 ------------------------------------------------------------------------------
9200 
9201  FUNCTION investor_loan_factor (
9202 	p_contract_id		IN NUMBER,
9203 	p_contract_line_id	IN NUMBER)
9204 	RETURN NUMBER IS
9205 
9206   CURSOR l_unbill_stream_csr (cp_contract_id NUMBER,
9207                               cp_contract_line_id NUMBER,
9208                               cp_date DATE,
9209                               cp_sty_id NUMBER) IS
9210   SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_due
9211   FROM okl_streams stm,
9212        okl_strm_type_b sty,
9213        okl_strm_elements ste
9214       ,okl_pool_contents pocb
9215   WHERE stm.khr_id      = cp_contract_id
9216   AND	stm.kle_id	= NVL(cp_contract_line_id, stm.kle_id)
9217   AND	stm.active_yn = 'Y'
9218   AND	stm.say_code = 'CURR'
9219   AND	ste.stm_id	= stm.id
9220   AND NVL (ste.amount, 0)	<> 0
9221   AND sty.id              = stm.sty_id
9222   AND sty.id              = cp_sty_id
9223   AND sty.billable_yn     = 'Y'
9224   AND ste.stream_element_date > cp_date -- rmunjulu EDAT
9225   AND pocb.status_Code <> 'PENDING'
9226   AND pocb.khr_id = stm.khr_id
9227   AND pocb.kle_id = stm.kle_id
9228   AND pocb.sty_id = stm.sty_id;
9229 
9230   -- Get Undisbursed Investor Rent Streams
9231   CURSOR l_undisb_rent_stream_csr (cp_contract_id NUMBER,
9232                                    cp_contract_line_id NUMBER,
9233                                    cp_sty_id NUMBER,
9234                                    cp_date  DATE) IS --gboomina bug 4775555
9235   SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_payable
9236   FROM okl_streams stm,
9237        okl_strm_type_b     sty,
9238        okl_strm_elements ste
9239        ,okl_pool_contents pocb
9240   WHERE stm.khr_id  = cp_contract_id
9241   AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9242   AND stm.active_yn = 'Y'
9243   AND stm.say_code= 'CURR'
9244   AND	ste.stm_id	= stm.id
9245   AND NVL (ste.amount, 0)	<> 0
9246   AND sty.id              = stm.sty_id
9247   AND sty.id              = cp_sty_id
9248   AND ste.stream_element_date > cp_date -- gboomina bug 4775555 -- check for disbs after termination
9249   AND pocb.status_Code <> 'PENDING'
9250   AND pocb.khr_id = stm.khr_id
9251   AND pocb.kle_id = stm.kle_id
9252   AND pocb.sty_id = stm.sty_id;
9253 
9254   CURSOR l_unbill_stream_pending_csr (cp_contract_id NUMBER,
9255                                       cp_contract_line_id NUMBER,
9256                                       cp_date DATE,
9257                                       cp_sty_id NUMBER) IS
9258   SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_due
9259   FROM okl_streams stm,
9260        okl_strm_type_b sty,
9261        okl_strm_elements ste,
9262        okl_pool_contents pocb
9263   WHERE stm.khr_id = cp_contract_id
9264   AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9265   AND stm.active_yn = 'Y'
9266   AND stm.say_code = 'CURR'
9267   AND ste.stm_id = stm.id
9268   AND NVL (ste.amount, 0) <> 0
9269   AND sty.id  = stm.sty_id
9270   AND sty.id              = cp_sty_id
9271   AND sty.billable_yn     = 'Y'
9272   AND ste.stream_element_date > cp_date
9273   AND pocb.status_Code = 'PENDING'
9274   AND pocb.khr_id = stm.khr_id
9275   AND pocb.kle_id = stm.kle_id
9276   AND pocb.sty_id = stm.sty_id;
9277 
9278   -- Get Undisbursed Investor Rent Streams
9279   CURSOR l_undisb_rent_strm_pndg_csr (cp_contract_id NUMBER,
9280                                       cp_contract_line_id NUMBER,
9281                                       cp_sty_id NUMBER,
9282                                       cp_date DATE) IS
9283   SELECT	NVL(SUM (NVL (ste.amount, 0)),0)  amount_payable
9284   FROM okl_streams stm,
9285        okl_strm_type_b sty,
9286        okl_strm_elements ste,
9287        okl_pool_contents pocb
9288   WHERE stm.khr_id = cp_contract_id
9289   AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9290   AND	stm.active_yn = 'Y'
9291   AND stm.say_code = 'CURR'
9292   AND	ste.stm_id = stm.id
9293   AND NVL (ste.amount, 0)	<> 0
9294   AND sty.id = stm.sty_id
9295   AND sty.id              = cp_sty_id
9296   AND ste.stream_element_date > cp_date
9297   AND pocb.status_Code = 'PENDING'
9298   AND pocb.khr_id = stm.khr_id
9299   AND pocb.kle_id = stm.kle_id
9300   AND pocb.sty_id = stm.sty_id;
9301 
9302 
9303   l_unbill_principal_amount	NUMBER	:= 0;
9304   l_unbill_interest_amount	NUMBER	:= 0;
9305   l_unbill_ppd_amount	        NUMBER	:= 0;
9306   l_unbill_loan_amount	    NUMBER	:= 0;
9307   l_undisb_principal_amount	NUMBER	:= 0;
9308   l_undisb_interest_amount	NUMBER	:= 0;
9309   l_undisb_ppd_amount	        NUMBER	:= 0;
9310   l_undisb_loan_amount	    NUMBER	:= 0;
9311   l_result_amount           NUMBER  := 0;
9312   l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
9313 
9314   -- rmunjulu EDAT
9315   CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
9316    SELECT trunc(qte.date_effective_from) date_effective_from
9317    FROM   okl_trx_quotes_b  qte
9318    WHERE  qte.id = p_quote_id;
9319 
9320   -- rmunjulu EDAT
9321   l_quote_id NUMBER;
9322   l_quote_date DATE;
9323   l_sysdate DATE;
9324   l_sty_id            OKL_STRM_TYPE_TL.ID%TYPE := 0;
9325   l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
9326   --06-Dec-2004 PAGARG Bug# 3948473 variable to store investor agreement id
9327   l_inv_agr_id    NUMBER;
9328   BEGIN
9329 	-- ****************
9330 	-- Calculate result
9331 	-- ****************
9332 	-- rmunjulu EDAT
9333     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
9334       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
9335       LOOP
9336         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
9337            l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
9338         --06-Dec-2004 PAGARG Bug# 3948473 obtain investor agreement id
9339         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'inv_agr_id' THEN
9340            l_inv_agr_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
9341         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
9342           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
9343         END IF;
9344       END LOOP;
9345     END IF;
9346 
9347     -- rmunjulu EDAT
9348     select sysdate into l_sysdate from dual;
9349 
9350     -- rmunjulu EDAT
9351 	IF  l_quote_id IS NOT NULL
9352 	AND l_quote_id <> OKL_API.G_MISS_NUM THEN
9353 
9354 	   FOR get_quote_date_rec IN get_quote_date_csr (l_quote_id) LOOP
9355 	      l_quote_date := get_quote_date_rec.date_effective_from;
9356 	   END LOOP;
9357     END IF;
9358 
9359 	-- rmunjulu EDAT
9360     IF l_quote_date IS NULL
9361     OR l_quote_date = OKL_API.G_MISS_DATE THEN
9362        l_quote_date := l_sysdate;
9363     END IF;
9364 
9365     --PAGARG 19-Nov-2004 Bug# 4012614
9366     --UDS impact. Obtain stream type id and pass it to cursor
9367     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
9368                                             'PRINCIPAL_PAYMENT',
9369                                             l_return_status,
9370                                             l_sty_id);
9371 
9372     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9373     THEN
9374         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9375     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9376     THEN
9377         RAISE OKL_API.G_EXCEPTION_ERROR;
9378     END IF;
9379 
9380     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9381        OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
9382        FETCH l_unbill_stream_pending_csr INTO l_unbill_principal_amount;
9383        CLOSE l_unbill_stream_pending_csr;
9384     ELSE
9385        OPEN l_unbill_stream_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
9386        FETCH l_unbill_stream_csr INTO l_unbill_principal_amount;
9387        CLOSE l_unbill_stream_csr;
9388     END IF;
9389 
9390     --PAGARG 19-Nov-2004 Bug# 4012614
9391     --UDS impact. Obtain stream type id and pass it to cursor
9392     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
9393                                             'INTEREST_PAYMENT',
9394                                             l_return_status,
9395                                             l_sty_id);
9396 
9397     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9398     THEN
9399         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9400     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9401     THEN
9402         RAISE OKL_API.G_EXCEPTION_ERROR;
9403     END IF;
9404 
9405     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9406        OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
9407        FETCH l_unbill_stream_pending_csr INTO l_unbill_interest_amount;
9408        CLOSE l_unbill_stream_pending_csr;
9409     ELSE
9410        OPEN l_unbill_stream_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
9411        FETCH l_unbill_stream_csr INTO l_unbill_interest_amount;
9412        CLOSE l_unbill_stream_csr;
9413     END IF;
9414 
9415     --PAGARG 19-Nov-2004 Bug# 4012614
9416     --UDS impact. Obtain stream type id and pass it to cursor
9417     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
9418                                             'UNSCHEDULED_PRINCIPAL_PAYMENT',
9419                                             l_return_status,
9420                                             l_sty_id);
9421 
9422     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9423     THEN
9424         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9425     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9426     THEN
9427         RAISE OKL_API.G_EXCEPTION_ERROR;
9428     END IF;
9429 
9430     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9431        OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
9432        FETCH l_unbill_stream_pending_csr INTO l_unbill_ppd_amount;
9433        CLOSE l_unbill_stream_pending_csr;
9434     ELSE
9435        OPEN l_unbill_stream_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
9436        FETCH l_unbill_stream_csr INTO l_unbill_ppd_amount;
9437        CLOSE l_unbill_stream_csr;
9438     END IF;
9439 
9440     --Calculate Total Unbilled Interest Amount
9441     l_unbill_loan_amount := l_unbill_principal_amount+l_unbill_interest_amount+l_unbill_ppd_amount;
9442 
9443    --06-Dec-2004 PAGARG Bug# 3948473 Pass investor agreement id to obtain stream id
9444     OKL_STREAMS_UTIL.get_primary_stream_type(l_inv_agr_id,
9445                                             'INVESTOR_PRINCIPAL_DISB_BASIS',
9446                                             l_return_status,
9447                                             l_sty_id);
9448 
9449     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9450     THEN
9451         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9452     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9453     THEN
9454         RAISE OKL_API.G_EXCEPTION_ERROR;
9455     END IF;
9456 
9457     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9458       OPEN	l_undisb_rent_strm_pndg_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date);
9459       FETCH l_undisb_rent_strm_pndg_csr INTO l_undisb_principal_amount;
9460       CLOSE l_undisb_rent_strm_pndg_csr;
9461     ELSE
9462       OPEN	l_undisb_rent_stream_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date); -- gboomina bug 4775555 pass term date
9463       FETCH l_undisb_rent_stream_csr INTO l_undisb_principal_amount;
9464       CLOSE l_undisb_rent_stream_csr;
9465     END IF;
9466 
9467     OKL_STREAMS_UTIL.get_primary_stream_type(l_inv_agr_id,
9468                                             'INVESTOR_INTEREST_DISB_BASIS',
9469                                             l_return_status,
9470                                             l_sty_id);
9471 
9472     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9473     THEN
9474         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9475     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9476     THEN
9477         RAISE OKL_API.G_EXCEPTION_ERROR;
9478     END IF;
9479 
9480     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9481       OPEN	l_undisb_rent_strm_pndg_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date);
9482       FETCH l_undisb_rent_strm_pndg_csr INTO l_undisb_interest_amount;
9483       CLOSE l_undisb_rent_strm_pndg_csr;
9484     ELSE
9485       OPEN	l_undisb_rent_stream_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date); -- gboomina bug 4775555 pass term date
9486       FETCH l_undisb_rent_stream_csr INTO l_undisb_interest_amount;
9487       CLOSE l_undisb_rent_stream_csr;
9488     END IF;
9489 
9490     OKL_STREAMS_UTIL.get_primary_stream_type(l_inv_agr_id,
9491                                             'INVESTOR_PPD_DISB_BASIS',
9492                                             l_return_status,
9493                                             l_sty_id);
9494 
9495     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9496     THEN
9497         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9498     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9499     THEN
9500         RAISE OKL_API.G_EXCEPTION_ERROR;
9501     END IF;
9502 
9503     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9504       OPEN	l_undisb_rent_strm_pndg_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date);
9505       FETCH l_undisb_rent_strm_pndg_csr INTO l_undisb_ppd_amount;
9506       CLOSE l_undisb_rent_strm_pndg_csr;
9507     ELSE
9508       OPEN	l_undisb_rent_stream_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date); -- gboomina bug 4775555 pass term date
9509       FETCH l_undisb_rent_stream_csr INTO l_undisb_ppd_amount;
9510       CLOSE l_undisb_rent_stream_csr;
9511     END IF;
9512 
9513     l_undisb_loan_amount := l_undisb_principal_amount + l_undisb_interest_amount+l_undisb_ppd_amount;
9514 
9515     -- this condition is included to prevent 'ORA-01476: divisor is equal to zero' error
9516     -- need to seed a new message
9517     IF l_unbill_loan_amount = 0 THEN
9518        l_result_amount := 0;
9519     ELSE
9520         l_result_amount := l_undisb_loan_amount/l_unbill_loan_amount;
9521     END IF;
9522 
9523  RETURN l_result_amount;
9524 
9525 EXCEPTION
9526 
9527 	WHEN OTHERS THEN
9528 		-- Close open cursors
9529 		IF l_unbill_stream_csr%ISOPEN THEN
9530 			CLOSE l_unbill_stream_csr;
9531 		END IF;
9532 		IF l_undisb_rent_stream_csr%ISOPEN THEN
9533 			CLOSE l_undisb_rent_stream_csr;
9534 		END IF;
9535 		IF l_unbill_stream_pending_csr%ISOPEN THEN
9536 			CLOSE l_unbill_stream_pending_csr;
9537 		END IF;
9538 		IF l_undisb_rent_strm_pndg_csr%ISOPEN THEN
9539 			CLOSE l_undisb_rent_strm_pndg_csr;
9540 		END IF;
9541 		-- store SQL error message on message stack for caller
9542 
9543 		OKL_API.SET_MESSAGE (
9544 			p_app_name	=> OKL_API.G_APP_NAME,
9545 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
9546 			p_token1	=> 'SQLCODE',
9547 			p_token1_value	=> SQLCODE,
9548 			p_token2	=> 'SQLERRM',
9549 			p_token2_value	=> SQLERRM);
9550 
9551 		RETURN NULL;
9552 
9553 END investor_loan_factor;
9554 
9555 
9556 -----------------------------------------------------
9557 --End Bug# 3143522 mdokal : 11.5.10 AM Securitization
9558 -----------------------------------------------------
9559 
9560 
9561 ------------------------------------------------------------------------------
9562   -- Start of Comments
9563   -- Created By:    Reeshma Kuttiyat - 15-SEP-2003
9564   -- Function Name: Net_Gain_Loss
9565   -- Description:   Returns the Net Gain Loss for a Termination Quote
9566   -- Dependencies:
9567   -- Parameters:    IN:  p_contract_id, p_contract_line_id ,p_additional_paams(quote_id)
9568   --                OUT: amount
9569   --                rmunjulu 3842101 changed for proper calculation
9570   --                rmunjulu 3900814
9571   -- Version:       1.0
9572   -- End of Commnets
9573 ------------------------------------------------------------------------------
9574 
9575 FUNCTION NET_GAIN_LOSS_QUOTE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
9576 
9577 --Cusor to obtain the asset line id
9578   CURSOR c_quote_asset_line(p_quote_id IN NUMBER) IS
9579   SELECT kle_id
9580   FROM OKL_TXL_QUOTE_LINES_B
9581   WHERE QTE_ID = p_quote_id
9582   AND QLT_CODE = 'AMCFIA';
9583 
9584 --Cusor to obtain the quote net investment
9585   CURSOR c_quote_net_invst_csr(p_quote_id IN NUMBER) IS
9586   SELECT asset_value net_investment
9587   FROM OKL_TRX_QUOTES_V qte
9588   WHERE qte.id = p_quote_id;
9589 
9590 --Cursor to obtain the total quote amount , excluding the billed quote lines
9591   CURSOR c_total_qt_amt(p_quote_id IN NUMBER) IS
9592   SELECT SUM(amount)
9593   FROM OKL_TXL_QUOTE_LINES_B
9594   WHERE qte_id = p_quote_id
9595   AND qlt_code NOT IN ('AMCFIA','AMCTAX', 'AMYOUB', 'AMCSDD'); -- rmunjulu 3842101 Added security deposit
9596 
9597  l_quote_id            NUMBER;
9598  l_net_gain_loss       NUMBER;
9599  l_total_qte_amt       NUMBER;
9600  l_total_invest        NUMBER := 0;
9601  l_line_asset_invest   NUMBER := 0 ;
9602  l_return_status       VARCHAR2(1);
9603  l_unbilled_rent       NUMBER;
9604  l_residual_value      NUMBER;
9605  l_unearned_income     NUMBER;
9606 
9607 BEGIN
9608 
9609   IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
9610      FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
9611      LOOP
9612        -- Start : PRASJAIN : Bug 6472724
9613        -- IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'QUOTE_ID' THEN
9614        IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
9615        -- End : PRASJAIN : Bug 6472724
9616           l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
9617        END IF;
9618      END LOOP;
9619   END IF;
9620 
9621 /* rmunjulu 3842101 get net investment from quote
9622   -- get the line asset investment by calling the formula engine
9623   FOR l_line IN c_quote_asset_line(l_quote_id)
9624   LOOP
9625 
9626     l_unbilled_rent    := line_unbilled_rent(p_khr_id,l_line.kle_id);
9627     l_residual_value   := line_residual_value(p_khr_id,l_line.kle_id);
9628     l_unearned_income  := line_unearned_income(p_khr_id,l_line.kle_id);
9629 
9630     l_line_asset_invest := l_unbilled_rent + l_residual_value -l_unearned_income;
9631 
9632 	l_total_invest := l_total_invest + l_line_asset_invest;
9633 
9634   END LOOP;
9635 */
9636   --get the total quote amount excluding billed quote lines
9637   OPEN c_total_qt_amt(l_quote_id);
9638   FETCH c_total_qt_amt INTO l_total_qte_amt;
9639     IF c_total_qt_amt%NOTFOUND THEN
9640        OKC_API.set_message( p_app_name      => 'OKC',
9641                             p_msg_name      => G_INVALID_VALUE,
9642                             p_token1        => G_COL_NAME_TOKEN,
9643                             p_token1_value  => 'KLE_ID');
9644        l_total_qte_amt := 0;
9645     END IF;
9646   CLOSE c_total_qt_amt;
9647 
9648   -- rmunjulu 3842101 added this code to get net investment from quote
9649   OPEN c_quote_net_invst_csr(l_quote_id);
9650   FETCH c_quote_net_invst_csr INTO l_total_invest;
9651   CLOSE c_quote_net_invst_csr;
9652 
9653   -- Net Gain/Loss = Total Quote Amount - Net Investment for quoted assets
9654   -- rmunjulu 3842101 added nvls or else values are being set with null and does not get calculated
9655   l_net_gain_loss := NVL(l_total_qte_amt,0) - NVL(l_total_invest,0);
9656 
9657   RETURN l_net_gain_loss;
9658 EXCEPTION
9659     WHEN OTHERS THEN
9660    -- Close open cursors
9661 
9662    IF c_total_qt_amt%ISOPEN THEN
9663      CLOSE c_total_qt_amt;
9664    END IF;
9665 
9666   -- store SQL error message on message stack for caller
9667 
9668    Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
9669                        p_msg_name      => 'OKL_UNEXPECTED_ERROR',
9670                        p_token1        => 'OKL_SQLCODE',
9671                        p_token1_value  => SQLCODE,
9672                        p_token2        => 'OKL_SQLERRM',
9673                        p_token2_value  => SQLERRM);
9674    RETURN NULL;
9675 END NET_GAIN_LOSS_QUOTE;
9676 
9677 
9678 --end rkuttiya
9679 
9680 ------------------------------------------------------------------------------
9681   -- Start of Comments
9682   -- Created By:    Manjit Dokal - 22-Oct-2003
9683   -- Function Name: contract_fee_amount
9684   -- Description:   Calculate Financed Fee during termination
9685   -- Dependencies:  OKL building blocks AMTX and AMUV,
9686   -- Parameters:    IN:  p_contract_id, p_contract_line_id (optional)
9687   --                     p_operand (required additional parameter)
9688   --                OUT: amount
9689   -- History       : 29-Aug-04 PAGARG Bug #3921591: Consider link fee assets
9690   --                 while calculating amount. Include link fee assets also
9691   --                 for both full and partial termination
9692   --                 p_contract_line_id is used to obtain asset id
9693   --               : rmunjulu EDAT Made changes so that only unbilled fees from
9694   --                 quote eff date onwards is calculated
9695   -- Version:       1.0
9696   -- End of Commnets
9697 ------------------------------------------------------------------------------
9698 FUNCTION contract_fee_amount (
9699 	p_contract_id		IN NUMBER,
9700 	p_contract_line_id	IN NUMBER)
9701 	RETURN NUMBER IS
9702 
9703 	CURSOR l_unbilled_fee_streams_csr (
9704 		cp_chr_id	NUMBER,
9705 		cp_fee_type	VARCHAR2,
9706 		cp_date DATE ) IS -- rmunjulu EDAT
9707 		SELECT	SUM(ste.amount)     amount
9708 	   	FROM	okl_streams			stm,
9709 			okl_strm_type_b			sty,
9710 			okc_k_lines_b			kle,
9711 			okc_statuses_b			kls,
9712 			okc_line_styles_b		lse,
9713             okl_strm_elements       ste,
9714             okl_k_lines             cle
9715 		WHERE	stm.khr_id			= cp_chr_id
9716 		AND	stm.active_yn			= 'Y'
9717 		AND	stm.say_code			= 'CURR'
9718         AND	ste.stm_id			    = stm.id
9719 		AND	sty.id			    	= stm.sty_id
9720 		AND	sty.billable_yn			= 'Y'
9721 		AND	kle.id			    	= stm.kle_id
9722 		AND	kls.code		    	= kle.sts_code
9723 		AND	kls.ste_code			= 'ACTIVE'
9724 		AND	lse.id			    	= kle.lse_id
9725         AND kle.id                  = cle.id
9726 		AND	lse.lty_code	        = 'FEE'
9727 		AND ste.date_billed         IS NULL -- rmunjulu EDAT
9728 		AND trunc(ste.stream_element_date) > trunc(cp_date) -- rmunjulu EDAT
9729         AND cle.fee_type            = cp_fee_type;
9730 
9731     --Bug #3921591: pagarg +++ Rollover +++++++ Start ++++++++++
9732     -- Following cursor finds the total payments with all the assets associated
9733     -- to the given fee type for the given contract. This cursor will be used in
9734     -- case of full termination along with the above cursor.
9735     CURSOR l_unbilled_feeassets_strms_csr(
9736 	        cp_chr_id   NUMBER,
9737 	        cp_fee_type VARCHAR2,
9738 		    cp_date DATE ) IS -- rmunjulu EDAT
9739         SELECT SUM(ste.amount)     amount
9740         FROM okl_streams         stm
9741             ,okl_strm_type_b    sty
9742             ,okc_k_lines_b      kle
9743             ,okc_statuses_b     kls
9744             ,okc_line_styles_b  lse
9745             ,okl_strm_elements  ste
9746             ,okl_k_lines        cle
9747             ,okc_k_lines_b      cles
9748         WHERE  stm.khr_id          = cp_chr_id
9749           AND  stm.active_yn       = 'Y'
9750           AND  stm.say_code        = 'CURR'
9751           AND  ste.stm_id          = stm.id
9752           AND  sty.id              = stm.sty_id
9753           AND  sty.billable_yn     = 'Y'
9754           AND  cles.id             = stm.kle_id
9755           AND  cles.cle_id         = kle.id
9756           AND  kls.code            = kle.sts_code
9757           AND  kls.ste_code        = 'ACTIVE'
9758           AND  lse.id              = cles.lse_id
9759           AND  kle.id              = cle.id
9760           AND  lse.lty_code        = 'LINK_FEE_ASSET'
9761    		  AND ste.date_billed         IS NULL -- rmunjulu EDAT
9762 		  AND trunc(ste.stream_element_date) > trunc(cp_date) -- rmunjulu EDAT
9763           AND  cle.fee_type        = cp_fee_type;
9764 
9765     -- Following cursor obtains the total payments of a given asset associated
9766     -- to the given fee of the given contract. This will used in case of partial
9767     -- termination when we are processing formula for each link fee asset.
9768     CURSOR l_unbilled_feeasset_strms_csr(
9769             cp_chr_id   NUMBER,
9770             cp_fee_type VARCHAR2,
9771             cp_asset_id   NUMBER,
9772 		    cp_date DATE ) IS -- rmunjulu EDAT
9773        SELECT SUM(ste.amount)     amount
9774        FROM   okl_streams         stm
9775              ,okl_strm_type_b    sty
9776              ,okc_k_lines_b      kle
9777              ,okc_statuses_b     kls
9778              ,okc_line_styles_b  lse
9779              ,okl_strm_elements  ste
9780              ,okl_k_lines        cle
9781              ,okc_k_lines_b      cles
9782              ,okc_k_items        cim
9783        WHERE  stm.khr_id          = cp_chr_id
9784          AND  stm.active_yn       = 'Y'
9785          AND  stm.say_code        = 'CURR'
9786          AND  ste.stm_id          = stm.id
9787          AND  sty.id              = stm.sty_id
9788          AND  sty.billable_yn     = 'Y'
9789          AND  cles.id             = stm.kle_id
9790          AND  lse.id              = cles.lse_id
9791          AND  lse.lty_code        = 'LINK_FEE_ASSET'
9792          AND  cles.cle_id         = kle.id
9793          AND  kls.code            = kle.sts_code
9794          AND  kls.ste_code        = 'ACTIVE'
9795          AND  kle.id              = cle.id
9796          AND  cle.fee_type        = cp_fee_type
9797          AND  cim.object1_id1     = cp_asset_id
9798 		 AND ste.date_billed         IS NULL -- rmunjulu EDAT
9799 		 AND trunc(ste.stream_element_date) > trunc(cp_date) -- rmunjulu EDAT
9800          AND  cim.cle_id          = cles.id;
9801     --Bug #3921591: pagarg +++ Rollover +++++++ End ++++++++++
9802         --mdokal assign fee type names to variables
9803         l_amafee          CONSTANT VARCHAR2(30)   := 'ABSORBED';
9804         l_amefee          CONSTANT VARCHAR2(30)   := 'EXPENSE';
9805         l_amffee          CONSTANT VARCHAR2(30)   := 'FINANCED';
9806         l_amgfee          CONSTANT VARCHAR2(30)   := 'GENERAL';
9807         l_amifee          CONSTANT VARCHAR2(30)   := 'INCOME';
9808         l_ammfee          CONSTANT VARCHAR2(30)   := 'MISCELLANEOUS';
9809         l_ampfee          CONSTANT VARCHAR2(30)   := 'PASSTHROUGH';
9810         l_amsfee          CONSTANT VARCHAR2(30)   := 'SECDEPOSIT';
9811         --Bug #3921591: pagarg +++ Rollover +++
9812         -- Constant for Rollover Fee
9813         l_amrfee          CONSTANT VARCHAR2(30)   := 'ROLLOVER';
9814 
9815         l_operand               VARCHAR2(30);
9816         l_fee_type              VARCHAR2(50);
9817         l_unbilled_fee_amount   NUMBER  := 0;
9818         --Bug #3921591: pagarg +++ Rollover +++
9819         -- Variable to store fee asset amount
9820         l_unbilled_fee_assets_amt  NUMBER  := 0;
9821 
9822         -- rmunjulu EDAT
9823         CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
9824         SELECT trunc(qte.date_effective_from) date_effective_from
9825         FROM   okl_trx_quotes_b  qte
9826         WHERE  qte.id = p_quote_id;
9827 
9828         -- rmunjulu EDAT
9829         l_quote_id NUMBER;
9830         l_quote_date DATE;
9831         l_sysdate DATE;
9832 BEGIN
9833 
9834    --Validate additional parameters availability
9835     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
9836       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
9837 	  LOOP
9838         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_operand' THEN
9839           l_operand := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
9840         END IF;
9841 
9842         -- rmunjulu EDAT -- get quote id
9843         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_id' THEN
9844           l_quote_id := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
9845         END IF;
9846       END LOOP;
9847 	ELSE
9848       Okl_Api.Set_Message(p_app_name     => G_APP_NAME,
9849                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
9850       RAISE OKL_API.G_EXCEPTION_ERROR;
9851 	END IF;
9852 
9853     -- Determine the fee type passed
9854 
9855     IF l_operand = 'AMAFEE' THEN
9856         l_fee_type := l_amafee;
9857     ELSIF l_operand = 'AMEFEE' THEN
9858         l_fee_type := l_amefee;
9859     ELSIF l_operand = 'AMFFEE' THEN
9860         l_fee_type := l_amffee;
9861     ELSIF l_operand = 'AMGFEE' THEN
9862         l_fee_type := l_amgfee;
9863     ELSIF l_operand = 'AMIFEE' THEN
9864         l_fee_type := l_amifee;
9865     ELSIF l_operand = 'AMMFEE' THEN
9866         l_fee_type := l_ammfee;
9867     ELSIF l_operand = 'AMPFEE' THEN
9868         l_fee_type := l_ampfee;
9869     ELSIF l_operand = 'AMSFEE' THEN
9870         l_fee_type := l_amsfee;
9871     --Bug #3921591: pagarg +++ Rollover +++
9872     -- Set the fee type based on operand value for Rollover
9873     ELSIF l_operand = 'AMRFEE' THEN
9874         l_fee_type := l_amrfee;
9875     END IF;
9876 
9877 	-- rmunjulu EDAT
9878 	select sysdate into l_sysdate from dual;
9879 
9880 	-- rmunjulu EDAT
9881 	IF  l_quote_id IS NOT NULL
9882 	AND l_quote_id <> OKL_API.G_MISS_NUM THEN
9883 
9884 	   FOR get_quote_date_rec IN get_quote_date_csr (l_quote_id) LOOP
9885 	      l_quote_date := get_quote_date_rec.date_effective_from;
9886 	   END LOOP;
9887     END IF;
9888 
9889 	-- rmunjulu EDAT
9890     IF l_quote_date IS NULL
9891     OR l_quote_date = OKL_API.G_MISS_DATE THEN
9892        l_quote_date := l_sysdate;
9893     END IF;
9894 	-- ****************
9895 	-- Calculate result
9896 	-- ****************
9897 	OPEN	l_unbilled_fee_streams_csr (p_contract_id, l_fee_type, l_quote_date); -- rmunjulu EDAT
9898 	FETCH	l_unbilled_fee_streams_csr INTO l_unbilled_fee_amount;
9899 	CLOSE	l_unbilled_fee_streams_csr;
9900     --Bug #3921591: pagarg +++ Rollover +++++++ Start ++++++++++
9901     -- Find the sum of all the asset level streams for a given fee if asset id is null
9902     -- else if asset id is not null then sum all the asset level streams for that asset
9903     -- for the given fee.
9904     -- p_contract_line_id stores the asset id
9905     IF p_contract_line_id is NULL or p_contract_line_id = OKL_API.G_MISS_NUM THEN
9906        -- Find the total payments of all the assets associated to the given
9907        -- fee type of given contract.
9908        OPEN   l_unbilled_feeassets_strms_csr (p_contract_id, l_fee_type, l_quote_date); -- rmunjulu EDAT
9909        FETCH  l_unbilled_feeassets_strms_csr INTO l_unbilled_fee_assets_amt;
9910        CLOSE  l_unbilled_feeassets_strms_csr;
9911        l_unbilled_fee_amount := NVL(l_unbilled_fee_amount, 0) + NVL(l_unbilled_fee_assets_amt, 0);
9912     ELSIF p_contract_line_id is NOT NULL THEN
9913        -- Find the total payments of given asset associated to the given
9914        -- fee type of given contract.
9915        OPEN	  l_unbilled_feeasset_strms_csr (p_contract_id, l_fee_type, p_contract_line_id, l_quote_date); -- rmunjulu EDAT
9916        FETCH  l_unbilled_feeasset_strms_csr INTO l_unbilled_fee_assets_amt;
9917        CLOSE  l_unbilled_feeasset_strms_csr;
9918        l_unbilled_fee_amount := NVL(l_unbilled_fee_assets_amt, 0);
9919 
9920     END IF;
9921     --Bug #3921591: pagarg +++ Rollover +++++++ End ++++++++++
9922 
9923 	RETURN l_unbilled_fee_amount;
9924 
9925 EXCEPTION
9926 	WHEN OTHERS THEN
9927 		-- Close open cursors
9928 		IF l_unbilled_fee_streams_csr%ISOPEN THEN
9929 			CLOSE l_unbilled_fee_streams_csr;
9930 		END IF;
9931 		-- store SQL error message on message stack for caller
9932 		OKL_API.SET_MESSAGE (
9933 			p_app_name	=> OKL_API.G_APP_NAME,
9934 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
9935 			p_token1	=> 'SQLCODE',
9936 			p_token1_value	=> SQLCODE,
9937 			p_token2	=> 'SQLERRM',
9938 			p_token2_value	=> SQLERRM);
9939 		RETURN NULL;
9940 END contract_fee_amount;
9941 -----------------------------------------------------
9942 --End Bug# 3061765 mdokal : 11.5.10 AM Financed Fees
9943 -----------------------------------------------------
9944 
9945 -- Bug# 3316994 start : 12-Jan-2004 cklee
9946 ------------------------------------------------------------------------------
9947   -- Start of Comments
9948   -- Created By:    13-Jan-2004 cklee
9949   -- Function Name: subsidy_amount
9950   -- Description:   demo subsidy amount formula function
9951   -- Dependencies:
9952   -- Parameters:    IN:  p_contract_id, p_contract_line_id (FREE_FORM1)
9953   --                OUT: amount
9954   -- Version:       1.0
9955   -- End of Commnets
9956 ------------------------------------------------------------------------------
9957  FUNCTION SUBSIDY_AMOUNT(
9958  p_contract_id                   IN NUMBER
9959  ,p_contract_line_id             IN NUMBER
9960  ) RETURN NUMBER
9961 IS
9962 
9963   l_amount          NUMBER;
9964 
9965 /* case not available
9966 CURSOR c_subsidy_amount(p_cle_id okc_k_lines_b.id%TYPE) IS
9967 select (case
9968         when ROUND(MONTHS_BETWEEN(chr.end_date, cle.start_date)) <= 12 then NVL(kle.oec,0) * .2
9969         else NVL(kle.oec,0) * .1
9970         end) subsidy_amount
9971 from okc_k_lines_b     cle,
9972      okl_k_lines       kle,
9973      okc_k_headers_b   chr
9974 where chr.id         = cle.dnz_chr_id
9975 and   kle.id         = cle.id
9976 and   cle.id         = p_cle_id -- FREE_FORM1 (FIN)
9977 ;
9978 */
9979 CURSOR c_subsidy_amount(p_cle_id okc_k_lines_b.id%TYPE) IS
9980 SELECT ROUND(MONTHS_BETWEEN(CHR.end_date, cle.start_date)) months,
9981        NVL(kle.oec,0) oec
9982 FROM okc_k_lines_b     cle,
9983      okl_k_lines       kle,
9984      okc_k_headers_b   CHR
9985 WHERE CHR.id         = cle.dnz_chr_id
9986 AND   kle.id         = cle.id
9987 AND   cle.id         = p_cle_id -- FREE_FORM1 (FIN)
9988 ;
9989 
9990   r_subsidy_amount c_subsidy_amount%ROWTYPE;
9991 
9992 
9993 BEGIN
9994 
9995   OPEN c_subsidy_amount (p_contract_line_id);
9996   FETCH c_subsidy_amount INTO r_subsidy_amount;
9997   CLOSE c_subsidy_amount;
9998 
9999   -- Bug 3487167
10000   IF r_subsidy_amount.months <= 12 THEN
10001     l_amount := r_subsidy_amount.oec * .02;
10002   ELSE
10003     l_amount := r_subsidy_amount.oec * .01;
10004   END IF;
10005 
10006   RETURN l_amount;
10007 
10008   EXCEPTION
10009     WHEN OTHERS THEN
10010       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10011       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10012                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10013                           p_token1        => 'OKL_SQLCODE',
10014                           p_token1_value  => SQLCODE,
10015                           p_token2        => 'OKL_SQLERRM',
10016                           p_token2_value  => SQLERRM);
10017       RETURN NULL;
10018 
10019 END SUBSIDY_AMOUNT;
10020 
10021 ------------------------------------------------------------------------------
10022   -- Start of Comments
10023   -- Created By:    13-Jan-2004 cklee
10024   -- Function Name: refund_subsidy
10025   -- Description:   refund subsidy amount if asset terminated
10026   -- Dependencies:
10027   -- Parameters:    IN:  p_contract_id, p_contract_line_id (FREE_FORM1)
10028   --                OUT: amount
10029   -- Version:       1.0
10030   -- End of Commnets
10031 ------------------------------------------------------------------------------
10032  FUNCTION REFUND_SUBSIDY(
10033  p_contract_id                   IN NUMBER
10034  ,p_contract_line_id             IN NUMBER
10035  ) RETURN NUMBER
10036 IS
10037 
10038   l_amount          NUMBER := 0;
10039   l_tot_amount      NUMBER := 0;
10040   l_return_status   VARCHAR2(1);
10041 
10042 CURSOR c_subsidy_lines(p_cle_id okc_k_lines_b.id%TYPE) IS
10043   SELECT sub.accounting_method_code,
10044          top_cle.date_terminated,
10045          --TO_NUMBER(sgn.value) sty_id
10046          sub_kle.sty_id sty_id, /* Bug 6353756 */
10047          top_cle.dnz_chr_id chr_id
10048 FROM --okl_sgn_translations sgn,
10049      okl_subsidies_b      sub,
10050      okl_k_lines          sub_kle,
10051      okc_k_lines_b        sub_cle,
10052      okc_k_lines_b        top_cle
10053 WHERE --sgn.jtot_object1_code = 'OKL_STRMTYP'
10054 --AND sgn.object1_id1         = TO_CHAR(sub_kle.sty_id) AND
10055 sub.id                  = sub_kle.subsidy_id
10056 AND sub_cle.cle_id          = top_cle.id
10057 AND sub_kle.id              = sub_cle.id
10058 AND sub_cle.cle_id          = p_cle_id -- FREE_FORM1
10059 ;
10060 
10061 CURSOR c_refund_subsidy(p_cle_id okc_k_lines_b.id%TYPE,
10062                         p_date_terminated okc_k_lines_b.date_terminated%TYPE,
10063                         p_sty_id okl_strm_type_b.id%TYPE) IS
10064   SELECT NVL(SUM(selb.amount),0)
10065 FROM
10066   okl_streams       stmb,
10067   okl_strm_elements selb
10068 WHERE stmb.id          = selb.stm_id
10069 AND stmb.say_code      = 'CURR'
10070 AND stmb.active_yn     = 'Y'
10071 AND selb.date_billed IS NULL
10072 AND TRUNC(selb.stream_element_date) > TRUNC(p_date_terminated)
10073 AND stmb.kle_id        = p_cle_id -- FREE_FORM1
10074 AND stmb.sty_id        = p_sty_id
10075 ;
10076 
10077     r_subsidy_line c_subsidy_lines%ROWTYPE;
10078     l_dependent_sty_id OKL_STRM_TYPE_B.ID%TYPE; -- Bug 6353756
10079 
10080 BEGIN
10081 
10082   FOR r_subsidy_line IN c_subsidy_lines(p_contract_line_id) LOOP
10083 
10084 --    CASE r_subsidy_line.accounting_method_code
10085 
10086 --      WHEN 'NET' THEN
10087       IF r_subsidy_line.accounting_method_code = 'NET' THEN
10088 
10089         l_tot_amount := l_tot_amount + 0; -- through funding
10090 
10091 --      WHEN 'AMORTIZE' THEN
10092       ELSIF r_subsidy_line.accounting_method_code = 'AMORTIZE' THEN
10093 
10094         IF (r_subsidy_line.date_terminated IS NOT NULL) THEN
10095 
10096           /* Bug 6353756 Get dependent stream type from r_subsidy_line.sty_id */
10097           okl_streams_util.get_dependent_stream_type(
10098               p_khr_id                => r_subsidy_line.chr_id,
10099               p_primary_sty_id        => r_subsidy_line.sty_id,
10100               p_dependent_sty_purpose => 'SUBSIDY_INCOME',
10101               x_return_status         => l_return_status,
10102               x_dependent_sty_id      => l_dependent_sty_id);
10103           IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
10104             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10105           ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
10106             RAISE OKL_API.G_EXCEPTION_ERROR;
10107           END IF;
10108 
10109           OPEN c_refund_subsidy(p_contract_line_id,
10110                                 r_subsidy_line.date_terminated,
10111                                 --r_subsidy_line.sty_id);
10112                                 l_dependent_sty_id); -- Bug 6353756
10113           FETCH c_refund_subsidy INTO l_amount;
10114           CLOSE c_refund_subsidy;
10115           l_tot_amount := l_tot_amount + l_amount;
10116 
10117         ELSE
10118           l_tot_amount := NULL; -- error
10119           OKL_API.Set_Message(p_app_name     => OKL_API.G_APP_NAME,
10120                               p_msg_name     => 'OKL_DATE_TERMINATED_REQUIRED');
10121 
10122           RAISE OKC_API.G_EXCEPTION_ERROR;
10123         END IF;
10124 
10125       ELSE -- error
10126         l_tot_amount := NULL;
10127         OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10128                             p_msg_name      => 'OKL_INVALID_ACCT_METHOD_CODE',
10129                             p_token2        => 'COL_NAME',
10130                             p_token2_value  => r_subsidy_line.accounting_method_code);
10131 
10132         RAISE OKC_API.G_EXCEPTION_ERROR;
10133 --    END CASE;
10134       END IF;
10135 
10136   END LOOP;
10137 
10138   RETURN l_tot_amount;
10139 
10140   EXCEPTION
10141     WHEN OTHERS THEN
10142       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10143       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10144                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10145                           p_token1        => 'OKL_SQLCODE',
10146                           p_token1_value  => SQLCODE,
10147                           p_token2        => 'OKL_SQLERRM',
10148                           p_token2_value  => SQLERRM);
10149       RETURN NULL;
10150 
10151 END REFUND_SUBSIDY;
10152 
10153 -- Bug# 3316994 end: 12-Jan-2004 cklee
10154 
10155 -- Fix Bug 3417313, dedey 01/29/2004
10156 ----------------------------------------------------------------------------------------------------
10157 
10158     -- Start of Comments
10159     -- Created By:    dedey
10160     -- Function Name: contract_pretaxinc_book
10161     -- Description:   Returns sum of all incomes of financial asset lines of a contract
10162     -- Dependencies:
10163     -- Parameters: contract id, line id
10164     -- Version: 1.0
10165     -- End of Commnets
10166 
10167 ----------------------------------------------------------------------------------------------------
10168   FUNCTION contract_pretaxinc_book(
10169                                    p_chr_id  IN  NUMBER
10170                                   ,p_kle_id  IN NUMBER
10171                                   )
10172   RETURN NUMBER  IS
10173 
10174     l_api_name		CONSTANT VARCHAR2(30) := 'CONTRACT_PRETAXINC_BOOK';
10175     l_api_version	CONSTANT NUMBER	      := 1;
10176     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
10177     x_msg_count         NUMBER;
10178     x_msg_data          VARCHAR2(256);
10179 
10180     l_income NUMBER := 0;
10181 
10182     CURSOR l_line_income_csr (p_chr_id NUMBER) IS
10183       SELECT NVL(str.link_hist_stream_id,-1) link_hist_stream_id,
10184              NVL(SUM(sele.amount),0) amount
10185       FROM okl_strm_elements sele,
10186            --okl_streams str, MGAAP 7263041
10187            okl_streams_rep_v str,
10188            okl_strm_type_v sty,
10189            okc_k_headers_b CHR,
10190            okc_statuses_b sts
10191       WHERE sele.stm_id      = str.id
10192       AND   str.sty_id       = sty.id
10193       --AND   UPPER(sty.name)  = 'PRE-TAX INCOME'
10194       AND   sty.stream_type_purpose  = 'LEASE_INCOME'
10195       AND   (NVL(str.purpose_code,'XXXX') = 'XXXX' OR
10196              NVL(str.purpose_code,'XXXX') = 'REPORT')
10197       AND   str.say_code     = 'CURR'
10198       AND   str.active_yn    = 'Y'
10199       AND   CHR.id           = p_chr_id
10200       AND   CHR.sts_code     = sts.code
10201       AND   CHR.id           = str.khr_id
10202       AND   sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
10203       GROUP BY str.link_hist_stream_id;
10204 
10205     CURSOR l_line_income_adj_csr (p_stm_id NUMBER) IS
10206     SELECT NVL(SUM(sele.amount),0) amount
10207     FROM   okl_strm_elements sele
10208     WHERE  stm_id = p_stm_id
10209     AND    NVL(accrued_yn,'N') = 'Y';
10210 
10211     l_line_income_amount NUMBER;
10212     l_income_adj_amount  NUMBER;
10213 
10214   BEGIN
10215 
10216       IF ( p_chr_id IS NULL ) THEN
10217           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
10218       END IF;
10219 
10220       l_line_income_amount := 0;
10221       FOR l_line_income_rec IN l_line_income_csr (p_chr_id)
10222       LOOP
10223          l_line_income_amount := NVL(l_line_income_amount,0) + l_line_income_rec.amount;
10224 
10225          IF (l_line_income_rec.link_hist_stream_id <> -1) THEN
10226             l_income_adj_amount := 0;
10227             OPEN l_line_income_adj_csr (l_line_income_rec.link_hist_stream_id);
10228             FETCH l_line_income_adj_csr INTO l_income_adj_amount;
10229             CLOSE l_line_income_adj_csr;
10230 
10231             l_line_income_amount := l_line_income_amount - NVL(l_income_adj_amount,0);
10232          END IF;
10233       END LOOP;
10234 
10235        l_income := l_line_income_amount;
10236 
10237       RETURN l_income;
10238 
10239 
10240     EXCEPTION
10241 
10242 	WHEN OTHERS THEN
10243                Okl_Api.SET_MESSAGE(
10244                         p_app_name     => G_APP_NAME,
10245                         p_msg_name     => G_UNEXPECTED_ERROR,
10246                         p_token1       => G_SQLCODE_TOKEN,
10247                         p_token1_value => SQLCODE,
10248                         p_token2       => G_SQLERRM_TOKEN,
10249                         p_token2_value => SQLERRM);
10250                 RETURN NULL;
10251 
10252 
10253   END contract_pretaxinc_book;
10254 
10255 ----------------------------------------------------------------------------------------------------
10256 
10257     -- Start of Comments
10258     -- Created By:    arun.jain
10259     -- Function Name: CONTRACT_FINANCED_FEE
10260     -- Description:   Returns the sum of Financed fee lines amount of a contract
10261     -- Dependencies:
10262     -- Parameters: contract id, line id
10263     -- Version: 1.0
10264     -- End of Commnets
10265 
10266 ----------------------------------------------------------------------------------------------------
10267   FUNCTION CONTRACT_FINANCED_FEE(
10268   p_dnz_chr_id         IN NUMBER
10269  ,p_kle_id             IN NUMBER
10270  ) RETURN NUMBER
10271 IS
10272 
10273 l_sum_financed_fee_amt  NUMBER;
10274 
10275 CURSOR sum_fin_fee_csr(l_dnz_chr_id okc_k_headers_b.id%TYPE) IS
10276 SELECT
10277   NVL(SUM(NVL(KLEB.amount,0)),0)
10278 FROM
10279   OKL_K_LINES KLEB,
10280   OKC_K_LINES_B CLEB,
10281   OKC_LINE_STYLES_B LSEB,
10282   okc_statuses_b sts
10283 WHERE
10284   KLEB.ID = CLEB.ID AND
10285   CLEB.LSE_ID = LSEB.ID AND
10286   LSEB.LTY_CODE = 'FEE' AND
10287   KLEB.FEE_TYPE IN ('FINANCED') AND
10288   CLEB.DNZ_CHR_ID = l_dnz_chr_id AND
10289   CLEB.sts_code = sts.code AND
10290   sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
10291 
10292 BEGIN
10293 
10294   OPEN sum_fin_fee_csr (p_dnz_chr_id);
10295   FETCH sum_fin_fee_csr INTO l_sum_financed_fee_amt;
10296   CLOSE sum_fin_fee_csr;
10297 
10298   RETURN l_sum_financed_fee_amt;
10299 
10300   EXCEPTION
10301     WHEN OTHERS THEN
10302       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10303       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10304                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10305                           p_token1        => 'OKL_SQLCODE',
10306                           p_token1_value  => SQLCODE,
10307                           p_token2        => 'OKL_SQLERRM',
10308                           p_token2_value  => SQLERRM);
10309       RETURN NULL;
10310 
10311 END CONTRACT_FINANCED_FEE;
10312 
10313 
10314 ----------------------------------------------------------------------------------------------------
10315 
10316     -- Start of Comments
10317     -- Created By:    arun.jain
10318     -- Function Name: CONTRACT_ABSORBED_FEE
10319     -- Description:   Returns the sum of Absorbed fee lines amount of a contract
10320     -- Dependencies:
10321     -- Parameters: contract id, line id
10322     -- Version: 1.0
10323     -- End of Commnets
10324 
10325 ----------------------------------------------------------------------------------------------------
10326   FUNCTION CONTRACT_ABSORBED_FEE(
10327   p_dnz_chr_id         IN NUMBER
10328  ,p_kle_id             IN NUMBER
10329  ) RETURN NUMBER
10330 IS
10331 
10332 l_sum_absorbed_fee_amt  NUMBER;
10333 
10334 CURSOR sum_abs_fee_csr(l_dnz_chr_id okc_k_headers_b.id%TYPE) IS
10335 SELECT
10336   NVL(SUM(NVL(KLEB.amount,0)),0)
10337 FROM
10338   OKL_K_LINES KLEB,
10339   OKC_K_LINES_B CLEB,
10340   OKC_LINE_STYLES_B LSEB,
10341   okc_statuses_b sts
10342 WHERE
10343   KLEB.ID = CLEB.ID AND
10344   CLEB.LSE_ID = LSEB.ID AND
10345   LSEB.LTY_CODE = 'FEE' AND
10346   KLEB.FEE_TYPE IN ('ABSORBED') AND
10347   CLEB.DNZ_CHR_ID = l_dnz_chr_id AND
10348   CLEB.sts_code = sts.code AND
10349   sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
10350 
10351 BEGIN
10352 
10353   OPEN sum_abs_fee_csr (p_dnz_chr_id);
10354   FETCH sum_abs_fee_csr INTO l_sum_absorbed_fee_amt;
10355   CLOSE sum_abs_fee_csr;
10356 
10357   RETURN l_sum_absorbed_fee_amt;
10358 
10359   EXCEPTION
10360     WHEN OTHERS THEN
10361       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10362       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10363                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10364                           p_token1        => 'OKL_SQLCODE',
10365                           p_token1_value  => SQLCODE,
10366                           p_token2        => 'OKL_SQLERRM',
10367                           p_token2_value  => SQLERRM);
10368       RETURN NULL;
10369 
10370 END CONTRACT_ABSORBED_FEE;
10371 
10372 ------------------------------------------------------------------------------
10373 -- Start of comments
10374 --
10375 -- Procedure Name  : credit_check
10376 -- Description     : Caculate total credit remaining
10377 --
10378 -- Business Rules  :
10379 -- Parameters      :IN: p_contract_id, OUT: amount
10380 -- Version         : 1.0
10381 -- History         :27-Aug-04 [email protected] -- Created
10382 --
10383 -- End of comments
10384 ------------------------------------------------------------------------------
10385 --START:           14-Feb-06 cklee    Fixed bug#5017158                             |
10386 /*|           14-Feb-06 cklee    Fixed bug#5017158                             |
10387  FUNCTION credit_check(
10388  p_contract_id                   IN NUMBER -- credit line contract id
10389  ,p_contract_line_id             IN NUMBER
10390  ) RETURN NUMBER
10391 IS
10392 
10393 CURSOR c_disb_tot IS
10394   SELECT TAP.AMOUNT,
10395          TAP.KHR_ID
10396 FROM   OKL_TRX_AP_INVOICES_B TAP
10397 WHERE  TAP.TRX_STATUS_CODE IN ('APPROVED','PROCESSED') -- push to AP
10398 AND    TAP.FUNDING_TYPE_CODE IS NOT NULL
10399 -- start: cklee - okl.h ER 05/25/2005
10400 AND    NOT EXISTS (SELECT 1
10401                    FROM   OKC_K_HEADERS_B KHR
10402                    WHERE  KHR.ID = TAP.KHR_ID
10403                    AND    ORIG_SYSTEM_SOURCE_CODE = 'OKL_LEASE_APP')
10404 -- end: cklee - okl.h ER 05/25/2005
10405 ;
10406 
10407 -- STRAT: cklee - bug#4655437 10/06/2005
10408 CURSOR c_principal_payments_tot IS
10409   SELECT TAR.AMOUNT,
10410          TAR.KHR_ID
10411 FROM   okl_cnsld_ar_strms_b TAR
10412 WHERE  TAR.receivables_invoice_id <> -99999
10413 AND    exists (SELECT STY.ID
10414                FROM   okl_strm_type_b STY
10415                WHERE  STY.STREAM_TYPE_PURPOSE = 'UNSCHEDULED_PRINCIPAL_PAYMENT'
10416                AND    STY.ID = TAR.STY_ID);
10417 
10418   l_payment_tot    NUMBER := 0;
10419 -- END: cklee - bug#4655437 10/06/2005
10420 
10421 
10422   l_amount_limit        NUMBER := 0;
10423   l_credit_remain       NUMBER := 0;
10424   l_disbursement_tot    NUMBER := 0;
10425 
10426   l_amount NUMBER := 0;
10427   x_return_status	     VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
10428   l_api_version       NUMBER	:= 1.0;
10429   x_msg_count		NUMBER;
10430   x_msg_data	     VARCHAR2(4000);
10431   l_init_msg_list     VARCHAR2(10) := OKL_API.G_FALSE;
10432 
10433 BEGIN
10434 
10435    FOR r_ast IN c_disb_tot LOOP
10436 
10437      IF (OKL_CREDIT_PUB.get_creditline_by_chrid(r_ast.KHR_ID) = p_contract_id) THEN
10438        l_disbursement_tot := l_disbursement_tot + NVL(r_ast.AMOUNT,0);
10439      END IF;
10440 
10441    END LOOP;
10442 
10443 -- START: cklee - bug#4655437 10/06/2005
10444    FOR r_pst IN c_principal_payments_tot LOOP
10445 
10446      IF (OKL_CREDIT_PUB.get_creditline_by_chrid(r_pst.KHR_ID) = p_contract_id) THEN
10447        l_payment_tot := l_payment_tot + NVL(r_pst.AMOUNT,0);
10448      END IF;
10449 
10450    END LOOP;
10451 -- END: cklee - bug#4655437 10/06/2005
10452 
10453    l_credit_remain := NVL(creditline_total_limit(p_contract_id),0) - l_disbursement_tot
10454 -- START: cklee - bug#4655437 10/06/2005
10455     + l_payment_tot;
10456 -- END: cklee - bug#4655437 10/06/2005
10457 
10458   RETURN l_credit_remain;
10459 
10460   EXCEPTION
10461     WHEN OTHERS THEN
10462       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10463       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10464                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10465                           p_token1        => 'OKL_SQLCODE',
10466                           p_token1_value  => SQLCODE,
10467                           p_token2        => 'OKL_SQLERRM',
10468                           p_token2_value  => SQLERRM);
10469       RETURN NULL;
10470 
10471 END;
10472 */
10473  FUNCTION credit_check(
10474  p_contract_id                   IN NUMBER -- credit line contract id
10475  ,p_contract_line_id             IN NUMBER
10476  ) RETURN NUMBER
10477 IS
10478 
10479 -- sjalasut, modified the cursor to have khr_id referred from okl_txl_ap_inv_lns_all_b
10480 -- changes made as part of OKLR12B disbursements project.
10481 -- cklee : 09/21/2007 restored the khr_id back to okl_trx_ap_invs_all_b
10482 -- reason: 1. line.khr_id will be always = header.khr_id
10483 --         2. the modified code will multiply the header amount if mutliple lines found
10484 
10485 CURSOR c_disb_tot(p_credit_id number) IS
10486   SELECT NVL(SUM(TAP.AMOUNT),0)
10487 FROM   OKL_TRX_AP_INVOICES_B TAP,
10488 --       okl_txl_ap_inv_lns_all_b tpl,
10489        (
10490   select gov.dnz_chr_id chr_id,
10491          crd.ID credit_id
10492   from   OKC_K_HEADERS_B crd,
10493          okc_Governances gov
10494   where  crd.id = gov.chr_id_referred
10495   and    crd.sts_code = 'ACTIVE'
10496   and    crd.scs_code = 'CREDITLINE_CONTRACT'
10497 union
10498   select mla_g.dnz_chr_id chr_id,
10499          crd.ID credit_id
10500   from   OKC_K_HEADERS_B crd,
10501          okc_Governances gov,
10502          OKC_K_HEADERS_B mla,
10503          okc_Governances mla_g
10504   where  crd.id         = gov.chr_id_referred
10505   and    crd.sts_code   = 'ACTIVE'
10506   and    crd.scs_code   = 'CREDITLINE_CONTRACT'
10507   and    gov.dnz_chr_id = mla.id
10508   and    mla.id         = mla_g.chr_id_referred
10509   and    mla.scs_code   = 'MASTER_LEASE'
10510        ) ccg
10511 --WHERE  TAP.id = TPL.tap_id
10512    where ccg.chr_id       = Tap.KHR_ID
10513 AND    ccg.credit_id    = p_credit_id
10514 AND    TAP.TRX_STATUS_CODE IN ('APPROVED','PROCESSED') -- push to AP
10515 AND    TAP.FUNDING_TYPE_CODE IS NOT NULL
10516 AND    NOT EXISTS (SELECT 1
10517                    FROM   OKC_K_HEADERS_B KHR
10518                    WHERE  KHR.ID = tap.KHR_ID
10519                    AND    ORIG_SYSTEM_SOURCE_CODE = 'OKL_LEASE_APP')
10520 ;
10521 
10522 /* ankushar, modified the cursor to replace reference to okl_cnsld_ar_strms_b
10523    OKL R12B billing changes
10524 */
10525 CURSOR c_principal_payments_tot(p_credit_id number) IS
10526   SELECT NVL(SUM(ARL.AMOUNT),0)
10527   FROM  okl_bpd_ar_inv_lines_v ARL,
10528        (
10529   select gov.dnz_chr_id chr_id,
10530          crd.ID credit_id
10531   from   OKC_K_HEADERS_B crd,
10532          okc_Governances gov
10533   where  crd.id = gov.chr_id_referred
10534   and    crd.sts_code = 'ACTIVE'
10535   and    crd.scs_code = 'CREDITLINE_CONTRACT'
10536 union
10537   select mla_g.dnz_chr_id chr_id,
10538          crd.ID credit_id
10539   from   OKC_K_HEADERS_B crd,
10540          okc_Governances gov,
10541          OKC_K_HEADERS_B mla,
10542          okc_Governances mla_g
10543   where  crd.id         = gov.chr_id_referred
10544   and    crd.sts_code   = 'ACTIVE'
10545   and    crd.scs_code   = 'CREDITLINE_CONTRACT'
10546   and    gov.dnz_chr_id = mla.id
10547   and    mla.id         = mla_g.chr_id_referred
10548   and    mla.scs_code   = 'MASTER_LEASE'
10549        ) ccg
10550 WHERE  ccg.chr_id = ARL.CONTRACT_ID
10551 AND    ccg.credit_id    = p_credit_id
10552 AND    ARL.receivables_invoice_id <> -99999
10553 AND    ARL.interface_line_context = 'OKL_CONTRACTS'
10554 AND    exists (SELECT STY.ID
10555                FROM   okl_strm_type_b STY
10556                WHERE  STY.STREAM_TYPE_PURPOSE = 'UNSCHEDULED_PRINCIPAL_PAYMENT'
10557                AND    STY.ID = ARL.STY_ID);
10558 
10559   l_payment_tot         NUMBER := 0;
10560   l_credit_remain       NUMBER := 0;
10561   l_disbursement_tot    NUMBER := 0;
10562 
10563 BEGIN
10564 
10565    open c_disb_tot(p_contract_id);
10566    fetch c_disb_tot into l_disbursement_tot;
10567    close c_disb_tot;
10568 
10569    open c_principal_payments_tot(p_contract_id);
10570    fetch c_principal_payments_tot into l_payment_tot;
10571    close c_principal_payments_tot;
10572 
10573    l_credit_remain := NVL(creditline_total_limit(p_contract_id),0) - l_disbursement_tot + l_payment_tot;
10574 
10575   RETURN l_credit_remain;
10576 
10577   EXCEPTION
10578     WHEN OTHERS THEN
10579       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10580       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10581                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10582                           p_token1        => 'OKL_SQLCODE',
10583                           p_token1_value  => SQLCODE,
10584                           p_token2        => 'OKL_SQLERRM',
10585                           p_token2_value  => SQLERRM);
10586       RETURN NULL;
10587 
10588 END;
10589 --END:|           14-Feb-06 cklee    Fixed bug#5017158                             |
10590 
10591 --------------------------------------------------------------------------------
10592 
10593 -- STRAT: cklee - bug#4655437 10/06/2005
10594 ------------------------------------------------------------------------------
10595 -- Start of comments
10596 --
10597 -- Procedure Name  : tot_credit_funding_pmt
10598 -- Description     : Caculate total credit funding payments
10599 --
10600 -- Business Rules  :
10601 -- Parameters      :IN: p_contract_id, OUT: amount
10602 -- Version         : 1.0
10603 -- History         :07-Oct-05 [email protected] -- Created
10604 --
10605 -- End of comments
10606 ------------------------------------------------------------------------------
10607  FUNCTION tot_credit_funding_pmt(
10608  p_contract_id                   IN NUMBER -- credit line contract id
10609  ,p_contract_line_id             IN NUMBER
10610  ) RETURN NUMBER
10611 IS
10612 -- sjalasut, modified the cursor to include khr_id from the okl_Txl_ap_inv_lns_all_b
10613 -- changes made as part of OKLR12B disbursements project
10614 /*
10615 CURSOR c_disb_tot IS
10616 SELECT TAP.AMOUNT,
10617        TPL.KHR_ID
10618 FROM   OKL_TRX_AP_INVOICES_B TAP
10619       ,OKL_TXL_AP_INV_LNS_ALL_B TPL
10620 WHERE TAP.ID = TPL.TAP_ID
10621   AND TAP.TRX_STATUS_CODE IN ('APPROVED','PROCESSED') -- push to AP
10622   AND TAP.FUNDING_TYPE_CODE IS NOT NULL
10623 -- start: cklee - okl.h ER 05/25/2005
10624 AND    NOT EXISTS (SELECT 1
10625                    FROM   OKC_K_HEADERS_B KHR
10626                    WHERE  KHR.ID = TPL.KHR_ID
10627                    AND    ORIG_SYSTEM_SOURCE_CODE = 'OKL_LEASE_APP')
10628 -- end: cklee - okl.h ER 05/25/2005
10629 ;
10630 */
10631 -- cklee : 09/20/2007 change khr_id refer back to okl_trx_ap_invs_all_b instead
10632 -- reason: 1. The modified code will return duplicated header amount
10633 --         2. line.khr_id will be always = header.khr_id
10634 
10635 CURSOR c_disb_tot IS
10636 SELECT TAP.AMOUNT,
10637        TAP.KHR_ID
10638 FROM   OKL_TRX_AP_INVOICES_B TAP
10639   where TAP.TRX_STATUS_CODE IN ('APPROVED','PROCESSED') -- push to AP
10640   AND TAP.FUNDING_TYPE_CODE IS NOT NULL
10641 -- start: cklee - okl.h ER 05/25/2005
10642 AND    NOT EXISTS (SELECT 1
10643                    FROM   OKC_K_HEADERS_B KHR
10644                    WHERE  KHR.ID = tap.KHR_ID
10645                    AND    ORIG_SYSTEM_SOURCE_CODE = 'OKL_LEASE_APP')
10646 ;
10647 -- end: cklee - okl.h ER 05/25/2005
10648 
10649   l_amount_limit        NUMBER := 0;
10650   l_credit_remain       NUMBER := 0;
10651   l_disbursement_tot    NUMBER := 0;
10652 
10653   l_amount NUMBER := 0;
10654   x_return_status	     VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
10655   l_api_version       NUMBER	:= 1.0;
10656   x_msg_count		NUMBER;
10657   x_msg_data	     VARCHAR2(4000);
10658   l_init_msg_list     VARCHAR2(10) := OKL_API.G_FALSE;
10659 
10660 BEGIN
10661 
10662    FOR r_ast IN c_disb_tot LOOP
10663 
10664      IF (OKL_CREDIT_PUB.get_creditline_by_chrid(r_ast.KHR_ID) = p_contract_id) THEN
10665        l_disbursement_tot := l_disbursement_tot + NVL(r_ast.AMOUNT,0);
10666      END IF;
10667 
10668    END LOOP;
10669 
10670   RETURN l_disbursement_tot;
10671 
10672   EXCEPTION
10673     WHEN OTHERS THEN
10674       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10675       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10676                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10677                           p_token1        => 'OKL_SQLCODE',
10678                           p_token1_value  => SQLCODE,
10679                           p_token2        => 'OKL_SQLERRM',
10680                           p_token2_value  => SQLERRM);
10681       RETURN NULL;
10682 
10683 END;
10684 
10685 ------------------------------------------------------------------------------
10686 -- Start of comments
10687 --
10688 -- Procedure Name  : tot_credit_principal_pmt
10689 -- Description     : Caculate total credit principal payments
10690 --
10691 -- Business Rules  :
10692 -- Parameters      :IN: p_contract_id, OUT: amount
10693 -- Version         : 1.0
10694 -- History         :07-Oct-05 [email protected] -- Created
10695 --
10696 -- End of comments
10697 ------------------------------------------------------------------------------
10698  FUNCTION tot_credit_principal_pmt(
10699  p_contract_id                   IN NUMBER -- credit line contract id
10700  ,p_contract_line_id             IN NUMBER
10701  ) RETURN NUMBER
10702 IS
10703 
10704  /* ankushar 09-Feb-2007 OKL R12B Billing enhancement
10705     Replaced reference of okl_cnsld_ar_strms_b with Billing Util API call
10706     start changes
10707  */
10708     --Initialize standard API parameters
10709     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
10710     x_msg_count         NUMBER;
10711     x_msg_data          VARCHAR2(256);
10712 
10713     -- Intialize contract_invoice_tbl variable
10714     x_contract_invoice_tbl OKL_BILLING_UTIL_PVT.contract_invoice_tbl;
10715  /* ankushar end changes */
10716 
10717   l_payment_tot    NUMBER := 0;
10718   i                NUMBER;
10719 
10720 
10721 BEGIN
10722 
10723   -- Call to the Billing Util API replacing reference to okl_cnsld_ar_strms_b
10724    OKL_BILLING_UTIL_PVT.INVOICE_AMOUNT_FOR_STREAM(
10725                         p_api_version              =>  1.0
10726                        ,p_init_msg_list            =>  OKL_API.G_FALSE
10727                        ,x_return_status            =>  x_return_status
10728                        ,x_msg_count                =>  x_msg_count
10729                        ,x_msg_data                 =>  x_msg_data
10730                        ,p_stream_purpose           =>  'UNSCHEDULED_PRINCIPAL_PAYMENT'
10731                        ,x_contract_invoice_tbl     =>  x_contract_invoice_tbl);
10732 
10733    --rkuttiya added for bug 6313562
10734    IF x_contract_invoice_tbl.count > 0 THEN
10735      i := x_contract_invoice_tbl.FIRST;
10736      LOOP
10737         IF (OKL_CREDIT_PUB.get_creditline_by_chrid(x_contract_invoice_tbl(i).KHR_ID) = p_contract_id) THEN
10738            l_payment_tot := l_payment_tot + NVL(x_contract_invoice_tbl(i).AMOUNT, 0);
10739         END IF;
10740         EXIT WHEN i = x_contract_invoice_tbl.LAST;
10741         i := x_contract_invoice_tbl.NEXT(i);
10742      END LOOP;
10743    END IF;
10744 
10745  /* ankushar end changes */
10746   RETURN l_payment_tot;
10747 
10748   EXCEPTION
10749     WHEN OTHERS THEN
10750       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10751       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10752                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10753                           p_token1        => 'OKL_SQLCODE',
10754                           p_token1_value  => SQLCODE,
10755                           p_token2        => 'OKL_SQLERRM',
10756                           p_token2_value  => SQLERRM);
10757       RETURN NULL;
10758 
10759 END;
10760 --------------------------------------------------------------------------------
10761 -- END: cklee - bug#4655437 10/06/2005
10762 
10763 
10764 --Bug# 3872534: start
10765 --------------------------------------------------------------------------------
10766 
10767     -- Start of Comments
10768     -- Created By:    Rekha Pillay (rpillay)
10769     -- Function Name: line_asset_cost
10770     -- Description:   Returns the current cost of an asset in its Corporate Book
10771     --                from Oracle Assets
10772     -- Dependencies:
10773     -- Parameters: contract id, line id
10774     -- Version: 1.0
10775     -- End of Comments
10776 
10777 --------------------------------------------------------------------------------
10778   FUNCTION line_asset_cost(
10779                             p_contract_id       IN NUMBER
10780                            ,p_contract_line_id  IN NUMBER
10781                           )
10782   RETURN NUMBER  IS
10783 
10784     l_api_name          CONSTANT VARCHAR2(30) := 'LINE_ASSET_COST';
10785     l_api_version       CONSTANT NUMBER	      := 1;
10786     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
10787     x_msg_count         NUMBER;
10788     x_msg_data          VARCHAR2(256);
10789 
10790     l_asset_hdr_rec            FA_API_TYPES.asset_hdr_rec_type;
10791     l_asset_fin_rec            FA_API_TYPES.asset_fin_rec_type;
10792 
10793     l_converted_amount         NUMBER;
10794     l_contract_start_date      DATE;
10795     l_contract_currency        OKL_K_HEADERS_FULL_V.currency_code%TYPE;
10796     l_currency_conversion_type OKL_K_HEADERS_FULL_V.currency_conversion_type%TYPE;
10797     l_currency_conversion_rate OKL_K_HEADERS_FULL_V.currency_conversion_rate%TYPE;
10798     l_currency_conversion_date OKL_K_HEADERS_FULL_V.currency_conversion_date%TYPE;
10799 
10800     -- Bug# 4061058:
10801     -- Changes to ensure that the query works for Release Asset
10802     -- and Release Contract
10803     CURSOR l_asset_csr(p_chr_id  IN NUMBER
10804                       ,p_cle_id  IN NUMBER
10805                       ,p_book_class  IN VARCHAR2
10806                       ,p_book_type_code  IN VARCHAR2) IS
10807     SELECT fab.asset_id,
10808            fab.book_type_code
10809     FROM okc_k_lines_v fin_ast_cle,
10810          okc_statuses_b stsb,
10811          fa_additions fad,
10812          fa_book_controls fbc,
10813          fa_books fab
10814     WHERE fin_ast_cle.id = p_cle_id
10815     AND   fin_ast_cle.dnz_chr_id = p_chr_id
10816     AND   fin_ast_cle.chr_id = p_chr_id
10817     AND   fin_ast_cle.sts_code = stsb.code
10818     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED')
10819     AND   fad.asset_number = fin_ast_cle.name
10820     AND   fab.asset_id = fad.asset_id
10821     AND   fab.book_type_code = fbc.book_type_code
10822     AND   fab.transaction_header_id_out IS NULL
10823     --AND   fbc.book_class = 'CORPORATE'
10824     AND   fbc.book_class = p_book_class
10825     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
10826 
10827     l_asset_rec  l_asset_csr%ROWTYPE;
10828 
10829     -- Bug# 4061058:
10830     -- Changes to ensure that the query works for Release Asset
10831     -- and Release Contract
10832     CURSOR l_asset_csr_incl_terminated
10833                            (p_chr_id  IN NUMBER
10834                            ,p_cle_id  IN NUMBER
10835                            ,p_book_class  IN VARCHAR2
10836                            ,p_book_type_code  IN VARCHAR2) IS
10837     SELECT fab.asset_id,
10838            fab.book_type_code
10839     FROM okc_k_lines_v fin_ast_cle,
10840          okc_statuses_b stsb,
10841          fa_additions fad,
10842          fa_book_controls fbc,
10843          fa_books fab
10844     WHERE fin_ast_cle.id = p_cle_id
10845     AND   fin_ast_cle.dnz_chr_id = p_chr_id
10846     AND   fin_ast_cle.chr_id = p_chr_id
10847     AND   fin_ast_cle.sts_code = stsb.code
10848     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED')
10849     AND   fad.asset_number = fin_ast_cle.name
10850     AND   fab.asset_id = fad.asset_id
10851     AND   fab.book_type_code = fbc.book_type_code
10852     AND   fab.transaction_header_id_out IS NULL
10853     --AND   fbc.book_class = 'CORPORATE'
10854     AND   fbc.book_class = p_book_class
10855     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
10856 
10857     CURSOR contract_start_date_csr(p_chr_id NUMBER) IS
10858     SELECT start_date
10859     FROM okc_k_headers_b
10860     WHERE id = p_chr_id;
10861 
10862     l_discount_incl_terminated BOOLEAN := FALSE;
10863     l_streams_repo_policy VARCHAR2(80); -- MGAAP 7263041
10864     l_book_class FA_BOOK_CONTROLS.BOOK_CLASS%TYPE;
10865     l_book_type_code FA_BOOK_CONTROLS.BOOK_TYPE_CODE%TYPE;
10866   BEGIN
10867 
10868       IF (( p_contract_id IS NULL ) OR ( p_contract_line_id IS NULL )) THEN
10869           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
10870       END IF;
10871 
10872       l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
10873       l_book_type_code := NULL;
10874       IF (l_streams_repo_policy = 'PRIMARY') THEN
10875         l_book_class := 'CORPORATE';
10876       ELSE
10877         l_book_class := 'TAX';
10878         l_book_type_code := OKL_ACCOUNTING_UTIL.get_fa_reporting_book(
10879                               p_kle_id => p_contract_line_id);
10880       END IF;
10881            -- rmunjulu 4042892
10882     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
10883       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
10884 	  LOOP
10885         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
10886           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
10887 		  l_discount_incl_terminated := TRUE;
10888         END IF;
10889       END LOOP;
10890     END IF;
10891 
10892 
10893       --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
10894         --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
10895         --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
10896 
10897       IF l_discount_incl_terminated THEN
10898           OPEN  l_asset_csr_incl_terminated(p_chr_id => p_contract_id,
10899                                             p_cle_id => p_contract_line_id,
10900                                             p_book_class => l_book_class,
10901                                             p_book_type_code => l_book_type_code);
10902           FETCH l_asset_csr_incl_terminated INTO l_asset_rec;
10903           IF( l_asset_csr_incl_terminated%NOTFOUND ) THEN
10904             CLOSE l_asset_csr_incl_terminated;
10905             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
10906           END IF;
10907           CLOSE l_asset_csr_incl_terminated;
10908       ELSE
10909           OPEN  l_asset_csr(p_chr_id => p_contract_id,
10910                             p_cle_id => p_contract_line_id,
10911                             p_book_class => l_book_class,
10912                             p_book_type_code => l_book_type_code);
10913           FETCH l_asset_csr INTO l_asset_rec;
10914           IF( l_asset_csr%NOTFOUND ) THEN
10915              CLOSE l_asset_csr;
10916              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
10917           END IF;
10918           CLOSE l_asset_csr;
10919       END IF;
10920 
10921       l_asset_hdr_rec.asset_id          := l_asset_rec.asset_id;
10922       l_asset_hdr_rec.book_type_code    := l_asset_rec.book_type_code;
10923 
10924       IF NOT fa_cache_pkg.fazcbc(x_book => l_asset_hdr_rec.book_type_code) THEN
10925         OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
10926                             p_msg_name     => 'OKL_LLA_FA_CACHE_ERROR'
10927                            );
10928         RAISE OKL_API.G_EXCEPTION_ERROR;
10929       END IF;
10930 
10931       -- To fetch Asset Current Cost
10932       IF NOT FA_UTIL_PVT.get_asset_fin_rec
10933               (p_asset_hdr_rec         => l_asset_hdr_rec,
10934                px_asset_fin_rec        => l_asset_fin_rec,
10935                p_transaction_header_id => NULL,
10936                p_mrc_sob_type_code     => 'P'
10937               ) THEN
10938 
10939         OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
10940                             p_msg_name     => 'OKL_LLA_FA_ASSET_FIN_REC_ERROR'
10941                            );
10942         RAISE OKL_API.G_EXCEPTION_ERROR;
10943       END IF;
10944 
10945       -- convert amount into contract currency
10946       OPEN contract_start_date_csr(p_chr_id => p_contract_id);
10947       FETCH contract_start_date_csr INTO l_contract_start_date;
10948       CLOSE contract_start_date_csr;
10949 
10950       l_converted_amount := 0;
10951       OKL_ACCOUNTING_UTIL.CONVERT_TO_CONTRACT_CURRENCY(
10952         p_khr_id                   => p_contract_id,
10953         p_from_currency            => NULL,
10954         p_transaction_date         => l_contract_start_date,
10955         p_amount                   => l_asset_fin_rec.cost,
10956         x_return_status            => x_return_status,
10957         x_contract_currency        => l_contract_currency,
10958         x_currency_conversion_type => l_currency_conversion_type,
10959         x_currency_conversion_rate => l_currency_conversion_rate,
10960         x_currency_conversion_date => l_currency_conversion_date,
10961         x_converted_amount         => l_converted_amount);
10962 
10963       IF(x_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
10964         Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
10965                             p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
10966         RAISE Okl_Api.G_EXCEPTION_ERROR;
10967       END IF;
10968 
10969       RETURN l_converted_amount;
10970 
10971     EXCEPTION
10972 
10973       WHEN OKL_API.G_EXCEPTION_ERROR THEN
10974         RETURN NULL;
10975 
10976 	WHEN OTHERS THEN
10977         Okl_Api.SET_MESSAGE(
10978           p_app_name     => G_APP_NAME,
10979           p_msg_name     => G_UNEXPECTED_ERROR,
10980           p_token1       => G_SQLCODE_TOKEN,
10981           p_token1_value => SQLCODE,
10982           p_token2       => G_SQLERRM_TOKEN,
10983           p_token2_value => SQLERRM);
10984        RETURN NULL;
10985 
10986   END line_asset_cost;
10987 
10988 --------------------------------------------------------------------------------
10989 
10990     -- Start of Comments
10991     -- Created By:    Rekha Pillay (rpillay)
10992     -- Function Name: line_accumulated_deprn
10993     -- Description:   Returns the accumulated depreciation on an asset in
10994     --                its Corporate Book from Oracle Assets
10995     -- Dependencies:
10996     -- Parameters: contract id, line id
10997     -- Version: 1.0
10998     -- End of Comments
10999 
11000 --------------------------------------------------------------------------------
11001   FUNCTION line_accumulated_deprn(
11002                             p_contract_id       IN  NUMBER
11003                            ,p_contract_line_id  IN NUMBER
11004                           )
11005   RETURN NUMBER  IS
11006 
11007     l_api_name          CONSTANT VARCHAR2(30) := 'LINE_ACCUMULATED_DEPRN';
11008     l_api_version       CONSTANT NUMBER	      := 1;
11009     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11010     x_msg_count         NUMBER;
11011     x_msg_data          VARCHAR2(256);
11012 
11013     l_asset_hdr_rec            FA_API_TYPES.asset_hdr_rec_type;
11014     l_asset_deprn_rec          FA_API_TYPES.asset_deprn_rec_type;
11015 
11016     l_converted_amount         NUMBER;
11017     l_contract_start_date      DATE;
11018     l_contract_currency        OKL_K_HEADERS_FULL_V.currency_code%TYPE;
11019     l_currency_conversion_type OKL_K_HEADERS_FULL_V.currency_conversion_type%TYPE;
11020     l_currency_conversion_rate OKL_K_HEADERS_FULL_V.currency_conversion_rate%TYPE;
11021     l_currency_conversion_date OKL_K_HEADERS_FULL_V.currency_conversion_date%TYPE;
11022 
11023     -- Bug# 4061058:
11024     -- Changes to ensure that the query works for Release Asset
11025     -- and Release Contract
11026     CURSOR l_asset_csr(p_chr_id  IN NUMBER
11027                       ,p_cle_id  IN NUMBER
11028                       ,p_book_class  IN VARCHAR2
11029                       ,p_book_type_code  IN VARCHAR2) IS
11030     SELECT fab.asset_id,
11031            fab.book_type_code
11032     FROM okc_k_lines_v fin_ast_cle,
11033          okc_statuses_b stsb,
11034          fa_additions fad,
11035          fa_book_controls fbc,
11036          fa_books fab
11037     WHERE fin_ast_cle.id = p_cle_id
11038     AND   fin_ast_cle.dnz_chr_id = p_chr_id
11039     AND   fin_ast_cle.chr_id = p_chr_id
11040     AND   fin_ast_cle.sts_code = stsb.code
11041     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED')
11042     AND   fad.asset_number = fin_ast_cle.name
11043     AND   fab.asset_id = fad.asset_id
11044     AND   fab.book_type_code = fbc.book_type_code
11045     AND   fab.transaction_header_id_out IS NULL
11046     --AND   fbc.book_class = 'CORPORATE';
11047     AND   fbc.book_class = p_book_class
11048     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
11049 
11050     l_asset_rec  l_asset_csr%ROWTYPE;
11051 
11052     -- Bug# 4061058:
11053     -- Changes to ensure that the query works for Release Asset
11054     -- and Release Contract
11055     CURSOR l_asset_csr_incl_terminated
11056                            (p_chr_id  IN NUMBER
11057                            ,p_cle_id  IN NUMBER
11058                            ,p_book_class  IN VARCHAR2
11059                            ,p_book_type_code  IN VARCHAR2) IS
11060     SELECT fab.asset_id,
11061            fab.book_type_code
11062     FROM okc_k_lines_v fin_ast_cle,
11063          okc_statuses_b stsb,
11064          fa_additions fad,
11065          fa_book_controls fbc,
11066          fa_books fab
11067     WHERE fin_ast_cle.id = p_cle_id
11068     AND   fin_ast_cle.dnz_chr_id = p_chr_id
11069     AND   fin_ast_cle.chr_id = p_chr_id
11070     AND   fin_ast_cle.sts_code = stsb.code
11071     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED')
11072     AND   fad.asset_number = fin_ast_cle.name
11073     AND   fab.asset_id = fad.asset_id
11074     AND   fab.book_type_code = fbc.book_type_code
11075     AND   fab.transaction_header_id_out IS NULL
11076     --AND   fbc.book_class = 'CORPORATE';
11077     AND   fbc.book_class = p_book_class
11078     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
11079 
11080     CURSOR contract_start_date_csr(p_chr_id NUMBER) IS
11081     SELECT start_date
11082     FROM okc_k_headers_b
11083     WHERE id = p_chr_id;
11084 
11085     l_discount_incl_terminated BOOLEAN := FALSE;
11086     l_streams_repo_policy VARCHAR2(80); -- MGAAP 7263041
11087     l_book_class FA_BOOK_CONTROLS.BOOK_CLASS%TYPE;
11088     l_book_type_code FA_BOOK_CONTROLS.BOOK_TYPE_CODE%TYPE;
11089 
11090   BEGIN
11091 
11092       IF (( p_contract_id IS NULL ) OR ( p_contract_line_id IS NULL )) THEN
11093           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11094       END IF;
11095 
11096       l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
11097       l_book_type_code := NULL;
11098       IF (l_streams_repo_policy = 'PRIMARY') THEN
11099         l_book_class := 'CORPORATE';
11100       ELSE
11101         l_book_class := 'TAX';
11102         l_book_type_code := OKL_ACCOUNTING_UTIL.get_fa_reporting_book(
11103                               p_kle_id => p_contract_line_id);
11104       END IF;
11105            -- rmunjulu 4042892
11106     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
11107       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
11108 	  LOOP
11109         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
11110           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
11111 		  l_discount_incl_terminated := TRUE;
11112         END IF;
11113       END LOOP;
11114     END IF;
11115 
11116      -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
11117        -- AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
11118        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
11119 
11120      IF l_discount_incl_terminated THEN
11121           OPEN  l_asset_csr_incl_terminated(p_chr_id => p_contract_id,
11122                                             p_cle_id => p_contract_line_id,
11123                                             p_book_class => l_book_class,
11124                                             p_book_type_code => l_book_type_code);
11125           FETCH l_asset_csr_incl_terminated INTO l_asset_rec;
11126           IF( l_asset_csr_incl_terminated%NOTFOUND ) THEN
11127             CLOSE l_asset_csr_incl_terminated;
11128             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11129           END IF;
11130           CLOSE l_asset_csr_incl_terminated;
11131       ELSE
11132           OPEN  l_asset_csr(p_chr_id => p_contract_id,
11133                             p_cle_id => p_contract_line_id,
11134                             p_book_class => l_book_class,
11135                             p_book_type_code => l_book_type_code);
11136           FETCH l_asset_csr INTO l_asset_rec;
11137           IF( l_asset_csr%NOTFOUND ) THEN
11138              CLOSE l_asset_csr;
11139              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11140           END IF;
11141           CLOSE l_asset_csr;
11142       END IF;
11143 
11144       l_asset_hdr_rec.asset_id          := l_asset_rec.asset_id;
11145       l_asset_hdr_rec.book_type_code    := l_asset_rec.book_type_code;
11146 
11147       IF NOT fa_cache_pkg.fazcbc(x_book => l_asset_hdr_rec.book_type_code) THEN
11148         OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
11149                             p_msg_name     => 'OKL_LLA_FA_CACHE_ERROR'
11150                            );
11151         RAISE OKL_API.G_EXCEPTION_ERROR;
11152       END IF;
11153 
11154       -- To fetch Depreciation Reserve
11155       IF NOT FA_UTIL_PVT.get_asset_deprn_rec
11156               (p_asset_hdr_rec         => l_asset_hdr_rec ,
11157                px_asset_deprn_rec      => l_asset_deprn_rec,
11158                p_period_counter        => NULL,
11159                p_mrc_sob_type_code     => 'P'
11160                ) THEN
11161         OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
11162                             p_msg_name     => 'OKL_LLA_FA_DEPRN_REC_ERROR'
11163                            );
11164         RAISE OKL_API.G_EXCEPTION_ERROR;
11165       END IF;
11166 
11167       -- convert amount into contract currency
11168       OPEN contract_start_date_csr(p_chr_id => p_contract_id);
11169       FETCH contract_start_date_csr INTO l_contract_start_date;
11170       CLOSE contract_start_date_csr;
11171 
11172       l_converted_amount := 0;
11173       OKL_ACCOUNTING_UTIL.CONVERT_TO_CONTRACT_CURRENCY(
11174         p_khr_id                   => p_contract_id,
11175         p_from_currency            => NULL,
11176         p_transaction_date         => l_contract_start_date,
11177         p_amount                   => l_asset_deprn_rec.deprn_reserve,
11178         x_return_status            => x_return_status,
11179         x_contract_currency        => l_contract_currency,
11180         x_currency_conversion_type => l_currency_conversion_type,
11181         x_currency_conversion_rate => l_currency_conversion_rate,
11182         x_currency_conversion_date => l_currency_conversion_date,
11183         x_converted_amount         => l_converted_amount);
11184 
11185       IF(x_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
11186         Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
11187                             p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
11188         RAISE Okl_Api.G_EXCEPTION_ERROR;
11189       END IF;
11190 
11191       RETURN l_converted_amount;
11192 
11193     EXCEPTION
11194 
11195       WHEN OKL_API.G_EXCEPTION_ERROR THEN
11196         RETURN NULL;
11197 
11198 	WHEN OTHERS THEN
11199         Okl_Api.SET_MESSAGE(
11200           p_app_name     => G_APP_NAME,
11201           p_msg_name     => G_UNEXPECTED_ERROR,
11202           p_token1       => G_SQLCODE_TOKEN,
11203           p_token1_value => SQLCODE,
11204           p_token2       => G_SQLERRM_TOKEN,
11205           p_token2_value => SQLERRM);
11206        RETURN NULL;
11207 
11208   END line_accumulated_deprn;
11209 
11210 --------------------------------------------------------------------------------
11211 
11212     -- Start of Comments
11213     -- Created By:    Rekha Pillay (rpillay)
11214     -- Function Name: contract_asset_cost
11215     -- Description:   Returns the sum of current cost of all assets
11216     --                in the contract from Oracle Assets
11217     -- Dependencies:
11218     -- Parameters: contract id, line id
11219     -- Version: 1.0
11220     -- End of Comments
11221 
11222 --------------------------------------------------------------------------------
11223   FUNCTION contract_asset_cost(
11224                             p_contract_id       IN NUMBER
11225                            ,p_contract_line_id  IN NUMBER
11226                           )
11227   RETURN NUMBER  IS
11228 
11229     l_api_name          CONSTANT VARCHAR2(30) := 'CONTRACT_ASSET_COST';
11230     l_api_version       CONSTANT NUMBER	      := 1;
11231     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11232     x_msg_count         NUMBER;
11233     x_msg_data          VARCHAR2(256);
11234 
11235     CURSOR l_finast_csr(p_chr_id  IN NUMBER) IS
11236     SELECT fin_cle.id
11237     FROM okc_k_lines_b fin_cle,
11238          okc_line_styles_b lse,
11239          okc_statuses_b stsb
11240     WHERE fin_cle.dnz_chr_id = p_chr_id
11241     AND   fin_cle.chr_id = p_chr_id
11242     AND   fin_cle.lse_id = lse.id
11243     AND   lse.lty_code = 'FREE_FORM1'
11244     AND   fin_cle.sts_code = stsb.code
11245     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED');
11246 
11247     CURSOR l_finast_csr_incl_terminated(p_chr_id  IN NUMBER) IS
11248     SELECT fin_cle.id
11249     FROM okc_k_lines_b fin_cle,
11250          okc_line_styles_b lse,
11251          okc_statuses_b stsb
11252     WHERE fin_cle.dnz_chr_id = p_chr_id
11253     AND   fin_cle.chr_id = p_chr_id
11254     AND   fin_cle.lse_id = lse.id
11255     AND   lse.lty_code = 'FREE_FORM1'
11256     AND   fin_cle.sts_code = stsb.code
11257     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED');
11258 
11259     l_sum_asset_cost NUMBER;
11260     l_asset_cost NUMBER;
11261 
11262     l_discount_incl_terminated BOOLEAN := FALSE;
11263 
11264   BEGIN
11265 
11266       IF ( p_contract_id IS NULL ) THEN
11267           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11268       END IF;
11269 
11270       l_sum_asset_cost := 0;
11271 
11272            -- rmunjulu 4042892
11273     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
11274       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
11275 	  LOOP
11276         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
11277           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
11278 		  l_discount_incl_terminated := TRUE;
11279         END IF;
11280       END LOOP;
11281     END IF;
11282 
11283 
11284      -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
11285       --  AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
11286        -- AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
11287 
11288      IF l_discount_incl_terminated THEN
11289         FOR l_finast_rec IN l_finast_csr_incl_terminated(p_chr_id => p_contract_id) LOOP
11290           l_asset_cost := line_asset_cost(p_contract_id,l_finast_rec.id);
11291           IF (l_asset_cost IS NULL) THEN
11292             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11293           END IF;
11294           l_sum_asset_cost := l_sum_asset_cost + l_asset_cost;
11295         END LOOP;
11296 
11297       ELSE
11298 
11299          FOR l_finast_rec IN l_finast_csr(p_chr_id => p_contract_id) LOOP
11300           l_asset_cost := line_asset_cost(p_contract_id,l_finast_rec.id);
11301           IF (l_asset_cost IS NULL) THEN
11302             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11303           END IF;
11304           l_sum_asset_cost := l_sum_asset_cost + l_asset_cost;
11305         END LOOP;
11306 
11307       END IF;
11308 
11309       RETURN l_sum_asset_cost;
11310 
11311     EXCEPTION
11312 
11313       WHEN OKL_API.G_EXCEPTION_ERROR THEN
11314         RETURN NULL;
11315 
11316 	WHEN OTHERS THEN
11317         Okl_Api.SET_MESSAGE(
11318           p_app_name     => G_APP_NAME,
11319           p_msg_name     => G_UNEXPECTED_ERROR,
11320           p_token1       => G_SQLCODE_TOKEN,
11321           p_token1_value => SQLCODE,
11322           p_token2       => G_SQLERRM_TOKEN,
11323           p_token2_value => SQLERRM);
11324        RETURN NULL;
11325 
11326   END contract_asset_cost;
11327 
11328 --------------------------------------------------------------------------------
11329 
11330     -- Start of Comments
11331     -- Created By:    Rekha Pillay (rpillay)
11332     -- Function Name: contract_accumulated_deprn
11333     -- Description:   Returns the sum of accumulated depreciation
11334     --                for all assets in the contract from Oracle Assets
11335     -- Dependencies:
11336     -- Parameters: contract id, line id
11337     -- Version: 1.0
11338     -- End of Comments
11339 
11340 --------------------------------------------------------------------------------
11341   FUNCTION contract_accumulated_deprn(
11342                             p_contract_id       IN NUMBER
11343                            ,p_contract_line_id  IN NUMBER
11344                           )
11345   RETURN NUMBER  IS
11346 
11347     l_api_name          CONSTANT VARCHAR2(30) := 'CONTRACT_ACCUMULATED_DEPRN';
11348     l_api_version       CONSTANT NUMBER	      := 1;
11349     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11350     x_msg_count         NUMBER;
11351     x_msg_data          VARCHAR2(256);
11352 
11353     CURSOR l_finast_csr(p_chr_id  IN NUMBER) IS
11354     SELECT fin_cle.id
11355     FROM okc_k_lines_b fin_cle,
11356          okc_line_styles_b lse,
11357          okc_statuses_b stsb
11358     WHERE fin_cle.dnz_chr_id = p_chr_id
11359     AND   fin_cle.chr_id = p_chr_id
11360     AND   fin_cle.lse_id = lse.id
11361     AND   lse.lty_code = 'FREE_FORM1'
11362     AND   fin_cle.sts_code = stsb.code
11363     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED');
11364 
11365     CURSOR l_finast_csr_incl_terminated(p_chr_id  IN NUMBER) IS
11366     SELECT fin_cle.id
11367     FROM okc_k_lines_b fin_cle,
11368          okc_line_styles_b lse,
11369          okc_statuses_b stsb
11370     WHERE fin_cle.dnz_chr_id = p_chr_id
11371     AND   fin_cle.chr_id = p_chr_id
11372     AND   fin_cle.lse_id = lse.id
11373     AND   lse.lty_code = 'FREE_FORM1'
11374     AND   fin_cle.sts_code = stsb.code
11375     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED');
11376 
11377     l_sum_accumulated_deprn NUMBER;
11378     l_accumulated_deprn NUMBER;
11379 
11380     l_discount_incl_terminated BOOLEAN := FALSE;
11381 
11382   BEGIN
11383 
11384       IF ( p_contract_id IS NULL ) THEN
11385           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11386       END IF;
11387 
11388       l_sum_accumulated_deprn := 0;
11389 
11390            -- rmunjulu 4042892
11391     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
11392       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
11393 	  LOOP
11394         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
11395           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
11396 		  l_discount_incl_terminated := TRUE;
11397         END IF;
11398       END LOOP;
11399     END IF;
11400 
11401 
11402       --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
11403         --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
11404         --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
11405 
11406       IF l_discount_incl_terminated THEN
11407         FOR l_finast_rec IN l_finast_csr_incl_terminated(p_chr_id => p_contract_id) LOOP
11408           l_accumulated_deprn := line_accumulated_deprn(p_contract_id,l_finast_rec.id);
11409           IF (l_accumulated_deprn IS NULL) THEN
11410             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11411           END IF;
11412           l_sum_accumulated_deprn := l_sum_accumulated_deprn + l_accumulated_deprn;
11413         END LOOP;
11414 
11415       ELSE
11416 
11417          FOR l_finast_rec IN l_finast_csr(p_chr_id => p_contract_id) LOOP
11418           l_accumulated_deprn := line_accumulated_deprn(p_contract_id,l_finast_rec.id);
11419           IF (l_accumulated_deprn IS NULL) THEN
11420             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11421           END IF;
11422           l_sum_accumulated_deprn := l_sum_accumulated_deprn + l_accumulated_deprn;
11423         END LOOP;
11424 
11425       END IF;
11426 
11427       RETURN l_sum_accumulated_deprn;
11428 
11429     EXCEPTION
11430 
11431       WHEN OKL_API.G_EXCEPTION_ERROR THEN
11432         RETURN NULL;
11433 
11434 	WHEN OTHERS THEN
11435         Okl_Api.SET_MESSAGE(
11436           p_app_name     => G_APP_NAME,
11437           p_msg_name     => G_UNEXPECTED_ERROR,
11438           p_token1       => G_SQLCODE_TOKEN,
11439           p_token1_value => SQLCODE,
11440           p_token2       => G_SQLERRM_TOKEN,
11441           p_token2_value => SQLERRM);
11442        RETURN NULL;
11443 
11444   END contract_accumulated_deprn;
11445 
11446 --Bug# 3872534: end
11447 
11448 --------------------------------------------------------------------------------
11449 
11450     -- Start of Comments
11451     -- Created By:    avsingh
11452     -- Function Name: contract_financed_amount
11453     -- Description:   Returns the contract financed amount for
11454     --                  booking page
11455     -- Dependencies:
11456     -- Parameters: contract id, line id
11457     -- Version: 1.0
11458     -- End of Comments
11459 
11460 --------------------------------------------------------------------------------
11461   FUNCTION contract_financed_amount(
11462                             p_contract_id       IN NUMBER
11463                            ,p_contract_line_id  IN NUMBER
11464                           )
11465   RETURN NUMBER  IS
11466 
11467     l_api_name          CONSTANT VARCHAR2(30) := 'CONTRACT_CAPITAL_AMOUNT';
11468     l_api_version       CONSTANT NUMBER       := 1;
11469     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11470     x_msg_count         NUMBER;
11471     x_msg_data          VARCHAR2(256);
11472 
11473       --cursor to find total capital amount
11474     CURSOR l_cap_amnt_csr( ChrId NUMBER) IS
11475     SELECT NVL(SUM(kle.capital_amount),0)
11476            --bug# 4899328
11477            --+ NVL(SUM(kle.capitalized_interest),0) CapAmountLines
11478     FROM   OKC_LINE_STYLES_B  LSEB,
11479            OKL_K_LINES        KLE,
11480            OKC_K_LINES_B      CLEB,
11481            OKC_STATUSES_B     STSB
11482     WHERE  LSEB.ID               = CLEB.LSE_ID
11483     AND    LSEB.lty_code         = 'FREE_FORM1'
11484     AND    KLE.id                = CLEB.ID
11485     AND    CLEB.CHR_ID           = ChrId
11486     AND    CLEB.DNZ_CHR_ID       = ChrId
11487     AND    CLEB.sts_code         = STSB.code
11488     AND    STSB.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
11489 
11490 -- fixed bug 4134296
11491     -- cursor to find total Rollover Fee Amount for a Contract
11492     CURSOR l_rollover_fee_csr(l_dnz_chr_id okc_k_headers_b.id%TYPE) IS
11493     SELECT
11494       NVL(SUM(NVL(KLEB.amount,0)),0) ROLLOVER_AMOUNT
11495     FROM
11496       OKL_K_LINES KLEB,
11497       OKC_K_LINES_B CLEB,
11498       OKC_LINE_STYLES_B LSEB,
11499       OKC_STATUSES_B STS
11500     WHERE
11501       KLEB.ID = CLEB.ID AND
11502       CLEB.LSE_ID = LSEB.ID AND
11503       LSEB.LTY_CODE = 'FEE' AND
11504       KLEB.FEE_TYPE = 'ROLLOVER' AND
11505       CLEB.DNZ_CHR_ID = l_dnz_chr_id AND
11506       CLEB.STS_CODE = STS.CODE AND
11507       STS.STE_CODE NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
11508 
11509 
11510     l_rollover_fee_amount NUMBER;
11511 
11512     l_capital_amount NUMBER;
11513 
11514     l_financed_fee NUMBER;
11515 
11516     l_contract_financed_amount NUMBER;
11517 
11518 
11519   BEGIN
11520 
11521       IF ( p_contract_id IS NULL ) THEN
11522           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11523       END IF;
11524 
11525       l_capital_amount := 0;
11526       l_financed_fee   := 0;
11527       l_contract_financed_amount := 0;
11528       l_rollover_fee_amount := 0;
11529 
11530       OPEN l_cap_amnt_csr(ChrId => p_contract_id);
11531       FETCH l_cap_amnt_csr INTO l_capital_amount;
11532       IF l_cap_amnt_csr%NOTFOUND THEN
11533           NULL;
11534       END IF;
11535       CLOSE l_cap_amnt_csr;
11536 
11537       FOR l_rollover_fee in l_rollover_fee_csr(p_contract_id)
11538       LOOP
11539 
11540         l_rollover_fee_amount := l_rollover_fee.rollover_amount;
11541 
11542       END LOOP;
11543 
11544 
11545       l_financed_fee := contract_financed_fee(p_contract_id, NULL);
11546       l_contract_financed_amount := l_capital_amount + l_financed_fee + l_rollover_fee_amount;
11547 
11548       RETURN l_contract_financed_amount;
11549 
11550    EXCEPTION
11551 
11552       WHEN OKL_API.G_EXCEPTION_ERROR THEN
11553         RETURN NULL;
11554 
11555         WHEN OTHERS THEN
11556         Okl_Api.SET_MESSAGE(
11557           p_app_name     => G_APP_NAME,
11558           p_msg_name     => G_UNEXPECTED_ERROR,
11559           p_token1       => G_SQLCODE_TOKEN,
11560           p_token1_value => SQLCODE,
11561           p_token2       => G_SQLERRM_TOKEN,
11562           p_token2_value => SQLERRM);
11563        RETURN NULL;
11564   END contract_financed_amount;
11565 
11566 --start:cklee
11567 --------------------------------------------------------------------------------
11568 
11569     -- Start of Comments
11570     -- Created By:    cklee
11571     -- Function Name: rollover fee
11572     -- Description:   Returns the credit line total rollover fee
11573     --
11574     -- Dependencies:
11575     -- Parameters: contract id, line id
11576     -- Version: 1.0
11577     -- End of Comments
11578 
11579 --------------------------------------------------------------------------------
11580   FUNCTION rollover_fee(
11581                             p_contract_id       IN NUMBER
11582                            ,p_contract_line_id  IN NUMBER
11583                           )
11584   RETURN NUMBER  IS
11585 
11586     l_api_name          CONSTANT VARCHAR2(30) := 'ROLLOVER_FEE';
11587     l_api_version       CONSTANT NUMBER       := 1;
11588     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11589     x_msg_count         NUMBER;
11590     x_msg_data          VARCHAR2(256);
11591 
11592       --cursor to find...
11593     Cursor l_csr( ChrId NUMBER) IS
11594     SELECT NVL(chr.TOT_CL_TRANSFER_AMT,0)
11595     FROM   OKL_K_HEADERS  chr
11596     WHERE  chr.ID       = ChrId;
11597 
11598     l_amount number := 0;
11599 
11600   BEGIN
11601 
11602       open l_csr(ChrId => p_contract_id);
11603       fetch l_csr into l_amount;
11604       close l_csr;
11605 
11606       RETURN l_amount;
11607 
11608    EXCEPTION
11609 
11610       WHEN OKL_API.G_EXCEPTION_ERROR THEN
11611         RETURN NULL;
11612 
11613         WHEN OTHERS THEN
11614         Okl_Api.SET_MESSAGE(
11615           p_app_name     => G_APP_NAME,
11616           p_msg_name     => G_UNEXPECTED_ERROR,
11617           p_token1       => G_SQLCODE_TOKEN,
11618           p_token1_value => SQLCODE,
11619           p_token2       => G_SQLERRM_TOKEN,
11620           p_token2_value => SQLERRM);
11621        RETURN NULL;
11622   END rollover_fee;
11623 
11624 --------------------------------------------------------------------------------
11625 
11626     -- Start of Comments
11627     -- Created By:    cklee
11628     -- Function Name: tot_net_transfers
11629     -- Description:   Returns the credit line total net transfers (T and A)
11630     --
11631     -- Dependencies:
11632     -- Parameters: contract id, line id
11633     -- Version: 1.0
11634     -- End of Comments
11635 
11636 --------------------------------------------------------------------------------
11637   FUNCTION tot_net_transfers(
11638                             p_contract_id       IN NUMBER
11639                            ,p_contract_line_id  IN NUMBER
11640                           )
11641   RETURN NUMBER  IS
11642 
11643     l_api_name          CONSTANT VARCHAR2(30) := 'TOT_NET_TRANSFERS';
11644     l_api_version       CONSTANT NUMBER       := 1;
11645     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11646     x_msg_count         NUMBER;
11647     x_msg_data          VARCHAR2(256);
11648 
11649       --cursor to find...
11650     Cursor l_csr( ChrId NUMBER) IS
11651     SELECT NVL(chr.TOT_CL_NET_TRANSFER_AMT,0)
11652     FROM   OKL_K_HEADERS  chr
11653     WHERE  chr.ID       = ChrId;
11654 
11655     l_amount number := 0;
11656 
11657   BEGIN
11658 
11659       open l_csr(ChrId => p_contract_id);
11660       fetch l_csr into l_amount;
11661       close l_csr;
11662 
11663       RETURN l_amount;
11664 
11665    EXCEPTION
11666 
11667       WHEN OKL_API.G_EXCEPTION_ERROR THEN
11668         RETURN NULL;
11669 
11670         WHEN OTHERS THEN
11671         Okl_Api.SET_MESSAGE(
11672           p_app_name     => G_APP_NAME,
11673           p_msg_name     => G_UNEXPECTED_ERROR,
11674           p_token1       => G_SQLCODE_TOKEN,
11675           p_token1_value => SQLCODE,
11676           p_token2       => G_SQLERRM_TOKEN,
11677           p_token2_value => SQLERRM);
11678        RETURN NULL;
11679   END tot_net_transfers;
11680 --end:cklee
11681 
11682 
11683 ------------------------------------------------------------------------------
11684   -- Start of Comments
11685   -- Created By:    rmunjulu 3816891
11686   -- Function Name: line_future_rent
11687   -- Description:   Returns the future rent amount for a given contract line
11688   -- Dependencies:  OKL building blocks AMTX and AMUV
11689   -- Parameters:    IN:  p_contract_id, p_line_id
11690   --                     stream_type_id (stored in g_additional_parameters(1))
11691   --                OUT: amount
11692   -- Version:       1.0
11693   -- History      : 31-Dec-2004 PAGARG Bug# 4097591
11694   --              : UDS impact to obtain stream type id
11695   --              : 15-Oct-07 prasjain Bug 6030917
11696   --              : Added proration logic
11697   -- End of Commnets
11698 ------------------------------------------------------------------------------
11699 
11700 FUNCTION line_future_rent (
11701 	p_contract_id		IN NUMBER,
11702 	p_contract_line_id	IN NUMBER)
11703 	RETURN NUMBER IS
11704 
11705     -- Get future Streams
11706     -- Guru added trx_date
11707 
11708 	CURSOR l_future_stream_csr (
11709 			cp_contract_id			NUMBER,
11710 			cp_contract_line_id		NUMBER,
11711 			cp_stream_type_id		NUMBER,
11712             cp_trx_date             DATE) IS
11713 	SELECT	SUM (NVL (ste.amount, 0))	amount_due
11714 	--FROM	okl_streams			stm,
11715 	FROM	okl_streams_rep_v		stm,
11716                 okl_strm_type_b     sty,
11717 			    okl_strm_elements		ste
11718 	WHERE	stm.khr_id			= cp_contract_id
11719 	AND	stm.kle_id			= cp_contract_line_id
11720 	AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
11721 	AND	stm.active_yn			= 'Y'
11722 	AND	stm.say_code			= 'CURR'
11723 	AND	ste.stm_id			= stm.id
11724 	AND	NVL (ste.amount, 0)	<> 0
11725   -- Added the following 3 conditions to restrict the unbilled receivables calculation to only
11726   -- billable streams
11727     AND sty.id              = stm.sty_id
11728     AND sty.billable_yn     = 'Y'
11729     AND ste.STREAM_ELEMENT_DATE > nvl(cp_trx_date,sysdate);   -- gkadarka added this null check
11730 
11731      -- Get future Streams for Reporting product
11732 	CURSOR l_future_reporting_stream_csr (
11733 			cp_contract_id			NUMBER,
11734 			cp_contract_line_id		NUMBER,
11735 			cp_stream_type_id		NUMBER,
11736             cp_trx_date             DATE) IS
11737 	SELECT	SUM (NVL (ste.amount, 0))	amount_due
11738 	FROM	okl_streams			stm,
11739                 okl_strm_type_b     sty, --  Added this table to get the billable_yn flag
11740 			    okl_strm_elements		ste
11741 	WHERE	stm.khr_id			= cp_contract_id
11742 	AND	stm.kle_id			= cp_contract_line_id
11743 	AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
11744 	AND	stm.active_yn			= 'N'  -- reporting strems are inactive
11745 	AND	stm.say_code			= 'CURR'  -- reporting streams are current
11746 	AND	ste.stm_id			= stm.id
11747 	--AND	ste.date_billed			IS NULL  -- reporting streams never get billed
11748 	AND	NVL (ste.amount, 0)	<> 0
11749     AND sty.id              = stm.sty_id
11750     AND sty.billable_yn     = 'Y' -- reporting streams are billable
11751     AND stm.purpose_code = 'REPORT'
11752     AND ste.STREAM_ELEMENT_DATE > nvl(cp_trx_date,sysdate);  -- gkadarka added this null check
11753 
11754     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
11755     l_trx_date   DATE;
11756 
11757 	l_result_amount		NUMBER		:= 0;
11758 	l_stream_type_id	NUMBER;
11759 
11760 	-- rmunjulu
11761 	l_quote_eff_date DATE;
11762 	l_term_date DATE;
11763 	l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
11764 
11765     -- Start : Bug 6030917 : prasjain
11766     --new cursor introduced for prorating and rounding the stream element amount
11767     --incase of partial unit termination
11768           CURSOR stream_element_csr (
11769                           cp_contract_id                        NUMBER,
11770                           cp_contract_line_id                NUMBER,
11771                           cp_stream_type_id                NUMBER,
11772               cp_trx_date             DATE) IS
11773           SELECT nvl(ste.amount, 0)        amount
11774           FROM        okl_streams                        stm,
11775           okl_strm_type_b     sty,
11776                             okl_strm_elements                ste
11777           WHERE        stm.khr_id                        = cp_contract_id
11778           AND          stm.kle_id                        = cp_contract_line_id
11779           AND          stm.sty_id                        = NVL (cp_stream_type_id, stm.sty_id)
11780           AND          stm.active_yn                        = 'Y'
11781           AND          stm.say_code                        = 'CURR'
11782           AND          ste.stm_id                        = stm.id
11783           AND          NVL (ste.amount, 0)        <> 0
11784     AND   sty.id              = stm.sty_id
11785     AND   sty.billable_yn     = 'Y'
11786     AND   ste.stream_element_date > nvl(cp_trx_date,sysdate);
11787 
11788     stream_element_rec stream_element_csr%ROWTYPE;
11789     --currency code cursor added to derive currency code for the particular line
11790     --which will be used for rounding amount
11791     CURSOR currency_code_csr (p_kle_id     NUMBER ) IS
11792     SELECT currency_code
11793     FROM   okc_k_lines_b
11794     WHERE  id = p_kle_id;
11795     --declaring proration factor , currency code and rounding rule variables
11796     l_proration_factor           NUMBER;
11797     l_currency_code              okc_k_lines_b.currency_code%TYPE;
11798     l_parent_strm_amt               NUMBER;
11799     l_parent_strm_rounded_amt       NUMBER;
11800     l_parent_strm_rounded_tot_amt   NUMBER;
11801     --declaring other local variables
11802     i                           NUMBER;
11803     l_api_version               NUMBER := 1;
11804     l_init_msg_list             VARCHAR2(1) := OKL_API.G_FALSE;
11805     l_msg_count                 NUMBER;
11806     l_msg_data                  VARCHAR2(100);
11807     -- End : Bug 6030917 : prasjain
11808 
11809 BEGIN
11810     --PAGARG 31-Dec-2004 Bug# 4097591 Start
11811     --UDS impact. Obtain stream type id and pass it to cursor
11812 
11813     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
11814                                              'RENT',
11815                                              l_return_status,
11816                                              l_stream_type_id);
11817 
11818     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
11819     THEN
11820         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11821     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
11822     THEN
11823         RAISE OKL_API.G_EXCEPTION_ERROR;
11824     END IF;
11825     --PAGARG 31-Dec-2004 Bug# 4097591 End
11826 
11827 	-- ********************************************
11828 	-- Extract Stream Type Id from global variables
11829 	-- ********************************************
11830 
11831     --Validate additional parameters availability
11832     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
11833       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
11834 	  LOOP
11835         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
11836            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
11837                 l_rep_prod_streams_yn := okl_execute_formula_pub.g_additional_parameters(I).value;
11838         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
11839            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
11840                 l_trx_date := to_date(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
11841         -- rmunjulu -- this formula is called for amortization which will pass quote eff date
11842         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_effective_from_date'
11843            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
11844                 l_quote_eff_date := to_date(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
11845 
11846           -- Start : Bug 6030917 : prasjain
11847           --added for getting the proration factor for partial unit termination
11848           ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'proration_factor'
11849              AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
11850                   l_proration_factor := to_number(okl_execute_formula_pub.g_additional_parameters(I).value);
11851           -- End : Bug 6030917 : prasjain
11852 
11853         END IF;
11854       END LOOP;
11855 	ELSE
11856       l_rep_prod_streams_yn := 'N';
11857 
11858 	END IF;
11859 
11860     IF l_rep_prod_streams_yn = 'Y' THEN
11861        IF l_trx_date IS NULL THEN
11862        -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
11863           Okl_Api.Set_Message(p_app_name     => g_app_name,
11864                               p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
11865           RAISE Okl_Api.G_EXCEPTION_ERROR;
11866        END IF;
11867     END IF;
11868 
11869     -- rmunjulu
11870     IF l_quote_eff_date IS NULL THEN
11871          l_term_date := SYSDATE;
11872     ELSE
11873          l_term_date := l_quote_eff_date;
11874     END IF;
11875 	-- ****************
11876 	-- Calculate result
11877 	-- ****************
11878 
11879     IF l_rep_prod_streams_yn = 'Y' THEN  -- MGAAP 7263041
11880        --OPEN  l_future_reporting_stream_csr(p_contract_id, p_contract_line_id, l_stream_type_id,l_trx_date );
11881        OPEN  l_future_stream_csr(p_contract_id, p_contract_line_id, l_stream_type_id,l_trx_date );
11882        FETCH l_future_stream_csr INTO  l_result_amount;
11883        CLOSE l_future_stream_csr;
11884     ELSE
11885 -- Guru added trx_date here
11886         -- Start : Bug 6030917 : prasjain
11887         --added for prorating incase of partial unit termination
11888         IF nvl(l_proration_factor,1) = 1 THEN
11889 
11890 	   OPEN  l_future_stream_csr (p_contract_id, p_contract_line_id, l_stream_type_id,l_term_date); -- rmunjulu changed to quote eff date
11891 	   FETCH l_future_stream_csr INTO l_result_amount;
11892 	   CLOSE l_future_stream_csr;
11893        ELSE
11894          --get curerncy code for the line
11895           OPEN  currency_code_csr(p_contract_line_id);
11896           FETCH currency_code_csr INTO l_currency_code ;
11897           CLOSE currency_code_csr;
11898           --initializing l_parent_strm_rounded_tot_amt variable with 0
11899           l_parent_strm_rounded_tot_amt := 0;
11900 
11901           FOR stream_element_rec IN stream_element_csr(p_contract_id,
11902                                                        p_contract_line_id,
11903                                                        l_stream_type_id,
11904                                                        l_term_date)
11905           LOOP
11906              --prorate the amount, to derive the parent stream amount
11907               l_parent_strm_amt := stream_element_rec.amount * l_proration_factor;
11908              --round amount with streams option for paren stream element amounts
11909              okl_accounting_util.round_amount(
11910                          p_api_version    => l_api_version,
11911                          p_init_msg_list  => l_init_msg_list,
11912                          x_return_status  => l_return_status,
11913                          x_msg_count      => l_msg_count,
11914                          x_msg_data       => l_msg_data,
11915                          p_amount         => l_parent_strm_amt,
11916                          p_currency_code  => l_currency_code,
11917                          p_round_option   => 'STM',
11918                          x_rounded_amount => l_parent_strm_rounded_amt
11919                          );
11920              IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
11921                RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11922              ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
11923                RAISE OKL_API.G_EXCEPTION_ERROR;
11924              END IF;
11925              -- calculate the parent stream rounded total
11926              l_parent_strm_rounded_tot_amt := l_parent_strm_rounded_tot_amt
11927                                                  + l_parent_strm_rounded_amt;
11928 
11929           END LOOP;
11930             l_result_amount := l_parent_strm_rounded_tot_amt;
11931         END IF;
11932        -- End : Bug 6030917 : prasjain
11933     END IF;
11934 
11935 	RETURN NVL (l_result_amount, 0);
11936 
11937 EXCEPTION
11938     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
11939         -- Close open cursors
11940         IF l_future_stream_csr%ISOPEN THEN
11941             CLOSE l_future_stream_csr;
11942         END IF;
11943 
11944         IF l_future_reporting_stream_csr%ISOPEN THEN
11945             CLOSE l_future_reporting_stream_csr;
11946         END IF;
11947 
11948          -- Start : Bug 6030917 : prasjain
11949           IF currency_code_csr%ISOPEN THEN
11950               CLOSE currency_code_csr;
11951           END IF;
11952           IF stream_element_csr%ISOPEN THEN
11953               CLOSE stream_element_csr;
11954           END IF;
11955           -- End : Bug 6030917 : prasjain
11956 
11957         RETURN NULL;
11958 
11959 	WHEN OTHERS THEN
11960 		-- Close open cursors
11961         IF l_future_stream_csr%ISOPEN THEN
11962             CLOSE l_future_stream_csr;
11963         END IF;
11964 
11965         IF l_future_reporting_stream_csr%ISOPEN THEN
11966             CLOSE l_future_reporting_stream_csr;
11967         END IF;
11968 
11969           -- Start : Bug 6030917 : prasjain
11970           IF currency_code_csr%ISOPEN THEN
11971               CLOSE currency_code_csr;
11972           END IF;
11973           IF stream_element_csr%ISOPEN THEN
11974               CLOSE stream_element_csr;
11975           END IF;
11976           -- End : Bug 6030917 : prasjain
11977 
11978 		-- store SQL error message on message stack for caller
11979 		OKL_API.SET_MESSAGE (
11980 			p_app_name	=> OKL_API.G_APP_NAME,
11981 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
11982 			p_token1	=> 'SQLCODE',
11983 			p_token1_value	=> SQLCODE,
11984 			p_token2	=> 'SQLERRM',
11985 			p_token2_value	=> SQLERRM);
11986 
11987 		RETURN NULL;
11988 
11989 END line_future_rent;
11990 
11991 ------------------------------------------------------------------------------
11992   -- Start of Comments
11993   -- Created By:    rmunjulu 3816891
11994   -- Function Name: line_future_income
11995   -- Description:   Returns the future income amount for a given contract line
11996   -- Dependencies:  OKL building blocks AMTX and AMUV
11997   -- Parameters:    IN:  p_contract_id, p_line_id
11998   --                     stream_type_id (stored in g_additional_parameters(1))
11999   --                OUT: amount
12000   -- Version:       1.0
12001   -- History      : 31-Dec-2004 PAGARG Bug# 4097591
12002   --              : UDS impact to obtain stream type id
12003   --              : 11-May-2006 gboomina Bug 5215019
12004   --              : check CHK_ACCRUAL_PREVIOUS_MNTH_YN
12005   --              : 15-Oct-07 prasjain Bug 6030917
12006   --              : Added proration logic
12007   --              : sechawla 05-dec-07 6671849 : Modified the dependent stream type check
12008   -- End of Commnets
12009 ------------------------------------------------------------------------------
12010 
12011 FUNCTION line_future_income (
12012 	p_contract_id		IN NUMBER,
12013 	p_contract_line_id	IN NUMBER)
12014 	RETURN NUMBER IS
12015 
12016 	l_unearned_income	NUMBER 	:= 0;
12017 -- 26-Aug-2004 Guru declared the following variables for bug 3849355
12018     l_term_date DATE;
12019     l_period_name VARCHAR2(30);
12020     l_start_date DATE;
12021     l_end_date DATE;
12022 
12023 	--Code changed by rvaduri for bug 3487920
12024 	--This code will return the Pre-tax income at line level
12025 	-- and will return values only contracts booked using ISG.
12026 -- Guru Added trx date
12027     --PAGARG 31-Dec-2004 Bug# 4097591
12028     --Instead of using stream name, join the sty id passed to cursor
12029     CURSOR line_csr (c_contract_line_id      NUMBER,
12030                      cp_trx_date             DATE,
12031                      p_sty_id                NUMBER) IS
12032       SELECT NVL(SUM(sel.amount),0)
12033       FROM okl_strm_elements sel,
12034            --okl_streams stm, MGAAP 7263041
12035            okl_streams_rep_v stm,
12036            okl_strm_type_v sty
12037       WHERE sty.id = p_sty_id
12038         AND stm.sty_id = sty.id
12039         AND stm.say_code = 'CURR'
12040         AND stm.active_yn = 'Y'
12041         AND (stm.purpose_code IS NULL OR stm.purpose_code='REPORT')
12042         AND stm.kle_id = c_contract_line_id
12043         AND sel.stm_id = stm.id
12044         -- guru Added
12045     AND sel.STREAM_ELEMENT_DATE >  nvl(cp_trx_date,sysdate);    -- gkadarka added this null check
12046 
12047     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
12048     l_trx_date   DATE;
12049 
12050     -- Created this cursor to evaluat ereporting streams based upon additional parameters
12051     --PAGARG 31-Dec-2004 Bug# 4097591
12052     --Instead of using stream name, join the sty id passed to cursor
12053     CURSOR line_reporting_csr (c_contract_line_id IN NUMBER, cp_trx_date IN DATE, p_sty_id NUMBER) IS
12054       SELECT NVL(SUM(sel.amount),0)
12055       FROM okl_strm_elements sel,
12056            --okl_streams stm, MGAAP 7263041
12057            okl_streams_rep_v stm,
12058            okl_strm_type_v sty
12059       WHERE sty.id = p_sty_id
12060         AND stm.sty_id = sty.id
12061         AND stm.say_code = 'CURR' -- reporting streams are current
12062         AND stm.active_yn = 'N'  -- reporting strems are inactive
12063         AND stm.purpose_code IS NULL
12064      --   AND	sel.date_billed	IS NULL  -- reporting streams never get billed
12065         --AND sty.billable_yn     = 'N'  -- PRE-TAX streams are not billable
12066         AND stm.kle_id = c_contract_line_id
12067         AND sel.stm_id = stm.id
12068         AND stm.purpose_code = 'REPORT'
12069         AND sel.STREAM_ELEMENT_DATE >  nvl(cp_trx_date,sysdate);   -- gkadarka added this null check
12070 
12071      -- gboomina Bug 5215019 - Start
12072      CURSOR check_accrual_previous_csr IS
12073        SELECT NVL(CHK_ACCRUAL_PREVIOUS_MNTH_YN,'N')
12074        FROM OKL_SYSTEM_PARAMS;
12075 
12076        l_accrual_previous_mnth_yn VARCHAR2(3);
12077        l_accrual_adjst_date DATE;
12078      -- gboomina Bug 5215019 - End
12079 
12080     -- rmunjulu
12081     l_quote_eff_date DATE;
12082 	l_stream_type_id	NUMBER;
12083 	l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
12084 
12085     l_debug_unearned_income        NUMBER         := 0;
12086     -- Start : Bug 6030917 : prasjain
12087     --new cursor introduced for prorating and rounding the stream element amount
12088     --incase of partial unit termination
12089     CURSOR stream_element_csr (c_contract_line_id      NUMBER,
12090                                cp_trx_date             DATE,
12091                                p_sty_id                NUMBER) IS
12092     SELECT NVL(sel.amount,0) amount
12093     FROM okl_strm_elements sel,
12094          --okl_streams stm, MGAAP 7263041
12095          okl_streams_rep_v stm,
12096          okl_strm_type_v sty
12097     WHERE sty.id = p_sty_id
12098       AND stm.sty_id = sty.id
12099       AND stm.say_code = 'CURR'
12100       AND stm.active_yn = 'Y'
12101       AND (stm.purpose_code IS NULL OR stm.purpose_code='REPORT')
12102       AND stm.kle_id = c_contract_line_id
12103       AND sel.stm_id = stm.id
12104       AND sel.STREAM_ELEMENT_DATE >  nvl(cp_trx_date,sysdate);
12105     stream_element_rec stream_element_csr%ROWTYPE;
12106     --currency code cursor added to derive currency code for the particular line
12107     --which will be used for rounding amount
12108     CURSOR currency_code_csr (p_kle_id     NUMBER ) IS
12109     SELECT currency_code
12110     FROM   okc_k_lines_b
12111     WHERE  id = p_kle_id;
12112     --declaring proration factor , currency code and rounding rule variables
12113     l_proration_factor           NUMBER;
12114     l_currency_code              okc_k_lines_b.currency_code%TYPE;
12115     l_parent_strm_amt               NUMBER;
12116     l_parent_strm_rounded_amt       NUMBER;
12117     l_parent_strm_rounded_tot_amt   NUMBER;
12118     --declaring other local variables
12119     l_api_version               NUMBER := 1;
12120     l_init_msg_list             VARCHAR2(1) := OKL_API.G_FALSE;
12121     l_msg_count                 NUMBER;
12122     l_msg_data                  VARCHAR2(100);
12123     -- End : Bug 6030917 : prasjain
12124 
12125     lx_rep_product_id               OKL_PRODUCTS_V.ID%TYPE;
12126 
12127 BEGIN
12128 
12129    --  Validate additional parameters availability
12130     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
12131       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
12132 	  LOOP
12133         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
12134            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
12135                 l_rep_prod_streams_yn := okl_execute_formula_pub.g_additional_parameters(I).value;
12136         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
12137            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
12138                 l_trx_date := to_date(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
12139         -- rmunjulu -- this formula is called for amortization which will pass quote eff date
12140         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_effective_from_date'
12141            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
12142                 l_quote_eff_date := to_date(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
12143 
12144           -- Start : Bug 6030917 : prasjain
12145           --added for getting the proration factor for partial unit termination
12146           ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'proration_factor'
12147              AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
12148                   l_proration_factor := to_number(okl_execute_formula_pub.g_additional_parameters(I).value);
12149           -- End : Bug 6030917 : prasjain
12150 
12151         END IF;
12152       END LOOP;
12153 	ELSE
12154 
12155       l_rep_prod_streams_yn := 'N';
12156 
12157 	END IF;
12158 
12159     -- sechawla 05-dec-07 6671849 -- START
12160 	IF l_rep_prod_streams_yn = 'Y' THEN
12161 
12162 	      get_reporting_product(
12163                                   p_api_version           => l_api_version,
12164            		 	              p_init_msg_list         => OKC_API.G_FALSE,
12165            			              x_return_status         => l_return_status,
12166            			              x_msg_count             => l_msg_count,
12167            			              x_msg_data              => l_msg_data,
12168                                   p_contract_id 		  => p_contract_id,
12169                                   x_rep_product_id        => lx_rep_product_id);
12170 
12171          OKL_STREAMS_UTIL.get_dependent_stream_type(p_khr_id            => p_contract_id,
12172                                                p_product_id            => lx_rep_product_id,
12173                                                p_primary_sty_purpose   => 'RENT',
12174                                                p_dependent_sty_purpose => 'LEASE_INCOME',
12175                                                x_return_status         => l_return_status,
12176                                                x_dependent_sty_id      => l_stream_type_id);
12177     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
12178     THEN
12179         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12180     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
12181     THEN
12182         RAISE OKL_API.G_EXCEPTION_ERROR;
12183     END IF;
12184     ELSE
12185     -- sechawla 05-dec-07 6671849 -- START
12186        --PAGARG 31-Dec-2004 Bug# 4097591 Start
12187        --UDS impact. Obtain stream type id and pass it to cursor
12188        OKL_STREAMS_UTIL.get_dependent_stream_type(p_khr_id                => p_contract_id,
12189                                                p_primary_sty_purpose   => 'RENT',
12190                                                p_dependent_sty_purpose => 'LEASE_INCOME',
12191                                                x_return_status         => l_return_status,
12192                                                x_dependent_sty_id      => l_stream_type_id);
12193 
12194        IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12195           RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12196        ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12197           RAISE OKL_API.G_EXCEPTION_ERROR;
12198        END IF;
12199        --PAGARG 31-Dec-2004 Bug# 4097591 End
12200 
12201     END IF; -- sechawla 05-dec-07 6671849 -- added
12202 
12203     IF l_rep_prod_streams_yn = 'Y' THEN
12204        IF l_trx_date IS NULL THEN
12205        -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
12206           Okl_Api.Set_Message(p_app_name     => g_app_name,
12207                               p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
12208           RAISE Okl_Api.G_EXCEPTION_ERROR;
12209        END IF;
12210     END IF;
12211 
12212  -- 26-Aug-2004 3849355 Guru added the following code to get current accural period end date
12213 
12214        /* -- rmunjulu
12215       IF l_trx_date IS NULL THEN
12216             l_term_date := SYSDATE;
12217        ELSE
12218            l_term_date := l_trx_date;
12219 
12220        END IF;
12221        */
12222 
12223     -- rmunjulu
12224     IF l_quote_eff_date IS NULL THEN
12225          l_term_date := SYSDATE;
12226     ELSE
12227          l_term_date := l_quote_eff_date;
12228     END IF;
12229 
12230     -- gboomina Bug 5215019 - Start
12231     -- Based on CHK_ACCRUAL_PREVIOUS_MNTH_YN setup check accruals
12232     -- till quote eff date OR previous month last date
12233     OPEN  check_accrual_previous_csr;
12234     FETCH check_accrual_previous_csr INTO l_accrual_previous_mnth_yn;
12235     CLOSE check_accrual_previous_csr;
12236 
12237     IF nvl(l_accrual_previous_mnth_yn,'N') = 'N' THEN
12238       l_accrual_adjst_date :=   l_term_date;
12239     ELSE
12240       l_accrual_adjst_date :=   LAST_DAY(TRUNC(l_term_date, 'MONTH')-1);
12241     END IF;
12242 
12243     okl_accounting_util.get_period_info(l_accrual_adjst_date,l_period_name, l_start_date,l_end_date);
12244     -- gboomina Bug 5215019 - End
12245 
12246     --check if streams required for reporting  product
12247     IF l_rep_prod_streams_yn = 'Y' THEN
12248        OKL_STREAMS_SEC_PVT.SET_REPO_STREAMS; --MGAAP 7263041
12249        --PAGARG 31-Dec-2004 Bug# 4097591, Pass stream type id to cursor
12250        --OPEN  line_reporting_csr(p_contract_line_id, l_end_date, l_stream_type_id);   -- now passing l_end_date 26-Aug-2004 3849355
12251        OPEN  line_csr(p_contract_line_id, l_end_date, l_stream_type_id);   -- now passing l_end_date 26-Aug-2004 3849355
12252        FETCH line_csr INTO l_unearned_income;
12253 	   CLOSE line_csr;
12254        OKL_STREAMS_SEC_PVT.RESET_REPO_STREAMS;
12255     ELSE
12256        OKL_STREAMS_SEC_PVT.RESET_REPO_STREAMS;
12257         -- Start : Bug 6030917 : prasjain
12258         --added for prorating incase of partial unit termination
12259 
12260         IF nvl(l_proration_factor,1) = 1 THEN
12261        --PAGARG 31-Dec-2004 Bug# 4097591, Pass stream type id to cursor
12262 	   OPEN  line_csr(p_contract_line_id,l_end_date, l_stream_type_id);   -- now passing l_end_date 26-Aug-2004 3849355
12263 	   FETCH line_csr INTO l_unearned_income;
12264 	   CLOSE line_csr;
12265        ELSE
12266           --get curerncy code for the line
12267           OPEN  currency_code_csr(p_contract_line_id);
12268           FETCH currency_code_csr INTO l_currency_code ;
12269           CLOSE currency_code_csr;
12270           --initializing l_parent_strm_rounded_tot_amt variable with 0
12271           l_parent_strm_rounded_tot_amt := 0;
12272 
12273           FOR stream_element_rec IN stream_element_csr(p_contract_line_id, l_end_date, l_stream_type_id)
12274           LOOP
12275              --prorate the amount, to derive the parent stream amount
12276               l_parent_strm_amt := stream_element_rec.amount * l_proration_factor;
12277              --round amount with streams option for paren stream element amounts
12278              okl_accounting_util.round_amount(
12279                          p_api_version    => l_api_version,
12280                          p_init_msg_list  => l_init_msg_list,
12281                          x_return_status  => l_return_status,
12282                          x_msg_count      => l_msg_count,
12283                          x_msg_data       => l_msg_data,
12284                          p_amount         => l_parent_strm_amt,
12285                          p_currency_code  => l_currency_code,
12286                          p_round_option   => 'STM',
12287                          x_rounded_amount => l_parent_strm_rounded_amt
12288                          );
12289              IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12290                RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12291              ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12292                RAISE OKL_API.G_EXCEPTION_ERROR;
12293     END IF;
12294 
12295             -- calculate the parent stream rounded total
12296              l_parent_strm_rounded_tot_amt := l_parent_strm_rounded_tot_amt
12297                                                  + l_parent_strm_rounded_amt;
12298 
12299           END LOOP;
12300             l_unearned_income := l_parent_strm_rounded_tot_amt;
12301         END IF;
12302        -- End : Bug 6030917 : prasjain
12303       END IF;
12304 
12305 
12306 	RETURN NVL(l_unearned_income,0);
12307 
12308 EXCEPTION
12309 
12310     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
12311         IF line_csr%ISOPEN THEN
12312 			CLOSE line_csr;
12313 		END IF;
12314 
12315         IF line_reporting_csr%ISOPEN THEN
12316             CLOSE line_reporting_csr;
12317         END IF;
12318 
12319           -- Start : Bug 6030917 : prasjain
12320           IF currency_code_csr%ISOPEN THEN
12321               CLOSE currency_code_csr;
12322           END IF;
12323           IF stream_element_csr%ISOPEN THEN
12324               CLOSE stream_element_csr;
12325           END IF;
12326           -- End : Bug 6030917 : prasjain
12327 
12328         RETURN NULL;
12329 
12330 	WHEN OTHERS THEN
12331 
12332 		-- Close open cursors
12333 
12334 		IF line_csr%ISOPEN THEN
12335 			CLOSE line_csr;
12336 		END IF;
12337 
12338         IF line_reporting_csr%ISOPEN THEN
12339             CLOSE line_reporting_csr;
12340         END IF;
12341 
12342          -- Start : Bug 6030917 : prasjain
12343           IF currency_code_csr%ISOPEN THEN
12344               CLOSE currency_code_csr;
12345           END IF;
12346           IF stream_element_csr%ISOPEN THEN
12347               CLOSE stream_element_csr;
12348           END IF;
12349           -- End : Bug 6030917 : prasjain
12350 
12351 		-- store SQL error message on message stack for caller
12352 
12353 		OKL_API.SET_MESSAGE (
12354 			p_app_name	=> OKL_API.G_APP_NAME,
12355 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
12356 			p_token1	=> 'SQLCODE',
12357 			p_token1_value	=> SQLCODE,
12358 			p_token2	=> 'SQLERRM',
12359 			p_token2_value	=> SQLERRM);
12360 
12361 		RETURN null;
12362 
12363 END line_future_income;
12364 
12365   -- Start of Comments
12366   -- Function Name: Asset_Residual
12367   -- Description:   Returns the Residual value for an asset
12368   -- Dependencies:
12369   -- Parameters:    IN:  p_contract_id, p_contract_line_id ,p_additional_paams(quote_id, kle_id)
12370   --                OUT: amount
12371   --                rmunjulu 3816891 created
12372   -- Version:       1.0
12373   -- End of Commnets
12374 ------------------------------------------------------------------------------
12375 
12376   FUNCTION asset_residual(
12377     p_khr_id IN NUMBER,
12378     p_kle_id IN NUMBER)
12379     RETURN NUMBER IS
12380 
12381      Expected_error EXCEPTION;
12382 
12383      -- get the quote type
12384      CURSOR get_qte_type_csr (p_quote_id IN NUMBER) IS
12385      SELECT  qte.qtp_code qtp_code
12386      FROM    okl_trx_quotes_v qte
12387      WHERE   qte.id = p_quote_id;
12388 
12389      -- get asset niv from quote lines
12390      CURSOR get_asset_niv_csr (p_kle_id IN NUMBER, p_quote_id IN NUMBER) IS
12391      SELECT nvl(tql.asset_value,0) residual_value
12392      FROM   okl_txl_quote_lines_v tql
12393      WHERE  tql.qte_id = p_quote_id
12394      AND    tql.qlt_code = 'AMCFIA'
12395      AND    tql.kle_id  = p_kle_id;
12396 
12397      -- get deprn cost from off-lease trn (SECHAWLA)
12398      CURSOR get_deprn_cost_csr (p_kle_id IN NUMBER) IS
12399      SELECT depreciation_cost, ID
12400      FROM   okl_txl_assets_b
12401      WHERE  kle_id = p_kle_id
12402      AND    tal_type = 'AML'
12403      AND    ROWNUM < 2;
12404 
12405      l_quote_id NUMBER;
12406      l_asset_residual NUMBER;
12407      l_quote_type VARCHAR2(300);
12408      l_residual NUMBER;
12409      l_corp_book_cost NUMBER;
12410 
12411   BEGIN
12412 
12413     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
12414        FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
12415        LOOP
12416          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'QUOTE_ID' THEN
12417             l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
12418          END IF;
12419        END LOOP;
12420     END IF;
12421 
12422     IF l_quote_id IS NULL
12423 	OR l_quote_id = OKL_API.G_MISS_NUM
12424 	OR p_khr_id IS NULL
12425 	OR p_khr_id = OKL_API.G_MISS_NUM
12426 	OR p_kle_id IS NULL
12427 	OR p_kle_id = OKL_API.G_MISS_NUM THEN
12428 
12429       RAISE Expected_error;
12430     END IF;
12431 
12432     -- get the quote type
12433     OPEN get_qte_type_csr(l_quote_id);
12434     FETCH get_qte_type_csr INTO l_quote_type;
12435     CLOSE get_qte_type_csr;
12436 
12437     IF l_quote_type IN ( 'TER_MAN_PURCHASE',
12438                          'TER_PURCHASE',
12439                          'TER_RECOURSE',
12440                          'TER_ROLL_PURCHASE') THEN
12441 
12442        -- Get the asset NIV from the quoted quote line
12443        FOR get_asset_niv_rec IN get_asset_niv_csr (p_kle_id,l_quote_id ) LOOP
12444 
12445            l_asset_residual := get_asset_niv_rec.residual_value;
12446        END LOOP;
12447 
12448     ELSE -- termination without purchase
12449 
12450        -- Get the Off-lease trn value
12451        FOR get_deprn_cost_rec IN get_deprn_cost_csr (p_kle_id ) LOOP
12452 
12453            l_asset_residual := get_deprn_cost_rec.depreciation_cost;
12454        END LOOP;
12455     END IF;
12456 
12457     IF l_asset_residual IS NULL THEN
12458 
12459       l_asset_residual := 0;
12460     END IF;
12461 
12462     RETURN l_asset_residual;
12463 
12464   EXCEPTION
12465 
12466     WHEN Expected_error THEN
12467 
12468     RETURN 0;
12469     WHEN OTHERS THEN
12470     -- store SQL error message on message stack for caller
12471     Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
12472                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
12473                         p_token1        => 'OKL_SQLCODE',
12474                         p_token1_value  => SQLCODE,
12475                         p_token2        => 'OKL_SQLERRM',
12476                         p_token2_value  => SQLERRM);
12477     RETURN NULL;
12478   END asset_residual;
12479 
12480   -- rfedane 4058562
12481   FUNCTION principal_balance_fee_line (p_contract_id      IN NUMBER,
12482                                        p_contract_line_id IN NUMBER) RETURN NUMBER IS
12483 
12484     l_fee_payment_id NUMBER;
12485     l_quote_eff_date DATE;
12486     l_date           DATE;
12487     l_prin_bal_id    NUMBER;
12488     l_balance        NUMBER;
12489     l_return_status  VARCHAR2(1);
12490     l_prog_name      VARCHAR2(61) := 'OKL_SEEDED_FUNCTIONS_PVT.principal_balance_fee_line';
12491 
12492     CURSOR c_balance (p_sty_id NUMBER, p_date DATE) IS
12493     SELECT
12494     sel.amount
12495     FROM
12496     okl_strm_elements sel,
12497     okl_streams stm
12498     WHERE
12499     stm.sty_id = p_sty_id
12500     AND   stm.khr_id = p_contract_id
12501     AND   stm.kle_id = p_contract_line_id
12502     AND   sel.stream_element_date <= p_date
12503     AND   stm.say_code = 'CURR'
12504     AND   stm.id = sel.stm_id
12505     ORDER BY sel.stream_element_date DESC;
12506 
12507   BEGIN
12508 
12509       IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
12510         FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST LOOP
12511 
12512         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.EXISTS(i) THEN
12513 
12514           IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_effective_from_date'
12515              AND  okl_execute_formula_pub.g_additional_parameters(i).value IS NOT NULL THEN
12516              l_quote_eff_date := okl_execute_formula_pub.g_additional_parameters(i).value;
12517           END IF;
12518 
12519         END IF;
12520         END LOOP;
12521       END IF;
12522 
12523       IF l_quote_eff_date IS NOT NULL THEN
12524         l_date := l_quote_eff_date;
12525       ELSE
12526         l_date := TRUNC(SYSDATE);
12527       END IF;
12528 
12529       SELECT TO_NUMBER(laslh.object1_id1)
12530       INTO   l_fee_payment_id
12531       FROM   okc_rule_groups_b lalevl,
12532              okc_rules_b laslh
12533       WHERE  lalevl.cle_id = p_contract_line_id
12534       AND    lalevl.rgd_code = 'LALEVL'
12535       AND    lalevl.id = laslh.rgp_id
12536       AND    laslh.rule_information_category = 'LASLH';
12537 
12538       OKL_STREAMS_UTIL.get_dependent_stream_type(
12539               p_khr_id                => p_contract_id,
12540               p_primary_sty_id        => l_fee_payment_id,
12541               p_dependent_sty_purpose => 'PRINCIPAL_BALANCE',
12542               x_return_status         => l_return_status,
12543               x_dependent_sty_id      => l_prin_bal_id);
12544 
12545       OPEN c_balance (p_sty_id => l_prin_bal_id, p_date => l_date);
12546       FETCH c_balance INTO l_balance;
12547       CLOSE c_balance;
12548 
12549       RETURN l_balance;
12550 
12551     EXCEPTION
12552 
12553       WHEN OKL_API.G_EXCEPTION_ERROR THEN
12554         RAISE;
12555 
12556       WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
12557         RAISE;
12558 
12559       WHEN OTHERS THEN
12560 
12561         OKL_API.SET_MESSAGE (p_app_name     => 'OKL',
12562                              p_msg_name     => 'OKL_DB_ERROR',
12563                              p_token1       => 'PROG_NAME',
12564                              p_token1_value => l_prog_name,
12565                              p_token2       => 'SQLCODE',
12566                              p_token2_value => sqlcode,
12567                              p_token3       => 'SQLERRM',
12568                              p_token3_value => sqlerrm);
12569 
12570         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12571 
12572   END principal_balance_fee_line;
12573 
12574 
12575   -- rfedane 4058562
12576   FUNCTION principal_balance_financed (p_contract_id IN NUMBER,
12577                                        p_contract_line_id IN NUMBER) RETURN NUMBER IS
12578 
12579     CURSOR c_fin_fees IS
12580       SELECT cle.id
12581       FROM
12582       okc_k_lines_b cle,
12583       okl_k_lines kle,
12584       okc_k_headers_b chr
12585       WHERE
12586       chr.id = p_contract_id
12587       AND cle.chr_id = chr.id
12588       AND cle.sts_code = chr.sts_code
12589       AND cle.id = kle.id
12590       AND kle.fee_type = 'FINANCED';
12591 
12592     l_total_balance NUMBER := 0;
12593     l_prog_name      VARCHAR2(61) := 'OKL_SEEDED_FUNCTIONS_PVT.principal_balance_financed';
12594 
12595   BEGIN
12596 
12597     FOR l_fin_fee IN c_fin_fees LOOP
12598 
12599     l_total_balance  :=  l_total_balance + NVL(principal_balance_fee_line(p_contract_id => p_contract_id, p_contract_line_id => l_fin_fee.id), 0);
12600 
12601     END LOOP;
12602 
12603     RETURN l_total_balance;
12604 
12605   EXCEPTION
12606 
12607     WHEN OTHERS THEN
12608 
12609       OKL_API.SET_MESSAGE (p_app_name     => 'OKL',
12610                            p_msg_name     => 'OKL_DB_ERROR',
12611                            p_token1       => 'PROG_NAME',
12612                            p_token1_value => l_prog_name,
12613                            p_token2       => 'SQLCODE',
12614                            p_token2_value => sqlcode,
12615                            p_token3       => 'SQLERRM',
12616                            p_token3_value => sqlerrm);
12617 
12618       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12619 
12620   END principal_balance_financed;
12621 
12622 
12623   -- rfedane 4058562
12624   FUNCTION principal_balance_rollover (p_contract_id      IN NUMBER,
12625                                        p_contract_line_id IN NUMBER) RETURN NUMBER IS
12626 
12627     CURSOR c_fin_fees IS
12628       SELECT cle.id
12629       FROM
12630       okc_k_lines_b cle,
12631       okl_k_lines kle,
12632       okc_k_headers_b chr
12633       WHERE
12634       chr.id = p_contract_id
12635       AND cle.chr_id = chr.id
12636       AND cle.sts_code = chr.sts_code
12637       AND cle.id = kle.id
12638       AND kle.fee_type = 'ROLLOVER';
12639 
12640     l_total_balance NUMBER := 0;
12641     l_prog_name      VARCHAR2(61) := 'OKL_SEEDED_FUNCTIONS_PVT.principal_balance_rollover';
12642 
12643   BEGIN
12644 
12645     FOR l_fin_fee IN c_fin_fees LOOP
12646 
12647     l_total_balance  :=  l_total_balance + NVL(principal_balance_fee_line(p_contract_id => p_contract_id, p_contract_line_id => l_fin_fee.id), 0);
12648 
12649     END LOOP;
12650 
12651     RETURN l_total_balance;
12652 
12653   EXCEPTION
12654 
12655     WHEN OTHERS THEN
12656 
12657       OKL_API.SET_MESSAGE (p_app_name     => 'OKL',
12658                            p_msg_name     => 'OKL_DB_ERROR',
12659                            p_token1       => 'PROG_NAME',
12660                            p_token1_value => l_prog_name,
12661                            p_token2       => 'SQLCODE',
12662                            p_token2_value => sqlcode,
12663                            p_token3       => 'SQLERRM',
12664                            p_token3_value => sqlerrm);
12665 
12666       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12667 
12668   END principal_balance_rollover;
12669 
12670   -- rmunjulu 4299668 Added -- modified to call line_accumulated_deprn
12671   FUNCTION asset_net_book_value(
12672     p_khr_id IN NUMBER,
12673     p_kle_id IN NUMBER)
12674     RETURN NUMBER IS
12675 
12676      Expected_error EXCEPTION;
12677 
12678      l_quote_id NUMBER;
12679      l_nbv NUMBER;
12680 
12681      CURSOR get_quote_date_csr (p_qte_id IN NUMBER) IS
12682      SELECT qte.date_effective_from
12683      FROM   okl_trx_quotes_b  qte
12684 	 WHERE  qte.id = p_qte_id;
12685 
12686      l_quote_eff_date DATE;
12687 
12688    CURSOR get_asset_cost_csr (p_kle_id IN NUMBER) IS
12689    SELECT nvl(fab.cost,0) current_cost
12690    FROM   fa_books fab,
12691           fa_book_controls fbc,
12692           okc_k_items_v itm,
12693           okc_k_lines_b kle,
12694           okc_line_styles_v lse
12695    WHERE  fbc.book_class = 'CORPORATE'
12696    AND    fab.book_type_code = fbc.book_type_code
12697    AND    fab.asset_id = itm.object1_id1
12698    AND    itm.cle_id = kle.id
12699    AND    kle.cle_id = p_kle_id
12700    AND    kle.lse_id = lse.id
12701    AND    lse.lty_code = 'FIXED_ASSET'
12702    AND    fab.transaction_header_id_out IS NULL;
12703 
12704    l_asset_deprn NUMBER;
12705    l_current_cost NUMBER;
12706    l_asset_net_book_value NUMBER;
12707 
12708   BEGIN
12709 
12710     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
12711        FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
12712        LOOP
12713          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'QUOTE_ID' THEN
12714             l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
12715          END IF;
12716        END LOOP;
12717     END IF;
12718 
12719     IF p_khr_id IS NULL
12720 	OR p_khr_id = OKL_API.G_MISS_NUM
12721 	OR p_kle_id IS NULL
12722 	OR p_kle_id = OKL_API.G_MISS_NUM THEN
12723 
12724       RAISE Expected_error;
12725     END IF;
12726 
12727     IF l_quote_id IS NOT NULL
12728     AND l_quote_id <> OKL_API.G_MISS_NUM THEN
12729 
12730       OPEN get_quote_date_csr (l_quote_id);
12731       FETCH get_quote_date_csr INTO l_quote_eff_date;
12732       CLOSE get_quote_date_csr;
12733 
12734     ELSE
12735 
12736       l_quote_eff_date := sysdate;
12737 
12738     END IF;
12739 
12740     l_asset_deprn := line_accumulated_deprn(
12741       						p_contract_id       => p_khr_id,
12742       						p_contract_line_id  => p_kle_id);
12743 
12744 
12745     --OPEN get_asset_cost_csr (p_kle_id); -- rmunjulu modified
12746     --FETCH get_asset_cost_csr INTO l_current_cost;
12747     --CLOSE get_asset_cost_csr;
12748 
12749     -- Update to mainline only -- gets converted current cost amount
12750     l_current_cost := line_asset_cost(
12751       						p_contract_id       => p_khr_id,
12752       						p_contract_line_id  => p_kle_id);
12753 
12754     l_asset_net_book_value :=  l_current_cost - l_asset_deprn;
12755 
12756     RETURN l_asset_net_book_value;
12757 
12758   EXCEPTION
12759 
12760     WHEN Expected_error THEN
12761 
12762     IF get_quote_date_csr%ISOPEN THEN
12763       CLOSE get_quote_date_csr;
12764     END IF;
12765     IF get_asset_cost_csr%ISOPEN THEN
12766       CLOSE get_asset_cost_csr;
12767     END IF;
12768     RETURN Null;
12769     WHEN OTHERS THEN
12770     IF get_quote_date_csr%ISOPEN THEN
12771       CLOSE get_quote_date_csr;
12772     END IF;
12773     IF get_asset_cost_csr%ISOPEN THEN
12774       CLOSE get_asset_cost_csr;
12775     END IF;
12776     -- store SQL error message on message stack for caller
12777     Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
12778                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
12779                         p_token1        => 'OKL_SQLCODE',
12780                         p_token1_value  => SQLCODE,
12781                         p_token2        => 'OKL_SQLERRM',
12782                         p_token2_value  => SQLERRM);
12783     RETURN NULL;
12784   END asset_net_book_value;
12785  -- varangan Added for Bug#5036582 start
12786   ----------------------------------------------------------------------------------------------------
12787     -- Start of Comments
12788     -- Created By:      Vaijayanthi Ranganathan (varangan)
12789     -- Function Name:   Contract Unpaid Invoices
12790     -- Description:     Returns the sum of all unpaid invoices for leases/loans,
12791     --                  including taxes, with due date prior to current system date
12792     -- Dependencies:
12793     -- Parameters: contract id,contract line id
12794     -- Version: 1.0
12795     -- End of Commnets
12796   ----------------------------------------------------------------------------------------------------
12797 
12798   FUNCTION contract_unpaid_invoices(
12799     p_contract_id IN NUMBER,
12800     p_contract_line_id IN NUMBER)
12801     RETURN NUMBER IS
12802     --dkagrawa changed the follwong cursor for billing impact
12803     --changed query for Bug#6826370
12804     CURSOR cr_unpaid_invoices(c_contract_id IN NUMBER) IS
12805     SELECT nvl(sum(amount_remaining),0)
12806     FROM   okl_cs_bpd_inv_dtl_v
12807     WHERE  chr_id = c_contract_id
12808     AND    due_date <= SYSDATE;
12809 
12810     l_unpaid_invoices NUMBER;
12811 
12812   BEGIN
12813     OPEN cr_unpaid_invoices (p_contract_id);
12814     FETCH cr_unpaid_invoices INTO l_unpaid_invoices;
12815     CLOSE cr_unpaid_invoices;
12816 
12817     RETURN l_unpaid_invoices;
12818   EXCEPTION
12819     WHEN OTHERS THEN
12820     IF cr_unpaid_invoices%ISOPEN THEN
12821       CLOSE cr_unpaid_invoices;
12822     END IF;
12823     -- store SQL error message on message stack for caller
12824     Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
12825                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
12826                         p_token1        => 'OKL_SQLCODE',
12827                         p_token1_value  => SQLCODE,
12828                         p_token2        => 'OKL_SQLERRM',
12829                         p_token2_value  => SQLERRM);
12830     RETURN NULL;
12831   END contract_unpaid_invoices;
12832 
12833   ----------------------------------------------------------------------------------------------------
12834     -- Start of Comments
12835     -- Created By:      Vaijayanthi Ranganathan (varangan)
12836     -- Function Name:   Contract Unbilled Streams amount
12837     -- Description:     Returns the sum of all Unbilled Streams for leases/loans,
12838     --                  including taxes, with due date prior to current system date
12839     -- Dependencies:
12840     -- Parameters: contract id,contract line id
12841     -- Version: 1.0
12842     -- End of Commnets
12843   ----------------------------------------------------------------------------------------------------
12844   FUNCTION contract_unbilled_streams(
12845     p_contract_id IN NUMBER,
12846     p_contract_line_id IN NUMBER)
12847     RETURN NUMBER IS
12848 
12849     CURSOR cr_unbilled_streams(c_contract_id IN NUMBER) IS
12850     SELECT NVL(sum(sel.amount),0)
12851     FROM   okl_strm_elements sel,
12852            okl_streams stm,
12853            okl_strm_type_b sty
12854     WHERE  stm.say_code = 'CURR'
12855     AND    stm.active_yn = 'Y'
12856     AND    stm.purpose_code is NULL
12857     AND    stm.khr_id = c_contract_id
12858     AND    sty.id = stm.sty_id
12859     AND    sty.billable_yn = 'Y'
12860     AND    sel.stm_id = stm.id
12861     AND    date_billed is null
12862     AND    stream_element_date <= SYSDATE;
12863 
12864     l_unbilled_streams NUMBER;
12865 
12866   BEGIN
12867     OPEN cr_unbilled_streams (p_contract_id);
12868     FETCH cr_unbilled_streams INTO l_unbilled_streams;
12869     CLOSE cr_unbilled_streams;
12870 
12871     RETURN l_unbilled_streams;
12872   EXCEPTION
12873     WHEN OTHERS THEN
12874     IF cr_unbilled_streams%ISOPEN THEN
12875       CLOSE cr_unbilled_streams;
12876     END IF;
12877     -- store SQL error message on message stack for caller
12878     Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
12879                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
12880                         p_token1        => 'OKL_SQLCODE',
12881                         p_token1_value  => SQLCODE,
12882                         p_token2        => 'OKL_SQLERRM',
12883                         p_token2_value  => SQLERRM);
12884     RETURN NULL;
12885   END contract_unbilled_streams;
12886   -- varangan Bug#5036582 end
12887 
12888 
12889   -- rmunjulu VENDOR_RESIDUAL_SHARE PROJECT
12890   FUNCTION vendor_residual_share_amount(
12891     p_khr_id IN NUMBER,
12892     p_kle_id IN NUMBER)
12893     RETURN NUMBER IS
12894 
12895     CURSOR get_asset_residual_csr (p_kle_id IN NUMBER) IS
12896     SELECT nvl(KLE.residual_value,0) residual_value
12897     FROM   OKL_K_LINES KLE
12898     WHERE  KLE.id = p_kle_id;
12899 
12900     CURSOR get_asset_sales_proceeds_csr (p_retirement_id IN NUMBER) IS
12901     SELECT nvl(RET.proceeds_of_sale,0) sales_proceeds
12902     FROM   --OKX_ASSET_LINES_V OAL,
12903            FA_RETIREMENTS RET
12904     WHERE  RET.RETIREMENT_ID = p_retirement_id;
12905     --WHERE  OAL.parent_line_id = p_kle_id
12906     --AND    OAL.corporate_book IS NOT NULL
12907     --AND    OAL.asset_id = FAR.asset_id
12908     --AND    OAL.corporate_book = FAR.book_type_code;
12909 
12910      EXPECTED_ERROR EXCEPTION;
12911 
12912      l_sales_proceeds NUMBER;
12913      l_share_percent NUMBER;
12914      l_residual_value NUMBER;
12915      l_share_amount NUMBER;
12916      l_currency_code VARCHAR2(15);
12917      l_contract_currency_code VARCHAR2(15);
12918      l_currency_conversion_type VARCHAR2(30);
12919      l_currency_conversion_rate NUMBER;
12920      l_currency_conversion_date DATE;
12921      l_converted_sales_proceeds NUMBER;
12922      l_return_status VARCHAR2(3);
12923      l_retirement_id NUMBER;
12924 
12925   BEGIN
12926 
12927     IF p_khr_id IS NULL
12928 	OR p_khr_id = OKL_API.G_MISS_NUM
12929 	OR p_kle_id IS NULL
12930 	OR p_kle_id = OKL_API.G_MISS_NUM THEN
12931 
12932       OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
12933                           p_msg_name     => 'OKL_INVALID_VALUE',
12934                           p_token1       => 'COL_NAME',
12935                           p_token1_value => 'P_KHR_ID OR P_KLE_ID');
12936 
12937       RAISE EXPECTED_ERROR;
12938     END IF;
12939 
12940     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
12941        FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
12942        LOOP
12943          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'retirement_id' THEN
12944             l_retirement_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
12945          END IF;
12946        END LOOP;
12947     END IF;
12948 
12949     IF l_retirement_id IS NULL
12950 	OR l_retirement_id = OKL_API.G_MISS_NUM THEN
12951 
12952       OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
12953                           p_msg_name     => 'OKL_INVALID_VALUE',
12954                           p_token1       => 'COL_NAME',
12955                           p_token1_value => 'retirement_id');
12956 
12957       RAISE EXPECTED_ERROR;
12958     END IF;
12959 
12960     l_sales_proceeds := 0;
12961     l_residual_value := 0;
12962     l_share_percent  := 0;
12963     l_share_amount   := 0;
12964 
12965     OPEN  get_asset_residual_csr (p_kle_id);
12966     FETCH get_asset_residual_csr INTO l_residual_value;
12967     CLOSE get_asset_residual_csr;
12968 
12969     -- get sales proceeds for the retirement id
12970     OPEN  get_asset_sales_proceeds_csr (l_retirement_id);
12971     FETCH get_asset_sales_proceeds_csr INTO l_sales_proceeds;
12972     CLOSE get_asset_sales_proceeds_csr;
12973 
12974     -- Get the contract currency code
12975     l_currency_code := OKL_AM_UTIL_PVT.get_chr_currency(p_khr_id);
12976 
12977     -- Convert sales_proceeds from functional_currency to contract_currency
12978     OKL_ACCOUNTING_UTIL.convert_to_contract_currency(
12979                      p_khr_id  		  	          => p_khr_id,
12980                      p_from_currency   		      => l_currency_code,
12981                      p_transaction_date 		  => sysdate,
12982                      p_amount 			          => l_sales_proceeds,
12983                      x_return_status              => l_return_status,
12984                      x_contract_currency		  => l_contract_currency_code,
12985                      x_currency_conversion_type	  => l_currency_conversion_type,
12986                      x_currency_conversion_rate	  => l_currency_conversion_rate,
12987                      x_currency_conversion_date	  => l_currency_conversion_date,
12988                      x_converted_amount 		  => l_converted_sales_proceeds);
12989 
12990     IF  l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
12991       RAISE EXPECTED_ERROR;
12992     END IF;
12993 
12994     l_share_amount := nvl(l_converted_sales_proceeds,0) - nvl(l_residual_value,0);
12995 
12996     RETURN l_share_amount; -- has no share percent included, percent will be applied later
12997 
12998   EXCEPTION
12999 
13000     WHEN EXPECTED_ERROR THEN
13001 
13002     IF get_asset_residual_csr%ISOPEN THEN
13003       CLOSE get_asset_residual_csr;
13004     END IF;
13005 
13006     IF get_asset_sales_proceeds_csr%ISOPEN THEN
13007       CLOSE get_asset_sales_proceeds_csr;
13008     END IF;
13009 
13010     RETURN NULL;
13011 
13012     WHEN OTHERS THEN
13013 
13014     IF get_asset_residual_csr%ISOPEN THEN
13015       CLOSE get_asset_residual_csr;
13016     END IF;
13017 
13018     IF get_asset_sales_proceeds_csr%ISOPEN THEN
13019       CLOSE get_asset_sales_proceeds_csr;
13020     END IF;
13021 
13022     -- store SQL error message on message stack for caller
13023     Okl_Api.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
13024                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
13025                         p_token1        => 'OKL_SQLCODE',
13026                         p_token1_value  => SQLCODE,
13027                         p_token2        => 'OKL_SQLERRM',
13028                         p_token2_value  => SQLERRM);
13029     RETURN NULL;
13030   END vendor_residual_share_amount;
13031 
13032   -- rmunjulu LOANS_ENHANCEMENTS PROJECT
13033   FUNCTION loan_asset_prin_bal(
13034     p_khr_id IN NUMBER,
13035     p_kle_id IN NUMBER)
13036     RETURN NUMBER IS
13037 
13038      CURSOR get_quote_date_csr (p_qte_id IN NUMBER) IS
13039      SELECT qte.date_effective_from
13040      FROM   okl_trx_quotes_b  qte
13041 	 WHERE  qte.id = p_qte_id;
13042 
13043      EXPECTED_ERROR EXCEPTION;
13044 
13045      l_return_status VARCHAR2(3);
13046      l_quote_id NUMBER;
13047      l_quote_eff_from DATE;
13048      l_prin_bal NUMBER;
13049 
13050   BEGIN
13051 
13052     IF p_khr_id IS NULL
13053 	OR p_khr_id = OKL_API.G_MISS_NUM
13054 	OR p_kle_id IS NULL
13055 	OR p_kle_id = OKL_API.G_MISS_NUM THEN
13056 
13057       OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
13058                           p_msg_name     => 'OKL_INVALID_VALUE',
13059                           p_token1       => 'COL_NAME',
13060                           p_token1_value => 'P_KHR_ID OR P_KLE_ID');
13061 
13062       RAISE EXPECTED_ERROR;
13063     END IF;
13064 
13065     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
13066        FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
13067        LOOP
13068          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
13069             l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
13070          END IF;
13071        END LOOP;
13072     END IF;
13073 
13074     IF l_quote_id IS NULL THEN
13075 
13076       OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
13077                           p_msg_name     => 'OKL_INVALID_VALUE',
13078                           p_token1       => 'COL_NAME',
13079                           p_token1_value => 'quote_id');
13080 
13081       RAISE EXPECTED_ERROR;
13082     END IF;
13083 
13084     OPEN get_quote_date_csr (l_quote_id);
13085     FETCH get_quote_date_csr INTO l_quote_eff_from;
13086     CLOSE get_quote_date_csr;
13087 
13088 
13089     -- call util to get actual principal balance
13090     l_prin_bal := OKL_VARIABLE_INT_UTIL_PVT.get_principal_bal(
13091         x_return_status  => l_return_status,
13092         p_khr_id         => p_khr_id,
13093         p_kle_id         => p_kle_id,
13094         p_date           => l_quote_eff_from);
13095 
13096     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
13097        RAISE EXPECTED_ERROR;
13098     END IF;
13099 
13100 
13101     RETURN l_prin_bal;
13102 
13103   EXCEPTION
13104 
13105     WHEN EXPECTED_ERROR THEN
13106 
13107     IF get_quote_date_csr%ISOPEN THEN
13108       CLOSE get_quote_date_csr;
13109     END IF;
13110 
13111     RETURN NULL;
13112 
13113     WHEN OTHERS THEN
13114 
13115     IF get_quote_date_csr%ISOPEN THEN
13116       CLOSE get_quote_date_csr;
13117     END IF;
13118 
13119     -- store SQL error message on message stack for caller
13120     Okl_Api.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
13121                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
13122                         p_token1        => 'OKL_SQLCODE',
13123                         p_token1_value  => SQLCODE,
13124                         p_token2        => 'OKL_SQLERRM',
13125                         p_token2_value  => SQLERRM);
13126     RETURN NULL;
13127   END loan_asset_prin_bal;
13128 
13129   -- rmunjulu LOANS_ENHANCEMENTS PROJECT
13130   --SECHAWLA 30-NOV-05 4753429 : Modified to return perdiem amount for only LOANS/REVOLVING-LOANS
13131   --SECHAWLA 03-JAN-06 4920149 : Treat interest rate returned by the API OKL_VARIABLE_INT_UTIL_PVT
13132   --                             as a percentage
13133   FUNCTION quote_perdiem_amount(
13134     p_khr_id IN NUMBER,
13135     p_kle_id IN NUMBER)
13136     RETURN NUMBER IS
13137 
13138 
13139 
13140      CURSOR get_tot_outstanding_bal_csr (p_qte_id IN NUMBER) IS
13141      SELECT sum(TQL.asset_value) outstanding_bal
13142      FROM   OKL_TXL_QUOTE_LINES_B TQL
13143      WHERE  TQL.qte_id = p_qte_id
13144 	 AND    TQL.qlt_code = 'AMCFIA';
13145 
13146      CURSOR get_quote_date_csr (p_qte_id IN NUMBER) IS
13147      SELECT qte.date_effective_from
13148      FROM   okl_trx_quotes_b  qte
13149 	 WHERE  qte.id = p_qte_id;
13150 
13151      CURSOR get_base_interest_rate_csr (p_khr_id IN NUMBER) IS
13152      SELECT base_rate
13153      FROM   okl_k_rate_params_v
13154 	 WHERE  khr_id = p_khr_id;
13155 
13156 	 --SECHAWLA 30-NOV-05 4753429 : New declarations begin
13157      CURSOR l_dealtype_csr (cp_khr_id IN NUMBER) IS
13158 	 SELECT deal_type
13159 	 FROM   OKL_K_HEADERS
13160 	 WHERE  id = cp_khr_id;
13161 
13162 	 l_deal_type		VARCHAR2(30);
13163 	 --SECHAWLA 30-NOV-05 4753429 : New declarations end
13164 
13165      EXPECTED_ERROR EXCEPTION;
13166 
13167      l_outstanding_bal NUMBER;
13168      l_return_status VARCHAR2(3);
13169      l_quote_id NUMBER;
13170      l_quote_eff_from DATE;
13171      l_interest_rate NUMBER;
13172      l_quote_perdiem NUMBER;
13173 
13174 	 IsLeapYear BOOLEAN;
13175      iYear NUMBER;
13176 
13177      l_days_in_year NUMBER;
13178      --gboomina Bug#4703521 27-Oct-05 start
13179      lx_days_in_month OKL_K_RATE_PARAMS.days_in_a_month_code%type; --gboomina Bug#4703521 27-Oct-05 - changed VARCHAR2(5) to OKL_K_RATE_PARAMS.days_in_a_month_code%type
13180      lx_days_in_year OKL_K_RATE_PARAMS.days_in_a_month_code%type; --gboomina Bug#4703521 27-Oct-05 - changed  VARCHAR2(5) to OKL_K_RATE_PARAMS.days_in_a_month_code%type
13181      --gboomina Bug#4703521 27-Oct-05 end
13182      lx_return_status VARCHAR2(3);
13183 
13184 
13185 
13186   BEGIN
13187 
13188     --SECHAWLA 30-NOV-05 4753429 : begin
13189 
13190     l_quote_perdiem := 0;
13191 
13192     OPEN  l_dealtype_csr(p_khr_id);
13193     FETCH l_dealtype_csr INTO l_deal_type;
13194     CLOSE l_dealtype_csr;
13195 
13196     IF l_deal_type LIKE 'LOAN%' THEN
13197        --SECHAWLA 30-NOV-05 4753429 : end
13198 
13199     	l_outstanding_bal := 0;
13200 
13201 
13202 
13203     	IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
13204        	FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
13205        		LOOP
13206          		IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'QUOTE_ID' THEN
13207             		l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
13208          		END IF;
13209        		END LOOP;
13210     	END IF;
13211 
13212     	IF l_quote_id IS NULL THEN
13213 
13214       		OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
13215                           p_msg_name     => 'OKL_INVALID_VALUE',
13216                           p_token1       => 'COL_NAME',
13217                           p_token1_value => 'QUOTE_ID');
13218 
13219       		RAISE EXPECTED_ERROR;
13220     	END IF;
13221 
13222     	OPEN  get_tot_outstanding_bal_csr (l_quote_id);
13223     	FETCH get_tot_outstanding_bal_csr INTO l_outstanding_bal;
13224     	CLOSE get_tot_outstanding_bal_csr;
13225 
13226     	OPEN get_quote_date_csr (l_quote_id);
13227     	FETCH get_quote_date_csr INTO l_quote_eff_from;
13228     	CLOSE get_quote_date_csr;
13229 
13230     	-- get effective interest rate
13231     	l_interest_rate := OKL_VARIABLE_INT_UTIL_PVT.get_effective_int_rate(
13232                              x_return_status  => l_return_status,
13233                              p_khr_id         => p_khr_id,
13234                              p_effective_date => l_quote_eff_from);
13235 
13236     	IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
13237       		RAISE EXPECTED_ERROR;
13238     	END IF;
13239 
13240 		-- use utility for getting the days (from SGT or Contract)
13241     	OKL_PRICING_UTILS_PVT.get_day_convention(
13242                p_id              => p_khr_id,   -- ID of the contract/quote
13243                p_source          => 'ESG', -- 'ESG'/'ISG' are acceptable values
13244                x_days_in_month   => lx_days_in_month,
13245                x_days_in_year    => lx_days_in_year,
13246                x_return_status   => lx_return_status);
13247 
13248     	IF lx_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
13249 	   		RAISE EXPECTED_ERROR;
13250 		END IF;
13251 
13252     	IF lx_days_in_year = 'ACTUAL' THEN
13253 
13254       		-- get year of termination
13255       		iYear := to_number(substr(to_char(trunc(l_quote_eff_from),'YYYY/DD/MON'),1,4));
13256 
13257 	  		-- check if leap year
13258       		If (iYear Mod 4 = 0) And
13259       		((iYear Mod 100 <> 0) Or (iYear Mod 400 = 0)) Then
13260          		IsLeapYear := True;
13261       		Else
13262          		IsLeapYear := False;
13263       		End If;
13264 
13265       		IF IsLeapYear THEN
13266          		l_days_in_year := 366;
13267      		ELSE
13268          		l_days_in_year := 365;
13269       		END IF;
13270 
13271     	ELSE
13272 	   		l_days_in_year := to_number(lx_days_in_year);
13273 		END IF;
13274 
13275 		IF l_days_in_year IS NULL OR l_days_in_year = 0 THEN
13276 	  		l_days_in_year := 365;
13277 		END IF;
13278 
13279     	--l_quote_perdiem := nvl(l_outstanding_bal,0) * nvl(l_interest_rate,0) /l_days_in_year;
13280     	-- SECHAWLA 03-JAN-06 4920149 l_interest_rate is a percentage
13281     	l_quote_perdiem := nvl(l_outstanding_bal,0) * nvl((l_interest_rate/100),0) /l_days_in_year;
13282     END IF; --SECHAWLA 30-NOV-05 4753429
13283 
13284     RETURN l_quote_perdiem;
13285 
13286   EXCEPTION
13287 
13288     WHEN EXPECTED_ERROR THEN
13289 
13290     IF get_tot_outstanding_bal_csr%ISOPEN THEN
13291       CLOSE get_tot_outstanding_bal_csr;
13292     END IF;
13293 
13294     IF get_quote_date_csr%ISOPEN THEN
13295       CLOSE get_quote_date_csr;
13296     END IF;
13297 
13298     --SECHAWLA 30-NOV-05 4753429 : Added
13299     IF l_dealtype_csr%ISOPEN THEN
13300       CLOSE l_dealtype_csr;
13301     END IF;
13302 
13303     RETURN NULL;
13304 
13305     WHEN OTHERS THEN
13306 
13307     IF get_tot_outstanding_bal_csr%ISOPEN THEN
13308       CLOSE get_tot_outstanding_bal_csr;
13309     END IF;
13310 
13311     IF get_quote_date_csr%ISOPEN THEN
13312       CLOSE get_quote_date_csr;
13313     END IF;
13314 
13315     --SECHAWLA 30-NOV-05 4753429 : Added
13316     IF l_dealtype_csr%ISOPEN THEN
13317       CLOSE l_dealtype_csr;
13318     END IF;
13319 
13320     -- store SQL error message on message stack for caller
13321     Okl_Api.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
13322                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
13323                         p_token1        => 'OKL_SQLCODE',
13324                         p_token1_value  => SQLCODE,
13325                         p_token2        => 'OKL_SQLERRM',
13326                         p_token2_value  => SQLERRM);
13327     RETURN NULL;
13328   END quote_perdiem_amount;
13329 
13330   -- sjalasut, Rebook Change Control Enhancement START
13331 
13332   -- function that returns the sum of unbilled RENT for all active assets on the rebook copy of the contract
13333   FUNCTION cont_rbk_unbilled_receivables(p_contract_id okc_k_headers_b.id%TYPE
13334                                         ,p_contract_line_id okc_k_lines_b.id%TYPE DEFAULT OKL_API.G_MISS_NUM) RETURN NUMBER IS
13335 
13336     -- get all unbilled receivables for all ACTIVE assets
13337     CURSOR cle_rents_csr(cp_contract_id okc_k_headers_b.id%TYPE) IS
13338     SELECT NVL(SUM(sele.amount),0)
13339       FROM okl_strm_elements sele
13340           ,okl_streams str
13341           ,okl_strm_type_v sty
13342           ,okc_k_lines_v line
13343           ,okc_statuses_b sts
13344           ,okc_line_styles_b style
13345      WHERE sele.stm_id = str.id
13346        AND str.sty_id = sty.id
13347        AND sty.stream_type_purpose = 'RENT'
13348        AND str.say_code = 'CURR'
13349        AND str.active_yn = 'Y'
13350        AND str.purpose_code IS NULL
13351        AND sele.date_billed IS NULL
13352        AND line.chr_id = str.khr_id
13353        AND line.id = str.kle_id
13354        AND line.lse_id = style.id
13355        AND style.lty_code = 'FREE_FORM1'
13356        AND line.sts_code = sts.code
13357        AND sts.ste_code = 'ACTIVE'
13358        AND str.khr_id = cp_contract_id;
13359     lv_rent_assets NUMBER;
13360 
13361     lv_unbilled_recv NUMBER;
13362   BEGIN
13363     IF(p_contract_id IS NOT NULL AND p_contract_id <> OKL_API.G_MISS_NUM)THEN
13364       -- initialize
13365       lv_unbilled_recv := 0;
13366       lv_rent_assets := 0;
13367 
13368        -- ASSET level RENTS
13369        OPEN cle_rents_csr(cp_contract_id => p_contract_id); FETCH cle_rents_csr INTO lv_rent_assets;
13370        CLOSE cle_rents_csr;
13371 
13372        lv_unbilled_recv := lv_rent_assets;
13373     END IF;
13374     RETURN lv_unbilled_recv;
13375   EXCEPTION
13376  	WHEN OTHERS THEN
13377     IF(cle_rents_csr%ISOPEN)THEN
13378       CLOSE cle_rents_csr;
13379     END IF;
13380     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME
13381                        ,p_msg_name     => G_UNEXPECTED_ERROR
13382                        ,p_token1       => G_SQLCODE_TOKEN
13383                        ,p_token1_value => SQLCODE
13384                        ,p_token2       => G_SQLERRM_TOKEN
13385                        ,p_token2_value => SQLERRM);
13386     RETURN NULL;
13387   END cont_rbk_unbilled_receivables;
13388 
13389   -- function that returns the sum of pre-tax income that was not accrued for all active assets on the rebook copy of the contract
13390   FUNCTION cont_rbk_unearned_income(p_contract_id okc_k_headers_b.id%TYPE
13391                                    ,p_contract_line_id okc_k_lines_b.id%TYPE DEFAULT OKL_API.G_MISS_NUM) RETURN NUMBER IS
13392 
13393     CURSOR c_pre_tax_csr(cp_contract_id okc_k_headers_b.id%TYPE) IS
13394     SELECT NVL(SUM(sele.amount),0)
13395       FROM okl_strm_elements sele
13396           --,okl_streams str  MGAAP 7263041
13397           ,okl_streams_rep_v str
13398           ,okl_strm_type_v sty
13399           ,okc_k_lines_b line
13400           ,okc_line_styles_b style
13401           ,okc_statuses_b sts
13402      WHERE sele.stm_id = str.id
13403        AND str.sty_id = sty.id
13404        AND UPPER(sty.stream_type_purpose) = 'LEASE_INCOME'     -- pre-tax income has steam type purpose as lease_income
13405        AND str.say_code = 'CURR'
13406        AND STR.ACTIVE_YN = 'Y'
13407        AND (STR.PURPOSE_CODE IS NULL OR STR.PURPOSE_CODE='REPORT')
13408        AND nvl(sele.accrued_yn,'N') = 'N'
13409        AND str.kle_id = line.id
13410        AND line.lse_id = style.id
13411        AND style.lty_code = 'FREE_FORM1'
13412        AND line.sts_code = sts.code
13413        AND sts.ste_code = 'ACTIVE'
13414        AND line.chr_id = cp_contract_id;
13415     lv_pre_tax_income NUMBER;
13416   BEGIN
13417     IF(p_contract_id IS NOT NULL AND p_contract_id <> OKL_API.G_MISS_NUM)THEN
13418       lv_pre_tax_income := 0;
13419       OPEN c_pre_tax_csr(cp_contract_id => p_contract_id); FETCH c_pre_tax_csr INTO lv_pre_tax_income;
13420       CLOSE c_pre_tax_csr;
13421     END IF;
13422     RETURN lv_pre_tax_income;
13423   EXCEPTION
13424  	WHEN OTHERS THEN
13425     IF(c_pre_tax_csr%ISOPEN)THEN
13426       CLOSE c_pre_tax_csr;
13427     END IF;
13428     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME
13429                        ,p_msg_name     => G_UNEXPECTED_ERROR
13430                        ,p_token1       => G_SQLCODE_TOKEN
13431                        ,p_token1_value => SQLCODE
13432                        ,p_token2       => G_SQLERRM_TOKEN
13433                        ,p_token2_value => SQLERRM);
13434     RETURN NULL;
13435   END cont_rbk_unearned_income;
13436 
13437   -- returns sum of rent not billed for all terminated assets
13438   -- do not send p_contract_line_id as okl_api.g_miss_num
13439   FUNCTION cont_tmt_unbilled_receivables(p_contract_id okc_k_headers_b.id%TYPE
13440                                         ,p_contract_line_id okc_k_lines_b.id%TYPE DEFAULT OKL_API.G_MISS_NUM) RETURN NUMBER IS
13441     -- get all unbilled receivables for all TERMINATED assets
13442     CURSOR cle_rents_csr(cp_contract_id okc_k_headers_b.id%TYPE
13443                         ,cp_contract_line_id okc_k_lines_b.id%TYPE) IS
13444     SELECT NVL(SUM(sele.amount),0)
13445       FROM okl_strm_elements sele
13446           ,okl_streams str
13447           ,okl_strm_type_v sty
13448           ,okc_k_lines_v line
13449           -- ,okc_statuses_b sts
13450           ,okc_line_styles_b style
13451      WHERE sele.stm_id = str.id
13452        AND str.sty_id = sty.id
13453        AND sty.stream_type_purpose = 'RENT'
13454        AND str.say_code = 'CURR'
13455        AND str.active_yn = 'Y'
13456        AND str.purpose_code IS NULL
13457        AND sele.date_billed IS NULL
13458        AND line.chr_id = str.khr_id
13459        AND line.id = str.kle_id
13460        AND line.lse_id = style.id
13461        AND style.lty_code = 'FREE_FORM1'
13462        -- AND line.sts_code = sts.code
13463        -- AND sts.ste_code = 'TERMINATED'
13464        AND str.khr_id = cp_contract_id
13465        AND line.id = NVL(cp_contract_line_id, line.id);
13466     lv_rent_assets NUMBER;
13467 
13468     lv_unbilled_recv NUMBER;
13469   BEGIN
13470     IF(p_contract_id IS NOT NULL AND p_contract_id <> OKL_API.G_MISS_NUM)THEN
13471       -- initialize
13472       lv_unbilled_recv := 0;
13473       lv_rent_assets := 0;
13474 
13475        -- ASSET level RENTS
13476        OPEN cle_rents_csr(cp_contract_id => p_contract_id, cp_contract_line_id => p_contract_line_id); FETCH cle_rents_csr INTO lv_rent_assets;
13477        CLOSE cle_rents_csr;
13478 
13479        lv_unbilled_recv := lv_rent_assets;
13480     END IF;
13481     RETURN lv_unbilled_recv;
13482   EXCEPTION
13483  	WHEN OTHERS THEN
13484     IF(cle_rents_csr%ISOPEN)THEN
13485       CLOSE cle_rents_csr;
13486     END IF;
13487     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME
13488                        ,p_msg_name     => G_UNEXPECTED_ERROR
13489                        ,p_token1       => G_SQLCODE_TOKEN
13490                        ,p_token1_value => SQLCODE
13491                        ,p_token2       => G_SQLERRM_TOKEN
13492                        ,p_token2_value => SQLERRM);
13493     RETURN NULL;
13494   END cont_tmt_unbilled_receivables;
13495 
13496   -- returns sum of  pre tax income not accrued for all terminated assets
13497   -- do not send p_contract_line_id as okl_api.g_miss_num
13498   FUNCTION cont_tmt_unearned_income(p_contract_id okc_k_headers_b.id%TYPE
13499                                    ,p_contract_line_id okc_k_lines_b.id%TYPE DEFAULT OKL_API.G_MISS_NUM) RETURN NUMBER IS
13500     CURSOR c_pre_tax_csr(cp_contract_id okc_k_headers_b.id%TYPE ,cp_contract_line_id okc_k_lines_b.id%TYPE) IS
13501     SELECT NVL(SUM(sele.amount),0)
13502       FROM okl_strm_elements sele
13503           --,okl_streams str  MGAAP 7263041
13504           ,okl_streams_rep_v str
13505           ,okl_strm_type_v sty
13506           ,okc_k_lines_b line
13507           ,okc_line_styles_b style
13508           -- ,okc_statuses_b sts
13509      WHERE sele.stm_id = str.id
13510        AND str.sty_id = sty.id
13511        AND UPPER(sty.stream_type_purpose) = 'LEASE_INCOME'     -- pre-tax income has steam type purpose as lease_income
13512        AND str.say_code = 'CURR'
13513        AND STR.ACTIVE_YN = 'Y'
13514        AND (STR.PURPOSE_CODE IS NULL OR STR.PURPOSE_CODE='REPORT')
13515        AND nvl(sele.accrued_yn,'N') = 'N'
13516        AND str.kle_id = line.id
13517        AND line.lse_id = style.id
13518        AND style.lty_code = 'FREE_FORM1'
13519        -- AND line.sts_code = sts.code
13520        -- AND sts.ste_code = 'TERMINATED'
13521        AND line.chr_id = cp_contract_id
13522        AND line.id = NVL(cp_contract_line_id, line.id);
13523     lv_pre_tax_income NUMBER;
13524   BEGIN
13525     IF(p_contract_id IS NOT NULL AND p_contract_id <> OKL_API.G_MISS_NUM)THEN
13526       lv_pre_tax_income := 0;
13527       OPEN c_pre_tax_csr(cp_contract_id => p_contract_id, cp_contract_line_id => p_contract_line_id); FETCH c_pre_tax_csr INTO lv_pre_tax_income;
13528       CLOSE c_pre_tax_csr;
13529     END IF;
13530     RETURN lv_pre_tax_income;
13531   EXCEPTION
13532  	WHEN OTHERS THEN
13533     IF(c_pre_tax_csr%ISOPEN)THEN
13534       CLOSE c_pre_tax_csr;
13535     END IF;
13536     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME
13537                        ,p_msg_name     => G_UNEXPECTED_ERROR
13538                        ,p_token1       => G_SQLCODE_TOKEN
13539                        ,p_token1_value => SQLCODE
13540                        ,p_token2       => G_SQLERRM_TOKEN
13541                        ,p_token2_value => SQLERRM);
13542     RETURN NULL;
13543   END cont_tmt_unearned_income;
13544 
13545   -- sjalasut, Rebook Change Control Enhancement END
13546 
13547 -- Begin - varangan-Bug#5009351
13548  ----------------------------------------------------------------------------------------------------
13549    -- Start of Comments
13550    -- Created By:      Vaijayanthi (varangan)
13551    -- Function Name:   contract_next_payment_amount
13552    -- Description:    Returns the sum of all billable stream elements,
13553    --                 excluding taxes, which fall on the next payment date
13554    -- Dependencies:
13555    -- Parameters: contract id,contract line id
13556    -- Version: 1.0
13557    -- End of Commnets
13558  ----------------------------------------------------------------------------------------------------
13559  FUNCTION contract_next_payment_amount(
13560    p_contract_id IN NUMBER,
13561    p_contract_line_id IN NUMBER)
13562    RETURN NUMBER IS
13563 
13564    CURSOR cr_next_payment_date(c_contract_id IN NUMBER) IS
13565    SELECT MIN(sel.stream_element_date)
13566    FROM   okl_strm_elements sel,
13567           okl_streams stm,
13568           okl_strm_type_v sty
13569    WHERE  stm.sty_id = sty.id
13570    AND    stm.say_code = 'CURR'
13571    AND    stm.active_yn = 'Y'
13572    AND    sty.billable_yn = 'Y'
13573    AND    sty.code NOT LIKE '%TAX%'
13574    AND    stm.purpose_code is NULL
13575    AND    stm.khr_id = c_contract_id
13576    AND    sel.stm_id = stm.id
13577    AND    sel.stream_element_date > sysdate;
13578 
13579    CURSOR cr_next_payment_amt(c_contract_id IN NUMBER,
13580                               c_next_due_date IN DATE) IS
13581    SELECT NVL(sum(sel.amount),0)
13582    FROM okl_strm_elements sel,
13583             okl_streams stm,
13584             okl_strm_type_v sty
13585    WHERE stm.sty_id = sty.id
13586    AND stm.say_code = 'CURR'
13587    AND stm.active_yn = 'Y'
13588    AND sty.billable_yn = 'Y'
13589    AND sty.code NOT LIKE '%TAX%'
13590    AND stm.purpose_code is NULL
13591    AND stm.khr_id = c_contract_id
13592    AND sel.stm_id = stm.id
13593    AND sel.stream_element_date = c_next_due_date;
13594 
13595    l_next_payment_date    DATE;
13596    l_next_payment_amt     NUMBER;
13597  BEGIN
13598    OPEN cr_next_payment_date(p_contract_id);
13599    FETCH cr_next_payment_date INTO l_next_payment_date;
13600    CLOSE cr_next_payment_date;
13601 
13602    OPEN cr_next_payment_amt(p_contract_id,l_next_payment_date);
13603    FETCH cr_next_payment_amt INTO l_next_payment_amt;
13604    CLOSE cr_next_payment_amt;
13605    RETURN l_next_payment_amt;
13606 
13607  EXCEPTION
13608    WHEN OTHERS THEN
13609      IF cr_next_payment_date%ISOPEN THEN
13610        CLOSE cr_next_payment_date;
13611      END IF;
13612      IF cr_next_payment_amt%ISOPEN THEN
13613        CLOSE cr_next_payment_amt;
13614      END IF;
13615      -- store SQL error message on message stack for caller
13616      Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
13617                          p_msg_name      => 'OKL_UNEXPECTED_ERROR',
13618                          p_token1        => 'OKL_SQLCODE',
13619                          p_token1_value  => SQLCODE,
13620                          p_token2        => 'OKL_SQLERRM',
13621                          p_token2_value  => SQLERRM);
13622      RETURN NULL;
13623  END contract_next_payment_amount;
13624  -- End - varangan-Bug#5009351
13625 
13626   -- Added by rravikir -- Bug 5055835
13627 
13628   -- ############################################################
13629   -- FUNCTION get_leaseapp_id
13630   -- This function fetches the Lease Application Info
13631   -- associated to the Contract
13632   -- ############################################################
13633   FUNCTION get_leaseapp_id(p_contract_id IN NUMBER)
13634     RETURN NUMBER IS
13635 
13636     CURSOR c_get_lease_app IS
13637     SELECT orig_system_id1
13638     FROM okc_k_headers_b
13639     WHERE id = p_contract_id
13640     AND orig_system_source_code = 'OKL_LEASE_APP';
13641 
13642     ln_lease_app_id	NUMBER;
13643   BEGIN
13644     OPEN c_get_lease_app;
13645     FETCH c_get_lease_app INTO ln_lease_app_id;
13646     CLOSE c_get_lease_app;
13647 
13648     RETURN ln_lease_app_id;
13649   EXCEPTION
13650    WHEN OTHERS THEN
13651      IF c_get_lease_app%ISOPEN THEN
13652        CLOSE c_get_lease_app;
13653      END IF;
13654      RETURN NULL;
13655   END get_leaseapp_id;
13656 
13657   -- ######################################################################
13658   -- FUNCTION check_contract_fin_amount
13659   -- This function checks for total financed amount on contract is
13660   -- equal to or less than the total amount approved on a Lease Application
13661   -- ######################################################################
13662   FUNCTION check_contract_fin_amount(p_contract_id IN NUMBER,
13663   									 p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
13664     RETURN VARCHAR2 IS
13665 
13666     ln_contract_financed_amount	NUMBER;
13667     ln_leaseapp_financed_amount NUMBER;
13668     ln_lease_app_id	NUMBER;
13669     ln_quote_id		NUMBER;
13670 
13671     CURSOR c_get_primary_quote(p_leaseapp_id IN NUMBER) IS
13672     SELECT id
13673     FROM okl_lease_quotes_b
13674     WHERE parent_object_id = p_leaseapp_id
13675     AND parent_object_code = 'LEASEAPP'
13676     AND primary_quote = 'Y';
13677 
13678   BEGIN
13679     ln_contract_financed_amount := contract_financed_amount(p_contract_id  =>  p_contract_id,
13680 														    p_contract_line_id  => null);
13681 
13682     -- Get Lease Application Info
13683     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
13684 
13685     IF (ln_lease_app_id IS NOT NULL) THEN
13686       OPEN c_get_primary_quote(p_leaseapp_id  =>  ln_lease_app_id);
13687       FETCH c_get_primary_quote INTO ln_quote_id;
13688       CLOSE c_get_primary_quote;
13689     END IF;
13690 
13691     IF (ln_quote_id IS NOT NULL) THEN
13692       ln_leaseapp_financed_amount := okl_lease_app_pvt.get_financed_amount(p_lease_qte_id  => ln_quote_id);
13693     END IF;
13694 
13695     IF (ln_contract_financed_amount IS NOT NULL AND ln_leaseapp_financed_amount IS NOT NULL) THEN
13696       IF ln_contract_financed_amount <= ln_leaseapp_financed_amount THEN
13697         RETURN 'P';
13698       ELSE
13699 	    RETURN 'F';
13700       END IF;
13701 	ELSE
13702 	  RETURN NULL;
13703     END IF;
13704 
13705   EXCEPTION
13706    WHEN OTHERS THEN
13707      IF c_get_primary_quote%ISOPEN THEN
13708        CLOSE c_get_primary_quote;
13709      END IF;
13710      RETURN NULL;
13711   END  check_contract_fin_amount;
13712 
13713   -- ######################################################################
13714   -- FUNCTION check_fund_amount
13715   -- This function checks for total amount funded on a contract is
13716   -- equal to or less than the total amount approved on a Lease Application
13717   -- ######################################################################
13718   FUNCTION check_fund_amount(p_contract_id IN NUMBER,
13719   							 p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
13720     RETURN VARCHAR2 IS
13721 
13722     ln_contract_funded_amount	NUMBER;
13723     ln_leaseapp_financed_amount NUMBER;
13724     ln_lease_app_id				NUMBER;
13725     ln_quote_id					NUMBER;
13726     ln_fund_amount				NUMBER	:= 0;
13727 
13728     CURSOR c_get_primary_quote(p_leaseapp_id IN NUMBER) IS
13729     SELECT id
13730     FROM okl_lease_quotes_b
13731     WHERE parent_object_id = p_leaseapp_id
13732     AND parent_object_code = 'LEASEAPP'
13733     AND primary_quote = 'Y';
13734 
13735     CURSOR c_get_fund_amount(p_contract_line_id IN NUMBER) IS
13736     SELECT nvl(amount, 0)
13737     FROM okl_trx_ap_invoices_b
13738     WHERE id = p_contract_line_id;
13739     --AND trx_status_code = 'ENTERED'
13740     --AND FUNDING_TYPE_CODE IN ('PREFUNDING', 'ASSET', 'EXPENSE');
13741 
13742   BEGIN
13743     ln_contract_funded_amount := okl_funding_pvt.get_total_funded(p_contract_id  => p_contract_id);
13744 
13745     IF (p_contract_line_id IS NOT NULL AND p_contract_line_id <> OKL_API.G_MISS_NUM) THEN
13746       OPEN c_get_fund_amount(p_contract_line_id	=> p_contract_line_id);
13747       FETCH c_get_fund_amount INTO ln_fund_amount;
13748       CLOSE c_get_fund_amount;
13749     END IF;
13750 
13751     ln_contract_funded_amount := ln_contract_funded_amount + ln_fund_amount;
13752 
13753 	-- Get Lease Application Info
13754     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
13755 
13756     IF (ln_lease_app_id IS NOT NULL) THEN
13757       OPEN c_get_primary_quote(p_leaseapp_id   =>  ln_lease_app_id);
13758       FETCH c_get_primary_quote INTO ln_quote_id;
13759       CLOSE c_get_primary_quote;
13760     END IF;
13761 
13762     IF (ln_quote_id IS NOT NULL) THEN
13763       ln_leaseapp_financed_amount := okl_lease_app_pvt.get_financed_amount(p_lease_qte_id  => ln_quote_id);
13764     END IF;
13765 
13766     IF (ln_contract_funded_amount IS NOT NULL AND ln_leaseapp_financed_amount IS NOT NULL) THEN
13767       IF ln_contract_funded_amount <= ln_leaseapp_financed_amount THEN
13768         RETURN 'P';
13769       ELSE
13770 	    RETURN 'F';
13771       END IF;
13772 	ELSE
13773 	  RETURN NULL;
13774     END IF;
13775 
13776   EXCEPTION
13777    WHEN OTHERS THEN
13778      IF c_get_primary_quote%ISOPEN THEN
13779        CLOSE c_get_primary_quote;
13780      END IF;
13781      RETURN NULL;
13782   END  check_fund_amount;
13783 
13784   -- ######################################################################
13785   -- FUNCTION check_party_custacct_match
13786   -- This function checks for Party and Customer Account on Lease Application
13787   -- and Contract are same
13788   -- ######################################################################
13789   FUNCTION check_party_custacct_match(p_contract_id IN NUMBER,
13790   									  p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
13791     RETURN VARCHAR2 IS
13792 
13793     ln_lease_app_id			NUMBER;
13794     ln_k_party_id			NUMBER;
13795 	ln_k_cust_acct_id		NUMBER;
13796     ln_lap_party_id			NUMBER;
13797 	ln_lap_cust_acct_id		NUMBER;
13798 
13799     CURSOR c_k_get_party_custacct_info IS
13800 	SELECT kp.object1_id1, okc.cust_acct_id
13801 	FROM okc_k_party_roles_b kp, okc_k_headers_b okc
13802 	WHERE kp.dnz_chr_id = p_contract_id
13803 	AND kp.rle_code = 'LESSEE'
13804 	AND kp.dnz_chr_id = okc.id;
13805 
13806     CURSOR c_lap_get_party_custacct_info(p_lease_app_id  IN NUMBER) IS
13807 	SELECT prospect_id, cust_acct_id
13808 	FROM okl_lease_applications_b
13809 	WHERE id = p_lease_app_id;
13810   BEGIN
13811 
13812     -- Get Lease Application Info
13813     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
13814 
13815     OPEN c_k_get_party_custacct_info;
13816     FETCH c_k_get_party_custacct_info INTO ln_k_party_id, ln_k_cust_acct_id;
13817     CLOSE c_k_get_party_custacct_info;
13818 
13819     OPEN c_lap_get_party_custacct_info(p_lease_app_id  => ln_lease_app_id) ;
13820     FETCH c_lap_get_party_custacct_info INTO ln_lap_party_id, ln_lap_cust_acct_id;
13821     CLOSE c_lap_get_party_custacct_info;
13822 
13823     IF (ln_k_party_id = ln_lap_party_id  AND ln_k_cust_acct_id = ln_lap_cust_acct_id) THEN
13824       RETURN 'P';
13825     ELSE
13826       RETURN 'F';
13827     END IF;
13828 
13829   EXCEPTION
13830    WHEN OTHERS THEN
13831      IF c_k_get_party_custacct_info%ISOPEN THEN
13832        CLOSE c_k_get_party_custacct_info;
13833      END IF;
13834      IF c_lap_get_party_custacct_info%ISOPEN THEN
13835        CLOSE c_lap_get_party_custacct_info;
13836      END IF;
13837      RETURN NULL;
13838   END  check_party_custacct_match;
13839 
13840   -- ######################################################################
13841   -- FUNCTION check_vendor_prog_match
13842   -- This function checks for Vendor Program on Lease Application and
13843   -- Contract are same
13844   -- ######################################################################
13845   FUNCTION check_vendor_prog_match(p_contract_id IN NUMBER,
13846   								   p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
13847     RETURN VARCHAR2 IS
13848 
13849     CURSOR c_k_vendor_prog_info IS
13850     SELECT khr_id
13851 	FROM okl_k_headers
13852 	WHERE id = p_contract_id;
13853 
13854     CURSOR c_lap_vendor_prog_info(p_lease_app_id  IN NUMBER) IS
13855     SELECT program_agreement_id
13856 	FROM okl_lease_applications_b
13857 	WHERE id = p_lease_app_id;
13858 
13859 	ln_k_prog_id				NUMBER;
13860 	ln_lap_prog_id				NUMBER;
13861 	ln_lease_app_id				NUMBER;
13862   BEGIN
13863 
13864     -- Get Lease Application Info
13865     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
13866 
13867     OPEN c_k_vendor_prog_info;
13868     FETCH c_k_vendor_prog_info INTO ln_k_prog_id;
13869     CLOSE c_k_vendor_prog_info;
13870 
13871     OPEN c_lap_vendor_prog_info(p_lease_app_id  => ln_lease_app_id);
13872     FETCH c_lap_vendor_prog_info INTO ln_lap_prog_id;
13873     CLOSE c_lap_vendor_prog_info;
13874 
13875     IF (ln_k_prog_id IS NULL AND ln_lap_prog_id IS NULL) THEN
13876       RETURN 'P';
13877     ELSIF (ln_k_prog_id = ln_lap_prog_id) THEN
13878       RETURN 'P';
13879     ELSE
13880       RETURN 'F';
13881     END IF;
13882 
13883   EXCEPTION
13884    WHEN OTHERS THEN
13885      IF c_k_vendor_prog_info%ISOPEN THEN
13886        CLOSE c_k_vendor_prog_info;
13887      END IF;
13888      IF c_lap_vendor_prog_info%ISOPEN THEN
13889        CLOSE c_lap_vendor_prog_info;
13890      END IF;
13891      RETURN NULL;
13892   END  check_vendor_prog_match;
13893 
13894   -- ######################################################################
13895   -- FUNCTION check_booking_date
13896   -- This function checks for Activation date of contract is within the
13897   -- effective dates of Lease Application
13898   -- ######################################################################
13899   FUNCTION check_booking_date(p_contract_id IN NUMBER,
13900   							  p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
13901     RETURN VARCHAR2 IS
13902 
13903     CURSOR c_k_booking_date IS
13904     SELECT date_transaction_occurred
13905 	FROM okl_trx_contracts
13906 	WHERE khr_id = p_contract_id
13907 	AND   representation_type = 'PRIMARY';	 -- MGAAP OTHER 7263041
13908 
13909 	ld_k_booking_date	DATE;
13910 	ld_lap_app_exp_date	DATE;
13911 	ln_lease_app_id		NUMBER;
13912   BEGIN
13913 
13914     -- Get Lease Application Info
13915     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
13916 
13917     OPEN c_k_booking_date;
13918     FETCH c_k_booking_date INTO ld_k_booking_date;
13919     CLOSE c_k_booking_date;
13920 
13921     ld_lap_app_exp_date := okl_lease_app_pvt.get_approval_exp_date(p_lease_app_id	=> ln_lease_app_id);
13922 
13923     IF (ld_k_booking_date IS NULL) THEN
13924       ld_k_booking_date := SYSDATE;
13925     END IF;
13926 
13927     IF (ld_lap_app_exp_date IS NOT NULL) THEN
13928 	  IF (ld_k_booking_date <= ld_lap_app_exp_date ) THEN
13929         RETURN 'P';
13930       ELSE
13931         RETURN 'F';
13932       END IF;
13933     ELSE
13934       RETURN 'P';
13935     END IF;
13936 
13937   EXCEPTION
13938    WHEN OTHERS THEN
13939      IF c_k_booking_date%ISOPEN THEN
13940        CLOSE c_k_booking_date;
13941      END IF;
13942      RETURN NULL;
13943   END  check_booking_date;
13944 
13945   -- ######################################################################
13946   -- FUNCTION check_funding_date
13947   -- This function checks for Funding date of Funding request is within the
13948   -- effective dates of Lease Application
13949   -- ######################################################################
13950   FUNCTION check_funding_date(p_contract_id IN NUMBER,
13951   							  p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
13952     RETURN VARCHAR2 IS
13953 
13954     -- sjalasut, modified the cursor to have p_contract_id mapped to okl_txl_ap_inv_lns_all_b
13955     -- changes made as part of OKLR12B disbursements project.
13956     CURSOR c_k_funding_date IS
13957     SELECT a.date_invoiced
13958      	FROM okl_trx_ap_invoices_b a
13959 --          ,okl_txl_ap_inv_lns_all_b b --cklee 09/21/07
13960 --	    WHERE a.id = b.tap_id
13961        where a.khr_id = p_contract_id;
13962 
13963 	ld_k_funded_date	DATE;
13964 	ld_lap_app_exp_date	DATE;
13965 	ln_lease_app_id		NUMBER;
13966   BEGIN
13967     -- Get Lease Application Info
13968     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
13969 
13970     OPEN c_k_funding_date;
13971     FETCH c_k_funding_date INTO ld_k_funded_date;
13972     CLOSE c_k_funding_date;
13973 
13974     ld_lap_app_exp_date := okl_lease_app_pvt.get_approval_exp_date(p_lease_app_id	=> ln_lease_app_id);
13975 
13976     IF (ld_lap_app_exp_date IS NOT NULL) THEN
13977 	  IF (ld_k_funded_date <= ld_lap_app_exp_date ) THEN
13978         RETURN 'P';
13979       ELSE
13980         RETURN 'F';
13981       END IF;
13982     ELSE
13983       RETURN 'P';
13984     END IF;
13985 
13986   EXCEPTION
13987    WHEN OTHERS THEN
13988      IF c_k_funding_date%ISOPEN THEN
13989        CLOSE c_k_funding_date;
13990      END IF;
13991      RETURN NULL;
13992   END  check_funding_date;
13993   -- rravikir End -- Bug 5055835
13994 
13995    -- ######################################################################
13996    -- FUNCTION asset_accu_deprn_reserve
13997    -- Returns fixed asset accumulated depreciation reserve for a financial asset
13998    -- line.
13999    -- ######################################################################
14000   FUNCTION asset_accu_deprn_reserve(
14001                              p_contract_id       IN  NUMBER
14002                             ,p_contract_line_id  IN NUMBER
14003                            )
14004    RETURN NUMBER  IS
14005 
14006      l_api_name          CONSTANT VARCHAR2(30) := 'ASSET_ACCU_DEPRN_RESERVE';
14007      l_api_version       CONSTANT NUMBER	      := 1;
14008      x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
14009      x_msg_count         NUMBER;
14010      x_msg_data          VARCHAR2(256);
14011 
14012      l_asset_hdr_rec            FA_API_TYPES.asset_hdr_rec_type;
14013      l_asset_deprn_rec          FA_API_TYPES.asset_deprn_rec_type;
14014 
14015      l_converted_amount         NUMBER;
14016      l_contract_start_date      DATE;
14017      l_contract_currency        OKL_K_HEADERS_FULL_V.currency_code%TYPE;
14018      l_currency_conversion_type OKL_K_HEADERS_FULL_V.currency_conversion_type%TYPE;
14019      l_currency_conversion_rate OKL_K_HEADERS_FULL_V.currency_conversion_rate%TYPE;
14020      l_currency_conversion_date OKL_K_HEADERS_FULL_V.currency_conversion_date%TYPE;
14021 
14022      CURSOR l_asset_csr(p_chr_id  IN NUMBER
14023                        ,p_cle_id  IN NUMBER
14024                        ,p_book_class  IN VARCHAR2  -- 7626121
14025                        ,p_book_type_code  IN VARCHAR2) IS
14026      SELECT fab.asset_id,
14027             fab.book_type_code
14028      FROM okc_k_lines_v fin_ast_cle,
14029           okc_statuses_b stsb,
14030           fa_additions fad,
14031           fa_book_controls fbc,
14032           fa_books fab
14033      WHERE fin_ast_cle.id = p_cle_id
14034      AND   fin_ast_cle.dnz_chr_id = p_chr_id
14035      AND   fin_ast_cle.chr_id = p_chr_id
14036      AND   fin_ast_cle.sts_code = stsb.code
14037      AND   stsb.ste_code NOT IN ('HOLD','CANCELLED')
14038      AND   fad.asset_number = fin_ast_cle.name
14039      AND   fab.asset_id = fad.asset_id
14040      AND   fab.book_type_code = fbc.book_type_code
14041      AND   fab.transaction_header_id_out IS NULL
14042      --AND   fbc.book_class = 'CORPORATE';
14043      AND   fbc.book_class = p_book_class
14044      AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
14045 
14046 
14047      l_asset_rec  l_asset_csr%ROWTYPE;
14048 
14049 
14050      CURSOR contract_start_date_csr(p_chr_id NUMBER) IS
14051      SELECT start_date
14052      FROM okc_k_headers_b
14053      WHERE id = p_chr_id;
14054 
14055     l_streams_repo_policy VARCHAR2(80); -- 7626121
14056     l_book_class FA_BOOK_CONTROLS.BOOK_CLASS%TYPE := null;
14057     l_book_type_code FA_BOOK_CONTROLS.BOOK_TYPE_CODE%TYPE := null;
14058 
14059 
14060    BEGIN
14061 
14062        IF (( p_contract_id IS NULL ) OR ( p_contract_line_id IS NULL )) THEN
14063            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
14064        END IF;
14065 
14066       -- 7626121
14067       l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
14068       l_book_type_code := NULL;
14069       IF (l_streams_repo_policy = 'PRIMARY') THEN
14070         l_book_class := 'CORPORATE';
14071       ELSE
14072         l_book_class := 'TAX';
14073         l_book_type_code := OKL_ACCOUNTING_UTIL.get_fa_reporting_book(
14074                               p_kle_id => p_contract_line_id);
14075       END IF;
14076 
14077        OPEN  l_asset_csr(p_chr_id => p_contract_id,
14078                          p_cle_id => p_contract_line_id,
14079                          p_book_class => l_book_class, -- 7626121
14080                          p_book_type_code => l_book_type_code);
14081         FETCH l_asset_csr INTO l_asset_rec;
14082         IF( l_asset_csr%NOTFOUND ) THEN
14083 
14084               CLOSE l_asset_csr;
14085               RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
14086            END IF;
14087            CLOSE l_asset_csr;
14088 
14089        l_asset_hdr_rec.asset_id          := l_asset_rec.asset_id;
14090        l_asset_hdr_rec.book_type_code    := l_asset_rec.book_type_code;
14091 
14092        IF NOT fa_cache_pkg.fazcbc(x_book => l_asset_hdr_rec.book_type_code) THEN
14093          OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
14094                              p_msg_name     => 'OKL_LLA_FA_CACHE_ERROR'
14095                             );
14096          RAISE OKL_API.G_EXCEPTION_ERROR;
14097        END IF;
14098 
14099 
14100        -- To fetch Depreciation Reserve
14101        IF NOT FA_UTIL_PVT.get_asset_deprn_rec
14102                (p_asset_hdr_rec         => l_asset_hdr_rec ,
14103                 px_asset_deprn_rec      => l_asset_deprn_rec,
14104                 p_period_counter        => NULL,
14105                 p_mrc_sob_type_code     => 'P'
14106                 ) THEN
14107          OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
14108                              p_msg_name     => 'OKL_LLA_FA_DEPRN_REC_ERROR'
14109                             );
14110          RAISE OKL_API.G_EXCEPTION_ERROR;
14111        END IF;
14112 
14113 
14114 
14115        -- convert amount into contract currency
14116        OPEN contract_start_date_csr(p_chr_id => p_contract_id);
14117        FETCH contract_start_date_csr INTO l_contract_start_date;
14118        CLOSE contract_start_date_csr;
14119 
14120        l_converted_amount := 0;
14121        OKL_ACCOUNTING_UTIL.CONVERT_TO_CONTRACT_CURRENCY(
14122          p_khr_id                   => p_contract_id,
14123          p_from_currency            => NULL,
14124          p_transaction_date         => l_contract_start_date,
14125          p_amount                   => l_asset_deprn_rec.deprn_reserve,
14126          x_return_status            => x_return_status,
14127          x_contract_currency        => l_contract_currency,
14128          x_currency_conversion_type => l_currency_conversion_type,
14129          x_currency_conversion_rate => l_currency_conversion_rate,
14130          x_currency_conversion_date => l_currency_conversion_date,
14131          x_converted_amount         => l_converted_amount);
14132 
14133 
14134        IF(x_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
14135          Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
14136                              p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
14137          RAISE Okl_Api.G_EXCEPTION_ERROR;
14138        END IF;
14139 
14140        RETURN l_converted_amount;
14141 
14142      EXCEPTION
14143 
14144        WHEN OKL_API.G_EXCEPTION_ERROR THEN
14145          RETURN NULL;
14146 
14147  	WHEN OTHERS THEN
14148          Okl_Api.SET_MESSAGE(
14149            p_app_name     => G_APP_NAME,
14150            p_msg_name     => G_UNEXPECTED_ERROR,
14151            p_token1       => G_SQLCODE_TOKEN,
14152            p_token1_value => SQLCODE,
14153            p_token2       => G_SQLERRM_TOKEN,
14154            p_token2_value => SQLERRM);
14155         RETURN NULL;
14156 
14157    END asset_accu_deprn_reserve;
14158 
14159  -- Added by mansrini for ER Bug#6011738
14160    -- ---------------------------------------------------------------
14161    -- FUNCTION   : lease_quote_financed_amount
14162    --
14163    -- DESC       : Returns Financed Amount for an asset on a sales
14164    --              quote which is calculated as ->
14165    --              Asset Cost + Add-ons + Capitalized Fees
14166    --              - Capitalized Down Payments - Trade Ins.
14167    --
14168    -- PARAMETERS : Passed NONE, requires ASSET_ID to be passed as
14169    --              additional parameter from okl_execute_formula_pub
14170    --              which is the asset on quote for which to calculate
14171    --              financed amount.
14172    -- ---------------------------------------------------------------
14173    FUNCTION lease_quote_financed_amount
14174    RETURN NUMBER  IS
14175    --cursor to get asset cost
14176      CURSOR c_asset_cost (p_asset_id IN NUMBER) IS
14177            SELECT  (ASSETCOMP.NUMBER_OF_UNITS * ASSETCOMP.UNIT_COST) AST_COST
14178            FROM    OKL_ASSET_COMPONENTS_B ASSETCOMP
14179            WHERE   ASSETCOMP.PRIMARY_COMPONENT = 'YES'
14180            AND     ASSETCOMP.ASSET_ID =  p_asset_id;
14181 
14182    --cursor to get asset Add-On amount
14183      CURSOR c_addOn_cost (p_asset_id IN NUMBER) IS
14184        SELECT  sum(ASSETCOMP.NUMBER_OF_UNITS * ASSETCOMP.UNIT_COST) ADDON_AMNT
14185            FROM    OKL_ASSET_COMPONENTS_B ASSETCOMP
14186            WHERE   ASSETCOMP.PRIMARY_COMPONENT = 'NO'
14187            AND     ASSETCOMP.ASSET_ID = p_asset_id;
14188 
14189    -- cursor to get capitalized fee amount for the asset
14190      CURSOR c_cap_fee_amnt (p_asset_id IN NUMBER) IS
14191            SELECT  SUM(amount) capitalized_fee_amount
14192            FROM    okl_line_relationships_v lre
14193            WHERE   source_line_type = 'ASSET'
14194            AND     related_line_type = 'CAPITALIZED'
14195            AND     source_line_id = p_asset_id;
14196 
14197    --cursor to get capitalized down payment for the asset
14198      CURSOR c_cap_down_pmnt (p_asset_id IN NUMBER) IS
14199            SELECT  sum(adj.value) cap_down_payment
14200        FROM    okl_assets_b ast, okl_cost_adjustments_b adj
14201        WHERE   ast.parent_object_code = 'LEASEQUOTE'
14202        AND     adj.parent_object_id = ast.id
14203        AND     adj.ADJUSTMENT_SOURCE_TYPE = 'DOWN_PAYMENT'
14204        AND     adj.PROCESSING_TYPE = 'CAPITALIZE'
14205        AND     ast.id =  p_asset_id;
14206 
14207    --cursor to get trade-in amount for the asset
14208      CURSOR c_tradein_amnt (p_asset_id IN NUMBER) IS
14209            SELECT  sum(adj.value) tradeIn_amount
14210        FROM    okl_assets_b ast,  okl_cost_adjustments_b adj
14211        WHERE   ast.parent_object_code = 'LEASEQUOTE'
14212        AND     adj.parent_object_id = ast.id
14213        AND     adj.adjustment_source_type = 'TRADEIN'
14214        AND     ast.id = p_asset_id;
14215 
14216        l_asset_id         NUMBER;
14217 
14218        l_financed_amount  NUMBER;
14219        l_asset_cost       NUMBER;
14220        l_add_on_amnt      NUMBER;
14221        l_cap_fee_amnt     NUMBER;
14222        l_cap_down_pmnt    NUMBER;
14223        l_trade_in_amnt    NUMBER;
14224 
14225     BEGIN
14226 
14227        -- get asset id passed as additional parameters
14228        IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(1)
14229            AND okl_execute_formula_pub.g_additional_parameters(1).name =
14230 'ASSET_ID'
14231            AND okl_execute_formula_pub.g_additional_parameters(1).value IS NOT
14232 NULL
14233            THEN
14234               l_asset_id :=
14235 to_number(okl_execute_formula_pub.g_additional_parameters(1).value);
14236        END IF;
14237 
14238        IF (l_asset_id IS NULL) THEN
14239            RAISE OKL_API.G_EXCEPTION_ERROR;
14240        END IF;
14241 
14242        -- get asset cost
14243        l_asset_cost := 0;
14244        OPEN   c_asset_cost(l_asset_id);
14245        FETCH  c_asset_cost INTO l_asset_cost;
14246        IF( c_asset_cost%NOTFOUND ) THEN
14247            CLOSE c_asset_cost;
14248            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
14249        END IF;
14250        CLOSE c_asset_cost;
14251 
14252        -- get add-on amount
14253        OPEN   c_addOn_cost(l_asset_id);
14254        FETCH  c_addOn_cost INTO l_add_on_amnt;
14255        CLOSE c_addOn_cost;
14256        IF l_add_on_amnt is null then
14257            l_add_on_amnt := 0;
14258        END IF;
14259 
14260        -- get capitalized fee amount
14261        OPEN   c_cap_fee_amnt(l_asset_id);
14262        FETCH  c_cap_fee_amnt INTO l_cap_fee_amnt;
14263        CLOSE c_cap_fee_amnt;
14264        IF l_cap_fee_amnt is null then
14265            l_cap_fee_amnt := 0;
14266        END IF;
14267 
14268        -- get capitalized down payment amount
14269        OPEN   c_cap_down_pmnt(l_asset_id);
14270        FETCH  c_cap_down_pmnt INTO l_cap_down_pmnt;
14271        CLOSE c_cap_down_pmnt;
14272        IF l_cap_down_pmnt is null then
14273            l_cap_down_pmnt := 0;
14274        END IF;
14275 
14276        -- get trade-in amount
14277        OPEN   c_tradein_amnt(l_asset_id);
14278        FETCH  c_tradein_amnt INTO l_trade_in_amnt;
14279        CLOSE c_tradein_amnt;
14280        IF l_trade_in_amnt is null then
14281            l_trade_in_amnt := 0;
14282        END IF;
14283 
14284        l_financed_amount := l_asset_cost + l_add_on_amnt + l_cap_fee_amnt -
14285 l_cap_down_pmnt - l_trade_in_amnt;
14286 
14287        RETURN l_financed_amount;
14288    EXCEPTION
14289    WHEN OKL_API.G_EXCEPTION_ERROR THEN
14290        IF c_asset_cost%ISOPEN THEN
14291           CLOSE c_asset_cost;
14292        END IF;
14293        IF c_addOn_cost%ISOPEN THEN
14294           CLOSE c_addOn_cost;
14295        END IF;
14296        IF c_cap_fee_amnt%ISOPEN THEN
14297           CLOSE c_cap_fee_amnt;
14298        END IF;
14299        IF c_cap_down_pmnt%ISOPEN THEN
14300           CLOSE c_cap_down_pmnt;
14301        END IF;
14302        IF c_tradein_amnt%ISOPEN THEN
14303           CLOSE c_tradein_amnt;
14304        END IF;
14305        RETURN NULL;
14306    WHEN OTHERS THEN
14307        Okl_Api.SET_MESSAGE(
14308              p_app_name     => G_APP_NAME,
14309              p_msg_name     => G_UNEXPECTED_ERROR,
14310              p_token1       => G_SQLCODE_TOKEN,
14311              p_token1_value => SQLCODE,
14312              p_token2       => G_SQLERRM_TOKEN,
14313              p_token2_value => SQLERRM);
14314        IF c_asset_cost%ISOPEN THEN
14315           CLOSE c_asset_cost;
14316        END IF;
14317        IF c_addOn_cost%ISOPEN THEN
14318           CLOSE c_addOn_cost;
14319        END IF;
14320        IF c_cap_fee_amnt%ISOPEN THEN
14321           CLOSE c_cap_fee_amnt;
14322        END IF;
14323        IF c_cap_down_pmnt%ISOPEN THEN
14324           CLOSE c_cap_down_pmnt;
14325        END IF;
14326        IF c_tradein_amnt%ISOPEN THEN
14327           CLOSE c_tradein_amnt;
14328        END IF;
14329        RETURN NULL;
14330    END lease_quote_financed_amount;
14331    -- End by mansrini for ER Bug#6011738
14332 
14333    -- Start : Added by mansrini for ER Bug#6011738
14334    -- -----------------------------------------------------------------------
14335    -- FUNCTION   : line_financed_amount
14336    --
14337    -- DESC       : Returns Financed Amount for an asset line of a contract
14338    --              which is calculated as
14339    --              Financed Amount =  Asset Cost
14340    --                               + Add-On to the asset
14341    --                               + Capitalized Fee associated to the asset
14342    --                               - Capitalized Down Payment for the asset
14343    --                               - Trade-In Amount associated to the asset
14344    --
14345    -- PARAMETERS : IN p_contract_id, p_contract_line_id
14346    -- -----------------------------------------------------------------------
14347    FUNCTION line_financed_amount(p_contract_id IN NUMBER
14348                                 ,p_contract_line_id IN NUMBER)
14349    RETURN NUMBER  IS
14350       G_APP_NAME                   CONSTANT  VARCHAR2(3)   :=
14351 OKL_API.G_APP_NAME;
14352       G_PKG_NAME                   CONSTANT  VARCHAR2(200) := 'OKL_FORMULA_PVT';
14353       G_COL_NAME_TOKEN             CONSTANT  VARCHAR2(200) :=
14354 OKL_API.G_COL_NAME_TOKEN;
14355       G_NO_MATCHING_RECORD         CONSTANT  VARCHAR2(200) :=
14356 'OKL_LLA_NO_MATCHING_RECORD';
14357       G_SQLERRM_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLERRM';
14358       G_SQLCODE_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLCODE';
14359       G_LINE_RECORD                CONSTANT  VARCHAR2(200) :=
14360 'OKL_LLA_LINE_RECORD';
14361       G_INVALID_CRITERIA           CONSTANT  VARCHAR2(200) :=
14362 'OKL_LLA_INVALID_CRITERIA';
14363       l_return_status                        VARCHAR2(3)   :=
14364 OKL_API.G_RET_STS_SUCCESS;
14365 
14366       l_lty_code                             OKC_LINE_STYLES_V.LTY_CODE%TYPE;
14367       l_financed_amount                      NUMBER;
14368       l_asset_cost                           NUMBER;
14369       l_addon                                NUMBER;
14370       l_cap_fee                              NUMBER;
14371       l_trade_in                             NUMBER;
14372       l_cap_down_pmnt                        NUMBER;
14373       l_cap_down_pct                         NUMBER;
14374       l_cap_down_pmnt_yn                     VARCHAR2(3);
14375 
14376       -- Cursor to get the lty_code
14377       CURSOR get_lty_code(p_line_id NUMBER) IS
14378        SELECT lse.lty_code
14379          FROM okc_k_lines_b cle,
14380               okc_line_styles_b lse
14381         WHERE cle.id = p_line_id
14382           AND cle.lse_id = lse.id;
14383 
14384       -- Cursor to sum up asset cost for given Asset line
14385       CURSOR c_asset_cost(p_line_id NUMBER,
14386                           p_dnz_chr_id NUMBER) IS
14387        SELECT SUM(cle.price_unit * cim.number_of_items) asset_cost
14388          FROM okc_subclass_top_line stl,
14389               okc_line_styles_b lse2,
14390               okc_line_styles_b lse1,
14391               okc_k_items_v cim,
14392               okc_k_lines_v cle
14393         WHERE cle.cle_id = p_line_id
14394           AND cle.dnz_chr_id = p_dnz_chr_id
14395           AND cle.id = cim.cle_id
14396           AND cle.dnz_chr_id = cim.dnz_chr_id
14397           AND cle.lse_id = lse1.id
14398           AND lse1.lty_code = 'ITEM'
14399           AND lse1.lse_parent_id = lse2.id
14400           AND lse2.lty_code = 'FREE_FORM1'
14401           AND lse2.id = stl.lse_id
14402           AND stl.scs_code IN ('LEASE','LOAN');
14403 
14404       -- Cursor to sum up addon amount for a given line
14405       CURSOR c_addon(p_line_id NUMBER,
14406                      p_dnz_chr_id NUMBER) IS
14407        SELECT SUM(cle.price_unit* cim.number_of_items) add_on
14408          FROM okc_subclass_top_line stl,
14409               okc_line_styles_b lse3,
14410               okc_line_styles_b lse2,
14411               okc_line_styles_b lse1,
14412               okc_k_items_v cim,
14413               okc_k_lines_b cle
14414         WHERE cle.dnz_chr_id = p_dnz_chr_id
14415           AND cle.dnz_chr_id = cim.dnz_chr_id
14416           AND cle.id = cim.cle_id
14417           AND cle.lse_id = lse1.id
14418           AND lse1.lty_code = 'ADD_ITEM'
14419           AND lse1.lse_parent_id = lse2.id
14420           AND lse2.lty_code = 'ITEM'
14421           AND lse2.lse_parent_id = lse3.id
14422           AND lse3.lty_code = 'FREE_FORM1'
14423           AND lse3.id = stl.lse_id
14424           AND stl.scs_code IN ('LEASE','LOAN')
14425           AND exists (SELECT 1
14426                         FROM okc_subclass_top_line stlx,
14427                              okc_line_styles_b lse2x,
14428                              okc_line_styles_b lse1x,
14429                              okc_k_lines_b clex
14430                        WHERE clex.cle_id = p_line_id
14431                          AND clex.dnz_chr_id = p_dnz_chr_id
14432                          AND clex.lse_id = lse1x.id
14433                          AND lse1x.lty_code = 'ITEM'
14434                          AND lse1x.lse_parent_id = lse2x.id
14435                          AND lse2x.lty_code = 'FREE_FORM1'
14436                          AND lse2x.id = stlx.lse_id
14437                          AND stlx.scs_code IN ('LEASE','LOAN')
14438                          AND clex.id = cle.cle_id);
14439 
14440       --Cursor for Capitalized Fee
14441       CURSOR c_cap_fee(p_line_id VARCHAR2,
14442                        p_dnz_chr_id OKC_K_HEADERS_B.ID%TYPE) IS
14443        SELECT SUM(kle_cov.capital_amount) Cap_fee
14444          FROM okc_line_styles_b  lseb,
14445               okc_k_items        cim,
14446               okl_k_lines        kle_cov,
14447               okc_k_lines_b      cleb_cov,
14448               okc_statuses_b     stsb
14449         WHERE lseb.id               = cleb_cov.lse_id
14450           AND lseb.lty_code         = 'LINK_FEE_ASSET'
14451           AND cim.jtot_object1_code = 'OKX_COVASST'
14452           AND cleb_cov.id           =  cim.cle_id
14453           AND kle_cov.id            =  cleb_cov.id
14454           AND cleb_cov.dnz_chr_id   =  cim.dnz_chr_id
14455           AND cleb_cov.dnz_chr_id   =  p_dnz_chr_id
14456           AND cim.object1_id1       =  p_line_id
14457           AND cleb_cov.sts_code     =  stsb.code
14458           AND stsb.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED',
14459 'HOLD');
14460 
14461       --Cursor for Trade-in Amount and Capital Down Payment
14462       CURSOR c_asset_adjust(p_line_id NUMBER,
14463                             p_dnz_chr_id NUMBER) IS
14464        SELECT NVL(kle.capital_reduction,0) capital_reduction,
14465               NVL(kle.tradein_amount,0) tradein_amount,
14466               NVL(kle.capital_reduction_percent,0) capital_reduction_percent,
14467               kle.capitalize_down_payment_yn capitalize_down_payment_yn
14468          FROM okc_line_styles_b ls,
14469               okl_k_lines_full_v kle,
14470               okc_statuses_b sts
14471         WHERE kle.dnz_chr_id = p_dnz_chr_id
14472           AND kle.id = p_line_id
14473           AND ls.id = kle.lse_id
14474           AND ls.lty_code ='FREE_FORM1'
14475           AND kle.sts_code = sts.code
14476           AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED',
14477 'HOLD');
14478 
14479    BEGIN
14480           -- To get the Line Style Code
14481           OPEN  get_lty_code(p_line_id => p_contract_line_id);
14482              IF get_lty_code%NOTFOUND THEN
14483                 OKL_API.set_message(p_app_name     => G_APP_NAME,
14484                                     p_msg_name     => G_NO_MATCHING_RECORD,
14485                                     p_token1       => G_COL_NAME_TOKEN,
14486                                     p_token1_value => 'Financial Asset Line');
14487                 RAISE OKL_API.G_EXCEPTION_ERROR;
14488              END IF;
14489           FETCH get_lty_code INTO l_lty_code;
14490           CLOSE get_lty_code;
14491 
14492           IF l_lty_code = 'FREE_FORM1' THEN
14493              -- To get the asset cost
14494              OPEN c_asset_cost(p_line_id => p_contract_line_id,
14495                                p_dnz_chr_id => p_contract_id);
14496                 IF c_asset_cost%NOTFOUND THEN
14497                    OKL_API.set_message(p_app_name     => G_APP_NAME,
14498                                        p_msg_name     => G_NO_MATCHING_RECORD,
14499                                        p_token1       => G_COL_NAME_TOKEN,
14500                                        p_token1_value => 'Model Line');
14501                    RAISE OKL_API.G_EXCEPTION_ERROR;
14502                 END IF;
14503              FETCH c_asset_cost INTO l_asset_cost;
14504              CLOSE c_asset_cost;
14505 
14506              -- To get the Addon
14507 -- DJANASWA change begin 11/12/08
14508 
14509 /*             OPEN c_addon(p_line_id => p_contract_line_id,
14510                           p_dnz_chr_id => p_contract_id);
14511              FETCH c_addon INTO l_addon;
14512              CLOSE c_addon;
14513 */
14514             l_addon :=  Okl_Seeded_Functions_Pvt.total_asset_addon_cost(
14515                         p_contract_id => p_contract_id, p_contract_line_id => p_contract_line_id);
14516 
14517 -- DJANASWA change end 11/12/08
14518 
14519             l_addon := NVL(l_addon,0);
14520 
14521              -- To get the Capitalized Fee
14522              OPEN c_cap_fee(p_line_id => TO_CHAR(p_contract_line_id),
14523                             p_dnz_chr_id => p_contract_id);
14524              FETCH c_cap_fee INTO l_cap_fee;
14525              CLOSE c_cap_fee;
14526              l_cap_fee := NVL(l_cap_fee,0);
14527 
14528              -- To get the Trade-in and Capitalized Down Payment
14529              OPEN c_asset_adjust(p_line_id => p_contract_line_id,
14530                           p_dnz_chr_id => p_contract_id);
14531              FETCH c_asset_adjust INTO
14532 l_cap_down_pmnt,l_trade_in,l_cap_down_pct,l_cap_down_pmnt_yn;
14533              CLOSE c_asset_adjust;
14534              l_trade_in := NVL(l_trade_in,0);
14535              l_cap_down_pmnt := NVL(l_cap_down_pmnt,0);
14536              l_cap_down_pct := NVL(l_cap_down_pct,0);
14537              l_cap_down_pmnt_yn := NVL(l_cap_down_pmnt_yn,'N');
14538 
14539              IF l_cap_down_pct<>0 THEN
14540                  l_cap_down_pmnt := (l_asset_cost + l_addon) *
14541 l_cap_down_pct/100;
14542              END IF;
14543 
14544              --Calculation of Financed Amount
14545              --on the basis of Capitalized Down Payment Flag
14546              IF l_cap_down_pmnt_yn = 'N' THEN
14547                l_financed_amount := l_asset_cost + l_addon + l_cap_fee  -
14548 l_trade_in;
14549              ELSE
14550                l_financed_amount := l_asset_cost + l_addon + l_cap_fee  -
14551 l_cap_down_pmnt - l_trade_in;
14552              END IF;
14553 
14554           ELSE
14555              OKL_API.set_message(p_app_name     => G_APP_NAME,
14556                                  p_msg_name     => G_LINE_RECORD);
14557              RAISE OKL_API.G_EXCEPTION_ERROR;
14558           END IF;
14559           RETURN l_financed_amount;
14560    EXCEPTION
14561        WHEN OKL_API.G_EXCEPTION_ERROR THEN
14562         -- If the cursor is open then it has to be closed
14563           IF get_lty_code%ISOPEN THEN
14564             CLOSE get_lty_code;
14565           END IF;
14566           IF c_asset_cost%ISOPEN THEN
14567             CLOSE c_asset_cost;
14568           END IF;
14569           IF c_addon%ISOPEN THEN
14570             CLOSE c_addon;
14571           END IF;
14572           IF c_cap_fee%ISOPEN THEN
14573             CLOSE c_cap_fee;
14574           END IF;
14575           IF c_asset_adjust%ISOPEN THEN
14576             CLOSE c_asset_adjust;
14577           END IF;
14578           RETURN NULL;
14579        WHEN OTHERS THEN
14580         -- If the cursor is open then it has to be closed
14581           IF get_lty_code%ISOPEN THEN
14582             CLOSE get_lty_code;
14583           END IF;
14584           IF c_asset_cost%ISOPEN THEN
14585             CLOSE c_asset_cost;
14586           END IF;
14587           IF c_addon%ISOPEN THEN
14588             CLOSE c_addon;
14589           END IF;
14590           IF c_cap_fee%ISOPEN THEN
14591             CLOSE c_cap_fee;
14592           END IF;
14593           IF c_asset_adjust%ISOPEN THEN
14594             CLOSE c_asset_adjust;
14595           END IF;
14596           RETURN NULL;
14597    END line_financed_amount;
14598 
14599    -- --------------------------------------------------------------------
14600    -- FUNCTION   : front_end_financed_amount
14601    --
14602    -- DESC       : Returns Financed Amount for a financial asset line
14603    --              depending upon the parameters passed
14604    --
14605    --              If p_contract_id and p_contract_line_id are NULL,
14606    --              it implies that the function is called from LEASE
14607    --              QUOTE process and the financed amount is calculated
14608    --              using the function lease_quote_financed_amount().
14609    --
14610    --              And if p_contract_id and p_contract_line_id are not
14611    --              NULL, then it implies that the function is called
14612    --              from AUTHORING process and the financed amount is then
14613    --              calculated using the function line_financed_amount().
14614    --
14615    -- PARAMETERS : IN p_contract_id, p_contract_line_id
14616    -- --------------------------------------------------------------------
14617    FUNCTION front_end_financed_amount( p_contract_id IN NUMBER
14618                                       ,p_contract_line_id IN NUMBER)
14619    RETURN NUMBER IS
14620       G_APP_NAME                   CONSTANT  VARCHAR2(3)   :=
14621 OKL_API.G_APP_NAME;
14622       G_PKG_NAME                   CONSTANT  VARCHAR2(200) := 'OKL_FORMULA_PVT';
14623       G_SQLERRM_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLERRM';
14624       G_SQLCODE_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLCODE';
14625       G_INVALID_CRITERIA           CONSTANT  VARCHAR2(200) :=
14626 'OKL_LLA_INVALID_CRITERIA';
14627       l_api_name                   CONSTANT  VARCHAR2(30)  :=
14628 'FRONT_END_FINANCED_AMOUNT';
14629 
14630       l_financed_amt                         NUMBER        := 0;
14631 
14632    BEGIN
14633       -- Call from LEASE QUOTE
14634       IF p_contract_id IS NULL AND p_contract_line_id IS NULL THEN
14635          l_financed_amt := lease_quote_financed_amount;
14636 
14637       -- Call from AUTHORING
14638       ELSIF (p_contract_id IS NOT NULL OR
14639              p_contract_id <> Okl_Api.G_MISS_NUM) AND
14640             (p_contract_line_id IS NOT NULL OR
14641              p_contract_line_id <> Okl_Api.G_MISS_NUM) THEN
14642          l_financed_amt := line_financed_amount(p_contract_id => p_contract_id,
14643                                                 p_contract_line_id =>
14644 p_contract_line_id);
14645 
14646       ELSE
14647          RAISE OKL_API.G_EXCEPTION_ERROR;
14648       END IF;
14649 
14650       RETURN l_financed_amt;
14651 
14652    EXCEPTION
14653       WHEN OKL_API.G_EXCEPTION_ERROR THEN
14654          OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
14655                              p_msg_name     => G_INVALID_CRITERIA);
14656          RETURN NULL;
14657       WHEN OTHERS THEN
14658          OKL_API.SET_MESSAGE(
14659                              p_app_name     => G_APP_NAME,
14660                              p_msg_name     => G_UNEXPECTED_ERROR,
14661                              p_token1       => G_SQLCODE_TOKEN,
14662                              p_token1_value => SQLCODE,
14663                              p_token2       => G_SQLERRM_TOKEN,
14664                              p_token2_value => SQLERRM);
14665          RETURN NULL;
14666    END front_end_financed_amount;
14667    --End by mansrini for Bug#6011738
14668 
14669 
14670    -- --------------------------------------------------------------------
14671    -- FUNCTION   : total_asset_addon_cost
14672    --
14673    -- DESC       : Returns total asset addon cost.
14674    --
14675    -- PARAMETERS : IN p_contract_id, p_contract_line_id
14676    -- Added by Durga Janaswamy
14677    -- --------------------------------------------------------------------
14678    FUNCTION total_asset_addon_cost ( p_contract_id IN NUMBER
14679                                       ,p_contract_line_id IN NUMBER)
14680    RETURN NUMBER IS
14681       G_APP_NAME                   CONSTANT  VARCHAR2(3)   := OKL_API.G_APP_NAME;
14682       G_PKG_NAME                   CONSTANT  VARCHAR2(200) := 'OKL_FORMULA_PVT';
14683       G_SQLERRM_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLERRM';
14684       G_SQLCODE_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLCODE';
14685       G_INVALID_CRITERIA           CONSTANT  VARCHAR2(200) := 'OKL_LLA_INVALID_CRITERIA';
14686       l_api_name                   CONSTANT  VARCHAR2(30)  := 'TOTAL_ASSET_ADDON_COST';
14687 
14688       l_addon_cost                         NUMBER        := 0;
14689 
14690    CURSOR c_addon_cost_csr (p_contract_id IN NUMBER,
14691                             p_contract_line_id IN NUMBER) IS
14692          SELECT SUM(cle.price_unit* cim.number_of_items) add_on_cost
14693          FROM okc_subclass_top_line stl,
14694               okc_line_styles_b lse3,
14695               okc_line_styles_b lse2,
14696               okc_line_styles_b lse1,
14697               okc_k_items_v cim,
14698               okc_k_lines_b cle
14699         WHERE cle.dnz_chr_id = p_contract_id
14700           AND cle.dnz_chr_id = cim.dnz_chr_id
14701           AND cle.id = cim.cle_id
14702           AND cle.lse_id = lse1.id
14703           AND lse1.lty_code = 'ADD_ITEM'    -- G_ADDON_LINE_LTY_CODE
14704           AND lse1.lse_parent_id = lse2.id
14705           AND lse2.lty_code = 'ITEM'          -- G_MODEL_LINE_LTY_CODE
14706           AND lse2.lse_parent_id = lse3.id
14707           AND lse3.lty_code = 'FREE_FORM1'   --  G_FIN_LINE_LTY_CODE
14708           AND lse3.id = stl.lse_id
14709           AND stl.scs_code IN ('LEASE','LOAN')
14710           AND exists (SELECT 1
14711                         FROM okc_subclass_top_line stlx,
14712                              okc_line_styles_b lse2x,
14713                              okc_line_styles_b lse1x,
14714                              okc_k_lines_b clex
14715                        WHERE clex.cle_id = p_contract_line_id   -- lse_id = 33>
14716                          AND clex.dnz_chr_id = p_contract_id
14717                          AND clex.lse_id = lse1x.id
14718                          AND lse1x.lty_code = 'ITEM'  -- G_MODEL_LINE_LTY_CODE
14719                          AND lse1x.lse_parent_id = lse2x.id
14720                          AND lse2x.lty_code = 'FREE_FORM1' -- G_FIN_LINE_LTY_CODE
14721                          AND lse2x.id = stlx.lse_id
14722                          AND stlx.scs_code IN ('LEASE','LOAN')
14723                          AND clex.id = cle.cle_id);
14724 
14725 
14726    BEGIN
14727 
14728         IF (p_contract_id IS NOT NULL OR
14729              p_contract_id <> Okl_Api.G_MISS_NUM) AND
14730             (p_contract_line_id IS NOT NULL OR
14731              p_contract_line_id <> Okl_Api.G_MISS_NUM) THEN
14732 
14733            OPEN  c_addon_cost_csr ( p_contract_id => p_contract_id,
14734                                     p_contract_line_id => p_contract_line_id);
14735 
14736                    IF c_addon_cost_csr%NOTFOUND THEN
14737                           NULL;
14738                    END IF;
14739 
14740            FETCH c_addon_cost_csr INTO l_addon_cost;
14741            CLOSE c_addon_cost_csr;
14742         END IF;
14743 
14744       l_addon_cost := NVL(l_addon_cost,0);
14745 
14746       RETURN(l_addon_cost);
14747 
14748 
14749    EXCEPTION
14750       WHEN OKL_API.G_EXCEPTION_ERROR THEN
14751         IF c_addon_cost_csr%ISOPEN THEN
14752               CLOSE c_addon_cost_csr;
14753         END IF;
14754 
14755          OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
14756                              p_msg_name     => G_INVALID_CRITERIA);
14757          RETURN NULL;
14758 
14759 
14760       WHEN OTHERS THEN
14761          --sechawla 18-nov-08 : close cursor
14762          IF c_addon_cost_csr%ISOPEN THEN
14763               CLOSE c_addon_cost_csr;
14764          END IF;
14765          OKL_API.SET_MESSAGE(
14766                              p_app_name     => G_APP_NAME,
14767                              p_msg_name     => G_UNEXPECTED_ERROR,
14768                              p_token1       => G_SQLCODE_TOKEN,
14769                              p_token1_value => SQLCODE,
14770                              p_token2       => G_SQLERRM_TOKEN,
14771                              p_token2_value => SQLERRM);
14772          RETURN NULL;
14773    END TOTAL_ASSET_ADDON_COST;
14774 
14775 
14776 ----------------------------------------------------------------------------------------------------
14777 
14778     -- Start of Comments
14779     -- Created By:       Durga Janaswamy
14780     -- Function Name  get_line_subsidy_amount
14781     -- Description:   returns the asset line subsidy amount for given contract
14782     -- Dependencies:
14783     -- Parameters: contract id,contract line id, accounting method
14784     --
14785     -- Version: 1.0
14786     --
14787     -- End of Comments
14788 
14789 ----------------------------------------------------------------------------------------------------
14790 FUNCTION get_line_subsidy_amount(
14791     p_contract_id                 IN  NUMBER,
14792     p_fin_asset_line_id           IN  NUMBER,
14793     p_accounting_method           IN  VARCHAR2)
14794 RETURN NUMBER IS
14795 
14796     lx_return_status        VARCHAR2(1)  DEFAULT OKL_API.G_RET_STS_SUCCESS;
14797     l_api_name             CONSTANT     VARCHAR2(30) := 'GET_LINE_ASSET_SUBSIDY';
14798     l_api_version          CONSTANT     NUMBER := 1.0;
14799     l_init_msg_list                     VARCHAR2(1) := OKL_API.G_FALSE;
14800     lx_msg_count                        NUMBER := OKL_API.G_MISS_NUM;
14801     lx_msg_data                         VARCHAR2(2000);
14802 
14803     x_subsidy_amount       NUMBER;
14804 
14805     l_asset_line_subsidy_amount NUMBER;
14806 
14807     --cursor to fetch all the subsidies attached to financial asset
14808     -- passing accounting method as input parameter
14809     CURSOR l_sub_csr(p_contract_id IN NUMBER,
14810                      p_fin_asset_line_id IN  NUMBER,
14811                      p_accounting_method IN  VARCHAR2) IS
14812     SELECT NVL(SUM(sub_kle.amount),0)
14813     FROM   okl_subsidies_b    subb,
14814            okl_k_lines        sub_kle,
14815            okc_k_lines_b      sub_cle,
14816            okc_line_styles_b  sub_lse
14817     WHERE  subb.id                     = sub_kle.subsidy_id
14818     AND    subb.accounting_method_code = NVL(UPPER(p_accounting_method),subb.accounting_method_code)
14819     AND    sub_kle.id                  = sub_cle.id
14820     AND    sub_cle.lse_id              = sub_lse.id
14821     AND    sub_lse.lty_code            = 'SUBSIDY'
14822     AND    sub_cle.sts_code            <> 'ABANDONED'
14823     AND    sub_cle.dnz_chr_id          = p_contract_id
14824     AND    sub_cle.cle_id              = p_fin_asset_line_id
14825     AND    subb.customer_visible_yn    = 'Y'
14826     ;
14827 
14828     l_accounting_method        okl_subsidies_b.accounting_method_code%TYPE;
14829     l_subsidy_cle_id           NUMBER;
14830 
14831 BEGIN
14832 
14833 	l_asset_line_subsidy_amount := 0;
14834 
14835     x_subsidy_amount := 0;
14836 
14837 
14838     IF(p_accounting_method IS NULL OR p_accounting_method = OKL_API.G_MISS_CHAR) THEN
14839         l_accounting_method := NULL;
14840     ELSE
14841         l_accounting_method := p_accounting_method;
14842     END IF;
14843 
14844     --------------------------------------------------------------
14845     --get all the subsidies associated to asset and get amount
14846     --------------------------------------------------------------
14847     OPEN l_sub_csr(p_contract_id , p_fin_asset_line_id, l_accounting_method);
14848     --LOOP  --sechawla 18-nov
14849     FETCH l_sub_csr INTO l_asset_line_subsidy_amount;
14850     --    EXIT WHEN l_sub_csr%NOTFOUND;
14851     -- END LOOP;
14852     CLOSE l_sub_csr;
14853 
14854     x_subsidy_amount := NVL(l_asset_line_subsidy_amount,0);
14855 
14856     RETURN x_subsidy_amount;
14857 
14858     EXCEPTION
14859     WHEN OKL_API.G_EXCEPTION_ERROR THEN
14860     IF l_sub_csr%ISOPEN THEN
14861         CLOSE l_sub_csr;
14862     END IF;
14863     lx_return_status := OKL_API.HANDLE_EXCEPTIONS(
14864                                l_api_name,
14865                                G_PKG_NAME,
14866                                'OKL_API.G_RET_STS_ERROR',
14867                                lx_msg_count,
14868                                lx_msg_data,
14869                                '_PVT');
14870     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
14871     IF l_sub_csr%ISOPEN THEN
14872         CLOSE l_sub_csr;
14873     END IF;
14874     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
14875                               l_api_name,
14876                               G_PKG_NAME,
14877                               'OKL_API.G_RET_STS_UNEXP_ERROR',
14878                               lx_msg_count,
14879                               lx_msg_data,
14880                               '_PVT');
14881     WHEN OTHERS THEN
14882     IF l_sub_csr%ISOPEN THEN
14883         CLOSE l_sub_csr;
14884     END IF;
14885     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
14886                               l_api_name,
14887                               G_PKG_NAME,
14888                               'OTHERS',
14889                               lx_msg_count,
14890                               lx_msg_data,
14891                               '_PVT');
14892 
14893 END get_line_subsidy_amount;
14894 
14895 
14896 ----------------------------------------------------------------------------------------------------
14897 
14898     -- Start of Comments
14899     -- Created By:       Durga Janaswamy
14900     -- Function Name  get_line_subsidy_ovrd_amount
14901     -- Description:   returns the asset line subsidy amount for given contract
14902     -- Dependencies:
14903     -- Parameters: contract id,contract line id, accounting method
14904     --
14905     -- Version: 1.0
14906     --
14907     -- End of Comments
14908 
14909 ----------------------------------------------------------------------------------------------------
14910 FUNCTION get_line_subsidy_ovrd_amount(
14911     p_contract_id                 IN  NUMBER,
14912     p_fin_asset_line_id           IN  NUMBER,
14913     p_accounting_method           IN  VARCHAR2)
14914 RETURN NUMBER IS
14915 
14916     lx_return_status        VARCHAR2(1)  DEFAULT OKL_API.G_RET_STS_SUCCESS;
14917     l_api_name             CONSTANT     VARCHAR2(30) := 'GET_LINE_ASSET_SUBSIDY_OVRD';
14918     l_api_version          CONSTANT     NUMBER := 1.0;
14919     l_init_msg_list                     VARCHAR2(1) := OKL_API.G_FALSE;
14920     lx_msg_count                        NUMBER := OKL_API.G_MISS_NUM;
14921     lx_msg_data                         VARCHAR2(2000);
14922 
14923     x_subsidy_amount       NUMBER;
14924 
14925     l_asset_line_subs_ovrd_amn NUMBER;
14926 
14927     --cursor to fetch all the subsidies attached to financial asset
14928     -- passing accounting method as input parameter
14929     CURSOR l_sub_csr(p_contract_id IN NUMBER,
14930                      p_fin_asset_line_id IN  NUMBER,
14931                      p_accounting_method IN  VARCHAR2) IS
14932     SELECT NVL(SUM(sub_kle.subsidy_override_amount),0)
14933     FROM   okl_subsidies_b    subb,
14934            okl_k_lines        sub_kle,
14935            okc_k_lines_b      sub_cle,
14936            okc_line_styles_b  sub_lse
14937     WHERE  subb.id                     = sub_kle.subsidy_id
14938     AND    subb.accounting_method_code = NVL(UPPER(p_accounting_method),subb.accounting_method_code)
14939     AND    sub_kle.id                  = sub_cle.id
14940     AND    sub_cle.lse_id              = sub_lse.id
14941     AND    sub_lse.lty_code            = 'SUBSIDY'
14942     AND    sub_cle.sts_code            <> 'ABANDONED'
14943     AND    sub_cle.dnz_chr_id          = p_contract_id
14944     AND    sub_cle.cle_id              = p_fin_asset_line_id
14945     AND    subb.customer_visible_yn    = 'Y'
14946     ;
14947 
14948     l_accounting_method        okl_subsidies_b.accounting_method_code%TYPE;
14949     l_subsidy_cle_id           NUMBER;
14950 
14951 BEGIN
14952 
14953 	l_asset_line_subs_ovrd_amn := 0;
14954 
14955     x_subsidy_amount := 0;
14956 
14957     IF(p_accounting_method IS NULL OR p_accounting_method = OKL_API.G_MISS_CHAR) THEN
14958         l_accounting_method := NULL;
14959     ELSE
14960         l_accounting_method := p_accounting_method;
14961     END IF;
14962 
14963     --------------------------------------------------------------
14964     --get all the subsidies associated to asset and get amount
14965     --------------------------------------------------------------
14966     OPEN l_sub_csr(p_contract_id , p_fin_asset_line_id, l_accounting_method);
14967     --LOOP  --sechawla 18-nov-08
14968     FETCH l_sub_csr INTO l_asset_line_subs_ovrd_amn;
14969     --    EXIT WHEN l_sub_csr%NOTFOUND;
14970     --END LOOP;
14971     CLOSE l_sub_csr;
14972 
14973     x_subsidy_amount := NVL(l_asset_line_subs_ovrd_amn,0);
14974 
14975     RETURN x_subsidy_amount;
14976 
14977     EXCEPTION
14978     WHEN OKL_API.G_EXCEPTION_ERROR THEN
14979     IF l_sub_csr%ISOPEN THEN
14980         CLOSE l_sub_csr;
14981     END IF;
14982     lx_return_status := OKL_API.HANDLE_EXCEPTIONS(
14983                                l_api_name,
14984                                G_PKG_NAME,
14985                                'OKL_API.G_RET_STS_ERROR',
14986                                lx_msg_count,
14987                                lx_msg_data,
14988                                '_PVT');
14989     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
14990     IF l_sub_csr%ISOPEN THEN
14991         CLOSE l_sub_csr;
14992     END IF;
14993     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
14994                               l_api_name,
14995                               G_PKG_NAME,
14996                               'OKL_API.G_RET_STS_UNEXP_ERROR',
14997                               lx_msg_count,
14998                               lx_msg_data,
14999                               '_PVT');
15000     WHEN OTHERS THEN
15001     IF l_sub_csr%ISOPEN THEN
15002         CLOSE l_sub_csr;
15003     END IF;
15004     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
15005                               l_api_name,
15006                               G_PKG_NAME,
15007                               'OTHERS',
15008                               lx_msg_count,
15009                               lx_msg_data,
15010                               '_PVT');
15011 
15012 END get_line_subsidy_ovrd_amount;
15013 
15014 
15015 ----------------------------------------------------------------------------------------------------
15016 
15017     -- Start of Comments
15018     -- Created By:    Seema Chawla
15019     -- Function Name  Total_Asset_Financed_Fee_Amt
15020     -- Description:   Returns total financed fee amount associated to an asset line
15021     -- Dependencies:
15022     -- Parameters: contract id and line id
15023     -- Version: 1.0
15024     -- End of Commnets
15025 
15026 ----------------------------------------------------------------------------------------------------
15027   FUNCTION Total_Asset_Financed_Fee_Amt(
15028             p_chr_id          IN  NUMBER,
15029             p_line_id         IN  NUMBER) RETURN NUMBER  IS
15030 
15031     l_api_version       CONSTANT NUMBER       := 1;
15032     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
15033     x_msg_count         NUMBER;
15034     x_msg_data          VARCHAR2(256);
15035 
15036     l_Asset_Fin_fees_amt    NUMBER := 0;
15037 
15038     CURSOR l_fee_csr( c_chr_id IN NUMBER, c_fin_asset_line_id IN NUMBER) IS
15039     SELECT sum(kle_cov.amount) asset_fin_fee_amt
15040        FROM   OKC_LINE_STYLES_B  LSEB,
15041               OKC_K_ITEMS        CIM,
15042               OKL_K_LINES        KLE_COV,
15043               okl_k_lines        fee_line,
15044               OKC_K_LINES_B      CLEB_COV,
15045               OKC_STATUSES_B     STSB
15046         WHERE LSEB.ID               = CLEB_COV.LSE_ID
15047         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
15048         AND   CIM.jtot_object1_code = 'OKX_COVASST'
15049         AND   CLEB_COV.id           =  CIM.cle_id
15050         AND   KLE_COV.id            =  CLEB_COV.ID
15051         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
15052         AND   CLEB_COV.dnz_chr_id   =  c_chr_id
15053         AND   cim.object1_id1       =  to_char(c_fin_asset_line_id) --lse_id = 33
15054         AND   CLEB_COV.sts_code     =  STSB.code
15055         and   CLEB_COV.cle_id       =  fee_line.id
15056         and   fee_line.fee_type     =  'FINANCED'
15057         AND   STSB.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
15058 
15059 
15060     CURSOR l_fee_csr_incl_terminated( c_chr_id IN NUMBER, c_fin_asset_line_id IN NUMBER) IS
15061     SELECT sum(kle_cov.amount) asset_fin_fee_amt
15062        FROM   OKC_LINE_STYLES_B  LSEB,
15063               OKC_K_ITEMS        CIM,
15064               OKL_K_LINES        KLE_COV,
15065               okl_k_lines        fee_line,
15066               OKC_K_LINES_B      CLEB_COV,
15067               OKC_STATUSES_B     STSB
15068         WHERE LSEB.ID               = CLEB_COV.LSE_ID
15069         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
15070         AND   CIM.jtot_object1_code = 'OKX_COVASST'
15071         AND   CLEB_COV.id           =  CIM.cle_id
15072         AND   KLE_COV.id            =  CLEB_COV.ID
15073         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
15074         AND   CLEB_COV.dnz_chr_id   =  c_chr_id
15075         AND   cim.object1_id1       =  to_char(c_fin_asset_line_id) --lse_id = 33
15076         AND   CLEB_COV.sts_code     =  STSB.code
15077         and   CLEB_COV.cle_id       =  fee_line.id
15078         and   fee_line.fee_type     =  'FINANCED'
15079         AND   STSB.ste_code NOT IN ( 'EXPIRED', 'CANCELLED', 'HOLD');
15080 
15081 
15082 
15083    l_discount_incl_terminated 	BOOLEAN := FALSE;
15084 
15085   BEGIN
15086 
15087     IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL)) THEN
15088            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
15089     END IF;
15090 
15091 
15092     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
15093       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
15094 	  LOOP
15095         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
15096           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
15097 		  l_discount_incl_terminated := TRUE;
15098         END IF;
15099       END LOOP;
15100     END IF;
15101 
15102 
15103     IF l_discount_incl_terminated THEN
15104        OPEN  l_fee_csr_incl_terminated (p_chr_id, p_line_id );
15105        FETCH l_fee_csr_incl_terminated INTO l_Asset_Fin_fees_amt;
15106        CLOSE l_fee_csr_incl_terminated;
15107     ELSE
15108        OPEN  l_fee_csr( p_chr_id, p_line_id );
15109        FETCH l_fee_csr INTO l_Asset_Fin_fees_amt;
15110        CLOSE l_fee_csr;
15111     END IF;
15112 
15113     l_Asset_Fin_fees_amt := nvl(l_Asset_Fin_fees_amt,0);
15114 
15115     RETURN l_Asset_Fin_fees_amt;
15116 
15117     EXCEPTION
15118 
15119         WHEN OTHERS THEN
15120             IF l_fee_csr_incl_terminated%ISOPEN THEN
15121                CLOSE l_fee_csr_incl_terminated;
15122             END IF;
15123             IF l_fee_csr%ISOPEN THEN
15124                CLOSE l_fee_csr;
15125             END IF;
15126 
15127                 Okl_Api.SET_MESSAGE(
15128                         p_app_name     => G_APP_NAME,
15129                         p_msg_name     => G_UNEXPECTED_ERROR,
15130                         p_token1       => G_SQLCODE_TOKEN,
15131                         p_token1_value => SQLCODE,
15132                         p_token2       => G_SQLERRM_TOKEN,
15133                         p_token2_value => SQLERRM);
15134             RETURN NULL;
15135 
15136   END Total_Asset_Financed_Fee_Amt;
15137 
15138 
15139   ----------------------------------------------------------------------------------------------------
15140 
15141     -- Start of Comments
15142     -- Created By:    Seema Chawla
15143     -- Function Name  Total_Asset_Rollover_Fee_Amt
15144     -- Description:   Returns total Rollover fee amount associated to an asset line
15145     -- Dependencies:
15146     -- Parameters: contract id and line id
15147     -- Version: 1.0
15148     -- End of Commnets
15149 
15150 ----------------------------------------------------------------------------------------------------
15151   FUNCTION Total_Asset_Rollover_Fee_Amt(
15152             p_chr_id          IN  NUMBER,
15153             p_line_id         IN  NUMBER) RETURN NUMBER  IS
15154 
15155     l_api_version       CONSTANT NUMBER       := 1;
15156     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
15157     x_msg_count         NUMBER;
15158     x_msg_data          VARCHAR2(256);
15159 
15160     l_Asset_Roll_fees_amt    NUMBER := 0;
15161 
15162     CURSOR l_fee_csr( c_chr_id IN NUMBER, c_fin_asset_line_id IN NUMBER) IS
15163     SELECT sum(kle_cov.amount) asset_roll_fee_amt
15164        FROM   OKC_LINE_STYLES_B  LSEB,
15165               OKC_K_ITEMS        CIM,
15166               OKL_K_LINES        KLE_COV,
15167               okl_k_lines        fee_line,
15168               OKC_K_LINES_B      CLEB_COV,
15169               OKC_STATUSES_B     STSB
15170         WHERE LSEB.ID               = CLEB_COV.LSE_ID
15171         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
15172         AND   CIM.jtot_object1_code = 'OKX_COVASST'
15173         AND   CLEB_COV.id           =  CIM.cle_id
15174         AND   KLE_COV.id            =  CLEB_COV.ID
15175         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
15176         AND   CLEB_COV.dnz_chr_id   =  c_chr_id
15177         AND   cim.object1_id1       =  to_char(c_fin_asset_line_id) --lse_id = 33
15178         AND   CLEB_COV.sts_code     =  STSB.code
15179         and   CLEB_COV.cle_id       =  fee_line.id
15180         and   fee_line.fee_type     =  'ROLLOVER'
15181         AND   STSB.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
15182 
15183 
15184     CURSOR l_fee_csr_incl_terminated( c_chr_id IN NUMBER, c_fin_asset_line_id IN NUMBER) IS
15185     SELECT sum(kle_cov.amount) asset_roll_fee_amt
15186        FROM   OKC_LINE_STYLES_B  LSEB,
15187               OKC_K_ITEMS        CIM,
15188               OKL_K_LINES        KLE_COV,
15189               okl_k_lines        fee_line,
15190               OKC_K_LINES_B      CLEB_COV,
15191               OKC_STATUSES_B     STSB
15192         WHERE LSEB.ID               = CLEB_COV.LSE_ID
15193         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
15194         AND   CIM.jtot_object1_code = 'OKX_COVASST'
15195         AND   CLEB_COV.id           =  CIM.cle_id
15196         AND   KLE_COV.id            =  CLEB_COV.ID
15197         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
15198         AND   CLEB_COV.dnz_chr_id   =  c_chr_id
15199         AND   cim.object1_id1       =  to_char(c_fin_asset_line_id) --lse_id = 33
15200         AND   CLEB_COV.sts_code     =  STSB.code
15201         and   CLEB_COV.cle_id       =  fee_line.id
15202         and   fee_line.fee_type     =  'ROLLOVER'
15203         AND   STSB.ste_code NOT IN ( 'EXPIRED', 'CANCELLED', 'HOLD');
15204 
15205 
15206 
15207    l_discount_incl_terminated 	BOOLEAN := FALSE;
15208 
15209   BEGIN
15210 
15211     IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL)) THEN
15212            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
15213     END IF;
15214 
15215 
15216     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
15217       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
15218 	  LOOP
15219         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
15220           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
15221 		  l_discount_incl_terminated := TRUE;
15222         END IF;
15223       END LOOP;
15224     END IF;
15225 
15226 
15227     IF l_discount_incl_terminated THEN
15228        OPEN  l_fee_csr_incl_terminated (p_chr_id, p_line_id );
15229        FETCH l_fee_csr_incl_terminated INTO l_Asset_roll_fees_amt;
15230        CLOSE l_fee_csr_incl_terminated;
15231     ELSE
15232        OPEN  l_fee_csr( p_chr_id, p_line_id );
15233        FETCH l_fee_csr INTO l_Asset_roll_fees_amt;
15234        CLOSE l_fee_csr;
15235     END IF;
15236 
15237     l_Asset_roll_fees_amt := nvl(l_Asset_roll_fees_amt,0);
15238 
15239     RETURN l_Asset_roll_fees_amt;
15240 
15241     EXCEPTION
15242 
15243         WHEN OTHERS THEN
15244             IF l_fee_csr_incl_terminated%ISOPEN THEN
15245                CLOSE l_fee_csr_incl_terminated;
15246             END IF;
15247             IF l_fee_csr%ISOPEN THEN
15248                CLOSE l_fee_csr;
15249             END IF;
15250 
15251                 Okl_Api.SET_MESSAGE(
15252                         p_app_name     => G_APP_NAME,
15253                         p_msg_name     => G_UNEXPECTED_ERROR,
15254                         p_token1       => G_SQLCODE_TOKEN,
15255                         p_token1_value => SQLCODE,
15256                         p_token2       => G_SQLERRM_TOKEN,
15257                         p_token2_value => SQLERRM);
15258             RETURN NULL;
15259 
15260   END Total_Asset_Rollover_Fee_Amt;
15261 
15262 
15263 END Okl_Seeded_Functions_Pvt;