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.141.12020000.9 2013/03/20 12:11:23 racheruv 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 -- Procedures and Functions
15 ----------------------------------------------------------------------------
16 
17 ---------------------------------------------------------------------------
18 -- Start of Comments
19 --  FUNCTION: INS_MONTHLY_PREMIUM
20 --  DESC   : It returns monthly insurance premium
21 --  IN     : p_contract_id ,p_contract_line_id
22 --  OUT    : Monthly Premium
23 -- Created By: Dalip Khandel        (dkhandel)
24 -- Version: 1.0
25 -- End of Commnets
26 ----------------------------------------------------------------------------------------------------
27 
28 FUNCTION INS_MONTHLY_PREMIUM(
29  p_contract_id                   IN NUMBER
30  ,p_contract_line_id             IN NUMBER
31 ) RETURN NUMBER
32 IS
33   l_amount NUMBER := 0;
34   ls_payment_freq VARCHAR2(30) ;
35   l_monthly_premium NUMBER := 0;
36   l_freq_factor  NUMBER := 0;
37   date_to   DATE ;
38   date_from DATE ;
39 
40   CURSOR c_monthly_premium (p_contract_id  NUMBER,p_contract_line_id NUMBER )
41   IS
42   SELECT PREMIUM , IPF_CODE, DATE_TO , DATE_FROM
43   FROM OKL_INS_POLICIES_B IPYB
44   WHERE IPYB.kle_id = p_contract_line_id
45   AND IPYB.khr_id = p_contract_id  ;
46 
47 BEGIN
48 
49   OPEN c_monthly_premium (p_contract_id,p_contract_line_id );
50     FETCH c_monthly_premium INTO l_amount, ls_payment_freq, date_to, date_from;
51     IF(c_monthly_premium%NOTFOUND) THEN
52          Okc_Api.set_message(G_APP_NAME, G_INVALID_CONTRACT_LINE,
53          G_COL_NAME_TOKEN,p_contract_line_id);
54         -- x_return_status := OKC_API.G_RET_STS_ERROR ;
55          CLOSE c_monthly_premium ;
56          RAISE OKC_API.G_EXCEPTION_ERROR;
57    END IF ;
58    CLOSE c_monthly_premium;
59 
60   	IF(ls_payment_freq = 'MONTHLY') THEN
61 		l_freq_factor := 1;
62 	ELSIF(ls_payment_freq = 'BI_MONTHLY') THEN
63 		l_freq_factor := 1/2;
64 	ELSIF(ls_payment_freq = 'HALF_YEARLY') THEN
65 	   l_freq_factor := 6;	--- ETC.
66 	ELSIF(ls_payment_freq = 'QUARTERLY') THEN
67 	 	l_freq_factor := 3;
68 	ELSIF(ls_payment_freq = 'YEARLY') THEN
69 	 	l_freq_factor := 12;
70 	ELSIF(ls_payment_freq = 'LUMP_SUM') THEN
71                 -- Bug# 4056484 PAGARG removing rounding
72 	 	l_freq_factor :=   MONTHS_BETWEEN( date_to,date_from);
73 	END IF;
74     l_monthly_premium   := l_amount / l_freq_factor ;
75   RETURN l_monthly_premium;
76   EXCEPTION
77     WHEN OTHERS THEN
78       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
79                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
80                           p_token1        => 'OKL_SQLCODE',
81                           p_token1_value  => SQLCODE,
82                           p_token2        => 'OKL_SQLERRM',
83                           p_token2_value  => SQLERRM);
84       RETURN NULL;
85 
86 END;
87 
88   ----------------------------------------------------------------------------------------------------
89 
90 
91 ---------------------------------------------------------------------------
92 -- Start of Comments
93 --  FUNCTION: INS_REFUNDABLE_MONTHS
94 --  DESC   : It returns number of months to be refunded
95 --  IN     : p_contract_id ,p_contract_line_id
96 --  OUT    : Number of months
97 -- Created By: Dalip Khandel        (dkhandel)
98 -- Version: 1.0
99 -- End of Commnets
100 ----------------------------------------------------------------------------------------------------
101 
102 FUNCTION INS_REFUNDABLE_MONTHS(
103  p_contract_id                   IN NUMBER
104  -- ,p_contract_line_id             IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
105  ,p_contract_line_id             IN NUMBER
106 )
107 RETURN NUMBER
108  IS
109 
110 
111    CURSOR c_total_amount_paid (p_sty_id NUMBER)
112    IS
113    SELECT COUNT(*)
114    FROM  okl_strm_elements STRE, OKL_STREAMS STR
115    WHERE STR.ID =  STRE.STM_ID
116     AND STR.STY_ID = p_sty_id
117     AND STRE.DATE_BILLED IS NOT NULL
118     AND STR.KHR_ID = p_contract_id
119     AND STR.KLE_ID = p_contract_line_id;
120 
121      CURSOR  C_OKL_STRM_TYPE_REC_V IS
122       SELECT ID
123       FROM OKL_STRM_TYPE_TL
124       WHERE NAME = 'INSURANCE RECEIVABLE'
125       AND LANGUAGE = 'US';
126 
127   CURSOR c_monthly_premium (p_contract_id  NUMBER,p_contract_line_id NUMBER )
128   IS
129   SELECT  IPF_CODE, DATE_TO , DATE_FROM --, CANCELLATION_DATE --++Effective DatedTermination ++---
130   FROM OKL_INS_POLICIES_B IPYB
131   WHERE IPYB.kle_id = p_contract_line_id
132   AND IPYB.khr_id = p_contract_id  ;
133 
134 
135   ls_payment_freq  OKL_INS_POLICIES_B.IPF_CODE%TYPE;
136   date_to   OKL_INS_POLICIES_B.DATE_TO%TYPE ;
137   date_from OKL_INS_POLICIES_B.DATE_FROM%TYPE ;
138   cancel_date OKL_INS_POLICIES_B.CANCELLATION_DATE%TYPE;
139   l_stm_type_id     OKL_STRM_TYPE_TL.ID%TYPE := 0;
140 
141 
142   l_profile_value NUMBER := 0;
143   l_months_to_refund NUMBER := 0;
144 
145   l_no_of_rec      NUMBER := 0;
146   l_freq_factor NUMBER;
147   l_total_num_months_paid NUMBER;
148   l_total_consumed_months NUMBER;
149   l_unconsumed_months NUMBER;
150   l_cancellation_date DATE; ---++ Ins Effective Dated Term Changes ++----
151   l_cancellation_reason VARCHAR2(30);---++ Ins Effective Dated Term Changes ++----
152   l_return_status                        VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
153 
154 BEGIN
155         -- ********************************************
156 	-- Extract Insurance Cancellation Date from global variables
157 	-- ********************************************
158 	IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(1)
159 	AND okl_execute_formula_pub.g_additional_parameters(1).name = ' CANCELLATION DATE'
160 	AND okl_execute_formula_pub.g_additional_parameters(1).value IS NOT NULL
161 	THEN
162 		l_cancellation_date := TO_DATE
163 			(okl_execute_formula_pub.g_additional_parameters(1).value, 'MM/DD/YYYY');
164 	END IF;
165 IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(2)
166 	AND okl_execute_formula_pub.g_additional_parameters(2).name = ' CANCELLATION REASON'
167 	AND okl_execute_formula_pub.g_additional_parameters(2).value IS NOT NULL
168 	THEN
169 		l_cancellation_reason := TO_char
170 			(okl_execute_formula_pub.g_additional_parameters(2).value);
171 	END IF;
172         ---++ Ins Effective Dated Term Changes End ++----
173 
174   -- GET profile value
175   l_profile_value := fnd_profile.value('OKLINMAXTERMFORINS');
176 
177   IF(( l_profile_value =  NULL) OR (l_profile_value = OKC_API.G_MISS_NUM )) THEN
178      l_unconsumed_months := 0 ;
179   END IF;
180 
181     /*OPEN C_OKL_STRM_TYPE_REC_V ;
182     FETCH C_OKL_STRM_TYPE_REC_V INTO l_stm_type_id;
183     IF(C_OKL_STRM_TYPE_REC_V%NOTFOUND) THEN
184          Okc_Api.set_message(G_APP_NAME, 'OKL_NO_TRANSACTION',
185          G_COL_NAME_TOKEN,'Billing');
186          CLOSE C_OKL_STRM_TYPE_REC_V ;
187          RAISE OKC_API.G_EXCEPTION_ERROR;
188    END IF ;
189     CLOSE C_OKL_STRM_TYPE_REC_V;*/
190   -- cursor fetch replaced with the streams util call, change
191   -- done for user defined streams impacts, bug 3924300
192   -- begin changes for bug 3924300
193 
194    OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
195                                                    'INSURANCE_RECEIVABLE',
196                                                    l_return_status,
197                                                    l_stm_type_id);
198    IF (l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
199                    RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
200    ELSIF (l_return_status = OKC_API.G_RET_STS_ERROR) THEN
201           Okc_Api.set_message(G_APP_NAME, 'OKL_NO_STREAM_TYPE', G_PURPOSE_TOKEN,'INSURANCE_RECEIVABLE'); -- bug 4024785
202                    RAISE OKC_API.G_EXCEPTION_ERROR;
203    END IF;
204   -- end changes for bug 3924300
205 
206 
207      OPEN c_total_amount_paid(l_stm_type_id) ;
208     FETCH c_total_amount_paid INTO l_no_of_rec;
209     IF(c_total_amount_paid%NOTFOUND) THEN
210          l_no_of_rec := 0;
211    END IF ;
212    CLOSE c_total_amount_paid;
213 
214 
215    OPEN c_monthly_premium (p_contract_id,p_contract_line_id );
216     FETCH c_monthly_premium INTO  ls_payment_freq, date_to, date_from;--, cancel_date;--++ Effective Dated TErmination ++--
217     IF(c_monthly_premium%NOTFOUND) THEN
218          Okc_Api.set_message(G_APP_NAME, G_INVALID_CONTRACT_LINE,
219          G_COL_NAME_TOKEN,p_contract_line_id);
220         -- x_return_status := OKC_API.G_RET_STS_ERROR ;
221          CLOSE c_monthly_premium ;
222          RAISE OKC_API.G_EXCEPTION_ERROR;
223    END IF ;
224    CLOSE c_monthly_premium;
225 
226    ---++ Ins Effective Dated Term Changes Start ++----
227   IF(( l_cancellation_date IS  NULL) OR (l_cancellation_date = OKC_API.G_MISS_DATE )) THEN
228      cancel_date := SYSDATE ;
229    ELSE
230      cancel_date := l_cancellation_date;
231    END IF;
232    ---++ Ins Effective Dated Term Changes End ++----
233 
234      IF(ls_payment_freq = 'MONTHLY') THEN
235 		l_freq_factor := 1;
236 	ELSIF(ls_payment_freq = 'BI_MONTHLY') THEN
237 		l_freq_factor := 1/2;
238 	ELSIF(ls_payment_freq = 'HALF_YEARLY') THEN
239 			   l_freq_factor := 6;	--- ETC.
240 	ELSIF(ls_payment_freq = 'QUARTERLY') THEN
241 			 	l_freq_factor := 3;
242 	ELSIF(ls_payment_freq = 'YEARLY') THEN
243 			 	l_freq_factor := 12;
244 	ELSIF(ls_payment_freq = 'LUMP_SUM') THEN
245                  --Bug# 4056484 PAGARG removing rounding
246 	 	l_freq_factor :=   MONTHS_BETWEEN( date_to,date_from);
247 	END IF;
248 
249     l_total_num_months_paid := l_freq_factor * l_no_of_rec;
250     IF(( l_total_num_months_paid IS NULL) OR (l_total_num_months_paid = OKC_API.G_MISS_NUM )) THEN
251      l_total_num_months_paid := 0 ;
252    END IF;
253         --- ++++ Eff Dated Term Qte Changes +++++ ----------
254                     IF cancel_date < date_from THEN
255                     --** If Eff date of Termination is earlier than Policy start date then
256                     --** calculate consumed months as insurance start to SYSDATE
257                      IF date_from < SYSDATE THEN
258                         l_total_consumed_months := MONTHS_BETWEEN(SYSDATE ,date_from);
259                      ELSIF date_from > SYSDATE THEN
260                         l_total_consumed_months := 0;
261                      ELSE
262                      -- Bug# 4056484 PAGARG removing rounding
263                         l_total_consumed_months := MONTHS_BETWEEN( cancel_date,date_from);
264                      END IF;
265                     ELSE
266                       -- Bug# 4056484 PAGARG removing rounding
267                      l_total_consumed_months := MONTHS_BETWEEN( cancel_date,date_from);
268                     END IF;
269         --- ++++ Eff Dated Term Qte Changes +++++ ----------
270 
271     IF(( l_total_consumed_months IS  NULL) OR (l_total_consumed_months = OKC_API.G_MISS_NUM )) THEN
272          l_total_consumed_months := 0 ;
273    END IF;
274 
275     l_unconsumed_months := l_total_num_months_paid - l_total_consumed_months ;
276    IF(( l_unconsumed_months IS  NULL) OR (l_unconsumed_months = OKC_API.G_MISS_NUM )) THEN
277      l_unconsumed_months := 0 ;
278    END IF;
279 
280     IF (l_unconsumed_months > l_profile_value) AND
281            (l_cancellation_reason = 'CANCELED_BY_CUSTOMER') THEN --Eff Dated Term Changes ++---
282       RETURN l_profile_value;
283     ELSE
284      RETURN  l_unconsumed_months;
285     END IF;
286 
287   EXCEPTION
288     WHEN OTHERS THEN
289       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
290                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
291                           p_token1        => 'OKL_SQLCODE',
292                           p_token1_value  => SQLCODE,
293                           p_token2        => 'OKL_SQLERRM',
294                           p_token2_value  => SQLERRM);
295       RETURN NULL;
296 
297 END;
298 
299 ------------------------------------------------------------------------------
300   -- Start of Comments
301   -- Created By:    sechawla 6651621
302   -- Function Name: line_taxable_basis
303   -- Description:   Returns taxable basis amount for a transaction line.
304   --                For header level Booking, Rebook and Sales Quote transactions,
305   --                0 amount is returned. For line level transactions, the default
306   --                taxable basis amount is returned. Default taxable basis amount
307   --                is passed to this function from okl_process_sales_tax_pvt, by
308   --                populating default_taxable_basis additional parameter. This function
309   --                extracts the amount from this parameter and returns it back.
310   -- Parameters:    IN:  p_khr_id, p_kle_id
311   --                     additional parameters stored in g_additional_parameters
312   --                OUT: amount
313   -- Version:       1.0
314   -- History      : 03-Jan-07 sechawla 6651621 - Created
315   -- End of Commnets
316 ------------------------------------------------------------------------------
317 
318 FUNCTION line_taxable_basis (
319 	p_khr_id		IN NUMBER,
320 	p_kle_id	    IN NUMBER)
321 	RETURN NUMBER IS
322 
323     l_source_trx_name               VARCHAR2(150);
324     l_line_name                     VARCHAR2(150);
325     l_line_taxable_basis            NUMBER;
326 BEGIN
327 
328    --  Validate additional parameters availability
329     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
330       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
331 	  LOOP
332         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'SOURCE_TRX_NAME'
333            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
334                 l_source_trx_name := okl_execute_formula_pub.g_additional_parameters(I).value;
335         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'LINE_NAME'
336            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
337                 l_line_name :=okl_execute_formula_pub.g_additional_parameters(I).value;
338         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'DEFAULT_TAXABLE_BASIS'
339            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
340                 l_line_taxable_basis := to_number(okl_execute_formula_pub.g_additional_parameters(I).value);
341         END IF;
342       END LOOP;
343 	ELSE
344 	     -- Additional parameters are needed to evaluate taxable basis override formula LINE_TAXABLE_BASIS.
345          OKL_API.set_message(p_app_name      => 'OKL',
346                              p_msg_name      => 'OKL_TX_NO_TBO_PARAMS');
347          RAISE Okl_Api.G_EXCEPTION_ERROR;
348 
349 	END IF;
350 
351     IF l_source_trx_name IS NULL THEN
352        OKL_API.set_message( p_app_name      => 'OKC',
353                             p_msg_name      => G_REQUIRED_VALUE,
354                             p_token1        => G_COL_NAME_TOKEN,
355                             p_token1_value  => 'SOURCE_TRX_NAME');
356 
357        RAISE Okl_Api.G_EXCEPTION_ERROR;
358     END IF;
359 
360     IF  l_line_taxable_basis IS NULL THEN
361         OKL_API.set_message( p_app_name     => 'OKC',
362                             p_msg_name      => G_REQUIRED_VALUE,
363                             p_token1        => G_COL_NAME_TOKEN,
364                             p_token1_value  => 'DEFAULT_TAXABLE_BASIS');
365 
366         RAISE Okl_Api.G_EXCEPTION_ERROR;
367     END IF;
368 
369     IF l_source_trx_name IN ('Booking','Rebook','Sales Quote') AND l_line_name IS NULL THEN
370         --Contract Header or Sales Quote Header level tax call
371           RETURN 0;
372     ELSE
373           RETURN l_line_taxable_basis;
374     END IF;
375 
376 EXCEPTION
377 
378     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
379           RETURN NULL;
380 
381 	WHEN OTHERS THEN
382 
383 		OKL_API.SET_MESSAGE (
384 			p_app_name	=> OKL_API.G_APP_NAME,
385 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
386 			p_token1	=> 'SQLCODE',
387 			p_token1_value	=> SQLCODE,
388 			p_token2	=> 'SQLERRM',
389 			p_token2_value	=> SQLERRM);
390 
391 		RETURN NULL;
392 
393 END line_taxable_basis;
394 
395   ----------------------------------------------------------------------------------------------------
396 
397     -- Start of Comments
398     -- Created By:       Santhosh Siruvole (ssiruvol)
399     -- Function Name  contract_sumofrents
400     -- Description:   returns the sum of amount on stream type - Rent.
401     -- Dependencies:
402     -- Parameters: contract id.
403     -- Version: 1.0
404     -- End of Commnets
405 
406 ----------------------------------------------------------------------------------------------------
407   FUNCTION contract_sum_of_rents(
408             p_chr_id          IN  NUMBER,
409             p_line_id         IN  NUMBER) RETURN NUMBER  IS
410 
411     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_SUM_OF_RENTS';
412     l_api_version	CONSTANT NUMBER	      := 1;
413     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
414     x_msg_count         NUMBER;
415     x_msg_data          VARCHAR2(256);
416 
417     l_rents NUMBER := 0;
418 
419     CURSOR l_line_rents_csr (chrId NUMBER ) IS
420     SELECT NVL(str.link_hist_stream_id,-1) link_hist_stream_id,
421            NVL(SUM(sele.amount),0) amount
422     FROM okl_strm_elements sele,
423          okl_streams str,
424          --okl_strm_type_tl sty,
425          okl_strm_type_v sty,
426          okl_K_lines_full_v kle,
427          okc_statuses_b sts
428     WHERE sele.stm_id = str.id
429        AND str.sty_id = sty.id
430        --AND UPPER(sty.name) = 'RENT'
431        AND sty.stream_type_purpose = 'RENT'
432        --AND sty.LANGUAGE = 'US'
433        AND str.say_code = 'CURR'
434        AND str.active_yn = 'Y'
435        AND NVL( str.purpose_code, 'XXXX' ) = 'XXXX'
436        AND str.khr_id = chrId
437        AND str.kle_id = kle.id
438        AND kle.chr_id = chrId
439        AND kle.sts_code = sts.code
440        AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
441     GROUP BY str.link_hist_stream_id;
442 
443     CURSOR l_line_rents_adj_csr (p_stm_id NUMBER) IS
444     SELECT NVL(SUM(sele.amount),0) amount
445     FROM   okl_strm_elements sele
446     WHERE  stm_id = p_stm_id
447     AND    date_billed IS NOT NULL;
448 
449     CURSOR l_chr_rents_csr (chrId NUMBER ) IS
450     SELECT NVL(SUM(sele.amount),0) amount
451     FROM okl_strm_elements sele,
452          okl_streams str,
453          --okl_strm_type_tl sty
454          okl_strm_type_v sty
455     WHERE sele.stm_id = str.id
456        AND str.sty_id = sty.id
457        --AND UPPER(sty.name) = 'RENT'
458        AND sty.stream_type_purpose = 'RENT'
459        --AND sty.LANGUAGE = 'US'
460        AND str.say_code = 'CURR'
461        AND str.active_yn = 'Y'
462        AND NVL( str.purpose_code, 'XXXX' ) = 'XXXX'
463        AND str.khr_id = chrId
464        AND NVL(str.kle_id, -1) = -1;
465 
466     -- Bug# 15992711 , Start
467     -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
468     CURSOR l_line_rents_nr_csr  (chrId NUMBER, p_line_type VARCHAR2 ) IS
469     SELECT NVL(str.link_hist_stream_id,-1) link_hist_stream_id,
470            NVL(SUM(sele.amount),0) amount
471     FROM okl_strm_elements sele,
472          okl_streams str,
473          --okl_strm_type_tl sty,
474          okl_strm_type_v sty,
475          okl_K_lines_full_v kle,
476          okc_statuses_b sts
477     WHERE sele.stm_id = str.id
478        AND str.sty_id = sty.id
479        --AND UPPER(sty.name) = 'RENT'
480        AND sty.stream_type_purpose = 'RENT'
481        --AND sty.LANGUAGE = 'US'
482        AND str.say_code = 'CURR'
483        AND str.active_yn = 'Y'
484        AND NVL( str.purpose_code, 'XXXX' ) = 'XXXX'
485        AND str.khr_id = chrId
486        AND str.kle_id = kle.id
487        AND kle.chr_id = chrId
488        AND kle.sts_code = sts.code
489        AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
490        AND NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y')
491     GROUP BY str.link_hist_stream_id;
492 
493     l_line_type VARCHAR2(30) := 'X';
494     -- Bug# 15992711 , End
495 
496 
497     l_chr_rents_rec l_chr_rents_csr%ROWTYPE;
498     l_line_rents_amount NUMBER;
499     l_rent_adj_amount   NUMBER;
500 
501   BEGIN
502 
503        IF ( p_chr_id IS NULL ) THEN
504            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
505        END IF;
506 
507        --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
508        --                If set then based on its value set l_line_type
509 
510        IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
511           FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
512           LOOP
513              IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
514                 IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
515                    l_line_type := 'NEW'; --New
516                 ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
517                    l_line_type := 'RELEASE'; --Release
518                 END IF;
519              END IF;
520 
521           END LOOP;
522        END IF;
523 
524        -- If l_line_type is set as either 'NEW' or 'RELEASE' call
525        -- l_line_rents_nr_csr cursor in order to consider either only new
526        -- assets or only re-leased assets, else no change in the standard behavior
527 
528        IF l_line_type IN ('NEW','RELEASE') then
529            l_line_rents_amount := 0;
530 
531            FOR l_line_rents_nr_rec IN l_line_rents_nr_csr (p_chr_id, l_line_type)
532            LOOP
533               l_line_rents_amount := NVL(l_line_rents_amount,0) + l_line_rents_nr_rec.amount;
534 
535               IF (l_line_rents_nr_rec.link_hist_stream_id <> -1) THEN
536                  l_rent_adj_amount := 0;
537                  OPEN l_line_rents_adj_csr (l_line_rents_nr_rec.link_hist_stream_id);
538                  FETCH l_line_rents_adj_csr INTO l_rent_adj_amount;
539                  CLOSE l_line_rents_adj_csr;
540 
541                  l_line_rents_amount := l_line_rents_amount - NVL(l_rent_adj_amount,0);
542               END IF;
543            END LOOP;
544        ELSE
545        --Bug# 15992711 , End
546 
547           l_line_rents_amount := 0;
548           FOR l_line_rents_rec IN l_line_rents_csr (p_chr_id)
549           LOOP
550              l_line_rents_amount := NVL(l_line_rents_amount,0) + l_line_rents_rec.amount;
551 
552              IF (l_line_rents_rec.link_hist_stream_id <> -1) THEN
553                 l_rent_adj_amount := 0;
554                 OPEN l_line_rents_adj_csr (l_line_rents_rec.link_hist_stream_id);
555                 FETCH l_line_rents_adj_csr INTO l_rent_adj_amount;
556                 CLOSE l_line_rents_adj_csr;
557 
558                 l_line_rents_amount := l_line_rents_amount - NVL(l_rent_adj_amount,0);
559              END IF;
560           END LOOP;
561 
562           /*
563           OPEN l_chr_rents_csr( p_chr_id );
564           FETCH l_chr_rents_csr INTO l_chr_rents_rec;
565           CLOSE l_chr_rents_csr;
566           */
567        --Bug# 15992711 , Start
568        END IF;
569        --Bug# 15992711 , End
570 
571        l_rents := l_line_rents_amount;
572 
573       RETURN l_rents;
574 
575 
576     EXCEPTION
577 	WHEN OTHERS  THEN
578                Okl_Api.SET_MESSAGE(
579                         p_app_name     => G_APP_NAME,
580                         p_msg_name     => G_UNEXPECTED_ERROR,
581                         p_token1       => G_SQLCODE_TOKEN,
582                         p_token1_value => SQLCODE,
583                         p_token2       => G_SQLERRM_TOKEN,
584                         p_token2_value => SQLERRM);
585                 RETURN NULL;
586 
587   END contract_sum_of_rents;
588 
589 ----------------------------------------------------------------------------------------------------
590 
591     -- Start of Comments
592     -- Created By:       Santhosh Siruvole (ssiruvol)
593     -- Function Name  contract_income
594     -- Description:   returns sum of all incomes of financial asset lines of a contract
595     -- Dependencies:
596     -- Parameters: contract id.
597     -- Version: 1.0
598     -- End of Commnets
599 
600 ----------------------------------------------------------------------------------------------------
601   FUNCTION contract_income(
602             p_chr_id          IN  NUMBER,
603             p_line_id          IN  NUMBER) RETURN NUMBER  IS
604 
605     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_INCOME';
606     l_api_version	CONSTANT NUMBER	      := 1;
607     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
608     x_msg_count         NUMBER;
609     x_msg_data          VARCHAR2(256);
610 
611     l_income NUMBER := 0;
612 
613   BEGIN
614 
615        IF ( p_chr_id IS NULL ) THEN
616            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
617        END IF;
618 --
619 -- Note: User defined stream: This stream type has been identified as
620 --       "Not being used" and hence not modified with its purpose
621 --
622       SELECT NVL(SUM(sele.amount),0) INTO l_income
623       FROM okl_strm_elements sele,
624            okl_streams str,
625            okl_strm_type_v sty,
626 	   okl_K_lines_full_v kle,
627 	   okc_statuses_b sts
628       WHERE sele.stm_id = str.id
629            AND str.sty_id = sty.id
630            AND UPPER(sty.name) = 'UNEARNED INCOME'
631            AND str.khr_id = p_chr_id
632 	   AND kle.sts_code = sts.code
633 	   AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
634 
635       RETURN l_income;
636 
637 
638     EXCEPTION
639 
640 	WHEN OTHERS THEN
641                Okl_Api.SET_MESSAGE(
642                         p_app_name     => G_APP_NAME,
643                         p_msg_name     => G_UNEXPECTED_ERROR,
644                         p_token1       => G_SQLCODE_TOKEN,
645                         p_token1_value => SQLCODE,
646                         p_token2       => G_SQLERRM_TOKEN,
647                         p_token2_value => SQLERRM);
648                 RETURN NULL;
649 
650 
651   END contract_income;
652 
653 --Bug# 3638568 : Function modifieed to conditionally include TERMINATED lines if called from pricing
654 ----------------------------------------------------------------------------------------------------
655 
656     -- Start of Comments
657     -- Created By:       Santhosh Siruvole (ssiruvol)
658     -- Function Name  line_residualvalue
659     -- Description:   returns the residual_value of the a financial asset line.
660     -- Dependencies:
661     -- Parameters: contract id and line id
662     -- Version: 1.0
663     -- SECHAWLA 05-MAY-04 3578894 : Modified to accomodate additional parameters for Reporting product
664     -- SECHAWLA 02-FEB-05 4141411 : Added unexpected error exception handling block
665     -- PRASJAIN Bug 6030917 : Added Proration Logic
666     -- End of Commnets
667 
668 ----------------------------------------------------------------------------------------------------
669   FUNCTION line_residual_value(
670             p_chr_id          IN  NUMBER,
671             p_line_id         IN  NUMBER) RETURN NUMBER  IS
672 
673     l_api_name          CONSTANT VARCHAR2(30) := 'RETURN_LINE_RESIDUAL_VALUE';
674     l_api_version       CONSTANT NUMBER       := 1;
675     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
676     x_msg_count         NUMBER;
677     x_msg_data          VARCHAR2(256);
678 
679     l_residual_value NUMBER := 0.0;
680     l_oec            NUMBER := 0.0;
681 
682     CURSOR residual_csr( chrId NUMBER, lineId NUMBER ) IS
683     SELECT NVL(kle.residual_value,0) Value,
684            NVL(kle.residual_percentage,0) Percent
685           ,ls.lty_code lty_Code --added bug 7439724
686     FROM OKC_LINE_STYLES_B LS,
687          okl_K_lines_full_v kle,
688          okc_statuses_b sts
689     WHERE  LS.ID = KLE.LSE_ID
690          --Modified bug 7439724
691           AND LS.LTY_CODE in ('FREE_FORM1',
692                                   'FEE',
693                                   'SOLD_SERVICE'
694                              )
695          AND KLE.ID = lineId
696          AND KLE.DNZ_CHR_ID = chrId
697          AND kle.sts_code = sts.code
698          AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
699 
700     CURSOR residual_csr_incl_terminated( chrId NUMBER, lineId NUMBER ) IS
701     SELECT NVL(kle.residual_value,0) Value,
702            NVL(kle.residual_percentage,0) Percent
703                     ,ls.lty_code lty_Code --added bug 7439724
704     FROM OKC_LINE_STYLES_B LS,
705          okl_K_lines_full_v kle,
706          okc_statuses_b sts
707     WHERE  LS.ID = KLE.LSE_ID
708      --Modified bug 7439724
709           AND LS.LTY_CODE in ('FREE_FORM1',
710                                   'FEE',
711                                   'SOLD_SERVICE'
712                               )
713          AND KLE.ID = lineId
714          AND KLE.DNZ_CHR_ID = chrId
715          AND kle.sts_code = sts.code
716          AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
717 
718    residual_rec residual_csr%ROWTYPE;
719    --SECHAWLA 05-MAY-04 3578894 : new declarations
720     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
721     l_trx_date   DATE;
722     l_k_end_date  DATE;
723 
724     -- get the K end date
725     CURSOR  l_contract_csr(cp_chr_id IN NUMBER) IS
726     SELECT  END_DATE
727     FROM    okc_k_headers_b
728     WHERE   id = cp_chr_id;
729 
730     l_discount_incl_terminated BOOLEAN := FALSE;
731     l_proration_factor         NUMBER;
732 
733   BEGIN
734 
735       IF ( ( p_chr_id IS NULL ) OR ( p_line_id IS NULL ) ) THEN
736           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
737 
738       END IF;
739 
740       -- SECHAWLA 05-MAY-04 3578894 : check the additional parameter for rep product
741       --Validate additional parameters availability
742       IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
743         FOR I IN
744 Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.FIRST..Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.LAST LOOP
745            IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
746                AND  Okl_Execute_Formula_Pub.g_additional_parameters(I).value IS NOT NULL THEN
747                 l_rep_prod_streams_yn := Okl_Execute_Formula_Pub.g_additional_parameters(I).value;
748            ELSIF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
749                AND  Okl_Execute_Formula_Pub.g_additional_parameters(I).value IS NOT NULL THEN
750                 l_trx_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
751 
752            -- Start : Bug 6030917 : prasjain
753            --added for getting the proration factor for partial unit termination
754            ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'proration_factor'
755            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
756            l_proration_factor := to_number(okl_execute_formula_pub.g_additional_parameters(I).value);
757            -- End : Bug 6030917 : prasjain
758 
759            END IF;
760         END LOOP;
761           ELSE
762          l_rep_prod_streams_yn := 'N';
763           END IF;
764 
765       IF l_rep_prod_streams_yn = 'Y' THEN
766          IF l_trx_date IS NULL THEN
767          -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
768             Okl_Api.Set_Message(p_app_name     => g_app_name,
769                                 p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
770             RAISE Okl_Api.G_EXCEPTION_ERROR;
771          END IF;
772       END IF;
773 
774       IF l_rep_prod_streams_yn = 'Y' THEN
775          OPEN  l_contract_csr(p_chr_id);
776          FETCH l_contract_csr INTO l_k_end_date;
777          CLOSE l_contract_csr;
778 
779          IF l_k_end_date <= l_trx_date THEN
780             RETURN 0;
781          END IF;
782       END IF;
783 
784     ----------
785 
786        -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
787        --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
788        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
789 
790     -- rmunjulu 4042892
791     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
792       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
793 	  LOOP
794         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
795           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
796 		  l_discount_incl_terminated := TRUE;
797         END IF;
798       END LOOP;
799     END IF;
800            -- rmunjulu 4042892
801        IF l_discount_incl_terminated THEN
802          OPEN residual_csr_incl_terminated( p_chr_id, p_line_id );
803          FETCH residual_csr_incl_terminated INTO residual_rec;
804          IF( residual_csr_incl_terminated%NOTFOUND ) THEN
805              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
806          END IF;
807          CLOSE residual_csr_incl_terminated;
808     ELSE
809          OPEN residual_csr( p_chr_id, p_line_id );
810          FETCH residual_csr INTO residual_rec;
811          IF( residual_csr%NOTFOUND ) THEN
812              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
813          END IF;
814          CLOSE residual_csr;
815     END IF;
816 
817      -- BUG 7439724 -- evaluate l_oec only for asset line
818      --because l_oec will return null for fee and service lines
819    IF residual_rec.lty_code = 'FREE_FORM1' THEN
820      IF ( residual_rec.Value <> 0 ) THEN
821         l_residual_value := residual_rec.Value;
822       ELSE
823         l_oec := line_oec( p_chr_id, p_line_id );
824         IF ( l_oec IS NULL ) THEN
825           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
826         END IF;
827         l_residual_value := residual_rec.Percent * l_oec / 100.00;
828       END IF;
829    END IF; --BUG 7439724
830      -- Start : Bug 6030917 : prasjain
831      IF nvl(l_proration_factor,1) <> 1 THEN
832        l_residual_value := l_residual_value * l_proration_factor;
833      END IF;
834      -- End : Bug 6030917 : prasjain
835 
836       RETURN l_residual_value;
837 
838     EXCEPTION
839     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
840         IF residual_csr%ISOPEN THEN
841            CLOSE residual_csr;
842         END IF;
843 
844         IF l_contract_csr%ISOPEN THEN
845            CLOSE l_contract_csr;
846         END IF;
847 
848         RETURN NULL;
849     -- SECHAWLA 02-FEB-05 4141411 : Added unexpected error exception handling block
850     WHEN Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR THEN
851         IF residual_csr%ISOPEN THEN
852            CLOSE residual_csr;
853         END IF;
854 
855         IF l_contract_csr%ISOPEN THEN
856            CLOSE l_contract_csr;
857         END IF;
858 
859         RETURN NULL;
860     WHEN OTHERS THEN
861         IF residual_csr%ISOPEN THEN
862            CLOSE residual_csr;
863         END IF;
864 
865         IF l_contract_csr%ISOPEN THEN
866            CLOSE l_contract_csr;
867         END IF;
868 
869         Okl_Api.SET_MESSAGE(
870                         p_app_name     => G_APP_NAME,
871                         p_msg_name     => G_UNEXPECTED_ERROR,
872                         p_token1       => G_SQLCODE_TOKEN,
873                         p_token1_value => SQLCODE,
874                         p_token2       => G_SQLERRM_TOKEN,
875                         p_token2_value => SQLERRM);
876         RETURN NULL;
877 
878 
879   END line_residual_value;
880 
881 ----------------------------------------------------------------------------------------------------
882 
883     -- Start of Comments
884     -- Created By:       Santhosh Siruvole (ssiruvol)
885     -- Function Name  contract_residualvalue
886     -- Description:   returns the sum of residual_value of all financial asset lines of a contract.
887     -- Dependencies:
888     -- Parameters: contract id.
889     -- Version: 1.0
890     -- End of Commnets
891 
892 ----------------------------------------------------------------------------------------------------
893   FUNCTION contract_residual_value(
894             p_chr_id          IN  NUMBER,
895             p_line_id         IN  NUMBER) RETURN NUMBER  IS
896 
897     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_RESIDUAL_VALUE';
898     l_api_version	CONSTANT NUMBER	      := 1;
899     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
900     x_msg_count         NUMBER;
901     x_msg_data          VARCHAR2(256);
902 
903     l_residual_value NUMBER := 0.0;
904     l_lne_res_value  NUMBER := 0.0;
905 
906     CURSOR lines_csr( chrId NUMBER ) IS
907     SELECT kle.id lineId
908     FROM OKC_LINE_STYLES_B LS,
909 	 okl_K_lines_full_v kle,
910 	 okc_statuses_b sts
911     WHERE LS.ID = KLE.LSE_ID
912          AND LS.LTY_CODE ='FREE_FORM1'
913          AND KLE.DNZ_CHR_ID = chrId
914 	 AND kle.sts_code = sts.code
915 	 AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
916 
917     --Bug# 15992711 , Start
918     -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
919     CURSOR lines_nr_csr( chrId NUMBER, p_line_type VARCHAR2 ) IS
920     SELECT kle.id lineId
921     FROM OKC_LINE_STYLES_B LS,
922      okl_K_lines_full_v kle,
923      okc_statuses_b sts
924     WHERE LS.ID = KLE.LSE_ID
925          AND LS.LTY_CODE ='FREE_FORM1'
926          AND KLE.DNZ_CHR_ID = chrId
927      AND kle.sts_code = sts.code
928      AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
929      AND NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
930 
931     l_line_type VARCHAR2(30) := 'X';
932     --Bug# 15992711 , End
933 
934     line_rec lines_csr%ROWTYPE;
935 
936   BEGIN
937 
938        IF ( p_chr_id IS NULL ) THEN
939            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
940        END IF;
941 
942        --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
943        --                If set then based on its value set l_line_type
944 
945        IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
946           FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
947           LOOP
948              IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
949                 IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
950                    l_line_type := 'NEW'; --New
951                 ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
952                    l_line_type := 'RELEASE'; --Release
953                 END IF;
954              END IF;
955 
956           END LOOP;
957        END IF;
958 
959        -- If l_line_type is set as either 'NEW' or 'RELEASE' call
960        -- lines_nr_csr cursor in order to consider either only new
961        -- assets or only re-leased assets, else no change in the standard behavior
962 
963        IF l_line_type IN ('NEW','RELEASE') THEN
964 
965            FOR line_nr_rec IN lines_nr_csr( p_chr_id, l_line_type )
966            LOOP
967                IF( lines_nr_csr%NOTFOUND ) THEN
968                    RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
969                END IF;
970                l_lne_res_value := line_residual_value( p_chr_id, line_nr_rec.lineId );
971                IF ( l_lne_res_value IS NULL ) THEN
972                    RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
973                END IF;
974                l_residual_value := l_residual_value + l_lne_res_value;
975            END LOOP;
976 
977        ELSE
978        --Bug# 15992711 , End
979 
980 	       FOR line_rec IN lines_csr( p_chr_id )
981            LOOP
982                IF( lines_csr%NOTFOUND ) THEN
983                    RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
984                END IF;
985                l_lne_res_value := line_residual_value( p_chr_id, line_rec.lineId );
986                IF ( l_lne_res_value IS NULL ) THEN
987                    RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
988                END IF;
989                l_residual_value := l_residual_value + l_lne_res_value;
990            END LOOP;
991 
992        --Bug# 15992711 , Start
993        END IF;
994        --Bug# 15992711 , End
995 
996       RETURN l_residual_value;
997 
998     EXCEPTION
999 
1000 	WHEN OTHERS THEN
1001                Okl_Api.SET_MESSAGE(
1002                         p_app_name     => G_APP_NAME,
1003                         p_msg_name     => G_UNEXPECTED_ERROR,
1004                         p_token1       => G_SQLCODE_TOKEN,
1005                         p_token1_value => SQLCODE,
1006                         p_token2       => G_SQLERRM_TOKEN,
1007                         p_token2_value => SQLERRM);
1008                 RETURN NULL;
1009 
1010   END contract_residual_value;
1011 
1012 
1013 ----------------------------------------------------------------------------------------------------
1014 
1015     -- Start of Comments
1016     -- Created By:       Santhosh Siruvole (ssiruvol)
1017     -- Function Name  contract_oec
1018     -- Description:   returns the OEC of a contract.
1019     -- Dependencies:
1020     -- Parameters: contract id.
1021     -- Version: 1.0
1022     -- End of Commnets
1023 
1024 ----------------------------------------------------------------------------------------------------
1025   FUNCTION contract_oec(
1026             p_chr_id          IN  NUMBER,
1027             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1028 
1029     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_OEC';
1030     l_api_version	CONSTANT NUMBER	      := 1;
1031     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1032     x_msg_count         NUMBER;
1033     x_msg_data          VARCHAR2(256);
1034 
1035   BEGIN
1036       IF ( p_line_id IS NULL ) THEN
1037           RETURN line_oec( p_chr_id, NULL);
1038       ELSE
1039           RETURN line_oec( p_chr_id, p_line_id);
1040       END IF;
1041   END;
1042 
1043 --Bug# 3638568 : This formula modified to conditionally include terminated lines
1044 -----------------------------------------------------------------------------------
1045 -- Start of Commnets
1046 -- Badrinath Kuchibholta
1047 
1048 -- Procedure Name       : FUNCTION_oec_calc
1049 -- Description          : FUNCTION_oec_calc
1050 -- Business Rules       :
1051 -- Parameters           :
1052 -- Version              : 1.0
1053 -- End of Commnets
1054 
1055   FUNCTION  line_oec(p_dnz_chr_id IN  OKC_K_LINES_V.DNZ_CHR_ID%TYPE,
1056                      --p_cle_id     IN  OKC_K_LINES_V.CLE_ID%TYPE DEFAULT Okl_Api.G_MISS_NUM)
1057                      p_cle_id     IN  OKC_K_LINES_V.CLE_ID%TYPE )
1058   RETURN NUMBER IS
1059     G_APP_NAME                   CONSTANT  VARCHAR2(3)   :=  Okl_Api.G_APP_NAME;
1060     G_PKG_NAME                   CONSTANT  VARCHAR2(200) := 'OKL_FORMULA_PVT';
1061     G_UNEXPECTED_ERROR           CONSTANT  VARCHAR2(200) := 'OKL_UNEXPECTED_ERROR';
1062     G_COL_NAME_TOKEN             CONSTANT  VARCHAR2(200) := Okl_Api.G_COL_NAME_TOKEN;
1063     G_SQLERRM_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLerrm';
1064     G_SQLCODE_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLcode';
1065     G_REQUIRED_VALUE             CONSTANT  VARCHAR2(200) := 'OKL_REQUIRED_VALUE';
1066     G_NO_MATCHING_RECORD         CONSTANT  VARCHAR2(200) := 'OKL_LLA_NO_MATCHING_RECORD';
1067     G_LINE_RECORD                CONSTANT  VARCHAR2(200) := 'OKL_LLA_LINE_RECORD';
1068     G_INVALID_CRITERIA           CONSTANT  VARCHAR2(200) := 'OKL_LLA_INVALID_CRITERIA';
1069     G_EXCEPTION_HALT_VALIDATION            EXCEPTION;
1070     G_EXCEPTION_STOP_VALIDATION            EXCEPTION;
1071     G_FIN_LINE_LTY_CODE                    OKC_LINE_STYLES_V.LTY_CODE%TYPE := 'FREE_FORM1';
1072     G_MODEL_LINE_LTY_CODE                  OKC_LINE_STYLES_V.LTY_CODE%TYPE := 'ITEM';
1073     G_ADDON_LINE_LTY_CODE                  OKC_LINE_STYLES_V.LTY_CODE%TYPE := 'ADD_ITEM';
1074     G_LEASE_SCS_CODE                       OKC_K_HEADERS_V.SCS_CODE%TYPE := 'LEASE';
1075     G_LOAN_SCS_CODE                        OKC_K_HEADERS_V.SCS_CODE%TYPE := 'LOAN';
1076     l_return_status                        VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
1077     l_api_name                   CONSTANT  VARCHAR2(30)  := 'FUNCTION_OEC_CALC';
1078     ln_contract_oec                        OKL_K_LINES_V.OEC%TYPE := 0;
1079     lv_lty_code                            OKC_LINE_STYLES_V.LTY_CODE%TYPE;
1080     ln_model_line_oec                      OKL_K_LINES_V.OEC%TYPE := 0;
1081     ln_addon_line_oec                      OKL_K_LINES_V.OEC%TYPE := 0;
1082     ln_total_line_oec                      OKL_K_LINES_V.OEC%TYPE := 0;
1083         l_capred_incl_terminated BOOLEAN := FALSE;
1084     -- Cursor to get the lty_code
1085     CURSOR get_lty_code(p_cle_id IN OKC_K_LINES_V.ID%TYPE) IS
1086     SELECT lse.lty_code
1087     FROM okc_k_lines_b cle,
1088          okc_line_styles_b lse
1089     WHERE cle.id = p_cle_id
1090     AND cle.lse_id = lse.id;
1091     -- Cursor to sum up oec for contract
1092     CURSOR c_contract_oec_calc(p_dnz_chr_id   OKC_K_HEADERS_V.ID%TYPE) IS
1093     SELECT SUM(kle.oec) oec
1094     FROM OKL_K_LINES_V kle,
1095          OKC_K_LINES_V cle,
1096          OKC_K_HEADERS_V CHR
1097     WHERE CHR.id = p_dnz_chr_id
1098     AND CHR.id = cle.dnz_chr_id
1099     AND cle.sts_code NOT IN ( 'ABANDONED', 'TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
1100     AND cle.id = kle.id;
1101 
1102     CURSOR c_contract_oec_calc_incl_term(p_dnz_chr_id   OKC_K_HEADERS_V.ID%TYPE) IS
1103     SELECT SUM(kle.oec) oec
1104     FROM OKL_K_LINES_V kle,
1105          OKC_K_LINES_V cle,
1106          OKC_K_HEADERS_V CHR
1107     WHERE CHR.id = p_dnz_chr_id
1108     AND CHR.id = cle.dnz_chr_id
1109     AND cle.sts_code NOT IN ( 'ABANDONED', 'EXPIRED', 'CANCELLED', 'HOLD')
1110     AND cle.id = kle.id;
1111     -- Cursor to sum up oec for given model line
1112     CURSOR c_model_oec_calc(p_top_cle_id OKC_K_LINES_V.CLE_ID%TYPE,
1113                             p_dnz_chr_id OKC_K_LINES_V.DNZ_CHR_ID%TYPE) IS
1114     SELECT SUM(cle.price_unit * cim.number_of_items) oec
1115     FROM okc_subclass_top_line stl,
1116          okc_line_styles_b lse2,
1117          okc_line_styles_b lse1,
1118          okc_k_items_v cim,
1119          okc_k_lines_v cle
1120     WHERE cle.cle_id = p_top_cle_id
1121     AND cle.dnz_chr_id = p_dnz_chr_id
1122     AND cle.id = cim.cle_id
1123     AND cle.dnz_chr_id = cim.dnz_chr_id
1124     AND cle.lse_id = lse1.id
1125     AND lse1.lty_code = G_MODEL_LINE_LTY_CODE
1126     AND lse1.lse_parent_id = lse2.id
1127     AND lse2.lty_code = G_FIN_LINE_LTY_CODE
1128     AND lse2.id = stl.lse_id
1129     AND stl.scs_code IN (G_LEASE_SCS_CODE,G_LOAN_SCS_CODE);
1130     -- Cursor to sum up oec of addon line for a given top line
1131     CURSOR c_addon_oec_calc(p_top_cle_id OKC_K_LINES_V.CLE_ID%TYPE,
1132                             p_dnz_chr_id OKC_K_LINES_V.DNZ_CHR_ID%TYPE) IS
1133     SELECT SUM(cle.price_unit* cim.number_of_items) oec
1134     FROM okc_subclass_top_line stl,
1135          okc_line_styles_b lse3,
1136          okc_line_styles_b lse2,
1137          okc_line_styles_b lse1,
1138          okc_k_items_v cim,
1139          okc_k_lines_b cle
1140     WHERE cle.dnz_chr_id = p_dnz_chr_id
1141     AND cle.dnz_chr_id = cim.dnz_chr_id
1142     AND cle.id = cim.cle_id
1143     AND cle.lse_id = lse1.id
1144     AND lse1.lty_code = G_ADDON_LINE_LTY_CODE
1145     AND lse1.lse_parent_id = lse2.id
1146     AND lse2.lty_code = G_MODEL_LINE_LTY_CODE
1147     AND lse2.lse_parent_id = lse3.id
1148     AND lse3.lty_code = G_FIN_LINE_LTY_CODE
1149     AND lse3.id = stl.lse_id
1150     AND stl.scs_code IN (G_LEASE_SCS_CODE,G_LOAN_SCS_CODE)
1151     --AND cle.cle_id IN (SELECT cle.id
1152     AND exists (SELECT 1   --cle.id
1153                        FROM okc_subclass_top_line stlx,
1154                             okc_line_styles_b lse2x,
1155                             okc_line_styles_b lse1x,
1156                             okc_k_lines_b clex
1157                        WHERE clex.cle_id = p_top_cle_id
1158                        AND clex.dnz_chr_id = p_dnz_chr_id
1159 
1160                        AND clex.lse_id = lse1x.id
1161                        AND lse1x.lty_code = G_MODEL_LINE_LTY_CODE
1162                        AND lse1x.lse_parent_id = lse2x.id
1163                        AND lse2x.lty_code = G_FIN_LINE_LTY_CODE
1164                        AND lse2x.id = stlx.lse_id
1165                        AND stlx.scs_code IN (G_LEASE_SCS_CODE,G_LOAN_SCS_CODE)
1166                        AND clex.id = cle.cle_id);
1167 
1168   --Bug 4631549
1169   --cursor to find if this is a re-lease contract
1170   Cursor l_chrb_csr (p_chr_id in number) is
1171   SELECT chrb.orig_system_source_code
1172   FROM   okc_k_headers_b chrb
1173   where  chrb.id = p_chr_id;
1174 
1175   l_chrb_rec l_chrb_csr%ROWTYPE;
1176 
1177   --cursor to get expected asset value for contract
1178   cursor l_chr_expcost_trmn_csr(p_chr_id in number) is
1179   SELECT SUM(kle.expected_asset_cost) expected_asset_cost
1180   FROM   OKL_K_LINES kle,
1181          OKC_K_LINES_B cleb
1182   WHERE  kle.id = cleb.id
1183   AND    cleb.dnz_chr_id = p_chr_id
1184   AND    cleb.lse_id     = 33
1185   AND    cleb.sts_code NOT IN ( 'ABANDONED', 'EXPIRED', 'CANCELLED', 'HOLD');
1186 
1187   cursor l_chr_expcost_csr(p_chr_id in number) is
1188   SELECT SUM(kle.expected_asset_cost) expected_asset_cost
1189   FROM   OKL_K_LINES kle,
1190          OKC_K_LINES_B cleb
1191   WHERE  kle.id = cleb.id
1192   AND    cleb.dnz_chr_id = p_chr_id
1193   AND    cleb.lse_id     = 33
1194   AND    cleb.sts_code NOT IN ( 'ABANDONED', 'TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1195 
1196 
1197   --cursor to get expected asset value for asset
1198   cursor l_cle_expcost_csr (p_cle_id in number) is
1199   Select nvl(kle.expected_asset_cost,0) expected_asset_cost
1200   from   okl_k_lines kle
1201   where  kle.id  = p_cle_id;
1202 
1203   --Bug# 15992711 , Start
1204   -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
1205     CURSOR c_nr_con_oec_calc_incl_term(p_dnz_chr_id   OKC_K_HEADERS_V.ID%TYPE,
1206                                        p_line_type VARCHAR2) IS
1207     SELECT SUM(kle.oec) oec
1208     FROM OKL_K_LINES_V kle,
1209          OKC_K_LINES_V cle,
1210          OKC_K_HEADERS_V CHR
1211     WHERE CHR.id = p_dnz_chr_id
1212     AND CHR.id = cle.dnz_chr_id
1213     AND cle.sts_code NOT IN ( 'ABANDONED', 'EXPIRED', 'CANCELLED', 'HOLD')
1214     AND cle.id = kle.id
1215     AND   NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
1216 
1217 
1218     CURSOR c_nr_contract_oec_calc(p_dnz_chr_id   OKC_K_HEADERS_V.ID%TYPE,
1219                                   p_line_type VARCHAR2) IS
1220     SELECT SUM(kle.oec) oec
1221     FROM OKL_K_LINES_V kle,
1222          OKC_K_LINES_V cle,
1223          OKC_K_HEADERS_V CHR
1224     WHERE CHR.id = p_dnz_chr_id
1225     AND CHR.id = cle.dnz_chr_id
1226     AND cle.sts_code NOT IN ( 'ABANDONED', 'TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
1227     AND cle.id = kle.id
1228     AND   NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
1229 
1230     /*
1231     CURSOR c_nr_model_oec_calc(p_top_cle_id OKC_K_LINES_V.CLE_ID%TYPE,
1232                             p_dnz_chr_id OKC_K_LINES_V.DNZ_CHR_ID%TYPE,
1233                             p_line_type VARCHAR2) IS
1234     SELECT SUM(cle.price_unit * cim.number_of_items) oec
1235     FROM okc_subclass_top_line stl,
1236          okc_line_styles_b lse2,
1237          okc_line_styles_b lse1,
1238          okc_k_items_v cim,
1239          okc_k_lines_v cle
1240     WHERE cle.cle_id = p_top_cle_id
1241     AND cle.dnz_chr_id = p_dnz_chr_id
1242     AND cle.id = cim.cle_id
1243     AND cle.dnz_chr_id = cim.dnz_chr_id
1244     AND cle.lse_id = lse1.id
1245     AND lse1.lty_code = G_MODEL_LINE_LTY_CODE
1246     AND lse1.lse_parent_id = lse2.id
1247     AND lse2.lty_code = G_FIN_LINE_LTY_CODE
1248     AND lse2.id = stl.lse_id
1249     AND stl.scs_code IN (G_LEASE_SCS_CODE,G_LOAN_SCS_CODE);
1250     */
1251 
1252     l_line_type VARCHAR2(30) := 'X';
1253     --Bug# 15992711 , End
1254 
1255 
1256 ----------------------------------------------------------------------------------------------------
1257   -- Start of Commnets
1258   -- Badrinath Kuchibholta
1259   -- Procedure Name       : validate_dnz_chr_id
1260   -- Description          : validation with OKC_K_LINES_V
1261   -- Business Rules       :
1262   -- Parameters           :
1263   -- Version              : 1.0
1264   -- End of Commnets
1265 
1266   PROCEDURE validate_dnz_chr_id(p_dnz_chr_id IN OKC_K_LINES_V.DNZ_CHR_ID%TYPE,
1267                                 x_return_status OUT NOCOPY VARCHAR2) IS
1268     ln_dummy      NUMBER := 0;
1269     CURSOR c_dnz_chr_id_validate(p_dnz_chr_id OKC_K_LINES_V.DNZ_CHR_ID%TYPE) IS
1270     SELECT 1
1271     --FROM DUAL
1272     --WHERE EXISTS (SELECT 1
1273                   FROM OKC_K_HEADERS_B CHR
1274                   WHERE CHR.id = p_dnz_chr_id; --);
1275   BEGIN
1276     -- initialize return status
1277     x_return_status := Okl_Api.G_RET_STS_SUCCESS;
1278     -- data is required
1279     IF (p_dnz_chr_id = Okl_Api.G_MISS_NUM) OR
1280        (p_dnz_chr_id IS NULL) THEN
1281        -- store SQL error message on message stack
1282       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1283                           p_msg_name     => G_REQUIRED_VALUE,
1284                           p_token1       => G_COL_NAME_TOKEN,
1285                           p_token1_value => 'P_DNZ_CHR_ID');
1286        -- halt validation as it is a required field
1287        RAISE G_EXCEPTION_STOP_VALIDATION;
1288     END IF;
1289     -- Enforce Foreign Key
1290     -- since we are creating a asset line
1291     -- we assume the cle_id will not null
1292     -- as the same is not top line and it will be sub line
1293     OPEN  c_dnz_chr_id_validate(p_dnz_chr_id);
1294     IF c_dnz_chr_id_validate%NOTFOUND THEN
1295       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1296                           p_msg_name     => G_NO_MATCHING_RECORD,
1297                           p_token1       => G_COL_NAME_TOKEN,
1298                           p_token1_value => 'P_DNZ_CHR_ID');
1299       -- halt validation as it has no parent record
1300       RAISE G_EXCEPTION_HALT_VALIDATION;
1301     END IF;
1302     FETCH c_dnz_chr_id_validate INTO ln_dummy;
1303     CLOSE c_dnz_chr_id_validate;
1304     IF (ln_dummy = 0) THEN
1305       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1306                           p_msg_name     => G_NO_MATCHING_RECORD,
1307                           p_token1       => G_COL_NAME_TOKEN,
1308                           p_token1_value => 'P_DNZ_CHR_ID');
1309        -- halt validation as it has no parent record
1310        RAISE G_EXCEPTION_HALT_VALIDATION;
1311     END IF;
1312   EXCEPTION
1313     WHEN G_EXCEPTION_STOP_VALIDATION THEN
1314     -- We are here since the field is required
1315     -- Notify Error
1316     x_return_status := Okl_Api.G_RET_STS_ERROR;
1317     WHEN G_EXCEPTION_HALT_VALIDATION THEN
1318      -- If the cursor is open then it has to be closed
1319      IF c_dnz_chr_id_validate%ISOPEN THEN
1320        CLOSE c_dnz_chr_id_validate;
1321      END IF;
1322     x_return_status := Okl_Api.G_RET_STS_ERROR;
1323     WHEN OTHERS THEN
1324     -- store SQL error message on message stack
1325     Okl_Api.SET_MESSAGE(p_app_name     => G_APP_NAME,
1326                         p_msg_name     => G_UNEXPECTED_ERROR,
1327                         p_token1       => G_SQLCODE_TOKEN,
1328                         p_token1_value => SQLCODE,
1329                         p_token2       => G_SQLERRM_TOKEN,
1330                         p_token2_value => SQLERRM);
1331     -- If the cursor is open then it has to be closed
1332     IF c_dnz_chr_id_validate%ISOPEN THEN
1333        CLOSE c_dnz_chr_id_validate;
1334     END IF;
1335     -- notify caller of an error as UNEXPETED error
1336     x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
1337   END validate_dnz_chr_id;
1338 ----------------------------------------------------------------------------------------------------
1339   BEGIN
1340     -- We need to validate the dnz_chr_id first
1341     -- We are taking care of the validating p_cle_id via cursor we use for calculations of oec
1342     validate_dnz_chr_id(p_dnz_chr_id    => p_dnz_chr_id,
1343                         x_return_status => l_return_status);
1344     IF (l_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
1345       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1346     ELSIF (l_return_status = Okl_Api.G_RET_STS_ERROR) THEN
1347       RAISE Okl_Api.G_EXCEPTION_ERROR;
1348     END IF;
1349 
1350     --Bug# 4631549
1351     --Find out if re-lease contract
1352     open l_chrb_csr(p_chr_id => p_dnz_chr_id);
1353     fetch l_chrb_csr into l_chrb_rec;
1354     close l_chrb_csr;
1355     --Bug# 4631549
1356 
1357         --Check whether terminated lines should be included
1358        -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1359        --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1360          -- AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1361                   --l_capred_incl_terminated := TRUE;
1362            --END IF;
1363 
1364            -- rmunjulu 4042892
1365     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1366       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1367 	  LOOP
1368         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1369           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1370 		  l_capred_incl_terminated := TRUE;
1371 
1372         --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
1373         --                If set then based on its value set l_line_type
1374         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
1375            IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
1376               l_line_type := 'NEW'; --New
1377            ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
1378               l_line_type := 'RELEASE'; --Release
1379            END IF;
1380         --Bug# 15992711 , End
1381 
1382         END IF;
1383       END LOOP;
1384     END IF;
1385 
1386     -- Now we start calculations of the OEC
1387     IF (p_dnz_chr_id IS NOT NULL OR
1388        p_dnz_chr_id <> Okl_Api.G_MISS_NUM) AND
1389       (p_cle_id IS NULL OR
1390        p_cle_id = Okl_Api.G_MISS_NUM) THEN
1391       -- To get the OEC of the contract
1392 
1393           --Bug# 4631549 :
1394           If nvl(l_chrb_rec.orig_system_source_code,okl_api.g_miss_char) = 'OKL_RELEASE' Then
1395              If l_capred_incl_terminated = TRUE Then
1396                 OPEN l_chr_expcost_trmn_csr (p_chr_id => p_dnz_chr_id);
1397                 FETCH l_chr_expcost_trmn_csr into ln_contract_oec;
1398                 If l_chr_expcost_trmn_csr%NOTFOUND then
1399                     Okl_Api.set_message(p_app_name     => G_APP_NAME,
1400                                p_msg_name     => G_NO_MATCHING_RECORD,
1401                                p_token1       => G_COL_NAME_TOKEN,
1402                                p_token1_value => 'p_dnz_chr_id');
1403                     RAISE Okl_Api.G_EXCEPTION_ERROR;
1404                 End If;
1405                 Close l_chr_expcost_trmn_csr;
1406              Else
1407                 OPEN l_chr_expcost_csr (p_chr_id => p_dnz_chr_id);
1408                 FETCH l_chr_expcost_csr into ln_contract_oec;
1409                 If l_chr_expcost_csr%NOTFOUND then
1410                     Okl_Api.set_message(p_app_name     => G_APP_NAME,
1411                                p_msg_name     => G_NO_MATCHING_RECORD,
1412                                p_token1       => G_COL_NAME_TOKEN,
1413                                p_token1_value => 'p_dnz_chr_id');
1414                     RAISE Okl_Api.G_EXCEPTION_ERROR;
1415                 End If;
1416                 Close l_chr_expcost_csr;
1417              End If;
1418           Else
1419              --Bug# 15992711 , Start
1420              -- If l_line_type is set as either 'NEW' or 'RELEASE' call
1421              -- get_unearn_rev_nr_csr cursor in order to consider either only new
1422              -- assets or only re-leased assets, else no change in the standard behavior
1423 
1424              IF l_line_type IN ('NEW','RELEASE') THEN
1425 
1426                 IF l_capred_incl_terminated = TRUE THEN
1427 
1428                 OPEN  c_nr_con_oec_calc_incl_term(p_dnz_chr_id => p_dnz_chr_id, p_line_type => l_line_type);
1429                    IF c_nr_con_oec_calc_incl_term%NOTFOUND THEN
1430                       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1431                                           p_msg_name     => G_NO_MATCHING_RECORD,
1432                                           p_token1       => G_COL_NAME_TOKEN,
1433                                           p_token1_value => 'p_dnz_chr_id');
1434                       RAISE Okl_Api.G_EXCEPTION_ERROR;
1435                    END IF;
1436                    FETCH c_nr_con_oec_calc_incl_term INTO ln_contract_oec;
1437                    CLOSE c_nr_con_oec_calc_incl_term;
1438                 ELSE
1439                    OPEN  c_nr_contract_oec_calc(p_dnz_chr_id => p_dnz_chr_id, p_line_type => l_line_type);
1440                    IF c_nr_contract_oec_calc%NOTFOUND THEN
1441                       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1442                                           p_msg_name     => G_NO_MATCHING_RECORD,
1443                                           p_token1       => G_COL_NAME_TOKEN,
1444                                           p_token1_value => 'p_dnz_chr_id');
1445                       RAISE Okl_Api.G_EXCEPTION_ERROR;
1446                    END IF;
1447                    FETCH c_nr_contract_oec_calc INTO ln_contract_oec;
1448                    CLOSE c_nr_contract_oec_calc;
1449                 END IF;
1450              --Bug# 15992711 , End
1451 
1452 			 --End Bug 4631549
1453              --Bug# 15992711 , Start
1454              --IF l_capred_incl_terminated = TRUE THEN
1455              ELSIF l_capred_incl_terminated = TRUE THEN
1456              --Bug# 15992711 , End
1457 
1458                 OPEN  c_contract_oec_calc_incl_term(p_dnz_chr_id => p_dnz_chr_id);
1459                 IF c_contract_oec_calc_incl_term%NOTFOUND THEN
1460                    Okl_Api.set_message(p_app_name     => G_APP_NAME,
1461                                        p_msg_name     => G_NO_MATCHING_RECORD,
1462                                        p_token1       => G_COL_NAME_TOKEN,
1463                                        p_token1_value => 'p_dnz_chr_id');
1464                    RAISE Okl_Api.G_EXCEPTION_ERROR;
1465                 END IF;
1466                 FETCH c_contract_oec_calc_incl_term INTO ln_contract_oec;
1467                 CLOSE c_contract_oec_calc_incl_term;
1468              ELSE
1469                 OPEN  c_contract_oec_calc(p_dnz_chr_id => p_dnz_chr_id);
1470                 IF c_contract_oec_calc%NOTFOUND THEN
1471                    Okl_Api.set_message(p_app_name     => G_APP_NAME,
1472                                        p_msg_name     => G_NO_MATCHING_RECORD,
1473                                        p_token1       => G_COL_NAME_TOKEN,
1474                                        p_token1_value => 'p_dnz_chr_id');
1475                    RAISE Okl_Api.G_EXCEPTION_ERROR;
1476                 END IF;
1477                 FETCH c_contract_oec_calc INTO ln_contract_oec;
1478                 CLOSE c_contract_oec_calc;
1479              END IF;
1480           End If; -- Bug# 4631549
1481       -- Final Total Contract OEC
1482       ln_contract_oec := NVL(ln_contract_oec,0);
1483       RETURN(ln_contract_oec);
1484     ELSIF (p_dnz_chr_id IS NOT NULL OR
1485        p_dnz_chr_id <> Okl_Api.G_MISS_NUM) AND
1486       (p_cle_id IS NOT NULL OR
1487        p_cle_id <> Okl_Api.G_MISS_NUM) THEN
1488       -- To get the Line Style Code
1489       OPEN  get_lty_code(p_cle_id => p_cle_id);
1490       IF get_lty_code%NOTFOUND THEN
1491         Okl_Api.set_message(p_app_name     => G_APP_NAME,
1492                             p_msg_name     => G_NO_MATCHING_RECORD,
1493                             p_token1       => G_COL_NAME_TOKEN,
1494                             p_token1_value => 'Financial Asset Line');
1495         RAISE Okl_Api.G_EXCEPTION_ERROR;
1496       END IF;
1497       FETCH get_lty_code INTO lv_lty_code;
1498       CLOSE get_lty_code;
1499       IF lv_lty_code = G_FIN_LINE_LTY_CODE THEN
1500         --Bug# 4631549
1501         If l_chrb_rec.orig_system_source_code = 'OKL_RELEASE' then
1502            Open l_cle_expcost_csr (p_cle_id => p_cle_id);
1503            Fetch l_cle_expcost_csr into ln_total_line_oec;
1504            If l_cle_expcost_csr%NOTFOUND Then
1505                Okl_Api.set_message(p_app_name     => G_APP_NAME,
1506                                    p_msg_name     => G_NO_MATCHING_RECORD,
1507                                    p_token1       => G_COL_NAME_TOKEN,
1508                                    p_token1_value => 'Financial Asset Line');
1509                RAISE Okl_Api.G_EXCEPTION_ERROR;
1510            End If;
1511            Close l_cle_expcost_csr;
1512            ln_total_line_oec := nvl(ln_total_line_oec,0);
1513         Else --Bug# 4631549 end
1514            -- To get the OEC of the model Line
1515            OPEN c_model_oec_calc(p_top_cle_id => p_cle_id,
1516                                  p_dnz_chr_id => p_dnz_chr_id);
1517            IF c_model_oec_calc%NOTFOUND THEN
1518                Okl_Api.set_message(p_app_name     => G_APP_NAME,
1519                                    p_msg_name     => G_NO_MATCHING_RECORD,
1520                                    p_token1       => G_COL_NAME_TOKEN,
1521                                    p_token1_value => 'Model Line');
1522                RAISE Okl_Api.G_EXCEPTION_ERROR;
1523            END IF;
1524            FETCH c_model_oec_calc INTO ln_model_line_oec;
1525            CLOSE c_model_oec_calc;
1526            -- To get the OEC of the Addon line
1527 -- DJANASWA change begin 11/12/08
1528 /*        OPEN c_addon_oec_calc(p_top_cle_id => p_cle_id,
1529                               p_dnz_chr_id => p_dnz_chr_id);
1530         FETCH c_addon_oec_calc INTO ln_addon_line_oec;
1531         CLOSE c_addon_oec_calc;
1532 */
1533            ln_addon_line_oec := Okl_Seeded_Functions_Pvt.total_asset_addon_cost(
1534                                  p_contract_id => p_dnz_chr_id, p_contract_line_id => p_cle_id);
1535 -- DJANASWA change end 11/12/08
1536 
1537            ln_total_line_oec := NVL(ln_model_line_oec,0) + NVL(ln_addon_line_oec,0);
1538         End If; --Bug# 4631549
1539       ELSE
1540         Okl_Api.set_message(p_app_name     => G_APP_NAME,
1541                             p_msg_name     => G_LINE_RECORD);
1542         RAISE Okl_Api.G_EXCEPTION_ERROR;
1543       END IF;
1544       RETURN(ln_total_line_oec);
1545     ELSE
1546       Okl_Api.set_message(p_app_name     => G_APP_NAME,
1547                           p_msg_name     => G_INVALID_CRITERIA);
1548       RAISE Okl_Api.G_EXCEPTION_ERROR;
1549     END IF;
1550   EXCEPTION
1551     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
1552     -- If the cursor is open then it has to be closed
1553     IF get_lty_code%ISOPEN THEN
1554        CLOSE get_lty_code;
1555     END IF;
1556     IF c_contract_oec_calc%ISOPEN THEN
1557        CLOSE c_contract_oec_calc;
1558     END IF;
1559     IF c_contract_oec_calc_incl_term%ISOPEN THEN
1560        CLOSE c_contract_oec_calc_incl_term;
1561     END IF;
1562     IF c_model_oec_calc%ISOPEN THEN
1563        CLOSE c_model_oec_calc;
1564     END IF;
1565     IF c_addon_oec_calc%ISOPEN THEN
1566        CLOSE c_addon_oec_calc;
1567     END IF;
1568     RETURN(0);
1569     WHEN Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR THEN
1570     -- If the cursor is open then it has to be closed
1571     IF get_lty_code%ISOPEN THEN
1572        CLOSE get_lty_code;
1573     END IF;
1574     IF c_contract_oec_calc%ISOPEN THEN
1575        CLOSE c_contract_oec_calc;
1576     END IF;
1577     IF c_contract_oec_calc_incl_term%ISOPEN THEN
1578        CLOSE c_contract_oec_calc_incl_term;
1579     END IF;
1580     IF c_model_oec_calc%ISOPEN THEN
1581        CLOSE c_model_oec_calc;
1582     END IF;
1583     IF c_addon_oec_calc%ISOPEN THEN
1584        CLOSE c_addon_oec_calc;
1585     END IF;
1586     RETURN(0);
1587     WHEN OTHERS THEN
1588 
1589     -- If the cursor is open then it has to be closed
1590     IF get_lty_code%ISOPEN THEN
1591        CLOSE get_lty_code;
1592     END IF;
1593     IF c_contract_oec_calc%ISOPEN THEN
1594        CLOSE c_contract_oec_calc;
1595     END IF;
1596     IF c_contract_oec_calc_incl_term%ISOPEN THEN
1597        CLOSE c_contract_oec_calc_incl_term;
1598     END IF;
1599     IF c_model_oec_calc%ISOPEN THEN
1600        CLOSE c_model_oec_calc;
1601     END IF;
1602     IF c_addon_oec_calc%ISOPEN THEN
1603        CLOSE c_addon_oec_calc;
1604     END IF;
1605     RETURN(0);
1606   END line_oec;
1607 
1608 --Bug# 3638568 : This formula modified to conditionally include terminated lines
1609 ----------------------------------------------------------------------------------------------------
1610 
1611     -- Start of Comments
1612     -- Created By:       Santhosh Siruvole (ssiruvol)
1613     -- Function Name  contract_tradein
1614     -- Description:   returns the sum of tradein values of all financial asset lines of a contract.
1615     -- Dependencies:
1616     -- Parameters: contract id.
1617     -- Version: 1.0
1618     -- End of Commnets
1619 
1620 ----------------------------------------------------------------------------------------------------
1621   FUNCTION contract_tradein(
1622             p_chr_id          IN  NUMBER,
1623             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1624 
1625     l_api_name          CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_TRADEIN_VALUE';
1626     l_api_version       CONSTANT NUMBER       := 1;
1627     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1628     x_msg_count         NUMBER;
1629     x_msg_data          VARCHAR2(256);
1630 
1631     l_tradeIn_value NUMBER := 0;
1632 
1633     l_discount_incl_terminated BOOLEAN := FALSE;
1634 
1635     --Bug# 15992711 , Start
1636     l_line_type VARCHAR2(30) := 'X';
1637     --Bug# 15992711 , End
1638 
1639 
1640   BEGIN
1641 
1642        IF ( p_chr_id IS NULL ) THEN
1643            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1644        END IF;
1645 
1646            -- rmunjulu 4042892
1647     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1648       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1649 	  LOOP
1650         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1651           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1652 		  l_discount_incl_terminated := TRUE;
1653 
1654         --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
1655         --                If set then based on its value set l_line_type
1656         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
1657           IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
1658             l_line_type := 'NEW'; --New
1659           ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
1660             l_line_type := 'RELEASE'; --Release
1661           END IF;
1662         --Bug# 15992711 , End
1663 
1664         END IF;
1665       END LOOP;
1666     END IF;
1667 
1668 
1669     --Bug# 15992711 , Start
1670     -- If l_line_type is set as either 'NEW' or 'RELEASE'
1671     -- based on the value of l_line_type query will consider either only new
1672     -- assets or only re-leased assets, else no change in the standard behavior
1673 
1674     IF l_line_type IN ('NEW','RELEASE') THEN
1675 
1676       IF l_discount_incl_terminated THEN
1677         SELECT NVL(SUM(kle.tradein_amount),0) INTO l_tradeIn_value
1678         FROM OKC_LINE_STYLES_B LS,
1679              okl_K_lines_full_v kle,
1680              okc_statuses_b sts
1681         WHERE LS.ID = KLE.LSE_ID
1682              AND LS.LTY_CODE ='FREE_FORM1'
1683              AND KLE.dnz_chr_iD = p_chr_id
1684              AND kle.sts_code = sts.code
1685              AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD')
1686              AND NVL(kle.re_lease_yn,'N') = DECODE(l_line_type,'NEW','N','RELEASE','Y');
1687 
1688       ELSE
1689 
1690         SELECT NVL(SUM(kle.tradein_amount),0) INTO l_tradeIn_value
1691         FROM OKC_LINE_STYLES_B LS,
1692              okl_K_lines_full_v kle,
1693              okc_statuses_b sts
1694         WHERE LS.ID = KLE.LSE_ID
1695              AND LS.LTY_CODE ='FREE_FORM1'
1696              AND KLE.dnz_chr_iD = p_chr_id
1697              AND kle.sts_code = sts.code
1698              AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
1699              AND NVL(kle.re_lease_yn,'N') = DECODE(l_line_type,'NEW','N','RELEASE','Y');
1700       END IF;
1701     --Bug# 15992711 , End
1702 
1703 
1704     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
1705       -- AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1706       -- AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1707            -- rmunjulu 4042892
1708 
1709 
1710     --Bug# 15992711 , Start
1711     --IF l_discount_incl_terminated THEN
1712     ELSIF l_discount_incl_terminated THEN
1713     --Bug# 15992711 , End
1714 
1715       SELECT NVL(SUM(kle.tradein_amount),0) INTO l_tradeIn_value
1716       FROM OKC_LINE_STYLES_B LS,
1717            okl_K_lines_full_v kle,
1718            okc_statuses_b sts
1719       WHERE LS.ID = KLE.LSE_ID
1720            AND LS.LTY_CODE ='FREE_FORM1'
1721            AND KLE.dnz_chr_iD = p_chr_id
1722            AND kle.sts_code = sts.code
1723            AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1724 
1725     ELSE
1726       SELECT NVL(SUM(kle.tradein_amount),0) INTO l_tradeIn_value
1727       FROM OKC_LINE_STYLES_B LS,
1728            okl_K_lines_full_v kle,
1729            okc_statuses_b sts
1730       WHERE LS.ID = KLE.LSE_ID
1731            AND LS.LTY_CODE ='FREE_FORM1'
1732            AND KLE.dnz_chr_iD = p_chr_id
1733            AND kle.sts_code = sts.code
1734            AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1735     END IF;
1736 
1737     RETURN l_tradeIn_value;
1738 
1739 
1740     EXCEPTION
1741 
1742         WHEN OTHERS THEN
1743                Okl_Api.SET_MESSAGE(
1744                         p_app_name     => G_APP_NAME,
1745                         p_msg_name     => G_UNEXPECTED_ERROR,
1746                         p_token1       => G_SQLCODE_TOKEN,
1747                         p_token1_value => SQLCODE,
1748                         p_token2       => G_SQLERRM_TOKEN,
1749                         p_token2_value => SQLERRM);
1750                 RETURN NULL;
1751 
1752 
1753   END contract_tradein;
1754 
1755 --Bug# 3638568 : This function modified to conditionally include terminated lines if called from pricing
1756 ----------------------------------------------------------------------------------------------------
1757 
1758     -- Start of Comments
1759     -- Created By:       Santhosh Siruvole (ssiruvol)
1760     -- Function Name  line_tradein
1761     -- Description:   returns the tradein of a financial asset line.
1762     -- Dependencies:
1763     -- Parameters: contract id and line id.
1764     -- Version: 1.0
1765     -- End of Commnets
1766 
1767 ----------------------------------------------------------------------------------------------------
1768   FUNCTION line_tradein(
1769             p_chr_id          IN  NUMBER,
1770             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1771 
1772     l_api_name          CONSTANT VARCHAR2(30) := 'RETURN_LINE_TRADEIN_VALUE';
1773     l_api_version       CONSTANT NUMBER       := 1;
1774     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1775     x_msg_count         NUMBER;
1776     x_msg_data          VARCHAR2(256);
1777 
1778     l_tradeIn_value NUMBER := 0.0;
1779 
1780     CURSOR trdinval_csr( chrID NUMBER, lineID NUMBER) IS
1781     SELECT NVL(kle.tradein_amount,0.0) amnt,
1782            kle.dnz_chr_id chrId,
1783            kle.id lneId
1784       FROM OKC_LINE_STYLES_B LS,
1785            okl_K_lines_full_v kle,
1786            okc_statuses_b sts
1787       WHERE LS.ID = kLE.LSE_ID
1788            AND LS.LTY_CODE ='FREE_FORM1'
1789            AND kLE.dnz_chr_id = chrID
1790            AND kLE.ID = lineID
1791            AND kle.sts_code = sts.code
1792            AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1793 
1794     CURSOR trdinval_csr_incl_terminated( chrID NUMBER, lineID NUMBER) IS
1795     SELECT NVL(kle.tradein_amount,0.0) amnt,
1796            kle.dnz_chr_id chrId,
1797            kle.id lneId
1798       FROM OKC_LINE_STYLES_B LS,
1799            okl_K_lines_full_v kle,
1800            okc_statuses_b sts
1801       WHERE LS.ID = kLE.LSE_ID
1802            AND LS.LTY_CODE ='FREE_FORM1'
1803            AND kLE.dnz_chr_id = chrID
1804            AND kLE.ID = lineID
1805            AND kle.sts_code = sts.code
1806            AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1807 
1808    l_trdinval_rec trdinval_csr%ROWTYPE;
1809 
1810    l_discount_incl_terminated BOOLEAN := FALSE;
1811 
1812   BEGIN
1813 
1814     IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL))THEN
1815            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1816     END IF;
1817 
1818            -- rmunjulu 4042892
1819     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1820       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1821 	  LOOP
1822         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1823           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1824 		  l_discount_incl_terminated := TRUE;
1825         END IF;
1826       END LOOP;
1827     END IF;
1828 
1829     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
1830           --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
1831           --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
1832 
1833     IF  l_discount_incl_terminated THEN
1834                   OPEN  trdinval_csr_incl_terminated ( p_chr_id, p_line_id );
1835               FETCH trdinval_csr_incl_terminated INTO l_trdinval_rec;
1836               IF( trdinval_csr_incl_terminated%NOTFOUND ) THEN
1837                  RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1838               END IF;
1839               CLOSE trdinval_csr_incl_terminated;
1840     ELSE
1841           OPEN  trdinval_csr ( p_chr_id, p_line_id );
1842           FETCH trdinval_csr INTO l_trdinval_rec;
1843           IF( trdinval_csr%NOTFOUND ) THEN
1844              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1845           END IF;
1846           CLOSE trdinval_csr;
1847         END IF;
1848 
1849     l_tradeIn_value := l_trdinval_rec.amnt;
1850     RETURN l_tradeIn_value;
1851 
1852 
1853    EXCEPTION
1854       WHEN Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR THEN  -- Added for bug 14617639
1855         IF trdinval_csr_incl_terminated%ISOPEN THEN
1856                 CLOSE trdinval_csr_incl_terminated;
1857              END IF;
1858          IF trdinval_csr%ISOPEN THEN
1859                 CLOSE trdinval_csr;
1860           END IF;
1861        RETURN 0;
1862         WHEN OTHERS THEN
1863       IF trdinval_csr_incl_terminated%ISOPEN THEN
1864              CLOSE trdinval_csr_incl_terminated;
1865           END IF;
1866       IF trdinval_csr%ISOPEN THEN
1867              CLOSE trdinval_csr;
1868           END IF;
1869             Okl_Api.SET_MESSAGE(
1870                       p_app_name     => G_APP_NAME,
1871                       p_msg_name     => G_UNEXPECTED_ERROR,
1872                       p_token1       => G_SQLCODE_TOKEN,
1873                       p_token1_value => SQLCODE,
1874                       p_token2       => G_SQLERRM_TOKEN,
1875                       p_token2_value => SQLERRM);
1876              RETURN NULL;
1877 
1878   END line_tradein;
1879 
1880 --Bug# 3638568 : This function modified to conditionally include terminated lines if called from pricing
1881 ----------------------------------------------------------------------------------------------------
1882 
1883     -- Start of Comments
1884     -- Created By:       Santhosh Siruvole (ssiruvol)
1885     -- Function Name  contract_capreduction
1886     -- Description:   returns the sum of capital reduction of financial asset lines of a contract.
1887     -- Dependencies:
1888     -- Parameters: contract id.
1889     -- Version: 1.0
1890     -- End of Commnets
1891 
1892 ----------------------------------------------------------------------------------------------------
1893   FUNCTION contract_capital_reduction(
1894             p_chr_id          IN  NUMBER,
1895             p_line_id         IN  NUMBER) RETURN NUMBER  IS
1896 
1897     l_api_name          CONSTANT VARCHAR2(60) := 'RETURN_CONTRACT_CAPITAL_REDUCTION_VALUE';
1898     l_api_version       CONSTANT NUMBER       := 1;
1899     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1900     x_msg_count         NUMBER;
1901     x_msg_data          VARCHAR2(256);
1902 
1903     l_capred_value NUMBER := 0;
1904 
1905      CURSOR l_lines_csr( chrId NUMBER ) IS
1906      SELECT kle.id
1907      FROM  okc_line_styles_b ls,
1908            okl_K_lines_full_v kle,
1909            okc_statuses_b sts
1910      WHERE ls.id = kle.lse_id
1911           AND ls.lty_code = 'FREE_FORM1'
1912           AND kle.dnz_chr_id = chrId
1913           AND kle.sts_code = sts.code
1914 -- start: cklee: okl.h Sales Quote IA Authoring
1915           AND kle.CAPITALIZE_DOWN_PAYMENT_YN = 'Y'
1916 -- end: cklee: okl.h Sales Quote IA Authoring
1917           AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
1918 
1919 
1920      CURSOR l_lines_csr_incl_terminated( chrId NUMBER ) IS
1921      SELECT kle.id
1922      FROM  okc_line_styles_b ls,
1923            okl_K_lines_full_v kle,
1924            okc_statuses_b sts
1925      WHERE ls.id = kle.lse_id
1926           AND ls.lty_code = 'FREE_FORM1'
1927           AND kle.dnz_chr_id = chrId
1928           AND kle.sts_code = sts.code
1929 -- start: cklee: okl.h Sales Quote IA Authoring
1930           AND kle.CAPITALIZE_DOWN_PAYMENT_YN = 'Y'
1931 -- end: cklee: okl.h Sales Quote IA Authoring
1932           AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
1933 
1934      --Bug# 15992711 , Start
1935      -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
1936      CURSOR l_lines_nr_csr( chrId NUMBER, p_line_type VARCHAR2 ) IS
1937      SELECT kle.id
1938      FROM  okc_line_styles_b ls,
1939            okl_K_lines_full_v kle,
1940            okc_statuses_b sts
1941      WHERE ls.id = kle.lse_id
1942           AND ls.lty_code = 'FREE_FORM1'
1943           AND kle.dnz_chr_id = chrId
1944           AND kle.sts_code = sts.code
1945 -- start: cklee: okl.h Sales Quote IA Authoring
1946           AND kle.CAPITALIZE_DOWN_PAYMENT_YN = 'Y'
1947 -- end: cklee: okl.h Sales Quote IA Authoring
1948           AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
1949           AND NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
1950 
1951 
1952      -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
1953      CURSOR l_lines_nr_csr_incl_term( chrId NUMBER, p_line_type VARCHAR2 ) IS
1954      SELECT kle.id
1955      FROM  okc_line_styles_b ls,
1956            okl_K_lines_full_v kle,
1957            okc_statuses_b sts
1958      WHERE ls.id = kle.lse_id
1959           AND ls.lty_code = 'FREE_FORM1'
1960           AND kle.dnz_chr_id = chrId
1961           AND kle.sts_code = sts.code
1962 -- start: cklee: okl.h Sales Quote IA Authoring
1963           AND kle.CAPITALIZE_DOWN_PAYMENT_YN = 'Y'
1964 -- end: cklee: okl.h Sales Quote IA Authoring
1965           AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD')
1966           AND NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
1967 
1968 
1969      l_line_type VARCHAR2(30) := 'X';
1970      --Bug# 15992711 , End
1971 
1972 
1973     l_lines_rec l_lines_csr%ROWTYPE;
1974 
1975     l_discount_incl_terminated BOOLEAN := FALSE;
1976   BEGIN
1977 
1978        IF ( p_chr_id IS NULL ) THEN
1979            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1980        END IF;
1981 
1982            -- rmunjulu 4042892
1983     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
1984       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
1985 	  LOOP
1986         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
1987           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
1988 		  l_discount_incl_terminated := TRUE;
1989 
1990         --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
1991         --If set then based on its value set l_line_type
1992         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
1993           IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
1994             l_line_type := 'NEW'; --New
1995           ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
1996             l_line_type := 'RELEASE'; --Release
1997           END IF;
1998         --Bug# 15992711 , End
1999 
2000         END IF;
2001       END LOOP;
2002     END IF;
2003 
2004 
2005     --Bug# 15992711 , Start
2006     -- If l_line_type is set as either 'NEW' or 'RELEASE' call
2007     -- l_lines_nr_csr or l_lines_nr_csr_incl_term based on l_discount_incl_terminated value
2008     -- cursor in order to consider either only new assets or only re-leased assets
2009     IF l_line_type IN ('NEW','RELEASE') THEN
2010        IF l_discount_incl_terminated THEN
2011 
2012           FOR l_lines_rec IN l_lines_nr_csr_incl_term ( p_chr_id, l_line_type )
2013           LOOP
2014 
2015              l_capred_value := l_capred_value + line_capital_reduction(p_chr_id, l_lines_rec.id);
2016 
2017           END LOOP;
2018        ELSE
2019           FOR l_lines_rec IN l_lines_nr_csr ( p_chr_id, l_line_type )
2020           LOOP
2021 
2022              l_capred_value := l_capred_value + line_capital_reduction(p_chr_id, l_lines_rec.id);
2023 
2024           END LOOP;
2025        END IF;
2026     --Bug# 15992711 , End
2027 
2028     -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
2029         --  AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
2030          -- AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
2031 
2032 
2033     --Bug# 15992711 , Start
2034     --IF l_discount_incl_terminated THEN
2035     ELSIF l_discount_incl_terminated THEN
2036     --Bug# 15992711 , End
2037        FOR l_lines_rec IN l_lines_csr_incl_terminated ( p_chr_id )
2038        LOOP
2039 
2040            l_capred_value := l_capred_value + line_capital_reduction(p_chr_id, l_lines_rec.id);
2041 
2042        END LOOP;
2043 
2044     ELSE
2045        FOR l_lines_rec IN l_lines_csr ( p_chr_id )
2046        LOOP
2047 
2048            l_capred_value := l_capred_value + line_capital_reduction(p_chr_id, l_lines_rec.id);
2049 
2050        END LOOP;
2051     END IF;
2052 
2053     RETURN l_capred_value;
2054 
2055 
2056     EXCEPTION
2057 
2058         WHEN OTHERS THEN
2059             IF l_lines_csr_incl_terminated%ISOPEN THEN
2060                    CLOSE l_lines_csr_incl_terminated;
2061                 END IF;
2062             IF l_lines_csr%ISOPEN THEN
2063                    CLOSE l_lines_csr;
2064                 END IF;
2065                Okl_Api.SET_MESSAGE(
2066                         p_app_name     => G_APP_NAME,
2067                         p_msg_name     => G_UNEXPECTED_ERROR,
2068                         p_token1       => G_SQLCODE_TOKEN,
2069                         p_token1_value => SQLCODE,
2070                         p_token2       => G_SQLERRM_TOKEN,
2071                         p_token2_value => SQLERRM);
2072                 RETURN NULL;
2073 
2074   END contract_capital_reduction;
2075 
2076 --Bug# 3638568 : This function modified to conditionally include TERMINATED lines if called from pricing
2077 ----------------------------------------------------------------------------------------------------
2078 
2079     -- Start of Comments
2080     -- Created By:       Santhosh Siruvole (ssiruvol)
2081     -- Function Name  line_capreduction
2082     -- Description:   returns the capital reduction of a financial asset line.
2083     -- Dependencies:
2084     -- Parameters: contract id and line id
2085     -- Version: 1.0
2086     -- End of Commnets
2087 
2088 ----------------------------------------------------------------------------------------------------
2089   FUNCTION line_capital_reduction(
2090             p_chr_id          IN  NUMBER,
2091             p_line_id         IN  NUMBER) RETURN NUMBER  IS
2092 
2093 
2094     l_api_name          CONSTANT VARCHAR2(60) := 'RETURN_LINE_CAPITAL_REDUCTION_VALUE';
2095     l_api_version       CONSTANT NUMBER       := 1;
2096     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
2097     x_msg_count         NUMBER;
2098     x_msg_data          VARCHAR2(256);
2099 
2100     l_capred_value NUMBER := 0;
2101     l_capred_percent NUMBER := 0;
2102         l_capred_incl_terminated BOOLEAN := FALSE;
2103         l_caplitalize_flag varchar2(3);
2104 
2105 -- start: cklee: okl.h Sales Quote IA Authoring
2106      CURSOR l_lines_csr(p_chr_id  number,
2107                         p_line_id number)
2108           IS
2109       SELECT NVL(kle.capital_reduction,0) capital_reduction,
2110              NVL(kle.capital_reduction_percent,0) capital_reduction_percent,
2111              NVL(kle.CAPITALIZE_DOWN_PAYMENT_YN, 'N') CAPITALIZE_DOWN_PAYMENT_YN,
2112              sts.ste_code
2113       FROM OKC_LINE_STYLES_B LS,
2114            okl_K_lines_full_v kle,
2115            okc_statuses_b sts
2116       WHERE LS.ID = KLE.LSE_ID
2117            AND LS.LTY_CODE ='FREE_FORM1'
2118            AND KLE.dnz_chr_id = p_chr_id
2119            AND KLE.ID = p_line_id
2120            AND kle.sts_code = sts.code
2121            ;
2122 -- end: cklee: okl.h Sales Quote IA Authoring
2123 
2124   BEGIN
2125 
2126     IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL))THEN
2127       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2128     END IF;
2129 
2130    -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
2131        --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
2132        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
2133                   --l_capred_incl_terminated := TRUE;
2134     --END IF;
2135 
2136            -- rmunjulu 4042892
2137     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
2138       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
2139 	  LOOP
2140         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
2141           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
2142 		  l_capred_incl_terminated := TRUE;
2143         END IF;
2144       END LOOP;
2145     END IF;
2146 
2147     IF l_capred_incl_terminated = TRUE THEN
2148 
2149 -- start: cklee: okl.h Sales Quote IA Authoring
2150       FOR this_row IN l_lines_csr(p_chr_id, p_line_id) LOOP
2151         IF this_row.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD') AND
2152            this_row.CAPITALIZE_DOWN_PAYMENT_YN = 'Y' THEN
2153            l_capred_value := this_row.capital_reduction;
2154         END IF;
2155       END LOOP;
2156 /*      SELECT NVL(kle.capital_reduction,0) INTO l_capred_value
2157       FROM OKC_LINE_STYLES_B LS,
2158            okl_K_lines_full_v kle,
2159            okc_statuses_b sts
2160       WHERE LS.ID = KLE.LSE_ID
2161            AND LS.LTY_CODE ='FREE_FORM1'
2162            AND KLE.dnz_chr_id = p_chr_id
2163            AND KLE.ID = p_line_id
2164            AND kle.sts_code = sts.code
2165            AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
2166 */
2167 -- end: cklee: okl.h Sales Quote IA Authoring
2168     ELSE
2169 -- start: cklee: okl.h Sales Quote IA Authoring
2170       FOR this_row IN l_lines_csr(p_chr_id, p_line_id) LOOP
2171         IF this_row.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD') AND
2172            this_row.CAPITALIZE_DOWN_PAYMENT_YN = 'Y' THEN
2173            l_capred_value := this_row.capital_reduction;
2174         END IF;
2175       END LOOP;
2176 
2177 /*      SELECT NVL(kle.capital_reduction,0) INTO l_capred_value
2178       FROM OKC_LINE_STYLES_B LS,
2179            okl_K_lines_full_v kle,
2180            okc_statuses_b sts
2181       WHERE LS.ID = KLE.LSE_ID
2182            AND LS.LTY_CODE ='FREE_FORM1'
2183            AND KLE.dnz_chr_id = p_chr_id
2184            AND KLE.ID = p_line_id
2185            AND kle.sts_code = sts.code
2186            AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2187 */
2188     END IF;
2189 
2190 -- end: cklee: okl.h Sales Quote IA Authoring
2191     IF( l_capred_value = 0) THEN
2192        IF l_capred_incl_terminated = TRUE THEN
2193 -- start: cklee: okl.h Sales Quote IA Authoring
2194       FOR this_row IN l_lines_csr(p_chr_id, p_line_id) LOOP
2195         IF this_row.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD') AND
2196            this_row.CAPITALIZE_DOWN_PAYMENT_YN = 'Y' THEN
2197            l_capred_percent := this_row.capital_reduction_percent;
2198         END IF;
2199       END LOOP;
2200 
2201 /*          SELECT NVL(kle.capital_reduction_percent,0) INTO l_capred_percent
2202           FROM OKC_LINE_STYLES_B LS,
2203                okl_K_lines_full_v kle,
2204                okc_statuses_b sts
2205           WHERE LS.ID = KLE.LSE_ID
2206              AND LS.LTY_CODE ='FREE_FORM1'
2207              AND KLE.dnz_chr_id = p_chr_id
2208              AND KLE.ID = p_line_id
2209              AND kle.sts_code = sts.code
2210              AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
2211 */
2212 -- end: cklee: okl.h Sales Quote IA Authoring
2213        ELSE
2214 -- start: cklee: okl.h Sales Quote IA Authoring
2215       FOR this_row IN l_lines_csr(p_chr_id, p_line_id) LOOP
2216         IF this_row.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD') AND
2217            this_row.CAPITALIZE_DOWN_PAYMENT_YN = 'Y' THEN
2218            l_capred_percent := this_row.capital_reduction_percent;
2219         END IF;
2220       END LOOP;
2221 
2222 /*          SELECT NVL(kle.capital_reduction_percent,0) INTO l_capred_percent
2223           FROM OKC_LINE_STYLES_B LS,
2224                okl_K_lines_full_v kle,
2225                okc_statuses_b sts
2226           WHERE LS.ID = KLE.LSE_ID
2227              AND LS.LTY_CODE ='FREE_FORM1'
2228              AND KLE.dnz_chr_id = p_chr_id
2229              AND KLE.ID = p_line_id
2230              AND kle.sts_code = sts.code
2231              AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2232 */
2233 -- end: cklee: okl.h Sales Quote IA Authoring
2234        END IF;
2235 
2236        IF( l_capred_percent <> 0) THEN
2237          l_capred_value := line_oec( p_chr_id, p_line_id ) * l_capred_percent / 100.00;
2238        END IF;
2239 
2240      END IF;
2241 
2242      RETURN l_capred_value;
2243 
2244 
2245     EXCEPTION
2246 
2247         WHEN OTHERS THEN
2248                Okl_Api.SET_MESSAGE(
2249                         p_app_name     => G_APP_NAME,
2250                         p_msg_name     => G_UNEXPECTED_ERROR,
2251                         p_token1       => G_SQLCODE_TOKEN,
2252                         p_token1_value => SQLCODE,
2253                         p_token2       => G_SQLERRM_TOKEN,
2254                         p_token2_value => SQLERRM);
2255 
2256                 RETURN NULL;
2257 
2258   END line_capital_reduction;
2259 
2260 --Bug# 3638568 : This function modified to conditionally include TERMINATED lines if called from pricing
2261 ----------------------------------------------------------------------------------------------------
2262 
2263     -- Start of Comments
2264     -- Created By:       Santhosh Siruvole (ssiruvol)
2265     -- Function Name  line_feescapitalized
2266     -- Description:   returns the capitalized fees of a financial asset line.
2267     -- Dependencies:
2268     -- Parameters: contract id and line id
2269     -- Version: 1.0
2270     -- End of Commnets
2271 
2272 ----------------------------------------------------------------------------------------------------
2273   FUNCTION line_fees_capitalized(
2274             p_chr_id          IN  NUMBER,
2275             p_line_id         IN  NUMBER) RETURN NUMBER  IS
2276 
2277     l_api_name          CONSTANT VARCHAR2(60) := 'RETURN_LINE_FEES_CAPITAL_AMOUNT_VALUE';
2278     l_api_version       CONSTANT NUMBER       := 1;
2279     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
2280     x_msg_count         NUMBER;
2281     x_msg_data          VARCHAR2(256);
2282 
2283     l_fees_value NUMBER := 0;
2284 
2285     CURSOR l_fee_csr( kleId NUMBER) IS
2286     SELECT NVL(SUM(kle_cov.capital_amount),0) CapAmountLines
2287        FROM   OKC_LINE_STYLES_B  LSEB,
2288               OKC_K_ITEMS        CIM,
2289               OKL_K_LINES        KLE_COV,
2290               OKC_K_LINES_B      CLEB_COV,
2291               OKC_STATUSES_B     STSB
2292         WHERE LSEB.ID               = CLEB_COV.LSE_ID
2293         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
2294         AND   CIM.jtot_object1_code = 'OKX_COVASST'
2295         AND   CLEB_COV.id           =  CIM.cle_id
2296         AND   KLE_COV.id            =  CLEB_COV.ID
2297         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
2298         AND   cim.object1_id1       =  to_char(kleId)
2299         AND   CLEB_COV.sts_code     =  STSB.code
2300         AND   STSB.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2301 
2302     CURSOR l_fee_csr_incl_terminated( kleId NUMBER) IS
2303     SELECT NVL(SUM(kle_cov.capital_amount),0) CapAmountLines
2304        FROM   OKC_LINE_STYLES_B  LSEB,
2305               OKC_K_ITEMS        CIM,
2306               OKL_K_LINES        KLE_COV,
2307               OKC_K_LINES_B      CLEB_COV,
2308               OKC_STATUSES_B     STSB
2309         WHERE LSEB.ID               = CLEB_COV.LSE_ID
2310         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
2311         AND   CIM.jtot_object1_code = 'OKX_COVASST'
2312         AND   CLEB_COV.id           =  CIM.cle_id
2313         AND   KLE_COV.id            =  CLEB_COV.ID
2314         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
2315         AND   cim.object1_id1       =  to_char(kleId)
2316         AND   CLEB_COV.sts_code     =  STSB.code
2317         AND   STSB.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
2318 
2319 --Bug# 5150150 -- start
2320     CURSOR l_sys_source_code_csr (p_chr_id NUMBER) IS
2321     SELECT ID,ORIG_SYSTEM_SOURCE_CODE
2322     FROM OKC_K_HEADERS_B
2323     WHERE ID = p_chr_id;
2324 
2325    l_chr_id okc_k_headers_b.id%type;
2326    l_orig_systm_source_code okc_k_headers_b.orig_system_source_code%type;
2327 --Bug# 5150150 -- end
2328    l_feeline_rec l_fee_csr%ROWTYPE;
2329    l_discount_incl_terminated BOOLEAN := FALSE;
2330 
2331   BEGIN
2332 
2333        IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL)) THEN
2334            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2335        END IF;
2336 
2337 --Bug# 5150150 -- start
2338        OPEN  l_sys_source_code_csr ( p_chr_id );
2339        FETCH l_sys_source_code_csr INTO l_chr_id, l_orig_systm_source_code;
2340        CLOSE l_sys_source_code_csr;
2341 
2342        if ((l_orig_systm_source_code is not null) and (l_orig_systm_source_code = 'OKL_RELEASE')) then
2343                 l_fees_value := 0.0;
2344        else
2345 --Bug# 5150150 -- end
2346            -- rmunjulu 4042892
2347     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
2348       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
2349 	  LOOP
2350         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
2351           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
2352 		  l_discount_incl_terminated := TRUE;
2353         END IF;
2354       END LOOP;
2355     END IF;
2356 
2357     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
2358       -- AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
2359        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
2360     IF l_discount_incl_terminated THEN
2361                   OPEN  l_fee_csr_incl_terminated ( p_line_id );
2362               FETCH l_fee_csr_incl_terminated INTO l_feeline_rec;
2363           IF( l_fee_csr_incl_terminated%NOTFOUND ) THEN
2364              l_fees_value := 0.0;
2365           END IF;
2366               CLOSE l_fee_csr_incl_terminated;
2367     ELSE
2368           OPEN  l_fee_csr( p_line_id );
2369           FETCH l_fee_csr INTO l_feeline_rec;
2370           IF( l_fee_csr%NOTFOUND ) THEN
2371              l_fees_value := 0.0;
2372           END IF;
2373           CLOSE l_fee_csr;
2374         END IF;
2375 
2376     l_fees_value := l_feeline_rec.CapAmountLines;
2377 
2378    end if;
2379     RETURN l_fees_value;
2380 
2381 
2382     EXCEPTION
2383 
2384         WHEN OTHERS THEN
2385             IF l_fee_csr_incl_terminated%ISOPEN THEN
2386           CLOSE l_fee_csr_incl_terminated;
2387         END IF;
2388             IF l_fee_csr%ISOPEN THEN
2389           CLOSE l_fee_csr;
2390         END IF;
2391 
2392                 Okl_Api.SET_MESSAGE(
2393                         p_app_name     => G_APP_NAME,
2394                         p_msg_name     => G_UNEXPECTED_ERROR,
2395                         p_token1       => G_SQLCODE_TOKEN,
2396                         p_token1_value => SQLCODE,
2397                         p_token2       => G_SQLERRM_TOKEN,
2398                         p_token2_value => SQLERRM);
2399         RETURN NULL;
2400 
2401   END line_fees_capitalized;
2402 
2403 --Bug# 3638568 : This function modified to conditionally include TERMINATED lines if called from pricing
2404 ----------------------------------------------------------------------------------------------------
2405 
2406     -- Start of Comments
2407     -- Created By:       Santhosh Siruvole (ssiruvol)
2408     -- Function Name  contract_feescapitalized
2409     -- Description:   returns the sum of capitalized fees of all financial asset lines of a contract.
2410     -- Dependencies:
2411     -- Parameters: contract id.
2412     -- Version: 1.0
2413     -- End of Commnets
2414 
2415 ----------------------------------------------------------------------------------------------------
2416   FUNCTION contract_fees_capitalized(
2417             p_chr_id          IN  NUMBER,
2418             p_line_id         IN  NUMBER) RETURN NUMBER  IS
2419 
2420     l_api_name          CONSTANT VARCHAR2(60) := 'RETURN_LINE_FEES_CAPITAL_AMOUNT_VALUE';
2421     l_api_version       CONSTANT NUMBER       := 1;
2422     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
2423     x_msg_count         NUMBER;
2424     x_msg_data          VARCHAR2(256);
2425 
2426 
2427      CURSOR l_lines_csr( chrId NUMBER ) IS
2428      SELECT kle.id
2429      FROM   okc_line_styles_b ls,
2430             okl_K_lines_full_v kle,
2431             okc_statuses_b sts
2432      WHERE ls.id = kle.lse_id
2433           AND ls.lty_code = 'FREE_FORM1'
2434           AND kle.dnz_chr_id = chrId
2435           AND kle.sts_code = sts.code
2436           AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2437 
2438      CURSOR l_lines_csr_incl_terminated( chrId NUMBER ) IS
2439      SELECT kle.id
2440      FROM   okc_line_styles_b ls,
2441             okl_K_lines_full_v kle,
2442             okc_statuses_b sts
2443      WHERE ls.id = kle.lse_id
2444           AND ls.lty_code = 'FREE_FORM1'
2445           AND kle.dnz_chr_id = chrId
2446           AND kle.sts_code = sts.code
2447           AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD');
2448 
2449     --Bug# 15992711 , Start
2450     -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
2451      CURSOR l_lines_nr_csr( chrId NUMBER, p_line_type VARCHAR2 ) IS
2452      SELECT kle.id
2453      FROM   okc_line_styles_b ls,
2454             okl_K_lines_full_v kle,
2455             okc_statuses_b sts
2456      WHERE ls.id = kle.lse_id
2457           AND ls.lty_code = 'FREE_FORM1'
2458           AND kle.dnz_chr_id = chrId
2459           AND kle.sts_code = sts.code
2460           AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
2461           AND NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
2462 
2463 
2464      -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
2465      CURSOR l_lines_nr_csr_incl_term( chrId NUMBER, p_line_type VARCHAR2 ) IS
2466      SELECT kle.id
2467      FROM   okc_line_styles_b ls,
2468             okl_K_lines_full_v kle,
2469             okc_statuses_b sts
2470      WHERE ls.id = kle.lse_id
2471           AND ls.lty_code = 'FREE_FORM1'
2472           AND kle.dnz_chr_id = chrId
2473           AND kle.sts_code = sts.code
2474           AND sts.ste_code NOT IN ('EXPIRED', 'CANCELLED', 'HOLD')
2475           AND NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
2476 
2477     l_line_type VARCHAR2(30) := 'X';
2478     --Bug# 15992711 , End
2479 
2480 
2481     l_lines_rec l_lines_csr%ROWTYPE;
2482 
2483     l_fees_value NUMBER := 0;
2484 
2485     l_discount_incl_terminated BOOLEAN := FALSE;
2486 
2487   BEGIN
2488 
2489        IF ( p_chr_id IS NULL ) THEN
2490            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2491        END IF;
2492 
2493            -- rmunjulu 4042892
2494     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
2495       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
2496 	  LOOP
2497         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
2498           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
2499 		  l_discount_incl_terminated := TRUE;
2500 
2501         --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
2502         --                If set then based on its value set l_line_type
2503 
2504         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
2505            IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
2506               l_line_type := 'NEW'; --New
2507            ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
2508               l_line_type := 'RELEASE'; --Release
2509            END IF;
2510         --Bug# 15992711 , End
2511 
2512         END IF;
2513       END LOOP;
2514     END IF;
2515 
2516 
2517     --Bug# 15992711 , Start
2518     -- If l_line_type is set as either 'NEW' or 'RELEASE' call
2519     -- l_lines_nr_csr or l_lines_nr_csr_incl_term cursor based on l_discount_incl_terminated value
2520     -- in order to consider either only new assets or only re-leased assets, else no change in the standard behavior
2521 
2522     IF l_line_type IN ('NEW','RELEASE') THEN
2523        IF l_discount_incl_terminated THEN
2524 
2525            FOR l_lines_rec IN l_lines_nr_csr_incl_term ( p_chr_id, l_line_type )
2526            LOOP
2527 
2528                l_fees_value := l_fees_value + line_fees_capitalized(p_chr_id, l_lines_rec.id);
2529 
2530            END LOOP;
2531        ELSE
2532            FOR l_lines_rec IN l_lines_nr_csr ( p_chr_id, l_line_type )
2533            LOOP
2534 
2535                l_fees_value := l_fees_value + line_fees_capitalized(p_chr_id, l_lines_rec.id);
2536 
2537            END LOOP;
2538        END IF;
2539     --Bug# 15992711 , End
2540 
2541 
2542     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
2543       -- AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
2544        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
2545 
2546     --Bug# 15992711 , Start
2547     --IF l_discount_incl_terminated THEN
2548     ELSIF l_discount_incl_terminated THEN
2549     --Bug# 15992711 , End
2550            FOR l_lines_rec IN l_lines_csr_incl_terminated ( p_chr_id )
2551        LOOP
2552 
2553            l_fees_value := l_fees_value + line_fees_capitalized(p_chr_id, l_lines_rec.id);
2554 
2555        END LOOP;
2556 
2557     ELSE
2558        FOR l_lines_rec IN l_lines_csr ( p_chr_id )
2559        LOOP
2560 
2561            l_fees_value := l_fees_value + line_fees_capitalized(p_chr_id, l_lines_rec.id);
2562 
2563        END LOOP;
2564     END IF;
2565 
2566     RETURN l_fees_value;
2567 
2568 
2569     EXCEPTION
2570 
2571         WHEN OTHERS THEN
2572            IF l_lines_csr_incl_terminated%ISOPEN THEN
2573              CLOSE l_lines_csr_incl_terminated;
2574            END IF;
2575            IF l_lines_csr%ISOPEN THEN
2576              CLOSE l_lines_csr;
2577            END IF;
2578        Okl_Api.SET_MESSAGE(p_app_name     => G_APP_NAME,
2579                            p_msg_name     => G_UNEXPECTED_ERROR,
2580                            p_token1       => G_SQLCODE_TOKEN,
2581                            p_token1_value => SQLCODE,
2582                            p_token2       => G_SQLERRM_TOKEN,
2583                            p_token2_value => SQLERRM);
2584        RETURN NULL;
2585 
2586   END contract_fees_capitalized;
2587 
2588 ----------------------------------------------------------------------------------------------------
2589 
2590     -- Start of Comments
2591     -- Created By:       Santhosh Siruvole (ssiruvol)
2592     -- Function Name  line_servicecapitalized
2593     -- Description:   returns the capitalized service fees of a financial asset line.
2594     -- Dependencies:
2595     -- Parameters: contract id and line id
2596     -- Version: 1.0
2597     -- End of Commnets
2598 
2599 ----------------------------------------------------------------------------------------------------
2600   FUNCTION line_service_capitalized(
2601             p_chr_id          IN  NUMBER,
2602             p_line_id         IN  NUMBER) RETURN NUMBER  IS
2603 
2604     l_api_name		CONSTANT VARCHAR2(60) := 'RETURN_LINE_SVC_CAP_AMNT_VALUE';
2605     l_api_version	CONSTANT NUMBER	      := 1;
2606     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
2607     x_msg_count         NUMBER;
2608     x_msg_data          VARCHAR2(256);
2609 
2610     l_srvcs_value NUMBER := 0;
2611 
2612 
2613     CURSOR l_srvcline_csr ( kleId NUMBER ) IS
2614     SELECT NVL(SUM(kle.capital_amount),0) CapAmountSubLines
2615     FROM OKC_LINE_STYLES_B LS,
2616          okc_k_items cim,
2617 	 okl_K_lines_full_v kle,
2618 	 okc_statuses_b sts
2619     WHERE LS.ID = KLE.LSE_ID
2620           AND ls.lty_code = 'LINK_SERV_ASSET'
2621           AND cim.jtot_object1_code = 'OKX_COVASST'
2622           AND kle.id = cim.cle_id
2623           AND cim.object1_id1 = to_char(kleId)
2624 	  AND kle.sts_code = sts.code
2625 	  AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2626 
2627     CURSOR srvc_strm_type_csr ( kleid NUMBER ) IS
2628     SELECT sty.capitalize_yn,
2629            sty.name
2630     FROM okl_strm_type_v sty,
2631          okc_k_items cim,
2632          okc_line_styles_b ls,
2633 	 okl_K_lines_full_v kle,
2634 	 okc_statuses_b sts
2635     WHERE cim.cle_id = kle.id
2636          AND ls.id = kle.lse_id
2637          AND ls.lty_code = 'SOLD_SERVICE'
2638          AND cim.object1_id1 = sty.id
2639          AND cim.object1_id2 = '#'
2640          AND kle.id = kleid
2641 	 AND kle.sts_code = sts.code
2642 	 AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
2643 
2644 
2645    l_srvcline_rec l_srvcline_csr%ROWTYPE;
2646    l_srvcstrm_rec srvc_strm_type_csr%ROWTYPE;
2647 
2648   BEGIN
2649 
2650        IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL))THEN
2651            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2652        END IF;
2653 
2654       OPEN  srvc_strm_type_csr( p_line_id );
2655       FETCH srvc_strm_type_csr INTO l_srvcstrm_rec;
2656       IF( srvc_strm_type_csr%NOTFOUND ) THEN
2657           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2658       END IF;
2659       CLOSE srvc_strm_type_csr;
2660 
2661       IF( UPPER(l_srvcstrm_rec.capitalize_YN) = 'N' ) THEN
2662           RETURN 0.0;
2663       END IF;
2664 
2665       OPEN  l_srvcline_csr( p_line_id );
2666       FETCH l_srvcline_csr INTO l_srvcline_rec;
2667       IF( l_srvcline_csr%NOTFOUND ) THEN
2668           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2669       END IF;
2670       CLOSE l_srvcline_csr;
2671 
2672       l_srvcs_value := l_srvcline_rec.CapAmountSubLines;
2673 
2674       RETURN l_srvcs_value;
2675 
2676 
2677     EXCEPTION
2678 
2679 	WHEN OTHERS THEN
2680                Okl_Api.SET_MESSAGE(
2681                         p_app_name     => G_APP_NAME,
2682                         p_msg_name     => G_UNEXPECTED_ERROR,
2683                         p_token1       => G_SQLCODE_TOKEN,
2684                         p_token1_value => SQLCODE,
2685                         p_token2       => G_SQLERRM_TOKEN,
2686                         p_token2_value => SQLERRM);
2687                 RETURN NULL;
2688 
2689 
2690   END line_service_capitalized;
2691 
2692 ------------------------------------------------------------------------------
2693 -- Start of comments
2694 --
2695 -- Procedure Name  : contract_total_adjustments
2696 -- Description     : Sum of all approved requests for specfiic contract where type = prefunding
2697 --                   and amount is negative
2698 -- Business Rules  :
2699 -- Parameters      :IN: p_contract_id, OUT: amount
2700 -- Version         : 1.0
2701 -- History         : 20-MAY-02 [email protected] -- Created
2702 --
2703 -- End of comments
2704 ------------------------------------------------------------------------------
2705 FUNCTION contract_total_adjustments(
2706  p_contract_id                   IN NUMBER
2707  ,p_contract_line_id             IN NUMBER
2708 ) RETURN NUMBER
2709 IS
2710   l_amount NUMBER := 0;
2711   -- sjalasut, modified the cursor to have khr_id referred from okl_txl_ap_inv_lns_all_b
2712   -- changes made as part of OKLR12B project.
2713 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2714 /*
2715   CURSOR C (p_contract_id  NUMBER)
2716   IS
2717   SELECT NVL(SUM(A.amount),0)
2718   FROM okl_trx_ap_invoices_b A
2719       ,okl_txl_ap_inv_lns_all_b B
2720   WHERE A.id = B.tap_id
2721     AND B.khr_id = p_contract_id
2722     AND A.funding_type_code = 'PREFUNDING'
2723     AND A.trx_status_code IN ('APPROVED', 'PROCESSED')
2724     AND A.amount < 0;
2725 */
2726 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2727 
2728 BEGIN
2729 
2730 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2731 /*
2732   OPEN C (p_contract_id);
2733   FETCH C INTO l_amount;
2734   CLOSE C;
2735 */
2736   l_amount := okl_funding_pvt.get_chr_funded_adjs(p_contract_id);
2737 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2738 
2739   RETURN l_amount;
2740   EXCEPTION
2741     WHEN OTHERS THEN
2742       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2743       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2744                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2745                           p_token1        => 'OKL_SQLCODE',
2746                           p_token1_value  => SQLCODE,
2747                           p_token2        => 'OKL_SQLERRM',
2748                           p_token2_value  => SQLERRM);
2749       RETURN NULL;
2750 
2751 END;
2752 
2753 ------------------------------------------------------------------------------
2754 -- Start of comments
2755 --
2756 -- Procedure Name  : contract_amount_prefunded
2757 -- Description     : Sum of all approved requests for specfiic contract where type = prefunding
2758 -- Business Rules  :
2759 -- Parameters      :IN: p_contract_id, OUT: amount
2760 -- Version         : 1.0
2761 -- History         :13-JAN-02 [email protected] -- Created
2762 --                  22-Jan-07 sjalasut modified cursor c to have khr_id referred
2763 --                  from okl_txl_Ap_inv_lns_all_b
2764 --
2765 -- End of comments
2766 ------------------------------------------------------------------------------
2767 FUNCTION contract_amount_prefunded(
2768  p_contract_id                   IN NUMBER
2769  ,p_contract_line_id             IN NUMBER
2770 ) RETURN NUMBER
2771 IS
2772   l_amount NUMBER := 0;
2773 
2774   -- sjalasut, modified the cursor to include khr_id from the okl_Txl_ap_inv_lns_all_b
2775   -- changes made as part of OKLR12B disbursements project
2776 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2777 /*
2778   CURSOR C (p_contract_id  NUMBER)
2779   IS
2780   SELECT NVL(SUM(A.amount),0)
2781   FROM okl_trx_ap_invoices_b A
2782       ,okl_Txl_ap_inv_lns_all_b B
2783   WHERE A.id = B.tap_id
2784   AND B.khr_id = p_contract_id
2785   AND A.funding_type_code = 'PREFUNDING'
2786   AND A.trx_status_code IN ('APPROVED', 'PROCESSED')
2787   AND A.amount > 0;
2788 */
2789 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2790 
2791 BEGIN
2792 
2793 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2794 /*
2795   OPEN C (p_contract_id);
2796   FETCH C INTO l_amount;
2797   CLOSE C;*/
2798   l_amount := okl_funding_pvt.get_amount_prefunded(p_contract_id);
2799 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2800 
2801   RETURN l_amount;
2802   EXCEPTION
2803     WHEN OTHERS THEN
2804       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2805       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2806                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2807                           p_token1        => 'OKL_SQLCODE',
2808                           p_token1_value  => SQLCODE,
2809                           p_token2        => 'OKL_SQLERRM',
2810                           p_token2_value  => SQLERRM);
2811       RETURN NULL;
2812 
2813 END;
2814 ------------------------------------------------------------------------------
2815 -- Start of comments
2816 --
2817 -- Procedure Name  : contract_total_funded
2818 -- Description     : Sum of all approved requests for specific contract
2819 -- Business Rules  :
2820 -- Parameters      :IN: p_contract_id, OUT: amount
2821 -- Version         : 1.0
2822 -- History         :13-JAN-02 [email protected] -- Created
2823 --                  22-Jan-07 sjalasut modified cursor c to have khr_id referred
2824 --                  from okl_txl_Ap_inv_lns_all_b
2825 --
2826 -- End of comments
2827 ------------------------------------------------------------------------------
2828 FUNCTION contract_total_funded(
2829  p_contract_id                   IN NUMBER
2830  ,p_contract_line_id             IN NUMBER
2831 ) RETURN NUMBER
2832 IS
2833   l_amount NUMBER := 0;
2834 
2835   -- sjalasut, modified the cursor to include khr_id from the okl_Txl_ap_inv_lns_all_b
2836   -- changes made as part of OKLR12B disbursements project
2837 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2838 /*
2839   CURSOR C (p_contract_id  NUMBER)
2840   IS
2841   SELECT NVL(SUM(A.amount),0)
2842   FROM okl_trx_ap_invoices_b A
2843       ,okl_txl_ap_inv_lns_all_b B
2844   WHERE A.id = B.TAP_ID
2845   AND A.khr_id = p_contract_id
2846   AND A.funding_type_code NOT IN ('SUPPLIER_RETENTION', 'MANUAL_DISB')
2847   AND A.trx_status_code IN ('APPROVED', 'PROCESSED');
2848 */
2849 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2850 
2851 BEGIN
2852 
2853 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2854 /*  OPEN C (p_contract_id);
2855   FETCH C INTO l_amount;
2856   CLOSE C;*/
2857   l_amount := okl_funding_pvt.get_total_funded(p_contract_id);
2858 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2859 
2860   RETURN l_amount;
2861   EXCEPTION
2862     WHEN OTHERS THEN
2863       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2864       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2865                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2866                           p_token1        => 'OKL_SQLCODE',
2867                           p_token1_value  => SQLCODE,
2868                           p_token2        => 'OKL_SQLERRM',
2869                           p_token2_value  => SQLERRM);
2870       RETURN NULL;
2871 
2872 END;
2873 ------------------------------------------------------------------------------
2874 -- Start of comments
2875 --
2876 -- Procedure Name  : contract_total_debits
2877 -- Description     : Sum of all approved requests for specific contract where amount is negative (A/P debits)
2878 -- Business Rules  :
2879 -- Parameters      :IN: p_contract_id, OUT: amount
2880 -- Version         : 1.0
2881 -- History         :13-JAN-02 [email protected] -- Created
2882 --                  22-Jan-07 sjalasut modified cursor c to have khr_id referred
2883 --                  from okl_txl_Ap_inv_lns_all_b
2884 --
2885 -- End of comments
2886 ------------------------------------------------------------------------------
2887 FUNCTION contract_total_debits(
2888  p_contract_id                   IN NUMBER
2889  ,p_contract_line_id             IN NUMBER
2890 ) RETURN NUMBER
2891 IS
2892   l_amount NUMBER := 0;
2893 
2894   -- sjalasut, modified the cursor to include khr_id from the okl_Txl_ap_inv_lns_all_b
2895   -- changes made as part of OKLR12B disbursements project
2896 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2897 /*
2898   CURSOR C (p_contract_id  NUMBER)
2899   IS
2900   SELECT NVL(SUM(B.amount),0)
2901   FROM okl_trx_ap_invoices_b A,
2902        okl_txl_ap_inv_lns_all_b B
2903   WHERE A.id = B.tap_id
2904   AND B.khr_id = p_contract_id
2905   AND A.trx_status_code IN ('APPROVED', 'PROCESSED')
2906   AND A.funding_type_code = 'SUPPLIER_RETENTION';
2907 */
2908 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2909 BEGIN
2910 
2911 --start:|           21-Sep-07 cklee Bug: 6438934                                     |
2912 /*
2913   OPEN C (p_contract_id);
2914   FETCH C INTO l_amount;
2915   CLOSE C;*/
2916   l_amount := okl_funding_pvt.get_total_retention(p_contract_id);
2917 --end:|           21-Sep-07 cklee Bug: 6438934                                     |
2918 
2919   RETURN l_amount;
2920 
2921   EXCEPTION
2922     WHEN OTHERS THEN
2923       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2924       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2925                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2926                           p_token1        => 'OKL_SQLCODE',
2927                           p_token1_value  => SQLCODE,
2928                           p_token2        => 'OKL_SQLERRM',
2929                           p_token2_value  => SQLERRM);
2930       RETURN NULL;
2931 
2932 END;
2933 -----------------------------------------------------------------------
2934 -- Start of comments
2935 --
2936 -- Procedure Name  : creditline_total_limit
2937 -- Description     : Sum of all credit limit (contract line) for specfiic
2938 --                   contract entity scs_code = 'CREDITLINE_CONTRACT'
2939 -- Business Rules  :
2940 -- Parameters      :IN: p_contract_id, OUT: amount
2941 -- Version         : 1.0
2942 -- History         :13-JAN-02 [email protected] -- Created
2943 --
2944 -- End of comments
2945 ------------------------------------------------------------------------------
2946  FUNCTION creditline_total_limit(
2947  p_contract_id                   IN NUMBER
2948  ,p_contract_line_id             IN NUMBER
2949  ) RETURN NUMBER
2950 IS
2951   l_amount NUMBER := 0;
2952   l_amount_add NUMBER := 0;
2953   l_amount_new NUMBER := 0;
2954   l_amount_reduce NUMBER := 0;
2955 
2956 BEGIN
2957 
2958   l_amount_add := NVL(creditline_total_addition(p_contract_id),0);
2959   l_amount_new := NVL(creditline_total_new_limit(p_contract_id),0);
2960   l_amount_reduce := NVL(creditline_total_reduction(p_contract_id),0);
2961 
2962   l_amount := l_amount_new + l_amount_add - l_amount_reduce;
2963 
2964   RETURN l_amount;
2965   EXCEPTION
2966     WHEN OTHERS THEN
2967       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
2968       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
2969                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
2970                           p_token1        => 'OKL_SQLCODE',
2971                           p_token1_value  => SQLCODE,
2972                           p_token2        => 'OKL_SQLERRM',
2973                           p_token2_value  => SQLERRM);
2974       RETURN NULL;
2975 
2976 END;
2977 ------------------------------------------------------------------------------
2978 -- Start of comments
2979 --
2980 -- Procedure Name  : creditline_total_remaining
2981 -- Description     : Sum of all credit limit (contract line) for specfiic contract
2982 --                   scs_code = 'CREDITLINE_CONTRACT' and substract from Funding total
2983 -- Business Rules  :
2984 -- Parameters      :IN: p_contract_id, OUT: amount
2985 -- Version         : 1.0
2986 -- History         :13-JAN-02 [email protected] -- Created
2987 --
2988 -- End of comments
2989 ------------------------------------------------------------------------------
2990  FUNCTION creditline_total_remaining(
2991  p_contract_id                   IN NUMBER
2992  ,p_contract_line_id             IN NUMBER
2993  ) RETURN NUMBER
2994 IS
2995   l_amount NUMBER := 0;
2996 --  l_amount_funded NUMBER := 0;
2997 --  l_amount_limit NUMBER := 0;
2998 --  l_amount_remain NUMBER := 0;
2999 
3000   x_return_status	 VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
3001   l_api_version      NUMBER	:= 1.0;
3002   x_msg_count		 NUMBER;
3003   x_msg_data	        VARCHAR2(4000);
3004   l_init_msg_list    VARCHAR2(10) := OKL_API.G_FALSE;
3005 
3006   x_value NUMBER := 0;
3007 
3008 BEGIN
3009 
3010 /*
3011   --l_amount_funded := nvl(creditline_total_funded(p_contract_id),0);
3012   l_amount_limit := NVL(creditline_total_limit(p_contract_id),0);
3013 
3014 --  l_amount_remain := OKL_PAY_INVOICES_DISB_PVT.credit_check
3015   l_amount_remain := OKL_BPD_CREDIT_CHECK_PVT.credit_check -- cklee 08/28/03
3016                  (p_api_version    => l_api_version
3017                   ,p_init_msg_list => l_init_msg_list
3018                   ,x_return_status => x_return_status
3019                   ,x_msg_count     => x_msg_count
3020                   ,x_msg_data      => x_msg_data
3021                   ,p_creditline_id => p_contract_id
3022                   ,p_credit_max    => l_amount_limit);
3023 
3024   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3025     --RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3026     l_amount_remain := 0;
3027   ELSIF (x_return_Status = OKL_API.G_RET_STS_ERROR)  THEN
3028     --RAISE OKL_API.G_EXCEPTION_ERROR;
3029     l_amount_remain := 0;
3030   END IF;
3031 
3032   l_amount := l_amount_remain;
3033 
3034 */
3035 
3036     --------------------------------------------------
3037     -- Credit limt Remaining check
3038     --------------------------------------------------
3039   OKL_EXECUTE_FORMULA_PUB.EXECUTE(
3040       p_api_version   => l_api_version,
3041       p_init_msg_list => l_init_msg_list,
3042       x_return_status => x_return_status,
3043       x_msg_count     => x_msg_count,
3044       x_msg_data      => x_msg_data,
3045       p_formula_name  => 'CREDIT_CHECK',
3046       p_contract_id   => p_contract_id,
3047       x_value         => x_value);
3048 
3049   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3050       --RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3051       x_value := 0;
3052   ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
3053       --RAISE OKL_API.G_EXCEPTION_ERROR;
3054       x_value := 0;
3055   END IF;
3056 
3057   l_amount := x_value;
3058 
3059   RETURN l_amount;
3060   EXCEPTION
3061     WHEN OTHERS THEN
3062       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
3063       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
3064                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
3065                           p_token1        => 'OKL_SQLCODE',
3066                           p_token1_value  => SQLCODE,
3067                           p_token2        => 'OKL_SQLERRM',
3068                           p_token2_value  => SQLERRM);
3069       RETURN NULL;
3070 
3071 END;
3072 ------------------------------------------------------------------------------
3073 -- Start of comments
3074 --
3075 -- Procedure Name  : creditline_total_new_limit
3076 -- Description     : Sum of all credit new limit (contract line) for specfiic contract
3077 --                   scs_code = 'CREDITLINE_CONTRACT'
3078 -- Business Rules  :
3079 -- Parameters      :IN: p_contract_id, OUT: amount
3080 -- Version         : 1.0
3081 -- History         :13-JAN-02 [email protected] -- Created
3082 --
3083 -- End of comments
3084 ------------------------------------------------------------------------------
3085  FUNCTION creditline_total_new_limit(
3086  p_contract_id                   IN NUMBER
3087  --,p_contract_line_id             IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
3088  ,p_contract_line_id             IN NUMBER
3089  ) RETURN NUMBER
3090 IS
3091   l_amount NUMBER := 0;
3092 
3093   CURSOR C (p_contract_id  NUMBER)
3094   IS
3095   SELECT NVL(SUM(A.amount),0)
3096   FROM OKL_K_LINES_FULL_V A
3097   WHERE A.dnz_chr_id = p_contract_id
3098   AND   A.credit_nature = 'NEW'
3099   AND   NVL(TRUNC(A.start_date),TRUNC(SYSDATE)) <= TRUNC(SYSDATE) -- fixed trunc issues
3100   ;
3101 
3102 BEGIN
3103 
3104   OPEN C (p_contract_id);
3105   FETCH C INTO l_amount;
3106   CLOSE C;
3107 
3108   RETURN l_amount;
3109   EXCEPTION
3110     WHEN OTHERS THEN
3111       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
3112       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
3113                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
3114                           p_token1        => 'OKL_SQLCODE',
3115                           p_token1_value  => SQLCODE,
3116                           p_token2        => 'OKL_SQLERRM',
3117                           p_token2_value  => SQLERRM);
3118       RETURN NULL;
3119 
3120 END;
3121 ------------------------------------------------------------------------------
3122 -- Start of comments
3123 --
3124 -- Procedure Name  : creditline_total_addition
3125 -- Description     : Sum of all credit addition (contract line) for specfiic contract
3126 --                   scs_code = 'CREDITLINE_CONTRACT'
3127 -- Business Rules  :
3128 -- Parameters      :IN: p_contract_id, OUT: amount
3129 -- Version         : 1.0
3130 -- History         :13-JAN-02 [email protected] -- Created
3131 --
3132 -- End of comments
3133 ------------------------------------------------------------------------------
3134  FUNCTION creditline_total_addition(
3135  p_contract_id                   IN NUMBER
3136  --,p_contract_line_id             IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
3137  ,p_contract_line_id             IN NUMBER
3138  ) RETURN NUMBER
3139 IS
3140   l_amount NUMBER := 0;
3141 
3142   CURSOR C (p_contract_id  NUMBER)
3143   IS
3144   SELECT NVL(SUM(A.amount),0)
3145   FROM OKL_K_LINES_FULL_V A
3146   WHERE A.dnz_chr_id = p_contract_id
3147   AND   A.credit_nature = 'ADD'
3148   AND   NVL(TRUNC(A.start_date),TRUNC(SYSDATE)) <= TRUNC(SYSDATE) -- fixed trunc issues
3149   ;
3150 
3151 BEGIN
3152 
3153   OPEN C (p_contract_id);
3154   FETCH C INTO l_amount;
3155   CLOSE C;
3156 
3157   RETURN l_amount;
3158   EXCEPTION
3159     WHEN OTHERS THEN
3160       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
3161       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
3162                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
3163                           p_token1        => 'OKL_SQLCODE',
3164                           p_token1_value  => SQLCODE,
3165                           p_token2        => 'OKL_SQLERRM',
3166                           p_token2_value  => SQLERRM);
3167       RETURN NULL;
3168 
3169 END;
3170 ------------------------------------------------------------------------------
3171 -- Start of comments
3172 --
3173 -- Procedure Name  : creditline_total_reduction
3174 -- Description     : Sum of all credit addition (contract line) for specfiic contract
3175 --                   scs_code = 'CREDITLINE_CONTRACT'
3176 -- Business Rules  :
3177 -- Parameters      :IN: p_contract_id, OUT: amount
3178 -- Version         : 1.0
3179 -- History         :13-JAN-02 [email protected] -- Created
3180 --
3181 -- End of comments
3182 ------------------------------------------------------------------------------
3183  FUNCTION creditline_total_reduction(
3184  p_contract_id                   IN NUMBER
3185  --,p_contract_line_id             IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
3186  ,p_contract_line_id             IN NUMBER
3187  ) RETURN NUMBER
3188 IS
3189   l_amount NUMBER := 0;
3190 
3191   CURSOR C (p_contract_id  NUMBER)
3192   IS
3193   SELECT NVL(SUM(A.amount),0)
3194   FROM OKL_K_LINES_FULL_V A
3195   WHERE A.dnz_chr_id = p_contract_id
3196   AND   A.credit_nature = 'REDUCE'
3197   AND   NVL(TRUNC(A.start_date),TRUNC(SYSDATE)) <= TRUNC(SYSDATE) -- fixed trunc issues
3198   ;
3199 
3200 BEGIN
3201 
3202   OPEN C (p_contract_id);
3203   FETCH C INTO l_amount;
3204   CLOSE C;
3205 
3206   RETURN l_amount;
3207   EXCEPTION
3208     WHEN OTHERS THEN
3209       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
3210       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
3211                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
3212                           p_token1        => 'OKL_SQLCODE',
3213                           p_token1_value  => SQLCODE,
3214                           p_token2        => 'OKL_SQLERRM',
3215                           p_token2_value  => SQLERRM);
3216       RETURN NULL;
3217 
3218 END;
3219 
3220  /*FUNCTION line_capitalcost(
3221             p_chr_id           IN  NUMBER,
3222             p_line_id          IN  NUMBER,
3223             p_capred         IN  NUMBER,
3224             p_capred_per         IN  NUMBER,
3225             p_trd_amnt         IN  NUMBER) RETURN NUMBER  IS
3226 
3227     l_api_name		CONSTANT VARCHAR2(60) := 'RETURN_LINE_CAP_AMNT_VALUE';
3228     l_api_version	CONSTANT NUMBER	      := 1;
3229     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
3230     x_msg_count         NUMBER;
3231     x_msg_data          VARCHAR2(256);
3232 
3233     l_capamnt_value NUMBER := 0;
3234     l_oec_value NUMBER := 0;
3235     l_oec           NUMBER;
3236     l_tradeIn       NUMBER;
3237     l_capred        NUMBER;
3238     l_feecap        NUMBER;
3239     l_servc         NUMBER;
3240 
3241 
3242   BEGIN
3243 
3244       IF ( ( p_chr_id IS NULL ) OR ( p_line_id IS NULL ) ) THEN
3245           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
3246       END IF;
3247 
3248       l_oec_value := line_oec( p_chr_id, p_line_id);
3249       IF (  l_oec_value IS NULL  ) THEN
3250           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
3251       END IF;
3252 
3253       l_capred := p_capred;
3254       IF(( p_capred IS NULL ) OR ( p_capred = 0)) THEN
3255           IF (( p_capred_per IS NULL) OR ( p_capred_per = 0)) THEN
3256               l_capred := 0.0;
3257           ELSE
3258               l_capred := ( l_oec_value * p_capred_per ) / 100.00;
3259           END IF;
3260       END IF;
3261 
3262       IF (p_trd_amnt IS NULL) THEN
3263           l_tradeIn := 0.0;
3264       ELSE
3265           l_tradeIn := p_trd_amnt;
3266       END IF;
3267 
3268       l_capamnt_value := l_oec_value - l_capred - l_tradeIn;
3269 
3270       RETURN l_capamnt_value;
3271 
3272     EXCEPTION
3273 	WHEN OTHERS THEN
3274                Okl_Api.SET_MESSAGE(
3275                         p_app_name     => G_APP_NAME,
3276                         p_msg_name     => G_UNEXPECTED_ERROR,
3277                         p_token1       => G_SQLCODE_TOKEN,
3278                         p_token1_value => SQLCODE,
3279                         p_token2       => G_SQLERRM_TOKEN,
3280                         p_token2_value => SQLERRM);
3281                 RETURN NULL;
3282 
3283 
3284   END line_capitalcost;
3285 
3286 */
3287 
3288 ----------------------------------------------------------------------------------------------------
3289 
3290     -- Start of Comments
3291     -- Created By     : Shri Iyer
3292     -- Function Name  : CONTRACT_DAYS_TO_ACCRUE
3293     -- Description    : This function returns the number of days to accrue
3294     -- Dependencies   : None
3295     -- Parameters     : contract id, contract line id
3296     -- Version        : 1.0
3297     -- End of Commnets
3298 
3299 ----------------------------------------------------------------------------------------------------
3300 
3301 FUNCTION CONTRACT_DAYS_TO_ACCRUE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3302 
3303     l_days_to_accrue     NUMBER;
3304     l_last_int_calc_date DATE;
3305     l_period_end_date    DATE;
3306     l_period_start_date  DATE;
3307     l_days_in_month      VARCHAR2(100);
3308     l_contract_number    VARCHAR2(2000);
3309     l_days_in_year       VARCHAR2(100);
3310     l_advance_arrears    VARCHAR2(1);
3311     l_return_status      VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3312 
3313     -- Fetch contract days in a month
3314     CURSOR days_in_month IS
3315     SELECT days_in_a_month_code
3316     FROM OKL_K_RATE_PARAMS
3317     WHERE khr_id = p_khr_id
3318 	AND parameter_type_code = 'ACTUAL'
3319     AND effective_to_date IS NULL;
3320 
3321     -- cursor to get the contract number
3322     CURSOR contract_num_csr IS
3323     SELECT  contract_number
3324     FROM OKC_K_HEADERS_B
3325     WHERE id = p_khr_id;
3326 
3327     -- Fetch contract days in a year
3328     CURSOR days_in_year IS
3329     SELECT days_in_a_year_code
3330     FROM OKL_K_RATE_PARAMS
3331     WHERE khr_id = p_khr_id
3332 	AND parameter_type_code = 'ACTUAL'
3333     AND effective_to_date IS NULL;
3334 
3335     CURSOR adv_arr_csr IS
3336     SELECT
3337     rulb2.RULE_INFORMATION10 arrears_yn
3338     FROM   okc_k_lines_b     cleb,
3339            okc_rule_groups_b rgpb,
3340            okc_rules_b       rulb,
3341            okc_rules_b       rulb2,
3342            okl_strm_type_b   styb
3343     WHERE  rgpb.chr_id     IS NULL
3344     AND    rgpb.dnz_chr_id = cleb.dnz_chr_id
3345     AND    rgpb.cle_id     = cleb.id
3346     AND    cleb.dnz_chr_id = p_khr_id
3347     AND    rgpb.rgd_code   = 'LALEVL'
3348     AND    rulb.rgp_id     = rgpb.id
3349     AND    rulb.rule_information_category  = 'LASLH'
3350     AND    TO_CHAR(styb.id)                = rulb.object1_id1
3351     AND    rulb2.object2_id1                = TO_CHAR(rulb.id)
3352     AND    rulb2.rgp_id                    = rgpb.id
3353     AND    rulb2.rule_information_category = 'LASLL';
3354 
3355   BEGIN
3356     --Validate additional parameters availability
3357     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3358       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3359 	  LOOP
3360         IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_last_int_calc_date' THEN
3361           l_last_int_calc_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3362         ELSIF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_period_end_date' THEN
3363           l_period_end_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3364         END IF;
3365       END LOOP;
3366 	ELSE
3367       Okl_Api.Set_Message(p_app_name     => g_app_name,
3368                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3369       RAISE Okl_Api.G_EXCEPTION_ERROR;
3370 	END IF;
3371 
3372     -- Validate parameters
3373     IF l_period_end_date IS NULL THEN
3374       Okl_Api.Set_Message(p_app_name     => g_app_name,
3375                           p_msg_name     => 'OKL_AGN_FE_PERD_END_DATE');
3376       RAISE Okl_Api.G_EXCEPTION_ERROR;
3377 	END IF;
3378 
3379     IF l_last_int_calc_date IS NULL THEN
3380       Okl_Api.Set_Message(p_app_name     => g_app_name,
3381                           p_msg_name     => 'OKL_AGN_FE_INT_CALC_DATE');
3382       RAISE Okl_Api.G_EXCEPTION_ERROR;
3383 	END IF;
3384 
3385     --Bug 5081876. Adding a day to last int calc date.
3386     --Bug 5162929. Undoing changes made for bug 5081876. One day is being added in accrual program
3387     --l_last_int_calc_date := l_last_int_calc_date + 1;
3388 
3389     --Bug 5046184. ***Additional Code START***
3390     FOR y in contract_num_csr
3391     LOOP
3392       l_contract_number := y.contract_number;
3393     END LOOP;
3394 
3395     IF l_contract_number IS NULL THEN
3396       Okl_Api.set_message(p_app_name     => g_app_name,
3397                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3398       RAISE OKL_API.G_EXCEPTION_ERROR;
3399     END IF;
3400 
3401     FOR x IN days_in_month
3402     LOOP
3403       l_days_in_month := x.days_in_a_month_code;
3404     END LOOP;
3405 
3406     IF l_days_in_month IS NULL THEN
3407       Okl_Api.Set_Message(p_app_name     => g_app_name,
3408                           p_msg_name     => 'OKL_AGN_FE_DAYSIN_MTH',
3409                           p_token1       => 'CONTRACT_NUMBER',
3410                           p_token1_value => l_contract_number);
3411       RAISE Okl_Api.G_EXCEPTION_ERROR;
3412 	END IF;
3413 
3414     FOR z IN days_in_year
3415     LOOP
3416       l_days_in_year := z.days_in_a_year_code;
3417     END LOOP;
3418 
3419     IF l_days_in_year IS NULL THEN
3420       Okl_Api.Set_Message(p_app_name     => g_app_name,
3421                           p_msg_name     => 'OKL_AGN_FE_DAYSIN_YR',
3422                           p_token1       => 'CONTRACT_NUMBER',
3423                           p_token1_value => l_contract_number);
3424       RAISE Okl_Api.G_EXCEPTION_ERROR;
3425 	END IF;
3426 
3427     FOR i in adv_arr_csr
3428     LOOP
3429       l_advance_arrears := NVL(i.arrears_yn, 'N');
3430     END LOOP;
3431 
3432     l_days_to_accrue := okl_pricing_utils_pvt.get_day_count
3433                          (l_days_in_month,
3434                           l_days_in_year,
3435                           l_last_int_calc_date,
3436                           l_period_end_date,
3437                           l_advance_arrears,
3438                           l_return_status);
3439 
3440     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3441       Okl_Api.set_message(p_app_name     => g_app_name,
3442                           p_msg_name     => 'OKL_GET_DAY_CNT_ERROR');
3443 
3444       RAISE OKL_API.G_EXCEPTION_ERROR;
3445     END IF;
3446     --Bug 5046184. ***Additional Code START***
3447 
3448     --Bug 5046184. Commenting below calculation
3449     --l_days_to_accrue := l_period_end_date - l_last_int_calc_date;
3450 
3451     RETURN l_days_to_accrue;
3452 
3453   EXCEPTION
3454     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3455       RETURN NULL;
3456 
3457 	WHEN OTHERS THEN
3458       Okl_Api.SET_MESSAGE(
3459                         p_app_name     => G_APP_NAME,
3460                         p_msg_name     => G_UNEXPECTED_ERROR,
3461                         p_token1       => G_SQLCODE_TOKEN,
3462                         p_token1_value => SQLCODE,
3463                         p_token2       => G_SQLERRM_TOKEN,
3464                         p_token2_value => SQLERRM);
3465       RETURN NULL;
3466 
3467   END CONTRACT_DAYS_TO_ACCRUE;
3468 
3469 ----------------------------------------------------------------------------------------------------
3470 
3471     -- Start of Comments
3472     -- Created By     : Shri Iyer
3473     -- Function Name  : CONTRACT_DAYS_IN_YEAR
3474     -- Description    : This function returns the number of days in a year
3475     -- Dependencies   : None
3476     -- Parameters     : contract id, contract line id
3477     -- Version        : 1.0
3478     -- End of Commnets
3479 
3480 ----------------------------------------------------------------------------------------------------
3481 
3482   FUNCTION CONTRACT_DAYS_IN_YEAR(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3483     l_days NUMBER;
3484     l_lookup_code VARCHAR2(2000);
3485     l_accrual_date DATE;
3486 	l_year NUMBER;
3487     l_contract_number VARCHAR2(2000);
3488 
3489     -- cursor to get the contract number
3490     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
3491     SELECT  contract_number
3492     FROM OKC_K_HEADERS_B
3493     WHERE id = p_ctr_id;
3494 
3495 --     BUG 4730646. Changing cursor.
3496 --     CURSOR lookup_csr(p_ctr_id NUMBER) IS
3497 --     SELECT rule_information1
3498 --     FROM okc_rules_b okc
3499 --     WHERE okc.dnz_chr_id = p_ctr_id
3500 --     AND okc.rule_information_category = 'LAICLC';
3501 
3502     -- Fetch contract days in a year
3503     CURSOR lookup_csr(p_ctr_id NUMBER) IS
3504     SELECT days_in_a_year_code
3505     FROM OKL_K_RATE_PARAMS
3506     WHERE khr_id = p_ctr_id
3507 	AND parameter_type_code = 'ACTUAL'
3508     AND effective_to_date IS NULL;
3509 
3510   BEGIN
3511     OPEN contract_num_csr(p_khr_id);
3512     FETCH contract_num_csr INTO l_contract_number;
3513     IF contract_num_csr%NOTFOUND THEN
3514       CLOSE contract_num_csr;
3515       Okl_Api.set_message(p_app_name     => g_app_name,
3516                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3517       RAISE OKL_API.G_EXCEPTION_ERROR;
3518 	END IF;
3519     CLOSE contract_num_csr;
3520 
3521     OPEN lookup_csr(p_khr_id);
3522 	FETCH lookup_csr INTO l_lookup_code;
3523     CLOSE lookup_csr;
3524 
3525     IF l_lookup_code IS NULL THEN
3526       Okl_Api.Set_Message(p_app_name     => g_app_name,
3527                           p_msg_name     => 'OKL_AGN_FE_DAYSIN_YR',
3528                           p_token1       => 'CONTRACT_NUMBER',
3529                           p_token1_value => l_contract_number);
3530       RAISE Okl_Api.G_EXCEPTION_ERROR;
3531 	END IF;
3532 
3533     IF l_lookup_code = 'ACTUAL' THEN
3534       IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3535         FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3536 	    LOOP
3537           IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_accrual_date' THEN
3538             l_accrual_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3539 	      END IF;
3540         END LOOP;
3541 	  ELSE
3542         Okl_Api.Set_Message(p_app_name     => g_app_name,
3543 
3544 
3545                             p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3546         RAISE Okl_Api.G_EXCEPTION_ERROR;
3547 	  END IF;
3548 
3549       IF l_accrual_date IS NULL THEN
3550         Okl_Api.Set_Message(p_app_name     => g_app_name,
3551                             p_msg_name     => 'OKL_AGN_FE_ACCRUAL_DATE');
3552         RAISE Okl_Api.G_EXCEPTION_ERROR;
3553 	  END IF;
3554 
3555 
3556 	  l_year := TO_NUMBER(TO_CHAR(l_accrual_date, 'RRRR'));
3557 
3558 	  IF MOD(l_year,4) = 0 THEN
3559 	    l_days := 366;
3560 	  ELSE
3561 	    l_days := 365;
3562 	  END IF;
3563 	ELSE
3564 	  l_days := TO_NUMBER(l_lookup_code);
3565 	END IF;
3566 
3567     RETURN l_days;
3568 
3569   EXCEPTION
3570     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3571       RETURN NULL;
3572 
3573 	WHEN OTHERS THEN
3574       IF lookup_csr%ISOPEN THEN
3575         CLOSE lookup_csr;
3576       END IF;
3577                Okl_Api.SET_MESSAGE(
3578                         p_app_name     => G_APP_NAME,
3579                         p_msg_name     => G_UNEXPECTED_ERROR,
3580                         p_token1       => G_SQLCODE_TOKEN,
3581                         p_token1_value => SQLCODE,
3582                         p_token2       => G_SQLERRM_TOKEN,
3583                         p_token2_value => SQLERRM);
3584                 RETURN NULL;
3585 
3586   END CONTRACT_DAYS_IN_YEAR;
3587 
3588 ----------------------------------------------------------------------------------------------------
3589 
3590     -- Start of Comments
3591     -- Created By     : Shri Iyer
3592     -- Function Name  : CONTRACT_INTEREST_RATE
3593     -- Description    : This function returns the rate of interest on the given date or closest to that date
3594     -- Dependencies   : None
3595     -- Parameters     : contract id, contract line id
3596     -- Version        : 1.0
3597     -- End of Commnets
3598 
3599 ----------------------------------------------------------------------------------------------------
3600 
3601   FUNCTION CONTRACT_INTEREST_RATE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3602     l_accrual_date DATE;
3603     l_interest_rate NUMBER;
3604     l_adder_rate NUMBER;
3605     l_total_rate NUMBER;
3606     l_contract_number VARCHAR2(2000);
3607 
3608     -- cursor to get the contract number
3609     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
3610     SELECT  contract_number
3611     FROM OKC_K_HEADERS_B
3612     WHERE id = p_ctr_id;
3613 
3614 
3615 --     Bug 4737551. Commenting below cursor and writing new select statement. SGIYER.
3616 --     CURSOR interest_rate_csr(p_ctr_id NUMBER, p_accrual_date DATE) IS
3617 --     SELECT idv.value
3618 --     FROM OKC_RULES_B rule,
3619 --          OKL_INDEX_VALUES idv,
3620 --          OKL_INDICES idx
3621 --     WHERE rule.rule_information_category = 'LAIVAR'
3622 --       AND rule.dnz_chr_id = p_ctr_id
3623 --       AND TO_NUMBER(rule.rule_information2) = idx.id
3624 --       AND idx.ID   = idv.idx_id
3625 --       AND idv.datetime_valid = (SELECT MAX(idv.datetime_valid)
3626 --                              FROM OKL_INDEX_VALUES idv ,
3627 --                                   OKL_INDICES idx,
3628 --                                   OKC_RULES_B rules
3629 --                              WHERE rules.rule_information_category = 'LAIVAR'
3630 --                              AND rules.dnz_chr_id = p_ctr_id
3631 --                              AND rules.rule_information2 = idx.id
3632 --                              AND idx.id =  idv.idx_id
3633 --                              AND   idv.datetime_valid <= p_accrual_date);
3634 
3635     -- cursor to get interest rate
3636     CURSOR interest_rate_csr(p_ctr_id NUMBER, p_accrual_date DATE) IS
3637     SELECT idv.value
3638     FROM OKL_K_RATE_PARAMS okl,
3639          OKL_INDEX_VALUES idv,
3640          OKL_INDICES idx
3641     WHERE okl.khr_id = p_ctr_id
3642       AND okl.parameter_type_code = 'ACTUAL'
3643       AND okl.effective_to_date IS NULL
3644       AND okl.interest_index_id = idx.id
3645       AND idx.ID   = idv.idx_id
3646       AND idv.datetime_valid = (SELECT MAX(idv.datetime_valid)
3647                              FROM OKL_INDEX_VALUES idv ,
3648                                   OKL_INDICES idx,
3649                                   OKL_K_RATE_PARAMS rate
3650                              WHERE rate.khr_id = p_ctr_id
3651                              AND rate.parameter_type_code = 'ACTUAL'
3652                              AND rate.effective_to_date IS NULL
3653                              AND rate.interest_index_id = idx.id
3654                              AND idx.id =  idv.idx_id
3655                              AND idv.datetime_valid <= p_accrual_date);
3656 
3657     -- Bug# 2920174
3658     -- cursor to get adder rate
3659 --     Bug 4737551. Commenting below cursor and writing new select statement. SGIYER.
3660 --     CURSOR adder_rate_csr(p_ctr_id NUMBER) IS
3661 --     SELECT TO_NUMBER(rule_information4)
3662 --     FROM OKC_RULES_B
3663 --     WHERE rule_information_category = 'LAIVAR'
3664 --     AND dnz_chr_id = p_ctr_id;
3665 
3666     -- cursor to get adder rate
3667     -- Bug 4737551.
3668      CURSOR adder_rate_csr(p_ctr_id NUMBER) IS
3669      SELECT adder_rate
3670      FROM OKL_K_RATE_PARAMS
3671      WHERE khr_id = p_ctr_id
3672      AND parameter_type_code = 'ACTUAL'
3673      AND effective_to_date IS NULL;
3674 
3675   BEGIN
3676 
3677 	OPEN contract_num_csr(p_khr_id);
3678     FETCH contract_num_csr INTO l_contract_number;
3679     IF contract_num_csr%NOTFOUND THEN
3680       CLOSE contract_num_csr;
3681       Okl_Api.set_message(p_app_name     => g_app_name,
3682                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3683       RAISE OKL_API.G_EXCEPTION_ERROR;
3684 	END IF;
3685     CLOSE contract_num_csr;
3686 
3687     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3688       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3689 	  LOOP
3690   	  IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_accrual_date' THEN
3691         l_accrual_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3692 	  END IF;
3693       END LOOP;
3694 	ELSE
3695       Okl_Api.Set_Message(p_app_name     => g_app_name,
3696                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3697       RAISE Okl_Api.G_EXCEPTION_ERROR;
3698 	END IF;
3699 
3700     IF l_accrual_date IS NULL THEN
3701       Okl_Api.Set_Message(p_app_name     => g_app_name,
3702                           p_msg_name     => 'OKL_AGN_FE_ACCRUAL_DATE');
3703       RAISE Okl_Api.G_EXCEPTION_ERROR;
3704 	END IF;
3705 
3706 	OPEN interest_rate_csr(p_khr_id, l_accrual_date);
3707 	FETCH interest_rate_csr INTO l_interest_rate;
3708     IF interest_rate_csr %NOTFOUND THEN
3709       Okl_Api.Set_Message(p_app_name     => g_app_name,
3710                           p_msg_name     => 'OKL_AGN_FE_INT_RATE',
3711                           p_token1       => 'CONTRACT_NUMBER',
3712                           p_token1_value => l_contract_number);
3713       CLOSE interest_rate_csr;
3714 	  RAISE Okl_Api.G_EXCEPTION_ERROR;
3715 	END IF;
3716 	CLOSE interest_rate_csr;
3717 
3718 	OPEN adder_rate_csr(p_khr_id);
3719 	FETCH adder_rate_csr INTO l_adder_rate;
3720     IF adder_rate_csr %NOTFOUND THEN
3721       Okl_Api.Set_Message(p_app_name     => g_app_name,
3722                           p_msg_name     => 'OKL_AGN_FE_ADDER_RATE',
3723                           p_token1       => 'CONTRACT_NUMBER',
3724                           p_token1_value => l_contract_number);
3725       CLOSE interest_rate_csr;
3726 	  RAISE Okl_Api.G_EXCEPTION_ERROR;
3727 	END IF;
3728 	CLOSE adder_rate_csr;
3729 
3730     -- Bug# 2920174
3731     -- get adder rate, add to interest rate and return total.
3732     l_total_rate := (l_interest_rate + l_adder_rate)/100;
3733 
3734     RETURN l_total_rate;
3735 
3736   EXCEPTION
3737     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3738       RETURN NULL;
3739 
3740 	WHEN OTHERS THEN
3741       IF interest_rate_csr%ISOPEN THEN
3742 	    CLOSE interest_rate_csr;
3743       END IF;
3744 
3745       IF adder_rate_csr%ISOPEN THEN
3746 	    CLOSE adder_rate_csr;
3747       END IF;
3748 
3749       IF contract_num_csr%ISOPEN THEN
3750 	    CLOSE contract_num_csr;
3751       END IF;
3752 
3753       Okl_Api.SET_MESSAGE(
3754                         p_app_name     => G_APP_NAME,
3755                         p_msg_name     => G_UNEXPECTED_ERROR,
3756                         p_token1       => G_SQLCODE_TOKEN,
3757                         p_token1_value => SQLCODE,
3758                         p_token2       => G_SQLERRM_TOKEN,
3759                         p_token2_value => SQLERRM);
3760       RETURN NULL;
3761 
3762   END CONTRACT_INTEREST_RATE;
3763 
3764 ----------------------------------------------------------------------------------------------------
3765 
3766     -- Start of Comments
3767     -- Created By     : Shri Iyer
3768     -- Function Name  : CONTRACT_PRINCIPAL_BALANCE
3769     -- Description    : This function returns the principal balance for a contract as of that date
3770     -- Dependencies   : None
3771     -- Parameters     : contract id, contract line id
3772     -- Version        : 1.0
3773     -- End of Commnets
3774 
3775 ----------------------------------------------------------------------------------------------------
3776 
3777   FUNCTION CONTRACT_PRINCIPAL_BALANCE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3778 
3779     l_period_start_date   DATE;
3780     l_period_end_date     DATE;
3781     l_principal_bal       NUMBER;
3782     l_contract_number     VARCHAR2(2000);
3783     l_last_int_calc_date  DATE;
3784     l_return_status       VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3785     l_kle_id              NUMBER;
3786 --  Bug 5055714.
3787 --  l_prin_bal_id         NUMBER;
3788 
3789     -- cursor to get the contract number
3790     CURSOR contract_num_csr IS
3791     SELECT  contract_number
3792     FROM OKC_K_HEADERS_B
3793     WHERE id = p_khr_id;
3794 
3795 -- Bug 5055714. Commenting below derivation. Using utility provided instead.
3796 -- 	CURSOR principal_bal_csr(p_ctr_id NUMBER, p_start_date DATE, p_end_date DATE, p_prin_bal_id NUMBER) IS
3797 --     SELECT SUM(ste.amount)
3798 --       FROM OKL_STRM_TYPE_B sty,
3799 --            OKL_STREAMS stm,
3800 --            OKL_STRM_ELEMENTS ste
3801 --         WHERE stm.khr_id = p_ctr_id
3802 --           AND stm.active_yn = 'Y'
3803 --           AND stm.say_code = 'CURR'
3804 --           AND sty.id = p_prin_bal_id
3805 --           AND stm.sty_id = sty.id
3806 --           AND ste.stm_id = stm.id
3807 --           AND ste.stream_element_date BETWEEN p_start_date AND p_end_date;
3808 
3809 -- cursor for retrieveing earlier principal balance amount if principal balance
3810 -- for given period is not found
3811 -- 	CURSOR prior_prin_bal_csr(p_ctr_id NUMBER, p_start_date DATE, p_prin_bal_id NUMBER) IS
3812 --     SELECT SUM(ste.amount)
3813 --     FROM OKL_STRM_TYPE_B sty,
3814 --          OKL_STREAMS stm,
3815 --          OKL_STRM_ELEMENTS ste
3816 --     WHERE stm.khr_id = p_ctr_id
3817 --     AND stm.active_yn = 'Y'
3818 --     AND stm.say_code = 'CURR'
3819 --     AND sty.id = p_prin_bal_id
3820 --     AND stm.sty_id = sty.id
3821 --     AND ste.stm_id = stm.id
3822 --     AND ste.stream_element_date = (SELECT MAX(stream_element_date)
3823 -- 		                           FROM OKL_STRM_TYPE_B sty,
3824 --                                         OKL_STREAMS stm,
3825 --                                         OKL_STRM_ELEMENTS ste
3826 --                                    WHERE stm.khr_id = p_ctr_id
3827 --                                    AND stm.active_yn = 'Y'
3828 -- 								   AND stm.say_code = 'CURR'
3829 --                                    AND sty.id = p_prin_bal_id
3830 --                                    AND stm.sty_id = sty.id
3831 --                                    AND ste.stm_id = stm.id
3832 --                                    AND stream_element_date < p_start_date);
3833 
3834   BEGIN
3835 
3836 	FOR i IN contract_num_csr
3837     LOOP
3838       l_contract_number := i.contract_number;
3839     END LOOP;
3840 
3841     IF l_contract_number IS NULL THEN
3842       Okl_Api.set_message(p_app_name     => g_app_name,
3843                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
3844       RAISE OKL_API.G_EXCEPTION_ERROR;
3845 	END IF;
3846 
3847     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
3848       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
3849 	  LOOP
3850 --      Bug 5055714. Commenting below. Need Last int calc date
3851 -- 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_period_start_date' THEN
3852 --           l_period_start_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3853 -- 	    ELSIF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_period_end_date' THEN
3854 --           l_period_end_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3855 --         END IF;
3856         IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_last_int_calc_date' THEN
3857           l_last_int_calc_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
3858         END IF;
3859       END LOOP;
3860 	ELSE
3861       Okl_Api.Set_Message(p_app_name     => g_app_name,
3862                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
3863       RAISE Okl_Api.G_EXCEPTION_ERROR;
3864 	END IF;
3865 
3866     IF l_last_int_calc_date IS NULL THEN
3867       Okl_Api.Set_Message(p_app_name     => g_app_name,
3868                           p_msg_name     => 'OKL_AGN_FE_INT_CALC_DATE');
3869       RAISE Okl_Api.G_EXCEPTION_ERROR;
3870     END IF;
3871 
3872 -- Bug 5055714.No validation needed.
3873 --     IF l_period_end_date IS NULL THEN
3874 --       Okl_Api.Set_Message(p_app_name     => g_app_name,
3875 --                           p_msg_name     => 'OKL_AGN_FE_PERD_END_DATE');
3876 --       RAISE Okl_Api.G_EXCEPTION_ERROR;
3877 -- 	END IF;
3878 --
3879 --     IF l_period_start_date IS NULL THEN
3880 --       Okl_Api.Set_Message(p_app_name     => g_app_name,
3881 --                           p_msg_name     => 'OKL_AGN_FE_PERD_START_DATE');
3882 --       RAISE Okl_Api.G_EXCEPTION_ERROR;
3883 -- 	END IF;
3884 
3885     -- SGIYER
3886     -- UDS Impact
3887 -- Bug 5055714.
3888 --     OKL_STREAMS_UTIL.get_dependent_stream_type(
3889 --             p_khr_id  		   	    => p_khr_id,
3890 --             p_primary_sty_purpose   => 'RENT',
3891 --             p_dependent_sty_purpose => 'PRINCIPAL_BALANCE',
3892 --             x_return_status		    => l_return_status,
3893 --             x_dependent_sty_id      => l_prin_bal_id);
3894 --
3895 --     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3896 --       Okl_Api.set_message(p_app_name     => g_app_name,
3897 --                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
3898 --                           p_token1       => 'STREAM_NAME',
3899 -- 	                      p_token1_value => 'PRINCIPAL BALANCE');
3900 --       RAISE Okl_Api.G_EXCEPTION_ERROR;
3901 --     END IF;
3902 
3903 --  Bug 5055714. Commenting below derivation. Using utility provided instead.
3904 --  OPEN principal_bal_csr (p_khr_id, l_period_start_date, l_period_end_date, l_prin_bal_id);
3905 --  FETCH principal_bal_csr INTO l_principal_bal;
3906 --  CLOSE principal_bal_csr;
3907 
3908     --Added by bkatraga for bug 13447258
3909     l_kle_id := p_kle_id;
3910     IF(l_kle_id = OKL_API.G_MISS_NUM) THEN
3911       l_kle_id := NULL;
3912     END IF;
3913     --end bkatraga
3914 
3915     -- Bug 5060624. Passing l_kle_id which is null and not okl_api.g_miss_num
3916     l_principal_bal := OKL_VARIABLE_INT_UTIL_PVT.get_principal_bal(
3917          x_return_status  => l_return_status,
3918          p_khr_id         => p_khr_id,
3919          p_kle_id         => l_kle_id,
3920          p_date           => l_last_int_calc_date);
3921 
3922     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
3923       Okl_Api.Set_Message(p_app_name     => g_app_name,
3924                           p_msg_name     => 'OKL_AGN_VAR_PB_ERROR');
3925     END IF;
3926 
3927     IF l_principal_bal IS NULL THEN
3928       Okl_Api.Set_Message(p_app_name     => g_app_name,
3929                           p_msg_name     => 'OKL_AGN_FE_PRIN_BAL',
3930                           p_token1       => 'CONTRACT_NUMBER',
3931                           p_token1_value => l_contract_number);
3932 	  RAISE Okl_Api.G_EXCEPTION_ERROR;
3933     END IF;
3934 
3935       -- Bug#2920344. Commenting error message.
3936       -- If principal balance for period range not found then retrieve
3937       -- principal balance for available prior period. MMITTAL.
3938       --Okl_Api.Set_Message(p_app_name     => g_app_name,
3939       --                    p_msg_name     => 'OKL_AGN_FE_PRIN_BAL',
3940       --                    p_token1       => 'CONTRACT_NUMBER',
3941       --                    p_token1_value => l_contract_number);
3942       --CLOSE principal_bal_csr;
3943 	  --RAISE Okl_Api.G_EXCEPTION_ERROR;
3944 
3945       -- If principal balance not found for date range, get prior principal balance.
3946       -- As per MMITTAL.
3947 --       OPEN prior_prin_bal_csr(p_khr_id, l_period_start_date,l_prin_bal_id);
3948 --       FETCH prior_prin_bal_csr INTO l_principal_bal;
3949 --       CLOSE prior_prin_bal_csr;
3950 --       IF l_principal_bal IS NULL THEN
3951 --         Okl_Api.Set_Message(p_app_name     => g_app_name,
3952 --                             p_msg_name     => 'OKL_AGN_FE_PRIN_BAL',
3953 --                             p_token1       => 'CONTRACT_NUMBER',
3954 --                             p_token1_value => l_contract_number);
3955 -- 	    RAISE Okl_Api.G_EXCEPTION_ERROR;
3956 --       END IF;
3957 --	END IF;
3958 
3959     RETURN l_principal_bal;
3960 
3961   EXCEPTION
3962     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3963       RETURN NULL;
3964 
3965 	WHEN OTHERS THEN
3966       Okl_Api.SET_MESSAGE(
3967                         p_app_name     => G_APP_NAME,
3968                         p_msg_name     => G_UNEXPECTED_ERROR,
3969                         p_token1       => G_SQLCODE_TOKEN,
3970                         p_token1_value => SQLCODE,
3971                         p_token2       => G_SQLERRM_TOKEN,
3972                         p_token2_value => SQLERRM);
3973       RETURN NULL;
3974   END CONTRACT_PRINCIPAL_BALANCE;
3975 
3976 ----------------------------------------------------------------------------------------------------
3977 
3978     -- Start of Comments
3979     -- Created By     : Shri Iyer
3980     -- Function Name  : CONTRACT_UNBILLED_RECEIVABLES
3981     -- Description    : This function returns the unbilled receivables balance for a contract as of a given date
3982     -- Dependencies   : None
3983     -- Parameters     : contract id, contract line id
3984     -- Version        : 1.0
3985     -- End of Commnets
3986 
3987 ----------------------------------------------------------------------------------------------------
3988 
3989   FUNCTION CONTRACT_UNBILLED_RECEIVABLES(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
3990     l_rent_strm_bal       NUMBER := 0;
3991     l_contract_number     VARCHAR2(2000);
3992     l_provision_date      DATE;
3993     l_sty_id              NUMBER;
3994     l_return_status       VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
3995 
3996     -- cursor to get the contract number
3997     -- 02-Oct-2003. SGIYER. Added condition ste.stream_element_date >= p_date
3998     -- on product management's instructions.
3999     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
4000     SELECT  contract_number
4001     FROM OKL_K_HEADERS_FULL_V
4002     WHERE id = p_ctr_id;
4003 
4004     -- SGIYER
4005     -- modifying cursor for user defind streams project
4006     CURSOR get_unb_rec_csr(p_ctr_id NUMBER, p_date DATE, p_sty_id NUMBER) IS
4007     SELECT SUM(ste.amount)
4008     FROM OKL_STREAMS stm,
4009          OKL_STRM_ELEMENTS ste,
4010          OKL_STRM_TYPE_B sty
4011     WHERE stm.khr_id = p_ctr_id
4012     AND stm.sty_id = sty.id
4013     AND sty.id = p_sty_id
4014     AND stm.active_yn = 'Y'
4015     AND stm.say_code ='CURR'
4016     AND ste.stm_id = stm.id
4017     AND ste.stream_element_date >= p_date
4018     AND ste.date_billed IS NULL;
4019 
4020   BEGIN
4021 	OPEN contract_num_csr(p_khr_id);
4022     FETCH contract_num_csr INTO l_contract_number;
4023     CLOSE contract_num_csr;
4024 
4025     IF l_contract_number IS NULL THEN
4026       Okl_Api.set_message(p_app_name     => g_app_name,
4027                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
4028       RAISE OKL_API.G_EXCEPTION_ERROR;
4029 	END IF;
4030 
4031     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
4032       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
4033 	  LOOP
4034 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_provision_date' THEN
4035           l_provision_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
4036         END IF;
4037       END LOOP;
4038 	ELSE
4039       Okl_Api.Set_Message(p_app_name     => g_app_name,
4040                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
4041       RAISE Okl_Api.G_EXCEPTION_ERROR;
4042 	END IF;
4043 
4044     IF l_provision_date IS NULL THEN
4045       Okl_Api.Set_Message(p_app_name     => g_app_name,
4046                           p_msg_name     => 'OKL_GLP_PROV_DATE_ERROR');
4047       RAISE Okl_Api.G_EXCEPTION_ERROR;
4048 	END IF;
4049 
4050     -- SGIYER
4051     -- UDS Impact
4052     OKL_STREAMS_UTIL.get_primary_stream_type(
4053       p_khr_id  		   	=> p_khr_id,
4054       p_primary_sty_purpose => 'RENT',
4055       x_return_status		=> l_return_status,
4056       x_primary_sty_id 		=> l_sty_id);
4057 
4058     IF l_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
4059       Okl_Api.set_message(p_app_name     => g_app_name,
4060                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
4061                           p_token1       => 'STREAM_NAME',
4062                           p_token1_value => 'RENT');
4063       RAISE Okl_Api.G_EXCEPTION_ERROR;
4064     END IF;
4065 
4066     OPEN get_unb_rec_csr(p_khr_id, l_provision_date, l_sty_id);
4067 	FETCH get_unb_rec_csr INTO l_rent_strm_bal;
4068     CLOSE get_unb_rec_csr;
4069 
4070     -- Bug 2969989. Return zero explicitly if nothing found.
4071     IF l_rent_strm_bal IS NULL THEN
4072       l_rent_strm_bal := 0;
4073 	END IF;
4074     RETURN l_rent_strm_bal;
4075 
4076   EXCEPTION
4077     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4078       RETURN NULL;
4079 
4080 	WHEN OTHERS THEN
4081       IF get_unb_rec_csr%ISOPEN THEN
4082         CLOSE get_unb_rec_csr;
4083       END IF;
4084       IF contract_num_csr%ISOPEN THEN
4085         CLOSE contract_num_csr;
4086       END IF;
4087       Okl_Api.SET_MESSAGE(
4088                         p_app_name     => G_APP_NAME,
4089                         p_msg_name     => G_UNEXPECTED_ERROR,
4090                         p_token1       => G_SQLCODE_TOKEN,
4091                         p_token1_value => SQLCODE,
4092                         p_token2       => G_SQLERRM_TOKEN,
4093                         p_token2_value => SQLERRM);
4094       RETURN NULL;
4095   END CONTRACT_UNBILLED_RECEIVABLES;
4096 
4097 ----------------------------------------------------------------------------------------------------
4098 
4099     -- Start of Comments
4100     -- Created By     : Shri Iyer
4101     -- Function Name  : CONTRACT_UNEARNED_REVENUE
4102     -- Description    : This function returns the unearned income for a contract as of a given date
4103     -- Dependencies   : None
4104     -- Parameters     : contract id, contract line id
4105     -- Version        : 1.0
4106     -- End of Commnets
4107 
4108 ----------------------------------------------------------------------------------------------------
4109 
4110   FUNCTION CONTRACT_UNEARNED_REVENUE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
4111     l_income_strm_bal       NUMBER := 0;
4112     l_contract_number       VARCHAR2(2000);
4113     l_provision_date        DATE;
4114     l_rent_sty_id           NUMBER;
4115     l_lease_inc_sty_id      NUMBER;
4116     l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4117 
4118     -- cursor to get the contract number
4119     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
4120     SELECT  contract_number
4121     FROM OKL_K_HEADERS_FULL_V
4122     WHERE id = p_ctr_id;
4123 
4124     -- changing stream type name from INCOME to PRE TAX INCOME as suggested by PM. BUG# 2671223
4125     -- correcting name. Its hould be PRE-TAX INCOME (with hyphen)
4126     -- Bug 2969989. Pre-Tax amount is negative by default. So taking absolute value.
4127     -- Bug 3126427. Removing absolute function.
4128     -- 02-Oct-2003. SGIYER. Added condition ste.stream_element_date >= p_date
4129     -- on product management's instructions.
4130     -- SGIYER. User defined streams project changes.09/22/04
4131     CURSOR get_unearn_rev_csr (p_ctr_id NUMBER, p_date DATE, p_rent_sty_id NUMBER, p_lease_inc_sty_id NUMBER) IS
4132     SELECT SUM(ste.amount)
4133     FROM OKL_STREAMS stm,
4134          OKL_STRM_ELEMENTS ste,
4135          OKL_STRM_TYPE_B sty
4136     WHERE stm.khr_id = p_ctr_id
4137     AND stm.sty_id = sty.id
4138     AND sty.id = p_lease_inc_sty_id
4139     AND stm.active_yn = 'Y'
4140     AND stm.say_code = 'CURR'
4141     AND ste.stm_id = stm.id
4142     AND ste.stream_element_date >=
4143       (SELECT TRUNC(MIN(ste.stream_element_date),'MM')
4144        FROM OKL_STREAMS stm,
4145             OKL_STRM_ELEMENTS ste,
4146             OKL_STRM_TYPE_B sty
4147        WHERE stm.khr_id = p_ctr_id
4148        AND stm.sty_id = sty.id
4149        AND sty.id = l_rent_sty_id
4150        AND stm.active_yn = 'Y'
4151        AND ste.stm_id = stm.id
4152 	   AND ste.stream_element_date >= p_date
4153        AND ste.date_billed IS NULL)
4154     AND ste.stream_element_date <=
4155        (SELECT LAST_DAY(MAX(ste.stream_element_date))
4156        FROM OKL_STREAMS stm,
4157             OKL_STRM_ELEMENTS ste,
4158             OKL_STRM_TYPE_B sty
4159        WHERE stm.khr_id = p_ctr_id
4160        AND stm.sty_id = sty.id
4161 	   AND sty.id = l_rent_sty_id
4162        AND stm.active_yn = 'Y'
4163        AND ste.stm_id = stm.id
4164        AND ste.stream_element_date >= p_date
4165        AND ste.date_billed IS NULL);
4166 
4167     --Bug# 15992711 , Start
4168     -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
4169     CURSOR get_unearn_rev_nr_csr (p_ctr_id NUMBER, p_date DATE, p_rent_sty_id NUMBER, p_lease_inc_sty_id NUMBER, p_line_type VARCHAR2) IS
4170     SELECT SUM(ste.amount)
4171     FROM OKL_STREAMS stm,
4172          OKL_STRM_ELEMENTS ste,
4173          OKL_STRM_TYPE_B sty,
4174          okc_k_lines_b   cle,
4175          okl_k_lines     kle
4176     WHERE stm.khr_id = p_ctr_id
4177     AND stm.sty_id = sty.id
4178     AND sty.id = p_lease_inc_sty_id
4179     AND stm.active_yn = 'Y'
4180     AND stm.say_code = 'CURR'
4181     AND ste.stm_id = stm.id
4182     AND ste.stream_element_date >=
4183       (SELECT TRUNC(MIN(ste.stream_element_date),'MM')
4184        FROM OKL_STREAMS stm,
4185             OKL_STRM_ELEMENTS ste,
4186             OKL_STRM_TYPE_B sty,
4187             okc_k_lines_b   cle,
4188             okl_k_lines     kle
4189        WHERE stm.khr_id = p_ctr_id
4190        AND stm.sty_id = sty.id
4191        AND sty.id = l_rent_sty_id
4192        AND stm.active_yn = 'Y'
4193        AND ste.stm_id = stm.id
4194 	   AND ste.stream_element_date >= p_date
4195        AND ste.date_billed IS NULL
4196        AND   cle.chr_id = stm.khr_id
4197        AND   cle.dnz_chr_id = stm.khr_id
4198        AND   cle.id = kle.id
4199        AND   NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y')
4200        )
4201     AND ste.stream_element_date <=
4202        (SELECT LAST_DAY(MAX(ste.stream_element_date))
4203        FROM OKL_STREAMS stm,
4204             OKL_STRM_ELEMENTS ste,
4205             OKL_STRM_TYPE_B sty,
4206             okc_k_lines_b   cle,
4207             okl_k_lines     kle
4208        WHERE stm.khr_id = p_ctr_id
4209        AND stm.sty_id = sty.id
4210 	   AND sty.id = l_rent_sty_id
4211        AND stm.active_yn = 'Y'
4212        AND ste.stm_id = stm.id
4213        AND ste.stream_element_date >= p_date
4214        AND ste.date_billed IS NULL
4215        AND   cle.chr_id = stm.khr_id
4216        AND   cle.dnz_chr_id = stm.khr_id
4217        AND   cle.id = kle.id
4218        AND   NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y')
4219        )
4220        AND   cle.chr_id = stm.khr_id
4221        AND   cle.dnz_chr_id = stm.khr_id
4222        AND   cle.id = kle.id
4223        AND   NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
4224 
4225     l_line_type VARCHAR2(30) := 'X';
4226     --Bug# 15992711 , End
4227 
4228 
4229   BEGIN
4230 	OPEN contract_num_csr(p_khr_id);
4231     FETCH contract_num_csr INTO l_contract_number;
4232     CLOSE contract_num_csr;
4233     IF l_contract_number IS NULL THEN
4234       Okl_Api.set_message(p_app_name     => g_app_name,
4235                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
4236       RAISE OKL_API.G_EXCEPTION_ERROR;
4237 	END IF;
4238 
4239     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
4240       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
4241 	  LOOP
4242 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_provision_date' THEN
4243           l_provision_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
4244         END IF;
4245 
4246         --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
4247         --                If set then based on its value set l_line_type
4248 
4249         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
4250            IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
4251               l_line_type := 'NEW'; --New
4252            ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
4253               l_line_type := 'RELEASE'; --Release
4254            END IF;
4255         END IF;
4256         --Bug# 15992711 , End
4257       END LOOP;
4258 	ELSE
4259       Okl_Api.Set_Message(p_app_name     => g_app_name,
4260                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
4261       RAISE Okl_Api.G_EXCEPTION_ERROR;
4262 	END IF;
4263 
4264     IF l_provision_date IS NULL THEN
4265       Okl_Api.Set_Message(p_app_name     => g_app_name,
4266                           p_msg_name     => 'OKL_GLP_PROV_DATE_ERROR');
4267       RAISE Okl_Api.G_EXCEPTION_ERROR;
4268 	END IF;
4269 
4270     -- SGIYER
4271     -- UDS Impact
4272     OKL_STREAMS_UTIL.get_primary_stream_type(
4273       p_khr_id  		   	=> p_khr_id,
4274       p_primary_sty_purpose => 'RENT',
4275       x_return_status		=> l_return_status,
4276       x_primary_sty_id 		=> l_rent_sty_id);
4277     IF l_return_status <> Okl_Api.G_RET_STS_SUCCESS THEN
4278       Okl_Api.set_message(p_app_name     => g_app_name,
4279                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
4280                           p_token1       => 'STREAM_NAME',
4281                           p_token1_value => 'RENT');
4282       RAISE Okl_Api.G_EXCEPTION_ERROR;
4283     END IF;
4284 
4285     -- SGIYER
4286     -- UDS Impact
4287     OKL_STREAMS_UTIL.get_dependent_stream_type(
4288             p_khr_id  		   	    => p_khr_id,
4289             p_primary_sty_purpose   => 'RENT',
4290             p_dependent_sty_purpose => 'LEASE_INCOME',
4291             x_return_status		    => l_return_status,
4292             x_dependent_sty_id      => l_lease_inc_sty_id);
4293     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4294       -- store SQL error message on message stack for caller and entry in log file
4295       Okl_Api.set_message(p_app_name     => g_app_name,
4296                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
4297 	                      p_token1       => 'STREAM_NAME',
4298 	                      p_token1_value => 'LEASE INCOME');
4299       RAISE Okl_Api.G_EXCEPTION_ERROR;
4300     END IF;
4301 
4302     --Bug# 15992711 , Start
4303     -- If l_line_type is set as either 'NEW' or 'RELEASE' call
4304     -- get_unearn_rev_nr_csr cursor in order to consider either only new
4305     -- assets or only re-leased assets, else no change in the standard behavior
4306 
4307     IF l_line_type IN ('NEW','RELEASE') THEN
4308 
4309        OPEN get_unearn_rev_nr_csr (p_khr_id, l_provision_date, l_rent_sty_id, l_lease_inc_sty_id, l_line_type);
4310        FETCH get_unearn_rev_nr_csr INTO l_income_strm_bal;
4311        CLOSE get_unearn_rev_nr_csr;
4312 
4313     ELSE
4314     --Bug# 15992711 , End
4315 
4316        OPEN get_unearn_rev_csr (p_khr_id, l_provision_date, l_rent_sty_id, l_lease_inc_sty_id);
4317        FETCH get_unearn_rev_csr INTO l_income_strm_bal;
4318        CLOSE get_unearn_rev_csr;
4319 
4320     --Bug# 15992711 , Start
4321     END IF;
4322     --Bug# 15992711 , End
4323 
4324     -- Bug 2969989. Return zero explicitly if nothing found.
4325     IF l_income_strm_bal IS NULL THEN
4326       l_income_strm_bal := 0;
4327 	END IF;
4328 
4329     RETURN l_income_strm_bal;
4330 
4331   EXCEPTION
4332     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4333 	RETURN NULL;
4334 
4335 	WHEN OTHERS THEN
4336       IF get_unearn_rev_csr%ISOPEN THEN
4337         CLOSE get_unearn_rev_csr;
4338       END IF;
4339       IF contract_num_csr%ISOPEN THEN
4340         CLOSE contract_num_csr;
4341       END IF;
4342       Okl_Api.SET_MESSAGE(
4343                         p_app_name     => G_APP_NAME,
4344                         p_msg_name     => G_UNEXPECTED_ERROR,
4345                         p_token1       => G_SQLCODE_TOKEN,
4346                         p_token1_value => SQLCODE,
4347                         p_token2       => G_SQLERRM_TOKEN,
4348                         p_token2_value => SQLERRM);
4349       RETURN NULL;
4350   END CONTRACT_UNEARNED_REVENUE;
4351 
4352 ----------------------------------------------------------------------------------------------------
4353 
4354     -- Start of Comments
4355     -- Created By     : Shri Iyer
4356     -- Function Name  : CONTRACT_UNGUARANTEED_RESIDUAL
4357     -- Description    : This function returns the unguaranteed residual for a contract
4358     -- Dependencies   : None
4359     -- Parameters     : contract id, contract line id
4360     -- Version        : 1.0
4361     -- End of Commnets
4362 
4363 ----------------------------------------------------------------------------------------------------
4364 
4365   FUNCTION CONTRACT_UNGUARANTEED_RESIDUAL(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
4366     l_unguaranteed_residual  NUMBER := 0;
4367     l_contract_number VARCHAR2(2000);
4368 
4369     -- cursor to get the contract number
4370     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
4371     SELECT  contract_number
4372     FROM OKL_K_HEADERS_FULL_V
4373     WHERE id = p_ctr_id;
4374 
4375     CURSOR get_ung_res_csr(p_ctr_id NUMBER) IS
4376     SELECT SUM(NVL(RESIDUAL_VALUE,0)) - SUM(NVL(RESIDUAL_GRNTY_AMOUNT, 0))
4377     FROM OKL_K_LINES_FULL_V
4378     WHERE DNZ_CHR_ID = p_ctr_id;
4379 
4380   BEGIN
4381 	OPEN contract_num_csr(p_khr_id);
4382     FETCH contract_num_csr INTO l_contract_number;
4383     IF contract_num_csr%NOTFOUND THEN
4384       CLOSE contract_num_csr;
4385       Okl_Api.set_message(p_app_name     => g_app_name,
4386                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
4387       RAISE OKL_API.G_EXCEPTION_ERROR;
4388 	END IF;
4389     CLOSE contract_num_csr;
4390 
4391     OPEN get_ung_res_csr(p_khr_id);
4392     FETCH get_ung_res_csr INTO l_unguaranteed_residual;
4393     IF get_ung_res_csr%NOTFOUND THEN
4394       Okl_Api.Set_Message(p_app_name     => g_app_name,
4395                           p_msg_name     => 'OKL_LPV_FE_UNG_RES',
4396                           p_token1       => 'CONTRACT_NUMBER',
4397                           p_token1_value => l_contract_number);
4398       CLOSE get_ung_res_csr;
4399 	  RAISE OKL_API.G_EXCEPTION_ERROR;
4400 	END IF;
4401 	CLOSE get_ung_res_csr;
4402 
4403     -- Bug 2969989. Return zero explicitly if nothing found.
4404     IF l_unguaranteed_residual IS NULL THEN
4405       l_unguaranteed_residual := 0;
4406 	END IF;
4407 
4408     RETURN l_unguaranteed_residual;
4409 
4410   EXCEPTION
4411     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4412 	RETURN NULL;
4413 
4414 	WHEN OTHERS THEN
4415                Okl_Api.SET_MESSAGE(
4416                         p_app_name     => G_APP_NAME,
4417                         p_msg_name     => G_UNEXPECTED_ERROR,
4418                         p_token1       => G_SQLCODE_TOKEN,
4419                         p_token1_value => SQLCODE,
4420                         p_token2       => G_SQLERRM_TOKEN,
4421                         p_token2_value => SQLERRM);
4422                 RETURN NULL;
4423   END CONTRACT_UNGUARANTEED_RESIDUAL;
4424 
4425 ----------------------------------------------------------------------------------------------------
4426 
4427     -- Start of Comments
4428     -- Created By     : Shri Iyer
4429     -- Function Name  : CONTRACT_UNACCRUED_SUBSIDY
4430     -- Description    : This function returns the unaccrued portion of the subsidy streams for a
4431     --                  given contract on a particular date
4432     -- Dependencies   : None
4433     -- Parameters     : contract id, contract line id
4434     -- Version        : 1.0
4435     -- End of Commnets
4436 
4437 ----------------------------------------------------------------------------------------------------
4438 
4439   FUNCTION CONTRACT_UNACCRUED_SUBSIDY(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
4440     l_unaccrued_subsidy       NUMBER := 0;
4441     l_contract_number         VARCHAR2(2000);
4442 	l_provision_date          DATE;
4443     l_subsidy_inc_id          NUMBER;
4444     l_return_status           VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4445 
4446     -- cursor to get the contract number
4447     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
4448     SELECT  contract_number
4449     FROM OKL_K_HEADERS_FULL_V
4450     WHERE id = p_ctr_id;
4451 
4452     -- cursor to get unaccrued subsidy for a contract
4453     CURSOR unaccrued_subsidy_csr(p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE, p_date DATE, p_subsidy_inc_id NUMBER) IS
4454     SELECT SUM(ste.amount)
4455     FROM OKL_STRM_ELEMENTS ste,
4456          OKL_STRM_TYPE_B sty,
4457          OKL_STREAMS stm
4458     WHERE stm.khr_id = p_ctr_id
4459     AND stm.sty_id = sty.id
4460     AND sty.id = p_subsidy_inc_id
4461     AND stm.active_yn = 'Y'
4462     AND stm.say_code = 'CURR'
4463     AND stm.id = ste.stm_id
4464     AND ste.accrued_yn IS NULL
4465     AND ste.stream_element_date <= p_date;
4466 
4467 
4468   BEGIN
4469 
4470 	OPEN contract_num_csr(p_khr_id);
4471     FETCH contract_num_csr INTO l_contract_number;
4472     CLOSE contract_num_csr;
4473 
4474     IF l_contract_number IS NULL THEN
4475       Okl_Api.set_message(p_app_name     => g_app_name,
4476                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
4477       RAISE OKL_API.G_EXCEPTION_ERROR;
4478 	END IF;
4479 
4480     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
4481       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
4482 	  LOOP
4483 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_provision_date' THEN
4484           l_provision_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
4485         END IF;
4486       END LOOP;
4487 	ELSE
4488       Okl_Api.Set_Message(p_app_name     => g_app_name,
4489                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
4490       RAISE Okl_Api.G_EXCEPTION_ERROR;
4491 	END IF;
4492 
4493     IF l_provision_date IS NULL THEN
4494       Okl_Api.Set_Message(p_app_name     => g_app_name,
4495                           p_msg_name     => 'OKL_GLP_PROV_DATE_ERROR');
4496       RAISE Okl_Api.G_EXCEPTION_ERROR;
4497 	END IF;
4498 
4499     -- Bug 4053623.
4500 	-- Modifying error handling.
4501     OKL_STREAMS_UTIL.get_dependent_stream_type(
4502             p_khr_id  		   	    => p_khr_id,
4503             p_primary_sty_purpose   => 'SUBSIDY',
4504             p_dependent_sty_purpose => 'SUBSIDY_INCOME',
4505             x_return_status		    => l_return_status,
4506             x_dependent_sty_id      => l_subsidy_inc_id);
4507     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4508       IF l_return_status = OKL_API.G_RET_STS_ERROR THEN
4509         -- subsidy income stream not defined for the contract
4510         l_unaccrued_subsidy := 0;
4511         RETURN l_unaccrued_subsidy;
4512       ELSIF l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4513         -- store SQL error message on message stack for caller and entry in log file
4514         Okl_Api.set_message(p_app_name     => g_app_name,
4515                             p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
4516 	                        p_token1       => 'STREAM_NAME',
4517 	                        p_token1_value => 'SUBSIDY INCOME');
4518         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4519       END IF;
4520     END IF;
4521 
4522     IF l_subsidy_inc_id IS NOT NULL THEN
4523       OPEN unaccrued_subsidy_csr (p_khr_id, l_provision_date, l_subsidy_inc_id);
4524       FETCH unaccrued_subsidy_csr INTO l_unaccrued_subsidy;
4525       CLOSE unaccrued_subsidy_csr;
4526     END IF;
4527     IF l_unaccrued_subsidy IS NULL THEN
4528       l_unaccrued_subsidy := 0;
4529 	END IF;
4530 
4531     RETURN l_unaccrued_subsidy;
4532 
4533   EXCEPTION
4534     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4535       RETURN NULL;
4536 
4537 	WHEN OTHERS THEN
4538       IF unaccrued_subsidy_csr%ISOPEN THEN
4539         CLOSE unaccrued_subsidy_csr;
4540       END IF;
4541       IF contract_num_csr%ISOPEN THEN
4542         CLOSE contract_num_csr;
4543       END IF;
4544       Okl_Api.SET_MESSAGE(
4545                         p_app_name     => G_APP_NAME,
4546                         p_msg_name     => G_UNEXPECTED_ERROR,
4547                         p_token1       => G_SQLCODE_TOKEN,
4548                         p_token1_value => SQLCODE,
4549                         p_token2       => G_SQLERRM_TOKEN,
4550                         p_token2_value => SQLERRM);
4551       RETURN NULL;
4552   END CONTRACT_UNACCRUED_SUBSIDY;
4553 
4554   FUNCTION CONTRACT_TOTAL_ACTUAL_INT(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
4555 
4556 	l_accrual_date            DATE;
4557     l_total_actual_int      NUMBER;
4558     l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4559 
4560   BEGIN
4561 
4562 
4563     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
4564       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
4565 	  LOOP
4566 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_accrual_date' THEN
4567           l_accrual_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
4568         END IF;
4569       END LOOP;
4570 	ELSE
4571       Okl_Api.Set_Message(p_app_name     => g_app_name,
4572                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
4573       RAISE Okl_Api.G_EXCEPTION_ERROR;
4574 	END IF;
4575 
4576     IF l_accrual_date IS NULL THEN
4577       Okl_Api.Set_Message(p_app_name     => g_app_name,
4578                           p_msg_name     => 'OKL_AGN_DATE_ERROR');
4579       RAISE Okl_Api.G_EXCEPTION_ERROR;
4580 	END IF;
4581 
4582     l_total_actual_int := OKL_VARIABLE_INT_UTIL_PVT.get_interest_due(
4583                                x_return_status => l_return_status,
4584                                p_khr_id => p_khr_id,
4585                                p_to_date => l_accrual_date);
4586 
4587     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4588       -- store SQL error message on message stack for caller and entry in log file
4589       Okl_Api.set_message(p_app_name     => g_app_name,
4590                          p_msg_name     => 'OKL_AGN_VAR_INT_UTIL_ERROR',
4591                          p_token1       => 'ERROR_STATUS',
4592                          p_token1_value => l_return_status);
4593       RAISE Okl_Api.G_EXCEPTION_ERROR;
4594     ELSE
4595       IF (l_total_actual_int IS NULL) OR (l_total_actual_int = 0) THEN
4596         Okl_Api.Set_Message(p_app_name     => g_app_name,
4597                             p_msg_name     => 'OKL_AGN_TOT_VAR_INT_ERROR');
4598         RAISE OKL_API.G_EXCEPTION_ERROR;
4599       END IF;
4600     END IF;
4601 
4602     RETURN l_total_actual_int;
4603 
4604   EXCEPTION
4605     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4606       RETURN NULL;
4607 
4608 	WHEN OTHERS THEN
4609       Okl_Api.SET_MESSAGE(
4610                         p_app_name     => G_APP_NAME,
4611                         p_msg_name     => G_UNEXPECTED_ERROR,
4612                         p_token1       => G_SQLCODE_TOKEN,
4613                         p_token1_value => SQLCODE,
4614                         p_token2       => G_SQLERRM_TOKEN,
4615                         p_token2_value => SQLERRM);
4616       RETURN NULL;
4617 
4618   END CONTRACT_TOTAL_ACTUAL_INT;
4619 
4620 ----------------------------------------------------------------------------------------------------
4621 
4622     -- Start of Comments
4623     -- Created By     : Shri Iyer
4624     -- Function Name  : CONTRACT_TOTAL_ACCRUED_INT
4625     -- Description    : This function returns the total accrued amount for a
4626     --                  given contract on a particular date
4627     -- Dependencies   : None
4628     -- Parameters     : contract id, contract line id
4629     -- Version        : 1.0
4630     -- End of Commnets
4631 
4632 ----------------------------------------------------------------------------------------------------
4633 
4634   FUNCTION CONTRACT_TOTAL_ACCRUED_INT(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
4635     l_total_accrued           NUMBER := 0;
4636     l_contract_number         VARCHAR2(2000);
4637 	l_accrual_date            DATE;
4638     l_sty_id                  NUMBER;
4639     l_return_status         VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
4640 
4641     -- cursor to get the contract number
4642     CURSOR contract_num_csr (p_ctr_id OKL_K_HEADERS_FULL_V.ID%TYPE) IS
4643     SELECT  contract_number
4644     FROM OKL_K_HEADERS_FULL_V
4645     WHERE id = p_ctr_id;
4646 
4647 
4648     -- cursor to get unaccrued subsidy for a contract
4649     --sechawla 19-sep-09 8830506 : added new parameter cp_rep_type
4650     CURSOR total_accrued_csr(p_ctr_id NUMBER, p_date DATE, p_sty_id NUMBER, cp_rep_type IN VARCHAR2) IS
4651     SELECT SUM(trx.amount)
4652     FROM OKL_TRX_CONTRACTS trx,
4653          OKL_TRX_TYPES_V try,
4654          OKL_TXL_CNTRCT_LNS txl
4655     WHERE trx.khr_id = p_ctr_id
4656  --Fixed Bug 5707866 SLA Uptake Project by nikshah, changed tsu_code to PROCESSED from ENTERED
4657     AND trx.tsu_code ='PROCESSED'
4658     AND trx.try_id = try.id
4659     --AND trx.representation_type = 'PRIMARY' -- MGAAP OTHER 7263041 --sechawla 19-sep-09 8830506
4660     AND trx.representation_type = cp_rep_type --sechawla 19-sep-09 8830506
4661     AND try.name = 'Accrual'
4662     AND trx.date_transaction_occurred <= p_date
4663     AND trx.id = txl.tcn_id
4664     AND txl.sty_id = p_sty_id;
4665 
4666     l_rep_type   VARCHAR2(20); --sechawla 19-Sep-09 8830506 :added
4667 
4668   BEGIN
4669 
4670 	OPEN contract_num_csr(p_khr_id);
4671     FETCH contract_num_csr INTO l_contract_number;
4672     CLOSE contract_num_csr;
4673 
4674     IF l_contract_number IS NULL THEN
4675       Okl_Api.set_message(p_app_name     => g_app_name,
4676                           p_msg_name     => 'OKL_REV_LPV_CNTRCT_NUM_ERROR');
4677       RAISE OKL_API.G_EXCEPTION_ERROR;
4678 	END IF;
4679 
4680 	IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
4681       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
4682 	  LOOP
4683 	    IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_accrual_date' THEN
4684           l_accrual_date := TO_DATE(Okl_Execute_Formula_Pub.g_additional_parameters(i).value, 'MM/DD/YYYY');
4685         END IF;
4686         --sechawla 19-Sep-09 8830506 : added a new parameter
4687         IF Okl_Execute_Formula_Pub.g_additional_parameters(i).name = 'p_rep_type' THEN
4688           l_rep_type := Okl_Execute_Formula_Pub.g_additional_parameters(i).value;
4689         END IF;
4690       END LOOP;
4691 	ELSE
4692       Okl_Api.Set_Message(p_app_name     => g_app_name,
4693                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
4694       RAISE Okl_Api.G_EXCEPTION_ERROR;
4695 	END IF;
4696 
4697 	--sechawla 21-sep-09 8830506
4698 	IF    l_rep_type = 'PRIMARY' THEN
4699           OKL_STREAMS_UTIL.get_dependent_stream_type(
4700             p_khr_id  		   	    => p_khr_id,
4701             p_primary_sty_purpose   => 'RENT',
4702             p_dependent_sty_purpose => 'ACTUAL_INCOME_ACCRUAL',
4703             x_return_status		    => l_return_status,
4704             x_dependent_sty_id      => l_sty_id);
4705     ELSIF l_rep_type = 'SECONDARY' THEN
4706           OKL_STREAMS_UTIL.get_dependent_stream_type_rep(
4707             p_khr_id  		   	    => p_khr_id,
4708             p_primary_sty_purpose   => 'RENT',
4709             p_dependent_sty_purpose => 'ACTUAL_INCOME_ACCRUAL',
4710             x_return_status		    => l_return_status,
4711             x_dependent_sty_id      => l_sty_id);
4712     END IF;
4713 
4714     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4715       -- store SQL error message on message stack for caller and entry in log file
4716       Okl_Api.set_message(p_app_name     => g_app_name,
4717                           p_msg_name     => 'OKL_AGN_STRM_TYPE_ERROR',
4718                           p_token1       => 'STREAM_NAME',
4719 	                      p_token1_value => 'Actual Income Accrual');
4720       RAISE Okl_Api.G_EXCEPTION_ERROR;
4721     END IF;
4722 
4723 
4724 
4725     IF l_accrual_date IS NULL THEN
4726       Okl_Api.Set_Message(p_app_name     => g_app_name,
4727                           p_msg_name     => 'OKL_AGN_DATE_ERROR');
4728       RAISE Okl_Api.G_EXCEPTION_ERROR;
4729 	END IF;
4730 
4731 	OPEN total_accrued_csr(p_khr_id, l_accrual_date, l_sty_id, l_rep_type); --sechawla 19-Sep-09 8830506 : added l_rep_type
4732     FETCH total_accrued_csr INTO l_total_accrued;
4733     CLOSE total_accrued_csr;
4734 
4735     IF l_total_accrued IS NULL THEN
4736       l_total_accrued := 0;
4737     END IF;
4738 
4739     RETURN l_total_accrued;
4740 
4741   EXCEPTION
4742     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4743       RETURN NULL;
4744 
4745 	WHEN OTHERS THEN
4746       IF total_accrued_csr%ISOPEN THEN
4747         CLOSE total_accrued_csr;
4748       END IF;
4749       Okl_Api.SET_MESSAGE(
4750                         p_app_name     => G_APP_NAME,
4751                         p_msg_name     => G_UNEXPECTED_ERROR,
4752                         p_token1       => G_SQLCODE_TOKEN,
4753                         p_token1_value => SQLCODE,
4754                         p_token2       => G_SQLERRM_TOKEN,
4755                         p_token2_value => SQLERRM);
4756       RETURN NULL;
4757   END CONTRACT_TOTAL_ACCRUED_INT;
4758 
4759 ------------------------------------------------------------------------------
4760   -- Start of Comments
4761   -- Created By:    [email protected] - 20-FEB-2002
4762   -- Function Name: contract_estimate_tax
4763   -- Description:   Estimate tax using ARP-CRM integration routines
4764   -- Dependencies:  OKL building blocks AMTX and AMUV,
4765   -- Parameters:    IN:  p_contract_id, p_contract_line_id,
4766   --                     taxable_amount (stored in g_additional_parameters(1))
4767   --                OUT: amount
4768   -- History        : RMUNJULU 3394507 Get the loc_id for location_id and pass to Tax engine
4769   --                : RMUNJULU 3394507 Performance fix, changed cursor to query fron base tables
4770   --                  instead of _uv
4771   --                : RMUNJULU 3394507 added code
4772   --                  to reset the arp_tax.tax_info_rec before it is called
4773   --                  Also added code to set the location_id based on bill_to_site
4774   --                  for contract level quote line tax calculation
4775   --                : GKADARKA 3569441 Added union in cursor l_item_loc_csr
4776   --                : rmunjulu 3682465 Changed to get and set the bill_to_postal_code
4777   -- Version:       1.0
4778   -- End of Commnets
4779 ------------------------------------------------------------------------------
4780 
4781 FUNCTION contract_estimate_tax (
4782 	p_contract_id		IN NUMBER,
4783 	p_contract_line_id	IN NUMBER)
4784 	RETURN NUMBER IS
4785 
4786 	-- Get location of all Installed Base items
4787 	-- linked to the Financial Asset Line
4788     -- RMUNJULU 3394507 Changed the cursor to get the loc_id (location ccid) for
4789     -- org_id and location_id
4790     -- RMUNJULU 3394507 Performance fix, query from base tables instead of
4791     -- from _uv
4792 /*
4793 	CURSOR l_item_loc_csr (cp_fin_asset_cle_id NUMBER) IS
4794     SELECT DISTINCT LOA.loc_id location_id, LOC.postal_code -- 3682465
4795     FROM OKC_K_LINES_B        KLE_FA,
4796          OKC_LINE_STYLES_B    LSE_FA,
4797          OKC_K_LINES_B        KLE_IL,
4798          OKC_LINE_STYLES_B    LSE_IL,
4799          OKC_K_LINES_B        KLE_IB,
4800          OKC_LINE_STYLES_B    LSE_IB,
4801          OKC_K_ITEMS          ITE,
4802          CSI_ITEM_INSTANCES   CII,
4803          HZ_PARTY_SITES       PSI,
4804          HZ_LOCATIONS         LOC,
4805       --   HZ_PARTIES           PAR,
4806          HZ_PARTY_SITE_USES   PSU,
4807          HZ_LOC_ASSIGNMENTS   LOA
4808     WHERE kle_fa.id	=  cp_fin_asset_cle_id
4809     AND   lse_fa.id = kle_fa.lse_id
4810     AND   lse_fa.lty_code = 'FREE_FORM1'
4811     AND   kle_il.cle_id = kle_fa.id
4812     AND   lse_il.id = kle_il.lse_id
4813     AND   lse_il.lty_code = 'FREE_FORM2'
4814     AND   kle_ib.cle_id = kle_il.id
4815     AND   lse_ib.id = kle_ib.lse_id
4816     AND   lse_ib.lty_code = 'INST_ITEM'
4817     AND   ite.cle_id = kle_ib.id
4818     AND   ite.jtot_object1_code = 'OKX_IB_ITEM'
4819     AND   cii.instance_id = ite.object1_id1
4820     AND   cii.install_location_type_code = 'HZ_PARTY_SITES'
4821     AND   psi.party_site_id = cii.install_location_id
4822     AND   loc.location_id = psi.location_id
4823  --   AND   par.party_id = psi.party_id
4824     AND   psu.party_site_id = psi.party_site_id
4825     AND   psu.site_use_type = 'INSTALL_AT'
4826     AND   loc.location_id = loa.location_id
4827     UNION
4828     SELECT DISTINCT LOA.loc_id location_id, LOC.postal_code -- 3682465
4829     FROM OKC_K_LINES_B        KLE_FA,
4830          OKC_LINE_STYLES_B    LSE_FA,
4831          OKC_K_LINES_B        KLE_IL,
4832          OKC_LINE_STYLES_B    LSE_IL,
4833          OKC_K_LINES_B        KLE_IB,
4834          OKC_LINE_STYLES_B    LSE_IB,
4835          OKC_K_ITEMS          ITE,
4836          CSI_ITEM_INSTANCES   CII,
4837          --HZ_PARTY_SITES       PSI,
4838          HZ_LOCATIONS         LOC,
4839          --HZ_PARTIES           PAR,
4840          --HZ_PARTY_SITE_USES   PSU,
4841          HZ_LOC_ASSIGNMENTS   LOA
4842     WHERE kle_fa.id	=  cp_fin_asset_cle_id
4843     AND   lse_fa.id = kle_fa.lse_id
4844     AND   lse_fa.lty_code = 'FREE_FORM1'
4845     AND   kle_il.cle_id = kle_fa.id
4846     AND   lse_il.id = kle_il.lse_id
4847     AND   lse_il.lty_code = 'FREE_FORM2'
4848     AND   kle_ib.cle_id = kle_il.id
4849     AND   lse_ib.id = kle_ib.lse_id
4850     AND   lse_ib.lty_code = 'INST_ITEM'
4851     AND   ite.cle_id = kle_ib.id
4852     AND   ite.jtot_object1_code = 'OKX_IB_ITEM'
4853     AND   cii.instance_id = ite.object1_id1
4854     AND   cii.install_location_type_code = 'HZ_LOCATIONS'
4855     AND   loc.location_id = cii.install_location_id
4856     --AND   loc.location_id = psi.location_id
4857     --AND   par.party_id = psi.party_id
4858     --AND   psu.party_site_id = psi.party_site_id
4859     --AND   psu.site_use_type = 'INSTALL_AT'
4860     AND   loc.location_id = loa.location_id
4861     AND   EXISTS (SELECT 1
4862                   FROM   HZ_PARTY_SITES psi,
4863                          HZ_PARTY_SITE_USES psu
4864                   WHERE  psi.location_id = loc.location_id
4865                   AND    psu.party_site_id = psi.party_site_id
4866                   AND    psu.site_use_type = 'INSTALL_AT');
4867 
4868   -- RMUNJULU 3394507 Added cursor to get the location for the LESSEE bill to
4869   -- Get the location_id (location_ccid) for the customer bill_to
4870   CURSOR  item_loc_csr ( p_bill_to_site_use_id IN NUMBER, p_cust_acct_id IN NUMBER) IS
4871   SELECT  loc_assign.loc_id  location_id, LOC.postal_code -- 3682465
4872   FROM    HZ_PARTY_SITES            party_site,
4873           HZ_LOC_ASSIGNMENTS        loc_assign,
4874           HZ_LOCATIONS              loc,
4875           HZ_CUST_ACCT_SITES_ALL    acct_site,
4876           HZ_PARTIES                party,
4877           HZ_CUST_ACCOUNTS          cust_acct,
4878           HZ_CUST_SITE_USES         cust_site_uses
4879   WHERE   acct_site.party_site_id     = party_site.party_site_id
4880   AND     loc.location_id             = party_site.location_id
4881   AND     loc.location_id             = loc_assign.location_id
4882   AND     acct_site.cust_acct_site_id = cust_site_uses.cust_acct_site_id
4883   AND     party.party_id              = cust_acct.party_id
4884   AND     cust_site_uses.site_use_id  = p_bill_to_site_use_id
4885   AND     cust_acct.cust_account_id   = p_cust_acct_id;
4886 
4887 	-- Get line name to use in the error messages
4888 	CURSOR l_cle_csr (cp_cle_id NUMBER) IS
4889 		SELECT	l.name
4890 		FROM	okc_k_lines_v l
4891 		WHERE	l.id = cp_cle_id;
4892 
4893 	-- Get header number to use in error messages
4894 	CURSOR l_chr_csr (cp_chr_id NUMBER) IS
4895 		SELECT	h.contract_number
4896 		FROM	okc_k_headers_v h
4897 		WHERE	h.id = cp_chr_id;
4898 
4899 	l_result_amount		NUMBER		:= 0;
4900 	l_no_taxable_amount	EXCEPTION;
4901 	l_no_sys_params		EXCEPTION;
4902 	l_tax_tbl		ARP_TAX.om_tax_out_tab_type;
4903 	l_bill_to_rec		okx_cust_site_uses_v%ROWTYPE;
4904 	l_return_status		VARCHAR2(1)	:= OKL_API.G_RET_STS_SUCCESS;
4905 	l_overall_status	VARCHAR2(1)	:= OKL_API.G_RET_STS_SUCCESS;
4906 	l_object_name		VARCHAR2(200);
4907 	l_token			VARCHAR2(30);
4908 
4909 	-- Variables to pass to taxation API
4910 	l_taxable_amount	NUMBER		:= NULL;
4911 	l_org_id		NUMBER		:= NULL;
4912 	l_sob_id		NUMBER		:= NULL;
4913 	l_currency		VARCHAR2(15)	:= NULL;
4914 	l_precision		NUMBER		:= NULL;
4915 	l_min_acc_unit		NUMBER		:= NULL;
4916 	l_cust_site_use_id	NUMBER		:= NULL;
4917 	l_cust_account_id	NUMBER		:= NULL;
4918 	l_location_id		NUMBER		:= NULL;
4919 
4920     -- RMUNJULU 3394507 Declared variable for tax_info_rec_type which will be used
4921     -- to reset the global variable
4922     l_tax_rec   arp_tax.tax_info_rec_type;
4923     l_postal_code HZ_LOCATIONS.postal_code%TYPE; -- 3682465
4924 */
4925 BEGIN
4926 
4927 	-- ***********************************
4928 	-- Get Object to use in error messages
4929 	-- ***********************************
4930 /*
4931 	IF p_contract_line_id IS NOT NULL THEN
4932 		OPEN	l_cle_csr (p_contract_line_id);
4933 		FETCH	l_cle_csr INTO l_object_name;
4934 		CLOSE	l_cle_csr;
4935 		l_token	:= 'contract_line_id';
4936 	ELSE
4937 		OPEN	l_chr_csr (p_contract_id);
4938 		FETCH	l_chr_csr INTO l_object_name;
4939 		CLOSE	l_chr_csr;
4940 		l_token	:= 'contract_id';
4941 	END IF;
4942 
4943 	IF l_object_name IS NULL THEN
4944 		l_overall_status := OKL_API.G_RET_STS_ERROR;
4945 		OKC_API.SET_MESSAGE (
4946 			p_app_name	=> OKC_API.G_APP_NAME,
4947 			p_msg_name	=> OKC_API.G_INVALID_VALUE,
4948 			p_token1	=> OKC_API.G_COL_NAME_TOKEN,
4949 			p_token1_value	=> l_token);
4950 	END IF;
4951 
4952 	-- ********************************************
4953 	-- Extract Taxable Amount from global variables
4954 	-- ********************************************
4955 
4956 	BEGIN
4957 
4958 	    IF  okl_execute_formula_pub.g_additional_parameters(1).name
4959 			= 'TAXABLE AMOUNT'
4960 	    AND okl_execute_formula_pub.g_additional_parameters(1).value
4961 			IS NOT NULL
4962 	    THEN
4963 		l_taxable_amount := TO_NUMBER
4964 			(okl_execute_formula_pub.g_additional_parameters(1).value);
4965 	    ELSE
4966 		RAISE l_no_taxable_amount;
4967 	    END IF;
4968 
4969 	    IF  NVL (l_taxable_amount, 0) = 0 THEN
4970 		RAISE l_no_taxable_amount;
4971 	    END IF;
4972 
4973 	EXCEPTION
4974 	    WHEN OTHERS THEN
4975 		l_overall_status := OKL_API.G_RET_STS_ERROR;
4976 		OKL_API.SET_MESSAGE (
4977 			p_app_name	=> OKL_API.G_APP_NAME,
4978 			p_msg_name	=> 'OKL_AM_TAX_NO_TAXABLE_AMOUNT',
4979 			p_token1	=> 'OBJECT',
4980 			p_token1_value	=> l_object_name);
4981 	END;
4982 
4983 	-- **************************************************
4984 	-- Get all generic parameters required by taxation API
4985 	-- **************************************************
4986 
4987 	BEGIN
4988 
4989 	    l_org_id   := okl_am_util_pvt.get_chr_org_id (p_contract_id);
4990 	    l_sob_id   := okc_currency_api.get_ou_sob (l_org_id);
4991 	    l_currency := okc_currency_api.get_sob_currency (l_sob_id);
4992 	    okl_am_util_pvt.get_currency_info
4993 			(l_currency, l_precision, l_min_acc_unit);
4994 
4995 	    IF l_sob_id IS NULL OR l_precision IS NULL THEN
4996 		RAISE l_no_sys_params;
4997 	    END IF;
4998 
4999 	EXCEPTION
5000 	    WHEN OTHERS THEN
5001 		l_overall_status := OKL_API.G_RET_STS_ERROR;
5002 		OKL_API.SET_MESSAGE (
5003 			p_app_name	=> OKL_API.G_APP_NAME,
5004 			p_msg_name	=> 'OKL_AM_TAX_NO_PARAMS',
5005 			p_token1	=> 'OBJECT',
5006 			p_token1_value	=> l_object_name);
5007 	END;
5008 
5009 	-- *****************************************************
5010 	-- Get line specific parameters required by taxation API
5011 	-- *****************************************************
5012 
5013 	IF  (p_contract_line_id IS NOT NULL)
5014 	AND (l_object_name IS NOT NULL) THEN
5015 
5016 		OPEN	l_item_loc_csr (p_contract_line_id);
5017 
5018 		LOOP
5019 			FETCH	l_item_loc_csr INTO l_location_id, l_postal_code; -- 3682465
5020 			EXIT  WHEN l_item_loc_csr%NOTFOUND
5021 				OR l_item_loc_csr%ROWCOUNT > 1;
5022 		END LOOP;
5023 
5024 		IF l_item_loc_csr%ROWCOUNT <> 1
5025 		OR l_location_id IS NULL THEN
5026 			l_overall_status := OKL_API.G_RET_STS_ERROR;
5027 			OKL_API.SET_MESSAGE (
5028 				p_app_name	=> OKL_API.G_APP_NAME,
5029 				p_msg_name	=> 'OKL_AM_TAX_NO_LOCATION',
5030 				p_token1	=> 'OBJECT',
5031 				p_token1_value	=> l_object_name);
5032 		END IF;
5033 
5034 		CLOSE	l_item_loc_csr;
5035 
5036 	-- *********************************************************
5037 	-- Get contract specific parameters required by taxation API
5038 	-- *********************************************************
5039 
5040 	ELSIF (p_contract_line_id IS NULL) THEN
5041 
5042 		okl_am_util_pvt.get_bill_to_address (
5043 			p_contract_id		=> p_contract_id,
5044 			p_message_yn		=> FALSE,
5045 			x_bill_to_address_rec	=> l_bill_to_rec,
5046 			x_return_status		=> l_return_status);
5047 
5048 		IF l_return_status = OKL_API.G_RET_STS_SUCCESS THEN
5049 			l_cust_site_use_id := l_bill_to_rec.id1;
5050 			l_cust_account_id  := l_bill_to_rec.cust_account_id;
5051 		END IF;
5052 
5053 		IF l_return_status <> OKL_API.G_RET_STS_SUCCESS
5054 		OR l_cust_site_use_id IS NULL
5055 		OR l_cust_account_id  IS NULL THEN
5056 			l_overall_status := OKL_API.G_RET_STS_ERROR;
5057 			OKL_API.SET_MESSAGE (
5058 				p_app_name	=> OKL_API.G_APP_NAME,
5059 				p_msg_name	=> 'OKL_AM_TAX_NO_BILL_TO',
5060 				p_token1	=> 'OBJECT',
5061 				p_token1_value	=> l_object_name);
5062 		END IF;
5063 
5064 	END IF;
5065 
5066 	-- *****************
5067 	-- Call taxation API
5068 	-- *****************
5069 
5070     -- RMUNJULU 3394507 Reset the GLOBAL tax_info_rec rec type with empty rec type
5071     arp_tax.tax_info_rec := l_tax_rec;
5072 
5073 	-- Calculate tax for positive amounts
5074 	IF  l_overall_status = OKL_API.G_RET_STS_SUCCESS
5075 	AND l_taxable_amount > 0 THEN
5076 
5077 	    arp_tax.tax_info_rec.trx_date		:= SYSDATE;
5078 	    arp_tax.tax_info_rec.extended_amount	:= l_taxable_amount;
5079 	    arp_tax.tax_info_rec.trx_currency_code	:= l_currency;
5080 	    arp_tax.tax_info_rec.PRECISION		:= l_precision;
5081 	    arp_tax.tax_info_rec.minimum_accountable_unit := l_min_acc_unit;
5082 
5083 	    IF p_contract_line_id IS NOT NULL THEN
5084 
5085 		    arp_tax.tax_info_rec.bill_to_location_id := l_location_id;
5086 
5087             arp_tax.tax_info_rec.bill_to_postal_code := l_postal_code; -- 3682465
5088 
5089 	    ELSE
5090 		    arp_tax.tax_info_rec.bill_to_site_use_id := l_cust_site_use_id;
5091 		    arp_tax.tax_info_rec.bill_to_cust_id	 := l_cust_account_id;
5092 
5093             -- RMUNJULU  3394507 Found that Tax engine also needs the location_id
5094             -- for the bill to location, added code to get and set that value
5095             -- get the location for the LESSEE bill to
5096             OPEN item_loc_csr ( l_cust_site_use_id, l_cust_account_id);
5097             FETCH item_loc_csr INTO l_location_id, l_postal_code; -- 3682465
5098             CLOSE item_loc_csr;
5099 
5100             -- raise message if site location not found
5101             IF l_location_id IS NULL THEN
5102 			 OKL_API.SET_MESSAGE (
5103 				p_app_name	=> OKL_API.G_APP_NAME,
5104 				p_msg_name	=> 'OKL_AM_TAX_NO_LOCATION',
5105 				p_token1	=> 'OBJECT',
5106 				p_token1_value	=> l_object_name);
5107             END IF;
5108 
5109             -- set the tax_info_rec with location id
5110 		    arp_tax.tax_info_rec.bill_to_location_id := l_location_id;
5111 
5112             arp_tax.tax_info_rec.bill_to_postal_code := l_postal_code; -- 3682465
5113 
5114 	    END IF;
5115 
5116 	    BEGIN
5117 		arp_tax_crm_integration_pkg.summary
5118 			(p_set_of_books_id 	=>	l_sob_id
5119 			,x_crm_tax_out_tbl	=>	l_tax_tbl
5120 			,p_new_tax_amount	=>	l_result_amount);
5121 	    EXCEPTION
5122 		WHEN OTHERS THEN
5123 		    l_overall_status := OKL_API.G_RET_STS_ERROR;
5124 		    OKL_API.SET_MESSAGE (
5125 			p_app_name	=> OKL_API.G_APP_NAME,
5126 			p_msg_name	=> 'OKL_AM_TAX_ARP_FAILED',
5127 			p_token1	=> 'OBJECT',
5128 			p_token1_value	=> l_object_name);
5129 	    END;
5130 
5131 	END IF;
5132 
5133 	RETURN NVL (l_result_amount, 0);
5134 */
5135 return 0;
5136 EXCEPTION
5137 	WHEN OTHERS THEN
5138 /*
5139 		-- Close open cursors
5140 
5141 		IF l_item_loc_csr%ISOPEN THEN
5142 			CLOSE l_item_loc_csr;
5143 		END IF;
5144 
5145 		IF l_cle_csr%ISOPEN THEN
5146 			CLOSE l_cle_csr;
5147 		END IF;
5148 
5149 		IF l_chr_csr%ISOPEN THEN
5150 			CLOSE l_chr_csr;
5151 		END IF;
5152 
5153         -- RMUNJULU 3394507 close cursor if open
5154 		IF item_loc_csr%ISOPEN THEN
5155 			CLOSE item_loc_csr;
5156 		END IF;
5157 
5158 		-- store SQL error message on message stack for caller
5159 
5160 		OKL_API.SET_MESSAGE (
5161 			p_app_name	=> OKL_API.G_APP_NAME,
5162 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
5163 			p_token1	=> 'SQLCODE',
5164 			p_token1_value	=> SQLCODE,
5165 			p_token2	=> 'SQLERRM',
5166 			p_token2_value	=> SQLERRM);
5167 */
5168 		RETURN NULL;
5169 
5170 END contract_estimate_tax;
5171 
5172 
5173 ------------------------------------------------------------------------------
5174   -- Start of Comments
5175   -- Created By:    [email protected] - 20-FEB-2002
5176   -- Function Name: line_estimate_tax
5177   -- Description:   Estimate tax using ARP-CRM integration routines
5178   -- Dependencies:  OKL building blocks AMTX and AMUV,
5179   -- Parameters:    IN:  p_contract_id, p_contract_line_id,
5180   --                     taxable_amount (stored in g_additional_parameters(1))
5181   --                OUT: amount
5182   -- Version:       1.0
5183   -- End of Commnets
5184 ------------------------------------------------------------------------------
5185 
5186 FUNCTION line_estimate_tax (
5187 	p_contract_id		IN NUMBER,
5188 	p_contract_line_id	IN NUMBER)
5189 	RETURN NUMBER IS
5190 BEGIN
5191 	-- To avoid code repetition, both header
5192 	-- and line are handled in one routine
5193 	RETURN (contract_estimate_tax (p_contract_id, p_contract_line_id));
5194 END line_estimate_tax;
5195 
5196 
5197 ------------------------------------------------------------------------------
5198   -- Start of Comments
5199   -- Created By:    [email protected] - 20-FEB-2002
5200   -- Function Name: line_estimated_property_tax
5201   -- Description:   Estimate property tax based on previous records
5202   -- Dependencies:  OKL building blocks AMTX and AMUV,
5203   -- Parameters:    IN:  p_contract_id, p_contract_line_id,
5204   --                OUT: amount
5205   -- Version:       1.0
5206   -- History:       21-MAR-2002 RDRAGUIL - Cursor based on Billing TRXs
5207   --                05 Nov 2004 PAGARG Bug# 3925492
5208   --                Modified the procedure to call BPD API for formula value.
5209   -- End of Commnets
5210 ------------------------------------------------------------------------------
5211 
5212 FUNCTION line_estimated_property_tax (
5213 	p_contract_id		IN NUMBER,
5214 	p_contract_line_id	IN NUMBER)
5215 	RETURN NUMBER IS
5216 
5217 	l_result_amount		NUMBER;
5218 
5219     --Bug# 3925492: pagarg +++ Estd. Prop Tax +++++++ Start ++++++++++
5220     CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
5221     SELECT trunc(qte.date_effective_from) date_effective_from
5222     FROM   okl_trx_quotes_b  qte
5223     WHERE  qte.id = p_quote_id;
5224 
5225     l_quote_id        NUMBER;
5226     l_quote_date_eff  DATE;
5227     l_sysdate         DATE;
5228     l_api_version     NUMBER;
5229     l_init_msg_list   VARCHAR2(1);
5230     l_return_status   VARCHAR2(1);
5231     l_msg_count       NUMBER;
5232     l_msg_data        VARCHAR2(2000);
5233     l_input_tbl       OKL_BPD_TERMINATION_ADJ_PVT.input_tbl_type;
5234     lx_baj_tbl        OKL_BPD_TERMINATION_ADJ_PVT.baj_tbl_type;
5235     l_tbl_cnt         NUMBER;
5236 BEGIN
5237     l_api_version := '1.0';
5238     l_init_msg_list := OKL_API.G_FALSE;
5239     l_result_amount := 0;
5240 
5241     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
5242       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
5243       LOOP
5244         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
5245            l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
5246         END IF;
5247       END LOOP;
5248     END IF;
5249 
5250     IF  l_quote_id IS NOT NULL
5251     AND l_quote_id <> OKL_API.G_MISS_NUM THEN
5252        OPEN get_quote_date_csr (l_quote_id);
5253        FETCH get_quote_date_csr INTO l_quote_date_eff;
5254        CLOSE get_quote_date_csr;
5255     END IF;
5256 
5257     SELECT SYSDATE INTO l_sysdate FROM DUAL;
5258 
5259     IF l_quote_date_eff IS NULL
5260     OR l_quote_date_eff = OKL_API.G_MISS_DATE
5261     THEN
5262        l_quote_date_eff := l_sysdate;
5263     END IF;
5264 
5265     l_input_tbl(0).khr_id := p_contract_id;
5266     l_input_tbl(0).kle_id := p_contract_line_id;
5267     l_input_tbl(0).term_date_from := l_quote_date_eff;
5268 
5269     OKL_BPD_TERMINATION_ADJ_PVT.get_unbilled_prop_tax(
5270         p_api_version        => l_api_version,
5271         p_init_msg_list      => l_init_msg_list,
5272         p_input_tbl          => l_input_tbl,
5273         x_baj_tbl            => lx_baj_tbl,
5274         x_return_status      => l_return_status,
5275         x_msg_count          => l_msg_count,
5276         x_msg_data           => l_msg_data);
5277 
5278     IF lx_baj_tbl.COUNT > 0
5279     THEN
5280         FOR l_tbl_cnt IN lx_baj_tbl.FIRST..lx_baj_tbl.LAST
5281         LOOP
5282             l_result_amount := l_result_amount + lx_baj_tbl(l_tbl_cnt).amount;
5283         END LOOP;
5284     END IF;
5285     --Bug# 3925492: pagarg +++ Estd. Prop Tax +++++++ End ++++++++++
5286 
5287 	RETURN NVL (l_result_amount, 0);
5288 EXCEPTION
5289 	WHEN OTHERS THEN
5290 		-- store SQL error message on message stack for caller
5291 		OKL_API.SET_MESSAGE (
5292 			p_app_name	=> OKL_API.G_APP_NAME,
5293 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
5294 			p_token1	=> 'SQLCODE',
5295 			p_token1_value	=> SQLCODE,
5296 			p_token2	=> 'SQLERRM',
5297 			p_token2_value	=> SQLERRM);
5298 
5299 		RETURN NULL;
5300 END line_estimated_property_tax;
5301 
5302 ------------------------------------------------------------------------------
5303   -- Start of Comments
5304   -- Created By:    [email protected] - 20-FEB-2002
5305   -- Function Name: contract_remaining_sec_dep
5306   -- Description:   If security deposit disposition is allowed to be included
5307   --                into a quote, return original security deposit amount
5308   --                minus any credit memos against security deposit invoices
5309   -- Dependencies:  OKL building blocks AMTX and AMUV,
5310   -- Parameters:    IN:  p_contract_id
5311   --                OUT: amount
5312   -- Version:       1.0
5313   -- End of Commnets
5314 ------------------------------------------------------------------------------
5315 
5316 FUNCTION contract_remaining_sec_dep (
5317 	p_contract_id		IN NUMBER,
5318 	p_contract_line_id	IN NUMBER)
5319 	RETURN NUMBER IS
5320 
5321 	l_sdd_tbl		okl_am_invoices_pvt.sdd_tbl_type;
5322 	l_tld_tbl		okl_am_invoices_pvt.tld_tbl_type;
5323 	l_total_amount		NUMBER;
5324 
5325 BEGIN
5326 
5327 	okl_am_invoices_pvt.contract_remaining_sec_dep (
5328 		p_contract_id	=> p_contract_id,
5329 		p_contract_line_id => p_contract_line_id,
5330 		x_sdd_tbl	=> l_sdd_tbl,
5331 		x_tld_tbl	=> l_tld_tbl,
5332 		x_total_amount	=> l_total_amount);
5333 
5334 	RETURN NVL (l_total_amount, 0);
5335 
5336 EXCEPTION
5337 
5338 	WHEN OTHERS THEN
5339 
5340 		-- store SQL error message on message stack for caller
5341 
5342 		OKL_API.SET_MESSAGE (
5343 			p_app_name	=> OKL_API.G_APP_NAME,
5344 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
5345 			p_token1	=> 'SQLCODE',
5346 			p_token1_value	=> SQLCODE,
5347 			p_token2	=> 'SQLERRM',
5348 			p_token2_value	=> SQLERRM);
5349 
5350 		RETURN NULL;
5351 
5352 END contract_remaining_sec_dep;
5353 
5354 
5355 ------------------------------------------------------------------------------
5356   -- Start of Comments
5357   -- Created By:    [email protected] - 10-JUL-2002
5358   -- Function Name: line_unbilled_streams
5359   -- Description:   Calculate unbilled streams
5360   -- Dependencies:  OKL building blocks AMTX and AMUV,
5361   -- Parameters:    IN:  p_contract_id, p_contract_line_id,
5362   --                     stream_type_id (stored in g_additional_parameters(1))
5363   --                OUT: amount
5364   -- Version:       1.0
5365   -- History        SECHAWLA 04-MAR-03 : Restrict the calculation of unbilled
5366   --                receivables to only billable streams
5367   -- End of Commnets
5368 ------------------------------------------------------------------------------
5369 
5370 FUNCTION line_unbilled_streams (
5371 	p_contract_id		IN NUMBER,
5372 	p_contract_line_id	IN NUMBER)
5373 	RETURN NUMBER IS
5374 
5375 	-- Get Unbilled Streams
5376 	CURSOR l_unbill_stream_csr (
5377 			cp_contract_id			NUMBER,
5378 			cp_contract_line_id		NUMBER,
5379 			cp_stream_type_id		NUMBER,
5380                         cp_quote_eff_date               DATE ) IS
5381 		SELECT	SUM (NVL (ste.amount, 0))	amount_due
5382 	   	FROM	okl_streams			stm,
5383                 okl_strm_type_b     sty, -- SECHAWLA 04-MAR-03 Added this table to get the billable_yn flag
5384 			    okl_strm_elements		ste
5385 		WHERE	stm.khr_id			= cp_contract_id
5386 		AND	stm.kle_id			= cp_contract_line_id
5387 		AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
5388 		AND	stm.active_yn			= 'Y'
5389 		AND	stm.say_code			= 'CURR'
5390 		AND	ste.stm_id			= stm.id
5391       --        AND	ste.date_billed			IS NULL -- Removed date billed as future bills are adjusted for Bug15998398
5392                 AND     ste.stream_element_date > NVL(cp_quote_eff_date, ste.stream_element_date - 1)  -- added the condition for Bug15998398
5393 		AND	NVL (ste.amount, 0)	<> 0
5394   -- SECHAWLA 04-MAR-03 Added the following 3 conditions to restrict the unbilled receivables calculation to only
5395   -- billable streams
5396         AND sty.id              = stm.sty_id
5397         AND sty.billable_yn     = 'Y';
5398        -- AND sty.capitalize_yn   = 'N'
5399 
5400 	l_result_amount		NUMBER		:= 0;
5401 	l_stream_type_id	NUMBER;
5402         l_quote_eff_date        DATE;  -- added for Bug15998398
5403 
5404 BEGIN
5405 
5406 	-- ********************************************
5407 	-- Extract Stream Type Id from global variables
5408 	-- ********************************************
5409 
5410 	IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(1)
5411 	AND okl_execute_formula_pub.g_additional_parameters(1).name = 'STREAM TYPE'
5412 	AND okl_execute_formula_pub.g_additional_parameters(1).value IS NOT NULL
5413 	THEN
5414 		l_stream_type_id := TO_NUMBER
5415 			(okl_execute_formula_pub.g_additional_parameters(1).value);
5416 	ELSE
5417 		l_stream_type_id := NULL;
5418 	END IF;
5419 
5420         -- added the following fo Bug15998398
5421 	IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(2)
5422 	AND okl_execute_formula_pub.g_additional_parameters(2).name = 'quote_effective_from_date'
5423 	AND okl_execute_formula_pub.g_additional_parameters(2).value IS NOT NULL
5424 	THEN
5425 		l_quote_eff_date := TO_DATE
5426 			(okl_execute_formula_pub.g_additional_parameters(2).value,'MM/DD/YYYY');
5427 	ELSE
5428 		l_quote_eff_date := NULL;
5429 	END IF;
5430 
5431 	-- ****************
5432 	-- Calculate result
5433 	-- ****************
5434 
5435 	OPEN	l_unbill_stream_csr (p_contract_id, p_contract_line_id, l_stream_type_id, l_quote_eff_date);-- modified for Bug15998398
5436 	FETCH	l_unbill_stream_csr INTO l_result_amount;
5437 	CLOSE	l_unbill_stream_csr;
5438 
5439 	RETURN NVL (l_result_amount, 0);
5440 
5441 EXCEPTION
5442 
5443 	WHEN OTHERS THEN
5444 
5445 		-- Close open cursors
5446 
5447 		IF l_unbill_stream_csr%ISOPEN THEN
5448 			CLOSE l_unbill_stream_csr;
5449 		END IF;
5450 
5451 
5452 		-- store SQL error message on message stack for caller
5453 
5454 		OKL_API.SET_MESSAGE (
5455 			p_app_name	=> OKL_API.G_APP_NAME,
5456 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
5457 			p_token1	=> 'SQLCODE',
5458 			p_token1_value	=> SQLCODE,
5459 			p_token2	=> 'SQLERRM',
5460 			p_token2_value	=> SQLERRM);
5461 
5462 		RETURN NULL;
5463 
5464 END line_unbilled_streams;
5465 
5466 
5467 ------------------------------------------------------------------------------
5468   -- Start of Comments
5469   -- Created By:    [email protected] - 24-APR-2002
5470   -- Function Name: line_unbilled_rent
5471   -- Description:   Returns the unbilled rent amount for a given contract line
5472   -- Dependencies:  OKL building blocks AMTX and AMUV
5473   -- Parameters:    IN:  p_contract_id, p_line_id
5474   --                     stream_type_id (stored in g_additional_parameters(1))
5475   --                OUT: amount
5476   -- Version:       1.0
5477   -- History  : SECHAWLA 05-MAY-04 3578894 : Modified to evaluate reporting streams
5478   --                based upon additional parameters
5479   --              : 31-Dec-2004 PAGARG Bug# 4097591
5480   --              : UDS impact to obtain stream type id
5481   -- End of Commnets
5482 ------------------------------------------------------------------------------
5483 
5484 FUNCTION line_unbilled_rent (
5485 	p_contract_id		IN NUMBER,
5486 	p_contract_line_id	IN NUMBER)
5487 	RETURN NUMBER IS
5488 
5489     --SECHAWLA 05-MAY-04 3578894 : new declarations
5490     -- Get Unbilled Streams (moved from line_unbilled_streams)
5491 	CURSOR  l_unbill_stream_csr (
5492 			cp_contract_id			NUMBER,
5493 			cp_contract_line_id		NUMBER,
5494 			cp_stream_type_id		NUMBER) IS
5495 	SELECT	SUM (NVL (ste.amount, 0))	amount_due
5496 	FROM	okl_streams			stm,
5497             okl_strm_type_b     sty, -- SECHAWLA 04-MAR-03 Added this table to get the billable_yn flag
5498 			okl_strm_elements		ste
5499 	WHERE	stm.khr_id			= cp_contract_id
5500 	AND	stm.kle_id			= cp_contract_line_id
5501 	AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
5502 	AND	stm.active_yn			= 'Y'
5503 	AND	stm.say_code			= 'CURR'
5504 	AND	ste.stm_id			= stm.id
5505 	AND	ste.date_billed			IS NULL
5506 	AND	NVL (ste.amount, 0)	<> 0
5507     -- SECHAWLA 04-MAR-03 Added the following 3 conditions to restrict the unbilled receivables calculation to only
5508     -- billable streams
5509     AND sty.id              = stm.sty_id
5510     AND sty.billable_yn     = 'Y';
5511        -- AND sty.capitalize_yn   = 'N'
5512 
5513     -- Get Unbilled Streams for Reporting product
5514 	CURSOR l_unbill_reporting_stream_csr (
5515 			cp_contract_id			NUMBER,
5516 			cp_contract_line_id		NUMBER,
5517 			cp_stream_type_id		NUMBER,
5518             cp_trx_date             DATE) IS
5519 	SELECT	SUM (NVL (ste.amount, 0))	amount_due
5520 	FROM	okl_streams			stm,
5521                 okl_strm_type_b     sty,
5522 			    okl_strm_elements		ste
5523 	WHERE	stm.khr_id			= cp_contract_id
5524 	AND	stm.kle_id			= cp_contract_line_id
5525 	AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
5526 	AND	stm.active_yn			= 'N'  -- reporting strems are inactive
5527 	AND	stm.say_code			= 'CURR'  -- reporting streams are current
5528 	AND	ste.stm_id			= stm.id
5529 	AND	ste.date_billed			IS NULL  -- reporting streams never get billed
5530 	AND	NVL (ste.amount, 0)	<> 0
5531     AND sty.id              = stm.sty_id
5532     AND sty.billable_yn     = 'Y' -- reporting streams are billable
5533        -- AND sty.capitalize_yn   = 'N'
5534     AND stm.purpose_code = 'REPORT'
5535     AND ste.STREAM_ELEMENT_DATE > cp_trx_date;
5536 
5537     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
5538     l_trx_date   DATE;
5539 
5540     ---SECHAWLA 05-MAY-04 3578894 : end new declarations
5541 
5542 	l_result_amount		NUMBER		:= 0;
5543 	l_stream_type_id	NUMBER;
5544 	l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
5545 BEGIN
5546     --PAGARG 31-Dec-2004 Bug# 4097591 Start
5547     --UDS impact. Obtain stream type id and pass it to cursor
5548 
5549     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
5550                                              'RENT',
5551                                              l_return_status,
5552                                              l_stream_type_id);
5553 
5554     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
5555     THEN
5556         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5557     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
5558     THEN
5559         RAISE OKL_API.G_EXCEPTION_ERROR;
5560     END IF;
5561     --PAGARG 31-Dec-2004 Bug# 4097591 End
5562 
5563     /*  SECHAWLA 05-MAY-04 3578894
5564 	okl_execute_formula_pub.g_additional_parameters(1).name  := 'STREAM TYPE';
5565 	okl_execute_formula_pub.g_additional_parameters(1).value := l_stream_type_id;
5566 
5567 	l_result_amount	:= line_unbilled_streams (p_contract_id, p_contract_line_id);
5568 
5569 	RETURN NVL (l_result_amount, 0);
5570     */
5571 
5572     --Validate additional parameters availability
5573     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
5574       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
5575 	  LOOP
5576         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
5577            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
5578                 l_rep_prod_streams_yn := okl_execute_formula_pub.g_additional_parameters(I).value;
5579         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
5580            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
5581                 l_trx_date := TO_DATE(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
5582         END IF;
5583       END LOOP;
5584 	ELSE
5585       l_rep_prod_streams_yn := 'N';
5586 
5587 	END IF;
5588 
5589     IF l_rep_prod_streams_yn = 'Y' THEN
5590        IF l_trx_date IS NULL THEN
5591        -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
5592           Okl_Api.Set_Message(p_app_name     => g_app_name,
5593                               p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
5594           RAISE Okl_Api.G_EXCEPTION_ERROR;
5595        END IF;
5596     END IF;
5597 
5598 
5599 	-- ****************
5600 	-- Calculate result
5601 	-- ****************
5602 
5603     IF l_rep_prod_streams_yn = 'Y' THEN
5604        OPEN  l_unbill_reporting_stream_csr(p_contract_id, p_contract_line_id, l_stream_type_id,l_trx_date );
5605        FETCH l_unbill_reporting_stream_csr INTO  l_result_amount;
5606        CLOSE l_unbill_reporting_stream_csr;
5607     ELSE
5608 
5609 	   OPEN  l_unbill_stream_csr (p_contract_id, p_contract_line_id, l_stream_type_id);
5610 	   FETCH l_unbill_stream_csr INTO l_result_amount;
5611 	   CLOSE l_unbill_stream_csr;
5612     END IF;
5613 
5614 	RETURN NVL (l_result_amount, 0);
5615 
5616 
5617 EXCEPTION
5618     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
5619         -- Close open cursors
5620         IF l_unbill_stream_csr%ISOPEN THEN
5621             CLOSE l_unbill_stream_csr;
5622         END IF;
5623 
5624         IF l_unbill_reporting_stream_csr%ISOPEN THEN
5625             CLOSE l_unbill_reporting_stream_csr;
5626         END IF;
5627 
5628         RETURN NULL;
5629 
5630 	WHEN OTHERS THEN
5631 		-- Close open cursors
5632         IF l_unbill_stream_csr%ISOPEN THEN
5633             CLOSE l_unbill_stream_csr;
5634         END IF;
5635 
5636         IF l_unbill_reporting_stream_csr%ISOPEN THEN
5637             CLOSE l_unbill_reporting_stream_csr;
5638         END IF;
5639 		-- store SQL error message on message stack for caller
5640 		OKL_API.SET_MESSAGE (
5641 			p_app_name	=> OKL_API.G_APP_NAME,
5642 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
5643 			p_token1	=> 'SQLCODE',
5644 			p_token1_value	=> SQLCODE,
5645 			p_token2	=> 'SQLERRM',
5646 			p_token2_value	=> SQLERRM);
5647 
5648 		RETURN NULL;
5649 
5650 END line_unbilled_rent;
5651 
5652 
5653 -- Start of comments
5654 --
5655 -- Procedure Name  : get_reporting_product
5656 -- Description     : This procedure checks if there is a reporting product attached to the contract and returns
5657 --                   the deal type of the reporting product and MG reporting book
5658 -- Business Rules  :
5659 -- Parameters      :  p_contract_id - Contract ID
5660 -- Version         : 1.0
5661 -- History         : sechawla 12-Dec-07  - 6671849 Created
5662 -- End of comments
5663 
5664 PROCEDURE get_reporting_product(p_api_version           IN  	NUMBER,
5665            		 	              p_init_msg_list         IN  	VARCHAR2,
5666            			              x_return_status         OUT 	NOCOPY VARCHAR2,
5667            			              x_msg_count             OUT 	NOCOPY NUMBER,
5668            			              x_msg_data              OUT 	NOCOPY VARCHAR2,
5669                                   p_contract_id 		  IN 	NUMBER,
5670                                   x_rep_product_id           OUT   NOCOPY VARCHAR2) IS
5671 
5672 
5673   -- Get the financial product of the contract
5674   CURSOR l_get_fin_product(cp_khr_id IN NUMBER) IS
5675   SELECT a.start_date, a.contract_number, b.pdt_id
5676   FROM   okc_k_headers_b a, okl_k_headers b
5677   WHERE  a.id = b.id
5678   AND    a.id = cp_khr_id;
5679 
5680   SUBTYPE pdtv_rec_type IS OKL_SETUPPRODUCTS_PUB.pdtv_rec_type;
5681   SUBTYPE pdt_parameters_rec_type IS OKL_SETUPPRODUCTS_PUB.pdt_parameters_rec_type;
5682 
5683   l_fin_product_id          NUMBER;
5684   l_start_date              DATE;
5685   lp_pdtv_rec               pdtv_rec_type;
5686   lp_empty_pdtv_rec         pdtv_rec_type;
5687   lx_no_data_found          BOOLEAN;
5688   lx_pdt_parameter_rec      pdt_parameters_rec_type ;
5689   l_contract_number         VARCHAR2(120);
5690 
5691   --mg_error                  EXCEPTION;
5692   l_reporting_product       OKL_PRODUCTS_V.NAME%TYPE;
5693   l_reporting_product_id    NUMBER;
5694 
5695 
5696 
5697   BEGIN
5698     -- get the financial product of the contract
5699     OPEN  l_get_fin_product(p_contract_id);
5700     FETCH l_get_fin_product INTO l_start_date, l_contract_number, l_fin_product_id;
5701     CLOSE l_get_fin_product;
5702 
5703     lp_pdtv_rec.id := l_fin_product_id;
5704 
5705     -- check if the fin product has a reporting product
5706     OKL_SETUPPRODUCTS_PUB.Getpdt_parameters( p_api_version                  => p_api_version,
5707   				  			               p_init_msg_list                => OKC_API.G_FALSE,
5708 						                   x_return_status                => x_return_status,
5709 							               x_no_data_found                => lx_no_data_found,
5710 							               x_msg_count                    => x_msg_count,
5711 							               x_msg_data                     => x_msg_data,
5712 							               p_pdtv_rec                     => lp_pdtv_rec,
5713 							               p_product_date                 => l_start_date,
5714 							               p_pdt_parameter_rec            => lx_pdt_parameter_rec);
5715 
5716     IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
5717         -- Error getting financial product parameters for contract CONTRACT_NUMBER.
5718         OKC_API.set_message(  p_app_name      => 'OKL',
5719                            p_msg_name      => 'OKL_AM_FIN_PROD_PARAM_ERR',
5720                            p_token1        =>  'CONTRACT_NUMBER',
5721                            p_token1_value  =>  l_contract_number);
5722 
5723     ELSE
5724 
5725         l_reporting_product := lx_pdt_parameter_rec.reporting_product;
5726         l_reporting_product_id := lx_pdt_parameter_rec.reporting_pdt_id;
5727 
5728         IF l_reporting_product IS NOT NULL AND l_reporting_product <> OKC_API.G_MISS_CHAR THEN
5729             -- Contract has a reporting product
5730             x_rep_product_id :=  l_reporting_product_id;
5731         END IF;
5732     END IF;
5733   EXCEPTION
5734       --WHEN mg_error THEN
5735       --   IF l_get_fin_product%ISOPEN THEN
5736       --      CLOSE l_get_fin_product;
5737       --   END IF;
5738       --   x_return_status := OKL_API.G_RET_STS_ERROR;
5739       WHEN OTHERS THEN
5740          IF l_get_fin_product%ISOPEN THEN
5741             CLOSE l_get_fin_product;
5742          END IF;
5743          OKL_API.set_message(p_app_name      => 'OKC',
5744                          p_msg_name      => g_unexpected_error,
5745                          p_token1        => g_sqlcode_token,
5746                          p_token1_value  => sqlcode,
5747                          p_token2        => g_sqlerrm_token,
5748                          p_token2_value  => sqlerrm);
5749           x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
5750 END get_reporting_product;
5751 
5752 
5753 ------------------------------------------------------------------------------
5754   -- Start of Comments
5755   -- Created By:    [email protected] - 24-APR-2002
5756   -- Function Name: line_unearned_income
5757   -- Description:   Returns the unearned income amount for a given contract line
5758   -- Dependencies:  OKL building blocks AMTX and AMUV
5759   -- Parameters:    IN:  p_contract_id, p_line_id
5760   --                     stream_type_id (stored in g_additional_parameters(1))
5761   --                OUT: amount
5762   -- Version:       1.0
5763   --                SECHAWLA 05-MAY-04 3578894 : Modified to accomodate additional parameters for reporting product
5764   --              : 31-Dec-2004 PAGARG Bug# 4097591
5765   --              : UDS impact to obtain stream type id
5766   --                sechawla 05-dec-07 6671849 : Modified the dependent stream type check
5767   -- End of Commnets
5768 ------------------------------------------------------------------------------
5769 FUNCTION line_unearned_income (
5770 	p_contract_id		IN NUMBER,
5771 	p_contract_line_id	IN NUMBER)
5772 	RETURN NUMBER IS
5773 
5774         l_unearned_income       NUMBER  := 0;
5775         --Code changed by rvaduri for bug 3536862
5776         --This code will return the Pre-tax income at line level
5777         -- and will return values only contracts booked using ISG.
5778     --PAGARG 31-Dec-2004 Bug# 4097591
5779     --Instead of using stream name, join the sty id passed to cursor
5780     CURSOR line_csr (c_contract_line_id NUMBER, p_sty_id NUMBER) IS
5781       SELECT NVL(SUM(sel.amount),0)
5782       FROM okl_strm_elements sel,
5783            okl_streams stm,
5784            okl_strm_type_v sty
5785       WHERE sty.id = p_sty_id
5786         AND stm.sty_id = sty.id
5787         AND stm.say_code = 'CURR'
5788         AND stm.active_yn = 'Y'
5789         AND stm.purpose_code IS NULL
5790         AND stm.kle_id = c_contract_line_id
5791         AND sel.stm_id = stm.id;
5792 
5793     --SECHAWLA 05-MAY-04 3578894 : new declarations
5794     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
5795     l_trx_date   DATE;
5796 
5797     -- SECHAWLA 05-MAY-04 3578894 : Created this cursor to evaluat ereporting streams based upon additional parameters
5798     --PAGARG 31-Dec-2004 Bug# 4097591
5799     --Instead of using stream name, join the sty id passed to cursor
5800     CURSOR line_reporting_csr (c_contract_line_id IN NUMBER, cp_trx_date IN DATE, p_sty_id NUMBER) IS
5801       SELECT NVL(SUM(sel.amount),0)
5802       FROM okl_strm_elements sel,
5803            okl_streams stm,
5804            okl_strm_type_v sty
5805       WHERE sty.id = p_sty_id
5806         AND stm.sty_id = sty.id
5807         AND stm.say_code = 'CURR' -- reporting streams are current
5808         AND stm.active_yn = 'N'  -- reporting strems are inactive
5809         AND stm.purpose_code IS NULL
5810         AND	sel.date_billed	IS NULL  -- reporting streams never get billed
5811         --AND sty.billable_yn     = 'N'  -- PRE-TAX streams are not billable
5812         AND stm.kle_id = c_contract_line_id
5813         AND sel.stm_id = stm.id
5814         AND stm.purpose_code = 'REPORT'
5815         AND sel.STREAM_ELEMENT_DATE > cp_trx_date;
5816 
5817 	l_stream_type_id	NUMBER;
5818 	l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
5819 
5820 	-- sechawla 05-dec-07 6057301 - Added
5821 	lx_rep_product_id           OKL_PRODUCTS_V.ID%TYPE;
5822     l_api_version               NUMBER := 1;
5823     l_init_msg_list             VARCHAR2(1) := OKL_API.G_FALSE;
5824     l_msg_count                 NUMBER;
5825     l_msg_data                  VARCHAR2(100);
5826 BEGIN
5827     -- SECHAWLA 05-MAY-04 3578894 : Validate additional parameters availability
5828     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
5829       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
5830 	  LOOP
5831         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
5832            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
5833                 l_rep_prod_streams_yn := okl_execute_formula_pub.g_additional_parameters(I).value;
5834         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
5835            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
5836                 l_trx_date := TO_DATE(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
5837         END IF;
5838       END LOOP;
5839 	ELSE
5840 
5841       l_rep_prod_streams_yn := 'N';
5842 
5843 	END IF;
5844 
5845     -- sechawla 05-dec-07 6671849 : START
5846 	IF l_rep_prod_streams_yn = 'Y' THEN
5847 
5848 	      get_reporting_product(
5849                                   p_api_version           => l_api_version,
5850            		 	              p_init_msg_list         => OKC_API.G_FALSE,
5851            			              x_return_status         => l_return_status,
5852            			              x_msg_count             => l_msg_count,
5853            			              x_msg_data              => l_msg_data,
5854                                   p_contract_id 		  => p_contract_id,
5855                                   x_rep_product_id        => lx_rep_product_id);
5856 
5857 
5858           OKL_STREAMS_UTIL.get_dependent_stream_type(p_khr_id            => p_contract_id,
5859                                                p_product_id            => lx_rep_product_id,
5860                                                p_primary_sty_purpose   => 'RENT',
5861                                                p_dependent_sty_purpose => 'LEASE_INCOME',
5862                                                x_return_status         => l_return_status,
5863                                                x_dependent_sty_id      => l_stream_type_id);
5864      ELSE
5865      -- sechawla 05-dec-07 6671849 : END
5866 
5867         --PAGARG 31-Dec-2004 Bug# 4097591 Start
5868         --UDS impact. Obtain stream type id and pass it to cursor
5869          OKL_STREAMS_UTIL.get_dependent_stream_type(p_khr_id                => p_contract_id,
5870                                                p_primary_sty_purpose   => 'RENT',
5871                                                p_dependent_sty_purpose => 'LEASE_INCOME',
5872                                                x_return_status         => l_return_status,
5873                                                x_dependent_sty_id      => l_stream_type_id);
5874 
5875          IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5876             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5877          ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
5878             RAISE OKL_API.G_EXCEPTION_ERROR;
5879          END IF;
5880          --PAGARG 31-Dec-2004 Bug# 4097591 End
5881 
5882     END IF; -- sechawla 05-dec-07 6671849 : added
5883 
5884     IF l_rep_prod_streams_yn = 'Y' THEN
5885        IF l_trx_date IS NULL THEN
5886        -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
5887           Okl_Api.Set_Message(p_app_name     => g_app_name,
5888                               p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
5889           RAISE Okl_Api.G_EXCEPTION_ERROR;
5890        END IF;
5891     END IF;
5892 
5893     --SECHAWLA 05-MAY-04 3578894 : check if streams required for reporting  product
5894     IF l_rep_prod_streams_yn = 'Y' THEN
5895        --PAGARG 31-Dec-2004 Bug# 4097591, Pass stream type id to cursor
5896        OPEN  line_reporting_csr(p_contract_line_id, l_trx_date, l_stream_type_id);
5897        FETCH line_reporting_csr INTO l_unearned_income;
5898 	   CLOSE line_reporting_csr;
5899     ELSE
5900     -- SECHAWLA 05-MAY-04 3578894 : end new code
5901        --PAGARG 31-Dec-2004 Bug# 4097591, Pass stream type id to cursor
5902 	   OPEN  line_csr(p_contract_line_id, l_stream_type_id);
5903 	   FETCH line_csr INTO l_unearned_income;
5904 	   CLOSE line_csr;
5905     END IF;
5906 
5907         --Code commented by rvaduri.
5908 /*
5909 	OPEN	l_str_type_csr ('UNEARNED INCOME');
5910 	FETCH	l_str_type_csr INTO l_stream_type_id;
5911 	CLOSE	l_str_type_csr;
5912 
5913 	okl_execute_formula_pub.g_additional_parameters(1).name  := 'STREAM TYPE';
5914 	okl_execute_formula_pub.g_additional_parameters(1).value := l_stream_type_id;
5915 
5916 	l_result_amount	:= line_unbilled_streams (p_contract_id, p_contract_line_id);
5917 
5918 	RETURN NVL (l_result_amount, 0);
5919 */
5920         RETURN NVL(l_unearned_income,0);
5921 
5922 EXCEPTION
5923     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
5924         IF line_csr%ISOPEN THEN
5925 			CLOSE line_csr;
5926 		END IF;
5927 
5928         IF line_reporting_csr%ISOPEN THEN
5929             CLOSE line_reporting_csr;
5930         END IF;
5931 
5932         RETURN NULL;
5933 
5934 	WHEN OTHERS THEN
5935 
5936 		-- Close open cursors
5937 
5938 		IF line_csr%ISOPEN THEN
5939 			CLOSE line_csr;
5940 		END IF;
5941 
5942         IF line_reporting_csr%ISOPEN THEN
5943             CLOSE line_reporting_csr;
5944         END IF;
5945 
5946 		-- store SQL error message on message stack for caller
5947 
5948 		OKL_API.SET_MESSAGE (
5949 			p_app_name	=> OKL_API.G_APP_NAME,
5950 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
5951 			p_token1	=> 'SQLCODE',
5952 			p_token1_value	=> SQLCODE,
5953 			p_token2	=> 'SQLERRM',
5954 			p_token2_value	=> SQLERRM);
5955 
5956 		RETURN NULL;
5957 
5958 END line_unearned_income;
5959 
5960 
5961 ------------------------------------------------------------------------------
5962   -- Start of Comments
5963   -- Created By:    [email protected] - 24-APR-2002
5964   -- Function Name: line_calculate_fmv
5965   -- Description:   Returns the fair market value for a given contract line
5966   --                using an hook to an external system.
5967   --                Just a shell for now
5968   -- Dependencies:
5969   -- Parameters:    IN:  p_contract_id, p_line_id
5970   --                OUT: amount
5971   -- Version:       1.0
5972   -- End of Commnets
5973 ------------------------------------------------------------------------------
5974 
5975 FUNCTION line_calculate_fmv (
5976 	p_contract_id		IN NUMBER,
5977 	p_contract_line_id	IN NUMBER)
5978 	RETURN NUMBER IS
5979 BEGIN
5980 	RETURN 0;
5981 END line_calculate_fmv;
5982 
5983 ------------------------------------------------------------------------------
5984   -- Start of Comments
5985   -- Created By:    [email protected] - 24-APR-2002
5986   -- Function Name: line_calculate_residual_value
5987   -- Description:   Returns the residual value for a given contract line
5988   --                using an hook to an external system.
5989   --                Just a shell for now
5990   -- Dependencies:
5991   -- Parameters:    IN:  p_contract_id, p_line_id
5992   --                OUT: amount
5993   -- Version:       1.0
5994   -- End of Commnets
5995 ------------------------------------------------------------------------------
5996 
5997 FUNCTION line_calculate_residual_value (
5998 	p_contract_id		IN NUMBER,
5999 	p_contract_line_id	IN NUMBER)
6000 	RETURN NUMBER IS
6001 BEGIN
6002 	RETURN 0;
6003 END line_calculate_residual_value;
6004 
6005 ---------------------------------------------
6006 -- CS Functions
6007 ---------------------------------------------
6008 
6009 ----------------------------------------------------------------------------------------------------
6010 
6011     -- Start of Comments
6012     -- Created By:       Ranu Srivastava (rsrivast)
6013     -- Function Name  contract_security_deposit
6014     -- Description:   returns the security deposit for given contract
6015     -- Dependencies:
6016     -- Parameters: contract id,contract line id
6017     -- Version: 1.0
6018     -- End of Commnets
6019 
6020 ----------------------------------------------------------------------------------------------------
6021 
6022 FUNCTION contract_security_deposit( p_contract_id           IN  NUMBER
6023                                    ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6024     IS
6025   l_security_deposit NUMBER := 0;
6026 
6027 -- select changed to filter streams based on purpose instead of on type
6028 -- enhancement done for user defined streams impacts, bug 3924303
6029 
6030   CURSOR C (p_contract_id  NUMBER)
6031   IS
6032    SELECT NVL(SUM(sele.amount),0)
6033          FROM okl_strm_elements sele,
6034            okl_streams str,
6035            okl_strm_type_v sty
6036       WHERE sele.stm_id = str.id
6037            AND str.sty_id = sty.id
6038            AND UPPER(sty.stream_type_purpose) = 'SECURITY_DEPOSIT'
6039            AND str.say_code = 'CURR'
6040 	   --multigaap changes
6041            AND STR.ACTIVE_YN = 'Y'
6042            AND STR.PURPOSE_CODE IS NULL
6043 	   --end multigaap changes
6044            AND str.khr_id = p_contract_id;
6045 
6046 BEGIN
6047 
6048   OPEN C (p_contract_id);
6049   FETCH C INTO l_security_deposit;
6050   CLOSE C;
6051 
6052   RETURN l_security_deposit;
6053   EXCEPTION
6054     WHEN OTHERS THEN
6055       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6056       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6057                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6058                           p_token1        => 'OKL_SQLCODE',
6059                           p_token1_value  => SQLCODE,
6060                           p_token2        => 'OKL_SQLERRM',
6061                           p_token2_value  => SQLERRM);
6062       RETURN NULL;
6063 
6064 END;
6065 
6066 ----------------------------------------------------------------------------------------------------
6067 
6068     -- Start of Comments
6069     -- Created By:       Ranu Srivastava (rsrivast)
6070     -- Function Name  contract_residual_amount
6071     -- Description:   returns the residual value for given contract
6072     -- Dependencies:
6073     -- Parameters: contract id,contract line id
6074     -- Version: 1.0
6075     -- 20-Dec-02 rsrivast Added new cursor line to calculate contract residual amount for line
6076     -- 27-Oct-04 PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
6077     -- End of Commnets
6078 ----------------------------------------------------------------------------------------------------
6079 
6080 FUNCTION contract_residual_amount( p_contract_id           IN  NUMBER
6081                                  ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6082     IS
6083   l_residual_value NUMBER := 0;
6084 
6085   CURSOR C (p_contract_id  NUMBER)
6086 
6087   IS
6088            SELECT NVL(SUM(RESIDUAL_VALUE),0)
6089            FROM  okl_k_lines_full_v
6090            WHERE dnz_chr_id= p_contract_id
6091            AND sts_code <> 'TERMINATED';
6092 
6093  --Commented this code by rvaduri for bug 3487920
6094   /*
6095  SELECT NVL(SUM(cs.amount),0)
6096  FROM okl_streams_v asv,okl_strm_type_v bs,
6097  okl_strm_elements_v cs,
6098  okl_streams str,
6099  okl_strm_type_v sty
6100  WHERE cs.stm_id = asv.id AND bs.id = asv.sty_id
6101  AND str.sty_id = sty.id
6102  AND UPPER(sty.name) = 'RESIDUAL VALUE'
6103  AND str.say_code = 'CURR'
6104  --multigaap changes
6105  AND STR.ACTIVE_YN = 'Y'
6106  AND STR.PURPOSE_CODE is NULL --end multigaap changes AND
6107  cs.stream_element_date >= SYSDATE AND
6108  asv.khr_id = p_contract_id; */
6109 
6110     CURSOR line(p_contract_line_id   NUMBER)
6111     IS
6112     SELECT NVL(RESIDUAL_VALUE,0)
6113     FROM okl_k_lines
6114     WHERE id = p_contract_line_id;
6115 
6116 
6117 BEGIN
6118   IF p_contract_line_id IS NOT NULL
6119   AND p_contract_line_id <> OKL_API.G_MISS_NUM THEN -- PAGARG bug#3974997 -- check for G_MISS when checking for NULL
6120     OPEN line (p_contract_line_id);
6121     FETCH line INTO l_residual_value;
6122     CLOSE line;
6123   ELSE
6124     OPEN C (p_contract_id);
6125     FETCH C INTO l_residual_value;
6126     CLOSE C;
6127   END IF;
6128   RETURN l_residual_value;
6129   EXCEPTION
6130     WHEN OTHERS THEN
6131       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6132       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6133                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6134                           p_token1        => 'OKL_SQLCODE',
6135                           p_token1_value  => SQLCODE,
6136                           p_token2        => 'OKL_SQLERRM',
6137                           p_token2_value  => SQLERRM);
6138       RETURN NULL;
6139 
6140 END;
6141 
6142 ----------------------------------------------------------------------------------------------------
6143 
6144     -- Start of Comments
6145     -- Created By:       Ranu Srivastava (rsrivast)
6146     -- Function Name  contract_Rent_amount
6147     -- Description:   returns the rent amount for given contract
6148     -- Dependencies:
6149     -- Parameters: contract id,contract line id
6150     -- Version: 1.0
6151     -- 20-Dec-02 rsrivast Added new cursor line to calculate contract rent amount for line
6152     -- 27-Oct-04 PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
6153     -- 04-dec-08 sechawla : Updated curosr 'line', to query for stream type purpsoe instead of stream type,
6154     --	                        added p_contract_id parameter to cursor 'line'
6155     -- End of Commnets
6156 ----------------------------------------------------------------------------------------------------
6157 
6158 FUNCTION contract_rent_amount( p_contract_id           IN  NUMBER
6159                               ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6160     IS
6161   l_rent_amount NUMBER := 0;
6162 
6163   --Get all the future unbilled receivables for the contract.
6164 
6165  -- select changed to filter streams based on purpose instead of on name
6166  -- enhancement done for user defined streams impacts, bug 3924303
6167 
6168   CURSOR C (p_contract_id  NUMBER)
6169   IS
6170   SELECT NVL(SUM(sele.amount),0)
6171   FROM okl_strm_elements sele,
6172            okl_streams str,
6173            okl_strm_type_v sty
6174       WHERE sele.stm_id = str.id
6175            AND str.sty_id = sty.id
6176            AND UPPER(sty.stream_type_purpose) = 'RENT'
6177            AND str.say_code = 'CURR'
6178            AND STR.ACTIVE_YN = 'Y'
6179            AND STR.PURPOSE_CODE IS NULL
6180            AND SELE.DATE_BILLED IS NULL
6181            AND SELE.STREAM_ELEMENT_DATE > SYSDATE
6182            AND str.khr_id = p_contract_id;
6183 
6184 
6185   --Get all the future unbilled receivables for the line.
6186   CURSOR line (p_contract_id NUMBER, p_contract_line_id NUMBER)  IS --sechawla 04-dec-08 : added p_contract_id
6187   SELECT NVL(SUM(sele.amount),0)
6188   FROM okl_strm_elements sele,
6189            okl_streams str,
6190            okl_strm_type_v sty
6191       WHERE sele.stm_id = str.id
6192            AND str.sty_id = sty.id
6193            --AND UPPER(sty.name) = 'RENT' --sechawla 04-dec-08 : remoevd
6194            AND UPPER(sty.stream_type_purpose) = 'RENT' --sechawla 04-dec-08 : added
6195            AND str.say_code = 'CURR'
6196            AND STR.ACTIVE_YN = 'Y'
6197            AND STR.PURPOSE_CODE IS NULL
6198            AND SELE.DATE_BILLED IS NULL
6199            AND SELE.STREAM_ELEMENT_DATE > SYSDATE
6200            AND str.khr_id = p_contract_id --sechawla 04-dec-08 : added
6201            AND str.kle_id = p_contract_line_id;
6202 BEGIN
6203   IF p_contract_line_id IS NOT NULL
6204   AND p_contract_line_id <> OKL_API.G_MISS_NUM THEN -- PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
6205     OPEN line (p_contract_id, p_contract_line_id); --sechawla 04-dec-08 : added p_contract_id
6206     FETCH line INTO l_rent_amount;
6207     CLOSE line;
6208   ELSE
6209     OPEN C (p_contract_id);
6210     FETCH C INTO l_rent_amount;
6211     CLOSE C;
6212   END IF;
6213   RETURN l_rent_amount;
6214   EXCEPTION
6215     WHEN OTHERS THEN
6216       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6217       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6218                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6219                           p_token1        => 'OKL_SQLCODE',
6220                           p_token1_value  => SQLCODE,
6221                           p_token2        => 'OKL_SQLERRM',
6222                           p_token2_value  => SQLERRM);
6223       RETURN NULL;
6224 
6225 END;
6226 
6227 ----------------------------------------------------------------------------------------------------
6228 
6229     -- Start of Comments
6230     -- Created By:       Ranu Srivastava (rsrivast)
6231     -- Function Name  contract_unearned_income
6232     -- Description:   returns the security deposit for given contract
6233     -- Dependencies:
6234     -- Parameters: contract id,contract line id
6235     -- Version: 1.0
6236     -- 20-Dec-02 rsrivast Added new cursor line to calculate contract unearned income for line
6237     -- 27-Oct-04 PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
6238     -- End of Commnets
6239 ----------------------------------------------------------------------------------------------------
6240 
6241 FUNCTION contract_unearned_income( p_contract_id IN  NUMBER
6242                                   ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6243     IS
6244   l_unearned_income NUMBER := 0;
6245 
6246   -- select changed to filter streams based on purpose 'LEASE_INCOME' instead of on type
6247   -- 'PRE-TAX INCOME', changes done for user defined streams impacts, bug 3924303
6248 
6249   CURSOR C (p_contract_id  NUMBER)
6250   IS
6251   SELECT NVL(SUM(sele.amount),0)
6252   FROM okl_strm_elements sele,
6253            --okl_streams str,  MGAAP 7263041
6254            okl_streams_rep_v str,
6255            okl_strm_type_v sty
6256       WHERE sele.stm_id = str.id
6257            AND str.sty_id = sty.id
6258            AND UPPER(sty.stream_type_purpose) = 'LEASE_INCOME'
6259            AND str.say_code = 'CURR'
6260            AND STR.ACTIVE_YN = 'Y'
6261            AND (STR.PURPOSE_CODE IS NULL OR STR.PURPOSE_CODE='REPORT')
6262            AND (sele.accrued_yn IS NULL OR sele.accrued_yn = 'N')
6263            AND SELE.STREAM_ELEMENT_DATE > SYSDATE
6264            AND str.khr_id = p_contract_id;
6265 
6266   --Commented by rvaduri for bug 3536862
6267 /*
6268    SELECT NVL(SUM(sele.amount),0)
6269          FROM okl_strm_elements sele,
6270            okl_streams str,
6271            okl_strm_type_v sty
6272       WHERE sele.stm_id = str.id
6273            AND str.sty_id = sty.id
6274            AND UPPER(sty.name) = 'UNEARNED INCOME'
6275            AND str.say_code = 'CURR'
6276 	   --multigaap changes
6277            AND STR.ACTIVE_YN = 'Y'
6278            AND STR.PURPOSE_CODE IS NULL
6279 	   --end multigaap changes
6280            AND str.khr_id = p_contract_id;
6281 */
6282 
6283     CURSOR line (p_contract_line_id      NUMBER) IS
6284   SELECT NVL(SUM(sele.amount),0)
6285   FROM okl_strm_elements sele,
6286            --okl_streams str,  MGAAP 7263041
6287            okl_streams_rep_v str,
6288            okl_strm_type_v sty
6289       WHERE sele.stm_id = str.id
6290            AND str.sty_id = sty.id
6291            AND UPPER(sty.name) = 'PRE-TAX INCOME'
6292            AND str.say_code = 'CURR'
6293            AND STR.ACTIVE_YN = 'Y'
6294            AND STR.PURPOSE_CODE IS NULL
6295            AND (sele.accrued_yn IS NULL OR sele.accrued_yn = 'N')
6296            AND SELE.STREAM_ELEMENT_DATE > SYSDATE
6297            AND str.kle_id = p_contract_line_id;
6298   --Commented by rvaduri for bug 3536862
6299 /*
6300  *
6301       SELECT NVL(SUM(sel.amount),0)
6302       FROM okl_strm_elements sel,
6303            okl_streams stm,
6304            okl_strm_type_v sty
6305       WHERE sty.name = 'PRE-TAX INCOME'
6306         AND stm.sty_id = sty.id
6307         AND stm.say_code = 'CURR'
6308         AND stm.active_yn = 'Y'
6309         AND stm.kle_id = p_contract_line_id
6310         AND sel.stm_id = stm.id
6311         AND sel.stream_element_date > SYSDATE;
6312 */
6313 
6314 BEGIN
6315   IF p_contract_line_id IS NOT NULL
6316   AND p_contract_line_id <> OKL_API.G_MISS_NUM THEN -- PAGARG bug# 3974997 -- check for G_MISS when checking for NULL
6317     OPEN line (p_contract_line_id);
6318     FETCH line INTO l_unearned_income;
6319     CLOSE line;
6320   ELSE
6321     OPEN C (p_contract_id);
6322     FETCH C INTO l_unearned_income;
6323     CLOSE C;
6324   END IF;
6325   RETURN l_unearned_income;
6326   EXCEPTION
6327     WHEN OTHERS THEN
6328       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6329       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6330                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6331                           p_token1        => 'OKL_SQLCODE',
6332                           p_token1_value  => SQLCODE,
6333                           p_token2        => 'OKL_SQLERRM',
6334                           p_token2_value  => SQLERRM);
6335       RETURN NULL;
6336 
6337 END;
6338 
6339 ----------------------------------------------------------------------------------------------------
6340 
6341     -- Start of Comments
6342     -- Created By:       Ranu Srivastava (rsrivast)
6343     -- Function Name  contract_depriciation_amount
6344     -- Description:   returns the depriciation amount for given contract
6345     -- Dependencies:
6346     -- Parameters: contract id,contract line id
6347     -- Version: 1.0
6348     -- End of Commnets
6349 
6350 ----------------------------------------------------------------------------------------------------
6351 
6352 FUNCTION contract_depriciation_amount( p_contract_id IN  NUMBER
6353                                       ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6354     IS
6355 /** NOTE: This Function is exactly the same as contract_acc_depreciation,
6356  * since the existing function code was wrong. Changed the code in pls
6357  * instead of changing the formula to use a different operand due to
6358  * operational issues of following up for getting the new operand seeded
6359  * Done for bug 3646679 */
6360 
6361 
6362         l_unearned_income NUMBER := 0;
6363         l_depreciation NUMBER := 0;
6364         l_depn_contract NUMBER := 0;
6365         l_converted_amount NUMBER := 0;
6366         p_return_status VARCHAR2(1);
6367         p_contract_start_date DATE;
6368         p_contract_currency             okl_k_headers_full_v.currency_code%TYPE;
6369         p_currency_conversion_type     okl_k_headers_full_v.currency_conversion_type%TYPE;
6370         p_currency_conversion_rate     okl_k_headers_full_v.currency_conversion_rate%TYPE;
6371         p_currency_conversion_date     okl_k_headers_full_v.currency_conversion_date%TYPE;
6372 
6373    --Cursor to get the parent line id for a contract
6374   CURSOR parent_line_id_csr (p_contract_id  NUMBER)
6375   IS
6376    SELECT line.id parent_line_id
6377     FROM okc_k_lines_b line
6378      ,okc_line_styles_v lse
6379     WHERE line.lse_id=lse.id
6380         AND lse.lty_code= 'FREE_FORM1'
6381         AND line.sts_code <> 'ABANDONED'
6382         AND dnz_chr_id = p_contract_id;
6383 
6384 
6385  -- line asset id and corporate book from FA
6386  CURSOR asset_details_csr(p_contract_line_id  NUMBER)
6387  IS
6388  SELECT CORPORATE_BOOK, ASSET_ID
6389  FROM OKX_ASSET_LINES_V
6390  WHERE OKX_ASSET_LINES_V.PARENT_LINE_ID = p_contract_line_id;
6391 
6392  -- total depreciation for the corporate book from FA
6393  CURSOR deprn_details_csr(p_asset_id  NUMBER, p_corporate_book_code VARCHAR2)
6394  IS
6395  SELECT NVL(SUM(deprn_amount), 0) deprn_amount
6396  FROM   OKX_AST_DPRTNS_V
6397  WHERE  Asset_id = p_asset_id
6398  AND    book_type_code = p_corporate_book_code
6399  AND    status = 'A'
6400  AND    NVL(start_date_active,SYSDATE) <= SYSDATE
6401  AND    NVL(end_date_active,SYSDATE + 1) > SYSDATE;
6402 
6403 
6404  -- contract start date
6405  CURSOR contract_start_date_csr(p_khr_id NUMBER)
6406  IS
6407  SELECT start_date FROM okc_k_headers_b
6408  WHERE id = p_khr_id;
6409 
6410  l_streams_repo_policy VARCHAR2(80); -- MGAAP 7263041
6411 
6412 BEGIN
6413 
6414   l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
6415 
6416   -- calculate asset line level depreciation
6417   IF(p_contract_line_id IS NOT NULL) THEN
6418    FOR p_asset_details_csr IN asset_details_csr(p_contract_line_id)
6419    LOOP
6420         FOR p_deprn_details_csr IN deprn_details_csr(p_asset_details_csr.ASSET_ID,
6421                                                 p_asset_details_csr.CORPORATE_BOOK)
6422         LOOP
6423                 l_depreciation := p_deprn_details_csr.deprn_amount;
6424         END LOOP;
6425 
6426    END LOOP;
6427 
6428 
6429    -- convert amount into contract currency
6430    OPEN contract_start_date_csr(p_contract_id);
6431    FETCH contract_start_date_csr INTO p_contract_start_date;
6432    CLOSE contract_start_date_csr;
6433 
6434    okl_accounting_util.convert_to_contract_currency(
6435                                 p_khr_id  => p_contract_id,
6436                                 p_from_currency  => NULL,
6437                                 p_transaction_date => p_contract_start_date,
6438                                 p_amount => l_depreciation,
6439                                 x_return_status => p_return_status,
6440                                 x_contract_currency => p_contract_currency,
6441                                 x_currency_conversion_type => p_currency_conversion_type,
6442                                 x_currency_conversion_rate => p_currency_conversion_rate,
6443                                 x_currency_conversion_date => p_currency_conversion_date,
6444                                 x_converted_amount => l_converted_amount);
6445 
6446    IF(p_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
6447            Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
6448                                p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
6449            RAISE Okl_Api.G_EXCEPTION_ERROR;
6450    END IF;
6451 
6452    RETURN l_converted_amount;
6453 
6454   ELSE
6455   FOR p_parent_line_id_csr  IN parent_line_id_csr(p_contract_id) LOOP
6456      --Get the Parent_line_id based on the contract id
6457    FOR p_asset_details_csr IN asset_details_csr(p_parent_line_id_csr.parent_line_id)
6458    LOOP
6459         FOR p_deprn_details_csr IN deprn_details_csr(p_asset_details_csr.ASSET_ID,
6460                                                         p_asset_details_csr.CORPORATE_BOOK)
6461         LOOP
6462                 --Depreciation Amount from FA
6463                 l_depreciation := p_deprn_details_csr.deprn_amount;
6464         END LOOP;
6465    END LOOP;
6466    l_depn_contract := l_depn_contract + l_depreciation;
6467   END LOOP;
6468    -- convert amount into contract currency
6469    OPEN contract_start_date_csr(p_contract_id);
6470    FETCH contract_start_date_csr INTO p_contract_start_date;
6471    CLOSE contract_start_date_csr;
6472 
6473    okl_accounting_util.convert_to_contract_currency(
6474                                 p_khr_id  => p_contract_id,
6475                                 p_from_currency  => NULL,
6476                                 p_transaction_date => p_contract_start_date,
6477                                 p_amount => l_depn_contract,
6478                                 x_return_status => p_return_status,
6479                                 x_contract_currency => p_contract_currency,
6480                                 x_currency_conversion_type => p_currency_conversion_type,
6481                                 x_currency_conversion_rate => p_currency_conversion_rate,
6482                                 x_currency_conversion_date => p_currency_conversion_date,
6483                                 x_converted_amount => l_converted_amount);
6484 
6485    IF(p_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
6486            Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
6487                                p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
6488            RAISE Okl_Api.G_EXCEPTION_ERROR;
6489    END IF;
6490    RETURN l_converted_amount;
6491 
6492   END IF;
6493 
6494   EXCEPTION
6495     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
6496         RETURN 0;
6497 
6498     WHEN OTHERS THEN
6499       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6500                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6501                           p_token1        => 'OKL_SQLCODE',
6502                           p_token1_value  => SQLCODE,
6503                           p_token2        => 'OKL_SQLERRM',
6504                           p_token2_value  => SQLERRM);
6505       RETURN 0;
6506 
6507 END contract_depriciation_amount;
6508 
6509 ----------------------------------------------------------------------------------------------------
6510 
6511     -- Start of Comments
6512     -- Created By:       Ranu Srivastava (rsrivast)
6513     -- Function Name  contract_principal_amount
6514     -- Description:   returns the Principal amount for given contract
6515     -- Dependencies:
6516     -- Parameters: contract id,contract line id
6517     -- Version: 1.0
6518     -- End of Commnets
6519 
6520 ----------------------------------------------------------------------------------------------------
6521 
6522 FUNCTION contract_principal_amount( p_contract_id           IN  NUMBER
6523 
6524                                  ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6525     IS
6526   l_amount NUMBER := 0;
6527 
6528 /*
6529   CURSOR c (p_contract_id  NUMBER)
6530   IS
6531    SELECT NVL(cs.amount,0)
6532    FROM okl_streams_v asv,okl_strm_type_v bs,
6533         okl_strm_elements_v cs,
6534         okl_streams str,
6535         okl_strm_type_v sty,
6536 	okc_k_headers_v okh
6537    WHERE cs.stm_id = asv.id AND bs.id = asv.sty_id
6538      AND str.sty_id = sty.id
6539      AND UPPER(sty.name) = 'PRINCIPAL BALANCE'
6540      AND str.say_code = 'CURR'
6541    --multigaap changes
6542      AND STR.ACTIVE_YN = 'Y'
6543      AND STR.PURPOSE_CODE is NULL
6544    --end multigaap changes
6545      AND cs.stream_element_date >= SYSDATE
6546 	 AND  cs.stream_element_date BETWEEN okh.start_date AND okh.end_date
6547 	 AND asv.khr_id = okh.id
6548 	 AND asv.khr_id =  p_contract_id;
6549 */
6550 -- query changed to filter streams based on purpose instead of on type
6551 -- changes done for user defined streams impacts, bug 3924303
6552 
6553   CURSOR C (p_contract_id  NUMBER)
6554   IS
6555     --It should be sum because we have to get the Principal balance on
6556     -- all the assets for the contract
6557       SELECT NVL(SUM(sel.amount),0)
6558       FROM okl_strm_elements sel,
6559            okl_streams stm,
6560            okl_strm_type_v sty
6561       WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6562         AND stm.sty_id = sty.id
6563         AND stm.say_code = 'CURR'
6564         AND stm.active_yn = 'Y'
6565         AND stm.purpose_code IS NULL
6566         AND stm.khr_id = p_contract_id
6567         AND sel.stm_id = stm.id
6568         AND sel.stream_element_date =
6569                    ( SELECT NVL(MAX(sel.stream_element_date), SYSDATE)
6570                      FROM okl_strm_elements sel,okl_streams stm,
6571                           okl_strm_type_v sty
6572                      WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6573                        AND stm.sty_id = sty.id
6574                        AND stm.say_code = 'CURR'
6575                        AND stm.active_yn = 'Y'
6576                        AND stm.purpose_code IS NULL
6577                        AND stm.khr_id = p_contract_id
6578                        AND sel.stm_id = stm.id
6579                        AND sel.stream_element_date <= SYSDATE);
6580 BEGIN
6581 
6582   OPEN C (p_contract_id);
6583   FETCH C INTO l_amount;
6584   CLOSE C;
6585 
6586   RETURN l_amount;
6587   EXCEPTION
6588     WHEN OTHERS THEN
6589       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6590       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6591                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6592                           p_token1        => 'OKL_SQLCODE',
6593                           p_token1_value  => SQLCODE,
6594                           p_token2        => 'OKL_SQLERRM',
6595                           p_token2_value  => SQLERRM);
6596       RETURN NULL;
6597 
6598 END;
6599 
6600 --rkraya added
6601 ----------------------------------------------------------------------------------------------------
6602 
6603     -- Start of Comments
6604     -- Created By:       Reeshma Kuttiyat (rkuttiya/rkraya)
6605     -- Function Name:   Unpaid Invoices
6606     -- Description:     Function returns the sum of unpaid invoices for the asset line
6607     -- Dependencies:
6608     -- Parameters: contract id,contract line id
6609     -- Version: 1.0
6610     -- End of Commnets
6611 
6612 ----------------------------------------------------------------------------------------------------
6613 
6614 FUNCTION unpaid_invoices( p_contract_id           IN  NUMBER
6615                          ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6616     IS
6617   l_unpaid_inv   NUMBER := 0;
6618   CURSOR c_unpaid_inv(p_contract_line_id IN NUMBER) IS
6619   SELECT SUM(APS.AMOUNT_DUE_REMAINING)
6620   FROM
6621   AR_PAYMENT_SCHEDULES_ALL APS,
6622 /*
6623   16-Aug-2007, ankushar Bug# 5499193
6624   start changes, modified the cursor to replace reference to okl_cnsld_ar_strms_b
6625  */
6626   okl_bpd_tld_ar_lines_v LSM,
6627 --  OKC_K_HEADERS_B CHR, commenting unused table, ankushar Bug# 5499193
6628 /* 16-Aug-2007 ankushar end changes */
6629   OKC_K_LINES_B CLE,
6630   OKC_LINE_STYLES_B LSE
6631   WHERE
6632   LSM.KLE_ID = p_contract_line_id
6633   AND LSM.CUSTOMER_TRX_ID = APS.CUSTOMER_TRX_ID
6634   AND APS.STATUS = 'OP'
6635   AND APS.CLASS IN ('INV')
6636   AND LSM.KLE_ID = CLE.CLE_ID
6637   AND CLE.LSE_ID = LSE.ID
6638   AND LSE.LTY_CODE = 'FIXED_ASSET';
6639 
6640 BEGIN
6641 
6642   OPEN c_unpaid_inv (p_contract_line_id);
6643   FETCH c_unpaid_inv INTO l_unpaid_inv;
6644   CLOSE c_unpaid_inv;
6645 
6646   RETURN l_unpaid_inv;
6647   EXCEPTION
6648     WHEN OTHERS THEN
6649       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6650       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6651                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6652                           p_token1        => 'OKL_SQLCODE',
6653                           p_token1_value  => SQLCODE,
6654                           p_token2        => 'OKL_SQLERRM',
6655                           p_token2_value  => SQLERRM);
6656       RETURN NULL;
6657 
6658 END;
6659 
6660 ----------------------------------------------------------------------------------------------------
6661 
6662     -- Start of Comments
6663     -- Created By:       Reeshma Kuttiyat (rkuttiya/rkraya)
6664     -- Function Name:   Unapplied Credit Memos
6665     -- Description:     Function returns the sum of unapplied credit memos for the asset line
6666     -- Dependencies:
6667     -- Parameters: contract id,contract line id
6668     -- Version: 1.0
6669     -- End of Commnets
6670 
6671 ----------------------------------------------------------------------------------------------------
6672 
6673  FUNCTION unapplied_credit_memos( p_contract_id           IN  NUMBER
6674                                 ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6675   IS
6676 
6677   l_unapplied_credit  NUMBER :=0;
6678   CURSOR c_unapplied_credit(p_contract_line_id IN NUMBER) IS
6679   SELECT SUM(APS.AMOUNT_DUE_REMAINING)
6680   FROM
6681   AR_PAYMENT_SCHEDULES_ALL APS,
6682 /*
6683   16-Aug-2007, ankushar Bug# 5499193
6684   start changes, modified the cursor to replace reference to okl_cnsld_ar_strms_b
6685  */
6686   okl_bpd_tld_ar_lines_v LSM,
6687 --  OKC_K_HEADERS_B CHR, commenting unused table, ankushar Bug# 5499193
6688 /* 16-Aug-2007 ankushar end changes */
6689   OKC_K_LINES_B CLE,
6690   OKC_LINE_STYLES_B LSE
6691   WHERE
6692   LSM.KLE_ID = p_contract_line_id
6693   AND LSM.CUSTOMER_TRX_ID = APS.CUSTOMER_TRX_ID
6694   AND APS.STATUS = 'OP'
6695   AND APS.CLASS IN ('CM')
6696   AND LSM.KLE_ID = CLE.CLE_ID
6697   AND CLE.LSE_ID = LSE.ID
6698   AND LSE.LTY_CODE = 'FIXED_ASSET';
6699 
6700 BEGIN
6701 
6702   OPEN c_unapplied_credit(p_contract_line_id);
6703   FETCH c_unapplied_credit INTO l_unapplied_credit;
6704   CLOSE c_unapplied_credit;
6705 
6706   l_unapplied_credit := 0 - l_unapplied_credit;
6707 
6708   RETURN l_unapplied_credit;
6709   EXCEPTION
6710     WHEN OTHERS THEN
6711       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
6712       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
6713                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
6714                           p_token1        => 'OKL_SQLCODE',
6715                           p_token1_value  => SQLCODE,
6716                           p_token2        => 'OKL_SQLERRM',
6717                           p_token2_value  => SQLERRM);
6718       RETURN NULL;
6719 
6720 END;
6721 
6722 
6723 ----------------------------------------------------------------------------------------------------
6724 
6725     -- Start of Comments
6726     -- Created By:       Ravikumar Vaduri
6727     -- Function Name  contract_prin_balance
6728     -- Description:   returns the Principal balance for given contract
6729     -- Dependencies:
6730     -- Parameters: contract id,contract line id
6731     --  the parameter Contract line id is not used for anything.
6732     -- Version: 1.0
6733     -- 20-Dec-02 rsrivast Added new cursor line to calculate contract principal balance for line
6734     -- 01-Dec-04 rmunjulu Modified to get quote id and from that the quote eff from date and use that
6735     -- End of Commnets
6736 
6737 ----------------------------------------------------------------------------------------------------
6738 FUNCTION contract_prin_balance( p_contract_id           IN  NUMBER
6739                                  ,p_contract_line_id      IN NUMBER) RETURN NUMBER
6740 
6741 IS
6742 -- select changed to filter streams based on purpose instead of on type
6743 -- enhancement done for user defined streams impacts, bug 3924303
6744 
6745   CURSOR C (p_contract_id  NUMBER, p_date DATE) -- rmunjulu EDAT
6746   IS
6747     --It should be sum because we have to get the Principal balance on
6748     -- all the assets for the contract
6749       SELECT NVL(SUM(sel.amount),0)
6750       FROM okl_strm_elements sel,
6751            okl_streams stm,
6752            okl_strm_type_v sty
6753       WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6754         AND stm.sty_id = sty.id
6755         AND stm.say_code = 'CURR'
6756         AND stm.active_yn = 'Y'
6757         AND stm.purpose_code IS NULL
6758         AND stm.khr_id = p_contract_id
6759         AND sel.stm_id = stm.id
6760         AND sel.stream_element_date =
6761                    ( SELECT NVL(MAX(sel.stream_element_date), SYSDATE)
6762                      FROM okl_strm_elements sel,okl_streams stm,
6763                           okl_strm_type_v sty
6764                      WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6765                        AND stm.sty_id = sty.id
6766                        AND stm.say_code = 'CURR'
6767                        AND stm.active_yn = 'Y'
6768                        AND stm.purpose_code IS NULL
6769                        AND stm.khr_id = p_contract_id
6770                        AND sel.stm_id = stm.id
6771                        AND sel.stream_element_date <= p_date); -- rmunjulu EDAT
6772 
6773 -- select changed to filter streams based on purpose instead of on type
6774 -- enhancement done for user defined streams impacts, bug 3924303
6775 
6776      CURSOR line (p_contract_line_id NUMBER, p_date DATE) IS
6777       SELECT NVL(sel.amount,0)
6778       FROM okl_strm_elements sel,
6779            okl_streams stm,
6780            okl_strm_type_v sty
6781       WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6782         AND stm.sty_id = sty.id
6783         AND stm.say_code = 'CURR'
6784         AND stm.active_yn = 'Y'
6785         AND stm.purpose_code IS NULL
6786         AND stm.kle_id = p_contract_line_id
6787         AND sel.stm_id = stm.id
6788         AND sel.stream_element_date =
6789                    ( SELECT NVL(MAX(sel.stream_element_date), SYSDATE)
6790                      FROM okl_strm_elements sel,okl_streams stm,
6791                           okl_strm_type_v sty
6792                      WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
6793                        AND stm.sty_id = sty.id
6794                        AND stm.say_code = 'CURR'
6795                        AND stm.active_yn = 'Y'
6796                        AND stm.kle_id = p_contract_line_id
6797                        AND stm.purpose_code IS NULL
6798                        AND sel.stm_id = stm.id
6799                        AND sel.stream_element_date <= p_date); -- rmunjulu EDAT
6800 
6801     l_principal_balance NUMBER;
6802 
6803         -- rmunjulu EDAT
6804         CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
6805         SELECT trunc(qte.date_effective_from) date_effective_from
6806         FROM   okl_trx_quotes_b  qte
6807         WHERE  qte.id = p_quote_id;
6808 
6809 		-- rmunjulu EDAT
6810         l_quote_id NUMBER;
6811         l_quote_date DATE;
6812         l_sysdate DATE;
6813 
6814 BEGIN
6815 
6816   -- rmunjulu EDAT  Get additional parameter if found
6817   IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
6818       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
6819 	  LOOP
6820         -- rmunjulu EDAT -- get quote id
6821         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_id' THEN
6822           l_quote_id := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
6823         END IF;
6824       END LOOP;
6825   END IF;
6826 
6827   -- rmunjulu EDAT
6828   SELECT SYSDATE INTO l_sysdate FROM dual;
6829 
6830   -- rmunjulu EDAT  -- get eff date for quote
6831   IF  l_quote_id IS NOT NULL
6832   AND l_quote_id <> OKL_API.G_MISS_NUM THEN
6833 
6834 	   FOR get_quote_date_rec IN get_quote_date_csr (l_quote_id) LOOP
6835 	      l_quote_date := get_quote_date_rec.date_effective_from;
6836 	   END LOOP;
6837 
6838   END IF;
6839 
6840   -- rmunjulu EDAT Default the l_quote_date to sysdate if quote id not found
6841   IF l_quote_date IS NULL
6842   OR l_quote_date = OKL_API.G_MISS_DATE THEN
6843        l_quote_date := l_sysdate;
6844   END IF;
6845 
6846   IF p_contract_line_id IS NOT NULL THEN
6847     OPEN line (p_contract_line_id, l_quote_date); -- rmunjulu EDAT
6848     FETCH line INTO l_principal_balance;
6849     CLOSE line;
6850   ELSE
6851 
6852     OPEN C(p_contract_id, l_quote_date); -- rmunjulu EDAT
6853     FETCH C INTO l_principal_balance;
6854     CLOSE C;
6855 
6856   END IF;
6857 
6858   RETURN l_principal_balance;
6859 END contract_prin_balance;
6860 
6861 ----------------------------------------------------------------------------------------------------
6862 
6863     -- Start of Comments
6864     -- Created By:       Sridhar Moduga
6865     -- Function Name  get_asset_subsidy_amount
6866     -- Description:   returns the asset subsidy amount for given contract
6867     -- Dependencies:
6868     -- Parameters: contract id,accounting method
6869     --
6870     -- Version: 1.0
6871     --
6872     -- End of Comments
6873 
6874 ----------------------------------------------------------------------------------------------------
6875 FUNCTION get_asset_subsidy_amount(
6876     p_contract_id                 IN  NUMBER,
6877     p_accounting_method           IN  VARCHAR2)
6878 RETURN NUMBER IS
6879 
6880     lx_return_status        VARCHAR2(1)  DEFAULT OKL_API.G_RET_STS_SUCCESS;
6881     l_api_name             CONSTANT     VARCHAR2(30) := 'GET_ASSET_SUBSIDY';
6882     l_api_version          CONSTANT     NUMBER := 1.0;
6883     l_init_msg_list                     VARCHAR2(1) := OKL_API.G_FALSE;
6884     lx_msg_count                        NUMBER := OKL_API.G_MISS_NUM;
6885     lx_msg_data                         VARCHAR2(2000);
6886 
6887     x_subsidy_amount       NUMBER;
6888 
6889     l_asset_subsidy_amount NUMBER;
6890 
6891     --cursor to fetch all the subsidies attached to financial asset
6892     --smoduga modified to set 0 when sub_kle.amount is null
6893     -- passing accounting method as input parameter
6894     CURSOR l_sub_csr(c_contract_id IN NUMBER,c_accounting_method IN  VARCHAR2) IS
6895     SELECT NVL(SUM(NVL(sub_kle.subsidy_override_amount, sub_kle.amount)),0)
6896     FROM   okl_subsidies_b    subb,
6897            okl_k_lines        sub_kle,
6898            okc_k_lines_b      sub_cle,
6899            okc_line_styles_b  sub_lse
6900     WHERE  subb.id                     = sub_kle.subsidy_id
6901     AND    subb.accounting_method_code = NVL(UPPER(c_accounting_method),subb.accounting_method_code)
6902     AND    sub_kle.id                  = sub_cle.id
6903     AND    sub_cle.lse_id              = sub_lse.id
6904     AND    sub_lse.lty_code            = 'SUBSIDY'
6905     AND    sub_cle.sts_code            <> 'ABANDONED'
6906     AND    sub_cle.dnz_chr_id          = c_contract_id
6907     AND    subb.customer_visible_yn    = 'Y'
6908     ;
6909 
6910 -- START: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6911     l_accounting_method okl_subsidies_b.accounting_method_code%TYPE;
6912 -- END: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6913     l_subsidy_cle_id NUMBER;
6914 BEGIN
6915 
6916 	l_asset_subsidy_amount := 0;
6917 -- START: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6918     IF(p_accounting_method = OKL_API.G_MISS_NUM OR p_accounting_method = OKL_API.G_MISS_CHAR) THEN
6919         l_accounting_method := NULL;
6920     END IF;
6921 -- END: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6922     --------------------------------------------------------------
6923     --get all the subsidies associated to asset and get amount
6924     --------------------------------------------------------------
6925     --smoduga added accountingmethod as in parameter
6926 --    OPEN l_sub_csr(p_contract_id , p_accounting_method);
6927 -- START: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6928     OPEN l_sub_csr(p_contract_id , l_accounting_method);
6929 -- END: cklee bug#4437995 if p_accounting_method has G_MISS then make it NULL
6930     LOOP
6931         FETCH l_sub_csr INTO l_asset_subsidy_amount;
6932         EXIT WHEN l_sub_csr%NOTFOUND;
6933     END LOOP;
6934     CLOSE l_sub_csr;
6935 
6936     x_subsidy_amount := l_asset_subsidy_amount;
6937 
6938     RETURN x_subsidy_amount;
6939 
6940     EXCEPTION
6941     WHEN OKL_API.G_EXCEPTION_ERROR THEN
6942     lx_return_status := OKL_API.HANDLE_EXCEPTIONS(
6943                                l_api_name,
6944                                G_PKG_NAME,
6945                                'OKL_API.G_RET_STS_ERROR',
6946                                lx_msg_count,
6947                                lx_msg_data,
6948                                '_PVT');
6949     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
6950     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
6951                               l_api_name,
6952                               G_PKG_NAME,
6953                               'OKL_API.G_RET_STS_UNEXP_ERROR',
6954                               lx_msg_count,
6955                               lx_msg_data,
6956                               '_PVT');
6957     WHEN OTHERS THEN
6958     IF l_sub_csr%ISOPEN THEN
6959         CLOSE l_sub_csr;
6960     END IF;
6961     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
6962                               l_api_name,
6963                               G_PKG_NAME,
6964                               'OTHERS',
6965                               lx_msg_count,
6966                               lx_msg_data,
6967                               '_PVT');
6968 
6969 END get_asset_subsidy_amount;
6970 
6971 
6972 ----------------------------------------------------------------------------------------------------
6973 
6974     -- Start of Comments
6975     -- Created By:       Ravikumar Vaduri
6976     -- Function Name  contract_acc_depreciation
6977     -- Description:   returns the acc depreciation for a contract from FA
6978     --                this function is used in calculation of NET INVESTMENT for
6979     --                  OP LEASE
6980     -- Dependencies:
6981     -- Parameters: contract id,contract line id
6982     -- Version: 1.0
6983     -- 17-MAR-04 rvaduri  Created the Function
6984     -- End of Commnets
6985 
6986 ----------------------------------------------------------------------------------------------------
6987 
6988 FUNCTION contract_acc_depreciation( p_contract_id IN  NUMBER
6989                                     ,p_contract_line_id      IN NUMBER)
6990          RETURN NUMBER IS
6991 
6992         l_unearned_income NUMBER := 0;
6993         l_depreciation NUMBER := 0;
6994         l_depn_contract NUMBER := 0;
6995         l_converted_amount NUMBER := 0;
6996         p_return_status VARCHAR2(1);
6997         p_contract_start_date DATE;
6998         p_contract_currency             okl_k_headers_full_v.currency_code%TYPE;
6999         p_currency_conversion_type okl_k_headers_full_v.currency_conversion_type%TYPE;
7000         p_currency_conversion_rate okl_k_headers_full_v.currency_conversion_rate%TYPE;
7001         p_currency_conversion_date okl_k_headers_full_v.currency_conversion_date%TYPE;
7002 
7003    --Cursor to get the parent line id for a contract
7004   CURSOR parent_line_id_csr (p_contract_id  NUMBER)
7005   IS
7006    SELECT line.id parent_line_id
7007     FROM okc_k_lines_b line
7008      ,okc_line_styles_v lse
7009     WHERE line.lse_id=lse.id
7010         AND lse.lty_code= 'FREE_FORM1'
7011         AND line.sts_code <> 'ABANDONED'
7012         AND dnz_chr_id = p_contract_id;
7013 
7014 
7015  -- line asset id and corporate book from FA
7016  CURSOR asset_details_csr(p_contract_line_id  NUMBER)
7017  IS
7018  SELECT CORPORATE_BOOK, ASSET_ID
7019  FROM OKX_ASSET_LINES_V
7020  WHERE OKX_ASSET_LINES_V.PARENT_LINE_ID = p_contract_line_id;
7021 
7022  -- total depreciation for the corporate book from FA
7023  CURSOR deprn_details_csr(p_asset_id  NUMBER, p_corporate_book_code VARCHAR2)
7024  IS
7025  SELECT NVL(SUM(deprn_amount), 0) deprn_amount
7026  FROM   OKX_AST_DPRTNS_V
7027  WHERE  Asset_id = p_asset_id
7028  AND    book_type_code = p_corporate_book_code
7029  AND    status = 'A'
7030  AND    NVL(start_date_active,SYSDATE) <= SYSDATE
7031  AND    NVL(end_date_active,SYSDATE + 1) > SYSDATE;
7032 
7033 
7034  -- contract start date
7035  CURSOR contract_start_date_csr(p_khr_id NUMBER)
7036  IS
7037  SELECT start_date FROM okc_k_headers_b
7038  WHERE id = p_khr_id;
7039 
7040  l_streams_repo_policy VARCHAR2(80); -- MGAAP 7263041
7041 BEGIN
7042 
7043   l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
7044   -- calculate asset line level depreciation
7045   IF(p_contract_line_id IS NOT NULL) THEN
7046    FOR p_asset_details_csr IN asset_details_csr(p_contract_line_id)
7047    LOOP
7048         FOR p_deprn_details_csr IN deprn_details_csr(p_asset_details_csr.ASSET_ID,
7049                                                 p_asset_details_csr.CORPORATE_BOOK)
7050         LOOP
7051                 l_depreciation := p_deprn_details_csr.deprn_amount;
7052         END LOOP;
7053 
7054    END LOOP;
7055 
7056 
7057    -- convert amount into contract currency
7058    OPEN contract_start_date_csr(p_contract_id);
7059    FETCH contract_start_date_csr INTO p_contract_start_date;
7060    CLOSE contract_start_date_csr;
7061 
7062    okl_accounting_util.convert_to_contract_currency(
7063                                 p_khr_id  => p_contract_id,
7064                                 p_from_currency  => NULL,
7065                                 p_transaction_date => p_contract_start_date,
7066                                 p_amount => l_depreciation,
7067                                 x_return_status => p_return_status,
7068                                 x_contract_currency => p_contract_currency,
7069                                 x_currency_conversion_type => p_currency_conversion_type,
7070                                 x_currency_conversion_rate => p_currency_conversion_rate,
7071                                 x_currency_conversion_date => p_currency_conversion_date,
7072                                 x_converted_amount => l_converted_amount);
7073 
7074    IF(p_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
7075            Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
7076                                p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
7077            RAISE Okl_Api.G_EXCEPTION_ERROR;
7078    END IF;
7079 
7080    RETURN l_converted_amount;
7081 
7082   ELSE
7083   FOR p_parent_line_id_csr  IN parent_line_id_csr(p_contract_id) LOOP
7084      --Get the Parent_line_id based on the contract id
7085    FOR p_asset_details_csr IN asset_details_csr(p_parent_line_id_csr.parent_line_id)
7086    LOOP
7087         FOR p_deprn_details_csr IN deprn_details_csr(p_asset_details_csr.ASSET_ID,
7088                                                         p_asset_details_csr.CORPORATE_BOOK)
7089         LOOP
7090                 --Depreciation Amount from FA
7091                 l_depreciation := p_deprn_details_csr.deprn_amount;
7092         END LOOP;
7093    END LOOP;
7094    l_depn_contract := l_depn_contract + l_depreciation;
7095   END LOOP;
7096    -- convert amount into contract currency
7097    OPEN contract_start_date_csr(p_contract_id);
7098    FETCH contract_start_date_csr INTO p_contract_start_date;
7099    CLOSE contract_start_date_csr;
7100 
7101 --rkuttiya modified for bug#4367682 changed l_depreciation to l_depn_contract
7102    okl_accounting_util.convert_to_contract_currency(
7103                                 p_khr_id  => p_contract_id,
7104                                 p_from_currency  => NULL,
7105                                 p_transaction_date => p_contract_start_date,
7106                                 p_amount => l_depn_contract,
7107                                 x_return_status => p_return_status,
7108                                 x_contract_currency => p_contract_currency,
7109                                 x_currency_conversion_type => p_currency_conversion_type,
7110                                 x_currency_conversion_rate => p_currency_conversion_rate,
7111                                 x_currency_conversion_date => p_currency_conversion_date,
7112                                 x_converted_amount => l_converted_amount);
7113 
7114    IF(p_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
7115            Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
7116                                p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
7117            RAISE Okl_Api.G_EXCEPTION_ERROR;
7118    END IF;
7119    RETURN l_converted_amount;
7120 
7121   END IF;
7122 
7123   EXCEPTION
7124     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
7125         RETURN 0;
7126 
7127     WHEN OTHERS THEN
7128       Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
7129                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
7130                           p_token1        => 'OKL_SQLCODE',
7131                           p_token1_value  => SQLCODE,
7132                           p_token2        => 'OKL_SQLERRM',
7133                           p_token2_value  => SQLERRM);
7134       RETURN 0;
7135 
7136 END contract_acc_depreciation;
7137 
7138 ----------------------------------------------------------------------------------------------------
7139 
7140     -- Start of Comments
7141     -- Created By:       Ravikumar Vaduri
7142     -- Function Name  pv_of_unbilled_rents
7143     -- Description:   returns the Present value of Unbilled Rent for a contract
7144     --                this function is used in calculation of NET INVESTMENT for
7145     --                  DF LEASE
7146     -- Dependencies:
7147     -- Parameters: contract id,contract line id
7148     -- Version: 1.0
7149     -- 17-MAR-04 rvaduri  Created the Function
7150     -- End of Commnets
7151 
7152 ----------------------------------------------------------------------------------------------------
7153 
7154 FUNCTION pv_of_unbilled_rents(
7155             p_contract_id           IN  NUMBER
7156            ,p_contract_line_id      IN NUMBER) RETURN NUMBER  IS
7157 
7158     l_api_name          CONSTANT VARCHAR2(30) := 'PV_OF_UNBILLED_RENTS';
7159     l_api_version       CONSTANT NUMBER       := 1;
7160     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7161     x_msg_count         NUMBER;
7162     x_msg_data          VARCHAR2(256);
7163     l_cash_flow_tbl     OKL_STREAM_GENERATOR_PVT.cash_flow_tbl;
7164     i                   NUMBER := 0;
7165     l_total_rent        NUMBER := 0;
7166     l_rent              NUMBER := 0;
7167     l_rate              NUMBER := 0;
7168     x_pv_amount         NUMBER := 0;
7169     l_due_date          DATE;
7170     l_currency          VARCHAR2(30);
7171     l_kle_id              NUMBER := 0;
7172     l_slh_id              NUMBER := 0;
7173     l_freq             VARCHAR2(10);
7174 
7175 -- select changed to filter streams based on purpose instead of on type
7176 -- enhancement done for user defined streams impacts, bug 3924303
7177 
7178     CURSOR contract_unbilled_rent_csr(c_contract_id NUMBER)
7179     IS
7180       SELECT sel.amount rent
7181             ,sel.stream_element_date due_date
7182             ,stm.kle_id
7183       FROM okl_strm_elements sel,
7184            okl_streams stm,
7185            okl_strm_type_v sty
7186       WHERE sty.stream_type_purpose = 'RENT'
7187         AND stm.sty_id = sty.id
7188         AND stm.say_code = 'CURR'
7189         AND stm.active_yn = 'Y'
7190         AND stm.purpose_code IS NULL
7191         AND stm.khr_id = c_contract_id
7192         AND sel.stm_id = stm.id
7193         AND sel.date_billed IS NULL;
7194 
7195 
7196 -- select changed to filter streams based on purpose instead of on type
7197 -- enhancement done for user defined streams impacts, bug 3924303
7198 
7199     CURSOR line_unbilled_rent_csr(c_contract_line_id NUMBER)
7200     IS
7201      SELECT sel.amount rent
7202             ,sel.stream_element_date due_date
7203       FROM okl_strm_elements sel,
7204            okl_streams stm,
7205            okl_strm_type_v sty
7206       WHERE sty.stream_type_purpose = 'RENT'
7207         AND stm.sty_id = sty.id
7208         AND stm.say_code = 'CURR'
7209         AND stm.active_yn = 'Y'
7210         AND stm.purpose_code IS NULL
7211         AND stm.kle_id = c_contract_line_id
7212         AND sel.stm_id = stm.id
7213         AND sel.date_billed IS NULL;
7214 
7215 
7216 
7217     CURSOR c_get_rent_slh_id(c_line_id NUMBER,c_khr_id NUMBER)
7218     IS
7219         SELECT rl.id
7220         FROM okc_rule_groups_v rg,
7221              okc_rules_v rl
7222         WHERE rl.rgp_id = rg.id
7223           AND rl.dnz_chr_id = rg.dnz_chr_id
7224           AND rg.cle_id = c_line_id
7225           AND rg.rgd_code = 'LALEVL'
7226           AND rl.rule_information_category = 'LASLH'
7227           AND rl.dnz_chr_id = c_khr_id
7228           AND rl.object1_id1=(SELECT id FROM okl_strm_type_b WHERE code='RENT');
7229 
7230     CURSOR c_get_freq(c_line_id NUMBER,c_khr_id NUMBER,c_rent_slh_id NUMBER)
7231     IS
7232         SELECT rl.object1_id1 frequency
7233         FROM okc_rule_groups_v rg,
7234              okc_rules_v rl
7235         WHERE rl.rgp_id = rg.id
7236           AND rl.dnz_chr_id = rg.dnz_chr_id
7237           AND rg.cle_id = c_line_id
7238           AND rg.rgd_code = 'LALEVL'
7239           AND rl.rule_information_category = 'LASLL'
7240           AND rl.dnz_chr_id = c_khr_id
7241           AND rl.object2_id1=c_rent_slh_id
7242           AND ROWNUM = 1;
7243 
7244 
7245     CURSOR contract_rate_csr (c_contract_id NUMBER)
7246     IS
7247     SELECT implicit_interest_rate
7248     FROM okl_k_headers
7249     WHERE id=c_contract_id;
7250 
7251 
7252     CURSOR k_curr_code (c_contract_id NUMBER)
7253     IS
7254     SELECT currency_code
7255     FROM okc_k_headers_b
7256     WHERE id=c_contract_id;
7257 
7258 
7259 
7260     BEGIN
7261 
7262         --Get the contract currency Code.
7263         OPEN k_curr_code(p_contract_id);
7264         FETCH k_curr_code INTO l_currency;
7265         CLOSE k_curr_code;
7266 
7267         --Get the Interest Rate on the contract.
7268         OPEN contract_rate_csr(p_contract_id);
7269         FETCH contract_rate_csr INTO l_rate;
7270         CLOSE contract_rate_csr;
7271 
7272         IF l_rate IS NULL THEN
7273            Okl_Api.set_message(p_app_name     => G_APP_NAME,
7274                           p_msg_name     => G_REQUIRED_VALUE,
7275                           p_token1       => G_COL_NAME_TOKEN,
7276                           p_token1_value => 'RATE');
7277 
7278            RAISE OKC_API.G_EXCEPTION_ERROR;
7279         END IF;
7280 
7281         IF p_contract_line_id IS NOT NULL THEN
7282 
7283             FOR cur_rec IN line_unbilled_rent_csr(p_contract_line_id) LOOP
7284                 l_due_date := cur_rec.due_date;
7285                 l_rent     := cur_rec.rent;
7286 
7287                 IF l_due_date < SYSDATE THEN
7288                 --The Due date is in the past, i.e no billing has been run
7289                 --so the present value of the rent is the actual value
7290                 --that is present in the streams table.
7291                         l_total_rent := l_total_rent + l_rent;
7292                 ELSE
7293                     i := i + 1;
7294                 --The Due date is in the future, so we have to calculate the
7295                 --present value of the rent.
7296                     OPEN c_get_rent_slh_id(p_contract_line_id,p_contract_id);
7297                     FETCH c_get_rent_slh_id INTO l_slh_id;
7298                     CLOSE c_get_rent_slh_id;
7299 
7300 
7301                     OPEN c_get_freq(p_contract_line_id,p_contract_id,l_slh_id);
7302                     FETCH c_get_freq INTO l_freq;
7303                     CLOSE c_get_freq;
7304 
7305 
7306 
7307                 --Populate the pl/sql table for the calculation of PV of rent.
7308 
7309                         l_cash_flow_tbl(i).cf_date   := l_due_date;
7310                         l_cash_flow_tbl(i).cf_amount := l_rent;
7311                         l_cash_flow_tbl(i).cf_frequency   := l_freq;
7312                 END IF;
7313             END LOOP;
7314                 --Call the API that does the PV calculation.
7315 
7316              IF  l_cash_flow_tbl.COUNT > 0 THEN
7317                   OKL_STREAM_GENERATOR_PVT.get_present_value(
7318                                    p_api_version          => l_api_version,
7319                                    p_init_msg_list        => OKL_API.G_TRUE,
7320                                    p_cash_flow_tbl        => l_cash_flow_tbl,
7321                                    p_rate                 => l_rate,
7322                                    p_pv_date              => SYSDATE,
7323                                    x_pv_amount            => x_pv_amount,
7324                                    x_return_status        => x_return_status,
7325                                    x_msg_count            => x_msg_count,
7326                                    x_msg_data             => x_msg_data);
7327 
7328                 IF (x_return_status = okl_api.G_RET_STS_UNEXP_ERROR) THEN
7329                     RAISE okl_api.G_EXCEPTION_UNEXPECTED_ERROR;
7330                 ELSIF (x_return_status = okl_api.G_RET_STS_ERROR) THEN
7331                     RAISE okl_api.G_EXCEPTION_ERROR;
7332                 END IF;
7333              END IF;
7334 
7335                 l_total_rent := l_total_rent + NVL(x_pv_amount,0);
7336 
7337         ELSE
7338 
7339             FOR cur_rec IN contract_unbilled_rent_csr(p_contract_id) LOOP
7340 
7341                 l_due_date := cur_rec.due_date;
7342                 l_rent     := cur_rec.rent;
7343                 l_kle_id   := cur_rec.kle_id;
7344                 IF l_due_date < SYSDATE THEN
7345                 --The Due date is in the past, i.e no billing has been run
7346                 --so the present value of the rent is the actual value
7347                 --that is present in the streams table.
7348                         l_total_rent := l_total_rent + l_rent;
7349                 ELSE
7350                     i := i + 1;
7351                 --The Due date is in the future, so we have to calculate the
7352                 --present value of the rent.
7353                     OPEN c_get_rent_slh_id(l_kle_id,p_contract_id);
7354                     FETCH c_get_rent_slh_id INTO l_slh_id;
7355                     CLOSE c_get_rent_slh_id;
7356 
7357 
7358                     OPEN c_get_freq(l_kle_id,p_contract_id,l_slh_id);
7359                     FETCH c_get_freq INTO l_freq;
7360                     CLOSE c_get_freq;
7361 
7362 
7363                 --Populate the pl/sql table for the calculation of PV of rent.
7364                         l_cash_flow_tbl(i).cf_date   := l_due_date;
7365                         l_cash_flow_tbl(i).cf_amount := l_rent;
7366                         l_cash_flow_tbl(i).cf_frequency   := l_freq;
7367                 END IF;
7368             END LOOP;
7369                 --Call the API that does the PV calculation.
7370              IF  l_cash_flow_tbl.COUNT > 0 THEN
7371                     OKL_STREAM_GENERATOR_PVT.get_present_value(
7372                                    p_api_version          => l_api_version,
7373                                    p_init_msg_list        => OKL_API.G_TRUE,
7374                                    p_cash_flow_tbl        => l_cash_flow_tbl,
7375                                    p_rate                 => l_rate,
7376                                    p_pv_date              => SYSDATE,
7377                                    x_pv_amount            => x_pv_amount,
7378                                    x_return_status        => x_return_status,
7379                                    x_msg_count            => x_msg_count,
7380                                    x_msg_data             => x_msg_data);
7381 
7382                 IF (x_return_status = okl_api.G_RET_STS_UNEXP_ERROR) THEN
7383                     RAISE okl_api.G_EXCEPTION_UNEXPECTED_ERROR;
7384                 ELSIF (x_return_status = okl_api.G_RET_STS_ERROR) THEN
7385                     RAISE okl_api.G_EXCEPTION_ERROR;
7386                 END IF;
7387             END IF;
7388                 l_total_rent := l_total_rent + NVL(x_pv_amount,0);
7389         END IF;
7390 
7391         --Round the amount before returning it.
7392         RETURN  OKL_ACCOUNTING_UTIL.round_amount(l_total_rent,l_currency);
7393 
7394 
7395    EXCEPTION
7396    WHEN OKL_API.G_EXCEPTION_ERROR THEN
7397     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
7398                                l_api_name,
7399                                G_PKG_NAME,
7400                                'OKL_API.G_RET_STS_ERROR',
7401                                x_msg_count,
7402                                x_msg_data,
7403                                '_PVT');
7404     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
7405     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
7406                               l_api_name,
7407                               G_PKG_NAME,
7408                               'OKL_API.G_RET_STS_UNEXP_ERROR',
7409                               x_msg_count,
7410                               x_msg_data,
7411                               '_PVT');
7412     WHEN OTHERS THEN
7413     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
7414                               l_api_name,
7415                               G_PKG_NAME,
7416                               'OTHERS',
7417                               x_msg_count,
7418                               x_msg_data,
7419                               '_PVT');
7420 END pv_of_unbilled_rents;
7421 
7422 
7423 ---------------------------------------------
7424 -- End CS Functions
7425 ---------------------------------------------
7426 
7427 -----------------------------------------------------------------------
7428 -- Functions By pdevaraj -start
7429 -----------------------------------------------------------------------
7430 -----------------------------------------------------------------------
7431 -- Start of Comments
7432 -- Created By:    Punitharaj Devaraju (pdevaraj)
7433 -- Function Name: contract_net_investment
7434 -- Description:   Get net investment for a contract.
7435 -- Dependencies:  OKL_SEEDED_FUNCTIONS_PVT.contract_residual_value
7436 --                OKL_SEEDED_FUNCTIONS_PVT.contract_sum_of_rents
7437 --                OKL_SEEDED_FUNCTIONS_PVT.contract_income
7438 -- Parameters:    contract id.
7439 -- Version:       1.0
7440 -- End of Commnets
7441 -----------------------------------------------------------------------
7442 
7443 FUNCTION contract_net_investment
7444   (
7445      p_chr_id     IN NUMBER
7446     ,p_line_id    IN NUMBER
7447   )
7448 RETURN NUMBER IS
7449   l_api_version      NUMBER;
7450   l_return_status    VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7451   l_msg_count        NUMBER;
7452   l_msg_data         VARCHAR2(2000);
7453   l_rent             NUMBER := 0;
7454   l_residual         NUMBER := 0;
7455   l_income           NUMBER := 0;
7456   l_net_investment   NUMBER := 0;
7457 
7458 BEGIN
7459 
7460   -- Get Residual Value
7461   l_residual := Okl_Seeded_Functions_Pvt.contract_residual_value(p_chr_id => p_chr_id, p_line_id => NULL);
7462 
7463   -- Get Rent
7464   l_rent := Okl_Seeded_Functions_Pvt.contract_sum_of_rents(p_chr_id, NULL);
7465 
7466   -- Get Rent
7467   l_income := Okl_Seeded_Functions_Pvt.contract_income(p_chr_id, NULL);
7468 
7469   -- Calculate Net Investment
7470   l_net_investment := l_rent + l_residual - l_income;
7471 
7472   RETURN l_net_investment;
7473   EXCEPTION
7474     WHEN OTHERS THEN
7475       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7476                           ,p_msg_name     => G_UNEXPECTED_ERROR
7477                           ,p_token1       => G_SQLCODE_TOKEN
7478                           ,p_token1_value => SQLCODE
7479                           ,p_token2       => G_SQLERRM_TOKEN
7480                           ,p_token2_value => SQLERRM);
7481 
7482        RETURN NULL;
7483 END contract_net_investment;
7484 
7485 -----------------------------------------------------------------------
7486 -- Start of Comments
7487 -- Created By:    Punitharaj Devaraju (pdevaraj)
7488 -- Function Name: contract_cures_in_possession
7489 -- Description:   Get cures in possession a contract.
7490 -- Dependencies:
7491 -- Parameters:    contract id.
7492 -- Version:       1.0
7493 -- End of Commnets
7494 -----------------------------------------------------------------------
7495 FUNCTION contract_cures_in_possession
7496   (
7497     p_chr_id     IN NUMBER
7498   )
7499 RETURN NUMBER IS
7500   -- Cursor to get Cures in Possession
7501   CURSOR cures_in_possession_csr(p_chr_id IN NUMBER) IS
7502     SELECT NVL(SUM(amount),0)
7503     FROM   OKL_CURE_PAYMENT_LINES
7504     WHERE  chr_id = p_chr_id
7505     AND    status = 'CURES_IN_POSSESSION'
7506     AND    cured_flag = 'Y';
7507 
7508   l_cures_in_possession   NUMBER := 0;
7509 
7510 BEGIN
7511 
7512   OPEN  cures_in_possession_csr(p_chr_id);
7513   FETCH cures_in_possession_csr INTO l_cures_in_possession;
7514   CLOSE cures_in_possession_csr;
7515 
7516   RETURN l_cures_in_possession;
7517 
7518   EXCEPTION
7519     WHEN OTHERS THEN
7520       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7521                           ,p_msg_name     => G_UNEXPECTED_ERROR
7522                           ,p_token1       => G_SQLCODE_TOKEN
7523                           ,p_token1_value => SQLCODE
7524                           ,p_token2       => G_SQLERRM_TOKEN
7525 
7526                           ,p_token2_value => SQLERRM);
7527       RETURN NULL;
7528 
7529 END contract_cures_in_possession;
7530 
7531 -----------------------------------------------------------------------
7532 -- Start of Comments
7533 -- Created By:    Punitharaj Devaraju (pdevaraj)
7534 -- Function Name: contract_outstanding_amount
7535 -- Description:   Get contract outstanding amount.
7536 -- Dependencies:
7537 -- Parameters:    contract id, contract line id.
7538 -- Version:       1.0
7539 -- End of Commnets
7540 -----------------------------------------------------------------------
7541 FUNCTION contract_outstanding_amount
7542   (
7543     p_chr_id     IN NUMBER,
7544     p_line_id    IN NUMBER
7545   )
7546 
7547 RETURN NUMBER IS
7548   -- Cursor for outstanding amount
7549     -- Bug 5897792
7550   /*CURSOR outstanding_amount_csr (p_chr_id IN NUMBER) IS
7551     SELECT NVL(SUM(amount_due_remaining), 0)
7552     FROM   okl_bpd_leasing_payment_trx_v
7553     WHERE  contract_id = p_chr_id;*/
7554 
7555   CURSOR outstanding_amount_csr (p_chr_id IN NUMBER) IS
7556     SELECT NVL(SUM(amount_due_remaining), 0)
7557     FROM   okl_bpd_ar_inv_lines_v
7558     WHERE  contract_id = p_chr_id;
7559 
7560 
7561   l_outstanding_amount  NUMBER := 0;
7562 
7563 BEGIN
7564 
7565   OPEN  outstanding_amount_csr (p_chr_id);
7566   FETCH outstanding_amount_csr INTO l_outstanding_amount;
7567   CLOSE outstanding_amount_csr;
7568 
7569   RETURN l_outstanding_amount;
7570 
7571   EXCEPTION
7572     WHEN OTHERS THEN
7573       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7574                           ,p_msg_name     => G_UNEXPECTED_ERROR
7575                           ,p_token1       => G_SQLCODE_TOKEN
7576                           ,p_token1_value => SQLCODE
7577                           ,p_token2       => G_SQLERRM_TOKEN
7578                           ,p_token2_value => SQLERRM);
7579       RETURN NULL;
7580 
7581 END contract_outstanding_amount;
7582 
7583 -----------------------------------------------------------------------
7584 -- Start of Comments
7585 -- Created By:    Punitharaj Devaraju (pdevaraj)
7586 -- Function Name: contract_full_cure
7587 -- Description:   Get full cure amount for a contract.
7588 -- Dependencies:  OKL_SEEDED_FUNCTIONS_PVT.contract_rent_amount
7589 --                OKL_SEEDED_FUNCTIONS_PVT.contract_outstanding_amount
7590 --                OKL_SEEDED_FUNCTIONS_PVT.contract_cures_in_possession
7591 -- Parameters:    contract id.
7592 -- Version:       1.0
7593 -- End of Commnets
7594 -----------------------------------------------------------------------
7595 FUNCTION contract_full_cure
7596   (
7597      p_chr_id     IN NUMBER
7598   )
7599 RETURN NUMBER IS
7600   l_api_version         NUMBER;
7601   l_return_status       VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7602   l_msg_count           NUMBER;
7603   l_msg_data            VARCHAR2(2000);
7604   l_current_rent        NUMBER;
7605   l_cures_in_possession NUMBER := 0;
7606   l_outstanding_amount  NUMBER := 0;
7607   l_full_cure           NUMBER := 0;
7608 
7609 BEGIN
7610 
7611   -- Get Current Rent
7612   l_current_rent := Okl_Seeded_Functions_Pvt.contract_rent_amount(p_chr_id, NULL);
7613 
7614   -- Get Cures in Possession
7615   l_cures_in_possession := Okl_Seeded_Functions_Pvt.contract_cures_in_possession
7616                              (p_chr_id);
7617 
7618   l_outstanding_amount := Okl_Seeded_Functions_Pvt.contract_outstanding_amount
7619                                        ( p_chr_id
7620                                         ,NULL );
7621 
7622   l_full_cure := l_outstanding_amount -
7623                  l_current_rent -
7624                  l_cures_in_possession;
7625 
7626   RETURN l_full_cure;
7627 
7628   EXCEPTION
7629     WHEN OTHERS THEN
7630       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7631                           ,p_msg_name     => G_UNEXPECTED_ERROR
7632                           ,p_token1       => G_SQLCODE_TOKEN
7633                           ,p_token1_value => SQLCODE
7634                           ,p_token2       => G_SQLERRM_TOKEN
7635                           ,p_token2_value => SQLERRM);
7636        RETURN NULL;
7637 END contract_full_cure;
7638 
7639 -----------------------------------------------------------------------
7640 -- Start of Comments
7641 -- Created By:    Punitharaj Devaraju (pdevaraj)
7642 -- Function Name: contract_interest_cure
7643 -- Description:   Get interest cure amount for a contract.
7644 -- Dependencies:  okl_contract_info.get_rule_value
7645 --                okl_contract_info_pvt.get_days_past_due
7646 -- Parameters:    contract id.
7647 -- Version:       1.0
7648 -- End of Commnets
7649 -----------------------------------------------------------------------
7650 FUNCTION contract_interest_cure
7651   (
7652      p_chr_id     IN NUMBER
7653   )
7654 RETURN NUMBER IS
7655   l_api_version      NUMBER;
7656   l_return_status    VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7657   l_msg_count        NUMBER;
7658   l_msg_data         VARCHAR2(2000);
7659   l_contract_rate    NUMBER := 0.0;
7660   l_net_investment   NUMBER := 0;
7661   l_interest_cure    NUMBER := 0;
7662   l_current_date     DATE := TRUNC(SYSDATE);
7663   l_days_past_due    NUMBER := 0;
7664   l_last_due_date    DATE;
7665   l_months_requiring_cure   NUMBER := 0;
7666   l_value            VARCHAR2(200);
7667   l_id1              VARCHAR2(40);
7668   l_id2              VARCHAR2(200);
7669 
7670 
7671 BEGIN
7672 
7673 -- Get Net Investment
7674   l_net_investment := Okl_Seeded_Functions_Pvt.contract_net_investment
7675                            (p_chr_id, NULL);
7676 
7677 -- Get Contract rate from rule
7678   l_return_status := okl_contract_info.get_rule_value
7679                                           (
7680                                              p_contract_id => p_chr_id
7681                                             ,p_rule_group_code => 'COCURP'
7682                                             ,p_rule_code => 'COCURE'
7683                                             ,p_segment_number => 7
7684                                             ,x_id1 => l_id1
7685                                             ,x_id2 => l_id2
7686                                             ,x_value => l_value
7687                                           );
7688 
7689   IF (l_return_status = okl_api.G_RET_STS_UNEXP_ERROR) THEN
7690     RAISE okl_api.G_EXCEPTION_UNEXPECTED_ERROR;
7691   ELSIF (l_return_status = okl_api.G_RET_STS_ERROR) THEN
7692     RAISE okl_api.G_EXCEPTION_ERROR;
7693   END IF;
7694 
7695   l_contract_rate := ROUND(TO_NUMBER(l_value)/100, 3);
7696 
7697   l_return_status := okl_contract_info.get_days_past_due
7698                                           (  p_chr_id
7699                                             ,l_days_past_due );
7700 
7701   IF (l_return_status = okl_api.G_RET_STS_UNEXP_ERROR) THEN
7702     RAISE okl_api.G_EXCEPTION_UNEXPECTED_ERROR;
7703   ELSIF (l_return_status = okl_api.G_RET_STS_ERROR) THEN
7704     RAISE okl_api.G_EXCEPTION_ERROR;
7705   END IF;
7706 
7707   -- Get the furthest due date from current date
7708   -- when customer stopped paying
7709   l_last_due_date := l_current_date - l_days_past_due;
7710   l_months_requiring_cure :=
7711                  FLOOR(MONTHS_BETWEEN(l_current_date,l_last_due_date));
7712 
7713   l_interest_cure := (( l_net_investment * l_contract_rate )/12) *
7714                        l_months_requiring_cure;
7715 
7716   RETURN l_interest_cure;
7717 
7718   EXCEPTION
7719     WHEN OTHERS THEN
7720       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7721                           ,p_msg_name     => G_UNEXPECTED_ERROR
7722                           ,p_token1       => G_SQLCODE_TOKEN
7723                           ,p_token1_value => SQLCODE
7724                           ,p_token2       => G_SQLERRM_TOKEN
7725                           ,p_token2_value => SQLERRM);
7726        RETURN NULL;
7727 
7728 END contract_interest_cure;
7729 
7730   ---------------------------------------------------------------------------
7731   -- FUNCTION get_unrefunded_cures
7732   ---------------------------------------------------------------------------
7733   FUNCTION get_unrefunded_cures(
7734      p_contract_id		IN NUMBER,
7735      x_unrefunded_cures	      OUT NOCOPY NUMBER)
7736   RETURN VARCHAR2
7737   IS
7738 
7739     -- Get unrefunded cures for a contract
7740     /*CURSOR unrefunded_cures_csr(p_contract_id NUMBER) IS
7741       SELECT SUM(amount)
7742       FROM   OKL_cure_payment_lines_v
7743       WHERE  chr_id = p_contract_id
7744       AND    status = 'CURES_IN_POSSESSION'; */
7745 
7746     l_unrefunded_cures NUMBER := 0;
7747     l_api_version      NUMBER;
7748     l_return_status    VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7749     l_msg_count        NUMBER;
7750     l_msg_data         VARCHAR2(2000);
7751 
7752   BEGIN
7753 
7754     --OPEN  unrefunded_cures_csr(p_contract_id);
7755     --FETCH unrefunded_cures_csr INTO l_unrefunded_cures;
7756     --CLOSE unrefunded_cures_csr;
7757 
7758     x_unrefunded_cures := l_unrefunded_cures;
7759 
7760     RETURN l_return_status;
7761     EXCEPTION
7762     WHEN OTHERS THEN
7763       OKC_API.SET_MESSAGE( p_app_name     => G_APP_NAME
7764                           ,p_msg_name     => G_UNEXPECTED_ERROR
7765                           ,p_token1       => G_SQLCODE_TOKEN
7766                           ,p_token1_value => SQLCODE
7767                           ,p_token2       => G_SQLERRM_TOKEN
7768                           ,p_token2_value => SQLERRM);
7769       l_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
7770       RETURN(l_return_status);
7771 
7772   END get_unrefunded_cures;
7773 
7774   ---------------------------------------------------------------------------
7775   -- FUNCTION get_unrefunded_cures
7776   ---------------------------------------------------------------------------
7777   FUNCTION get_cured_status (p_contract_number IN NUMBER)
7778     RETURN VARCHAR2 IS
7779   CURSOR c_cured (p_chr_id NUMBER)  IS
7780     SELECT 'Y'
7781     FROM    OKL_CURE_PAYMENT_LINES
7782     WHERE EXISTS (SELECT 1
7783                   FROM   OKL_CURE_PAYMENT_LINES
7784                   WHERE  status = 'CURES_IN_POSSESSION'
7785                   AND    cured_flag = 'Y'
7786                   AND    chr_id = p_chr_id);
7787     ls_cured_flag  VARCHAR2(1) := 'N';
7788   BEGIN
7789     OPEN c_cured(p_contract_number );
7790     FETCH c_cured INTO ls_cured_flag;
7791     IF(c_cured%NOTFOUND) THEN
7792        ls_cured_flag := 'N' ;
7793          CLOSE c_cured ;
7794          RETURN(ls_cured_flag);
7795     END IF ;
7796     CLOSE c_cured;
7797       RETURN(ls_cured_flag);
7798   END get_cured_status;
7799 
7800 -----------------------------------------------------------------------
7801 -- Functions By pdevaraj -end
7802 -----------------------------------------------------------------------
7803 
7804   ----------------------------------------------------------------------------------------------------
7805 
7806     -- Start of Comments
7807     -- Created By:       Santhosh Siruvole (ssiruvol)
7808     -- Function Name  investor_account_amount
7809     -- Description:   returns the investor account amount for the syndication.
7810     -- Dependencies:
7811     -- Parameters: contract id.
7812     -- Version: 1.0
7813     -- End of Commnets
7814 
7815 ----------------------------------------------------------------------------------------------------
7816   FUNCTION investor_account_amount(
7817             p_chr_id          IN  NUMBER,
7818             p_line_id         IN  NUMBER) RETURN NUMBER  IS
7819 
7820     l_api_name		CONSTANT VARCHAR2(30) := 'RETURN_CONTRACT_SUM_OF_RENTS';
7821     l_api_version	CONSTANT NUMBER	      := 1;
7822     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7823     x_msg_count         NUMBER;
7824     x_msg_data          VARCHAR2(256);
7825 
7826     l_inv_accnt_amnt NUMBER := 0;
7827     l_cap_amnt       NUMBER := 0;
7828     l_pcnt_inv       NUMBER := 0;
7829     l_stake_amnt     NUMBER := 0;
7830 
7831     CURSOR l_hdrrl_csr( rgcode OKC_RULE_GROUPS_B.RGD_CODE%TYPE,
7832                        rlcat  OKC_RULES_B.RULE_INFORMATION_CATEGORY%TYPE,
7833                        chrId NUMBER) IS
7834     SELECT crl.object1_id1,
7835            crl.RULE_INFORMATION1,
7836            crl.RULE_INFORMATION2,
7837            crl.RULE_INFORMATION3,
7838            crl.RULE_INFORMATION4,
7839            crl.RULE_INFORMATION5,
7840            crl.RULE_INFORMATION6,
7841            crl.RULE_INFORMATION10,
7842            crl.RULE_INFORMATION11
7843     FROM   OKC_RULE_GROUPS_B crg,
7844            OKC_RULES_B crl
7845     WHERE  crl.rgp_id = crg.id
7846            AND crg.RGD_CODE = rgcode
7847            AND crl.RULE_INFORMATION_CATEGORY = rlcat
7848            AND crg.dnz_chr_id = chrId;
7849 
7850     l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
7851 
7852   BEGIN
7853 
7854        IF ( p_chr_id IS NULL ) THEN
7855            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
7856        END IF;
7857 
7858        l_cap_amnt := contract_oec( p_chr_id, NULL)
7859                      - contract_tradein( p_chr_id, NULL)
7860                      - contract_capital_reduction( p_chr_id, NULL)
7861                      + contract_fees_capitalized( p_chr_id, NULL);
7862 
7863        OPEN l_hdrrl_csr( 'LASYND', 'LASYST',p_chr_id );
7864        FETCH l_hdrrl_csr INTO l_hdrrl_rec;
7865        CLOSE l_hdrrl_csr;
7866 
7867        l_stake_amnt := TO_NUMBER(NVL( l_hdrrl_rec.RULE_INFORMATION1, 0.0));
7868        l_pcnt_inv   := TO_NUMBER(NVL( l_hdrrl_rec.RULE_INFORMATION2, 0.0)) / 100.00;
7869        l_inv_accnt_amnt := l_stake_amnt - l_cap_amnt * l_pcnt_inv;
7870 
7871        RETURN l_inv_accnt_amnt;
7872 
7873     EXCEPTION
7874 	WHEN OTHERS  THEN
7875                Okl_Api.SET_MESSAGE(
7876                         p_app_name     => G_APP_NAME,
7877                         p_msg_name     => G_UNEXPECTED_ERROR,
7878                         p_token1       => G_SQLCODE_TOKEN,
7879                         p_token1_value => SQLCODE,
7880                         p_token2       => G_SQLERRM_TOKEN,
7881                         p_token2_value => SQLERRM);
7882                 RETURN NULL;
7883 
7884   END investor_account_amount;
7885 
7886 
7887   ----------------------------------------------------------------------------------------------------
7888 
7889     -- Start of Comments
7890     -- Created By:       Santhosh Siruvole (ssiruvol)
7891     -- Function Name  contract_capitalized_interest
7892     -- Description:   returns the total capitalized interest for the contract.
7893     -- Dependencies:
7894     -- Parameters: contract id.
7895     -- Version: 1.0
7896     -- End of Commnets
7897 
7898 ----------------------------------------------------------------------------------------------------
7899   FUNCTION contract_capitalized_interest(
7900             p_chr_id          IN  NUMBER,
7901             p_line_id         IN  NUMBER) RETURN NUMBER  IS
7902 
7903     l_api_name		CONSTANT VARCHAR2(256) := 'RETURN_CONTRACT_CAPITALIZED_INTEREST';
7904     l_api_version	CONSTANT NUMBER	      := 1;
7905     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
7906     x_msg_count         NUMBER;
7907     x_msg_data          VARCHAR2(256);
7908 
7909     l_capz_int NUMBER := 0.0;
7910 
7911     CURSOR capz_csr( chrId NUMBER ) IS
7912     SELECT NVL( SUM(kle.capitalized_interest), 0.0)
7913     FROM OKC_LINE_STYLES_B LS,
7914          OKL_K_LINES_FULL_V KLE,
7915          okc_statuses_b sts
7916     WHERE  LS.ID = KLE.LSE_ID
7917          AND LS.LTY_CODE ='FREE_FORM1'
7918          AND KLE.DNZ_CHR_ID = chrId
7919 -- start: cklee 05/18/2004 fixed for bug#3625609
7920          AND KLE.sts_code     = sts.code
7921          AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
7922 -- end: cklee 05/18/2004 fixed for bug#3625609
7923 
7924     -- Bug# 15992711 , Start
7925     -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
7926     CURSOR capz_nr_csr( chrId NUMBER, p_line_type VARCHAR2) IS
7927     SELECT NVL( SUM(kle.capitalized_interest), 0.0)
7928     FROM OKC_LINE_STYLES_B LS,
7929          OKL_K_LINES_FULL_V KLE,
7930          okc_statuses_b sts
7931     WHERE  LS.ID = KLE.LSE_ID
7932          AND LS.LTY_CODE ='FREE_FORM1'
7933          AND KLE.DNZ_CHR_ID = chrId
7934          AND KLE.sts_code     = sts.code
7935          AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
7936          AND NVL(KLE.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
7937 
7938 
7939     l_line_type VARCHAR2(30) := 'X';
7940     -- Bug# 15992711 , End
7941 
7942 
7943   BEGIN
7944 
7945        IF ( p_chr_id IS NULL ) THEN
7946            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
7947        END IF;
7948 
7949        --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
7950        --                If set then based on its value set l_line_type
7951 
7952        IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
7953           FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
7954           LOOP
7955 
7956              IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
7957                 IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
7958                    l_line_type := 'NEW'; --New
7959                 ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
7960                    l_line_type := 'RELEASE'; --Release
7961                 END IF;
7962              END IF;
7963 
7964           END LOOP;
7965        END IF;
7966 
7967        -- If l_line_type is set as either 'NEW' or 'RELEASE' call
7968        -- capz_nr_csr cursor in order to consider either only new
7969        -- assets or only re-leased assets, else no change in the standard behavior
7970 
7971        IF l_line_type IN ('NEW','RELEASE') THEN
7972          OPEN capz_nr_csr( p_chr_id, l_line_type );
7973          FETCH capz_nr_csr INTO l_capz_int;
7974          CLOSE capz_nr_csr;
7975        ELSE
7976        --Bug# 15992711, End
7977 
7978          OPEN capz_csr( p_chr_id );
7979          FETCH capz_csr INTO l_capz_int;
7980          CLOSE capz_csr;
7981        --Bug# 15992711 , Start
7982        END IF;
7983        --Bug# 15992711 , End
7984 
7985        RETURN l_capz_int;
7986 
7987     EXCEPTION
7988 
7989 	WHEN OTHERS THEN
7990                Okl_Api.SET_MESSAGE(
7991                         p_app_name     => G_APP_NAME,
7992                         p_msg_name     => G_UNEXPECTED_ERROR,
7993                         p_token1       => G_SQLCODE_TOKEN,
7994                         p_token1_value => SQLCODE,
7995                         p_token2       => G_SQLERRM_TOKEN,
7996                         p_token2_value => SQLERRM);
7997                 RETURN NULL;
7998 
7999   END contract_capitalized_interest;
8000 
8001   ----------------------------------------------------------------------------------------------------
8002 
8003     -- Start of Comments
8004     -- Created By:       Santhosh Siruvole (ssiruvol)
8005     -- Function Name  line_capitalized_interest
8006     -- Description:   returns the total capitalized interest for the contract.
8007     -- Dependencies:
8008     -- Parameters: contract id.
8009     -- Version: 1.0
8010     -- End of Commnets
8011 
8012 ----------------------------------------------------------------------------------------------------
8013   FUNCTION line_capitalized_interest(
8014             p_chr_id          IN  NUMBER,
8015             p_line_id         IN  NUMBER) RETURN NUMBER  IS
8016 
8017     l_api_name		CONSTANT VARCHAR2(256) := 'RETURN_CONTRACT_CAPITALIZED_INTEREST';
8018     l_api_version	CONSTANT NUMBER	      := 1;
8019     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
8020     x_msg_count         NUMBER;
8021     x_msg_data          VARCHAR2(256);
8022 
8023     l_capz_int NUMBER := 0.0;
8024 
8025     CURSOR capz_csr( chrId NUMBER, kleId NUMBER ) IS
8026     SELECT NVL( kle.capitalized_interest, 0.0)
8027     FROM OKC_LINE_STYLES_B LS,
8028          OKL_K_LINES_FULL_V KLE
8029     WHERE  LS.ID = KLE.LSE_ID
8030          AND LS.LTY_CODE ='FREE_FORM1'
8031          AND KLE.DNZ_CHR_ID = chrId
8032          AND KLE.id = kleId;
8033 
8034   BEGIN
8035 
8036        IF (( p_chr_id IS NULL ) OR ( p_line_id IS NULL ) ) THEN
8037            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
8038        END IF;
8039 
8040        OPEN capz_csr( p_chr_id, p_line_id );
8041        FETCH capz_csr INTO l_capz_int;
8042        CLOSE capz_csr;
8043 
8044        RETURN l_capz_int;
8045 
8046     EXCEPTION
8047 
8048 	WHEN OTHERS THEN
8049                Okl_Api.SET_MESSAGE(
8050                         p_app_name     => G_APP_NAME,
8051                         p_msg_name     => G_UNEXPECTED_ERROR,
8052                         p_token1       => G_SQLCODE_TOKEN,
8053                         p_token1_value => SQLCODE,
8054                         p_token2       => G_SQLERRM_TOKEN,
8055                         p_token2_value => SQLERRM);
8056                 RETURN NULL;
8057 
8058   END line_capitalized_interest;
8059 
8060   ---------------------------------------------
8061   -- Functions for Securitization
8062   -- mvasudev, 04/02/2003
8063   ---------------------------------------------
8064 
8065   FUNCTION ASSET_UNDISBURSED_STREAMS(p_dnz_chr_id IN NUMBER -- Lease Contract ID
8066                                              ,p_kle_id     IN NUMBER -- Lease Contract-Asset ID
8067                                              )
8068   RETURN NUMBER
8069   IS
8070     CURSOR l_okl_inv_payment_event_csr(p_khr_id IN NUMBER)
8071     IS
8072     SELECT rulb.rule_information2 payment_event
8073     FROM   okc_rules_b rulb
8074           ,okc_rule_groups_b rgpb
8075     WHERE  rgpb.dnz_chr_id                = p_khr_id
8076 	AND    rgpb.chr_id                    = p_khr_id
8077     AND    rgpb.rgd_code                  = 'LASEIR'
8078     AND    rgpb.id                        = rulb.rgp_id
8079     AND    rulb.rule_information_category = 'LASEIR';
8080 
8081     CURSOR l_okl_unbilled_streams_csr(p_dnz_chr_id IN NUMBER
8082                                      ,p_kle_id IN NUMBER
8083                                      ,p_sty_id IN NUMBER)
8084     IS
8085     SELECT NVL(SUM(selb.amount),0) total_amount
8086     FROM   okl_strm_elements selb
8087           ,okl_streams       stmb
8088           ,okl_pool_contents pocb
8089           ,okl_strm_type_v styv --ankushar --Bug 6594724
8090           ,okc_k_headers_b chrb --ankushar --Bug 6594724
8091     WHERE stmb.khr_id = p_dnz_chr_id
8092     AND   stmb.kle_id = p_kle_id
8093     AND   stmb.sty_id = p_sty_id
8094     AND   selb.stm_id = stmb.id
8095 	AND   stmb.active_yn = 'Y'
8096 	AND   stmb.say_code = 'CURR'
8097     AND   selb.date_billed IS NULL
8098     AND   pocb.kle_id = p_kle_id
8099     AND   pocb.sty_id = p_sty_id
8100 	-- mvasudev, 03/30/2004
8101 	AND   pocb.status_Code = 'ACTIVE'
8102   /*
8103     ankushar --Bug 6594724: Unable to terminate Investor Agreement with Residual Streams
8104     Start changes
8105    */
8106     AND stmb.sty_id = styv.id
8107     AND pocb.khr_id = chrb.id
8108     AND(selb.stream_element_date > SYSDATE
8109         OR
8110           (styv.stream_type_subclass = 'RESIDUAL'
8111            and chrb.STS_CODE IN ('TERMINATED','EXPIRED')
8112           )
8113        )
8114   /* ankushar Bug 6594724
8115      End Changes
8116    */
8117 	-- end, mvasudev, 03/30/2004
8118     AND   (selb.stream_element_date BETWEEN pocb.streams_from_date
8119                                     AND NVL(pocb.streams_to_date,G_FINAL_DATE)
8120            );
8121 
8122     CURSOR l_okl_unreceived_streams_csr(p_dnz_chr_id IN NUMBER
8123                                        ,p_kle_id IN NUMBER
8124                                        ,p_sty_id IN NUMBER)
8125     IS
8126     SELECT NVL(SUM(amount_due_original - amount_due_remaining),0) total_amount
8127     FROM   okl_bpd_leasing_payment_trx_v
8128 	WHERE  contract_id = p_dnz_chr_id
8129 	AND    contract_line_id = p_kle_id
8130 	AND    stream_type_id = p_sty_id
8131 	AND    amount_due_original <> amount_due_remaining;
8132 
8133  CURSOR l_okl_unbilled_strms_pndg_csr(p_dnz_chr_id IN NUMBER
8134                                      ,p_kle_id IN NUMBER
8135                                      ,p_sty_id IN NUMBER)
8136     IS
8137     SELECT NVL(SUM(selb.amount),0) total_amount
8138     FROM   okl_strm_elements selb
8139           ,okl_streams       stmb
8140           ,okl_pool_contents pocb
8141     WHERE stmb.khr_id = p_dnz_chr_id
8142     AND   stmb.kle_id = p_kle_id
8143     AND   stmb.sty_id = p_sty_id
8144     AND   selb.stm_id = stmb.id
8145     AND   stmb.active_yn = 'Y'
8146     AND   stmb.say_code = 'CURR'
8147     AND   selb.date_billed IS NULL
8148     AND   pocb.kle_id = p_kle_id
8149     AND   pocb.sty_id = p_sty_id
8150     AND   pocb.status_code = 'PENDING'
8151     AND   selb.stream_element_date > SYSDATE
8152     AND   (selb.stream_element_date BETWEEN pocb.streams_from_date
8153                                     AND NVL(pocb.streams_to_date,G_FINAL_DATE) );
8154 
8155 	l_total_amount NUMBER := 0;
8156 	l_khr_id NUMBER;
8157 	l_sty_id NUMBER;
8158 	l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
8159 
8160   BEGIN
8161 
8162     --Validate additional parameters availability
8163     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
8164       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
8165 	  LOOP
8166         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_khr_id' THEN
8167           l_khr_id := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8168         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_sty_id' THEN
8169           l_sty_id := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8170         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
8171           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8172         END IF;
8173       END LOOP;
8174       ELSE
8175       Okl_Api.Set_Message(p_app_name     => G_APP_NAME,
8176                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
8177       RAISE OKL_API.G_EXCEPTION_ERROR;
8178       END IF;
8179 
8180 	FOR l_okl_inv_payment_event_rec IN l_okl_inv_payment_event_csr(l_khr_id)
8181 	LOOP
8182 	  IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8183 	    FOR l_okl_unbilled_strms_pndg_rec IN l_okl_unbilled_strms_pndg_csr(p_dnz_chr_id,p_kle_id,l_sty_id)
8184             LOOP
8185 		l_total_amount := l_total_amount + l_okl_unbilled_strms_pndg_rec.total_amount;
8186 	  END LOOP; -- unbilled streams for pending pool contents
8187 	  ELSE
8188 	  FOR l_okl_unbilled_streams_rec IN l_okl_unbilled_streams_csr(p_dnz_chr_id,p_kle_id,l_sty_id)
8189           LOOP
8190 		l_total_amount := l_total_amount + l_okl_unbilled_streams_rec.total_amount;
8191 	  END LOOP; -- unbilled streams
8192 	  END IF;
8193 
8194 	  IF l_okl_inv_payment_event_rec.payment_event = 'RECEIPT' THEN
8195 	    FOR l_okl_unreceived_streams_rec IN l_okl_unreceived_streams_csr(p_dnz_chr_id,p_kle_id,l_sty_id)
8196 	    LOOP
8197     	    l_total_amount := l_total_amount + l_okl_unreceived_streams_rec.total_amount;
8198 		END LOOP; -- unreceived streams
8199 	  END IF;
8200 
8201 	END LOOP; -- payment basis
8202 
8203 	RETURN l_total_amount;
8204 
8205   EXCEPTION
8206   WHEN OTHERS THEN
8207     IF l_okl_inv_payment_event_csr%ISOPEN THEN
8208       CLOSE l_okl_inv_payment_event_csr;
8209     END IF;
8210     IF l_okl_unbilled_streams_csr%ISOPEN THEN
8211       CLOSE l_okl_unbilled_streams_csr;
8212     END IF;
8213     IF l_okl_unreceived_streams_csr%ISOPEN THEN
8214       CLOSE l_okl_unreceived_streams_csr;
8215     END IF;
8216     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
8217                         p_msg_name     => G_UNEXPECTED_ERROR,
8218                         p_token1       => G_SQLCODE_TOKEN,
8219                         p_token1_value => SQLCODE,
8220                         p_token2       => G_SQLERRM_TOKEN,
8221                         p_token2_value => SQLERRM);
8222     RETURN NULL;
8223   END ASSET_UNDISBURSED_STREAMS;
8224 
8225   -- mvasudev, 10/14/2003
8226   FUNCTION INVESTORS_PV_AMOUNT(p_chr_id IN NUMBER -- Investor Agreement ID
8227                                     ,p_line_id     IN NUMBER)
8228   RETURN NUMBER
8229   IS
8230   -- mvasudev, 09/29/2004, Bug#3909240
8231   --Bug# 12557486: Added p_poc_sty_purpose to identify whether RENT, RESIDUAL_VALUE or
8232   --               LOAN_PAYMENT stream type purpose
8233   CURSOR l_okl_pv_amounts_csr(p_sty_purpose IN VARCHAR2, p_poc_sty_purpose IN VARCHAR2)
8234       IS
8235       SELECT NVL(SUM(selb.amount),0) total_amount
8236       FROM   okl_strm_elements selb
8237                   ,okl_streams       stmb
8238                   ,okl_strm_type_v   styv
8239                   ,okl_pool_contents pocb
8240                   ,okl_strm_type_v   styv1
8241       WHERE stmb.source_id = p_chr_id
8242       AND   styv.stream_type_purpose = p_sty_purpose
8243       AND   stmb.sty_id = styv.id
8244       AND   selb.stm_id = stmb.id
8245       AND   stmb.active_yn = 'Y'
8246       AND   stmb.say_code = 'CURR'
8247      AND   pocb.status_code <> 'PENDING'
8248      AND pocb.khr_id = stmb.khr_id
8249      AND pocb.kle_id = stmb.kle_id
8250      AND pocb.sty_code = styv1.code
8251      AND styv1.stream_type_purpose = p_poc_sty_purpose;
8252 
8253     --Bug# 12557486: Added p_poc_sty_purpose to identify whether RENT, RESIDUAL_VALUE or
8254     --               LOAN_PAYMENT stream type purpose
8255     CURSOR l_okl_pv_amounts_pending_csr(p_sty_purpose IN VARCHAR2, p_poc_sty_purpose IN VARCHAR2)
8256       IS
8257       SELECT NVL(SUM(selb.amount),0) total_amount
8258       FROM  okl_strm_elements selb
8259                  ,okl_streams       stmb
8260                  ,okl_strm_type_v   styv
8261                  ,okl_pool_contents pocb
8262                  ,okl_strm_type_v   styv1
8263       WHERE stmb.source_id = p_chr_id
8264       AND   styv.stream_type_purpose = p_sty_purpose
8265       AND   stmb.sty_id = styv.id
8266       AND   selb.stm_id = stmb.id
8267       AND   stmb.active_yn = 'Y'
8268       AND   stmb.say_code = 'CURR'
8269       AND   pocb.status_code = 'PENDING'
8270       AND pocb.khr_id = stmb.khr_id
8271       AND pocb.kle_id = stmb.kle_id
8272       AND pocb.sty_code = styv1.code
8273       AND styv1.stream_type_purpose = p_poc_sty_purpose;
8274 
8275    /* fmiao , 09/6/2005 , Bug#4561645
8276         cursor change for stream_type_subclass filtering
8277     */
8278    CURSOR l_okl_percent_stake_csr(p_sty_subclass IN VARCHAR2)
8279    IS
8280    SELECT DISTINCT kleb.percent_stake,clet.id
8281    FROM   okl_k_lines kleb,
8282           okc_k_lines_b clet,
8283           okc_k_lines_b cles
8284    WHERE  kleb.id = cles.id
8285    AND    cles.cle_id = clet.id
8286    AND    clet.dnz_chr_id = p_chr_id
8287    --AND    kleb.sty_id = styb.id
8288    AND    kleb.stream_type_subclass = p_sty_subclass;
8289 
8290    l_total_amount NUMBER := 0;
8291    l_total_percent NUMBER := 0;
8292    l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
8293 
8294    --Bug# 12557486
8295    l_rent_sty_purpose      okl_strm_type_b.stream_type_purpose%TYPE := 'RENT';
8296    l_residual_sty_purpose  okl_strm_type_b.stream_type_purpose%TYPE := 'RESIDUAL_VALUE';
8297    l_loan_pymt_sty_purpose okl_strm_type_b.stream_type_purpose%TYPE := 'LOAN_PAYMENT';
8298 
8299   BEGIN
8300 
8301      l_total_percent := 0;
8302 
8303     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
8304       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
8305       LOOP
8306         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
8307           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8308         END IF;
8309       END LOOP;
8310      END IF;
8311 
8312       /* fmiao , 09/6/2005 , Bug#4561645
8313         change the stream_type_purpose PV_RENT_SECURITIZED and PV_RV_SECURITIZED
8314       */
8315       IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8316         --Bug# 12557486
8317         FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_RENT_SECURITIZED', l_rent_sty_purpose)
8318         LOOP
8319           FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RENT')
8320           LOOP
8321             l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8322           END LOOP;
8323           IF (l_total_percent >0 AND l_total_percent <=100) THEN
8324             l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
8325           END IF;
8326         END LOOP; -- PV_RENT_SECURITIZED
8327       ELSE
8328       --Bug# 12557486
8329       FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_RENT_SECURITIZED', l_rent_sty_purpose)
8330       LOOP
8331         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RENT')
8332         LOOP
8333           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8334         END LOOP;
8335         IF (l_total_percent >0 AND l_total_percent <=100) THEN
8336           l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
8337         END IF;
8338       END LOOP; -- PV_RENT_SECURITIZED
8339      END IF;
8340      l_total_percent := 0;
8341 
8342      IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8343        --Bug# 12557486
8344        FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_RV_SECURITIZED', l_residual_sty_purpose)
8345        LOOP
8346          FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RESIDUAL')
8347          LOOP
8348            l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8349          END LOOP;
8350          IF (l_total_percent >0 AND l_total_percent <=100) THEN
8351            l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
8352          END IF;
8353        END LOOP; -- PV_RV_SECURITIZED
8354      ELSE
8355        --Bug# 12557486
8356        FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_RV_SECURITIZED', l_residual_sty_purpose)
8357        LOOP
8358          FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RESIDUAL')
8359          LOOP
8360            l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8361          END LOOP;
8362          IF (l_total_percent >0 AND l_total_percent <=100) THEN
8363            l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
8364          END IF;
8365        END LOOP; -- PV_RV_SECURITIZED
8366      END IF;
8367   --Bug # 6740000 ssdeshpa Added for Addition of Loan Contract into the Pool
8368   --Calculate the PV Amount for Principal Sec of Loan Contracts
8369   l_total_percent := 0;
8370   IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8371      --Bug# 12557486
8372      FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_PRINCIPAL_SECURITIZED', l_loan_pymt_sty_purpose)
8373      LOOP
8374         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8375         LOOP
8376             l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8377         END LOOP;
8378         IF (l_total_percent >0 AND l_total_percent <=100) THEN
8379             l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
8380         END IF;
8381      END LOOP; -- PV_PRINCIPAL_SECURITIZED
8382   ELSE
8383      --Bug# 12557486
8384      FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_PRINCIPAL_SECURITIZED', l_loan_pymt_sty_purpose)
8385      LOOP
8386         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8387         LOOP
8388           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8389         END LOOP;
8390         IF (l_total_percent >0 AND l_total_percent <=100) THEN
8391           l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
8392         END IF;
8393      END LOOP; -- PV_PRINCIPAL_SECURITIZED
8394   END IF;
8395    --Calculate the PV Amount for Interest Sec of Loan Contracts
8396   l_total_percent := 0;
8397   IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8398      --Bug# 12557486
8399      FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_INTEREST_SECURITIZED', l_loan_pymt_sty_purpose)
8400      LOOP
8401         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8402         LOOP
8403             l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8404         END LOOP;
8405         IF (l_total_percent >0 AND l_total_percent <=100) THEN
8406             l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
8407         END IF;
8408      END LOOP; -- PV_INTEREST_SECURITIZED
8409   ELSE
8410      --Bug# 12557486
8411      FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_INTEREST_SECURITIZED', l_loan_pymt_sty_purpose)
8412      LOOP
8413         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8414         LOOP
8415           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8416         END LOOP;
8417         IF (l_total_percent >0 AND l_total_percent <=100) THEN
8418           l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
8419         END IF;
8420      END LOOP; -- PV_INTEREST_SECURITIZED
8421   END IF;
8422   --Calculate the PV Value for Unscheduled Principal Paydown(PPD) Payment
8423   l_total_percent := 0;
8424   IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8425      --Bug# 12557486
8426      FOR l_okl_pv_amounts_pending_rec IN l_okl_pv_amounts_pending_csr('PV_UNSCHEDULED_PMT_SECURITIZED', l_loan_pymt_sty_purpose)
8427      LOOP
8428           FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8429           LOOP
8430               l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8431           END LOOP;
8432           IF (l_total_percent >0 AND l_total_percent <=100) THEN
8433               l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_pending_rec.total_amount;
8434           END IF;
8435        END LOOP; -- PV_UNSCHEDULED_PMT_SECURITIZED
8436   ELSE
8437      --Bug# 12557486
8438      FOR l_okl_pv_amounts_rec IN l_okl_pv_amounts_csr('PV_UNSCHEDULED_PMT_SECURITIZED', l_loan_pymt_sty_purpose)
8439      LOOP
8440           FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8441           LOOP
8442              l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8443           END LOOP;
8444           IF (l_total_percent >0 AND l_total_percent <=100) THEN
8445              l_total_amount := l_total_amount + (l_total_percent/100)*l_okl_pv_amounts_rec.total_amount;
8446           END IF;
8447      END LOOP; -- PV_UNSCHEDULED_PMT_SECURITIZED
8448   END IF;
8449    --Bug # 6740000 ssdeshpa Added for Addition of Loan Contract into the Pool
8450 
8451   RETURN l_total_amount;
8452 
8453   EXCEPTION
8454   WHEN OTHERS THEN
8455     IF l_okl_pv_amounts_csr%ISOPEN THEN
8456       CLOSE l_okl_pv_amounts_csr;
8457     END IF;
8458     IF l_okl_pv_amounts_pending_csr%ISOPEN THEN
8459       CLOSE l_okl_pv_amounts_pending_csr;
8460     END IF;
8461     IF l_okl_percent_stake_csr%ISOPEN THEN
8462       CLOSE l_okl_percent_stake_csr;
8463     END IF;
8464 
8465     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
8466                         p_msg_name     => G_UNEXPECTED_ERROR,
8467                         p_token1       => G_SQLCODE_TOKEN,
8468                         p_token1_value => SQLCODE,
8469                         p_token2       => G_SQLERRM_TOKEN,
8470                         p_token2_value => SQLERRM);
8471     RETURN NULL;
8472   END INVESTORS_PV_AMOUNT;
8473 
8474 
8475   ---------------------------------------------
8476   -- END,Functions for Securitization
8477   -- mvasudev, 04/02/2003
8478   ---------------------------------------------
8479 
8480 -- 06/02/03 cklee start
8481 ----------------------------------------------------------------------------------
8482 -- Start of comments
8483 --
8484 -- Procedure Name  : investor_rent_accural_amout
8485 -- Description     : get total rent accural amount by associated agreement's pool contracts
8486 -- Business Rules  :
8487 -- Parameters      :
8488 -- Created By      : chenkuang.lee
8489 -- last modified by: ssdeshpa
8490 -- Version         : 2.0 modified to use Accrual Adjustment streams instead of Accrual streams
8491 --                 : 3.0 modified for Addition of Loan Contract into the Pool
8492 -- End of comments
8493 ----------------------------------------------------------------------------------
8494 FUNCTION investor_rent_accural_amout(
8495    p_contract_id         IN okc_k_headers_b.id%TYPE
8496   ,p_contract_line_id    IN NUMBER
8497   ) RETURN NUMBER
8498  IS
8499 
8500      l_rent_accrual          NUMBER;
8501 
8502    -- mvasudev, 09/29/2004, Bug#3909240
8503  CURSOR c_rent_accrual(p_contract_id okc_k_headers_b.id%TYPE) IS
8504  SELECT NVL(SUM(SELB.AMOUNT),0)
8505  FROM
8506    OKL_STREAMS STMB,
8507    OKL_STRM_ELEMENTS SELB,
8508    OKL_STRM_TYPE_V STYV
8509  WHERE STMB.ID = SELB.STM_ID
8510  AND STMB.STY_ID = STYV.ID
8511  AND STYV.STREAM_TYPE_PURPOSE IN ('INVESTOR_PRETAX_INCOME','INVESTOR_RENTAL_ACCRUAL','INVESTOR_INTEREST_INCOME')
8512  AND STMB.SAY_CODE = 'CURR'
8513  AND STMB.ACTIVE_YN = 'Y'
8514  AND EXISTS (SELECT 1
8515              FROM OKL_POOL_CONTENTS POC,
8516                   OKL_POOLS POL,
8517                   OKL_STRM_TYPE_V STYS
8518              WHERE  POC.POL_ID = POL.ID
8519              AND    POC.KHR_ID = STMB.KHR_ID
8520              AND    POL.KHR_ID = P_CONTRACT_ID
8521              AND    POC.STY_ID = STYS.ID
8522              AND    STYS.STREAM_TYPE_SUBCLASS IN ('RENT','LOAN_PAYMENT') --Bug # 6740000 ssdeshpa--For Loan Contracts Addition into the Pool
8523              AND  POC.status_code <> Okl_Pool_Pvt.G_POC_STS_PENDING  --Added by VARANGAN -Pool Contents Impact(Bug#6658065)
8524 	     );
8525 
8526  CURSOR c_rent_accrual_pending(p_contract_id okc_k_headers_b.id%TYPE) IS
8527  SELECT NVL(SUM(SELB.AMOUNT),0)
8528  FROM
8529    OKL_STREAMS STMB,
8530    OKL_STRM_ELEMENTS SELB,
8531    OKL_STRM_TYPE_V STYV
8532  WHERE STMB.ID = SELB.STM_ID
8533  AND STMB.STY_ID = STYV.ID
8534  AND STYV.STREAM_TYPE_PURPOSE IN ('INVESTOR_PRETAX_INCOME','INVESTOR_RENTAL_ACCRUAL','INVESTOR_INTEREST_INCOME')
8535  AND STMB.SAY_CODE = 'CURR'
8536  AND STMB.ACTIVE_YN = 'Y'
8537  AND EXISTS (SELECT 1 FROM OKL_POOL_CONTENTS POC,
8538                            OKL_POOLS POL,
8539                            OKL_STRM_TYPE_V STYS
8540              WHERE  POC.POL_ID = POL.ID
8541              AND    POC.KHR_ID = STMB.KHR_ID
8542              AND    POL.KHR_ID = P_CONTRACT_ID
8543              AND    POC.STY_ID = STYS.ID
8544              AND    STYS.STREAM_TYPE_SUBCLASS IN ('RENT','LOAN_PAYMENT') --Bug # 6740000 ssdeshpa--For Loan Contracts Addition into the Pool
8545              AND  POC.status_code = Okl_Pool_Pvt.G_POC_STS_PENDING);
8546 
8547  l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
8548 
8549  BEGIN
8550     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
8551       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
8552       LOOP
8553         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
8554           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8555         END IF;
8556       END LOOP;
8557     END IF;
8558 
8559     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8560      OPEN c_rent_accrual_pending (p_contract_id);
8561      FETCH c_rent_accrual_pending INTO l_rent_accrual;
8562      CLOSE c_rent_accrual_pending;
8563     ELSE
8564      OPEN c_rent_accrual (p_contract_id);
8565      FETCH c_rent_accrual INTO l_rent_accrual;
8566      CLOSE c_rent_accrual;
8567     END IF;
8568 
8569    RETURN l_rent_accrual;
8570 
8571    EXCEPTION
8572      WHEN OTHERS THEN
8573       --Bug # 6740000 ssdeshpa added Start
8574       IF c_rent_accrual_pending%ISOPEN THEN
8575          CLOSE c_rent_accrual_pending;
8576       END IF;
8577       IF c_rent_accrual%ISOPEN THEN
8578          CLOSE c_rent_accrual;
8579       END IF;
8580       --Bug # 6740000 ssdeshpa added End
8581       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
8582       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
8583                            p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8584                            p_token1        => 'OKL_SQLCODE',
8585                            p_token1_value  => SQLCODE,
8586                            p_token2        => 'OKL_SQLERRM',
8587                            p_token2_value  => SQLERRM);
8588        RETURN NULL;
8589 
8590 END investor_rent_accural_amout;
8591 
8592 ----------------------------------------------------------------------------------
8593 -- Start of comments
8594 --
8595 -- Procedure Name  : investor_user_amount_stake
8596 -- Description     : get total investor stake by associated agreement from user enter amount
8597 -- Business Rules  :
8598 -- Parameters      :
8599 -- Created By      : chenkuang.lee
8600 -- Version         : 1.0
8601 -- End of comments
8602 ----------------------------------------------------------------------------------
8603  FUNCTION investor_user_amount_stake(
8604   p_contract_id         IN okc_k_headers_b.id%TYPE
8605  ,p_contract_line_id    IN NUMBER
8606  ) RETURN NUMBER
8607 IS
8608     l_amount         NUMBER;
8609 
8610 CURSOR c_amt_stake(p_contract_id okc_k_headers_b.id%TYPE) IS
8611 SELECT
8612   NVL(SUM(NVL(KLEB.AMOUNT,0)),0)
8613 FROM
8614   OKL_K_LINES KLEB,
8615   OKC_K_LINES_B CLEB,
8616   OKC_LINE_STYLES_B LSEB
8617 WHERE
8618   CLEB.ID = KLEB.ID AND
8619   CLEB.LSE_ID = LSEB.ID AND
8620   LSEB.LTY_CODE = 'INVESTMENT'   AND
8621   CLEB.DNZ_CHR_ID = p_contract_id;
8622 -- akjain 01-28-2004
8623 -- modified the cursor to simplify the query, removed join with OKX_PARTY
8624 
8625 CURSOR c_add_amt_stake(p_contract_id okc_k_headers_b.id%TYPE) IS
8626 SELECT
8627   NVL(SUM(NVL(KLEB.AMOUNT_STAKE,0)),0)
8628 FROM
8629   OKL_K_LINES KLEB,
8630   OKC_K_LINES_B CLEB,
8631   OKC_LINE_STYLES_B LSEB
8632 WHERE
8633   CLEB.ID = KLEB.ID AND
8634   CLEB.LSE_ID = LSEB.ID AND
8635   LSEB.LTY_CODE = 'INVESTMENT'   AND
8636   CLEB.DNZ_CHR_ID = p_contract_id;
8637 
8638 l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
8639 
8640 BEGIN
8641 
8642     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
8643       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
8644       LOOP
8645         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
8646           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8647         END IF;
8648      END LOOP;
8649   END IF;
8650 
8651   IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8652     OPEN c_add_amt_stake (p_contract_id);
8653     FETCH c_add_amt_stake INTO l_amount;
8654     CLOSE c_add_amt_stake;
8655   ELSE
8656     OPEN c_amt_stake (p_contract_id);
8657     FETCH c_amt_stake INTO l_amount;
8658     CLOSE c_amt_stake;
8659   END IF;
8660 
8661   RETURN l_amount;
8662 
8663   EXCEPTION
8664     WHEN OTHERS THEN
8665     --Bug # 6740000 ssdeshpa added Start
8666     IF c_add_amt_stake%ISOPEN THEN
8667        CLOSE c_add_amt_stake;
8668     END IF;
8669     --Bug # 6740000 ssdeshpa added End
8670     --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
8671     OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
8672                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8673                           p_token1        => 'OKL_SQLCODE',
8674                           p_token1_value  => SQLCODE,
8675                           p_token2        => 'OKL_SQLERRM',
8676                           p_token2_value  => SQLERRM);
8677       RETURN NULL;
8678 
8679 END investor_user_amount_stake;
8680 
8681 ----------------------------------------------------------------------------------
8682 -- Start of comments
8683 --
8684 -- Procedure Name  : investor_stream_amount
8685 -- Description     : get total investor stream amount by associated agreement's pool contents
8686 -- Business Rules  :
8687 -- Parameters      : p_contract_id
8688 -- Created By      : chenkuang.lee
8689 -- last modified by: ssdeshpa
8690 -- Version         : 2.0
8691 -- comments        : modified for the subclass changes 01-28-2004
8692 -- returns         : Total securitized streams amount * revenue share percent
8693 -- Version         : 3.0
8694 -- comments        : Bug # 6740000 modified for the Addition of Loan Contracts into the Pool changes
8695 -- End of comments
8696 ----------------------------------------------------------------------------------
8697   FUNCTION investor_stream_amount(
8698    p_contract_id         IN okc_k_headers_b.id%TYPE
8699   ,p_contract_line_id    IN NUMBER
8700   ) RETURN NUMBER
8701  IS
8702 
8703    x_value          NUMBER;
8704    l_pol_id         okl_pools.id%TYPE;
8705    l_percent_stake  NUMBER;
8706    G_FINAL_DATE   CONSTANT    DATE    	:= TO_DATE('1','j') + 5300000;
8707 
8708 
8709  CURSOR l_khr_csr(p_khr_id okc_k_headers_b.id%TYPE) IS
8710    SELECT polb.id
8711  FROM okl_pools polb
8712  WHERE polb.khr_id = p_khr_id;
8713 
8714  -- get revenue share by subclass
8715  CURSOR l_okl_percent_stake_csr(p_sty_subclass IN VARCHAR2)
8716     IS
8717     SELECT DISTINCT kleb.percent_stake,clet.id
8718     FROM   okl_k_lines kleb,
8719            okc_k_lines_b clet,
8720            okc_k_lines_b cles
8721     WHERE  kleb.id = cles.id
8722     AND    cles.cle_id = clet.id
8723     AND    clet.dnz_chr_id = p_contract_id
8724     AND    kleb.stream_type_subclass = p_sty_subclass;
8725 
8726  -- get pool streams amount by subclass
8727    CURSOR l_streams_amount_csr (p_pol_id  NUMBER, p_stm_sub_class VARCHAR2)
8728    IS
8729  SELECT
8730   NVL(SUM(NVL(selb.AMOUNT,0)),0) AMOUNT
8731  FROM
8732        okl_strm_type_v  styv,
8733        okl_streams       stmb,
8734        okl_strm_elements selb,
8735        okl_pool_contents pocb
8736  WHERE  styv.stream_type_subclass = p_stm_sub_class
8737  AND    styv.id = stmb.sty_id
8738  AND    stmb.id       = selb.stm_id
8739  AND    pocb.pol_id   = p_pol_id
8740  AND    stmb.ID   = pocb.STM_ID
8741  AND    stmb.say_code = 'CURR'
8742  AND    stmb.active_yn = 'Y'
8743  AND    selb.STREAM_ELEMENT_DATE
8744         BETWEEN pocb.STREAMS_FROM_DATE AND NVL(pocb.STREAMS_TO_DATE, G_FINAL_DATE)
8745   AND  pocb.status_code <> Okl_Pool_Pvt.G_POC_STS_PENDING ; --Added by VARANGAN -Pool Contents Impact(Bug#6658065)
8746 
8747  -- get pool streams amount by subclass
8748    CURSOR l_streams_amount_pending_csr (p_pol_id  NUMBER, p_stm_sub_class VARCHAR2)
8749    IS
8750  SELECT
8751   NVL(SUM(NVL(selb.AMOUNT,0)),0) AMOUNT
8752  FROM
8753        okl_strm_type_v  styv,
8754        okl_streams       stmb,
8755        okl_strm_elements selb,
8756        okl_pool_contents pocb
8757  WHERE  styv.stream_type_subclass = p_stm_sub_class
8758  AND    styv.id = stmb.sty_id
8759  AND    stmb.id       = selb.stm_id
8760  AND    pocb.pol_id   = p_pol_id
8761  AND    stmb.ID   = pocb.STM_ID
8762  AND    stmb.say_code = 'CURR'
8763  AND    stmb.active_yn = 'Y'
8764  AND    selb.STREAM_ELEMENT_DATE
8765         BETWEEN pocb.STREAMS_FROM_DATE AND NVL(pocb.STREAMS_TO_DATE, G_FINAL_DATE)
8766   AND  pocb.status_code = Okl_Pool_Pvt.G_POC_STS_PENDING ;
8767 
8768  l_total_percent NUMBER := 0;
8769  l_total_sec_amount  NUMBER := 0;
8770  l_per_subclass_amount NUMBER := 0;
8771  l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
8772 
8773  BEGIN
8774 
8775    FOR l_khr_csr_rec IN l_khr_csr(p_contract_id)
8776    LOOP
8777      l_pol_id := l_khr_csr_rec.id;
8778    END LOOP;
8779 
8780    IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
8781        FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
8782        LOOP
8783          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
8784            l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
8785          END IF;
8786        END LOOP;
8787      END IF;
8788 
8789    IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8790       FOR l_streams_amount_pending_rec IN l_streams_amount_pending_csr(l_pol_id, 'RENT')
8791      LOOP
8792        l_per_subclass_amount := l_streams_amount_pending_rec.amount;
8793        FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RENT')
8794        LOOP
8795          l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8796        END LOOP;
8797      END LOOP;
8798    ELSE
8799      FOR l_streams_amount_csr_rec IN l_streams_amount_csr(l_pol_id, 'RENT')
8800      LOOP
8801        l_per_subclass_amount := l_streams_amount_csr_rec.amount;
8802        FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RENT')
8803        LOOP
8804          l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8805        END LOOP;
8806      END LOOP;
8807     END IF;
8808      l_total_sec_amount := (l_total_percent/100) * l_per_subclass_amount;
8809      l_total_percent := 0;
8810      l_per_subclass_amount := 0;
8811 
8812    IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8813      FOR l_streams_amount_pending_rec IN l_streams_amount_pending_csr(l_pol_id, 'RESIDUAL')
8814      LOOP
8815        l_per_subclass_amount := l_streams_amount_pending_rec.amount;
8816        FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RESIDUAL')
8817        LOOP
8818          l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8819        END LOOP;
8820       END LOOP;
8821    ELSE
8822      FOR l_streams_amount_csr_rec IN l_streams_amount_csr(l_pol_id, 'RESIDUAL')
8823      LOOP
8824        l_per_subclass_amount := l_streams_amount_csr_rec.amount;
8825        FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('RESIDUAL')
8826        LOOP
8827          l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8828        END LOOP;
8829       END LOOP;
8830     END IF;
8831     --Bug # 6740000 Changes for Adding the Loan Contracts Into Pool
8832     l_total_sec_amount := l_total_sec_amount + ((l_total_percent/100) * l_per_subclass_amount);
8833     l_total_percent := 0;
8834     l_per_subclass_amount := 0;
8835 
8836     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
8837       FOR l_streams_amount_pending_rec IN l_streams_amount_pending_csr(l_pol_id, 'LOAN_PAYMENT')
8838       LOOP
8839         l_per_subclass_amount := l_streams_amount_pending_rec.amount;
8840         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8841         LOOP
8842           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8843         END LOOP;
8844       END LOOP;
8845     ELSE
8846       FOR l_streams_amount_csr_rec IN l_streams_amount_csr(l_pol_id, 'LOAN_PAYMENT')
8847       LOOP
8848         l_per_subclass_amount := l_streams_amount_csr_rec.amount;
8849         FOR l_okl_percent_stake_rec IN l_okl_percent_stake_csr('LOAN_PAYMENT')
8850         LOOP
8851           l_total_percent := l_total_percent + l_okl_percent_stake_rec.percent_stake;
8852         END LOOP;
8853       END LOOP;
8854     END IF;
8855    l_total_sec_amount := l_total_sec_amount + ((l_total_percent/100) * l_per_subclass_amount);
8856     --Bug # 6740000 Changes for Adding the Loan Contracts Into Pool End
8857    x_value := l_total_sec_amount;
8858 
8859    RETURN x_value;
8860 
8861    EXCEPTION
8862      WHEN OTHERS THEN
8863       --Bug # 6740000 ssdeshpa added Start
8864       IF l_khr_csr%ISOPEN THEN
8865          CLOSE l_khr_csr;
8866       END IF;
8867       IF l_okl_percent_stake_csr%ISOPEN THEN
8868          CLOSE l_okl_percent_stake_csr;
8869       END IF;
8870       IF l_streams_amount_csr%ISOPEN THEN
8871          CLOSE l_streams_amount_csr;
8872       END IF;
8873       IF l_streams_amount_pending_csr%ISOPEN THEN
8874          CLOSE l_streams_amount_pending_csr;
8875       END IF;
8876       --Bug # 6740000 ssdeshpa added End
8877       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
8878        OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
8879                            p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8880                            p_token1        => 'OKL_SQLCODE',
8881                            p_token1_value  => SQLCODE,
8882                            p_token2        => 'OKL_SQLERRM',
8883                            p_token2_value  => SQLERRM);
8884        RETURN NULL;
8885 
8886 END investor_stream_amount;
8887 
8888 
8889 ----------------------------------------------------------------------------------
8890 -- Start of comments
8891 --
8892 -- Procedure Name  : fee_idc_amount
8893 -- Description     : gets the sum of fee idc amount for a given contract
8894 -- Business Rules  :
8895 -- Parameters      :
8896 -- Created By      : smereddy
8897 -- Version         : 1.0
8898 -- End of comments
8899 ----------------------------------------------------------------------------------
8900  FUNCTION fee_idc_amount(
8901   p_dnz_chr_id         IN NUMBER
8902  ,p_kle_id             IN NUMBER
8903  ) RETURN NUMBER
8904 IS
8905 
8906 l_sum_idc_amt  NUMBER;
8907 
8908 -- smereddy 06/17/03 calculates sum of fee idc
8909 CURSOR sum_idc_csr(l_dnz_chr_id okc_k_headers_b.id%TYPE) IS
8910 SELECT
8911   NVL(SUM(NVL(KLEB.initial_direct_cost,0)),0)
8912 FROM
8913   OKL_K_LINES KLEB,
8914   OKC_K_LINES_B CLEB,
8915   OKC_LINE_STYLES_B LSEB
8916 WHERE
8917   KLEB.ID = CLEB.ID AND
8918   CLEB.LSE_ID = LSEB.ID AND
8919   LSEB.LTY_CODE = 'FEE' AND
8920   KLEB.FEE_TYPE IN ('EXPENSE','MISCELLANEOUS') AND
8921   CLEB.CHR_ID = l_dnz_chr_id AND
8922   CLEB.STS_CODE IN ('APPROVED', 'COMPLETE');
8923 -- added COMPLETE to resolve bug # 3152093
8924 
8925 BEGIN
8926 
8927   OPEN sum_idc_csr (p_dnz_chr_id);
8928   FETCH sum_idc_csr INTO l_sum_idc_amt;
8929   CLOSE sum_idc_csr;
8930 
8931   RETURN l_sum_idc_amt;
8932 
8933   EXCEPTION
8934     WHEN OTHERS THEN
8935       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
8936       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
8937                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
8938                           p_token1        => 'OKL_SQLCODE',
8939                           p_token1_value  => SQLCODE,
8940                           p_token2        => 'OKL_SQLERRM',
8941                           p_token2_value  => SQLERRM);
8942       RETURN NULL;
8943 
8944 END fee_idc_amount;
8945 
8946 
8947 -- 09/05/03 jsanju start
8948 --for cure calculation
8949 
8950  FUNCTION contract_delinquent_amt (
8951   p_contract_id         IN okc_k_headers_b.id%TYPE
8952  ,p_contract_line_id    IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
8953  ) RETURN NUMBER IS
8954 
8955 -- ASHIM CHANGE - START
8956 
8957 /*
8958   CURSOR c_amount_past_due(p_contract_id IN NUMBER,
8959                            p_grace_days  IN NUMBER) IS
8960     SELECT SUM(NVL(aps.amount_due_remaining, 0)) past_due_amount
8961     FROM   okl_cnsld_ar_strms_b ocas
8962            ,ar_payment_schedules aps
8963            , okl_strm_type_v sm
8964     WHERE  ocas.khr_id = p_contract_id
8965     AND    ocas.receivables_invoice_id = aps.customer_trx_id
8966     AND    aps.class ='INV'
8967     AND    (aps.due_date + p_grace_days) < SYSDATE
8968     AND    NVL(aps.amount_due_remaining, 0) > 0
8969     AND    sm.id = ocas.STY_ID
8970     AND    sm.name <> 'CURE';*/
8971 
8972   CURSOR c_amount_past_due(p_contract_id IN NUMBER,
8973                            p_grace_days  IN NUMBER) IS
8974     SELECT SUM(NVL(aps.amount_due_remaining, 0)) past_due_amount
8975     FROM   okl_bpd_tld_ar_lines_v ocas
8976            ,ar_payment_schedules aps
8977            , okl_strm_type_v sm
8978     WHERE  ocas.khr_id = p_contract_id
8979     AND    ocas.customer_trx_id = aps.customer_trx_id
8980     AND    aps.class ='INV'
8981     AND    (aps.due_date + p_grace_days) < SYSDATE
8982     AND    NVL(aps.amount_due_remaining, 0) > 0
8983     AND    sm.id = ocas.STY_ID
8984     AND    sm.name <> 'CURE';
8985 
8986 -- ASHIM CHANGE - END
8987 
8988   l_contract_number okc_k_headers_b.contract_number%TYPE;
8989   l_rule_name     VARCHAR2(200);
8990   l_rule_value    VARCHAR2(2000);
8991   l_return_Status VARCHAR2(1):=FND_Api.G_RET_STS_SUCCESS;
8992   l_id1           VARCHAR2(40);
8993   l_id2           VARCHAR2(200);
8994   l_days_allowed  NUMBER :=0;
8995   l_program_id okl_k_headers.khr_id%TYPE;
8996   l_delinquent_amount NUMBER :=0;
8997 
8998 
8999  BEGIN
9000    IF (G_DEBUG_ENABLED = 'Y') THEN
9001      G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
9002    END IF;
9003 
9004        SELECT khr_id INTO l_program_id
9005        FROM okl_k_headers
9006        WHERE id=p_contract_id;
9007 
9008 
9009       l_return_status := okl_contract_info.get_rule_value(
9010                               p_contract_id     => l_program_id
9011                              ,p_rule_group_code => 'COCURP'
9012                              ,p_rule_code		=> 'COCURE'
9013                              ,p_segment_number	=> 3
9014                              ,x_id1             => l_id1
9015                              ,x_id2             => l_id2
9016                              ,x_value           => l_rule_value);
9017 
9018          l_days_allowed :=NVL(l_rule_value,0);
9019 
9020 
9021 
9022       -- Get Past Due Amount with maximium days allowed
9023       OPEN  c_amount_past_due (p_contract_id,l_days_allowed);
9024       FETCH c_amount_past_due INTO l_delinquent_amount;
9025       CLOSE c_amount_past_due;
9026       RETURN l_delinquent_amount;
9027 
9028  EXCEPTION
9029  WHEN OTHERS THEN
9030 
9031      IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
9032             OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, ' in   contract_delinquent_amt'||SQLERRM);
9033      END IF;
9034      OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
9035                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
9036                           p_token1        => 'OKL_SQLCODE',
9037                           p_token1_value  => SQLCODE,
9038                           p_token2        => 'OKL_SQLERRM',
9039                           p_token2_value  => SQLERRM);
9040       RETURN l_delinquent_amount;
9041 
9042  END contract_delinquent_amt;
9043 
9044  FUNCTION cumulative_vendor_invoice_amt (
9045   p_contract_id         IN okc_k_headers_b.id%TYPE
9046  ,p_contract_line_id    IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
9047  ) RETURN NUMBER IS
9048 
9049   CURSOR c_vendor_invoice_amt (p_contract_id IN NUMBER) IS
9050   SELECT NVL(SUM(negotiated_amount),0)
9051   FROM  okl_cure_amounts
9052   WHERE chr_id =p_contract_id
9053   AND   status ='CURESINPROGRESS';
9054 
9055   l_vendor_invoice_amt NUMBER;
9056 
9057  BEGIN
9058       OPEN  c_vendor_invoice_amt(p_contract_id);
9059       FETCH c_vendor_invoice_amt INTO l_vendor_invoice_amt;
9060       CLOSE c_vendor_invoice_amt;
9061 
9062       RETURN l_vendor_invoice_amt;
9063 
9064  END cumulative_vendor_invoice_amt;
9065 
9066 
9067  FUNCTION contract_short_fund_amt (
9068   p_contract_id         IN okc_k_headers_b.id%TYPE
9069  ,p_contract_line_id    IN NUMBER  DEFAULT OKL_API.G_MISS_NUM
9070  ) RETURN NUMBER IS
9071 
9072   CURSOR c_get_short_fund_amt (p_contract_id IN NUMBER) IS
9073   SELECT NVL(SUM(short_fund_amount),0)
9074   FROM  okl_cure_amounts
9075   WHERE chr_id =p_contract_id
9076   AND   status ='CURESINPROGRESS';
9077 
9078   l_short_fund_amt NUMBER;
9079 
9080  BEGIN
9081       OPEN  c_get_short_fund_amt(p_contract_id);
9082       FETCH c_get_short_fund_amt INTO l_short_fund_amt;
9083       CLOSE c_get_short_fund_amt;
9084 
9085       RETURN l_short_fund_amt;
9086 
9087  END contract_short_fund_amt;
9088 
9089 -- 09/05/03 jsanju end
9090 
9091 ------------------------------------------
9092 --Bug# 3143522 avsingh : 11.5.10 Subsidies
9093 ------------------------------------------
9094 --Bug# 3638568 : Modified function to conditionally include terminated lines if called from pricing
9095 --------------------------------------------------------------------------------
9096 --start of comments
9097 --Name        : line_discount
9098 --Purpose     : To calculate total discount on a financial asset line
9099 --Parameters  : IN - p_chr_id  contract header id
9100 --                 - p_line id financial asset line id
9101 -- Return     : Total line discount
9102 -- History    : 16-SEP-2003  avsingh Creation
9103 --end of comments
9104 --------------------------------------------------------------------------------
9105 FUNCTION line_discount(
9106            p_chr_id    IN NUMBER,
9107            p_line_id   IN NUMBER) RETURN NUMBER IS
9108 
9109 l_api_version    NUMBER DEFAULT 1.0;
9110 l_return_status  VARCHAR2(1) DEFAULT Okl_Api.G_RET_STS_SUCCESS;
9111 l_msg_count      NUMBER;
9112 l_msg_data       VARCHAR2(2000);
9113 
9114 l_line_discount NUMBER;
9115 l_discount      NUMBER;
9116 l_discount_incl_terminated BOOLEAN := FALSE;
9117 
9118   --cursor to get line_sts
9119   CURSOR l_line_sts_csr (p_cle_id IN NUMBER) IS
9120   SELECT stsb.ste_code
9121   FROM   okc_statuses_b stsb,
9122          okc_k_lines_b  cleb
9123   WHERE  stsb.code      = cleb.sts_code
9124   AND    cleb.id        = p_cle_id;
9125 
9126   l_line_sts_rec     l_line_sts_csr%ROWTYPE;
9127 
9128   --cursor to get financial asset lines on a contract (without terminated lines)
9129   CURSOR l_cleb_csr (p_chr_id IN NUMBER) IS
9130   SELECT cleb.id
9131   FROM   okc_k_lines_b cleb,
9132          okc_statuses_b stsb,
9133          okc_line_styles_b lseb
9134   WHERE  cleb.chr_id     = p_chr_id
9135   AND    cleb.lse_id     = lseb.id
9136   AND    lseb.lty_code   = 'FREE_FORM1'
9137   AND    cleb.sts_code   = stsb.code
9138   AND    stsb.ste_code   NOT IN ('HOLD','EXPIRED','TERMINATED','CANCELLED');
9139 
9140   --cursor to get financial asset lines on a contract (with terminated lines)
9141   CURSOR l_cleb_termn_csr (p_chr_id IN NUMBER) IS
9142   SELECT cleb.id
9143   FROM   okc_k_lines_b cleb,
9144          okc_statuses_b stsb,
9145          okc_line_styles_b lseb
9146   WHERE  cleb.chr_id     = p_chr_id
9147   AND    cleb.lse_id     = lseb.id
9148   AND    lseb.lty_code   = 'FREE_FORM1'
9149   AND    cleb.sts_code   = stsb.code
9150   AND    stsb.ste_code   NOT IN ('HOLD','EXPIRED','CANCELLED');
9151 
9152   --Bug# 15992711 , Start
9153   -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
9154   CURSOR l_cleb_nr_csr (p_chr_id IN NUMBER, p_line_type VARCHAR2) IS
9155   SELECT cleb.id
9156   FROM   okc_k_lines_b cleb,
9157          okc_statuses_b stsb,
9158          okc_line_styles_b lseb,
9159          okl_k_lines     kle
9160   WHERE  cleb.chr_id     = p_chr_id
9161   AND    cleb.lse_id     = lseb.id
9162   AND    lseb.lty_code   = 'FREE_FORM1'
9163   AND    cleb.sts_code   = stsb.code
9164   AND    stsb.ste_code   NOT IN ('HOLD','EXPIRED','TERMINATED','CANCELLED')
9165   AND    cleb.id         = kle.id
9166   AND    NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
9167 
9168   -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
9169   CURSOR l_cleb_nr_termn_csr (p_chr_id IN NUMBER, p_line_type VARCHAR2) IS
9170   SELECT cleb.id
9171   FROM   okc_k_lines_b cleb,
9172          okc_statuses_b stsb,
9173          okc_line_styles_b lseb,
9174          okl_k_lines     kle
9175   WHERE  cleb.chr_id     = p_chr_id
9176   AND    cleb.lse_id     = lseb.id
9177   AND    lseb.lty_code   = 'FREE_FORM1'
9178   AND    cleb.sts_code   = stsb.code
9179   AND    stsb.ste_code   NOT IN ('HOLD','EXPIRED','CANCELLED')
9180   AND    cleb.id         = kle.id
9181   AND    NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
9182 
9183   -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
9184   CURSOR l_line_nr_sts_csr (p_cle_id IN NUMBER, p_line_type VARCHAR2) IS
9185   SELECT stsb.ste_code
9186   FROM   okc_statuses_b stsb,
9187          okc_k_lines_b  cleb,
9188          okl_k_lines     kle
9189   WHERE  stsb.code      = cleb.sts_code
9190   AND    cleb.id        = p_cle_id
9191   AND    cleb.id        = kle.id
9192   AND    NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
9193 
9194 
9195   l_line_type VARCHAR2(30) := 'X';
9196   --Bug# 15992711 , End
9197 
9198   l_cle_id    okc_k_lines_b.ID%TYPE;
9199 
9200 
9201 BEGIN
9202 
9203     --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
9204        --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
9205        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
9206 		 -- l_discount_incl_terminated := TRUE;
9207     --END IF;
9208 
9209            -- rmunjulu 4042892
9210     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
9211       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
9212 	  LOOP
9213         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
9214           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
9215 		  l_discount_incl_terminated := TRUE;
9216 
9217         --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
9218         --                If set then based on its value set l_line_type
9219 
9220         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
9221           IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
9222             l_line_type := 'NEW'; --New
9223           ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
9224             l_line_type := 'RELEASE'; --Release
9225           END IF;
9226         --Bug# 15992711 , End
9227 
9228         END IF;
9229       END LOOP;
9230     END IF;
9231 
9232      --Bug# 15992711 , Start
9233      IF (l_line_type IN ('NEW','RELEASE') )
9234         AND (p_line_id IS NOT NULL AND
9235              p_line_id <> OKC_API.G_MISS_NUM) THEN --Added OKC_API.G_MISS_NUM condition because p_line_id was having OKC_API.G_MISS_NUM value in few scenario
9236          --Get the line status
9237          OPEN l_line_nr_sts_csr(p_cle_id => p_line_id, p_line_type => l_line_type);
9238          FETCH l_line_nr_sts_csr INTO l_line_sts_rec;
9239          CLOSE l_line_nr_sts_csr;
9240 
9241          IF l_line_sts_rec.ste_code IS NULL THEN
9242              l_line_discount := 0;
9243 
9244          ELSIF (l_line_sts_rec.ste_code IN ('HOLD','EXPIRED','CANCELLED'))
9245                OR   (l_line_sts_rec.ste_code = 'TERMINATED' AND
9246                      NOT (l_discount_incl_terminated)) THEN
9247              l_line_discount := 0;
9248 
9249          ELSIF (l_line_sts_rec.ste_code NOT IN ('HOLD','EXPIRED','TERMINATED''CANCELLED'))
9250                 OR (l_line_sts_rec.ste_code = 'TERMINATED' AND
9251                     (l_discount_incl_terminated)) THEN
9252 
9253              Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
9254                                      (p_api_version       => l_api_version,
9255                                       p_init_msg_list     => Okl_Api.G_FALSE,
9256                                       x_msg_data           => l_msg_data,
9257                                       x_msg_count          => l_msg_count,
9258                                       x_return_status      => l_return_status,
9259                                       p_asset_cle_id       => p_line_id,
9260                                       p_accounting_method  => 'NET',
9261                                       x_subsidy_amount     => l_line_discount);
9262 
9263              IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
9264                 RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
9265              END IF;
9266          END IF;
9267 
9268      --Added OKC_API.G_MISS_NUM condition because p_line_id was having OKC_API.G_MISS_NUM value in few scenario
9269      --IF p_line_id IS NOT NULL THEN
9270      ELSIF (p_line_id IS NOT NULL AND
9271             p_line_id <> OKC_API.G_MISS_NUM ) THEN
9272      --Bug# 15992711 , End
9273 
9274          --Get the line status
9275          OPEN l_line_sts_csr(p_cle_id => p_line_id);
9276          FETCH l_line_sts_csr INTO l_line_sts_rec;
9277          CLOSE l_line_sts_csr;
9278 
9279          IF l_line_sts_rec.ste_code IS NULL THEN
9280              l_line_discount := 0;
9281 
9282          ELSIF (l_line_sts_rec.ste_code IN ('HOLD','EXPIRED','CANCELLED'))
9283                OR   (l_line_sts_rec.ste_code = 'TERMINATED' AND
9284                      NOT (l_discount_incl_terminated)) THEN
9285              l_line_discount := 0;
9286 
9287          ELSIF (l_line_sts_rec.ste_code NOT IN ('HOLD','EXPIRED','TERMINATED''CANCELLED'))
9288                 OR (l_line_sts_rec.ste_code = 'TERMINATED' AND
9289                     (l_discount_incl_terminated)) THEN
9290 
9291              Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
9292                                      (p_api_version       => l_api_version,
9293                                       p_init_msg_list     => Okl_Api.G_FALSE,
9294                                       x_msg_data           => l_msg_data,
9295                                       x_msg_count          => l_msg_count,
9296                                       x_return_status      => l_return_status,
9297                                       p_asset_cle_id       => p_line_id,
9298                                       p_accounting_method  => 'NET',
9299                                       x_subsidy_amount     => l_line_discount);
9300 
9301              IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
9302                 RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
9303              END IF;
9304          END IF;
9305 
9306       --Bug# 15992711 , Start
9307       --Added OKC_API.G_MISS_NUM condition because p_line_id was having OKC_API.G_MISS_NUM value in few scenario
9308       --ELSIF (p_line_id IS NULL) AND (p_chr_id IS NOT NULL) THEN
9309       ELSIF (p_line_id IS NULL OR p_line_id = OKC_API.G_MISS_NUM) AND (p_chr_id IS NOT NULL) THEN
9310       --Bug# 15992711 , End
9311          l_line_discount := 0;
9312 
9313 
9314          --Bug# 15992711 , Start
9315          -- If l_line_type is set as either 'NEW' or 'RELEASE' call
9316          -- l_cleb_nr_csr cursor in order to consider either only new
9317          -- assets or only re-leased assets, else no change in the standard behavior
9318          IF l_line_type IN ('NEW','RELEASE') THEN
9319              IF (l_discount_incl_terminated) THEN
9320                  OPEN l_cleb_nr_termn_csr(p_chr_id => p_chr_id, p_line_type => l_line_type);
9321                  LOOP
9322                      FETCH l_cleb_nr_termn_csr INTO l_cle_id;
9323                      EXIT WHEN l_cleb_nr_termn_csr%NOTFOUND;
9324                      Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
9325                                      (p_api_version       => l_api_version,
9326                                       p_init_msg_list     => Okl_Api.G_FALSE,
9327                                       x_msg_data           => l_msg_data,
9328                                       x_msg_count          => l_msg_count,
9329                                       x_return_status      => l_return_status,
9330                                       p_asset_cle_id       => l_cle_id,
9331                                       p_accounting_method  => 'NET',
9332                                       x_subsidy_amount     => l_discount);
9333                      IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
9334                          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
9335                      END IF;
9336 
9337                      l_line_discount := l_line_discount + l_discount;
9338                  END LOOP;
9339 
9340                  CLOSE l_cleb_nr_termn_csr;
9341 
9342              ELSIF NOT  (l_discount_incl_terminated) THEN
9343                  OPEN l_cleb_nr_csr(p_chr_id => p_chr_id, p_line_type => l_line_type);
9344                  LOOP
9345                      FETCH l_cleb_nr_csr INTO l_cle_id;
9346                      EXIT WHEN l_cleb_nr_csr%NOTFOUND;
9347                      Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
9348                                      (p_api_version       => l_api_version,
9349                                       p_init_msg_list     => Okl_Api.G_FALSE,
9350                                       x_msg_data           => l_msg_data,
9351                                       x_msg_count          => l_msg_count,
9352                                       x_return_status      => l_return_status,
9353                                       p_asset_cle_id       => l_cle_id,
9354                                       p_accounting_method  => 'NET',
9355                                       x_subsidy_amount     => l_discount);
9356                      IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
9357                          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
9358                      END IF;
9359 
9360                      l_line_discount := l_line_discount + l_discount;
9361                  END LOOP;
9362 
9363                  CLOSE l_cleb_nr_csr;
9364 
9365              END IF;
9366          --IF (l_discount_incl_terminated) THEN -- Commented standard code
9367          ELSIF (l_discount_incl_terminated) THEN
9368 
9369          --Bug# 15992711 , End
9370 
9371              OPEN l_cleb_termn_csr(p_chr_id => p_chr_id);
9372              LOOP
9373                  FETCH l_cleb_termn_csr INTO l_cle_id;
9374                  EXIT WHEN l_cleb_termn_csr%NOTFOUND;
9375                  Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
9376                                  (p_api_version       => l_api_version,
9377                                   p_init_msg_list     => Okl_Api.G_FALSE,
9378                                   x_msg_data           => l_msg_data,
9379                                   x_msg_count          => l_msg_count,
9380                                   x_return_status      => l_return_status,
9381                                   p_asset_cle_id       => l_cle_id,
9382                                   p_accounting_method  => 'NET',
9383                                   x_subsidy_amount     => l_discount);
9384                  IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
9385                      RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
9386                  END IF;
9387 
9388                  l_line_discount := l_line_discount + l_discount;
9389              END LOOP;
9390 
9391              CLOSE l_cleb_termn_csr;
9392          ELSIF NOT  (l_discount_incl_terminated) THEN
9393 
9394              OPEN l_cleb_csr(p_chr_id => p_chr_id);
9395              LOOP
9396                  FETCH l_cleb_csr INTO l_cle_id;
9397                  EXIT WHEN l_cleb_csr%NOTFOUND;
9398                  Okl_Subsidy_Process_Pvt.get_asset_subsidy_amount
9399                                  (p_api_version       => l_api_version,
9400                                   p_init_msg_list     => Okl_Api.G_FALSE,
9401                                   x_msg_data           => l_msg_data,
9402                                   x_msg_count          => l_msg_count,
9403                                   x_return_status      => l_return_status,
9404                                   p_asset_cle_id       => l_cle_id,
9405                                   p_accounting_method  => 'NET',
9406                                   x_subsidy_amount     => l_discount);
9407                  IF l_return_status  <> Okl_Api.G_RET_STS_SUCCESS THEN
9408                      RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
9409                  END IF;
9410 
9411                  l_line_discount := l_line_discount + l_discount;
9412              END LOOP;
9413 
9414              CLOSE l_cleb_csr;
9415 
9416          END IF;
9417       --Bug# 15992711 , Start
9418       --Added OKC_API.G_MISS_NUM condition because p_line_id was having OKC_API.G_MISS_NUM value in few scenario
9419       --ELSIF (p_line_id IS NULL) AND (p_chr_id IS NULL) THEN
9420       ELSIF (p_line_id IS NULL OR p_line_id = OKC_API.G_MISS_NUM) AND (p_chr_id IS NULL) THEN
9421       --Bug# 15992711 , End
9422              RAISE Okl_Api.G_EXCEPTION_ERROR;
9423       END IF;
9424 
9425       RETURN (l_line_discount);
9426 
9427      EXCEPTION
9428      WHEN OTHERS THEN
9429      IF l_cleb_csr%ISOPEN THEN
9430          CLOSE l_cleb_csr;
9431      END IF;
9432      IF l_cleb_termn_csr%ISOPEN THEN
9433          CLOSE l_cleb_termn_csr;
9434      END IF;
9435      IF l_line_sts_csr%ISOPEN THEN
9436          CLOSE l_line_sts_csr;
9437      END IF;
9438      Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
9439                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
9440                           p_token1        => 'OKL_SQLCODE',
9441                           p_token1_value  => SQLCODE,
9442                           p_token2        => 'OKL_SQLERRM',
9443                           p_token2_value  => SQLERRM);
9444       RETURN NULL;
9445 END line_discount;
9446 --------------------------------------------------------------------------------
9447 --start of comments
9448 --Name        : contract_discount
9449 --Purpose     : To calculate total discount on a contract
9450 --Parameters  : IN - p_chr_id  contract header id
9451 --                 - p_line id financial asset line id
9452 -- Return     : Total contract discount
9453 -- History    : 16-SEP-2003  avsingh Creation
9454 --end of comments
9455 --------------------------------------------------------------------------------
9456 FUNCTION contract_discount(
9457            p_chr_id    IN NUMBER,
9458            p_line_id   IN NUMBER) RETURN NUMBER IS
9459 
9460 l_api_version    NUMBER DEFAULT 1.0;
9461 l_return_status  VARCHAR2(1) DEFAULT OKL_API.G_RET_STS_SUCCESS;
9462 l_msg_count      NUMBER;
9463 l_msg_data       VARCHAR2(2000);
9464 
9465 l_contract_discount NUMBER;
9466 BEGIN
9467      IF (p_line_id IS NOT NULL) OR (p_chr_id IS NOT NULL)  THEN
9468         l_contract_discount := line_discount(p_chr_id,p_line_id);
9469 
9470       ELSIF (p_line_id IS NULL) AND (p_chr_id IS NULL) THEN
9471           RAISE OKL_API.G_EXCEPTION_ERROR;
9472       END IF;
9473       RETURN (l_contract_discount);
9474      EXCEPTION
9475      WHEN OTHERS THEN
9476      OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
9477                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
9478                           p_token1        => 'OKL_SQLCODE',
9479                           p_token1_value  => SQLCODE,
9480                           p_token2        => 'OKL_SQLERRM',
9481                           p_token2_value  => SQLERRM);
9482       RETURN NULL;
9483 END contract_discount;
9484 ----------------------------------------------
9485 --End Bug# 3143522 avsingh : 11.5.10 Subsidies
9486 ----------------------------------------------
9487 -----------------------------------------------------------------------
9488 --Start Bug# 3036581 : avsingh new formula CONTRACT_AMORTIZED_EXPENSES
9489 -----------------------------------------------------------------------
9490 ----------------------------------------------------------------------------------------------------
9491 
9492     -- Start of Comments
9493     -- Created By:    avsingh
9494     -- Function Name  contract_amortized_expenses
9495     -- Description:   returns the sum of amount on stream type - Amortized Expense.
9496     -- Dependencies:
9497     -- Parameters: contract id.
9498     -- Version: 1.0
9499     -- End of Commnets
9500 
9501 ----------------------------------------------------------------------------------------------------
9502   FUNCTION contract_amortized_expenses(
9503             p_chr_id          IN  NUMBER,
9504             p_line_id         IN  NUMBER) RETURN NUMBER  IS
9505 
9506     l_api_name          CONSTANT VARCHAR2(30) := 'CONTRACT_AMORTIZED_EXPENSES';
9507     l_api_version       CONSTANT NUMBER       := 1;
9508     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
9509     x_msg_count         NUMBER;
9510     x_msg_data          VARCHAR2(2000);
9511 
9512     l_amortized_expenses NUMBER := 0;
9513 
9514     ---------------------------------------------------
9515     --cursor to get sum of line level amortized expenses
9516     ---------------------------------------------------
9517     CURSOR l_line_amortexp_csr (chrId NUMBER ) IS
9518     SELECT NVL(SUM(sele.amount),0) amount
9519     FROM okl_strm_elements sele,
9520          okl_streams str,
9521          --okl_strm_type_tl sty,
9522          okl_strm_type_v sty,
9523          okl_K_lines_full_v kle,
9524          okc_statuses_b sts
9525     WHERE sele.stm_id = str.id
9526        AND str.sty_id = sty.id
9527        --AND UPPER(sty.name)  = 'AMORTIZED EXPENSE'
9528        AND sty.stream_type_purpose = 'AMORTIZED_FEE_EXPENSE'
9529        --AND sty.LANGUAGE = 'US'
9530        AND str.say_code = 'CURR'
9531        AND str.active_yn = 'Y'
9532        AND NVL( str.purpose_code, 'XXXX' ) <>  'REPORT'
9533        AND str.khr_id = chrId
9534        AND NVL(str.kle_id,-9999) = kle.id
9535        AND kle.dnz_chr_id = chrId
9536        AND kle.sts_code = sts.code
9537        AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
9538 
9539         l_line_amortexp_rec l_line_amortexp_csr%ROWTYPE;
9540 
9541     -----------------------------------------------------
9542     --Cursor to get sum of contract level amortized expenses
9543     -----------------------------------------------------
9544     CURSOR l_chr_amortexp_csr (chrId NUMBER) IS
9545     SELECT NVL(SUM(sele.amount),0) amount
9546     FROM okl_strm_elements sele,
9547          okl_streams str,
9548          --okl_strm_type_tl sty
9549          okl_strm_type_v sty
9550     WHERE sele.stm_id = str.id
9551        AND str.sty_id = sty.id
9552        --AND UPPER(sty.name) = 'AMORTIZED EXPENSE'
9553        AND sty.stream_type_purpose = 'AMORTIZED_FEE_EXPENSE'
9554        --AND sty.LANGUAGE = 'US'
9555        AND str.say_code = 'CURR'
9556        AND str.active_yn = 'Y'
9557        AND NVL( str.purpose_code, 'XXXX' ) <> 'REPORT'
9558        AND str.khr_id = chrId
9559        AND NVL(str.kle_id, -9999) = -9999;
9560 
9561     l_chr_amortexp_rec    l_chr_amortexp_csr%ROWTYPE;
9562 
9563 BEGIN
9564 
9565        IF ( NVL(p_chr_id,OKL_API.G_MISS_NUM)  = OKL_API.G_MISS_NUM ) THEN
9566            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
9567        END IF;
9568 
9569        OPEN l_line_amortexp_csr( p_chr_id );
9570        FETCH l_line_amortexp_csr INTO l_line_amortexp_rec;
9571        CLOSE l_line_amortexp_csr;
9572 
9573        OPEN l_chr_amortexp_csr( p_chr_id );
9574        FETCH l_chr_amortexp_csr INTO l_chr_amortexp_rec;
9575        CLOSE l_chr_amortexp_csr;
9576 
9577        l_amortized_expenses := l_line_amortexp_rec.amount + l_chr_amortexp_rec.amount;
9578 
9579       RETURN l_amortized_expenses;
9580 
9581 
9582     EXCEPTION
9583         WHEN OTHERS  THEN
9584                Okl_Api.SET_MESSAGE(
9585                         p_app_name     => G_APP_NAME,
9586                         p_msg_name     => G_UNEXPECTED_ERROR,
9587                         p_token1       => G_SQLCODE_TOKEN,
9588                         p_token1_value => SQLCODE,
9589                         p_token2       => G_SQLERRM_TOKEN,
9590                         p_token2_value => SQLERRM);
9591                 RETURN NULL;
9592 
9593 END contract_amortized_expenses;
9594 -------------------------------------------------
9595 --End Bug# 3036581 avsingh : 11.5.10
9596 -------------------------------------------------
9597 
9598 -------------------------------------------------
9599 --Bug# 3143522 mdokal : 11.5.10 AM Securitization
9600 -------------------------------------------------
9601 
9602 ------------------------------------------------------------------------------
9603   -- Start of Comments
9604   -- Created By:    Manjit Dokal - 18-JUL-2003
9605   -- Function Name: investor_rent_factor
9606   -- Description:   Calculate Investor Rent Factor
9607   -- Dependencies:  OKL building blocks AMTX and AMUV,
9608   -- Parameters:    IN:  p_contract_id, p_contract_line_id (optional)
9609   --                OUT: amount
9610   -- History        rmunjulu EDAT Changed to get unbilled streams after
9611   --                quote eff date and ALL undisbursed amount
9612   --              : PAGARG Bug# 4012614 User Defined Streams impact
9613   --              : 06-Dec-2004 PAGARG Bug# 3948473
9614   --              : obtain investor agreement id from additional parameters and
9615   --              : and use it to get stream id for INVESTOR_RENT_DISB_BASIS
9616   --              : 07-Jan-2004 PAGARG Bug# 3948473. Removed the billable_yn
9617   --              : accrual_yn joins from undisbursed investor rent streams cursor
9618   --              : gboomina bug 4775555 Modified to get FUTURE BILLS (billed and not billed from term date onwards)
9619   --                and FUTURE DISBURSEMENTS (disbursed and not disbursed from term date onwards)
9620 
9621   -- Version:       1.0
9622   -- End of Commnets
9623 ------------------------------------------------------------------------------
9624 
9625 FUNCTION investor_rent_factor (
9626 	p_contract_id		IN NUMBER,
9627 	p_contract_line_id	IN NUMBER)
9628 	RETURN NUMBER IS
9629 
9630     --Bug# 4012614 PAGARG modified the cursor for User Defined Streams Impact
9631 	-- Get Unbilled Streams
9632 	-- rmunjulu EDAT unbilled after quote eff from date
9633 CURSOR l_unbill_stream_csr (
9634                                              cp_contract_id NUMBER,
9635                                              cp_contract_line_id NUMBER,
9636                                              cp_date DATE,
9637                                              cp_sty_id NUMBER) IS
9638 SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_due
9639 FROM okl_streams stm,
9640            okl_strm_type_b sty,
9641            okl_strm_elements ste
9642           ,okl_pool_contents pocb
9643 WHERE stm.khr_id      = cp_contract_id
9644 AND	stm.kle_id	= NVL(cp_contract_line_id, stm.kle_id)
9645 AND	stm.active_yn = 'Y'
9646 AND	stm.say_code = 'CURR'
9647 AND	ste.stm_id	= stm.id
9648 AND NVL (ste.amount, 0)	<> 0
9649 AND sty.id              = stm.sty_id
9650 AND sty.id              = cp_sty_id
9651 AND sty.billable_yn     = 'Y'
9652 AND ste.stream_element_date > cp_date -- rmunjulu EDAT
9653 AND pocb.status_Code <> 'PENDING'
9654 AND pocb.khr_id = stm.khr_id
9655 AND pocb.kle_id = stm.kle_id
9656 AND pocb.sty_id = stm.sty_id;
9657 
9658     --Bug# 4012614 PAGARG modified the cursor for User Defined Streams Impact
9659 -- Get Undisbursed Investor Rent Streams
9660 CURSOR l_undisb_rent_stream_csr (
9661                                                       cp_contract_id NUMBER,
9662                                                       cp_contract_line_id NUMBER,
9663                                                       cp_sty_id NUMBER,
9664                                                       cp_date  DATE) IS --gboomina bug 4775555
9665 SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_payable
9666 FROM okl_streams stm,
9667           okl_strm_type_b     sty,
9668           okl_strm_elements ste
9669          -- ,okl_pool_contents pocb
9670 WHERE stm.khr_id  = cp_contract_id
9671 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9672 AND stm.active_yn = 'Y'
9673 AND stm.say_code= 'CURR'
9674 AND	ste.stm_id	= stm.id
9675 AND NVL (ste.amount, 0)	<> 0
9676 AND sty.id              = stm.sty_id
9677 AND sty.id              = cp_sty_id
9678 AND ste.stream_element_date > cp_date -- gboomina bug 4775555 -- check for disbs after termination
9679 --AND pocb.status_Code <> 'PENDING' -- commented by sosharma for bug 9284305
9680 --AND pocb.khr_id = stm.khr_id
9681 --AND pocb.kle_id = stm.kle_id
9682 --AND pocb.sty_id = stm.sty_id
9683 ;
9684 
9685 CURSOR l_unbill_stream_pending_csr (
9686                                                          cp_contract_id NUMBER,
9687                                                          cp_contract_line_id NUMBER,
9688                                                          cp_date DATE,
9689                                                          cp_sty_id NUMBER) IS
9690 SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_due
9691 FROM okl_streams stm,
9692            okl_strm_type_b sty,
9693            okl_strm_elements ste
9694            ,okl_pool_contents pocb
9695 WHERE stm.khr_id = cp_contract_id
9696 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9697 AND stm.active_yn = 'Y'
9698 AND stm.say_code = 'CURR'
9699 AND ste.stm_id = stm.id
9700 AND NVL (ste.amount, 0) <> 0
9701 AND sty.id  = stm.sty_id
9702 AND sty.id              = cp_sty_id
9703 AND sty.billable_yn     = 'Y'
9704 AND ste.stream_element_date > cp_date
9705 AND pocb.status_Code = 'PENDING'
9706 AND pocb.khr_id = stm.khr_id
9707 AND pocb.kle_id = stm.kle_id
9708 AND pocb.sty_id = stm.sty_id;
9709 
9710   -- Get Undisbursed Investor Rent Streams
9711 CURSOR l_undisb_rent_strm_pndg_csr (
9712                                                                    cp_contract_id NUMBER,
9713                                                                    cp_contract_line_id NUMBER,
9714                                                                    cp_sty_id NUMBER,
9715                                                                    cp_date DATE) IS
9716 SELECT	NVL(SUM (NVL (ste.amount, 0)),0)  amount_payable
9717 FROM okl_streams stm,
9718            okl_strm_type_b sty,
9719            okl_strm_elements ste
9720            --,okl_pool_contents pocb
9721 WHERE stm.khr_id = cp_contract_id
9722 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9723 AND	stm.active_yn = 'Y'
9724 AND stm.say_code = 'CURR'
9725 AND	ste.stm_id = stm.id
9726 AND NVL (ste.amount, 0)	<> 0
9727 AND sty.id = stm.sty_id
9728 AND sty.id              = cp_sty_id
9729 AND ste.stream_element_date > cp_date
9730 --AND pocb.status_Code = 'PENDING' -- commented by sosharma for bug 9284305
9731 --AND pocb.khr_id = stm.khr_id
9732 --AND pocb.kle_id = stm.kle_id
9733 --AND pocb.sty_id = stm.sty_id
9734 ;
9735 
9736 
9737 l_unbill_rent_amount		NUMBER		:= 0;
9738 l_undisb_rent_amount		NUMBER		:= 0;
9739 l_result_amount             NUMBER      := 0;
9740 l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
9741 
9742 -- rmunjulu EDAT
9743 CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
9744 SELECT trunc(qte.date_effective_from) date_effective_from
9745 FROM   okl_trx_quotes_b  qte
9746 WHERE  qte.id = p_quote_id;
9747 
9748  -- rmunjulu EDAT
9749         l_quote_id NUMBER;
9750         l_quote_date DATE;
9751         l_sysdate DATE;
9752         l_sty_id            OKL_STRM_TYPE_TL.ID%TYPE := 0;
9753         l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
9754     --06-Dec-2004 PAGARG Bug# 3948473 variable to store investor agreement id
9755     l_inv_agr_id    NUMBER;
9756 BEGIN
9757 	-- ****************
9758 	-- Calculate result
9759 	-- ****************
9760 	-- rmunjulu EDAT
9761     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
9762       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
9763       LOOP
9764         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
9765            l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
9766         --06-Dec-2004 PAGARG Bug# 3948473 obtain investor agreement id
9767         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'inv_agr_id' THEN
9768            l_inv_agr_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
9769         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
9770           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
9771         END IF;
9772       END LOOP;
9773     END IF;
9774 
9775     -- rmunjulu EDAT
9776     select sysdate into l_sysdate from dual;
9777 
9778     -- rmunjulu EDAT
9779 	IF  l_quote_id IS NOT NULL
9780 	AND l_quote_id <> OKL_API.G_MISS_NUM THEN
9781 
9782 	   FOR get_quote_date_rec IN get_quote_date_csr (l_quote_id) LOOP
9783 	      l_quote_date := get_quote_date_rec.date_effective_from;
9784 	   END LOOP;
9785     END IF;
9786 
9787 	-- rmunjulu EDAT
9788     IF l_quote_date IS NULL
9789     OR l_quote_date = OKL_API.G_MISS_DATE THEN
9790        l_quote_date := l_sysdate;
9791     END IF;
9792 
9793     --PAGARG 19-Nov-2004 Bug# 4012614
9794     --UDS impact. Obtain stream type id and pass it to cursor
9795     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
9796                                             'RENT',
9797                                             l_return_status,
9798                                             l_sty_id);
9799 
9800     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9801     THEN
9802         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9803     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9804     THEN
9805         RAISE OKL_API.G_EXCEPTION_ERROR;
9806     END IF;
9807 
9808         IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9809           OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
9810           FETCH l_unbill_stream_pending_csr INTO l_unbill_rent_amount;
9811           CLOSE l_unbill_stream_pending_csr;
9812         ELSE
9813           OPEN l_unbill_stream_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
9814           FETCH l_unbill_stream_csr INTO l_unbill_rent_amount;
9815           CLOSE l_unbill_stream_csr;
9816         END IF;
9817 
9818     --06-Dec-2004 PAGARG Bug# 3948473 Pass investor agreement id to obtain stream id
9819     OKL_STREAMS_UTIL.get_primary_stream_type(l_inv_agr_id,
9820                                             'INVESTOR_RENT_DISB_BASIS',
9821                                             l_return_status,
9822                                             l_sty_id);
9823 
9824     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9825     THEN
9826         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9827     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9828     THEN
9829         RAISE OKL_API.G_EXCEPTION_ERROR;
9830     END IF;
9831 
9832     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9833       OPEN	l_undisb_rent_strm_pndg_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date);
9834       FETCH l_undisb_rent_strm_pndg_csr INTO l_undisb_rent_amount;
9835       CLOSE l_undisb_rent_strm_pndg_csr;
9836     ELSE
9837       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
9838       FETCH l_undisb_rent_stream_csr INTO l_undisb_rent_amount;
9839       CLOSE l_undisb_rent_stream_csr;
9840     END IF;
9841 
9842     -- this condition is included to prevent 'ORA-01476: divisor is equal to zero' error
9843     -- need to seed a new message
9844     IF l_unbill_rent_amount = 0 THEN
9845         l_result_amount := 0;
9846     ELSE
9847         l_result_amount := l_undisb_rent_amount/l_unbill_rent_amount;
9848     END IF;
9849 
9850  RETURN l_result_amount;
9851 
9852 EXCEPTION
9853 
9854 	WHEN OTHERS THEN
9855 
9856            -- Close open cursors
9857            IF l_unbill_stream_csr%ISOPEN THEN
9858 		CLOSE l_unbill_stream_csr;
9859            END IF;
9860            IF l_undisb_rent_stream_csr%ISOPEN THEN
9861            	CLOSE l_undisb_rent_stream_csr;
9862            END IF;
9863            IF l_unbill_stream_pending_csr%ISOPEN THEN
9864 		CLOSE l_unbill_stream_pending_csr;
9865            END IF;
9866            IF l_undisb_rent_strm_pndg_csr%ISOPEN THEN
9867 		CLOSE l_undisb_rent_strm_pndg_csr;
9868            END IF;
9869 	-- store SQL error message on message stack for caller
9870 	OKL_API.SET_MESSAGE (
9871 		p_app_name	=> OKL_API.G_APP_NAME,
9872 		p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
9873 		p_token1	=> 'SQLCODE',
9874 		p_token1_value	=> SQLCODE,
9875 		p_token2	=> 'SQLERRM',
9876 		p_token2_value	=> SQLERRM);
9877 
9878 		RETURN NULL;
9879 
9880 END investor_rent_factor;
9881 
9882 
9883 ------------------------------------------------------------------------------
9884   -- Start of Comments
9885   -- Created By:    Manjit Dokal - 18-JUL-2003
9886   -- Function Name: investor_rv_factor
9887   -- Description:   Calculate Investor Residual Value Factor
9888   -- Dependencies:  OKL building blocks AMTX and AMUV,
9889   -- Parameters:    IN:  p_contract_id, p_contract_line_id (optional)
9890   --                OUT: amount
9891   -- History        rmunjulu EDAT Changed to get all residual streams amount
9892   --              : PAGARG 19-Nov-2004 Bug# 4012614
9893   --              : Fetching the l_unbill_stream_csr value into correct variable
9894   --              : UDS impact and modified to use correct stream type purpose
9895   -- Version:       1.0
9896   -- End of Commnets
9897 ------------------------------------------------------------------------------
9898 
9899 FUNCTION investor_rv_factor (
9900 	p_contract_id		IN NUMBER,
9901 	p_contract_line_id	IN NUMBER)
9902 	RETURN NUMBER IS
9903 
9904     --Bug# 4012614 PAGARG modified the cursor for User Defined Streams Impact
9905 -- Get Residual Streams
9906 -- Get Residual Streams
9907 CURSOR l_unbill_stream_csr (
9908                                              cp_contract_id NUMBER,
9909                                              cp_contract_line_id NUMBER,
9910                                              cp_sty_id NUMBER) IS
9911 SELECT NVL(SUM (NVL (ste.amount, 0)), 0) amount_due
9912 FROM okl_streams stm,
9913            okl_strm_type_b sty,
9914            okl_strm_elements ste,
9915            okl_pool_contents pocb
9916 WHERE stm.khr_id = cp_contract_id
9917 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9918 AND stm.active_yn = 'Y'
9919 AND stm.say_code = 'CURR'
9920 AND	ste.stm_id	= stm.id
9921 AND ste.date_billed IS NULL
9922 AND	NVL (ste.amount, 0)	<> 0
9923 AND sty.id              = stm.sty_id
9924 AND sty.id              = cp_sty_id
9925 AND sty.billable_yn     = 'N'
9926 AND pocb.status_Code <> 'PENDING'
9927 AND pocb.khr_id = stm.khr_id
9928 AND pocb.kle_id = stm.kle_id
9929 AND pocb.sty_id = stm.sty_id;
9930 
9931 -- Get Residual Streams
9932 CURSOR l_unbill_stream_pending_csr (
9933                                              cp_contract_id NUMBER,
9934                                              cp_contract_line_id NUMBER,
9935                                              cp_sty_id NUMBER) IS
9936 SELECT NVL(SUM (NVL (ste.amount, 0)), 0) amount_due
9937 FROM okl_streams stm,
9938            okl_strm_type_b sty,
9939            okl_strm_elements ste,
9940            okl_pool_contents pocb
9941 WHERE stm.khr_id = cp_contract_id
9942 AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
9943 AND stm.active_yn = 'Y'
9944 AND stm.say_code = 'CURR'
9945 AND	ste.stm_id	= stm.id
9946 AND ste.date_billed IS NULL
9947 AND	NVL (ste.amount, 0)	<> 0
9948 AND sty.id              = stm.sty_id
9949 AND sty.id              = cp_sty_id
9950 AND sty.billable_yn     = 'N'
9951 AND pocb.status_Code = 'PENDING'
9952 AND pocb.khr_id = stm.khr_id
9953 AND pocb.kle_id = stm.kle_id
9954 AND pocb.sty_id = stm.sty_id;
9955 
9956 l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
9957 l_residual_amount	NUMBER		:= 0;
9958 l_result_amount		NUMBER		:= 0;
9959 l_sty_id            OKL_STRM_TYPE_TL.ID%TYPE := 0;
9960 l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
9961 
9962 BEGIN
9963 	-- ****************
9964 	-- Calculate result
9965 	-- ****************
9966     --PAGARG 19-Nov-2004 Bug# 4012614
9967     --UDS impact. Obtain stream type id and pass it to cursor
9968     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
9969                                             'RESIDUAL_VALUE',
9970                                             l_return_status,
9971                                             l_sty_id);
9972 
9973     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
9974     THEN
9975         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9976     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
9977     THEN
9978         RAISE OKL_API.G_EXCEPTION_ERROR;
9979     END IF;
9980 
9981     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
9982       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
9983       LOOP
9984         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
9985           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
9986         END IF;
9987       END LOOP;
9988      END IF;
9989 
9990     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
9991       OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id, l_sty_id);
9992        FETCH l_unbill_stream_pending_csr INTO l_residual_amount;
9993        CLOSE l_unbill_stream_pending_csr;
9994     ELSE
9995     --PAGARG 19-Nov-2004 Bug# 4012614
9996     --Fetch cursor value into correct variable l_residual_amount
9997        OPEN	l_unbill_stream_csr (p_contract_id, p_contract_line_id, l_sty_id);
9998        FETCH	l_unbill_stream_csr INTO l_residual_amount;
9999        CLOSE	l_unbill_stream_csr;
10000       END IF;
10001 
10002     -- this condition is included to prevent 'ORA-01476: divisor is equal to zero' error
10003     -- need to seed a new message
10004     IF l_residual_amount = 0 THEN
10005         l_result_amount := 0;
10006     ELSE
10007         l_result_amount := l_residual_amount/l_residual_amount;
10008     END IF;
10009 
10010 	RETURN l_result_amount;
10011 
10012 EXCEPTION
10013 
10014 	WHEN OTHERS THEN
10015 
10016 		-- Close open cursors
10017 
10018 		IF l_unbill_stream_csr%ISOPEN THEN
10019 		   CLOSE l_unbill_stream_csr;
10020 		END IF;
10021 		IF l_unbill_stream_pending_csr%ISOPEN THEN
10022 		   CLOSE l_unbill_stream_pending_csr;
10023 		END IF;
10024 
10025 		-- store SQL error message on message stack for caller
10026 
10027 		OKL_API.SET_MESSAGE (
10028 			p_app_name	=> OKL_API.G_APP_NAME,
10029 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
10030 			p_token1	=> 'SQLCODE',
10031 			p_token1_value	=> SQLCODE,
10032 			p_token2	=> 'SQLERRM',
10033 			p_token2_value	=> SQLERRM);
10034 
10035 		RETURN NULL;
10036 
10037 END investor_rv_factor;
10038 
10039 
10040 ------------------------------------------------------------------------------
10041   -- Start of Comments
10042   -- Created By:    Sushil Deshpande
10043   -- Function Name: investor_loan_factor
10044   -- Description:   Calculate Investor Loan Factor
10045   -- Dependencies:  OKL building blocks AMTX and AMUV,
10046   -- Parameters:    IN:  p_contract_id, p_contract_line_id (optional)
10047   --                OUT: amount
10048   -- History
10049   -- Version:       1.0
10050   -- End of Commnets
10051 ------------------------------------------------------------------------------
10052 
10053  FUNCTION investor_loan_factor (
10054 	p_contract_id		IN NUMBER,
10055 	p_contract_line_id	IN NUMBER)
10056 	RETURN NUMBER IS
10057 
10058   CURSOR l_unbill_stream_csr (cp_contract_id NUMBER,
10059                               cp_contract_line_id NUMBER,
10060                               cp_date DATE,
10061                               cp_sty_id NUMBER) IS
10062   SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_due
10063   FROM okl_streams stm,
10064        okl_strm_type_b sty,
10065        okl_strm_elements ste
10066       ,okl_pool_contents pocb
10067   WHERE stm.khr_id      = cp_contract_id
10068   AND	stm.kle_id	= NVL(cp_contract_line_id, stm.kle_id)
10069   AND	stm.active_yn = 'Y'
10070   AND	stm.say_code = 'CURR'
10071   AND	ste.stm_id	= stm.id
10072   AND NVL (ste.amount, 0)	<> 0
10073   AND sty.id              = stm.sty_id
10074   AND sty.id              = cp_sty_id
10075   AND sty.billable_yn     = 'Y'
10076   AND ste.stream_element_date > cp_date -- rmunjulu EDAT
10077   AND pocb.status_Code <> 'PENDING'
10078   AND pocb.khr_id = stm.khr_id
10079   AND pocb.kle_id = stm.kle_id
10080   AND pocb.sty_id = stm.sty_id;
10081 
10082   -- Get Undisbursed Investor Rent Streams
10083   CURSOR l_undisb_rent_stream_csr (cp_contract_id NUMBER,
10084                                    cp_contract_line_id NUMBER,
10085                                    cp_sty_id NUMBER,
10086                                    cp_date  DATE) IS --gboomina bug 4775555
10087   SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_payable
10088   FROM okl_streams stm,
10089        okl_strm_type_b     sty,
10090        okl_strm_elements ste
10091        ,okl_pool_contents pocb
10092   WHERE stm.khr_id  = cp_contract_id
10093   AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
10094   AND stm.active_yn = 'Y'
10095   AND stm.say_code= 'CURR'
10096   AND	ste.stm_id	= stm.id
10097   AND NVL (ste.amount, 0)	<> 0
10098   AND sty.id              = stm.sty_id
10099   AND sty.id              = cp_sty_id
10100   AND ste.stream_element_date > cp_date -- gboomina bug 4775555 -- check for disbs after termination
10101   AND pocb.status_Code <> 'PENDING'
10102   AND pocb.khr_id = stm.khr_id
10103   AND pocb.kle_id = stm.kle_id
10104   AND pocb.sty_id = stm.sty_id;
10105 
10106   CURSOR l_unbill_stream_pending_csr (cp_contract_id NUMBER,
10107                                       cp_contract_line_id NUMBER,
10108                                       cp_date DATE,
10109                                       cp_sty_id NUMBER) IS
10110   SELECT NVL(SUM (NVL (ste.amount, 0)),0) amount_due
10111   FROM okl_streams stm,
10112        okl_strm_type_b sty,
10113        okl_strm_elements ste,
10114        okl_pool_contents pocb
10115   WHERE stm.khr_id = cp_contract_id
10116   AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
10117   AND stm.active_yn = 'Y'
10118   AND stm.say_code = 'CURR'
10119   AND ste.stm_id = stm.id
10120   AND NVL (ste.amount, 0) <> 0
10121   AND sty.id  = stm.sty_id
10122   AND sty.id              = cp_sty_id
10123   AND sty.billable_yn     = 'Y'
10124   AND ste.stream_element_date > cp_date
10125   AND pocb.status_Code = 'PENDING'
10126   AND pocb.khr_id = stm.khr_id
10127   AND pocb.kle_id = stm.kle_id
10128   AND pocb.sty_id = stm.sty_id;
10129 
10130   -- Get Undisbursed Investor Rent Streams
10131   CURSOR l_undisb_rent_strm_pndg_csr (cp_contract_id NUMBER,
10132                                       cp_contract_line_id NUMBER,
10133                                       cp_sty_id NUMBER,
10134                                       cp_date DATE) IS
10135   SELECT	NVL(SUM (NVL (ste.amount, 0)),0)  amount_payable
10136   FROM okl_streams stm,
10137        okl_strm_type_b sty,
10138        okl_strm_elements ste,
10139        okl_pool_contents pocb
10140   WHERE stm.khr_id = cp_contract_id
10141   AND stm.kle_id = NVL(cp_contract_line_id, stm.kle_id)
10142   AND	stm.active_yn = 'Y'
10143   AND stm.say_code = 'CURR'
10144   AND	ste.stm_id = stm.id
10145   AND NVL (ste.amount, 0)	<> 0
10146   AND sty.id = stm.sty_id
10147   AND sty.id              = cp_sty_id
10148   AND ste.stream_element_date > cp_date
10149   AND pocb.status_Code = 'PENDING'
10150   AND pocb.khr_id = stm.khr_id
10151   AND pocb.kle_id = stm.kle_id
10152   AND pocb.sty_id = stm.sty_id;
10153 
10154 
10155   l_unbill_principal_amount	NUMBER	:= 0;
10156   l_unbill_interest_amount	NUMBER	:= 0;
10157   l_unbill_ppd_amount	        NUMBER	:= 0;
10158   l_unbill_loan_amount	    NUMBER	:= 0;
10159   l_undisb_principal_amount	NUMBER	:= 0;
10160   l_undisb_interest_amount	NUMBER	:= 0;
10161   l_undisb_ppd_amount	        NUMBER	:= 0;
10162   l_undisb_loan_amount	    NUMBER	:= 0;
10163   l_result_amount           NUMBER  := 0;
10164   l_try_rsn OKL_POOL_TRANSACTIONS.TRANSACTION_REASON%TYPE;
10165 
10166   -- rmunjulu EDAT
10167   CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
10168    SELECT trunc(qte.date_effective_from) date_effective_from
10169    FROM   okl_trx_quotes_b  qte
10170    WHERE  qte.id = p_quote_id;
10171 
10172   -- rmunjulu EDAT
10173   l_quote_id NUMBER;
10174   l_quote_date DATE;
10175   l_sysdate DATE;
10176   l_sty_id            OKL_STRM_TYPE_TL.ID%TYPE := 0;
10177   l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
10178   --06-Dec-2004 PAGARG Bug# 3948473 variable to store investor agreement id
10179   l_inv_agr_id    NUMBER;
10180   BEGIN
10181 	-- ****************
10182 	-- Calculate result
10183 	-- ****************
10184 	-- rmunjulu EDAT
10185     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
10186       FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
10187       LOOP
10188         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
10189            l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
10190         --06-Dec-2004 PAGARG Bug# 3948473 obtain investor agreement id
10191         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'inv_agr_id' THEN
10192            l_inv_agr_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
10193         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_transaction_reason' THEN
10194           l_try_rsn := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
10195         END IF;
10196       END LOOP;
10197     END IF;
10198 
10199     -- rmunjulu EDAT
10200     select sysdate into l_sysdate from dual;
10201 
10202     -- rmunjulu EDAT
10203 	IF  l_quote_id IS NOT NULL
10204 	AND l_quote_id <> OKL_API.G_MISS_NUM THEN
10205 
10206 	   FOR get_quote_date_rec IN get_quote_date_csr (l_quote_id) LOOP
10207 	      l_quote_date := get_quote_date_rec.date_effective_from;
10208 	   END LOOP;
10209     END IF;
10210 
10211 	-- rmunjulu EDAT
10212     IF l_quote_date IS NULL
10213     OR l_quote_date = OKL_API.G_MISS_DATE THEN
10214        l_quote_date := l_sysdate;
10215     END IF;
10216 
10217     --PAGARG 19-Nov-2004 Bug# 4012614
10218     --UDS impact. Obtain stream type id and pass it to cursor
10219     OKL_STREAMS_UTIL.get_dependent_stream_type(p_contract_id,
10220                                             'RENT',
10221                                             'PRINCIPAL_PAYMENT',
10222                                             l_return_status,
10223                                             l_sty_id);
10224 
10225     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
10226     THEN
10227         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10228     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
10229     THEN
10230         RAISE OKL_API.G_EXCEPTION_ERROR;
10231     END IF;
10232 
10233     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
10234        OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
10235        FETCH l_unbill_stream_pending_csr INTO l_unbill_principal_amount;
10236        CLOSE l_unbill_stream_pending_csr;
10237     ELSE
10238        OPEN l_unbill_stream_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
10239        FETCH l_unbill_stream_csr INTO l_unbill_principal_amount;
10240        CLOSE l_unbill_stream_csr;
10241     END IF;
10242 
10243     --PAGARG 19-Nov-2004 Bug# 4012614
10244     --UDS impact. Obtain stream type id and pass it to cursor
10245     OKL_STREAMS_UTIL.get_dependent_stream_type(p_contract_id,
10246                                             'RENT',
10247                                             'INTEREST_PAYMENT',
10248                                             l_return_status,
10249                                             l_sty_id);
10250 
10251     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
10252     THEN
10253         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10254     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
10255     THEN
10256         RAISE OKL_API.G_EXCEPTION_ERROR;
10257     END IF;
10258 
10259     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
10260        OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
10261        FETCH l_unbill_stream_pending_csr INTO l_unbill_interest_amount;
10262        CLOSE l_unbill_stream_pending_csr;
10263     ELSE
10264        OPEN l_unbill_stream_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
10265        FETCH l_unbill_stream_csr INTO l_unbill_interest_amount;
10266        CLOSE l_unbill_stream_csr;
10267     END IF;
10268 
10269     --PAGARG 19-Nov-2004 Bug# 4012614
10270     --UDS impact. Obtain stream type id and pass it to cursor
10271     OKL_STREAMS_UTIL.get_dependent_stream_type(p_contract_id,
10272                                             'RENT',
10273                                             'UNSCHEDULED_PRINCIPAL_PAYMENT',
10274                                             l_return_status,
10275                                             l_sty_id);
10276 
10277     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
10278     THEN
10279         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10280     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
10281     THEN
10282         RAISE OKL_API.G_EXCEPTION_ERROR;
10283     END IF;
10284 
10285     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
10286        OPEN l_unbill_stream_pending_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
10287        FETCH l_unbill_stream_pending_csr INTO l_unbill_ppd_amount;
10288        CLOSE l_unbill_stream_pending_csr;
10289     ELSE
10290        OPEN l_unbill_stream_csr (p_contract_id, p_contract_line_id,l_quote_date, l_sty_id);
10291        FETCH l_unbill_stream_csr INTO l_unbill_ppd_amount;
10292        CLOSE l_unbill_stream_csr;
10293     END IF;
10294 
10295     --Calculate Total Unbilled Interest Amount
10296     l_unbill_loan_amount := l_unbill_principal_amount+l_unbill_interest_amount+l_unbill_ppd_amount;
10297 
10298    IF l_inv_agr_id IS NOT NULL THEN
10299    --06-Dec-2004 PAGARG Bug# 3948473 Pass investor agreement id to obtain stream id
10300     OKL_STREAMS_UTIL.get_primary_stream_type(l_inv_agr_id,
10301                                             'INVESTOR_PRINCIPAL_DISB_BASIS',
10302                                             l_return_status,
10303                                             l_sty_id);
10304 
10305     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
10306     THEN
10307         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10308     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
10309     THEN
10310         RAISE OKL_API.G_EXCEPTION_ERROR;
10311     END IF;
10312 
10313     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
10314       OPEN	l_undisb_rent_strm_pndg_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date);
10315       FETCH l_undisb_rent_strm_pndg_csr INTO l_undisb_principal_amount;
10316       CLOSE l_undisb_rent_strm_pndg_csr;
10317     ELSE
10318       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
10319       FETCH l_undisb_rent_stream_csr INTO l_undisb_principal_amount;
10320       CLOSE l_undisb_rent_stream_csr;
10321     END IF;
10322 
10323     OKL_STREAMS_UTIL.get_primary_stream_type(l_inv_agr_id,
10324                                             'INVESTOR_INTEREST_DISB_BASIS',
10325                                             l_return_status,
10326                                             l_sty_id);
10327 
10328     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
10329     THEN
10330         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10331     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
10332     THEN
10333         RAISE OKL_API.G_EXCEPTION_ERROR;
10334     END IF;
10335 
10336     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
10337       OPEN	l_undisb_rent_strm_pndg_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date);
10338       FETCH l_undisb_rent_strm_pndg_csr INTO l_undisb_interest_amount;
10339       CLOSE l_undisb_rent_strm_pndg_csr;
10340     ELSE
10341       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
10342       FETCH l_undisb_rent_stream_csr INTO l_undisb_interest_amount;
10343       CLOSE l_undisb_rent_stream_csr;
10344     END IF;
10345 
10346     OKL_STREAMS_UTIL.get_primary_stream_type(l_inv_agr_id,
10347                                             'INVESTOR_PPD_DISB_BASIS',
10348                                             l_return_status,
10349                                             l_sty_id);
10350 
10351     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
10352     THEN
10353         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10354     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
10355     THEN
10356         RAISE OKL_API.G_EXCEPTION_ERROR;
10357     END IF;
10358 
10359     IF l_try_rsn IS NOT NULL AND l_try_rsn = 'ADJUSTMENTS' THEN
10360       OPEN	l_undisb_rent_strm_pndg_csr (p_contract_id, p_contract_line_id, l_sty_id,l_quote_date);
10361       FETCH l_undisb_rent_strm_pndg_csr INTO l_undisb_ppd_amount;
10362       CLOSE l_undisb_rent_strm_pndg_csr;
10363     ELSE
10364       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
10365       FETCH l_undisb_rent_stream_csr INTO l_undisb_ppd_amount;
10366       CLOSE l_undisb_rent_stream_csr;
10367     END IF;
10368 
10369     l_undisb_loan_amount := l_undisb_principal_amount + l_undisb_interest_amount+l_undisb_ppd_amount;
10370 END IF;
10371 
10372     -- this condition is included to prevent 'ORA-01476: divisor is equal to zero' error
10373     -- need to seed a new message
10374     IF l_unbill_loan_amount = 0 THEN
10375        l_result_amount := 0;
10376     ELSE
10377         l_result_amount := l_undisb_loan_amount/l_unbill_loan_amount;
10378     END IF;
10379 
10380  RETURN l_result_amount;
10381 
10382 EXCEPTION
10383 
10384 	WHEN OTHERS THEN
10385 		-- Close open cursors
10386 		IF l_unbill_stream_csr%ISOPEN THEN
10387 			CLOSE l_unbill_stream_csr;
10388 		END IF;
10389 		IF l_undisb_rent_stream_csr%ISOPEN THEN
10390 			CLOSE l_undisb_rent_stream_csr;
10391 		END IF;
10392 		IF l_unbill_stream_pending_csr%ISOPEN THEN
10393 			CLOSE l_unbill_stream_pending_csr;
10394 		END IF;
10395 		IF l_undisb_rent_strm_pndg_csr%ISOPEN THEN
10396 			CLOSE l_undisb_rent_strm_pndg_csr;
10397 		END IF;
10398 		-- store SQL error message on message stack for caller
10399 
10400 		OKL_API.SET_MESSAGE (
10401 			p_app_name	=> OKL_API.G_APP_NAME,
10402 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
10403 			p_token1	=> 'SQLCODE',
10404 			p_token1_value	=> SQLCODE,
10405 			p_token2	=> 'SQLERRM',
10406 			p_token2_value	=> SQLERRM);
10407 
10408 		RETURN NULL;
10409 
10410 END investor_loan_factor;
10411 
10412 
10413 -----------------------------------------------------
10414 --End Bug# 3143522 mdokal : 11.5.10 AM Securitization
10415 -----------------------------------------------------
10416 
10417 
10418 ------------------------------------------------------------------------------
10419   -- Start of Comments
10420   -- Created By:    Reeshma Kuttiyat - 15-SEP-2003
10421   -- Function Name: Net_Gain_Loss
10422   -- Description:   Returns the Net Gain Loss for a Termination Quote
10423   -- Dependencies:
10424   -- Parameters:    IN:  p_contract_id, p_contract_line_id ,p_additional_paams(quote_id)
10425   --                OUT: amount
10426   --                rmunjulu 3842101 changed for proper calculation
10427   --                rmunjulu 3900814
10428   -- Version:       1.0
10429   -- End of Commnets
10430 ------------------------------------------------------------------------------
10431 
10432 FUNCTION NET_GAIN_LOSS_QUOTE(p_khr_id IN NUMBER, p_kle_id IN NUMBER) RETURN NUMBER IS
10433 
10434 --Cusor to obtain the asset line id
10435   CURSOR c_quote_asset_line(p_quote_id IN NUMBER) IS
10436   SELECT kle_id
10437   FROM OKL_TXL_QUOTE_LINES_B
10438   WHERE QTE_ID = p_quote_id
10439   AND QLT_CODE = 'AMCFIA';
10440 
10441 --Cusor to obtain the quote net investment
10442   CURSOR c_quote_net_invst_csr(p_quote_id IN NUMBER) IS
10443   SELECT asset_value net_investment
10444   FROM OKL_TRX_QUOTES_V qte
10445   WHERE qte.id = p_quote_id;
10446 
10447 --Cursor to obtain the total quote amount , excluding the billed quote lines
10448   CURSOR c_total_qt_amt(p_quote_id IN NUMBER) IS
10449   SELECT SUM(amount)
10450   FROM OKL_TXL_QUOTE_LINES_B
10451   WHERE qte_id = p_quote_id
10452   AND qlt_code NOT IN ('AMCFIA','AMCTAX', 'AMYOUB', 'AMCSDD'); -- rmunjulu 3842101 Added security deposit
10453 
10454  l_quote_id            NUMBER;
10455  l_net_gain_loss       NUMBER;
10456  l_total_qte_amt       NUMBER;
10457  l_total_invest        NUMBER := 0;
10458  l_line_asset_invest   NUMBER := 0 ;
10459  l_return_status       VARCHAR2(1);
10460  l_unbilled_rent       NUMBER;
10461  l_residual_value      NUMBER;
10462  l_unearned_income     NUMBER;
10463 
10464 BEGIN
10465 
10466   IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
10467      FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
10468      LOOP
10469        -- Start : PRASJAIN : Bug 6472724
10470        -- IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'QUOTE_ID' THEN
10471        IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
10472        -- End : PRASJAIN : Bug 6472724
10473           l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
10474        END IF;
10475      END LOOP;
10476   END IF;
10477 
10478 /* rmunjulu 3842101 get net investment from quote
10479   -- get the line asset investment by calling the formula engine
10480   FOR l_line IN c_quote_asset_line(l_quote_id)
10481   LOOP
10482 
10483     l_unbilled_rent    := line_unbilled_rent(p_khr_id,l_line.kle_id);
10484     l_residual_value   := line_residual_value(p_khr_id,l_line.kle_id);
10485     l_unearned_income  := line_unearned_income(p_khr_id,l_line.kle_id);
10486 
10487     l_line_asset_invest := l_unbilled_rent + l_residual_value -l_unearned_income;
10488 
10489 	l_total_invest := l_total_invest + l_line_asset_invest;
10490 
10491   END LOOP;
10492 */
10493   --get the total quote amount excluding billed quote lines
10494   OPEN c_total_qt_amt(l_quote_id);
10495   FETCH c_total_qt_amt INTO l_total_qte_amt;
10496     IF c_total_qt_amt%NOTFOUND THEN
10497        OKC_API.set_message( p_app_name      => 'OKC',
10498                             p_msg_name      => G_INVALID_VALUE,
10499                             p_token1        => G_COL_NAME_TOKEN,
10500                             p_token1_value  => 'KLE_ID');
10501        l_total_qte_amt := 0;
10502     END IF;
10503   CLOSE c_total_qt_amt;
10504 
10505   -- rmunjulu 3842101 added this code to get net investment from quote
10506   OPEN c_quote_net_invst_csr(l_quote_id);
10507   FETCH c_quote_net_invst_csr INTO l_total_invest;
10508   CLOSE c_quote_net_invst_csr;
10509 
10510   -- Net Gain/Loss = Total Quote Amount - Net Investment for quoted assets
10511   -- rmunjulu 3842101 added nvls or else values are being set with null and does not get calculated
10512   l_net_gain_loss := NVL(l_total_qte_amt,0) - NVL(l_total_invest,0);
10513 
10514   RETURN l_net_gain_loss;
10515 EXCEPTION
10516     WHEN OTHERS THEN
10517    -- Close open cursors
10518 
10519    IF c_total_qt_amt%ISOPEN THEN
10520      CLOSE c_total_qt_amt;
10521    END IF;
10522 
10523   -- store SQL error message on message stack for caller
10524 
10525    Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
10526                        p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10527                        p_token1        => 'OKL_SQLCODE',
10528                        p_token1_value  => SQLCODE,
10529                        p_token2        => 'OKL_SQLERRM',
10530                        p_token2_value  => SQLERRM);
10531    RETURN NULL;
10532 END NET_GAIN_LOSS_QUOTE;
10533 
10534 
10535 --end rkuttiya
10536 
10537 ------------------------------------------------------------------------------
10538   -- Start of Comments
10539   -- Created By:    Manjit Dokal - 22-Oct-2003
10540   -- Function Name: contract_fee_amount
10541   -- Description:   Calculate Financed Fee during termination
10542   -- Dependencies:  OKL building blocks AMTX and AMUV,
10543   -- Parameters:    IN:  p_contract_id, p_contract_line_id (optional)
10544   --                     p_operand (required additional parameter)
10545   --                OUT: amount
10546   -- History       : 29-Aug-04 PAGARG Bug #3921591: Consider link fee assets
10547   --                 while calculating amount. Include link fee assets also
10548   --                 for both full and partial termination
10549   --                 p_contract_line_id is used to obtain asset id
10550   --               : rmunjulu EDAT Made changes so that only unbilled fees from
10551   --                 quote eff date onwards is calculated
10552   -- Version:       1.0
10553   -- End of Commnets
10554 ------------------------------------------------------------------------------
10555 FUNCTION contract_fee_amount (
10556 	p_contract_id		IN NUMBER,
10557 	p_contract_line_id	IN NUMBER)
10558 	RETURN NUMBER IS
10559 
10560 	CURSOR l_unbilled_fee_streams_csr (
10561 		cp_chr_id	NUMBER,
10562 		cp_fee_type	VARCHAR2,
10563 		cp_date DATE ) IS -- rmunjulu EDAT
10564 		SELECT	SUM(ste.amount)     amount
10565 	   	FROM	okl_streams			stm,
10566 			okl_strm_type_b			sty,
10567 			okc_k_lines_b			kle,
10568 			okc_statuses_b			kls,
10569 			okc_line_styles_b		lse,
10570             okl_strm_elements       ste,
10571             okl_k_lines             cle
10572 		WHERE	stm.khr_id			= cp_chr_id
10573 		AND	stm.active_yn			= 'Y'
10574 		AND	stm.say_code			= 'CURR'
10575         AND	ste.stm_id			    = stm.id
10576 		AND	sty.id			    	= stm.sty_id
10577 		AND	sty.billable_yn			= 'Y'
10578 		AND	kle.id			    	= stm.kle_id
10579 		AND	kls.code		    	= kle.sts_code
10580 		AND	kls.ste_code			= 'ACTIVE'
10581 		AND	lse.id			    	= kle.lse_id
10582         AND kle.id                  = cle.id
10583 		AND	lse.lty_code	        = 'FEE'
10584 		AND ste.date_billed         IS NULL -- rmunjulu EDAT
10585 		AND trunc(ste.stream_element_date) > trunc(cp_date) -- rmunjulu EDAT
10586         AND cle.fee_type            = cp_fee_type;
10587 
10588     --Bug #3921591: pagarg +++ Rollover +++++++ Start ++++++++++
10589     -- Following cursor finds the total payments with all the assets associated
10590     -- to the given fee type for the given contract. This cursor will be used in
10591     -- case of full termination along with the above cursor.
10592     CURSOR l_unbilled_feeassets_strms_csr(
10593 	        cp_chr_id   NUMBER,
10594 	        cp_fee_type VARCHAR2,
10595 		    cp_date DATE ) IS -- rmunjulu EDAT
10596         SELECT SUM(ste.amount)     amount
10597         FROM okl_streams         stm
10598             ,okl_strm_type_b    sty
10599             ,okc_k_lines_b      kle
10600             ,okc_statuses_b     kls
10601             ,okc_line_styles_b  lse
10602             ,okl_strm_elements  ste
10603             ,okl_k_lines        cle
10604             ,okc_k_lines_b      cles
10605         WHERE  stm.khr_id          = cp_chr_id
10606           AND  stm.active_yn       = 'Y'
10607           AND  stm.say_code        = 'CURR'
10608           AND  ste.stm_id          = stm.id
10609           AND  sty.id              = stm.sty_id
10610           AND  sty.billable_yn     = 'Y'
10611           AND  cles.id             = stm.kle_id
10612           AND  cles.cle_id         = kle.id
10613           AND  kls.code            = kle.sts_code
10614           AND  kls.ste_code        = 'ACTIVE'
10615           AND  lse.id              = cles.lse_id
10616           AND  kle.id              = cle.id
10617           AND  lse.lty_code        = 'LINK_FEE_ASSET'
10618    		  AND ste.date_billed         IS NULL -- rmunjulu EDAT
10619 		  AND trunc(ste.stream_element_date) > trunc(cp_date) -- rmunjulu EDAT
10620           AND  cle.fee_type        = cp_fee_type;
10621 
10622     -- Following cursor obtains the total payments of a given asset associated
10623     -- to the given fee of the given contract. This will used in case of partial
10624     -- termination when we are processing formula for each link fee asset.
10625     CURSOR l_unbilled_feeasset_strms_csr(
10626             cp_chr_id   NUMBER,
10627             cp_fee_type VARCHAR2,
10628             cp_asset_id   NUMBER,
10629 		    cp_date DATE ) IS -- rmunjulu EDAT
10630        SELECT SUM(ste.amount)     amount
10631        FROM   okl_streams         stm
10632              ,okl_strm_type_b    sty
10633              ,okc_k_lines_b      kle
10634              ,okc_statuses_b     kls
10635              ,okc_line_styles_b  lse
10636              ,okl_strm_elements  ste
10637              ,okl_k_lines        cle
10638              ,okc_k_lines_b      cles
10639              ,okc_k_items        cim
10640        WHERE  stm.khr_id          = cp_chr_id
10641          AND  stm.active_yn       = 'Y'
10642          AND  stm.say_code        = 'CURR'
10643          AND  ste.stm_id          = stm.id
10644          AND  sty.id              = stm.sty_id
10645          AND  sty.billable_yn     = 'Y'
10646          AND  cles.id             = stm.kle_id
10647          AND  lse.id              = cles.lse_id
10648          AND  lse.lty_code        = 'LINK_FEE_ASSET'
10649          AND  cles.cle_id         = kle.id
10650          AND  kls.code            = kle.sts_code
10651          AND  kls.ste_code        = 'ACTIVE'
10652          AND  kle.id              = cle.id
10653          AND  cle.fee_type        = cp_fee_type
10654          AND  cim.object1_id1     = cp_asset_id
10655 		 AND ste.date_billed         IS NULL -- rmunjulu EDAT
10656 		 AND trunc(ste.stream_element_date) > trunc(cp_date) -- rmunjulu EDAT
10657          AND  cim.cle_id          = cles.id;
10658     --Bug #3921591: pagarg +++ Rollover +++++++ End ++++++++++
10659         --mdokal assign fee type names to variables
10660         l_amafee          CONSTANT VARCHAR2(30)   := 'ABSORBED';
10661         l_amefee          CONSTANT VARCHAR2(30)   := 'EXPENSE';
10662         l_amffee          CONSTANT VARCHAR2(30)   := 'FINANCED';
10663         l_amgfee          CONSTANT VARCHAR2(30)   := 'GENERAL';
10664         l_amifee          CONSTANT VARCHAR2(30)   := 'INCOME';
10665         l_ammfee          CONSTANT VARCHAR2(30)   := 'MISCELLANEOUS';
10666         l_ampfee          CONSTANT VARCHAR2(30)   := 'PASSTHROUGH';
10667         l_amsfee          CONSTANT VARCHAR2(30)   := 'SECDEPOSIT';
10668         --Bug #3921591: pagarg +++ Rollover +++
10669         -- Constant for Rollover Fee
10670         l_amrfee          CONSTANT VARCHAR2(30)   := 'ROLLOVER';
10671 
10672         l_operand               VARCHAR2(30);
10673         l_fee_type              VARCHAR2(50);
10674         l_unbilled_fee_amount   NUMBER  := 0;
10675         --Bug #3921591: pagarg +++ Rollover +++
10676         -- Variable to store fee asset amount
10677         l_unbilled_fee_assets_amt  NUMBER  := 0;
10678 
10679         -- rmunjulu EDAT
10680         CURSOR get_quote_date_csr (p_quote_id IN NUMBER) IS
10681         SELECT trunc(qte.date_effective_from) date_effective_from
10682         FROM   okl_trx_quotes_b  qte
10683         WHERE  qte.id = p_quote_id;
10684 
10685         -- rmunjulu EDAT
10686         l_quote_id NUMBER;
10687         l_quote_date DATE;
10688         l_sysdate DATE;
10689 BEGIN
10690 
10691    --Validate additional parameters availability
10692     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
10693       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
10694 	  LOOP
10695         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'p_operand' THEN
10696           l_operand := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
10697         END IF;
10698 
10699         -- rmunjulu EDAT -- get quote id
10700         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_id' THEN
10701           l_quote_id := OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE;
10702         END IF;
10703       END LOOP;
10704 	ELSE
10705       Okl_Api.Set_Message(p_app_name     => G_APP_NAME,
10706                           p_msg_name     => 'OKL_AGN_FE_ADD_PARAMS');
10707       RAISE OKL_API.G_EXCEPTION_ERROR;
10708 	END IF;
10709 
10710     -- Determine the fee type passed
10711 
10712     IF l_operand = 'AMAFEE' THEN
10713         l_fee_type := l_amafee;
10714     ELSIF l_operand = 'AMEFEE' THEN
10715         l_fee_type := l_amefee;
10716     ELSIF l_operand = 'AMFFEE' THEN
10717         l_fee_type := l_amffee;
10718     ELSIF l_operand = 'AMGFEE' THEN
10719         l_fee_type := l_amgfee;
10720     ELSIF l_operand = 'AMIFEE' THEN
10721         l_fee_type := l_amifee;
10722     ELSIF l_operand = 'AMMFEE' THEN
10723         l_fee_type := l_ammfee;
10724     ELSIF l_operand = 'AMPFEE' THEN
10725         l_fee_type := l_ampfee;
10726     ELSIF l_operand = 'AMSFEE' THEN
10727         l_fee_type := l_amsfee;
10728     --Bug #3921591: pagarg +++ Rollover +++
10729     -- Set the fee type based on operand value for Rollover
10730     ELSIF l_operand = 'AMRFEE' THEN
10731         l_fee_type := l_amrfee;
10732     END IF;
10733 
10734 	-- rmunjulu EDAT
10735 	select sysdate into l_sysdate from dual;
10736 
10737 	-- rmunjulu EDAT
10738 	IF  l_quote_id IS NOT NULL
10739 	AND l_quote_id <> OKL_API.G_MISS_NUM THEN
10740 
10741 	   FOR get_quote_date_rec IN get_quote_date_csr (l_quote_id) LOOP
10742 	      l_quote_date := get_quote_date_rec.date_effective_from;
10743 	   END LOOP;
10744     END IF;
10745 
10746 	-- rmunjulu EDAT
10747     IF l_quote_date IS NULL
10748     OR l_quote_date = OKL_API.G_MISS_DATE THEN
10749        l_quote_date := l_sysdate;
10750     END IF;
10751 	-- ****************
10752 	-- Calculate result
10753 	-- ****************
10754 	OPEN	l_unbilled_fee_streams_csr (p_contract_id, l_fee_type, l_quote_date); -- rmunjulu EDAT
10755 	FETCH	l_unbilled_fee_streams_csr INTO l_unbilled_fee_amount;
10756 	CLOSE	l_unbilled_fee_streams_csr;
10757     --Bug #3921591: pagarg +++ Rollover +++++++ Start ++++++++++
10758     -- Find the sum of all the asset level streams for a given fee if asset id is null
10759     -- else if asset id is not null then sum all the asset level streams for that asset
10760     -- for the given fee.
10761     -- p_contract_line_id stores the asset id
10762     IF p_contract_line_id is NULL or p_contract_line_id = OKL_API.G_MISS_NUM THEN
10763        -- Find the total payments of all the assets associated to the given
10764        -- fee type of given contract.
10765        OPEN   l_unbilled_feeassets_strms_csr (p_contract_id, l_fee_type, l_quote_date); -- rmunjulu EDAT
10766        FETCH  l_unbilled_feeassets_strms_csr INTO l_unbilled_fee_assets_amt;
10767        CLOSE  l_unbilled_feeassets_strms_csr;
10768        l_unbilled_fee_amount := NVL(l_unbilled_fee_amount, 0) + NVL(l_unbilled_fee_assets_amt, 0);
10769     ELSIF p_contract_line_id is NOT NULL THEN
10770        -- Find the total payments of given asset associated to the given
10771        -- fee type of given contract.
10772        OPEN	  l_unbilled_feeasset_strms_csr (p_contract_id, l_fee_type, p_contract_line_id, l_quote_date); -- rmunjulu EDAT
10773        FETCH  l_unbilled_feeasset_strms_csr INTO l_unbilled_fee_assets_amt;
10774        CLOSE  l_unbilled_feeasset_strms_csr;
10775        l_unbilled_fee_amount := NVL(l_unbilled_fee_assets_amt, 0);
10776 
10777     END IF;
10778     --Bug #3921591: pagarg +++ Rollover +++++++ End ++++++++++
10779 
10780 	RETURN l_unbilled_fee_amount;
10781 
10782 EXCEPTION
10783 	WHEN OTHERS THEN
10784 		-- Close open cursors
10785 		IF l_unbilled_fee_streams_csr%ISOPEN THEN
10786 			CLOSE l_unbilled_fee_streams_csr;
10787 		END IF;
10788 		-- store SQL error message on message stack for caller
10789 		OKL_API.SET_MESSAGE (
10790 			p_app_name	=> OKL_API.G_APP_NAME,
10791 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
10792 			p_token1	=> 'SQLCODE',
10793 			p_token1_value	=> SQLCODE,
10794 			p_token2	=> 'SQLERRM',
10795 			p_token2_value	=> SQLERRM);
10796 		RETURN NULL;
10797 END contract_fee_amount;
10798 -----------------------------------------------------
10799 --End Bug# 3061765 mdokal : 11.5.10 AM Financed Fees
10800 -----------------------------------------------------
10801 
10802 -- Bug# 3316994 start : 12-Jan-2004 cklee
10803 ------------------------------------------------------------------------------
10804   -- Start of Comments
10805   -- Created By:    13-Jan-2004 cklee
10806   -- Function Name: subsidy_amount
10807   -- Description:   demo subsidy amount formula function
10808   -- Dependencies:
10809   -- Parameters:    IN:  p_contract_id, p_contract_line_id (FREE_FORM1)
10810   --                OUT: amount
10811   -- Version:       1.0
10812   -- End of Commnets
10813 ------------------------------------------------------------------------------
10814  FUNCTION SUBSIDY_AMOUNT(
10815  p_contract_id                   IN NUMBER
10816  ,p_contract_line_id             IN NUMBER
10817  ) RETURN NUMBER
10818 IS
10819 
10820   l_amount          NUMBER;
10821 
10822 /* case not available
10823 CURSOR c_subsidy_amount(p_cle_id okc_k_lines_b.id%TYPE) IS
10824 select (case
10825         when ROUND(MONTHS_BETWEEN(chr.end_date, cle.start_date)) <= 12 then NVL(kle.oec,0) * .2
10826         else NVL(kle.oec,0) * .1
10827         end) subsidy_amount
10828 from okc_k_lines_b     cle,
10829      okl_k_lines       kle,
10830      okc_k_headers_b   chr
10831 where chr.id         = cle.dnz_chr_id
10832 and   kle.id         = cle.id
10833 and   cle.id         = p_cle_id -- FREE_FORM1 (FIN)
10834 ;
10835 */
10836 CURSOR c_subsidy_amount(p_cle_id okc_k_lines_b.id%TYPE) IS
10837 SELECT ROUND(MONTHS_BETWEEN(CHR.end_date, cle.start_date)) months,
10838        NVL(kle.oec,0) oec
10839 FROM okc_k_lines_b     cle,
10840      okl_k_lines       kle,
10841      okc_k_headers_b   CHR
10842 WHERE CHR.id         = cle.dnz_chr_id
10843 AND   kle.id         = cle.id
10844 AND   cle.id         = p_cle_id -- FREE_FORM1 (FIN)
10845 ;
10846 
10847   r_subsidy_amount c_subsidy_amount%ROWTYPE;
10848 
10849 
10850 BEGIN
10851 
10852   OPEN c_subsidy_amount (p_contract_line_id);
10853   FETCH c_subsidy_amount INTO r_subsidy_amount;
10854   CLOSE c_subsidy_amount;
10855 
10856   -- Bug 3487167
10857   IF r_subsidy_amount.months <= 12 THEN
10858     l_amount := r_subsidy_amount.oec * .02;
10859   ELSE
10860     l_amount := r_subsidy_amount.oec * .01;
10861   END IF;
10862 
10863   RETURN l_amount;
10864 
10865   EXCEPTION
10866     WHEN OTHERS THEN
10867       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
10868       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10869                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
10870                           p_token1        => 'OKL_SQLCODE',
10871                           p_token1_value  => SQLCODE,
10872                           p_token2        => 'OKL_SQLERRM',
10873                           p_token2_value  => SQLERRM);
10874       RETURN NULL;
10875 
10876 END SUBSIDY_AMOUNT;
10877 
10878 ------------------------------------------------------------------------------
10879   -- Start of Comments
10880   -- Created By:    13-Jan-2004 cklee
10881   -- Function Name: refund_subsidy
10882   -- Description:   refund subsidy amount if asset terminated
10883   -- Dependencies:
10884   -- Parameters:    IN:  p_contract_id, p_contract_line_id (FREE_FORM1)
10885   --                OUT: amount
10886   -- Version:       1.0
10887   -- End of Commnets
10888 ------------------------------------------------------------------------------
10889  FUNCTION REFUND_SUBSIDY(
10890  p_contract_id                   IN NUMBER
10891  ,p_contract_line_id             IN NUMBER
10892  ) RETURN NUMBER
10893 IS
10894 
10895   l_amount          NUMBER := 0;
10896   l_tot_amount      NUMBER := 0;
10897   l_return_status   VARCHAR2(1);
10898 
10899 CURSOR c_subsidy_lines(p_cle_id okc_k_lines_b.id%TYPE) IS
10900   SELECT sub.accounting_method_code,
10901          top_cle.date_terminated,
10902          --TO_NUMBER(sgn.value) sty_id
10903          sub_kle.sty_id sty_id, /* Bug 6353756 */
10904          top_cle.dnz_chr_id chr_id
10905 FROM --okl_sgn_translations sgn,
10906      okl_subsidies_b      sub,
10907      okl_k_lines          sub_kle,
10908      okc_k_lines_b        sub_cle,
10909      okc_k_lines_b        top_cle
10910 WHERE --sgn.jtot_object1_code = 'OKL_STRMTYP'
10911 --AND sgn.object1_id1         = TO_CHAR(sub_kle.sty_id) AND
10912 sub.id                  = sub_kle.subsidy_id
10913 AND sub_cle.cle_id          = top_cle.id
10914 AND sub_kle.id              = sub_cle.id
10915 AND sub_cle.cle_id          = p_cle_id -- FREE_FORM1
10916 ;
10917 
10918 CURSOR c_refund_subsidy(p_cle_id okc_k_lines_b.id%TYPE,
10919                         p_date_terminated okc_k_lines_b.date_terminated%TYPE,
10920                         p_sty_id okl_strm_type_b.id%TYPE) IS
10921   SELECT NVL(SUM(selb.amount),0)
10922 FROM
10923   okl_streams       stmb,
10924   okl_strm_elements selb
10925 WHERE stmb.id          = selb.stm_id
10926 AND stmb.say_code      = 'CURR'
10927 AND stmb.active_yn     = 'Y'
10928 AND selb.date_billed IS NULL
10929 AND TRUNC(selb.stream_element_date) > TRUNC(p_date_terminated)
10930 AND stmb.kle_id        = p_cle_id -- FREE_FORM1
10931 AND stmb.sty_id        = p_sty_id
10932 ;
10933 
10934     r_subsidy_line c_subsidy_lines%ROWTYPE;
10935     l_dependent_sty_id OKL_STRM_TYPE_B.ID%TYPE; -- Bug 6353756
10936 
10937 BEGIN
10938 
10939   FOR r_subsidy_line IN c_subsidy_lines(p_contract_line_id) LOOP
10940 
10941 --    CASE r_subsidy_line.accounting_method_code
10942 
10943 --      WHEN 'NET' THEN
10944       IF r_subsidy_line.accounting_method_code = 'NET' THEN
10945 
10946         l_tot_amount := l_tot_amount + 0; -- through funding
10947 
10948 --      WHEN 'AMORTIZE' THEN
10949       ELSIF r_subsidy_line.accounting_method_code = 'AMORTIZE' THEN
10950 
10951         IF (r_subsidy_line.date_terminated IS NOT NULL) THEN
10952 
10953           /* Bug 6353756 Get dependent stream type from r_subsidy_line.sty_id */
10954           okl_streams_util.get_dependent_stream_type(
10955               p_khr_id                => r_subsidy_line.chr_id,
10956               p_primary_sty_id        => r_subsidy_line.sty_id,
10957               p_dependent_sty_purpose => 'SUBSIDY_INCOME',
10958               x_return_status         => l_return_status,
10959               x_dependent_sty_id      => l_dependent_sty_id);
10960           IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
10961             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10962           ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
10963             RAISE OKL_API.G_EXCEPTION_ERROR;
10964           END IF;
10965 
10966           OPEN c_refund_subsidy(p_contract_line_id,
10967                                 r_subsidy_line.date_terminated,
10968                                 --r_subsidy_line.sty_id);
10969                                 l_dependent_sty_id); -- Bug 6353756
10970           FETCH c_refund_subsidy INTO l_amount;
10971           CLOSE c_refund_subsidy;
10972           l_tot_amount := l_tot_amount + l_amount;
10973 
10974         ELSE
10975           l_tot_amount := NULL; -- error
10976           OKL_API.Set_Message(p_app_name     => OKL_API.G_APP_NAME,
10977                               p_msg_name     => 'OKL_DATE_TERMINATED_REQUIRED');
10978 
10979           RAISE OKC_API.G_EXCEPTION_ERROR;
10980         END IF;
10981 
10982       ELSE -- error
10983         l_tot_amount := NULL;
10984         OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
10985                             p_msg_name      => 'OKL_INVALID_ACCT_METHOD_CODE',
10986                             p_token2        => 'COL_NAME',
10987                             p_token2_value  => r_subsidy_line.accounting_method_code);
10988 
10989         RAISE OKC_API.G_EXCEPTION_ERROR;
10990 --    END CASE;
10991       END IF;
10992 
10993   END LOOP;
10994 
10995   RETURN l_tot_amount;
10996 
10997   EXCEPTION
10998     WHEN OTHERS THEN
10999       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
11000       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
11001                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
11002                           p_token1        => 'OKL_SQLCODE',
11003                           p_token1_value  => SQLCODE,
11004                           p_token2        => 'OKL_SQLERRM',
11005                           p_token2_value  => SQLERRM);
11006       RETURN NULL;
11007 
11008 END REFUND_SUBSIDY;
11009 
11010 -- Bug# 3316994 end: 12-Jan-2004 cklee
11011 
11012 -- Fix Bug 3417313, dedey 01/29/2004
11013 ----------------------------------------------------------------------------------------------------
11014 
11015     -- Start of Comments
11016     -- Created By:    dedey
11017     -- Function Name: contract_pretaxinc_book
11018     -- Description:   Returns sum of all incomes of financial asset lines of a contract
11019     -- Dependencies:
11020     -- Parameters: contract id, line id
11021     -- Version: 1.0
11022     -- End of Commnets
11023 
11024 ----------------------------------------------------------------------------------------------------
11025   FUNCTION contract_pretaxinc_book(
11026                                    p_chr_id  IN  NUMBER
11027                                   ,p_kle_id  IN NUMBER
11028                                   )
11029   RETURN NUMBER  IS
11030 
11031     l_api_name		CONSTANT VARCHAR2(30) := 'CONTRACT_PRETAXINC_BOOK';
11032     l_api_version	CONSTANT NUMBER	      := 1;
11033     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11034     x_msg_count         NUMBER;
11035     x_msg_data          VARCHAR2(256);
11036 
11037     l_income NUMBER := 0;
11038 
11039     CURSOR l_line_income_csr (p_chr_id NUMBER) IS
11040       SELECT NVL(str.link_hist_stream_id,-1) link_hist_stream_id,
11041              NVL(SUM(sele.amount),0) amount
11042       FROM okl_strm_elements sele,
11043            --okl_streams str, MGAAP 7263041
11044            okl_streams_rep_v str,
11045            okl_strm_type_v sty,
11046            okc_k_headers_b CHR,
11047            okc_statuses_b sts
11048       WHERE sele.stm_id      = str.id
11049       AND   str.sty_id       = sty.id
11050       --AND   UPPER(sty.name)  = 'PRE-TAX INCOME'
11051       AND   sty.stream_type_purpose  = 'LEASE_INCOME'
11052       AND   (NVL(str.purpose_code,'XXXX') = 'XXXX' OR
11053              NVL(str.purpose_code,'XXXX') = 'REPORT')
11054       AND   str.say_code     = 'CURR'
11055       AND   str.active_yn    = 'Y'
11056       AND   CHR.id           = p_chr_id
11057       AND   CHR.sts_code     = sts.code
11058       AND   CHR.id           = str.khr_id
11059       AND   sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
11060       GROUP BY str.link_hist_stream_id;
11061 
11062     CURSOR l_line_income_adj_csr (p_stm_id NUMBER) IS
11063     SELECT NVL(SUM(sele.amount),0) amount
11064     FROM   okl_strm_elements sele
11065     WHERE  stm_id = p_stm_id
11066     AND    NVL(accrued_yn,'N') = 'Y';
11067 
11068     --Bug# 15992711 , Start
11069     -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
11070     CURSOR l_line_income_nr_csr (p_chr_id NUMBER, p_line_type VARCHAR2) IS
11071       SELECT NVL(str.link_hist_stream_id,-1) link_hist_stream_id,
11072              NVL(SUM(sele.amount),0) amount
11073       FROM okl_strm_elements sele,
11074            --okl_streams str, MGAAP 7263041
11075            okl_streams_rep_v str,
11076            okl_strm_type_v sty,
11077            okc_k_headers_b CHR,
11078            okc_statuses_b sts,
11079            okc_k_lines_b   cle,
11080            okl_k_lines     kle
11081       WHERE sele.stm_id      = str.id
11082       AND   str.sty_id       = sty.id
11083       --AND   UPPER(sty.name)  = 'PRE-TAX INCOME'
11084       AND   sty.stream_type_purpose  = 'LEASE_INCOME'
11085       AND   (NVL(str.purpose_code,'XXXX') = 'XXXX' OR
11086              NVL(str.purpose_code,'XXXX') = 'REPORT')
11087       AND   str.say_code     = 'CURR'
11088       AND   str.active_yn    = 'Y'
11089       AND   CHR.id           = p_chr_id
11090       AND   CHR.sts_code     = sts.code
11091       AND   CHR.id           = str.khr_id
11092       AND   sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD')
11093       AND   cle.chr_id = chr.id
11094       AND   cle.dnz_chr_id = chr.id
11095       AND   cle.id = kle.id
11096       AND   NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y')
11097       AND   str.kle_id = kle.id
11098       GROUP BY str.link_hist_stream_id;
11099 
11100     l_line_type VARCHAR2(30) := 'X';
11101     --Bug# 15992711 , End
11102 
11103 
11104     l_line_income_amount NUMBER;
11105     l_income_adj_amount  NUMBER;
11106 
11107   BEGIN
11108 
11109       IF ( p_chr_id IS NULL ) THEN
11110           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11111       END IF;
11112 
11113       --Bug# 15992711 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
11114       --                If set then based on its value set l_line_type
11115 
11116       IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
11117          FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
11118          LOOP
11119             IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
11120                IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
11121                   l_line_type := 'NEW'; --New
11122                ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
11123                   l_line_type := 'RELEASE'; --Release
11124                END IF;
11125             END IF;
11126 
11127          END LOOP;
11128       END IF;
11129 
11130        -- If l_line_type is set as either 'NEW' or 'RELEASE' call
11131        -- l_line_income_nr_csr cursor in order to consider either only new
11132        -- assets or only re-leased assets, else no change in the standard behavior
11133 
11134        IF l_line_type IN ('NEW','RELEASE') THEN
11135 
11136          l_line_income_amount := 0;
11137          FOR l_line_income_nr_rec IN l_line_income_nr_csr (p_chr_id, l_line_type)
11138          LOOP
11139             l_line_income_amount := NVL(l_line_income_amount,0) + l_line_income_nr_rec.amount;
11140 
11141             IF (l_line_income_nr_rec.link_hist_stream_id <> -1) THEN
11142                l_income_adj_amount := 0;
11143                OPEN l_line_income_adj_csr (l_line_income_nr_rec.link_hist_stream_id);
11144                FETCH l_line_income_adj_csr INTO l_income_adj_amount;
11145                CLOSE l_line_income_adj_csr;
11146 
11147                l_line_income_amount := l_line_income_amount - NVL(l_income_adj_amount,0);
11148             END IF;
11149          END LOOP;
11150       ELSE
11151       --Bug# 15992711 , End
11152 
11153          l_line_income_amount := 0;
11154          FOR l_line_income_rec IN l_line_income_csr (p_chr_id)
11155          LOOP
11156             l_line_income_amount := NVL(l_line_income_amount,0) + l_line_income_rec.amount;
11157 
11158             IF (l_line_income_rec.link_hist_stream_id <> -1) THEN
11159                l_income_adj_amount := 0;
11160                OPEN l_line_income_adj_csr (l_line_income_rec.link_hist_stream_id);
11161                FETCH l_line_income_adj_csr INTO l_income_adj_amount;
11162                CLOSE l_line_income_adj_csr;
11163 
11164                l_line_income_amount := l_line_income_amount - NVL(l_income_adj_amount,0);
11165             END IF;
11166          END LOOP;
11167 
11168       --Bug# 15992711 , Start
11169       END IF;
11170       --Bug# 15992711 , End
11171 
11172        l_income := l_line_income_amount;
11173 
11174       RETURN l_income;
11175 
11176 
11177     EXCEPTION
11178 
11179 	WHEN OTHERS THEN
11180                Okl_Api.SET_MESSAGE(
11181                         p_app_name     => G_APP_NAME,
11182                         p_msg_name     => G_UNEXPECTED_ERROR,
11183                         p_token1       => G_SQLCODE_TOKEN,
11184                         p_token1_value => SQLCODE,
11185                         p_token2       => G_SQLERRM_TOKEN,
11186                         p_token2_value => SQLERRM);
11187                 RETURN NULL;
11188 
11189 
11190   END contract_pretaxinc_book;
11191 
11192 ----------------------------------------------------------------------------------------------------
11193 
11194     -- Start of Comments
11195     -- Created By:    arun.jain
11196     -- Function Name: CONTRACT_FINANCED_FEE
11197     -- Description:   Returns the sum of Financed fee lines amount of a contract
11198     -- Dependencies:
11199     -- Parameters: contract id, line id
11200     -- Version: 1.0
11201     -- End of Commnets
11202 
11203 ----------------------------------------------------------------------------------------------------
11204   FUNCTION CONTRACT_FINANCED_FEE(
11205   p_dnz_chr_id         IN NUMBER
11206  ,p_kle_id             IN NUMBER
11207  ) RETURN NUMBER
11208 IS
11209 
11210 l_sum_financed_fee_amt  NUMBER;
11211 
11212 CURSOR sum_fin_fee_csr(l_dnz_chr_id okc_k_headers_b.id%TYPE) IS
11213 SELECT
11214   NVL(SUM(NVL(KLEB.amount,0)),0)
11215 FROM
11216   OKL_K_LINES KLEB,
11217   OKC_K_LINES_B CLEB,
11218   OKC_LINE_STYLES_B LSEB,
11219   okc_statuses_b sts
11220 WHERE
11221   KLEB.ID = CLEB.ID AND
11222   CLEB.LSE_ID = LSEB.ID AND
11223   LSEB.LTY_CODE = 'FEE' AND
11224   KLEB.FEE_TYPE IN ('FINANCED') AND
11225   CLEB.DNZ_CHR_ID = l_dnz_chr_id AND
11226   CLEB.sts_code = sts.code AND
11227   sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
11228 
11229 BEGIN
11230 
11231   OPEN sum_fin_fee_csr (p_dnz_chr_id);
11232   FETCH sum_fin_fee_csr INTO l_sum_financed_fee_amt;
11233   CLOSE sum_fin_fee_csr;
11234 
11235   RETURN l_sum_financed_fee_amt;
11236 
11237   EXCEPTION
11238     WHEN OTHERS THEN
11239       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
11240       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
11241                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
11242                           p_token1        => 'OKL_SQLCODE',
11243                           p_token1_value  => SQLCODE,
11244                           p_token2        => 'OKL_SQLERRM',
11245                           p_token2_value  => SQLERRM);
11246       RETURN NULL;
11247 
11248 END CONTRACT_FINANCED_FEE;
11249 
11250 
11251 ----------------------------------------------------------------------------------------------------
11252 
11253     -- Start of Comments
11254     -- Created By:    arun.jain
11255     -- Function Name: CONTRACT_ABSORBED_FEE
11256     -- Description:   Returns the sum of Absorbed fee lines amount of a contract
11257     -- Dependencies:
11258     -- Parameters: contract id, line id
11259     -- Version: 1.0
11260     -- End of Commnets
11261 
11262 ----------------------------------------------------------------------------------------------------
11263   FUNCTION CONTRACT_ABSORBED_FEE(
11264   p_dnz_chr_id         IN NUMBER
11265  ,p_kle_id             IN NUMBER
11266  ) RETURN NUMBER
11267 IS
11268 
11269 l_sum_absorbed_fee_amt  NUMBER;
11270 
11271 CURSOR sum_abs_fee_csr(l_dnz_chr_id okc_k_headers_b.id%TYPE) IS
11272 SELECT
11273   NVL(SUM(NVL(KLEB.amount,0)),0)
11274 FROM
11275   OKL_K_LINES KLEB,
11276   OKC_K_LINES_B CLEB,
11277   OKC_LINE_STYLES_B LSEB,
11278   okc_statuses_b sts
11279 WHERE
11280   KLEB.ID = CLEB.ID AND
11281   CLEB.LSE_ID = LSEB.ID AND
11282   LSEB.LTY_CODE = 'FEE' AND
11283   KLEB.FEE_TYPE IN ('ABSORBED') AND
11284   CLEB.DNZ_CHR_ID = l_dnz_chr_id AND
11285   CLEB.sts_code = sts.code AND
11286   sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
11287 
11288 BEGIN
11289 
11290   OPEN sum_abs_fee_csr (p_dnz_chr_id);
11291   FETCH sum_abs_fee_csr INTO l_sum_absorbed_fee_amt;
11292   CLOSE sum_abs_fee_csr;
11293 
11294   RETURN l_sum_absorbed_fee_amt;
11295 
11296   EXCEPTION
11297     WHEN OTHERS THEN
11298       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
11299       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
11300                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
11301                           p_token1        => 'OKL_SQLCODE',
11302                           p_token1_value  => SQLCODE,
11303                           p_token2        => 'OKL_SQLERRM',
11304                           p_token2_value  => SQLERRM);
11305       RETURN NULL;
11306 
11307 END CONTRACT_ABSORBED_FEE;
11308 
11309 ------------------------------------------------------------------------------
11310 -- Start of comments
11311 --
11312 -- Procedure Name  : credit_check
11313 -- Description     : Caculate total credit remaining
11314 --
11315 -- Business Rules  :
11316 -- Parameters      :IN: p_contract_id, OUT: amount
11317 -- Version         : 1.0
11318 -- History         :27-Aug-04 [email protected] -- Created
11319 --
11320 -- End of comments
11321 ------------------------------------------------------------------------------
11322 --START:           14-Feb-06 cklee    Fixed bug#5017158                             |
11323 /*|           14-Feb-06 cklee    Fixed bug#5017158                             |
11324  FUNCTION credit_check(
11325  p_contract_id                   IN NUMBER -- credit line contract id
11326  ,p_contract_line_id             IN NUMBER
11327  ) RETURN NUMBER
11328 IS
11329 
11330 CURSOR c_disb_tot IS
11331   SELECT TAP.AMOUNT,
11332          TAP.KHR_ID
11333 FROM   OKL_TRX_AP_INVOICES_B TAP
11334 WHERE  TAP.TRX_STATUS_CODE IN ('APPROVED','PROCESSED') -- push to AP
11335 AND    TAP.FUNDING_TYPE_CODE IS NOT NULL
11336 -- start: cklee - okl.h ER 05/25/2005
11337 AND    NOT EXISTS (SELECT 1
11338                    FROM   OKC_K_HEADERS_B KHR
11339                    WHERE  KHR.ID = TAP.KHR_ID
11340                    AND    ORIG_SYSTEM_SOURCE_CODE = 'OKL_LEASE_APP')
11341 -- end: cklee - okl.h ER 05/25/2005
11342 ;
11343 
11344 -- STRAT: cklee - bug#4655437 10/06/2005
11345 CURSOR c_principal_payments_tot IS
11346   SELECT TAR.AMOUNT,
11347          TAR.KHR_ID
11348 FROM   okl_cnsld_ar_strms_b TAR
11349 WHERE  TAR.receivables_invoice_id <> -99999
11350 AND    exists (SELECT STY.ID
11351                FROM   okl_strm_type_b STY
11352                WHERE  STY.STREAM_TYPE_PURPOSE = 'UNSCHEDULED_PRINCIPAL_PAYMENT'
11353                AND    STY.ID = TAR.STY_ID);
11354 
11355   l_payment_tot    NUMBER := 0;
11356 -- END: cklee - bug#4655437 10/06/2005
11357 
11358 
11359   l_amount_limit        NUMBER := 0;
11360   l_credit_remain       NUMBER := 0;
11361   l_disbursement_tot    NUMBER := 0;
11362 
11363   l_amount NUMBER := 0;
11364   x_return_status	     VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
11365   l_api_version       NUMBER	:= 1.0;
11366   x_msg_count		NUMBER;
11367   x_msg_data	     VARCHAR2(4000);
11368   l_init_msg_list     VARCHAR2(10) := OKL_API.G_FALSE;
11369 
11370 BEGIN
11371 
11372    FOR r_ast IN c_disb_tot LOOP
11373 
11374      IF (OKL_CREDIT_PUB.get_creditline_by_chrid(r_ast.KHR_ID) = p_contract_id) THEN
11375        l_disbursement_tot := l_disbursement_tot + NVL(r_ast.AMOUNT,0);
11376      END IF;
11377 
11378    END LOOP;
11379 
11380 -- START: cklee - bug#4655437 10/06/2005
11381    FOR r_pst IN c_principal_payments_tot LOOP
11382 
11383      IF (OKL_CREDIT_PUB.get_creditline_by_chrid(r_pst.KHR_ID) = p_contract_id) THEN
11384        l_payment_tot := l_payment_tot + NVL(r_pst.AMOUNT,0);
11385      END IF;
11386 
11387    END LOOP;
11388 -- END: cklee - bug#4655437 10/06/2005
11389 
11390    l_credit_remain := NVL(creditline_total_limit(p_contract_id),0) - l_disbursement_tot
11391 -- START: cklee - bug#4655437 10/06/2005
11392     + l_payment_tot;
11393 -- END: cklee - bug#4655437 10/06/2005
11394 
11395   RETURN l_credit_remain;
11396 
11397   EXCEPTION
11398     WHEN OTHERS THEN
11399       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
11400       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
11401                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
11402                           p_token1        => 'OKL_SQLCODE',
11403                           p_token1_value  => SQLCODE,
11404                           p_token2        => 'OKL_SQLERRM',
11405                           p_token2_value  => SQLERRM);
11406       RETURN NULL;
11407 
11408 END;
11409 */
11410  FUNCTION credit_check(
11411  p_contract_id                   IN NUMBER -- credit line contract id
11412  ,p_contract_line_id             IN NUMBER
11413  ) RETURN NUMBER
11414 IS
11415 
11416 -- sjalasut, modified the cursor to have khr_id referred from okl_txl_ap_inv_lns_all_b
11417 -- changes made as part of OKLR12B disbursements project.
11418 -- cklee : 09/21/2007 restored the khr_id back to okl_trx_ap_invs_all_b
11419 -- reason: 1. line.khr_id will be always = header.khr_id
11420 --         2. the modified code will multiply the header amount if mutliple lines found
11421 
11422 CURSOR c_disb_tot(p_credit_id number) IS
11423   SELECT NVL(SUM(TAP.AMOUNT),0)
11424 FROM   OKL_TRX_AP_INVOICES_B TAP,
11425 --       okl_txl_ap_inv_lns_all_b tpl,
11426        (
11427   select gov.dnz_chr_id chr_id,
11428          crd.ID credit_id
11429   from   OKC_K_HEADERS_B crd,
11430          okc_Governances gov
11431   where  crd.id = gov.chr_id_referred
11432   and    crd.sts_code = 'ACTIVE'
11433   and    crd.scs_code = 'CREDITLINE_CONTRACT'
11434 union
11435   select mla_g.dnz_chr_id chr_id,
11436          crd.ID credit_id
11437   from   OKC_K_HEADERS_B crd,
11438          okc_Governances gov,
11439          OKC_K_HEADERS_B mla,
11440          okc_Governances mla_g
11441   where  crd.id         = gov.chr_id_referred
11442   and    crd.sts_code   = 'ACTIVE'
11443   and    crd.scs_code   = 'CREDITLINE_CONTRACT'
11444   and    gov.dnz_chr_id = mla.id
11445   and    mla.id         = mla_g.chr_id_referred
11446   and    mla.scs_code   = 'MASTER_LEASE'
11447        ) ccg
11448 --WHERE  TAP.id = TPL.tap_id
11449    where ccg.chr_id       = Tap.KHR_ID
11450 AND    ccg.credit_id    = p_credit_id
11451 AND    TAP.TRX_STATUS_CODE IN ('APPROVED','PROCESSED') -- push to AP
11452 AND    TAP.FUNDING_TYPE_CODE IS NOT NULL
11453 --Bug# 10056660
11454 AND   TAP.FUNDING_TYPE_CODE NOT IN ('SUPPLIER_RETENTION','MANUAL_DISB')
11455 AND    NOT EXISTS (SELECT 1
11456                    FROM   OKC_K_HEADERS_B KHR
11457                    WHERE  KHR.ID = tap.KHR_ID
11458                    AND    ORIG_SYSTEM_SOURCE_CODE = 'OKL_LEASE_APP')
11459 ;
11460 
11461 /* ankushar, modified the cursor to replace reference to okl_cnsld_ar_strms_b
11462    OKL R12B billing changes
11463 */
11464 CURSOR c_principal_payments_tot(p_credit_id number) IS
11465   SELECT NVL(SUM(ARL.AMOUNT),0)
11466   FROM  okl_bpd_ar_inv_lines_v ARL,
11467        (
11468   select gov.dnz_chr_id chr_id,
11469          crd.ID credit_id
11470   from   OKC_K_HEADERS_B crd,
11471          okc_Governances gov
11472   where  crd.id = gov.chr_id_referred
11473   and    crd.sts_code = 'ACTIVE'
11474   and    crd.scs_code = 'CREDITLINE_CONTRACT'
11475 union
11476   select mla_g.dnz_chr_id chr_id,
11477          crd.ID credit_id
11478   from   OKC_K_HEADERS_B crd,
11479          okc_Governances gov,
11480          OKC_K_HEADERS_B mla,
11481          okc_Governances mla_g
11482   where  crd.id         = gov.chr_id_referred
11483   and    crd.sts_code   = 'ACTIVE'
11484   and    crd.scs_code   = 'CREDITLINE_CONTRACT'
11485   and    gov.dnz_chr_id = mla.id
11486   and    mla.id         = mla_g.chr_id_referred
11487   and    mla.scs_code   = 'MASTER_LEASE'
11488        ) ccg
11489 WHERE  ccg.chr_id = ARL.CONTRACT_ID
11490 AND    ccg.credit_id    = p_credit_id
11491 AND    ARL.receivables_invoice_id <> -99999
11492 AND    ARL.interface_line_context = 'OKL_CONTRACTS'
11493 AND    exists (SELECT STY.ID
11494                FROM   okl_strm_type_b STY
11495                WHERE  STY.STREAM_TYPE_PURPOSE = 'UNSCHEDULED_PRINCIPAL_PAYMENT'
11496                AND    STY.ID = ARL.STY_ID);
11497 
11498   l_payment_tot         NUMBER := 0;
11499   l_credit_remain       NUMBER := 0;
11500   l_disbursement_tot    NUMBER := 0;
11501 
11502 BEGIN
11503 
11504    open c_disb_tot(p_contract_id);
11505    fetch c_disb_tot into l_disbursement_tot;
11506    close c_disb_tot;
11507 
11508    open c_principal_payments_tot(p_contract_id);
11509    fetch c_principal_payments_tot into l_payment_tot;
11510    close c_principal_payments_tot;
11511 
11512    l_credit_remain := NVL(creditline_total_limit(p_contract_id),0) - l_disbursement_tot + l_payment_tot;
11513 
11514   RETURN l_credit_remain;
11515 
11516   EXCEPTION
11517     WHEN OTHERS THEN
11518       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
11519       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
11520                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
11521                           p_token1        => 'OKL_SQLCODE',
11522                           p_token1_value  => SQLCODE,
11523                           p_token2        => 'OKL_SQLERRM',
11524                           p_token2_value  => SQLERRM);
11525       RETURN NULL;
11526 
11527 END;
11528 --END:|           14-Feb-06 cklee    Fixed bug#5017158                             |
11529 
11530 --------------------------------------------------------------------------------
11531 
11532 -- STRAT: cklee - bug#4655437 10/06/2005
11533 ------------------------------------------------------------------------------
11534 -- Start of comments
11535 --
11536 -- Procedure Name  : tot_credit_funding_pmt
11537 -- Description     : Caculate total credit funding payments
11538 --
11539 -- Business Rules  :
11540 -- Parameters      :IN: p_contract_id, OUT: amount
11541 -- Version         : 1.0
11542 -- History         :07-Oct-05 [email protected] -- Created
11543 --
11544 -- End of comments
11545 ------------------------------------------------------------------------------
11546  FUNCTION tot_credit_funding_pmt(
11547  p_contract_id                   IN NUMBER -- credit line contract id
11548  ,p_contract_line_id             IN NUMBER
11549  ) RETURN NUMBER
11550 IS
11551 -- sjalasut, modified the cursor to include khr_id from the okl_Txl_ap_inv_lns_all_b
11552 -- changes made as part of OKLR12B disbursements project
11553 /*
11554 CURSOR c_disb_tot IS
11555 SELECT TAP.AMOUNT,
11556        TPL.KHR_ID
11557 FROM   OKL_TRX_AP_INVOICES_B TAP
11558       ,OKL_TXL_AP_INV_LNS_ALL_B TPL
11559 WHERE TAP.ID = TPL.TAP_ID
11560   AND TAP.TRX_STATUS_CODE IN ('APPROVED','PROCESSED') -- push to AP
11561   AND TAP.FUNDING_TYPE_CODE IS NOT NULL
11562 -- start: cklee - okl.h ER 05/25/2005
11563 AND    NOT EXISTS (SELECT 1
11564                    FROM   OKC_K_HEADERS_B KHR
11565                    WHERE  KHR.ID = TPL.KHR_ID
11566                    AND    ORIG_SYSTEM_SOURCE_CODE = 'OKL_LEASE_APP')
11567 -- end: cklee - okl.h ER 05/25/2005
11568 ;
11569 */
11570 -- cklee : 09/20/2007 change khr_id refer back to okl_trx_ap_invs_all_b instead
11571 -- reason: 1. The modified code will return duplicated header amount
11572 --         2. line.khr_id will be always = header.khr_id
11573 
11574 CURSOR c_disb_tot IS
11575 SELECT TAP.AMOUNT,
11576        TAP.KHR_ID
11577 FROM   OKL_TRX_AP_INVOICES_B TAP
11578   where TAP.TRX_STATUS_CODE IN ('APPROVED','PROCESSED') -- push to AP
11579   AND TAP.FUNDING_TYPE_CODE IS NOT NULL
11580 -- start: cklee - okl.h ER 05/25/2005
11581 AND    NOT EXISTS (SELECT 1
11582                    FROM   OKC_K_HEADERS_B KHR
11583                    WHERE  KHR.ID = tap.KHR_ID
11584                    AND    ORIG_SYSTEM_SOURCE_CODE = 'OKL_LEASE_APP')
11585 ;
11586 -- end: cklee - okl.h ER 05/25/2005
11587 
11588   l_amount_limit        NUMBER := 0;
11589   l_credit_remain       NUMBER := 0;
11590   l_disbursement_tot    NUMBER := 0;
11591 
11592   l_amount NUMBER := 0;
11593   x_return_status	     VARCHAR2(3) := OKL_API.G_RET_STS_SUCCESS;
11594   l_api_version       NUMBER	:= 1.0;
11595   x_msg_count		NUMBER;
11596   x_msg_data	     VARCHAR2(4000);
11597   l_init_msg_list     VARCHAR2(10) := OKL_API.G_FALSE;
11598 
11599 BEGIN
11600 
11601    FOR r_ast IN c_disb_tot LOOP
11602 
11603      IF (OKL_CREDIT_PUB.get_creditline_by_chrid(r_ast.KHR_ID) = p_contract_id) THEN
11604        l_disbursement_tot := l_disbursement_tot + NVL(r_ast.AMOUNT,0);
11605      END IF;
11606 
11607    END LOOP;
11608 
11609   RETURN l_disbursement_tot;
11610 
11611   EXCEPTION
11612     WHEN OTHERS THEN
11613       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
11614       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
11615                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
11616                           p_token1        => 'OKL_SQLCODE',
11617                           p_token1_value  => SQLCODE,
11618                           p_token2        => 'OKL_SQLERRM',
11619                           p_token2_value  => SQLERRM);
11620       RETURN NULL;
11621 
11622 END;
11623 
11624 ------------------------------------------------------------------------------
11625 -- Start of comments
11626 --
11627 -- Procedure Name  : tot_credit_principal_pmt
11628 -- Description     : Caculate total credit principal payments
11629 --
11630 -- Business Rules  :
11631 -- Parameters      :IN: p_contract_id, OUT: amount
11632 -- Version         : 1.0
11633 -- History         :07-Oct-05 [email protected] -- Created
11634 --
11635 -- End of comments
11636 ------------------------------------------------------------------------------
11637  FUNCTION tot_credit_principal_pmt(
11638  p_contract_id                   IN NUMBER -- credit line contract id
11639  ,p_contract_line_id             IN NUMBER
11640  ) RETURN NUMBER
11641 IS
11642 
11643  /* ankushar 09-Feb-2007 OKL R12B Billing enhancement
11644     Replaced reference of okl_cnsld_ar_strms_b with Billing Util API call
11645     start changes
11646  */
11647     --Initialize standard API parameters
11648     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11649     x_msg_count         NUMBER;
11650     x_msg_data          VARCHAR2(256);
11651 
11652     -- Intialize contract_invoice_tbl variable
11653     x_contract_invoice_tbl OKL_BILLING_UTIL_PVT.contract_invoice_tbl;
11654  /* ankushar end changes */
11655 
11656   l_payment_tot    NUMBER := 0;
11657   i                NUMBER;
11658 
11659 
11660 BEGIN
11661 
11662    /* Commented by bkatraga for bug 12378106
11663    -- Call to the Billing Util API replacing reference to okl_cnsld_ar_strms_b
11664    OKL_BILLING_UTIL_PVT.INVOICE_AMOUNT_FOR_STREAM(
11665                         p_api_version              =>  1.0
11666                        ,p_init_msg_list            =>  OKL_API.G_FALSE
11667                        ,x_return_status            =>  x_return_status
11668                        ,x_msg_count                =>  x_msg_count
11669                        ,x_msg_data                 =>  x_msg_data
11670                        ,p_stream_purpose           =>  'UNSCHEDULED_PRINCIPAL_PAYMENT'
11671                        ,x_contract_invoice_tbl     =>  x_contract_invoice_tbl);
11672 
11673    --rkuttiya added for bug 6313562
11674    IF x_contract_invoice_tbl.count > 0 THEN
11675      i := x_contract_invoice_tbl.FIRST;
11676      LOOP
11677         IF (OKL_CREDIT_PUB.get_creditline_by_chrid(x_contract_invoice_tbl(i).KHR_ID) = p_contract_id) THEN
11678            l_payment_tot := l_payment_tot + NVL(x_contract_invoice_tbl(i).AMOUNT, 0);
11679         END IF;
11680         EXIT WHEN i = x_contract_invoice_tbl.LAST;
11681         i := x_contract_invoice_tbl.NEXT(i);
11682      END LOOP;
11683    END IF;*/
11684 
11685    --Added by bkatraga for bug 12378106
11686    OKL_BILLING_UTIL_PVT.CR_INVOICE_AMOUNT_FOR_STREAM(
11687                         p_api_version              =>  1.0
11688                        ,p_init_msg_list            =>  OKL_API.G_FALSE
11689                        ,x_return_status            =>  x_return_status
11690                        ,x_msg_count                =>  x_msg_count
11691                        ,x_msg_data                 =>  x_msg_data
11692                        ,p_stream_purpose           =>  'UNSCHEDULED_PRINCIPAL_PAYMENT'
11693                        ,p_cr_contract_id           =>  p_contract_id
11694 		       ,x_tot_inv_line_amount      =>  l_payment_tot);
11695 
11696  /* ankushar end changes */
11697   RETURN l_payment_tot;
11698 
11699   EXCEPTION
11700     WHEN OTHERS THEN
11701       --l_return_status := OKL_API.G_RET_STS_UNEXP_ERROR ;
11702       OKL_API.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
11703                           p_msg_name      => 'OKL_UNEXPECTED_ERROR',
11704                           p_token1        => 'OKL_SQLCODE',
11705                           p_token1_value  => SQLCODE,
11706                           p_token2        => 'OKL_SQLERRM',
11707                           p_token2_value  => SQLERRM);
11708       RETURN NULL;
11709 
11710 END;
11711 --------------------------------------------------------------------------------
11712 -- END: cklee - bug#4655437 10/06/2005
11713 
11714 
11715 --Bug# 3872534: start
11716 --------------------------------------------------------------------------------
11717 
11718     -- Start of Comments
11719     -- Created By:    Rekha Pillay (rpillay)
11720     -- Function Name: line_asset_cost
11721     -- Description:   Returns the current cost of an asset in its Corporate Book
11722     --                from Oracle Assets
11723     -- Dependencies:
11724     -- Parameters: contract id, line id
11725     -- Version: 1.0
11726     -- End of Comments
11727 
11728 --------------------------------------------------------------------------------
11729   FUNCTION line_asset_cost(
11730                             p_contract_id       IN NUMBER
11731                            ,p_contract_line_id  IN NUMBER
11732                           )
11733   RETURN NUMBER  IS
11734 
11735     l_api_name          CONSTANT VARCHAR2(30) := 'LINE_ASSET_COST';
11736     l_api_version       CONSTANT NUMBER	      := 1;
11737     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
11738     x_msg_count         NUMBER;
11739     x_msg_data          VARCHAR2(256);
11740 
11741     l_asset_hdr_rec            FA_API_TYPES.asset_hdr_rec_type;
11742     l_asset_fin_rec            FA_API_TYPES.asset_fin_rec_type;
11743 
11744     l_converted_amount         NUMBER;
11745     l_contract_start_date      DATE;
11746     l_contract_currency        OKL_K_HEADERS_FULL_V.currency_code%TYPE;
11747     l_currency_conversion_type OKL_K_HEADERS_FULL_V.currency_conversion_type%TYPE;
11748     l_currency_conversion_rate OKL_K_HEADERS_FULL_V.currency_conversion_rate%TYPE;
11749     l_currency_conversion_date OKL_K_HEADERS_FULL_V.currency_conversion_date%TYPE;
11750 
11751     -- Bug# 4061058:
11752     -- Changes to ensure that the query works for Release Asset
11753     -- and Release Contract
11754     CURSOR l_asset_csr(p_chr_id  IN NUMBER
11755                       ,p_cle_id  IN NUMBER
11756                       ,p_book_class  IN VARCHAR2
11757                       ,p_book_type_code  IN VARCHAR2) IS
11758     SELECT fab.asset_id,
11759            fab.book_type_code
11760     FROM okc_k_lines_v fin_ast_cle,
11761          okc_statuses_b stsb,
11762          fa_additions fad,
11763          fa_book_controls fbc,
11764          fa_books fab
11765     WHERE fin_ast_cle.id = p_cle_id
11766     AND   fin_ast_cle.dnz_chr_id = p_chr_id
11767     AND   fin_ast_cle.chr_id = p_chr_id
11768     AND   fin_ast_cle.sts_code = stsb.code
11769     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED')
11770     AND   fad.asset_number = fin_ast_cle.name
11771     AND   fab.asset_id = fad.asset_id
11772     AND   fab.book_type_code = fbc.book_type_code
11773     AND   fab.transaction_header_id_out IS NULL
11774     --AND   fbc.book_class = 'CORPORATE'
11775     AND   fbc.book_class = p_book_class
11776     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
11777 
11778     l_asset_rec  l_asset_csr%ROWTYPE;
11779 
11780     -- Bug# 4061058:
11781     -- Changes to ensure that the query works for Release Asset
11782     -- and Release Contract
11783     CURSOR l_asset_csr_incl_terminated
11784                            (p_chr_id  IN NUMBER
11785                            ,p_cle_id  IN NUMBER
11786                            ,p_book_class  IN VARCHAR2
11787                            ,p_book_type_code  IN VARCHAR2) IS
11788     SELECT fab.asset_id,
11789            fab.book_type_code
11790     FROM okc_k_lines_v fin_ast_cle,
11791          okc_statuses_b stsb,
11792          fa_additions fad,
11793          fa_book_controls fbc,
11794          fa_books fab
11795     WHERE fin_ast_cle.id = p_cle_id
11796     AND   fin_ast_cle.dnz_chr_id = p_chr_id
11797     AND   fin_ast_cle.chr_id = p_chr_id
11798     AND   fin_ast_cle.sts_code = stsb.code
11799     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED')
11800     AND   fad.asset_number = fin_ast_cle.name
11801     AND   fab.asset_id = fad.asset_id
11802     AND   fab.book_type_code = fbc.book_type_code
11803     AND   fab.transaction_header_id_out IS NULL
11804     --AND   fbc.book_class = 'CORPORATE'
11805     AND   fbc.book_class = p_book_class
11806     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
11807 
11808     CURSOR contract_start_date_csr(p_chr_id NUMBER) IS
11809     SELECT start_date
11810     FROM okc_k_headers_b
11811     WHERE id = p_chr_id;
11812 
11813     --Bug# 16511024, Start
11814     --ndani - 15-Mar-2013 Start - Rebook Accounting Fix
11815     -- Changes to ensure that the query works for Release Asset and Release Contract
11816     -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
11817     CURSOR l_nr_asset_csr(p_chr_id  IN NUMBER
11818                       ,p_cle_id  IN NUMBER
11819                       ,p_book_class  IN VARCHAR2
11820                       ,p_book_type_code  IN VARCHAR2
11821                       ,p_line_type  IN VARCHAR2) IS
11822     SELECT fab.asset_id,
11823            fab.book_type_code
11824     FROM okc_k_lines_v fin_ast_cle,
11825          okc_statuses_b stsb,
11826          fa_additions fad,
11827          fa_book_controls fbc,
11828          fa_books fab,
11829          okl_k_lines_v kle
11830     WHERE fin_ast_cle.id = p_cle_id
11831     AND   fin_ast_cle.dnz_chr_id = p_chr_id
11832     AND   fin_ast_cle.chr_id = p_chr_id
11833     AND   fin_ast_cle.sts_code = stsb.code
11834     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED')
11835     AND   fad.asset_number = fin_ast_cle.name
11836     AND   fab.asset_id = fad.asset_id
11837     AND   fab.book_type_code = fbc.book_type_code
11838     AND   fab.transaction_header_id_out IS NULL
11839     --AND   fbc.book_class = 'CORPORATE'
11840     AND   fbc.book_class = p_book_class
11841     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code)
11842     AND   fin_ast_cle.id = kle.id
11843     AND   NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
11844 
11845 
11846     -- Changes to ensure that the query works for Release Asset
11847     -- and Release Contract
11848     -- Considers either new or re-leased assets of a Contract based on p_line_type parameter
11849     CURSOR l_nr_asset_csr_incl_terminated
11850                            (p_chr_id  IN NUMBER
11851                            ,p_cle_id  IN NUMBER
11852                            ,p_book_class  IN VARCHAR2
11853                            ,p_book_type_code  IN VARCHAR2
11854                            ,p_line_type  IN VARCHAR2) IS
11855     SELECT fab.asset_id,
11856            fab.book_type_code
11857     FROM okc_k_lines_v fin_ast_cle,
11858          okc_statuses_b stsb,
11859          fa_additions fad,
11860          fa_book_controls fbc,
11861          fa_books fab,
11862          okl_k_lines_v kle
11863     WHERE fin_ast_cle.id = p_cle_id
11864     AND   fin_ast_cle.dnz_chr_id = p_chr_id
11865     AND   fin_ast_cle.chr_id = p_chr_id
11866     AND   fin_ast_cle.sts_code = stsb.code
11867     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED')
11868     AND   fad.asset_number = fin_ast_cle.name
11869     AND   fab.asset_id = fad.asset_id
11870     AND   fab.book_type_code = fbc.book_type_code
11871     AND   fab.transaction_header_id_out IS NULL
11872     --AND   fbc.book_class = 'CORPORATE'
11873     AND   fbc.book_class = p_book_class
11874     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code)
11875     AND   fin_ast_cle.id = kle.id
11876     AND   NVL(kle.re_lease_yn,'N') = DECODE(p_line_type,'NEW','N','RELEASE','Y');
11877 
11878     l_line_type VARCHAR2(30) := 'X';
11879     --ndani - 15-Mar-2013 End - Rebook Accounting Fix
11880     --Bug# 16511024, End
11881 
11882     l_discount_incl_terminated BOOLEAN := FALSE;
11883     l_streams_repo_policy VARCHAR2(80); -- MGAAP 7263041
11884     l_book_class FA_BOOK_CONTROLS.BOOK_CLASS%TYPE;
11885     l_book_type_code FA_BOOK_CONTROLS.BOOK_TYPE_CODE%TYPE;
11886 
11887 
11888   BEGIN
11889 
11890       IF (( p_contract_id IS NULL ) OR ( p_contract_line_id IS NULL )) THEN
11891           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11892       END IF;
11893 
11894       l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
11895       l_book_type_code := NULL;
11896       IF (l_streams_repo_policy = 'PRIMARY') THEN
11897         l_book_class := 'CORPORATE';
11898       ELSE
11899         l_book_class := 'TAX';
11900         l_book_type_code := OKL_ACCOUNTING_UTIL.get_fa_reporting_book(
11901                               p_kle_id => p_contract_line_id);
11902       END IF;
11903            -- rmunjulu 4042892
11904     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
11905       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
11906 	  LOOP
11907         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
11908           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
11909 		  l_discount_incl_terminated := TRUE;
11910 
11911         --ndani - 15-Mar-2013 Start - Rebook Accounting Fix
11912         --Bug# 16511024 : Check for 'NEW_RELEASE_ASSET' global parameter is set or not
11913         --                If set then based on its value set l_line_type
11914 
11915         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'NEW_RELEASE_ASSET' THEN
11916           IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'NEW' THEN
11917             l_line_type := 'NEW'; --New
11918           ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'RELEASE' THEN
11919             l_line_type := 'RELEASE'; --Release
11920           END IF;
11921         --Bug# 16511024 , End
11922         --ndani - 15-Mar-2013 End - Rebook Accounting Fix
11923         END IF;
11924       END LOOP;
11925     END IF;
11926 
11927       --ndani - 15-Mar-2013 Start - Rebook Accounting Fix
11928       --Bug# 16511024 , Start
11929       -- If l_line_type is set as either 'NEW' or 'RELEASE' call
11930       -- l_nr_asset_csr_incl_terminated or l_nr_asset_csr cursor in order to consider either only new
11931       -- assets or only re-leased assets, else no change in the standard behavior
11932 
11933       IF l_line_type IN ('NEW','RELEASE') THEN
11934         IF l_discount_incl_terminated THEN
11935           OPEN  l_nr_asset_csr_incl_terminated(p_chr_id => p_contract_id,
11936                                             p_cle_id => p_contract_line_id,
11937                                             p_book_class => l_book_class,
11938                                             p_book_type_code => l_book_type_code,
11939                                             p_line_type => l_line_type);
11940           FETCH l_nr_asset_csr_incl_terminated INTO l_asset_rec;
11941           IF( l_nr_asset_csr_incl_terminated%NOTFOUND ) THEN
11942             CLOSE l_nr_asset_csr_incl_terminated;
11943             --Commenting RAISE statement, instead returning value zero
11944             --RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11945             l_converted_amount := 0;
11946             RETURN l_converted_amount;
11947           END IF;
11948           CLOSE l_nr_asset_csr_incl_terminated;
11949         ELSE
11950           OPEN  l_nr_asset_csr(p_chr_id => p_contract_id,
11951                             p_cle_id => p_contract_line_id,
11952                             p_book_class => l_book_class,
11953                             p_book_type_code => l_book_type_code,
11954                             p_line_type => l_line_type);
11955           FETCH l_nr_asset_csr INTO l_asset_rec;
11956           IF( l_nr_asset_csr%NOTFOUND ) THEN
11957              CLOSE l_nr_asset_csr;
11958              --Commenting RAISE statement, instead returning value zero
11959              --RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11960              l_converted_amount := 0;
11961              RETURN l_converted_amount;
11962           END IF;
11963           CLOSE l_nr_asset_csr;
11964         END IF;
11965 
11966        --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
11967         --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
11968         --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
11969 
11970       --IF l_discount_incl_terminated THEN -- Commented and re-written as ELSIF
11971       ELSIF l_discount_incl_terminated THEN
11972       --Bug# 16511024 , End
11973       --ndani - 15-Mar-2013 End - Rebook Accounting Fix
11974           OPEN  l_asset_csr_incl_terminated(p_chr_id => p_contract_id,
11975                                             p_cle_id => p_contract_line_id,
11976                                             p_book_class => l_book_class,
11977                                             p_book_type_code => l_book_type_code);
11978           FETCH l_asset_csr_incl_terminated INTO l_asset_rec;
11979           IF( l_asset_csr_incl_terminated%NOTFOUND ) THEN
11980             CLOSE l_asset_csr_incl_terminated;
11981             --ndani - 15-Mar-2013 Start - Rebook Accounting Fix
11982             --Bug# 16511024, Start :Commenting RAISE statement, instead returning value zero
11983             --RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
11984             l_converted_amount := 0;
11985             RETURN l_converted_amount;
11986             --Bug# 16511024, End
11987             --ndani - 15-Mar-2013 End - Rebook Accounting Fix
11988           END IF;
11989           CLOSE l_asset_csr_incl_terminated;
11990       ELSE
11991           OPEN  l_asset_csr(p_chr_id => p_contract_id,
11992                             p_cle_id => p_contract_line_id,
11993                             p_book_class => l_book_class,
11994                             p_book_type_code => l_book_type_code);
11995           FETCH l_asset_csr INTO l_asset_rec;
11996           IF( l_asset_csr%NOTFOUND ) THEN
11997              CLOSE l_asset_csr;
11998              --ndani - 15-Mar-2013 Start - Rebook Accounting Fix
11999              --Bug# 16511024, Start :Commenting RAISE statement, instead returning value zero
12000              --RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12001              l_converted_amount := 0;
12002              RETURN l_converted_amount;
12003              --Bug# 16511024, End
12004              --ndani - 15-Mar-2013 End - Rebook Accounting Fix
12005           END IF;
12006           CLOSE l_asset_csr;
12007       END IF;
12008 
12009       l_asset_hdr_rec.asset_id          := l_asset_rec.asset_id;
12010       l_asset_hdr_rec.book_type_code    := l_asset_rec.book_type_code;
12011 
12012       IF NOT fa_cache_pkg.fazcbc(x_book => l_asset_hdr_rec.book_type_code) THEN
12013         OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
12014                             p_msg_name     => 'OKL_LLA_FA_CACHE_ERROR'
12015                            );
12016         RAISE OKL_API.G_EXCEPTION_ERROR;
12017       END IF;
12018 
12019       -- To fetch Asset Current Cost
12020       IF NOT FA_UTIL_PVT.get_asset_fin_rec
12021               (p_asset_hdr_rec         => l_asset_hdr_rec,
12022                px_asset_fin_rec        => l_asset_fin_rec,
12023                p_transaction_header_id => NULL,
12024                p_mrc_sob_type_code     => 'P'
12025               ) THEN
12026 
12027         OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
12028                             p_msg_name     => 'OKL_LLA_FA_ASSET_FIN_REC_ERROR'
12029                            );
12030         RAISE OKL_API.G_EXCEPTION_ERROR;
12031       END IF;
12032 
12033       -- convert amount into contract currency
12034       OPEN contract_start_date_csr(p_chr_id => p_contract_id);
12035       FETCH contract_start_date_csr INTO l_contract_start_date;
12036       CLOSE contract_start_date_csr;
12037 
12038       l_converted_amount := 0;
12039       OKL_ACCOUNTING_UTIL.CONVERT_TO_CONTRACT_CURRENCY(
12040         p_khr_id                   => p_contract_id,
12041         p_from_currency            => NULL,
12042         p_transaction_date         => l_contract_start_date,
12043         p_amount                   => l_asset_fin_rec.cost,
12044         x_return_status            => x_return_status,
12045         x_contract_currency        => l_contract_currency,
12046         x_currency_conversion_type => l_currency_conversion_type,
12047         x_currency_conversion_rate => l_currency_conversion_rate,
12048         x_currency_conversion_date => l_currency_conversion_date,
12049         x_converted_amount         => l_converted_amount);
12050 
12051       IF(x_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
12052         Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
12053                             p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
12054         RAISE Okl_Api.G_EXCEPTION_ERROR;
12055       END IF;
12056 
12057       RETURN l_converted_amount;
12058 
12059     EXCEPTION
12060 
12061       WHEN OKL_API.G_EXCEPTION_ERROR THEN
12062         RETURN NULL;
12063 
12064 	WHEN OTHERS THEN
12065         Okl_Api.SET_MESSAGE(
12066           p_app_name     => G_APP_NAME,
12067           p_msg_name     => G_UNEXPECTED_ERROR,
12068           p_token1       => G_SQLCODE_TOKEN,
12069           p_token1_value => SQLCODE,
12070           p_token2       => G_SQLERRM_TOKEN,
12071           p_token2_value => SQLERRM);
12072        RETURN NULL;
12073 
12074   END line_asset_cost;
12075 
12076 --------------------------------------------------------------------------------
12077 
12078     -- Start of Comments
12079     -- Created By:    Rekha Pillay (rpillay)
12080     -- Function Name: line_accumulated_deprn
12081     -- Description:   Returns the accumulated depreciation on an asset in
12082     --                its Corporate Book from Oracle Assets
12083     -- Dependencies:
12084     -- Parameters: contract id, line id
12085     -- Version: 1.0
12086     -- End of Comments
12087 
12088 --------------------------------------------------------------------------------
12089   FUNCTION line_accumulated_deprn(
12090                             p_contract_id       IN  NUMBER
12091                            ,p_contract_line_id  IN NUMBER
12092                           )
12093   RETURN NUMBER  IS
12094 
12095     l_api_name          CONSTANT VARCHAR2(30) := 'LINE_ACCUMULATED_DEPRN';
12096     l_api_version       CONSTANT NUMBER	      := 1;
12097     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
12098     x_msg_count         NUMBER;
12099     x_msg_data          VARCHAR2(256);
12100 
12101     l_asset_hdr_rec            FA_API_TYPES.asset_hdr_rec_type;
12102     l_asset_deprn_rec          FA_API_TYPES.asset_deprn_rec_type;
12103 
12104     l_converted_amount         NUMBER;
12105     l_contract_start_date      DATE;
12106     l_contract_currency        OKL_K_HEADERS_FULL_V.currency_code%TYPE;
12107     l_currency_conversion_type OKL_K_HEADERS_FULL_V.currency_conversion_type%TYPE;
12108     l_currency_conversion_rate OKL_K_HEADERS_FULL_V.currency_conversion_rate%TYPE;
12109     l_currency_conversion_date OKL_K_HEADERS_FULL_V.currency_conversion_date%TYPE;
12110 
12111     -- Bug# 4061058:
12112     -- Changes to ensure that the query works for Release Asset
12113     -- and Release Contract
12114     CURSOR l_asset_csr(p_chr_id  IN NUMBER
12115                       ,p_cle_id  IN NUMBER
12116                       ,p_book_class  IN VARCHAR2
12117                       ,p_book_type_code  IN VARCHAR2) IS
12118     SELECT fab.asset_id,
12119            fab.book_type_code
12120     FROM okc_k_lines_v fin_ast_cle,
12121          okc_statuses_b stsb,
12122          fa_additions fad,
12123          fa_book_controls fbc,
12124          fa_books fab
12125     WHERE fin_ast_cle.id = p_cle_id
12126     AND   fin_ast_cle.dnz_chr_id = p_chr_id
12127     AND   fin_ast_cle.chr_id = p_chr_id
12128     AND   fin_ast_cle.sts_code = stsb.code
12129     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED')
12130     AND   fad.asset_number = fin_ast_cle.name
12131     AND   fab.asset_id = fad.asset_id
12132     AND   fab.book_type_code = fbc.book_type_code
12133     AND   fab.transaction_header_id_out IS NULL
12134     --AND   fbc.book_class = 'CORPORATE';
12135     AND   fbc.book_class = p_book_class
12136     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
12137 
12138     l_asset_rec  l_asset_csr%ROWTYPE;
12139 
12140     -- Bug# 4061058:
12141     -- Changes to ensure that the query works for Release Asset
12142     -- and Release Contract
12143     CURSOR l_asset_csr_incl_terminated
12144                            (p_chr_id  IN NUMBER
12145                            ,p_cle_id  IN NUMBER
12146                            ,p_book_class  IN VARCHAR2
12147                            ,p_book_type_code  IN VARCHAR2) IS
12148     SELECT fab.asset_id,
12149            fab.book_type_code
12150     FROM okc_k_lines_v fin_ast_cle,
12151          okc_statuses_b stsb,
12152          fa_additions fad,
12153          fa_book_controls fbc,
12154          fa_books fab
12155     WHERE fin_ast_cle.id = p_cle_id
12156     AND   fin_ast_cle.dnz_chr_id = p_chr_id
12157     AND   fin_ast_cle.chr_id = p_chr_id
12158     AND   fin_ast_cle.sts_code = stsb.code
12159     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED')
12160     AND   fad.asset_number = fin_ast_cle.name
12161     AND   fab.asset_id = fad.asset_id
12162     AND   fab.book_type_code = fbc.book_type_code
12163     AND   fab.transaction_header_id_out IS NULL
12164     --AND   fbc.book_class = 'CORPORATE';
12165     AND   fbc.book_class = p_book_class
12166     AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
12167 
12168     CURSOR contract_start_date_csr(p_chr_id NUMBER) IS
12169     SELECT start_date
12170     FROM okc_k_headers_b
12171     WHERE id = p_chr_id;
12172 
12173     l_discount_incl_terminated BOOLEAN := FALSE;
12174     l_streams_repo_policy VARCHAR2(80); -- MGAAP 7263041
12175     l_book_class FA_BOOK_CONTROLS.BOOK_CLASS%TYPE;
12176     l_book_type_code FA_BOOK_CONTROLS.BOOK_TYPE_CODE%TYPE;
12177 
12178   BEGIN
12179 
12180       IF (( p_contract_id IS NULL ) OR ( p_contract_line_id IS NULL )) THEN
12181           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12182       END IF;
12183 
12184       l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
12185       l_book_type_code := NULL;
12186       IF (l_streams_repo_policy = 'PRIMARY') THEN
12187         l_book_class := 'CORPORATE';
12188       ELSE
12189         l_book_class := 'TAX';
12190         l_book_type_code := OKL_ACCOUNTING_UTIL.get_fa_reporting_book(
12191                               p_kle_id => p_contract_line_id);
12192       END IF;
12193            -- rmunjulu 4042892
12194     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
12195       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
12196 	  LOOP
12197         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
12198           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
12199 		  l_discount_incl_terminated := TRUE;
12200         END IF;
12201       END LOOP;
12202     END IF;
12203 
12204      -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
12205        -- AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
12206        --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
12207 
12208      IF l_discount_incl_terminated THEN
12209           OPEN  l_asset_csr_incl_terminated(p_chr_id => p_contract_id,
12210                                             p_cle_id => p_contract_line_id,
12211                                             p_book_class => l_book_class,
12212                                             p_book_type_code => l_book_type_code);
12213           FETCH l_asset_csr_incl_terminated INTO l_asset_rec;
12214           IF( l_asset_csr_incl_terminated%NOTFOUND ) THEN
12215             CLOSE l_asset_csr_incl_terminated;
12216             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12217           END IF;
12218           CLOSE l_asset_csr_incl_terminated;
12219       ELSE
12220           OPEN  l_asset_csr(p_chr_id => p_contract_id,
12221                             p_cle_id => p_contract_line_id,
12222                             p_book_class => l_book_class,
12223                             p_book_type_code => l_book_type_code);
12224           FETCH l_asset_csr INTO l_asset_rec;
12225           IF( l_asset_csr%NOTFOUND ) THEN
12226              CLOSE l_asset_csr;
12227              RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12228           END IF;
12229           CLOSE l_asset_csr;
12230       END IF;
12231 
12232       l_asset_hdr_rec.asset_id          := l_asset_rec.asset_id;
12233       l_asset_hdr_rec.book_type_code    := l_asset_rec.book_type_code;
12234 
12235       IF NOT fa_cache_pkg.fazcbc(x_book => l_asset_hdr_rec.book_type_code) THEN
12236         OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
12237                             p_msg_name     => 'OKL_LLA_FA_CACHE_ERROR'
12238                            );
12239         RAISE OKL_API.G_EXCEPTION_ERROR;
12240       END IF;
12241 
12242       -- To fetch Depreciation Reserve
12243       IF NOT FA_UTIL_PVT.get_asset_deprn_rec
12244               (p_asset_hdr_rec         => l_asset_hdr_rec ,
12245                px_asset_deprn_rec      => l_asset_deprn_rec,
12246                p_period_counter        => NULL,
12247                p_mrc_sob_type_code     => 'P'
12248                ) THEN
12249         OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
12250                             p_msg_name     => 'OKL_LLA_FA_DEPRN_REC_ERROR'
12251                            );
12252         RAISE OKL_API.G_EXCEPTION_ERROR;
12253       END IF;
12254 
12255       -- convert amount into contract currency
12256       OPEN contract_start_date_csr(p_chr_id => p_contract_id);
12257       FETCH contract_start_date_csr INTO l_contract_start_date;
12258       CLOSE contract_start_date_csr;
12259 
12260       l_converted_amount := 0;
12261       OKL_ACCOUNTING_UTIL.CONVERT_TO_CONTRACT_CURRENCY(
12262         p_khr_id                   => p_contract_id,
12263         p_from_currency            => NULL,
12264         p_transaction_date         => l_contract_start_date,
12265         p_amount                   => l_asset_deprn_rec.deprn_reserve,
12266         x_return_status            => x_return_status,
12267         x_contract_currency        => l_contract_currency,
12268         x_currency_conversion_type => l_currency_conversion_type,
12269         x_currency_conversion_rate => l_currency_conversion_rate,
12270         x_currency_conversion_date => l_currency_conversion_date,
12271         x_converted_amount         => l_converted_amount);
12272 
12273       IF(x_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
12274         Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
12275                             p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
12276         RAISE Okl_Api.G_EXCEPTION_ERROR;
12277       END IF;
12278 
12279       RETURN l_converted_amount;
12280 
12281     EXCEPTION
12282 
12283       WHEN OKL_API.G_EXCEPTION_ERROR THEN
12284         RETURN NULL;
12285 
12286 	WHEN OTHERS THEN
12287         Okl_Api.SET_MESSAGE(
12288           p_app_name     => G_APP_NAME,
12289           p_msg_name     => G_UNEXPECTED_ERROR,
12290           p_token1       => G_SQLCODE_TOKEN,
12291           p_token1_value => SQLCODE,
12292           p_token2       => G_SQLERRM_TOKEN,
12293           p_token2_value => SQLERRM);
12294        RETURN NULL;
12295 
12296   END line_accumulated_deprn;
12297 
12298 --------------------------------------------------------------------------------
12299 
12300     -- Start of Comments
12301     -- Created By:    Rekha Pillay (rpillay)
12302     -- Function Name: contract_asset_cost
12303     -- Description:   Returns the sum of current cost of all assets
12304     --                in the contract from Oracle Assets
12305     -- Dependencies:
12306     -- Parameters: contract id, line id
12307     -- Version: 1.0
12308     -- End of Comments
12309 
12310 --------------------------------------------------------------------------------
12311   FUNCTION contract_asset_cost(
12312                             p_contract_id       IN NUMBER
12313                            ,p_contract_line_id  IN NUMBER
12314                           )
12315   RETURN NUMBER  IS
12316 
12317     l_api_name          CONSTANT VARCHAR2(30) := 'CONTRACT_ASSET_COST';
12318     l_api_version       CONSTANT NUMBER	      := 1;
12319     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
12320     x_msg_count         NUMBER;
12321     x_msg_data          VARCHAR2(256);
12322 
12323     CURSOR l_finast_csr(p_chr_id  IN NUMBER) IS
12324     SELECT fin_cle.id
12325     FROM okc_k_lines_b fin_cle,
12326          okc_line_styles_b lse,
12327          okc_statuses_b stsb
12328     WHERE fin_cle.dnz_chr_id = p_chr_id
12329     AND   fin_cle.chr_id = p_chr_id
12330     AND   fin_cle.lse_id = lse.id
12331     AND   lse.lty_code = 'FREE_FORM1'
12332     AND   fin_cle.sts_code = stsb.code
12333     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED');
12334 
12335     CURSOR l_finast_csr_incl_terminated(p_chr_id  IN NUMBER) IS
12336     SELECT fin_cle.id
12337     FROM okc_k_lines_b fin_cle,
12338          okc_line_styles_b lse,
12339          okc_statuses_b stsb
12340     WHERE fin_cle.dnz_chr_id = p_chr_id
12341     AND   fin_cle.chr_id = p_chr_id
12342     AND   fin_cle.lse_id = lse.id
12343     AND   lse.lty_code = 'FREE_FORM1'
12344     AND   fin_cle.sts_code = stsb.code
12345     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED');
12346 
12347     l_sum_asset_cost NUMBER;
12348     l_asset_cost NUMBER;
12349 
12350     l_discount_incl_terminated BOOLEAN := FALSE;
12351 
12352   BEGIN
12353 
12354       IF ( p_contract_id IS NULL ) THEN
12355           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12356       END IF;
12357 
12358       l_sum_asset_cost := 0;
12359 
12360            -- rmunjulu 4042892
12361     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
12362       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
12363 	  LOOP
12364         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
12365           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
12366 		  l_discount_incl_terminated := TRUE;
12367         END IF;
12368       END LOOP;
12369     END IF;
12370 
12371 
12372      -- IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
12373       --  AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
12374        -- AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
12375 
12376      IF l_discount_incl_terminated THEN
12377         FOR l_finast_rec IN l_finast_csr_incl_terminated(p_chr_id => p_contract_id) LOOP
12378           l_asset_cost := line_asset_cost(p_contract_id,l_finast_rec.id);
12379           IF (l_asset_cost IS NULL) THEN
12380             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12381           END IF;
12382           l_sum_asset_cost := l_sum_asset_cost + l_asset_cost;
12383         END LOOP;
12384 
12385       ELSE
12386 
12387          FOR l_finast_rec IN l_finast_csr(p_chr_id => p_contract_id) LOOP
12388           l_asset_cost := line_asset_cost(p_contract_id,l_finast_rec.id);
12389           IF (l_asset_cost IS NULL) THEN
12390             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12391           END IF;
12392           l_sum_asset_cost := l_sum_asset_cost + l_asset_cost;
12393         END LOOP;
12394 
12395       END IF;
12396 
12397       RETURN l_sum_asset_cost;
12398 
12399     EXCEPTION
12400 
12401       WHEN OKL_API.G_EXCEPTION_ERROR THEN
12402         RETURN NULL;
12403 
12404 	WHEN OTHERS THEN
12405         Okl_Api.SET_MESSAGE(
12406           p_app_name     => G_APP_NAME,
12407           p_msg_name     => G_UNEXPECTED_ERROR,
12408           p_token1       => G_SQLCODE_TOKEN,
12409           p_token1_value => SQLCODE,
12410           p_token2       => G_SQLERRM_TOKEN,
12411           p_token2_value => SQLERRM);
12412        RETURN NULL;
12413 
12414   END contract_asset_cost;
12415 
12416 --------------------------------------------------------------------------------
12417 
12418     -- Start of Comments
12419     -- Created By:    Rekha Pillay (rpillay)
12420     -- Function Name: contract_accumulated_deprn
12421     -- Description:   Returns the sum of accumulated depreciation
12422     --                for all assets in the contract from Oracle Assets
12423     -- Dependencies:
12424     -- Parameters: contract id, line id
12425     -- Version: 1.0
12426     -- End of Comments
12427 
12428 --------------------------------------------------------------------------------
12429   FUNCTION contract_accumulated_deprn(
12430                             p_contract_id       IN NUMBER
12431                            ,p_contract_line_id  IN NUMBER
12432                           )
12433   RETURN NUMBER  IS
12434 
12435     l_api_name          CONSTANT VARCHAR2(30) := 'CONTRACT_ACCUMULATED_DEPRN';
12436     l_api_version       CONSTANT NUMBER	      := 1;
12437     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
12438     x_msg_count         NUMBER;
12439     x_msg_data          VARCHAR2(256);
12440 
12441     CURSOR l_finast_csr(p_chr_id  IN NUMBER) IS
12442     SELECT fin_cle.id
12443     FROM okc_k_lines_b fin_cle,
12444          okc_line_styles_b lse,
12445          okc_statuses_b stsb
12446     WHERE fin_cle.dnz_chr_id = p_chr_id
12447     AND   fin_cle.chr_id = p_chr_id
12448     AND   fin_cle.lse_id = lse.id
12449     AND   lse.lty_code = 'FREE_FORM1'
12450     AND   fin_cle.sts_code = stsb.code
12451     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED','TERMINATED');
12452 
12453     CURSOR l_finast_csr_incl_terminated(p_chr_id  IN NUMBER) IS
12454     SELECT fin_cle.id
12455     FROM okc_k_lines_b fin_cle,
12456          okc_line_styles_b lse,
12457          okc_statuses_b stsb
12458     WHERE fin_cle.dnz_chr_id = p_chr_id
12459     AND   fin_cle.chr_id = p_chr_id
12460     AND   fin_cle.lse_id = lse.id
12461     AND   lse.lty_code = 'FREE_FORM1'
12462     AND   fin_cle.sts_code = stsb.code
12463     AND   stsb.ste_code NOT IN ('HOLD','EXPIRED','CANCELLED');
12464 
12465     l_sum_accumulated_deprn NUMBER;
12466     l_accumulated_deprn NUMBER;
12467 
12468     l_discount_incl_terminated BOOLEAN := FALSE;
12469 
12470   BEGIN
12471 
12472       IF ( p_contract_id IS NULL ) THEN
12473           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12474       END IF;
12475 
12476       l_sum_accumulated_deprn := 0;
12477 
12478            -- rmunjulu 4042892
12479     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
12480       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
12481 	  LOOP
12482         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
12483           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
12484 		  l_discount_incl_terminated := TRUE;
12485         END IF;
12486       END LOOP;
12487     END IF;
12488 
12489 
12490       --IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0
12491         --AND Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS(0).NAME = 'TERMINATED_LINES_YN'
12492         --AND  Okl_Execute_Formula_Pub.g_additional_parameters(0).value = 'Y' THEN
12493 
12494       IF l_discount_incl_terminated THEN
12495         FOR l_finast_rec IN l_finast_csr_incl_terminated(p_chr_id => p_contract_id) LOOP
12496           l_accumulated_deprn := line_accumulated_deprn(p_contract_id,l_finast_rec.id);
12497           IF (l_accumulated_deprn IS NULL) THEN
12498             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12499           END IF;
12500           l_sum_accumulated_deprn := l_sum_accumulated_deprn + l_accumulated_deprn;
12501         END LOOP;
12502 
12503       ELSE
12504 
12505          FOR l_finast_rec IN l_finast_csr(p_chr_id => p_contract_id) LOOP
12506           l_accumulated_deprn := line_accumulated_deprn(p_contract_id,l_finast_rec.id);
12507           IF (l_accumulated_deprn IS NULL) THEN
12508             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12509           END IF;
12510           l_sum_accumulated_deprn := l_sum_accumulated_deprn + l_accumulated_deprn;
12511         END LOOP;
12512 
12513       END IF;
12514 
12515       RETURN l_sum_accumulated_deprn;
12516 
12517     EXCEPTION
12518 
12519       WHEN OKL_API.G_EXCEPTION_ERROR THEN
12520         RETURN NULL;
12521 
12522 	WHEN OTHERS THEN
12523         Okl_Api.SET_MESSAGE(
12524           p_app_name     => G_APP_NAME,
12525           p_msg_name     => G_UNEXPECTED_ERROR,
12526           p_token1       => G_SQLCODE_TOKEN,
12527           p_token1_value => SQLCODE,
12528           p_token2       => G_SQLERRM_TOKEN,
12529           p_token2_value => SQLERRM);
12530        RETURN NULL;
12531 
12532   END contract_accumulated_deprn;
12533 
12534 --Bug# 3872534: end
12535 
12536 --------------------------------------------------------------------------------
12537 
12538     -- Start of Comments
12539     -- Created By:    avsingh
12540     -- Function Name: contract_financed_amount
12541     -- Description:   Returns the contract financed amount for
12542     --                  booking page
12543     -- Dependencies:
12544     -- Parameters: contract id, line id
12545     -- Version: 1.0
12546     -- End of Comments
12547 
12548 --------------------------------------------------------------------------------
12549   FUNCTION contract_financed_amount(
12550                             p_contract_id       IN NUMBER
12551                            ,p_contract_line_id  IN NUMBER
12552                           )
12553   RETURN NUMBER  IS
12554 
12555     l_api_name          CONSTANT VARCHAR2(30) := 'CONTRACT_CAPITAL_AMOUNT';
12556     l_api_version       CONSTANT NUMBER       := 1;
12557     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
12558     x_msg_count         NUMBER;
12559     x_msg_data          VARCHAR2(256);
12560 
12561       --cursor to find total capital amount
12562     CURSOR l_cap_amnt_csr( ChrId NUMBER) IS
12563     SELECT NVL(SUM(kle.capital_amount),0)
12564            --bug# 4899328
12565            --+ NVL(SUM(kle.capitalized_interest),0) CapAmountLines
12566     FROM   OKC_LINE_STYLES_B  LSEB,
12567            OKL_K_LINES        KLE,
12568            OKC_K_LINES_B      CLEB,
12569            OKC_STATUSES_B     STSB
12570     WHERE  LSEB.ID               = CLEB.LSE_ID
12571     AND    LSEB.lty_code         = 'FREE_FORM1'
12572     AND    KLE.id                = CLEB.ID
12573     AND    CLEB.CHR_ID           = ChrId
12574     AND    CLEB.DNZ_CHR_ID       = ChrId
12575     AND    CLEB.sts_code         = STSB.code
12576     AND    STSB.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
12577 
12578 -- fixed bug 4134296
12579     -- cursor to find total Rollover Fee Amount for a Contract
12580     CURSOR l_rollover_fee_csr(l_dnz_chr_id okc_k_headers_b.id%TYPE) IS
12581     SELECT
12582       NVL(SUM(NVL(KLEB.amount,0)),0) ROLLOVER_AMOUNT
12583     FROM
12584       OKL_K_LINES KLEB,
12585       OKC_K_LINES_B CLEB,
12586       OKC_LINE_STYLES_B LSEB,
12587       OKC_STATUSES_B STS
12588     WHERE
12589       KLEB.ID = CLEB.ID AND
12590       CLEB.LSE_ID = LSEB.ID AND
12591       LSEB.LTY_CODE = 'FEE' AND
12592       KLEB.FEE_TYPE = 'ROLLOVER' AND
12593       CLEB.DNZ_CHR_ID = l_dnz_chr_id AND
12594       CLEB.STS_CODE = STS.CODE AND
12595       STS.STE_CODE NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
12596 
12597 
12598     l_rollover_fee_amount NUMBER;
12599 
12600     l_capital_amount NUMBER;
12601 
12602     l_financed_fee NUMBER;
12603 
12604     l_contract_financed_amount NUMBER;
12605 
12606 
12607   BEGIN
12608 
12609       IF ( p_contract_id IS NULL ) THEN
12610           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
12611       END IF;
12612 
12613       l_capital_amount := 0;
12614       l_financed_fee   := 0;
12615       l_contract_financed_amount := 0;
12616       l_rollover_fee_amount := 0;
12617 
12618       OPEN l_cap_amnt_csr(ChrId => p_contract_id);
12619       FETCH l_cap_amnt_csr INTO l_capital_amount;
12620       IF l_cap_amnt_csr%NOTFOUND THEN
12621           NULL;
12622       END IF;
12623       CLOSE l_cap_amnt_csr;
12624 
12625       FOR l_rollover_fee in l_rollover_fee_csr(p_contract_id)
12626       LOOP
12627 
12628         l_rollover_fee_amount := l_rollover_fee.rollover_amount;
12629 
12630       END LOOP;
12631 
12632 
12633       l_financed_fee := contract_financed_fee(p_contract_id, NULL);
12634       l_contract_financed_amount := l_capital_amount + l_financed_fee + l_rollover_fee_amount;
12635 
12636       RETURN l_contract_financed_amount;
12637 
12638    EXCEPTION
12639 
12640       WHEN OKL_API.G_EXCEPTION_ERROR THEN
12641         RETURN NULL;
12642 
12643         WHEN OTHERS THEN
12644         Okl_Api.SET_MESSAGE(
12645           p_app_name     => G_APP_NAME,
12646           p_msg_name     => G_UNEXPECTED_ERROR,
12647           p_token1       => G_SQLCODE_TOKEN,
12648           p_token1_value => SQLCODE,
12649           p_token2       => G_SQLERRM_TOKEN,
12650           p_token2_value => SQLERRM);
12651        RETURN NULL;
12652   END contract_financed_amount;
12653 
12654 --start:cklee
12655 --------------------------------------------------------------------------------
12656 
12657     -- Start of Comments
12658     -- Created By:    cklee
12659     -- Function Name: rollover fee
12660     -- Description:   Returns the credit line total rollover fee
12661     --
12662     -- Dependencies:
12663     -- Parameters: contract id, line id
12664     -- Version: 1.0
12665     -- End of Comments
12666 
12667 --------------------------------------------------------------------------------
12668   FUNCTION rollover_fee(
12669                             p_contract_id       IN NUMBER
12670                            ,p_contract_line_id  IN NUMBER
12671                           )
12672   RETURN NUMBER  IS
12673 
12674     l_api_name          CONSTANT VARCHAR2(30) := 'ROLLOVER_FEE';
12675     l_api_version       CONSTANT NUMBER       := 1;
12676     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
12677     x_msg_count         NUMBER;
12678     x_msg_data          VARCHAR2(256);
12679 
12680       --cursor to find...
12681     Cursor l_csr( ChrId NUMBER) IS
12682     SELECT NVL(chr.TOT_CL_TRANSFER_AMT,0)
12683     FROM   OKL_K_HEADERS  chr
12684     WHERE  chr.ID       = ChrId;
12685 
12686     l_amount number := 0;
12687 
12688   BEGIN
12689 
12690       open l_csr(ChrId => p_contract_id);
12691       fetch l_csr into l_amount;
12692       close l_csr;
12693 
12694       RETURN l_amount;
12695 
12696    EXCEPTION
12697 
12698       WHEN OKL_API.G_EXCEPTION_ERROR THEN
12699         RETURN NULL;
12700 
12701         WHEN OTHERS THEN
12702         Okl_Api.SET_MESSAGE(
12703           p_app_name     => G_APP_NAME,
12704           p_msg_name     => G_UNEXPECTED_ERROR,
12705           p_token1       => G_SQLCODE_TOKEN,
12706           p_token1_value => SQLCODE,
12707           p_token2       => G_SQLERRM_TOKEN,
12708           p_token2_value => SQLERRM);
12709        RETURN NULL;
12710   END rollover_fee;
12711 
12712 --------------------------------------------------------------------------------
12713 
12714     -- Start of Comments
12715     -- Created By:    cklee
12716     -- Function Name: tot_net_transfers
12717     -- Description:   Returns the credit line total net transfers (T and A)
12718     --
12719     -- Dependencies:
12720     -- Parameters: contract id, line id
12721     -- Version: 1.0
12722     -- End of Comments
12723 
12724 --------------------------------------------------------------------------------
12725   FUNCTION tot_net_transfers(
12726                             p_contract_id       IN NUMBER
12727                            ,p_contract_line_id  IN NUMBER
12728                           )
12729   RETURN NUMBER  IS
12730 
12731     l_api_name          CONSTANT VARCHAR2(30) := 'TOT_NET_TRANSFERS';
12732     l_api_version       CONSTANT NUMBER       := 1;
12733     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
12734     x_msg_count         NUMBER;
12735     x_msg_data          VARCHAR2(256);
12736 
12737       --cursor to find...
12738     Cursor l_csr( ChrId NUMBER) IS
12739     SELECT NVL(chr.TOT_CL_NET_TRANSFER_AMT,0)
12740     FROM   OKL_K_HEADERS  chr
12741     WHERE  chr.ID       = ChrId;
12742 
12743     l_amount number := 0;
12744 
12745   BEGIN
12746 
12747       open l_csr(ChrId => p_contract_id);
12748       fetch l_csr into l_amount;
12749       close l_csr;
12750 
12751       RETURN l_amount;
12752 
12753    EXCEPTION
12754 
12755       WHEN OKL_API.G_EXCEPTION_ERROR THEN
12756         RETURN NULL;
12757 
12758         WHEN OTHERS THEN
12759         Okl_Api.SET_MESSAGE(
12760           p_app_name     => G_APP_NAME,
12761           p_msg_name     => G_UNEXPECTED_ERROR,
12762           p_token1       => G_SQLCODE_TOKEN,
12763           p_token1_value => SQLCODE,
12764           p_token2       => G_SQLERRM_TOKEN,
12765           p_token2_value => SQLERRM);
12766        RETURN NULL;
12767   END tot_net_transfers;
12768 --end:cklee
12769 
12770 
12771 ------------------------------------------------------------------------------
12772   -- Start of Comments
12773   -- Created By:    rmunjulu 3816891
12774   -- Function Name: line_future_rent
12775   -- Description:   Returns the future rent amount for a given contract line
12776   -- Dependencies:  OKL building blocks AMTX and AMUV
12777   -- Parameters:    IN:  p_contract_id, p_line_id
12778   --                     stream_type_id (stored in g_additional_parameters(1))
12779   --                OUT: amount
12780   -- Version:       1.0
12781   -- History      : 31-Dec-2004 PAGARG Bug# 4097591
12782   --              : UDS impact to obtain stream type id
12783   --              : 15-Oct-07 prasjain Bug 6030917
12784   --              : Added proration logic
12785   -- End of Commnets
12786 ------------------------------------------------------------------------------
12787 
12788 FUNCTION line_future_rent (
12789 	p_contract_id		IN NUMBER,
12790 	p_contract_line_id	IN NUMBER)
12791 	RETURN NUMBER IS
12792 
12793     -- Get future Streams
12794     -- Guru added trx_date
12795 
12796 	CURSOR l_future_stream_csr (
12797 			cp_contract_id			NUMBER,
12798 			cp_contract_line_id		NUMBER,
12799 			cp_stream_type_id		NUMBER,
12800             cp_trx_date             DATE) IS
12801 	SELECT	SUM (NVL (ste.amount, 0))	amount_due
12802 	--FROM	okl_streams			stm,
12803 	FROM	okl_streams_rep_v		stm,
12804                 okl_strm_type_b     sty,
12805 			    okl_strm_elements		ste
12806 	WHERE	stm.khr_id			= cp_contract_id
12807 	AND	stm.kle_id			= cp_contract_line_id
12808 	AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
12809 	AND	stm.active_yn			= 'Y'
12810 	AND	stm.say_code			= 'CURR'
12811 	AND	ste.stm_id			= stm.id
12812 	AND	NVL (ste.amount, 0)	<> 0
12813   -- Added the following 3 conditions to restrict the unbilled receivables calculation to only
12814   -- billable streams
12815     AND sty.id              = stm.sty_id
12816     AND sty.billable_yn     = 'Y'
12817     AND ste.STREAM_ELEMENT_DATE > nvl(cp_trx_date,sysdate);   -- gkadarka added this null check
12818 
12819      -- Get future Streams for Reporting product
12820 	CURSOR l_future_reporting_stream_csr (
12821 			cp_contract_id			NUMBER,
12822 			cp_contract_line_id		NUMBER,
12823 			cp_stream_type_id		NUMBER,
12824             cp_trx_date             DATE) IS
12825 	SELECT	SUM (NVL (ste.amount, 0))	amount_due
12826 	FROM	okl_streams			stm,
12827                 okl_strm_type_b     sty, --  Added this table to get the billable_yn flag
12828 			    okl_strm_elements		ste
12829 	WHERE	stm.khr_id			= cp_contract_id
12830 	AND	stm.kle_id			= cp_contract_line_id
12831 	AND	stm.sty_id			= NVL (cp_stream_type_id, stm.sty_id)
12832 	AND	stm.active_yn			= 'N'  -- reporting strems are inactive
12833 	AND	stm.say_code			= 'CURR'  -- reporting streams are current
12834 	AND	ste.stm_id			= stm.id
12835 	--AND	ste.date_billed			IS NULL  -- reporting streams never get billed
12836 	AND	NVL (ste.amount, 0)	<> 0
12837     AND sty.id              = stm.sty_id
12838     AND sty.billable_yn     = 'Y' -- reporting streams are billable
12839     AND stm.purpose_code = 'REPORT'
12840     AND ste.STREAM_ELEMENT_DATE > nvl(cp_trx_date,sysdate);  -- gkadarka added this null check
12841 
12842     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
12843     l_trx_date   DATE;
12844 
12845 	l_result_amount		NUMBER		:= 0;
12846 	l_stream_type_id	NUMBER;
12847 
12848 	-- rmunjulu
12849 	l_quote_eff_date DATE;
12850 	l_term_date DATE;
12851 	l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
12852 
12853     -- Start : Bug 6030917 : prasjain
12854     --new cursor introduced for prorating and rounding the stream element amount
12855     --incase of partial unit termination
12856           CURSOR stream_element_csr (
12857                           cp_contract_id                        NUMBER,
12858                           cp_contract_line_id                NUMBER,
12859                           cp_stream_type_id                NUMBER,
12860               cp_trx_date             DATE) IS
12861           SELECT nvl(ste.amount, 0)        amount
12862           FROM        okl_streams                        stm,
12863           okl_strm_type_b     sty,
12864                             okl_strm_elements                ste
12865           WHERE        stm.khr_id                        = cp_contract_id
12866           AND          stm.kle_id                        = cp_contract_line_id
12867           AND          stm.sty_id                        = NVL (cp_stream_type_id, stm.sty_id)
12868           AND          stm.active_yn                        = 'Y'
12869           AND          stm.say_code                        = 'CURR'
12870           AND          ste.stm_id                        = stm.id
12871           AND          NVL (ste.amount, 0)        <> 0
12872     AND   sty.id              = stm.sty_id
12873     AND   sty.billable_yn     = 'Y'
12874     AND   ste.stream_element_date > nvl(cp_trx_date,sysdate);
12875 
12876     stream_element_rec stream_element_csr%ROWTYPE;
12877     --currency code cursor added to derive currency code for the particular line
12878     --which will be used for rounding amount
12879     CURSOR currency_code_csr (p_kle_id     NUMBER ) IS
12880     SELECT currency_code
12881     FROM   okc_k_lines_b
12882     WHERE  id = p_kle_id;
12883     --declaring proration factor , currency code and rounding rule variables
12884     l_proration_factor           NUMBER;
12885     l_currency_code              okc_k_lines_b.currency_code%TYPE;
12886     l_parent_strm_amt               NUMBER;
12887     l_parent_strm_rounded_amt       NUMBER;
12888     l_parent_strm_rounded_tot_amt   NUMBER;
12889     --declaring other local variables
12890     i                           NUMBER;
12891     l_api_version               NUMBER := 1;
12892     l_init_msg_list             VARCHAR2(1) := OKL_API.G_FALSE;
12893     l_msg_count                 NUMBER;
12894     l_msg_data                  VARCHAR2(100);
12895     -- End : Bug 6030917 : prasjain
12896 
12897     --Bug 10075141
12898     CURSOR get_pricing_det_csr(p_khr_id IN NUMBER) IS
12899     SELECT gts.pricing_engine,
12900            gts.isg_arrears_pay_dates_option
12901       FROM okl_k_headers khr,
12902            okl_products pdt,
12903            okl_ae_tmpt_sets_all aes,
12904            okl_st_gen_tmpt_sets_all gts
12905      WHERE khr.pdt_id = pdt.id
12906        AND pdt.aes_id = aes.id
12907        AND aes.gts_id = gts.id
12908        AND khr.id = p_khr_id;
12909 
12910     CURSOR get_pmnt_arrear_flag(p_khr_id IN NUMBER, p_kle_id IN NUMBER, p_sty_id IN NUMBER) IS
12911     SELECT NVL(rl_lasll.rule_information10,'N')
12912       FROM okc_rules_b rl_lasll,
12913            okc_rule_groups_b rgp,
12914            okc_rules_b rl_laslh
12915      WHERE rl_lasll.rule_information_category = 'LASLL'
12916        AND rl_lasll.rgp_id = rgp.id
12917        AND rl_lasll.object2_id1 = rl_laslh.id
12918        AND rl_laslh.rule_information_category = 'LASLH'
12919        AND rl_laslh.rgp_id = rgp.id
12920        AND rl_laslh.object1_id1 = TO_CHAR(p_sty_id)
12921        AND rgp.rgd_code = 'LALEVL'
12922        AND rgp.cle_id = p_kle_id
12923        AND rgp.dnz_chr_id = p_khr_id
12924        AND ROWNUM < 2;
12925 
12926     CURSOR get_pricing_name_csr (p_sty_id IN NUMBER, p_khr_id NUMBER) IS
12927     SELECT pricing_name
12928       FROM okl_strm_tmpt_lines_uv stl,
12929            okc_k_headers_b chr,
12930            okl_k_headers khr
12931      WHERE chr.id = p_khr_id
12932        AND khr.id = chr.id
12933        AND stl.primary_yn = 'Y'
12934        AND stl.pdt_id = khr.pdt_id
12935        AND (stl.start_date <= chr.start_date)
12936        AND (stl.end_date >= chr.start_date OR stl.end_date IS NULL)
12937        AND primary_sty_id = p_sty_id;
12938 
12939     l_pricing_name            OKL_ST_GEN_TMPT_LNS_ALL.pricing_name%TYPE;
12940     l_pmnt_arrear_flag        VARCHAR2(1);
12941     l_term_date_flag          VARCHAR2(1);
12942     l_pricing_engine          OKL_ST_GEN_TMPT_SETS.pricing_engine%TYPE;
12943     l_int_arrears_pay_option  OKL_ST_GEN_TMPT_SETS.isg_arrears_pay_dates_option%TYPE;
12944     --end Bug 10075141
12945 
12946 -- 13246259 get contract end date
12947 CURSOR get_chr_end_date_csr (p_khr_id IN NUMBER) IS
12948 SELECT end_date
12949 FROM OKC_K_HEADERS_ALL_B
12950 WHERE id = p_khr_id;
12951 
12952 -- 13246259
12953 l_k_end_date DATE;
12954 
12955 
12956 BEGIN
12957     --PAGARG 31-Dec-2004 Bug# 4097591 Start
12958     --UDS impact. Obtain stream type id and pass it to cursor
12959 
12960     OKL_STREAMS_UTIL.get_primary_stream_type(p_contract_id,
12961                                              'RENT',
12962                                              l_return_status,
12963                                              l_stream_type_id);
12964 
12965     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
12966     THEN
12967         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12968     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
12969     THEN
12970         RAISE OKL_API.G_EXCEPTION_ERROR;
12971     END IF;
12972     --PAGARG 31-Dec-2004 Bug# 4097591 End
12973 
12974 	-- ********************************************
12975 	-- Extract Stream Type Id from global variables
12976 	-- ********************************************
12977 
12978     --Validate additional parameters availability
12979     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
12980       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
12981 	  LOOP
12982         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
12983            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
12984                 l_rep_prod_streams_yn := okl_execute_formula_pub.g_additional_parameters(I).value;
12985         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
12986            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
12987                 l_trx_date := to_date(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
12988         -- rmunjulu -- this formula is called for amortization which will pass quote eff date
12989         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_effective_from_date'
12990            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
12991                 l_quote_eff_date := to_date(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
12992 
12993           -- Start : Bug 6030917 : prasjain
12994           --added for getting the proration factor for partial unit termination
12995           ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'proration_factor'
12996              AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
12997                   l_proration_factor := to_number(okl_execute_formula_pub.g_additional_parameters(I).value);
12998           -- End : Bug 6030917 : prasjain
12999 
13000         END IF;
13001       END LOOP;
13002 	ELSE
13003       l_rep_prod_streams_yn := 'N';
13004 
13005 	END IF;
13006 
13007     IF l_rep_prod_streams_yn = 'Y' THEN
13008        IF l_trx_date IS NULL THEN
13009        -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
13010           Okl_Api.Set_Message(p_app_name     => g_app_name,
13011                               p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
13012           RAISE Okl_Api.G_EXCEPTION_ERROR;
13013        END IF;
13014     END IF;
13015 
13016     -- rmunjulu
13017     IF l_quote_eff_date IS NULL THEN
13018          l_term_date := SYSDATE;
13019     ELSE
13020          l_term_date := l_quote_eff_date;
13021     END IF;
13022 
13023     -- 13246259 Added get the contract end date to check if expiration
13024     OPEN get_chr_end_date_csr (p_contract_id);
13025     FETCH get_chr_end_date_csr INTO l_k_end_date;
13026     CLOSE get_chr_end_date_csr;
13027 
13028     IF TRUNC(l_term_date) >=  TRUNC(l_k_end_date) THEN  -- 13246259 Added logic to return 0 in case of exipration
13029 
13030      l_result_amount := 0;
13031 
13032     ELSE -- From Termination quote
13033 
13034     --Bug 10075141
13035     OPEN get_pricing_det_csr(p_khr_id => p_contract_id);
13036     FETCH get_pricing_det_csr INTO l_pricing_engine, l_int_arrears_pay_option;
13037     CLOSE get_pricing_det_csr;
13038 
13039     l_pricing_name := NULL;
13040     IF l_pricing_engine = 'EXTERNAL' THEN
13041       OPEN get_pricing_name_csr(p_sty_id => l_stream_type_id,
13042                                 p_khr_id => p_contract_id);
13043       FETCH get_pricing_name_csr INTO l_pricing_name;
13044       CLOSE get_pricing_name_csr;
13045     END IF;
13046 
13047     l_term_date_flag := 'N';
13048     IF(
13049        ((l_pricing_engine = 'EXTERNAL') AND (NVL(l_pricing_name,'XXX') = 'Rent'
13050 OR NVL(l_pricing_name, 'XXX') = 'Rent without Down Payments')) OR
13051        ((l_pricing_engine = 'INTERNAL') AND (NVL(l_int_arrears_pay_option,'XXX') = 'FIRST_DAY_OF_NEXT_PERIOD'))
13052         ) THEN
13053        l_term_date_flag := 'Y';
13054     END IF;
13055     --end Bug 10075141
13056 
13057 	-- ****************
13058 	-- Calculate result
13059 	-- ****************
13060 
13061     IF l_rep_prod_streams_yn = 'Y' THEN  -- MGAAP 7263041
13062        --OPEN  l_future_reporting_stream_csr(p_contract_id, p_contract_line_id, l_stream_type_id,l_trx_date );
13063        OPEN  l_future_stream_csr(p_contract_id, p_contract_line_id, l_stream_type_id,l_trx_date );
13064        FETCH l_future_stream_csr INTO  l_result_amount;
13065        CLOSE l_future_stream_csr;
13066     ELSE
13067 
13068         --Bug 10075141
13069         l_pmnt_arrear_flag := 'N';
13070         OPEN get_pmnt_arrear_flag(p_khr_id => p_contract_id,
13071                                   p_kle_id => p_contract_line_id,
13072                                   p_sty_id => l_stream_type_id);
13073         FETCH  get_pmnt_arrear_flag INTO l_pmnt_arrear_flag;
13074         CLOSE  get_pmnt_arrear_flag;
13075 
13076         IF((l_pmnt_arrear_flag = 'Y') AND (l_term_date_flag = 'Y')) THEN
13077           l_term_date := l_term_date + 1;
13078         END IF;
13079         --end Bug 10075141
13080 
13081 -- Guru added trx_date here
13082         -- Start : Bug 6030917 : prasjain
13083         --added for prorating incase of partial unit termination
13084         IF nvl(l_proration_factor,1) = 1 THEN
13085 
13086 	   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
13087 	   FETCH l_future_stream_csr INTO l_result_amount;
13088 	   CLOSE l_future_stream_csr;
13089        ELSE
13090          --get curerncy code for the line
13091           OPEN  currency_code_csr(p_contract_line_id);
13092           FETCH currency_code_csr INTO l_currency_code ;
13093           CLOSE currency_code_csr;
13094           --initializing l_parent_strm_rounded_tot_amt variable with 0
13095           l_parent_strm_rounded_tot_amt := 0;
13096 
13097           FOR stream_element_rec IN stream_element_csr(p_contract_id,
13098                                                        p_contract_line_id,
13099                                                        l_stream_type_id,
13100                                                        l_term_date)
13101           LOOP
13102              --prorate the amount, to derive the parent stream amount
13103               l_parent_strm_amt := stream_element_rec.amount * l_proration_factor;
13104              --round amount with streams option for paren stream element amounts
13105              okl_accounting_util.round_amount(
13106                          p_api_version    => l_api_version,
13107                          p_init_msg_list  => l_init_msg_list,
13108                          x_return_status  => l_return_status,
13109                          x_msg_count      => l_msg_count,
13110                          x_msg_data       => l_msg_data,
13111                          p_amount         => l_parent_strm_amt,
13112                          p_currency_code  => l_currency_code,
13113                          p_round_option   => 'STM',
13114                          x_rounded_amount => l_parent_strm_rounded_amt
13115                          );
13116              IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
13117                RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
13118              ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
13119                RAISE OKL_API.G_EXCEPTION_ERROR;
13120              END IF;
13121              -- calculate the parent stream rounded total
13122              l_parent_strm_rounded_tot_amt := l_parent_strm_rounded_tot_amt
13123                                                  + l_parent_strm_rounded_amt;
13124 
13125           END LOOP;
13126             l_result_amount := l_parent_strm_rounded_tot_amt;
13127         END IF;
13128        -- End : Bug 6030917 : prasjain
13129     END IF;
13130   END IF; -- Added for 13246259
13131 
13132 	RETURN NVL (l_result_amount, 0);
13133 
13134 EXCEPTION
13135     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
13136         -- Close open cursors
13137         IF l_future_stream_csr%ISOPEN THEN
13138             CLOSE l_future_stream_csr;
13139         END IF;
13140 
13141         IF l_future_reporting_stream_csr%ISOPEN THEN
13142             CLOSE l_future_reporting_stream_csr;
13143         END IF;
13144 
13145          -- Start : Bug 6030917 : prasjain
13146           IF currency_code_csr%ISOPEN THEN
13147               CLOSE currency_code_csr;
13148           END IF;
13149           IF stream_element_csr%ISOPEN THEN
13150               CLOSE stream_element_csr;
13151           END IF;
13152           -- End : Bug 6030917 : prasjain
13153 
13154         RETURN NULL;
13155 
13156 	WHEN OTHERS THEN
13157 		-- Close open cursors
13158         IF l_future_stream_csr%ISOPEN THEN
13159             CLOSE l_future_stream_csr;
13160         END IF;
13161 
13162         IF l_future_reporting_stream_csr%ISOPEN THEN
13163             CLOSE l_future_reporting_stream_csr;
13164         END IF;
13165 
13166           -- Start : Bug 6030917 : prasjain
13167           IF currency_code_csr%ISOPEN THEN
13168               CLOSE currency_code_csr;
13169           END IF;
13170           IF stream_element_csr%ISOPEN THEN
13171               CLOSE stream_element_csr;
13172           END IF;
13173           -- End : Bug 6030917 : prasjain
13174 
13175 		-- store SQL error message on message stack for caller
13176 		OKL_API.SET_MESSAGE (
13177 			p_app_name	=> OKL_API.G_APP_NAME,
13178 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
13179 			p_token1	=> 'SQLCODE',
13180 			p_token1_value	=> SQLCODE,
13181 			p_token2	=> 'SQLERRM',
13182 			p_token2_value	=> SQLERRM);
13183 
13184 		RETURN NULL;
13185 
13186 END line_future_rent;
13187 
13188 ------------------------------------------------------------------------------
13189   -- Start of Comments
13190   -- Created By:    rmunjulu 3816891
13191   -- Function Name: line_future_income
13192   -- Description:   Returns the future income amount for a given contract line
13193   -- Dependencies:  OKL building blocks AMTX and AMUV
13194   -- Parameters:    IN:  p_contract_id, p_line_id
13195   --                     stream_type_id (stored in g_additional_parameters(1))
13196   --                OUT: amount
13197   -- Version:       1.0
13198   -- History      : 31-Dec-2004 PAGARG Bug# 4097591
13199   --              : UDS impact to obtain stream type id
13200   --              : 11-May-2006 gboomina Bug 5215019
13201   --              : check CHK_ACCRUAL_PREVIOUS_MNTH_YN
13202   --              : 15-Oct-07 prasjain Bug 6030917
13203   --              : Added proration logic
13204   --              : sechawla 05-dec-07 6671849 : Modified the dependent stream type check
13205   -- End of Commnets
13206 ------------------------------------------------------------------------------
13207 
13208 FUNCTION line_future_income (
13209 	p_contract_id		IN NUMBER,
13210 	p_contract_line_id	IN NUMBER)
13211 	RETURN NUMBER IS
13212 
13213 	l_unearned_income	NUMBER 	:= 0;
13214 -- 26-Aug-2004 Guru declared the following variables for bug 3849355
13215     l_term_date DATE;
13216     l_period_name VARCHAR2(30);
13217     l_start_date DATE;
13218     l_end_date DATE;
13219 
13220 	--Code changed by rvaduri for bug 3487920
13221 	--This code will return the Pre-tax income at line level
13222 	-- and will return values only contracts booked using ISG.
13223 -- Guru Added trx date
13224     --PAGARG 31-Dec-2004 Bug# 4097591
13225     --Instead of using stream name, join the sty id passed to cursor
13226     CURSOR line_csr (c_contract_line_id      NUMBER,
13227                      cp_trx_date             DATE,
13228                      p_sty_id                NUMBER) IS
13229       SELECT NVL(SUM(sel.amount),0)
13230       FROM okl_strm_elements sel,
13231            --okl_streams stm, MGAAP 7263041
13232            okl_streams_rep_v stm,
13233            okl_strm_type_v sty
13234       WHERE sty.id = p_sty_id
13235         AND stm.sty_id = sty.id
13236         AND stm.say_code = 'CURR'
13237         AND stm.active_yn = 'Y'
13238         AND (stm.purpose_code IS NULL OR stm.purpose_code='REPORT')
13239         AND stm.kle_id = c_contract_line_id
13240         AND sel.stm_id = stm.id
13241         -- guru Added
13242     AND sel.STREAM_ELEMENT_DATE >  nvl(cp_trx_date,sysdate);    -- gkadarka added this null check
13243 
13244     l_rep_prod_streams_yn   VARCHAR2(1) := 'N';
13245     l_trx_date   DATE;
13246 
13247     -- Created this cursor to evaluat ereporting streams based upon additional parameters
13248     --PAGARG 31-Dec-2004 Bug# 4097591
13249     --Instead of using stream name, join the sty id passed to cursor
13250     CURSOR line_reporting_csr (c_contract_line_id IN NUMBER, cp_trx_date IN DATE, p_sty_id NUMBER) IS
13251       SELECT NVL(SUM(sel.amount),0)
13252       FROM okl_strm_elements sel,
13253            --okl_streams stm, MGAAP 7263041
13254            okl_streams_rep_v stm,
13255            okl_strm_type_v sty
13256       WHERE sty.id = p_sty_id
13257         AND stm.sty_id = sty.id
13258         AND stm.say_code = 'CURR' -- reporting streams are current
13259         AND stm.active_yn = 'N'  -- reporting strems are inactive
13260         AND stm.purpose_code IS NULL
13261      --   AND	sel.date_billed	IS NULL  -- reporting streams never get billed
13262         --AND sty.billable_yn     = 'N'  -- PRE-TAX streams are not billable
13263         AND stm.kle_id = c_contract_line_id
13264         AND sel.stm_id = stm.id
13265         AND stm.purpose_code = 'REPORT'
13266         AND sel.STREAM_ELEMENT_DATE >  nvl(cp_trx_date,sysdate);   -- gkadarka added this null check
13267 
13268      -- gboomina Bug 5215019 - Start
13269      CURSOR check_accrual_previous_csr IS
13270        SELECT NVL(CHK_ACCRUAL_PREVIOUS_MNTH_YN,'N')
13271        FROM OKL_SYSTEM_PARAMS;
13272 
13273        l_accrual_previous_mnth_yn VARCHAR2(3);
13274        l_accrual_adjst_date DATE;
13275      -- gboomina Bug 5215019 - End
13276 
13277     -- rmunjulu
13278     l_quote_eff_date DATE;
13279 	l_stream_type_id	NUMBER;
13280 	l_return_status     VARCHAR2(3) := Okl_Api.G_RET_STS_SUCCESS;
13281 
13282     l_debug_unearned_income        NUMBER         := 0;
13283     -- Start : Bug 6030917 : prasjain
13284     --new cursor introduced for prorating and rounding the stream element amount
13285     --incase of partial unit termination
13286     CURSOR stream_element_csr (c_contract_line_id      NUMBER,
13287                                cp_trx_date             DATE,
13288                                p_sty_id                NUMBER) IS
13289     SELECT NVL(sel.amount,0) amount
13290     FROM okl_strm_elements sel,
13291          --okl_streams stm, MGAAP 7263041
13292          okl_streams_rep_v stm,
13293          okl_strm_type_v sty
13294     WHERE sty.id = p_sty_id
13295       AND stm.sty_id = sty.id
13296       AND stm.say_code = 'CURR'
13297       AND stm.active_yn = 'Y'
13298       AND (stm.purpose_code IS NULL OR stm.purpose_code='REPORT')
13299       AND stm.kle_id = c_contract_line_id
13300       AND sel.stm_id = stm.id
13301       AND sel.STREAM_ELEMENT_DATE >  nvl(cp_trx_date,sysdate);
13302     stream_element_rec stream_element_csr%ROWTYPE;
13303     --currency code cursor added to derive currency code for the particular line
13304     --which will be used for rounding amount
13305     CURSOR currency_code_csr (p_kle_id     NUMBER ) IS
13306     SELECT currency_code
13307     FROM   okc_k_lines_b
13308     WHERE  id = p_kle_id;
13309     --declaring proration factor , currency code and rounding rule variables
13310     l_proration_factor           NUMBER;
13311     l_currency_code              okc_k_lines_b.currency_code%TYPE;
13312     l_parent_strm_amt               NUMBER;
13313     l_parent_strm_rounded_amt       NUMBER;
13314     l_parent_strm_rounded_tot_amt   NUMBER;
13315     --declaring other local variables
13316     l_api_version               NUMBER := 1;
13317     l_init_msg_list             VARCHAR2(1) := OKL_API.G_FALSE;
13318     l_msg_count                 NUMBER;
13319     l_msg_data                  VARCHAR2(100);
13320     -- End : Bug 6030917 : prasjain
13321 
13322     lx_rep_product_id               OKL_PRODUCTS_V.ID%TYPE;
13323 
13324 -- 13246259 get contract end date
13325 CURSOR get_chr_end_date_csr (p_khr_id IN NUMBER) IS
13326 SELECT end_date
13327 FROM OKC_K_HEADERS_ALL_B
13328 WHERE id = p_khr_id;
13329 
13330 -- 13246259
13331 l_k_end_date DATE;
13332 
13333 BEGIN
13334 
13335    --  Validate additional parameters availability
13336     IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
13337       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
13338 	  LOOP
13339         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'REP_PRODUCT_STRMS_YN'
13340            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
13341                 l_rep_prod_streams_yn := okl_execute_formula_pub.g_additional_parameters(I).value;
13342         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'OFF_LSE_TRX_DATE'
13343            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
13344                 l_trx_date := to_date(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
13345         -- rmunjulu -- this formula is called for amortization which will pass quote eff date
13346         ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_effective_from_date'
13347            AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
13348                 l_quote_eff_date := to_date(okl_execute_formula_pub.g_additional_parameters(I).value, 'MM/DD/YYYY');
13349 
13350           -- Start : Bug 6030917 : prasjain
13351           --added for getting the proration factor for partial unit termination
13352           ELSIF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'proration_factor'
13353              AND  okl_execute_formula_pub.g_additional_parameters(I).value IS NOT NULL THEN
13354                   l_proration_factor := to_number(okl_execute_formula_pub.g_additional_parameters(I).value);
13355           -- End : Bug 6030917 : prasjain
13356 
13357         END IF;
13358       END LOOP;
13359 	ELSE
13360 
13361       l_rep_prod_streams_yn := 'N';
13362 
13363 	END IF;
13364 
13365     -- sechawla 05-dec-07 6671849 -- START
13366 	IF l_rep_prod_streams_yn = 'Y' THEN
13367 
13368 	      get_reporting_product(
13369                                   p_api_version           => l_api_version,
13370            		 	              p_init_msg_list         => OKC_API.G_FALSE,
13371            			              x_return_status         => l_return_status,
13372            			              x_msg_count             => l_msg_count,
13373            			              x_msg_data              => l_msg_data,
13374                                   p_contract_id 		  => p_contract_id,
13375                                   x_rep_product_id        => lx_rep_product_id);
13376 
13377          OKL_STREAMS_UTIL.get_dependent_stream_type(p_khr_id            => p_contract_id,
13378                                                p_product_id            => lx_rep_product_id,
13379                                                p_primary_sty_purpose   => 'RENT',
13380                                                p_dependent_sty_purpose => 'LEASE_INCOME',
13381                                                x_return_status         => l_return_status,
13382                                                x_dependent_sty_id      => l_stream_type_id);
13383     IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)
13384     THEN
13385         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
13386     ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR)
13387     THEN
13388         RAISE OKL_API.G_EXCEPTION_ERROR;
13389     END IF;
13390     ELSE
13391     -- sechawla 05-dec-07 6671849 -- START
13392        --PAGARG 31-Dec-2004 Bug# 4097591 Start
13393        --UDS impact. Obtain stream type id and pass it to cursor
13394        OKL_STREAMS_UTIL.get_dependent_stream_type(p_khr_id                => p_contract_id,
13395                                                p_primary_sty_purpose   => 'RENT',
13396                                                p_dependent_sty_purpose => 'LEASE_INCOME',
13397                                                x_return_status         => l_return_status,
13398                                                x_dependent_sty_id      => l_stream_type_id);
13399 
13400        IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
13401           RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
13402        ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
13403           RAISE OKL_API.G_EXCEPTION_ERROR;
13404        END IF;
13405        --PAGARG 31-Dec-2004 Bug# 4097591 End
13406 
13407     END IF; -- sechawla 05-dec-07 6671849 -- added
13408 
13409     IF l_rep_prod_streams_yn = 'Y' THEN
13410        IF l_trx_date IS NULL THEN
13411        -- Can not calculate Net Investment for the reporting product as the transaction date is missing.
13412           Okl_Api.Set_Message(p_app_name     => g_app_name,
13413                               p_msg_name     => 'OKL_AM_AMORT_NO_TRX_DATE');
13414           RAISE Okl_Api.G_EXCEPTION_ERROR;
13415        END IF;
13416     END IF;
13417 
13418  -- 26-Aug-2004 3849355 Guru added the following code to get current accural period end date
13419 
13420        /* -- rmunjulu
13421       IF l_trx_date IS NULL THEN
13422             l_term_date := SYSDATE;
13423        ELSE
13424            l_term_date := l_trx_date;
13425 
13426        END IF;
13427        */
13428 
13429     -- rmunjulu
13430     IF l_quote_eff_date IS NULL THEN
13431          l_term_date := SYSDATE;
13432     ELSE
13433          l_term_date := l_quote_eff_date;
13434     END IF;
13435 
13436     -- 13246259 Added get the contract end date to check if expiration
13437     OPEN get_chr_end_date_csr (p_contract_id);
13438     FETCH get_chr_end_date_csr INTO l_k_end_date;
13439     CLOSE get_chr_end_date_csr;
13440 
13441     IF TRUNC(l_term_date) >=  TRUNC(l_k_end_date) THEN  -- 13246259 Added logic to return 0 in case of exipration
13442 
13443      l_unearned_income := 0;
13444 
13445     ELSE -- From Termination quote
13446     -- gboomina Bug 5215019 - Start
13447     -- Based on CHK_ACCRUAL_PREVIOUS_MNTH_YN setup check accruals
13448     -- till quote eff date OR previous month last date
13449     OPEN  check_accrual_previous_csr;
13450     FETCH check_accrual_previous_csr INTO l_accrual_previous_mnth_yn;
13451     CLOSE check_accrual_previous_csr;
13452 
13453     -- asahoo bug 13259692 derive the period in which termination is falling first and then
13454     -- derive the prior or current period based on Check_Accrual_Till_Previous_Month flag
13455 
13456     okl_accounting_util.get_period_info(l_term_date,l_period_name, l_start_date,l_end_date);
13457 
13458     -- asahoo bug 13259692 now that we have derived the GL Period use the GL Period Start Date or End Date to derive the Future Income
13459 
13460     IF nvl(l_accrual_previous_mnth_yn,'N') = 'N' THEN
13461       --l_accrual_adjst_date :=   l_term_date;
13462       -- asahoo bug 13259692 NIV will be greater than period end date
13463       l_accrual_adjst_date := l_end_date;  -- asahoo bug 13259692
13464     ELSE
13465       --l_accrual_adjst_date :=   LAST_DAY(TRUNC(l_term_date, 'MONTH')-1);
13466       -- asahoo bug 13259692 NIV will be greater than period start_date - 1
13467       l_accrual_adjst_date := l_start_date - 1;  -- asahoo bug 13259692
13468     END IF;
13469 
13470     -- asahoo bug 13259692 Now start using Accrual Adjust Date
13471     --okl_accounting_util.get_period_info(l_accrual_adjst_date,l_period_name, l_start_date,l_end_date);  -- asahoo bug 13259692 moved above
13472     -- gboomina Bug 5215019 - End
13473 
13474     --check if streams required for reporting  product
13475     IF l_rep_prod_streams_yn = 'Y' THEN
13476        OKL_STREAMS_SEC_PVT.SET_REPO_STREAMS; --MGAAP 7263041
13477        --PAGARG 31-Dec-2004 Bug# 4097591, Pass stream type id to cursor
13478        --OPEN  line_reporting_csr(p_contract_line_id, l_end_date, l_stream_type_id);   -- now passing l_end_date 26-Aug-2004 3849355
13479        --OPEN  line_csr(p_contract_line_id, l_end_date, l_stream_type_id);   -- now passing l_end_date 26-Aug-2004 3849355
13480        OPEN  line_csr(p_contract_line_id, l_accrual_adjst_date, l_stream_type_id);   -- asahoo now passing l_accrual_adjst_date bug 13259692
13481        FETCH line_csr INTO l_unearned_income;
13482 	   CLOSE line_csr;
13483        OKL_STREAMS_SEC_PVT.RESET_REPO_STREAMS;
13484     ELSE
13485        OKL_STREAMS_SEC_PVT.RESET_REPO_STREAMS;
13486         -- Start : Bug 6030917 : prasjain
13487         --added for prorating incase of partial unit termination
13488 
13489         IF nvl(l_proration_factor,1) = 1 THEN
13490        --PAGARG 31-Dec-2004 Bug# 4097591, Pass stream type id to cursor
13491 	   --OPEN  line_csr(p_contract_line_id,l_end_date, l_stream_type_id);   -- now passing l_end_date 26-Aug-2004 3849355
13492            OPEN  line_csr(p_contract_line_id,l_accrual_adjst_date, l_stream_type_id); -- asahoo now passing l_accrual_adjst_date bug 13259692
13493 	   FETCH line_csr INTO l_unearned_income;
13494 	   CLOSE line_csr;
13495        ELSE
13496           --get curerncy code for the line
13497           OPEN  currency_code_csr(p_contract_line_id);
13498           FETCH currency_code_csr INTO l_currency_code ;
13499           CLOSE currency_code_csr;
13500           --initializing l_parent_strm_rounded_tot_amt variable with 0
13501           l_parent_strm_rounded_tot_amt := 0;
13502 
13503           --FOR stream_element_rec IN stream_element_csr(p_contract_line_id, l_end_date, l_stream_type_id)
13504           -- asahoo bug 13259692 Now start using Accrual Adjust Date
13505           FOR stream_element_rec IN stream_element_csr(p_contract_line_id, l_accrual_adjst_date, l_stream_type_id)
13506           LOOP
13507              --prorate the amount, to derive the parent stream amount
13508               l_parent_strm_amt := stream_element_rec.amount * l_proration_factor;
13509              --round amount with streams option for paren stream element amounts
13510              okl_accounting_util.round_amount(
13511                          p_api_version    => l_api_version,
13512                          p_init_msg_list  => l_init_msg_list,
13513                          x_return_status  => l_return_status,
13514                          x_msg_count      => l_msg_count,
13515                          x_msg_data       => l_msg_data,
13516                          p_amount         => l_parent_strm_amt,
13517                          p_currency_code  => l_currency_code,
13518                          p_round_option   => 'STM',
13519                          x_rounded_amount => l_parent_strm_rounded_amt
13520                          );
13521              IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
13522                RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
13523              ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
13524                RAISE OKL_API.G_EXCEPTION_ERROR;
13525     END IF;
13526 
13527             -- calculate the parent stream rounded total
13528              l_parent_strm_rounded_tot_amt := l_parent_strm_rounded_tot_amt
13529                                                  + l_parent_strm_rounded_amt;
13530 
13531           END LOOP;
13532             l_unearned_income := l_parent_strm_rounded_tot_amt;
13533         END IF;
13534        -- End : Bug 6030917 : prasjain
13535       END IF;
13536    END IF; -- Added for 13246259
13537 
13538 	RETURN NVL(l_unearned_income,0);
13539 
13540 EXCEPTION
13541 
13542     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
13543         IF line_csr%ISOPEN THEN
13544 			CLOSE line_csr;
13545 		END IF;
13546 
13547         IF line_reporting_csr%ISOPEN THEN
13548             CLOSE line_reporting_csr;
13549         END IF;
13550 
13551           -- Start : Bug 6030917 : prasjain
13552           IF currency_code_csr%ISOPEN THEN
13553               CLOSE currency_code_csr;
13554           END IF;
13555           IF stream_element_csr%ISOPEN THEN
13556               CLOSE stream_element_csr;
13557           END IF;
13558           -- End : Bug 6030917 : prasjain
13559 
13560         RETURN NULL;
13561 
13562 	WHEN OTHERS THEN
13563 
13564 		-- Close open cursors
13565 
13566 		IF line_csr%ISOPEN THEN
13567 			CLOSE line_csr;
13568 		END IF;
13569 
13570         IF line_reporting_csr%ISOPEN THEN
13571             CLOSE line_reporting_csr;
13572         END IF;
13573 
13574          -- Start : Bug 6030917 : prasjain
13575           IF currency_code_csr%ISOPEN THEN
13576               CLOSE currency_code_csr;
13577           END IF;
13578           IF stream_element_csr%ISOPEN THEN
13579               CLOSE stream_element_csr;
13580           END IF;
13581           -- End : Bug 6030917 : prasjain
13582 
13583 		-- store SQL error message on message stack for caller
13584 
13585 		OKL_API.SET_MESSAGE (
13586 			p_app_name	=> OKL_API.G_APP_NAME,
13587 			p_msg_name	=> 'OKL_CONTRACTS_UNEXPECTED_ERROR',
13588 			p_token1	=> 'SQLCODE',
13589 			p_token1_value	=> SQLCODE,
13590 			p_token2	=> 'SQLERRM',
13591 			p_token2_value	=> SQLERRM);
13592 
13593 		RETURN null;
13594 
13595 END line_future_income;
13596 
13597   -- Start of Comments
13598   -- Function Name: Asset_Residual
13599   -- Description:   Returns the Residual value for an asset
13600   -- Dependencies:
13601   -- Parameters:    IN:  p_contract_id, p_contract_line_id ,p_additional_paams(quote_id, kle_id)
13602   --                OUT: amount
13603   --                rmunjulu 3816891 created
13604   -- Version:       1.0
13605   -- End of Commnets
13606 ------------------------------------------------------------------------------
13607 
13608   FUNCTION asset_residual(
13609     p_khr_id IN NUMBER,
13610     p_kle_id IN NUMBER)
13611     RETURN NUMBER IS
13612 
13613      Expected_error EXCEPTION;
13614 
13615      -- get the quote type
13616      CURSOR get_qte_type_csr (p_quote_id IN NUMBER) IS
13617      SELECT  qte.qtp_code qtp_code
13618      FROM    okl_trx_quotes_v qte
13619      WHERE   qte.id = p_quote_id;
13620 
13621      -- get asset niv from quote lines
13622      CURSOR get_asset_niv_csr (p_kle_id IN NUMBER, p_quote_id IN NUMBER) IS
13623      SELECT nvl(tql.asset_value,0) residual_value
13624      FROM   okl_txl_quote_lines_v tql
13625      WHERE  tql.qte_id = p_quote_id
13626      AND    tql.qlt_code = 'AMCFIA'
13627      AND    tql.kle_id  = p_kle_id;
13628 
13629      -- get deprn cost from off-lease trn (SECHAWLA)
13630      CURSOR get_deprn_cost_csr (p_kle_id IN NUMBER) IS
13631      SELECT depreciation_cost, ID
13632      FROM   okl_txl_assets_b
13633      WHERE  kle_id = p_kle_id
13634      AND    tal_type = 'AML'
13635      AND    ROWNUM < 2;
13636 
13637      l_quote_id NUMBER;
13638      l_asset_residual NUMBER;
13639      l_quote_type VARCHAR2(300);
13640      l_residual NUMBER;
13641      l_corp_book_cost NUMBER;
13642 
13643   BEGIN
13644 
13645     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
13646        FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
13647        LOOP
13648          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'QUOTE_ID' THEN
13649             l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
13650          END IF;
13651        END LOOP;
13652     END IF;
13653 
13654     IF l_quote_id IS NULL
13655 	OR l_quote_id = OKL_API.G_MISS_NUM
13656 	OR p_khr_id IS NULL
13657 	OR p_khr_id = OKL_API.G_MISS_NUM
13658 	OR p_kle_id IS NULL
13659 	OR p_kle_id = OKL_API.G_MISS_NUM THEN
13660 
13661       RAISE Expected_error;
13662     END IF;
13663 
13664     -- get the quote type
13665     OPEN get_qte_type_csr(l_quote_id);
13666     FETCH get_qte_type_csr INTO l_quote_type;
13667     CLOSE get_qte_type_csr;
13668 
13669     IF l_quote_type IN ( 'TER_MAN_PURCHASE',
13670                          'TER_PURCHASE',
13671                          'TER_RECOURSE',
13672                          'TER_ROLL_PURCHASE') THEN
13673 
13674        -- Get the asset NIV from the quoted quote line
13675        FOR get_asset_niv_rec IN get_asset_niv_csr (p_kle_id,l_quote_id ) LOOP
13676 
13677            l_asset_residual := get_asset_niv_rec.residual_value;
13678        END LOOP;
13679 
13680     ELSE -- termination without purchase
13681 
13682        -- Get the Off-lease trn value
13683        FOR get_deprn_cost_rec IN get_deprn_cost_csr (p_kle_id ) LOOP
13684 
13685            l_asset_residual := get_deprn_cost_rec.depreciation_cost;
13686        END LOOP;
13687     END IF;
13688 
13689     IF l_asset_residual IS NULL THEN
13690 
13691       l_asset_residual := 0;
13692     END IF;
13693 
13694     RETURN l_asset_residual;
13695 
13696   EXCEPTION
13697 
13698     WHEN Expected_error THEN
13699 
13700     RETURN 0;
13701     WHEN OTHERS THEN
13702     -- store SQL error message on message stack for caller
13703     Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
13704                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
13705                         p_token1        => 'OKL_SQLCODE',
13706                         p_token1_value  => SQLCODE,
13707                         p_token2        => 'OKL_SQLERRM',
13708                         p_token2_value  => SQLERRM);
13709     RETURN NULL;
13710   END asset_residual;
13711 
13712   -- rfedane 4058562
13713   FUNCTION principal_balance_fee_line (p_contract_id      IN NUMBER,
13714                                        p_contract_line_id IN NUMBER) RETURN NUMBER IS
13715 
13716     l_fee_payment_id NUMBER;
13717     l_quote_eff_date DATE;
13718     l_date           DATE;
13719     l_prin_bal_id    NUMBER;
13720     l_balance        NUMBER;
13721     l_return_status  VARCHAR2(1);
13722     l_prog_name      VARCHAR2(61) := 'OKL_SEEDED_FUNCTIONS_PVT.principal_balance_fee_line';
13723 
13724     CURSOR c_balance (p_sty_id NUMBER, p_date DATE) IS
13725     SELECT
13726     sel.amount
13727     FROM
13728     okl_strm_elements sel,
13729     okl_streams stm
13730     WHERE
13731     stm.sty_id = p_sty_id
13732     AND   stm.khr_id = p_contract_id
13733     AND   stm.kle_id = p_contract_line_id
13734     AND   sel.stream_element_date <= p_date
13735     AND   stm.say_code = 'CURR'
13736     AND   stm.id = sel.stm_id
13737     ORDER BY sel.stream_element_date DESC;
13738 
13739   BEGIN
13740 
13741       IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
13742         FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST LOOP
13743 
13744         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.EXISTS(i) THEN
13745 
13746           IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'quote_effective_from_date'
13747              AND  okl_execute_formula_pub.g_additional_parameters(i).value IS NOT NULL THEN
13748              l_quote_eff_date := okl_execute_formula_pub.g_additional_parameters(i).value;
13749           END IF;
13750 
13751         END IF;
13752         END LOOP;
13753       END IF;
13754 
13755       IF l_quote_eff_date IS NOT NULL THEN
13756         l_date := l_quote_eff_date;
13757       ELSE
13758         l_date := TRUNC(SYSDATE);
13759       END IF;
13760 
13761       SELECT TO_NUMBER(laslh.object1_id1)
13762       INTO   l_fee_payment_id
13763       FROM   okc_rule_groups_b lalevl,
13764              okc_rules_b laslh
13765       WHERE  lalevl.cle_id = p_contract_line_id
13766       AND    lalevl.rgd_code = 'LALEVL'
13767       AND    lalevl.id = laslh.rgp_id
13768       AND    laslh.rule_information_category = 'LASLH';
13769 
13770       OKL_STREAMS_UTIL.get_dependent_stream_type(
13771               p_khr_id                => p_contract_id,
13772               p_primary_sty_id        => l_fee_payment_id,
13773               p_dependent_sty_purpose => 'PRINCIPAL_BALANCE',
13774               x_return_status         => l_return_status,
13775               x_dependent_sty_id      => l_prin_bal_id);
13776 
13777       OPEN c_balance (p_sty_id => l_prin_bal_id, p_date => l_date);
13778       FETCH c_balance INTO l_balance;
13779       CLOSE c_balance;
13780 
13781       RETURN l_balance;
13782 
13783     EXCEPTION
13784 
13785       WHEN OKL_API.G_EXCEPTION_ERROR THEN
13786         RAISE;
13787 
13788       WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
13789         RAISE;
13790 
13791       WHEN OTHERS THEN
13792 
13793         OKL_API.SET_MESSAGE (p_app_name     => 'OKL',
13794                              p_msg_name     => 'OKL_DB_ERROR',
13795                              p_token1       => 'PROG_NAME',
13796                              p_token1_value => l_prog_name,
13797                              p_token2       => 'SQLCODE',
13798                              p_token2_value => sqlcode,
13799                              p_token3       => 'SQLERRM',
13800                              p_token3_value => sqlerrm);
13801 
13802         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
13803 
13804   END principal_balance_fee_line;
13805 
13806 
13807   -- rfedane 4058562
13808   FUNCTION principal_balance_financed (p_contract_id IN NUMBER,
13809                                        p_contract_line_id IN NUMBER) RETURN NUMBER IS
13810 
13811     CURSOR c_fin_fees IS
13812       SELECT cle.id
13813       FROM
13814       okc_k_lines_b cle,
13815       okl_k_lines kle,
13816       okc_k_headers_b chr
13817       WHERE
13818       chr.id = p_contract_id
13819       AND cle.chr_id = chr.id
13820       AND cle.sts_code = chr.sts_code
13821       AND cle.id = kle.id
13822       AND kle.fee_type = 'FINANCED';
13823 
13824     l_total_balance NUMBER := 0;
13825     l_prog_name      VARCHAR2(61) := 'OKL_SEEDED_FUNCTIONS_PVT.principal_balance_financed';
13826 
13827   BEGIN
13828 
13829     FOR l_fin_fee IN c_fin_fees LOOP
13830 
13831     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);
13832 
13833     END LOOP;
13834 
13835     RETURN l_total_balance;
13836 
13837   EXCEPTION
13838 
13839     WHEN OTHERS THEN
13840 
13841       OKL_API.SET_MESSAGE (p_app_name     => 'OKL',
13842                            p_msg_name     => 'OKL_DB_ERROR',
13843                            p_token1       => 'PROG_NAME',
13844                            p_token1_value => l_prog_name,
13845                            p_token2       => 'SQLCODE',
13846                            p_token2_value => sqlcode,
13847                            p_token3       => 'SQLERRM',
13848                            p_token3_value => sqlerrm);
13849 
13850       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
13851 
13852   END principal_balance_financed;
13853 
13854 
13855   -- rfedane 4058562
13856   FUNCTION principal_balance_rollover (p_contract_id      IN NUMBER,
13857                                        p_contract_line_id IN NUMBER) RETURN NUMBER IS
13858 
13859     CURSOR c_fin_fees IS
13860       SELECT cle.id
13861       FROM
13862       okc_k_lines_b cle,
13863       okl_k_lines kle,
13864       okc_k_headers_b chr
13865       WHERE
13866       chr.id = p_contract_id
13867       AND cle.chr_id = chr.id
13868       AND cle.sts_code = chr.sts_code
13869       AND cle.id = kle.id
13870       AND kle.fee_type = 'ROLLOVER';
13871 
13872     l_total_balance NUMBER := 0;
13873     l_prog_name      VARCHAR2(61) := 'OKL_SEEDED_FUNCTIONS_PVT.principal_balance_rollover';
13874 
13875   BEGIN
13876 
13877     FOR l_fin_fee IN c_fin_fees LOOP
13878 
13879     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);
13880 
13881     END LOOP;
13882 
13883     RETURN l_total_balance;
13884 
13885   EXCEPTION
13886 
13887     WHEN OTHERS THEN
13888 
13889       OKL_API.SET_MESSAGE (p_app_name     => 'OKL',
13890                            p_msg_name     => 'OKL_DB_ERROR',
13891                            p_token1       => 'PROG_NAME',
13892                            p_token1_value => l_prog_name,
13893                            p_token2       => 'SQLCODE',
13894                            p_token2_value => sqlcode,
13895                            p_token3       => 'SQLERRM',
13896                            p_token3_value => sqlerrm);
13897 
13898       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
13899 
13900   END principal_balance_rollover;
13901 
13902   -- rmunjulu 4299668 Added -- modified to call line_accumulated_deprn
13903   FUNCTION asset_net_book_value(
13904     p_khr_id IN NUMBER,
13905     p_kle_id IN NUMBER)
13906     RETURN NUMBER IS
13907 
13908      Expected_error EXCEPTION;
13909 
13910      l_quote_id NUMBER;
13911      l_nbv NUMBER;
13912 
13913      CURSOR get_quote_date_csr (p_qte_id IN NUMBER) IS
13914      SELECT qte.date_effective_from
13915      FROM   okl_trx_quotes_b  qte
13916 	 WHERE  qte.id = p_qte_id;
13917 
13918      l_quote_eff_date DATE;
13919 
13920    CURSOR get_asset_cost_csr (p_kle_id IN NUMBER) IS
13921    SELECT nvl(fab.cost,0) current_cost
13922    FROM   fa_books fab,
13923           fa_book_controls fbc,
13924           okc_k_items_v itm,
13925           okc_k_lines_b kle,
13926           okc_line_styles_v lse
13927    WHERE  fbc.book_class = 'CORPORATE'
13928    AND    fab.book_type_code = fbc.book_type_code
13929    AND    fab.asset_id = itm.object1_id1
13930    AND    itm.cle_id = kle.id
13931    AND    kle.cle_id = p_kle_id
13932    AND    kle.lse_id = lse.id
13933    AND    lse.lty_code = 'FIXED_ASSET'
13934    AND    fab.transaction_header_id_out IS NULL;
13935 
13936    l_asset_deprn NUMBER;
13937    l_current_cost NUMBER;
13938    l_asset_net_book_value NUMBER;
13939 
13940   BEGIN
13941 
13942     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
13943        FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
13944        LOOP
13945          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'QUOTE_ID' THEN
13946             l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
13947          END IF;
13948        END LOOP;
13949     END IF;
13950 
13951     IF p_khr_id IS NULL
13952 	OR p_khr_id = OKL_API.G_MISS_NUM
13953 	OR p_kle_id IS NULL
13954 	OR p_kle_id = OKL_API.G_MISS_NUM THEN
13955 
13956       RAISE Expected_error;
13957     END IF;
13958 
13959     IF l_quote_id IS NOT NULL
13960     AND l_quote_id <> OKL_API.G_MISS_NUM THEN
13961 
13962       OPEN get_quote_date_csr (l_quote_id);
13963       FETCH get_quote_date_csr INTO l_quote_eff_date;
13964       CLOSE get_quote_date_csr;
13965 
13966     ELSE
13967 
13968       l_quote_eff_date := sysdate;
13969 
13970     END IF;
13971 
13972     l_asset_deprn := line_accumulated_deprn(
13973       						p_contract_id       => p_khr_id,
13974       						p_contract_line_id  => p_kle_id);
13975 
13976 
13977     --OPEN get_asset_cost_csr (p_kle_id); -- rmunjulu modified
13978     --FETCH get_asset_cost_csr INTO l_current_cost;
13979     --CLOSE get_asset_cost_csr;
13980 
13981     -- Update to mainline only -- gets converted current cost amount
13982     l_current_cost := line_asset_cost(
13983       						p_contract_id       => p_khr_id,
13984       						p_contract_line_id  => p_kle_id);
13985 
13986     l_asset_net_book_value :=  l_current_cost - l_asset_deprn;
13987 
13988     RETURN l_asset_net_book_value;
13989 
13990   EXCEPTION
13991 
13992     WHEN Expected_error THEN
13993 
13994     IF get_quote_date_csr%ISOPEN THEN
13995       CLOSE get_quote_date_csr;
13996     END IF;
13997     IF get_asset_cost_csr%ISOPEN THEN
13998       CLOSE get_asset_cost_csr;
13999     END IF;
14000     RETURN Null;
14001     WHEN OTHERS THEN
14002     IF get_quote_date_csr%ISOPEN THEN
14003       CLOSE get_quote_date_csr;
14004     END IF;
14005     IF get_asset_cost_csr%ISOPEN THEN
14006       CLOSE get_asset_cost_csr;
14007     END IF;
14008     -- store SQL error message on message stack for caller
14009     Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
14010                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
14011                         p_token1        => 'OKL_SQLCODE',
14012                         p_token1_value  => SQLCODE,
14013                         p_token2        => 'OKL_SQLERRM',
14014                         p_token2_value  => SQLERRM);
14015     RETURN NULL;
14016   END asset_net_book_value;
14017  -- varangan Added for Bug#5036582 start
14018   ----------------------------------------------------------------------------------------------------
14019     -- Start of Comments
14020     -- Created By:      Vaijayanthi Ranganathan (varangan)
14021     -- Function Name:   Contract Unpaid Invoices
14022     -- Description:     Returns the sum of all unpaid invoices for leases/loans,
14023     --                  including taxes, with due date prior to current system date
14024     -- Dependencies:
14025     -- Parameters: contract id,contract line id
14026     -- Version: 1.0
14027     -- End of Commnets
14028   ----------------------------------------------------------------------------------------------------
14029 
14030   FUNCTION contract_unpaid_invoices(
14031     p_contract_id IN NUMBER,
14032     p_contract_line_id IN NUMBER)
14033     RETURN NUMBER IS
14034     --dkagrawa changed the follwong cursor for billing impact
14035     --changed query for Bug#6826370
14036     CURSOR cr_unpaid_invoices(c_contract_id IN NUMBER) IS
14037     SELECT nvl(sum(amount_remaining),0)
14038     FROM   okl_cs_bpd_inv_dtl_v
14039     WHERE  chr_id = c_contract_id
14040     AND    due_date <= SYSDATE;
14041 
14042     l_unpaid_invoices NUMBER;
14043 
14044   BEGIN
14045     OPEN cr_unpaid_invoices (p_contract_id);
14046     FETCH cr_unpaid_invoices INTO l_unpaid_invoices;
14047     CLOSE cr_unpaid_invoices;
14048 
14049     RETURN l_unpaid_invoices;
14050   EXCEPTION
14051     WHEN OTHERS THEN
14052     IF cr_unpaid_invoices%ISOPEN THEN
14053       CLOSE cr_unpaid_invoices;
14054     END IF;
14055     -- store SQL error message on message stack for caller
14056     Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
14057                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
14058                         p_token1        => 'OKL_SQLCODE',
14059                         p_token1_value  => SQLCODE,
14060                         p_token2        => 'OKL_SQLERRM',
14061                         p_token2_value  => SQLERRM);
14062     RETURN NULL;
14063   END contract_unpaid_invoices;
14064 
14065   ----------------------------------------------------------------------------------------------------
14066     -- Start of Comments
14067     -- Created By:      Vaijayanthi Ranganathan (varangan)
14068     -- Function Name:   Contract Unbilled Streams amount
14069     -- Description:     Returns the sum of all Unbilled Streams for leases/loans,
14070     --                  including taxes, with due date prior to current system date
14071     -- Dependencies:
14072     -- Parameters: contract id,contract line id
14073     -- Version: 1.0
14074     -- End of Commnets
14075   ----------------------------------------------------------------------------------------------------
14076   FUNCTION contract_unbilled_streams(
14077     p_contract_id IN NUMBER,
14078     p_contract_line_id IN NUMBER)
14079     RETURN NUMBER IS
14080 
14081     CURSOR cr_unbilled_streams(c_contract_id IN NUMBER) IS
14082     SELECT NVL(sum(sel.amount),0)
14083     FROM   okl_strm_elements sel,
14084            okl_streams stm,
14085            okl_strm_type_b sty
14086     WHERE  stm.say_code = 'CURR'
14087     AND    stm.active_yn = 'Y'
14088     AND    stm.purpose_code is NULL
14089     AND    stm.khr_id = c_contract_id
14090     AND    sty.id = stm.sty_id
14091     AND    sty.billable_yn = 'Y'
14092     AND    sel.stm_id = stm.id
14093     AND    date_billed is null
14094     AND    stream_element_date <= SYSDATE;
14095 
14096     l_unbilled_streams NUMBER;
14097 
14098   BEGIN
14099     OPEN cr_unbilled_streams (p_contract_id);
14100     FETCH cr_unbilled_streams INTO l_unbilled_streams;
14101     CLOSE cr_unbilled_streams;
14102 
14103     RETURN l_unbilled_streams;
14104   EXCEPTION
14105     WHEN OTHERS THEN
14106     IF cr_unbilled_streams%ISOPEN THEN
14107       CLOSE cr_unbilled_streams;
14108     END IF;
14109     -- store SQL error message on message stack for caller
14110     Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
14111                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
14112                         p_token1        => 'OKL_SQLCODE',
14113                         p_token1_value  => SQLCODE,
14114                         p_token2        => 'OKL_SQLERRM',
14115                         p_token2_value  => SQLERRM);
14116     RETURN NULL;
14117   END contract_unbilled_streams;
14118   -- varangan Bug#5036582 end
14119 
14120 
14121   -- rmunjulu VENDOR_RESIDUAL_SHARE PROJECT
14122   FUNCTION vendor_residual_share_amount(
14123     p_khr_id IN NUMBER,
14124     p_kle_id IN NUMBER)
14125     RETURN NUMBER IS
14126 
14127     CURSOR get_asset_residual_csr (p_kle_id IN NUMBER) IS
14128     SELECT nvl(KLE.residual_value,0) residual_value
14129     FROM   OKL_K_LINES KLE
14130     WHERE  KLE.id = p_kle_id;
14131 
14132     CURSOR get_asset_sales_proceeds_csr (p_retirement_id IN NUMBER) IS
14133     SELECT nvl(RET.proceeds_of_sale,0) sales_proceeds
14134     FROM   --OKX_ASSET_LINES_V OAL,
14135            FA_RETIREMENTS RET
14136     WHERE  RET.RETIREMENT_ID = p_retirement_id;
14137     --WHERE  OAL.parent_line_id = p_kle_id
14138     --AND    OAL.corporate_book IS NOT NULL
14139     --AND    OAL.asset_id = FAR.asset_id
14140     --AND    OAL.corporate_book = FAR.book_type_code;
14141 
14142      EXPECTED_ERROR EXCEPTION;
14143 
14144      l_sales_proceeds NUMBER;
14145      l_share_percent NUMBER;
14146      l_residual_value NUMBER;
14147      l_share_amount NUMBER;
14148      l_currency_code VARCHAR2(15);
14149      l_contract_currency_code VARCHAR2(15);
14150      l_currency_conversion_type VARCHAR2(30);
14151      l_currency_conversion_rate NUMBER;
14152      l_currency_conversion_date DATE;
14153      l_converted_sales_proceeds NUMBER;
14154      l_return_status VARCHAR2(3);
14155      l_retirement_id NUMBER;
14156 
14157   BEGIN
14158 
14159     IF p_khr_id IS NULL
14160 	OR p_khr_id = OKL_API.G_MISS_NUM
14161 	OR p_kle_id IS NULL
14162 	OR p_kle_id = OKL_API.G_MISS_NUM THEN
14163 
14164       OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
14165                           p_msg_name     => 'OKL_INVALID_VALUE',
14166                           p_token1       => 'COL_NAME',
14167                           p_token1_value => 'P_KHR_ID OR P_KLE_ID');
14168 
14169       RAISE EXPECTED_ERROR;
14170     END IF;
14171 
14172     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
14173        FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
14174        LOOP
14175          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'retirement_id' THEN
14176             l_retirement_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
14177          END IF;
14178        END LOOP;
14179     END IF;
14180 
14181     IF l_retirement_id IS NULL
14182 	OR l_retirement_id = OKL_API.G_MISS_NUM THEN
14183 
14184       OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
14185                           p_msg_name     => 'OKL_INVALID_VALUE',
14186                           p_token1       => 'COL_NAME',
14187                           p_token1_value => 'retirement_id');
14188 
14189       RAISE EXPECTED_ERROR;
14190     END IF;
14191 
14192     l_sales_proceeds := 0;
14193     l_residual_value := 0;
14194     l_share_percent  := 0;
14195     l_share_amount   := 0;
14196 
14197     OPEN  get_asset_residual_csr (p_kle_id);
14198     FETCH get_asset_residual_csr INTO l_residual_value;
14199     CLOSE get_asset_residual_csr;
14200 
14201     -- get sales proceeds for the retirement id
14202     OPEN  get_asset_sales_proceeds_csr (l_retirement_id);
14203     FETCH get_asset_sales_proceeds_csr INTO l_sales_proceeds;
14204     CLOSE get_asset_sales_proceeds_csr;
14205 
14206     -- Get the contract currency code
14207     l_currency_code := OKL_AM_UTIL_PVT.get_chr_currency(p_khr_id);
14208 
14209     -- Convert sales_proceeds from functional_currency to contract_currency
14210     OKL_ACCOUNTING_UTIL.convert_to_contract_currency(
14211                      p_khr_id  		  	          => p_khr_id,
14212                      p_from_currency   		      => l_currency_code,
14213                      p_transaction_date 		  => sysdate,
14214                      p_amount 			          => l_sales_proceeds,
14215                      x_return_status              => l_return_status,
14216                      x_contract_currency		  => l_contract_currency_code,
14217                      x_currency_conversion_type	  => l_currency_conversion_type,
14218                      x_currency_conversion_rate	  => l_currency_conversion_rate,
14219                      x_currency_conversion_date	  => l_currency_conversion_date,
14220                      x_converted_amount 		  => l_converted_sales_proceeds);
14221 
14222     IF  l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
14223       RAISE EXPECTED_ERROR;
14224     END IF;
14225 
14226     l_share_amount := nvl(l_converted_sales_proceeds,0) - nvl(l_residual_value,0);
14227 
14228     RETURN l_share_amount; -- has no share percent included, percent will be applied later
14229 
14230   EXCEPTION
14231 
14232     WHEN EXPECTED_ERROR THEN
14233 
14234     IF get_asset_residual_csr%ISOPEN THEN
14235       CLOSE get_asset_residual_csr;
14236     END IF;
14237 
14238     IF get_asset_sales_proceeds_csr%ISOPEN THEN
14239       CLOSE get_asset_sales_proceeds_csr;
14240     END IF;
14241 
14242     RETURN NULL;
14243 
14244     WHEN OTHERS THEN
14245 
14246     IF get_asset_residual_csr%ISOPEN THEN
14247       CLOSE get_asset_residual_csr;
14248     END IF;
14249 
14250     IF get_asset_sales_proceeds_csr%ISOPEN THEN
14251       CLOSE get_asset_sales_proceeds_csr;
14252     END IF;
14253 
14254     -- store SQL error message on message stack for caller
14255     Okl_Api.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
14256                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
14257                         p_token1        => 'OKL_SQLCODE',
14258                         p_token1_value  => SQLCODE,
14259                         p_token2        => 'OKL_SQLERRM',
14260                         p_token2_value  => SQLERRM);
14261     RETURN NULL;
14262   END vendor_residual_share_amount;
14263 
14264   -- rmunjulu LOANS_ENHANCEMENTS PROJECT
14265   FUNCTION loan_asset_prin_bal(
14266     p_khr_id IN NUMBER,
14267     p_kle_id IN NUMBER)
14268     RETURN NUMBER IS
14269 
14270      CURSOR get_quote_date_csr (p_qte_id IN NUMBER) IS
14271      SELECT qte.date_effective_from
14272      FROM   okl_trx_quotes_b  qte
14273 	 WHERE  qte.id = p_qte_id;
14274 
14275      EXPECTED_ERROR EXCEPTION;
14276 
14277      l_return_status VARCHAR2(3);
14278      l_quote_id NUMBER;
14279      l_quote_eff_from DATE;
14280      l_prin_bal NUMBER;
14281 
14282   BEGIN
14283 
14284     IF p_khr_id IS NULL
14285 	OR p_khr_id = OKL_API.G_MISS_NUM
14286 	OR p_kle_id IS NULL
14287 	OR p_kle_id = OKL_API.G_MISS_NUM THEN
14288 
14289       OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
14290                           p_msg_name     => 'OKL_INVALID_VALUE',
14291                           p_token1       => 'COL_NAME',
14292                           p_token1_value => 'P_KHR_ID OR P_KLE_ID');
14293 
14294       RAISE EXPECTED_ERROR;
14295     END IF;
14296 
14297     IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
14298        FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
14299        LOOP
14300          IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'quote_id' THEN
14301             l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
14302          END IF;
14303        END LOOP;
14304     END IF;
14305 
14306     IF l_quote_id IS NULL THEN
14307 
14308       OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
14309                           p_msg_name     => 'OKL_INVALID_VALUE',
14310                           p_token1       => 'COL_NAME',
14311                           p_token1_value => 'quote_id');
14312 
14313       RAISE EXPECTED_ERROR;
14314     END IF;
14315 
14316     OPEN get_quote_date_csr (l_quote_id);
14317     FETCH get_quote_date_csr INTO l_quote_eff_from;
14318     CLOSE get_quote_date_csr;
14319 
14320 
14321     -- call util to get actual principal balance
14322     l_prin_bal := OKL_VARIABLE_INT_UTIL_PVT.get_principal_bal(
14323         x_return_status  => l_return_status,
14324         p_khr_id         => p_khr_id,
14325         p_kle_id         => p_kle_id,
14326         p_date           => l_quote_eff_from);
14327 
14328     IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
14329        RAISE EXPECTED_ERROR;
14330     END IF;
14331 
14332 
14333     RETURN l_prin_bal;
14334 
14335   EXCEPTION
14336 
14337     WHEN EXPECTED_ERROR THEN
14338 
14339     IF get_quote_date_csr%ISOPEN THEN
14340       CLOSE get_quote_date_csr;
14341     END IF;
14342 
14343     RETURN NULL;
14344 
14345     WHEN OTHERS THEN
14346 
14347     IF get_quote_date_csr%ISOPEN THEN
14348       CLOSE get_quote_date_csr;
14349     END IF;
14350 
14351     -- store SQL error message on message stack for caller
14352     Okl_Api.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
14353                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
14354                         p_token1        => 'OKL_SQLCODE',
14355                         p_token1_value  => SQLCODE,
14356                         p_token2        => 'OKL_SQLERRM',
14357                         p_token2_value  => SQLERRM);
14358     RETURN NULL;
14359   END loan_asset_prin_bal;
14360 
14361   -- rmunjulu LOANS_ENHANCEMENTS PROJECT
14362   --SECHAWLA 30-NOV-05 4753429 : Modified to return perdiem amount for only LOANS/REVOLVING-LOANS
14363   --SECHAWLA 03-JAN-06 4920149 : Treat interest rate returned by the API OKL_VARIABLE_INT_UTIL_PVT
14364   --                             as a percentage
14365   FUNCTION quote_perdiem_amount(
14366     p_khr_id IN NUMBER,
14367     p_kle_id IN NUMBER)
14368     RETURN NUMBER IS
14369 
14370 
14371 
14372      CURSOR get_tot_outstanding_bal_csr (p_qte_id IN NUMBER) IS
14373      SELECT sum(TQL.asset_value) outstanding_bal
14374      FROM   OKL_TXL_QUOTE_LINES_B TQL
14375      WHERE  TQL.qte_id = p_qte_id
14376 	 AND    TQL.qlt_code = 'AMCFIA';
14377 
14378      CURSOR get_quote_date_csr (p_qte_id IN NUMBER) IS
14379      SELECT qte.date_effective_from
14380      FROM   okl_trx_quotes_b  qte
14381 	 WHERE  qte.id = p_qte_id;
14382 
14383      CURSOR get_base_interest_rate_csr (p_khr_id IN NUMBER) IS
14384      SELECT base_rate
14385      FROM   okl_k_rate_params_v
14386 	 WHERE  khr_id = p_khr_id;
14387 
14388 	 --SECHAWLA 30-NOV-05 4753429 : New declarations begin
14389      CURSOR l_dealtype_csr (cp_khr_id IN NUMBER) IS
14390 	 SELECT deal_type
14391 	 FROM   OKL_K_HEADERS
14392 	 WHERE  id = cp_khr_id;
14393 
14394 	 l_deal_type		VARCHAR2(30);
14395 	 --SECHAWLA 30-NOV-05 4753429 : New declarations end
14396 
14397      EXPECTED_ERROR EXCEPTION;
14398 
14399      l_outstanding_bal NUMBER;
14400      l_return_status VARCHAR2(3);
14401      l_quote_id NUMBER;
14402      l_quote_eff_from DATE;
14403      l_interest_rate NUMBER;
14404      l_quote_perdiem NUMBER;
14405 
14406 	 IsLeapYear BOOLEAN;
14407      iYear NUMBER;
14408 
14409      l_days_in_year NUMBER;
14410      --gboomina Bug#4703521 27-Oct-05 start
14411      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
14412      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
14413      --gboomina Bug#4703521 27-Oct-05 end
14414      lx_return_status VARCHAR2(3);
14415 
14416 
14417 
14418   BEGIN
14419 
14420     --SECHAWLA 30-NOV-05 4753429 : begin
14421 
14422     l_quote_perdiem := 0;
14423 
14424     OPEN  l_dealtype_csr(p_khr_id);
14425     FETCH l_dealtype_csr INTO l_deal_type;
14426     CLOSE l_dealtype_csr;
14427 
14428     IF l_deal_type LIKE 'LOAN%' THEN
14429        --SECHAWLA 30-NOV-05 4753429 : end
14430 
14431     	l_outstanding_bal := 0;
14432 
14433 
14434 
14435     	IF Okl_Execute_Formula_Pub.g_additional_parameters.COUNT > 0 THEN
14436        	FOR i IN Okl_Execute_Formula_Pub.g_additional_parameters.FIRST..Okl_Execute_Formula_Pub.g_additional_parameters.LAST
14437        		LOOP
14438          		IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).name = 'QUOTE_ID' THEN
14439             		l_quote_id := TO_NUMBER(OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(i).value);
14440          		END IF;
14441        		END LOOP;
14442     	END IF;
14443 
14444     	IF l_quote_id IS NULL THEN
14445 
14446       		OKL_API.set_message(p_app_name     => OKL_API.G_APP_NAME,
14447                           p_msg_name     => 'OKL_INVALID_VALUE',
14448                           p_token1       => 'COL_NAME',
14449                           p_token1_value => 'QUOTE_ID');
14450 
14451       		RAISE EXPECTED_ERROR;
14452     	END IF;
14453 
14454     	OPEN  get_tot_outstanding_bal_csr (l_quote_id);
14455     	FETCH get_tot_outstanding_bal_csr INTO l_outstanding_bal;
14456     	CLOSE get_tot_outstanding_bal_csr;
14457 
14458     	OPEN get_quote_date_csr (l_quote_id);
14459     	FETCH get_quote_date_csr INTO l_quote_eff_from;
14460     	CLOSE get_quote_date_csr;
14461 
14462     	-- get effective interest rate
14463     	l_interest_rate := OKL_VARIABLE_INT_UTIL_PVT.get_effective_int_rate(
14464                              x_return_status  => l_return_status,
14465                              p_khr_id         => p_khr_id,
14466                              p_effective_date => l_quote_eff_from);
14467 
14468     	IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
14469       		RAISE EXPECTED_ERROR;
14470     	END IF;
14471 
14472 		-- use utility for getting the days (from SGT or Contract)
14473     	OKL_PRICING_UTILS_PVT.get_day_convention(
14474                p_id              => p_khr_id,   -- ID of the contract/quote
14475                p_source          => 'ESG', -- 'ESG'/'ISG' are acceptable values
14476                x_days_in_month   => lx_days_in_month,
14477                x_days_in_year    => lx_days_in_year,
14478                x_return_status   => lx_return_status);
14479 
14480     	IF lx_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
14481 	   		RAISE EXPECTED_ERROR;
14482 		END IF;
14483 
14484     	IF lx_days_in_year = 'ACTUAL' THEN
14485 
14486       		-- get year of termination
14487       		iYear := to_number(substr(to_char(trunc(l_quote_eff_from),'YYYY/DD/MON'),1,4));
14488 
14489 	  		-- check if leap year
14490       		If (iYear Mod 4 = 0) And
14491       		((iYear Mod 100 <> 0) Or (iYear Mod 400 = 0)) Then
14492          		IsLeapYear := True;
14493       		Else
14494          		IsLeapYear := False;
14495       		End If;
14496 
14497       		IF IsLeapYear THEN
14498          		l_days_in_year := 366;
14499      		ELSE
14500          		l_days_in_year := 365;
14501       		END IF;
14502 
14503     	ELSE
14504 	   		l_days_in_year := to_number(lx_days_in_year);
14505 		END IF;
14506 
14507 		IF l_days_in_year IS NULL OR l_days_in_year = 0 THEN
14508 	  		l_days_in_year := 365;
14509 		END IF;
14510 
14511     	--l_quote_perdiem := nvl(l_outstanding_bal,0) * nvl(l_interest_rate,0) /l_days_in_year;
14512     	-- SECHAWLA 03-JAN-06 4920149 l_interest_rate is a percentage
14513     	l_quote_perdiem := nvl(l_outstanding_bal,0) * nvl((l_interest_rate/100),0) /l_days_in_year;
14514     END IF; --SECHAWLA 30-NOV-05 4753429
14515 
14516     RETURN l_quote_perdiem;
14517 
14518   EXCEPTION
14519 
14520     WHEN EXPECTED_ERROR THEN
14521 
14522     IF get_tot_outstanding_bal_csr%ISOPEN THEN
14523       CLOSE get_tot_outstanding_bal_csr;
14524     END IF;
14525 
14526     IF get_quote_date_csr%ISOPEN THEN
14527       CLOSE get_quote_date_csr;
14528     END IF;
14529 
14530     --SECHAWLA 30-NOV-05 4753429 : Added
14531     IF l_dealtype_csr%ISOPEN THEN
14532       CLOSE l_dealtype_csr;
14533     END IF;
14534 
14535     RETURN NULL;
14536 
14537     WHEN OTHERS THEN
14538 
14539     IF get_tot_outstanding_bal_csr%ISOPEN THEN
14540       CLOSE get_tot_outstanding_bal_csr;
14541     END IF;
14542 
14543     IF get_quote_date_csr%ISOPEN THEN
14544       CLOSE get_quote_date_csr;
14545     END IF;
14546 
14547     --SECHAWLA 30-NOV-05 4753429 : Added
14548     IF l_dealtype_csr%ISOPEN THEN
14549       CLOSE l_dealtype_csr;
14550     END IF;
14551 
14552     -- store SQL error message on message stack for caller
14553     Okl_Api.Set_Message(p_app_name      => OKL_API.G_APP_NAME,
14554                         p_msg_name      => 'OKL_UNEXPECTED_ERROR',
14555                         p_token1        => 'OKL_SQLCODE',
14556                         p_token1_value  => SQLCODE,
14557                         p_token2        => 'OKL_SQLERRM',
14558                         p_token2_value  => SQLERRM);
14559     RETURN NULL;
14560   END quote_perdiem_amount;
14561 
14562   -- sjalasut, Rebook Change Control Enhancement START
14563 
14564   -- function that returns the sum of unbilled RENT for all active assets on the rebook copy of the contract
14565   FUNCTION cont_rbk_unbilled_receivables(p_contract_id okc_k_headers_b.id%TYPE
14566                                         ,p_contract_line_id okc_k_lines_b.id%TYPE DEFAULT OKL_API.G_MISS_NUM) RETURN NUMBER IS
14567 
14568     -- get all unbilled receivables for all ACTIVE assets
14569     CURSOR cle_rents_csr(cp_contract_id okc_k_headers_b.id%TYPE) IS
14570     SELECT NVL(SUM(sele.amount),0)
14571       FROM okl_strm_elements sele
14572           ,okl_streams str
14573           ,okl_strm_type_v sty
14574           ,okc_k_lines_v line
14575           ,okc_statuses_b sts
14576           ,okc_line_styles_b style
14577      WHERE sele.stm_id = str.id
14578        AND str.sty_id = sty.id
14579        AND sty.stream_type_purpose = 'RENT'
14580        AND str.say_code = 'CURR'
14581        AND str.active_yn = 'Y'
14582        AND str.purpose_code IS NULL
14583        AND sele.date_billed IS NULL
14584        AND line.chr_id = str.khr_id
14585        AND line.id = str.kle_id
14586        AND line.lse_id = style.id
14587        AND style.lty_code = 'FREE_FORM1'
14588        AND line.sts_code = sts.code
14589        AND sts.ste_code = 'ACTIVE'
14590        AND str.khr_id = cp_contract_id;
14591     lv_rent_assets NUMBER;
14592 
14593     lv_unbilled_recv NUMBER;
14594   BEGIN
14595     IF(p_contract_id IS NOT NULL AND p_contract_id <> OKL_API.G_MISS_NUM)THEN
14596       -- initialize
14597       lv_unbilled_recv := 0;
14598       lv_rent_assets := 0;
14599 
14600        -- ASSET level RENTS
14601        OPEN cle_rents_csr(cp_contract_id => p_contract_id); FETCH cle_rents_csr INTO lv_rent_assets;
14602        CLOSE cle_rents_csr;
14603 
14604        lv_unbilled_recv := lv_rent_assets;
14605     END IF;
14606     RETURN lv_unbilled_recv;
14607   EXCEPTION
14608  	WHEN OTHERS THEN
14609     IF(cle_rents_csr%ISOPEN)THEN
14610       CLOSE cle_rents_csr;
14611     END IF;
14612     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME
14613                        ,p_msg_name     => G_UNEXPECTED_ERROR
14614                        ,p_token1       => G_SQLCODE_TOKEN
14615                        ,p_token1_value => SQLCODE
14616                        ,p_token2       => G_SQLERRM_TOKEN
14617                        ,p_token2_value => SQLERRM);
14618     RETURN NULL;
14619   END cont_rbk_unbilled_receivables;
14620 
14621   -- function that returns the sum of pre-tax income that was not accrued for all active assets on the rebook copy of the contract
14622   FUNCTION cont_rbk_unearned_income(p_contract_id okc_k_headers_b.id%TYPE
14623                                    ,p_contract_line_id okc_k_lines_b.id%TYPE DEFAULT OKL_API.G_MISS_NUM) RETURN NUMBER IS
14624 
14625     CURSOR c_pre_tax_csr(cp_contract_id okc_k_headers_b.id%TYPE) IS
14626     SELECT NVL(SUM(sele.amount),0)
14627       FROM okl_strm_elements sele
14628           --,okl_streams str  MGAAP 7263041
14629           ,okl_streams_rep_v str
14630           ,okl_strm_type_v sty
14631           ,okc_k_lines_b line
14632           ,okc_line_styles_b style
14633           ,okc_statuses_b sts
14634      WHERE sele.stm_id = str.id
14635        AND str.sty_id = sty.id
14636        AND UPPER(sty.stream_type_purpose) = 'LEASE_INCOME'     -- pre-tax income has steam type purpose as lease_income
14637        AND str.say_code = 'CURR'
14638        AND STR.ACTIVE_YN = 'Y'
14639        AND (STR.PURPOSE_CODE IS NULL OR STR.PURPOSE_CODE='REPORT')
14640        AND nvl(sele.accrued_yn,'N') = 'N'
14641        AND str.kle_id = line.id
14642        AND line.lse_id = style.id
14643        AND style.lty_code = 'FREE_FORM1'
14644        AND line.sts_code = sts.code
14645        AND sts.ste_code = 'ACTIVE'
14646        AND line.chr_id = cp_contract_id;
14647     lv_pre_tax_income NUMBER;
14648   BEGIN
14649     IF(p_contract_id IS NOT NULL AND p_contract_id <> OKL_API.G_MISS_NUM)THEN
14650       lv_pre_tax_income := 0;
14651       OPEN c_pre_tax_csr(cp_contract_id => p_contract_id); FETCH c_pre_tax_csr INTO lv_pre_tax_income;
14652       CLOSE c_pre_tax_csr;
14653     END IF;
14654     RETURN lv_pre_tax_income;
14655   EXCEPTION
14656  	WHEN OTHERS THEN
14657     IF(c_pre_tax_csr%ISOPEN)THEN
14658       CLOSE c_pre_tax_csr;
14659     END IF;
14660     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME
14661                        ,p_msg_name     => G_UNEXPECTED_ERROR
14662                        ,p_token1       => G_SQLCODE_TOKEN
14663                        ,p_token1_value => SQLCODE
14664                        ,p_token2       => G_SQLERRM_TOKEN
14665                        ,p_token2_value => SQLERRM);
14666     RETURN NULL;
14667   END cont_rbk_unearned_income;
14668 
14669   -- returns sum of rent not billed for all terminated assets
14670   -- do not send p_contract_line_id as okl_api.g_miss_num
14671   FUNCTION cont_tmt_unbilled_receivables(p_contract_id okc_k_headers_b.id%TYPE
14672                                         ,p_contract_line_id okc_k_lines_b.id%TYPE DEFAULT OKL_API.G_MISS_NUM) RETURN NUMBER IS
14673     -- get all unbilled receivables for all TERMINATED assets
14674     CURSOR cle_rents_csr(cp_contract_id okc_k_headers_b.id%TYPE
14675                         ,cp_contract_line_id okc_k_lines_b.id%TYPE) IS
14676     SELECT NVL(SUM(sele.amount),0)
14677       FROM okl_strm_elements sele
14678           ,okl_streams str
14679           ,okl_strm_type_v sty
14680           ,okc_k_lines_v line
14681           -- ,okc_statuses_b sts
14682           ,okc_line_styles_b style
14683      WHERE sele.stm_id = str.id
14684        AND str.sty_id = sty.id
14685        AND sty.stream_type_purpose = 'RENT'
14686        AND str.say_code = 'CURR'
14687        AND str.active_yn = 'Y'
14688        AND str.purpose_code IS NULL
14689        AND sele.date_billed IS NULL
14690        AND line.chr_id = str.khr_id
14691        AND line.id = str.kle_id
14692        AND line.lse_id = style.id
14693        AND style.lty_code = 'FREE_FORM1'
14694        -- AND line.sts_code = sts.code
14695        -- AND sts.ste_code = 'TERMINATED'
14696        AND str.khr_id = cp_contract_id
14697        AND line.id = NVL(cp_contract_line_id, line.id);
14698     lv_rent_assets NUMBER;
14699 
14700     lv_unbilled_recv NUMBER;
14701   BEGIN
14702     IF(p_contract_id IS NOT NULL AND p_contract_id <> OKL_API.G_MISS_NUM)THEN
14703       -- initialize
14704       lv_unbilled_recv := 0;
14705       lv_rent_assets := 0;
14706 
14707        -- ASSET level RENTS
14708        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;
14709        CLOSE cle_rents_csr;
14710 
14711        lv_unbilled_recv := lv_rent_assets;
14712     END IF;
14713     RETURN lv_unbilled_recv;
14714   EXCEPTION
14715  	WHEN OTHERS THEN
14716     IF(cle_rents_csr%ISOPEN)THEN
14717       CLOSE cle_rents_csr;
14718     END IF;
14719     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME
14720                        ,p_msg_name     => G_UNEXPECTED_ERROR
14721                        ,p_token1       => G_SQLCODE_TOKEN
14722                        ,p_token1_value => SQLCODE
14723                        ,p_token2       => G_SQLERRM_TOKEN
14724                        ,p_token2_value => SQLERRM);
14725     RETURN NULL;
14726   END cont_tmt_unbilled_receivables;
14727 
14728   -- returns sum of  pre tax income not accrued for all terminated assets
14729   -- do not send p_contract_line_id as okl_api.g_miss_num
14730   FUNCTION cont_tmt_unearned_income(p_contract_id okc_k_headers_b.id%TYPE
14731                                    ,p_contract_line_id okc_k_lines_b.id%TYPE DEFAULT OKL_API.G_MISS_NUM) RETURN NUMBER IS
14732     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
14733     SELECT NVL(SUM(sele.amount),0)
14734       FROM okl_strm_elements sele
14735           --,okl_streams str  MGAAP 7263041
14736           ,okl_streams_rep_v str
14737           ,okl_strm_type_v sty
14738           ,okc_k_lines_b line
14739           ,okc_line_styles_b style
14740           -- ,okc_statuses_b sts
14741      WHERE sele.stm_id = str.id
14742        AND str.sty_id = sty.id
14743        AND UPPER(sty.stream_type_purpose) = 'LEASE_INCOME'     -- pre-tax income has steam type purpose as lease_income
14744        AND str.say_code = 'CURR'
14745        AND STR.ACTIVE_YN = 'Y'
14746        AND (STR.PURPOSE_CODE IS NULL OR STR.PURPOSE_CODE='REPORT')
14747        AND nvl(sele.accrued_yn,'N') = 'N'
14748        AND str.kle_id = line.id
14749        AND line.lse_id = style.id
14750        AND style.lty_code = 'FREE_FORM1'
14751        -- AND line.sts_code = sts.code
14752        -- AND sts.ste_code = 'TERMINATED'
14753        AND line.chr_id = cp_contract_id
14754        AND line.id = NVL(cp_contract_line_id, line.id);
14755     lv_pre_tax_income NUMBER;
14756   BEGIN
14757     IF(p_contract_id IS NOT NULL AND p_contract_id <> OKL_API.G_MISS_NUM)THEN
14758       lv_pre_tax_income := 0;
14759       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;
14760       CLOSE c_pre_tax_csr;
14761     END IF;
14762     RETURN lv_pre_tax_income;
14763   EXCEPTION
14764  	WHEN OTHERS THEN
14765     IF(c_pre_tax_csr%ISOPEN)THEN
14766       CLOSE c_pre_tax_csr;
14767     END IF;
14768     OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME
14769                        ,p_msg_name     => G_UNEXPECTED_ERROR
14770                        ,p_token1       => G_SQLCODE_TOKEN
14771                        ,p_token1_value => SQLCODE
14772                        ,p_token2       => G_SQLERRM_TOKEN
14773                        ,p_token2_value => SQLERRM);
14774     RETURN NULL;
14775   END cont_tmt_unearned_income;
14776 
14777   -- sjalasut, Rebook Change Control Enhancement END
14778 
14779 -- Begin - varangan-Bug#5009351
14780  ----------------------------------------------------------------------------------------------------
14781    -- Start of Comments
14782    -- Created By:      Vaijayanthi (varangan)
14783    -- Function Name:   contract_next_payment_amount
14784    -- Description:    Returns the sum of all billable stream elements,
14785    --                 excluding taxes, which fall on the next payment date
14786    -- Dependencies:
14787    -- Parameters: contract id,contract line id
14788    -- Version: 1.0
14789    -- End of Commnets
14790  ----------------------------------------------------------------------------------------------------
14791  FUNCTION contract_next_payment_amount(
14792    p_contract_id IN NUMBER,
14793    p_contract_line_id IN NUMBER)
14794    RETURN NUMBER IS
14795 
14796    CURSOR cr_next_payment_date(c_contract_id IN NUMBER) IS
14797    SELECT MIN(sel.stream_element_date)
14798    FROM   okl_strm_elements sel,
14799           okl_streams stm,
14800           okl_strm_type_v sty
14801    WHERE  stm.sty_id = sty.id
14802    AND    stm.say_code = 'CURR'
14803    AND    stm.active_yn = 'Y'
14804    AND    sty.billable_yn = 'Y'
14805    AND    sty.stream_type_purpose NOT LIKE '%TAX%'   -- vsgandhi: Bug 14712454
14806    AND    stm.purpose_code is NULL
14807    AND    stm.khr_id = c_contract_id
14808    AND    sel.stm_id = stm.id
14809    AND    sel.stream_element_date > sysdate;
14810 
14811    CURSOR cr_next_payment_amt(c_contract_id IN NUMBER,
14812                               c_next_due_date IN DATE) IS
14813    SELECT NVL(sum(sel.amount),0)
14814    FROM okl_strm_elements sel,
14815             okl_streams stm,
14816             okl_strm_type_v sty
14817    WHERE stm.sty_id = sty.id
14818    AND stm.say_code = 'CURR'
14819    AND stm.active_yn = 'Y'
14820    AND sty.billable_yn = 'Y'
14821    AND sty.stream_type_purpose NOT LIKE '%TAX%' -- vsgandhi : Bug 14712454
14822    AND stm.purpose_code is NULL
14823    AND stm.khr_id = c_contract_id
14824    AND sel.stm_id = stm.id
14825    AND sel.stream_element_date = c_next_due_date;
14826 
14827    l_next_payment_date    DATE;
14828    l_next_payment_amt     NUMBER;
14829  BEGIN
14830    OPEN cr_next_payment_date(p_contract_id);
14831    FETCH cr_next_payment_date INTO l_next_payment_date;
14832    CLOSE cr_next_payment_date;
14833 
14834    OPEN cr_next_payment_amt(p_contract_id,l_next_payment_date);
14835    FETCH cr_next_payment_amt INTO l_next_payment_amt;
14836    CLOSE cr_next_payment_amt;
14837    RETURN l_next_payment_amt;
14838 
14839  EXCEPTION
14840    WHEN OTHERS THEN
14841      IF cr_next_payment_date%ISOPEN THEN
14842        CLOSE cr_next_payment_date;
14843      END IF;
14844      IF cr_next_payment_amt%ISOPEN THEN
14845        CLOSE cr_next_payment_amt;
14846      END IF;
14847      -- store SQL error message on message stack for caller
14848      Okl_Api.Set_Message(p_app_name      => Okl_Api.G_APP_NAME,
14849                          p_msg_name      => 'OKL_UNEXPECTED_ERROR',
14850                          p_token1        => 'OKL_SQLCODE',
14851                          p_token1_value  => SQLCODE,
14852                          p_token2        => 'OKL_SQLERRM',
14853                          p_token2_value  => SQLERRM);
14854      RETURN NULL;
14855  END contract_next_payment_amount;
14856  -- End - varangan-Bug#5009351
14857 
14858   -- Added by rravikir -- Bug 5055835
14859 
14860   -- ############################################################
14861   -- FUNCTION get_leaseapp_id
14862   -- This function fetches the Lease Application Info
14863   -- associated to the Contract
14864   -- ############################################################
14865   FUNCTION get_leaseapp_id(p_contract_id IN NUMBER)
14866     RETURN NUMBER IS
14867 
14868     CURSOR c_get_lease_app IS
14869     SELECT orig_system_id1
14870     FROM okc_k_headers_b
14871     WHERE id = p_contract_id
14872     AND orig_system_source_code = 'OKL_LEASE_APP';
14873 
14874     ln_lease_app_id	NUMBER;
14875   BEGIN
14876     OPEN c_get_lease_app;
14877     FETCH c_get_lease_app INTO ln_lease_app_id;
14878     CLOSE c_get_lease_app;
14879 
14880     RETURN ln_lease_app_id;
14881   EXCEPTION
14882    WHEN OTHERS THEN
14883      IF c_get_lease_app%ISOPEN THEN
14884        CLOSE c_get_lease_app;
14885      END IF;
14886      RETURN NULL;
14887   END get_leaseapp_id;
14888 
14889   -- ######################################################################
14890   -- FUNCTION check_contract_fin_amount
14891   -- This function checks for total financed amount on contract is
14892   -- equal to or less than the total amount approved on a Lease Application
14893   -- ######################################################################
14894   FUNCTION check_contract_fin_amount(p_contract_id IN NUMBER,
14895   									 p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
14896     RETURN VARCHAR2 IS
14897 
14898     ln_contract_financed_amount	NUMBER;
14899     ln_leaseapp_financed_amount NUMBER;
14900     ln_lease_app_id	NUMBER;
14901     ln_quote_id		NUMBER;
14902 
14903     CURSOR c_get_primary_quote(p_leaseapp_id IN NUMBER) IS
14904     SELECT id
14905     FROM okl_lease_quotes_b
14906     WHERE parent_object_id = p_leaseapp_id
14907     AND parent_object_code = 'LEASEAPP'
14908     AND primary_quote = 'Y';
14909 
14910   BEGIN
14911     ln_contract_financed_amount := contract_financed_amount(p_contract_id  =>  p_contract_id,
14912 														    p_contract_line_id  => null);
14913 
14914     -- Get Lease Application Info
14915     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
14916 
14917     IF (ln_lease_app_id IS NOT NULL) THEN
14918       OPEN c_get_primary_quote(p_leaseapp_id  =>  ln_lease_app_id);
14919       FETCH c_get_primary_quote INTO ln_quote_id;
14920       CLOSE c_get_primary_quote;
14921     END IF;
14922 
14923     IF (ln_quote_id IS NOT NULL) THEN
14924       ln_leaseapp_financed_amount := okl_lease_app_pvt.get_financed_amount(p_lease_qte_id  => ln_quote_id);
14925     END IF;
14926 
14927     IF (ln_contract_financed_amount IS NOT NULL AND ln_leaseapp_financed_amount IS NOT NULL) THEN
14928       IF ln_contract_financed_amount <= ln_leaseapp_financed_amount THEN
14929         RETURN 'P';
14930       ELSE
14931 	    RETURN 'F';
14932       END IF;
14933 	ELSE
14934 	  RETURN NULL;
14935     END IF;
14936 
14937   EXCEPTION
14938    WHEN OTHERS THEN
14939      IF c_get_primary_quote%ISOPEN THEN
14940        CLOSE c_get_primary_quote;
14941      END IF;
14942      RETURN NULL;
14943   END  check_contract_fin_amount;
14944 
14945   -- ######################################################################
14946   -- FUNCTION check_fund_amount
14947   -- This function checks for total amount funded on a contract is
14948   -- equal to or less than the total amount approved on a Lease Application
14949   -- ######################################################################
14950   FUNCTION check_fund_amount(p_contract_id IN NUMBER,
14951   							 p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
14952     RETURN VARCHAR2 IS
14953 
14954     ln_contract_funded_amount	NUMBER;
14955     ln_leaseapp_financed_amount NUMBER;
14956     ln_lease_app_id				NUMBER;
14957     ln_quote_id					NUMBER;
14958     ln_fund_amount				NUMBER	:= 0;
14959 
14960     CURSOR c_get_primary_quote(p_leaseapp_id IN NUMBER) IS
14961     SELECT id
14962     FROM okl_lease_quotes_b
14963     WHERE parent_object_id = p_leaseapp_id
14964     AND parent_object_code = 'LEASEAPP'
14965     AND primary_quote = 'Y';
14966 
14967     CURSOR c_get_fund_amount(p_contract_line_id IN NUMBER) IS
14968     SELECT nvl(amount, 0)
14969     FROM okl_trx_ap_invoices_b
14970     WHERE id = p_contract_line_id;
14971     --AND trx_status_code = 'ENTERED'
14972     --AND FUNDING_TYPE_CODE IN ('PREFUNDING', 'ASSET', 'EXPENSE');
14973 
14974   BEGIN
14975     ln_contract_funded_amount := okl_funding_pvt.get_total_funded(p_contract_id  => p_contract_id);
14976 
14977     IF (p_contract_line_id IS NOT NULL AND p_contract_line_id <> OKL_API.G_MISS_NUM) THEN
14978       OPEN c_get_fund_amount(p_contract_line_id	=> p_contract_line_id);
14979       FETCH c_get_fund_amount INTO ln_fund_amount;
14980       CLOSE c_get_fund_amount;
14981     END IF;
14982 
14983     ln_contract_funded_amount := ln_contract_funded_amount + ln_fund_amount;
14984 
14985 	-- Get Lease Application Info
14986     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
14987 
14988     IF (ln_lease_app_id IS NOT NULL) THEN
14989       OPEN c_get_primary_quote(p_leaseapp_id   =>  ln_lease_app_id);
14990       FETCH c_get_primary_quote INTO ln_quote_id;
14991       CLOSE c_get_primary_quote;
14992     END IF;
14993 
14994     IF (ln_quote_id IS NOT NULL) THEN
14995       ln_leaseapp_financed_amount := okl_lease_app_pvt.get_financed_amount(p_lease_qte_id  => ln_quote_id);
14996     END IF;
14997 
14998     IF (ln_contract_funded_amount IS NOT NULL AND ln_leaseapp_financed_amount IS NOT NULL) THEN
14999       IF ln_contract_funded_amount <= ln_leaseapp_financed_amount THEN
15000         RETURN 'P';
15001       ELSE
15002 	    RETURN 'F';
15003       END IF;
15004 	ELSE
15005 	  RETURN NULL;
15006     END IF;
15007 
15008   EXCEPTION
15009    WHEN OTHERS THEN
15010      IF c_get_primary_quote%ISOPEN THEN
15011        CLOSE c_get_primary_quote;
15012      END IF;
15013      RETURN NULL;
15014   END  check_fund_amount;
15015 
15016   -- ######################################################################
15017   -- FUNCTION check_party_custacct_match
15018   -- This function checks for Party and Customer Account on Lease Application
15019   -- and Contract are same
15020   -- ######################################################################
15021   FUNCTION check_party_custacct_match(p_contract_id IN NUMBER,
15022   									  p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
15023     RETURN VARCHAR2 IS
15024 
15025     ln_lease_app_id			NUMBER;
15026     ln_k_party_id			NUMBER;
15027 	ln_k_cust_acct_id		NUMBER;
15028     ln_lap_party_id			NUMBER;
15029 	ln_lap_cust_acct_id		NUMBER;
15030 
15031     CURSOR c_k_get_party_custacct_info IS
15032 	SELECT kp.object1_id1, okc.cust_acct_id
15033 	FROM okc_k_party_roles_b kp, okc_k_headers_b okc
15034 	WHERE kp.dnz_chr_id = p_contract_id
15035 	AND kp.rle_code = 'LESSEE'
15036 	AND kp.dnz_chr_id = okc.id;
15037 
15038     CURSOR c_lap_get_party_custacct_info(p_lease_app_id  IN NUMBER) IS
15039 	SELECT prospect_id, cust_acct_id
15040 	FROM okl_lease_applications_b
15041 	WHERE id = p_lease_app_id;
15042   BEGIN
15043 
15044     -- Get Lease Application Info
15045     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
15046 
15047     OPEN c_k_get_party_custacct_info;
15048     FETCH c_k_get_party_custacct_info INTO ln_k_party_id, ln_k_cust_acct_id;
15049     CLOSE c_k_get_party_custacct_info;
15050 
15051     OPEN c_lap_get_party_custacct_info(p_lease_app_id  => ln_lease_app_id) ;
15052     FETCH c_lap_get_party_custacct_info INTO ln_lap_party_id, ln_lap_cust_acct_id;
15053     CLOSE c_lap_get_party_custacct_info;
15054 
15055     IF (ln_k_party_id = ln_lap_party_id  AND ln_k_cust_acct_id = ln_lap_cust_acct_id) THEN
15056       RETURN 'P';
15057     ELSE
15058       RETURN 'F';
15059     END IF;
15060 
15061   EXCEPTION
15062    WHEN OTHERS THEN
15063      IF c_k_get_party_custacct_info%ISOPEN THEN
15064        CLOSE c_k_get_party_custacct_info;
15065      END IF;
15066      IF c_lap_get_party_custacct_info%ISOPEN THEN
15067        CLOSE c_lap_get_party_custacct_info;
15068      END IF;
15069      RETURN NULL;
15070   END  check_party_custacct_match;
15071 
15072   -- ######################################################################
15073   -- FUNCTION check_vendor_prog_match
15074   -- This function checks for Vendor Program on Lease Application and
15075   -- Contract are same
15076   -- ######################################################################
15077   FUNCTION check_vendor_prog_match(p_contract_id IN NUMBER,
15078   								   p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
15079     RETURN VARCHAR2 IS
15080 
15081     CURSOR c_k_vendor_prog_info IS
15082     SELECT khr_id
15083 	FROM okl_k_headers
15084 	WHERE id = p_contract_id;
15085 
15086     CURSOR c_lap_vendor_prog_info(p_lease_app_id  IN NUMBER) IS
15087     SELECT program_agreement_id
15088 	FROM okl_lease_applications_b
15089 	WHERE id = p_lease_app_id;
15090 
15091 	ln_k_prog_id				NUMBER;
15092 	ln_lap_prog_id				NUMBER;
15093 	ln_lease_app_id				NUMBER;
15094   BEGIN
15095 
15096     -- Get Lease Application Info
15097     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
15098 
15099     OPEN c_k_vendor_prog_info;
15100     FETCH c_k_vendor_prog_info INTO ln_k_prog_id;
15101     CLOSE c_k_vendor_prog_info;
15102 
15103     OPEN c_lap_vendor_prog_info(p_lease_app_id  => ln_lease_app_id);
15104     FETCH c_lap_vendor_prog_info INTO ln_lap_prog_id;
15105     CLOSE c_lap_vendor_prog_info;
15106 
15107     IF (ln_k_prog_id IS NULL AND ln_lap_prog_id IS NULL) THEN
15108       RETURN 'P';
15109     ELSIF (ln_k_prog_id = ln_lap_prog_id) THEN
15110       RETURN 'P';
15111     ELSE
15112       RETURN 'F';
15113     END IF;
15114 
15115   EXCEPTION
15116    WHEN OTHERS THEN
15117      IF c_k_vendor_prog_info%ISOPEN THEN
15118        CLOSE c_k_vendor_prog_info;
15119      END IF;
15120      IF c_lap_vendor_prog_info%ISOPEN THEN
15121        CLOSE c_lap_vendor_prog_info;
15122      END IF;
15123      RETURN NULL;
15124   END  check_vendor_prog_match;
15125 
15126   -- ######################################################################
15127   -- FUNCTION check_booking_date
15128   -- This function checks for Activation date of contract is within the
15129   -- effective dates of Lease Application
15130   -- ######################################################################
15131   FUNCTION check_booking_date(p_contract_id IN NUMBER,
15132   							  p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
15133     RETURN VARCHAR2 IS
15134 
15135     CURSOR c_k_booking_date IS
15136     SELECT date_transaction_occurred
15137 	FROM okl_trx_contracts
15138 	WHERE khr_id = p_contract_id
15139 	AND   representation_type = 'PRIMARY';	 -- MGAAP OTHER 7263041
15140 
15141 	ld_k_booking_date	DATE;
15142 	ld_lap_app_exp_date	DATE;
15143 	ln_lease_app_id		NUMBER;
15144   BEGIN
15145 
15146     -- Get Lease Application Info
15147     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
15148 
15149     OPEN c_k_booking_date;
15150     FETCH c_k_booking_date INTO ld_k_booking_date;
15151     CLOSE c_k_booking_date;
15152 
15153     ld_lap_app_exp_date := okl_lease_app_pvt.get_approval_exp_date(p_lease_app_id	=> ln_lease_app_id);
15154 
15155     IF (ld_k_booking_date IS NULL) THEN
15156       ld_k_booking_date := SYSDATE;
15157     END IF;
15158 
15159     IF (ld_lap_app_exp_date IS NOT NULL) THEN
15160 	  IF (ld_k_booking_date <= ld_lap_app_exp_date ) THEN
15161         RETURN 'P';
15162       ELSE
15163         RETURN 'F';
15164       END IF;
15165     ELSE
15166       RETURN 'P';
15167     END IF;
15168 
15169   EXCEPTION
15170    WHEN OTHERS THEN
15171      IF c_k_booking_date%ISOPEN THEN
15172        CLOSE c_k_booking_date;
15173      END IF;
15174      RETURN NULL;
15175   END  check_booking_date;
15176 
15177   -- ######################################################################
15178   -- FUNCTION check_funding_date
15179   -- This function checks for Funding date of Funding request is within the
15180   -- effective dates of Lease Application
15181   -- ######################################################################
15182   FUNCTION check_funding_date(p_contract_id IN NUMBER,
15183   							  p_contract_line_id IN NUMBER DEFAULT OKL_API.G_MISS_NUM)
15184     RETURN VARCHAR2 IS
15185 
15186     -- sjalasut, modified the cursor to have p_contract_id mapped to okl_txl_ap_inv_lns_all_b
15187     -- changes made as part of OKLR12B disbursements project.
15188     CURSOR c_k_funding_date IS
15189     SELECT a.date_invoiced
15190      	FROM okl_trx_ap_invoices_b a
15191 --          ,okl_txl_ap_inv_lns_all_b b --cklee 09/21/07
15192 --	    WHERE a.id = b.tap_id
15193        where a.khr_id = p_contract_id;
15194 
15195 	ld_k_funded_date	DATE;
15196 	ld_lap_app_exp_date	DATE;
15197 	ln_lease_app_id		NUMBER;
15198   BEGIN
15199     -- Get Lease Application Info
15200     ln_lease_app_id := get_leaseapp_id(p_contract_id	=>	p_contract_id);
15201 
15202     OPEN c_k_funding_date;
15203     FETCH c_k_funding_date INTO ld_k_funded_date;
15204     CLOSE c_k_funding_date;
15205 
15206     ld_lap_app_exp_date := okl_lease_app_pvt.get_approval_exp_date(p_lease_app_id	=> ln_lease_app_id);
15207 
15208     IF (ld_lap_app_exp_date IS NOT NULL) THEN
15209 	  IF (ld_k_funded_date <= ld_lap_app_exp_date ) THEN
15210         RETURN 'P';
15211       ELSE
15212         RETURN 'F';
15213       END IF;
15214     ELSE
15215       RETURN 'P';
15216     END IF;
15217 
15218   EXCEPTION
15219    WHEN OTHERS THEN
15220      IF c_k_funding_date%ISOPEN THEN
15221        CLOSE c_k_funding_date;
15222      END IF;
15223      RETURN NULL;
15224   END  check_funding_date;
15225   -- rravikir End -- Bug 5055835
15226 
15227    -- ######################################################################
15228    -- FUNCTION asset_accu_deprn_reserve
15229    -- Returns fixed asset accumulated depreciation reserve for a financial asset
15230    -- line.
15231    -- ######################################################################
15232   FUNCTION asset_accu_deprn_reserve(
15233                              p_contract_id       IN  NUMBER
15234                             ,p_contract_line_id  IN NUMBER
15235                            )
15236    RETURN NUMBER  IS
15237 
15238      l_api_name          CONSTANT VARCHAR2(30) := 'ASSET_ACCU_DEPRN_RESERVE';
15239      l_api_version       CONSTANT NUMBER	      := 1;
15240      x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
15241      x_msg_count         NUMBER;
15242      x_msg_data          VARCHAR2(256);
15243 
15244      l_asset_hdr_rec            FA_API_TYPES.asset_hdr_rec_type;
15245      l_asset_deprn_rec          FA_API_TYPES.asset_deprn_rec_type;
15246 
15247      l_converted_amount         NUMBER;
15248      l_contract_start_date      DATE;
15249      l_contract_currency        OKL_K_HEADERS_FULL_V.currency_code%TYPE;
15250      l_currency_conversion_type OKL_K_HEADERS_FULL_V.currency_conversion_type%TYPE;
15251      l_currency_conversion_rate OKL_K_HEADERS_FULL_V.currency_conversion_rate%TYPE;
15252      l_currency_conversion_date OKL_K_HEADERS_FULL_V.currency_conversion_date%TYPE;
15253 
15254      CURSOR l_asset_csr(p_chr_id  IN NUMBER
15255                        ,p_cle_id  IN NUMBER
15256                        ,p_book_class  IN VARCHAR2  -- 7626121
15257                        ,p_book_type_code  IN VARCHAR2) IS
15258      SELECT fab.asset_id,
15259             fab.book_type_code
15260      FROM okc_k_lines_v fin_ast_cle,
15261           okc_statuses_b stsb,
15262           fa_additions fad,
15263           fa_book_controls fbc,
15264           fa_books fab
15265      WHERE fin_ast_cle.id = p_cle_id
15266      AND   fin_ast_cle.dnz_chr_id = p_chr_id
15267      AND   fin_ast_cle.chr_id = p_chr_id
15268      AND   fin_ast_cle.sts_code = stsb.code
15269      AND   stsb.ste_code NOT IN ('HOLD','CANCELLED')
15270      AND   fad.asset_number = fin_ast_cle.name
15271      AND   fab.asset_id = fad.asset_id
15272      AND   fab.book_type_code = fbc.book_type_code
15273      AND   fab.transaction_header_id_out IS NULL
15274      --AND   fbc.book_class = 'CORPORATE';
15275      AND   fbc.book_class = p_book_class
15276      AND   fab.book_type_code = NVL(p_book_type_code,fab.book_type_code);
15277 
15278 
15279      l_asset_rec  l_asset_csr%ROWTYPE;
15280 
15281 
15282      CURSOR contract_start_date_csr(p_chr_id NUMBER) IS
15283      SELECT start_date
15284      FROM okc_k_headers_b
15285      WHERE id = p_chr_id;
15286 
15287     l_streams_repo_policy VARCHAR2(80); -- 7626121
15288     l_book_class FA_BOOK_CONTROLS.BOOK_CLASS%TYPE := null;
15289     l_book_type_code FA_BOOK_CONTROLS.BOOK_TYPE_CODE%TYPE := null;
15290 
15291 
15292    BEGIN
15293 
15294        IF (( p_contract_id IS NULL ) OR ( p_contract_line_id IS NULL )) THEN
15295            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
15296        END IF;
15297 
15298       -- 7626121
15299       l_streams_repo_policy := OKL_STREAMS_SEC_PVT.GET_STREAMS_POLICY;
15300       l_book_type_code := NULL;
15301       IF (l_streams_repo_policy = 'PRIMARY') THEN
15302         l_book_class := 'CORPORATE';
15303       ELSE
15304         l_book_class := 'TAX';
15305         l_book_type_code := OKL_ACCOUNTING_UTIL.get_fa_reporting_book(
15306                               p_kle_id => p_contract_line_id);
15307       END IF;
15308 
15309        OPEN  l_asset_csr(p_chr_id => p_contract_id,
15310                          p_cle_id => p_contract_line_id,
15311                          p_book_class => l_book_class, -- 7626121
15312                          p_book_type_code => l_book_type_code);
15313         FETCH l_asset_csr INTO l_asset_rec;
15314         IF( l_asset_csr%NOTFOUND ) THEN
15315 
15316               CLOSE l_asset_csr;
15317               RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
15318            END IF;
15319            CLOSE l_asset_csr;
15320 
15321        l_asset_hdr_rec.asset_id          := l_asset_rec.asset_id;
15322        l_asset_hdr_rec.book_type_code    := l_asset_rec.book_type_code;
15323 
15324        IF NOT fa_cache_pkg.fazcbc(x_book => l_asset_hdr_rec.book_type_code) THEN
15325          OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
15326                              p_msg_name     => 'OKL_LLA_FA_CACHE_ERROR'
15327                             );
15328          RAISE OKL_API.G_EXCEPTION_ERROR;
15329        END IF;
15330 
15331 
15332        -- To fetch Depreciation Reserve
15333        IF NOT FA_UTIL_PVT.get_asset_deprn_rec
15334                (p_asset_hdr_rec         => l_asset_hdr_rec ,
15335                 px_asset_deprn_rec      => l_asset_deprn_rec,
15336                 p_period_counter        => NULL,
15337                 p_mrc_sob_type_code     => 'P'
15338                 ) THEN
15339          OKL_API.SET_MESSAGE(p_app_name     => g_app_name,
15340                              p_msg_name     => 'OKL_LLA_FA_DEPRN_REC_ERROR'
15341                             );
15342          RAISE OKL_API.G_EXCEPTION_ERROR;
15343        END IF;
15344 
15345 
15346 
15347        -- convert amount into contract currency
15348        OPEN contract_start_date_csr(p_chr_id => p_contract_id);
15349        FETCH contract_start_date_csr INTO l_contract_start_date;
15350        CLOSE contract_start_date_csr;
15351 
15352        l_converted_amount := 0;
15353        OKL_ACCOUNTING_UTIL.CONVERT_TO_CONTRACT_CURRENCY(
15354          p_khr_id                   => p_contract_id,
15355          p_from_currency            => NULL,
15356          p_transaction_date         => l_contract_start_date,
15357          p_amount                   => l_asset_deprn_rec.deprn_reserve,
15358          x_return_status            => x_return_status,
15359          x_contract_currency        => l_contract_currency,
15360          x_currency_conversion_type => l_currency_conversion_type,
15361          x_currency_conversion_rate => l_currency_conversion_rate,
15362          x_currency_conversion_date => l_currency_conversion_date,
15363          x_converted_amount         => l_converted_amount);
15364 
15365 
15366        IF(x_return_status <> Okl_Api.G_RET_STS_SUCCESS) THEN
15367          Okl_Api.Set_Message(p_app_name     => Okl_Api.G_APP_NAME,
15368                              p_msg_name     => 'OKL_CONV_TO_FUNC_CURRENCY_FAIL');
15369          RAISE Okl_Api.G_EXCEPTION_ERROR;
15370        END IF;
15371 
15372        RETURN l_converted_amount;
15373 
15374      EXCEPTION
15375 
15376        WHEN OKL_API.G_EXCEPTION_ERROR THEN
15377          RETURN NULL;
15378 
15379  	WHEN OTHERS THEN
15380          Okl_Api.SET_MESSAGE(
15381            p_app_name     => G_APP_NAME,
15382            p_msg_name     => G_UNEXPECTED_ERROR,
15383            p_token1       => G_SQLCODE_TOKEN,
15384            p_token1_value => SQLCODE,
15385            p_token2       => G_SQLERRM_TOKEN,
15386            p_token2_value => SQLERRM);
15387         RETURN NULL;
15388 
15389    END asset_accu_deprn_reserve;
15390 
15391  -- Added by mansrini for ER Bug#6011738
15392    -- ---------------------------------------------------------------
15393    -- FUNCTION   : lease_quote_financed_amount
15394    --
15395    -- DESC       : Returns Financed Amount for an asset on a sales
15396    --              quote which is calculated as ->
15397    --              Asset Cost + Add-ons + Capitalized Fees
15398    --              - Capitalized Down Payments - Trade Ins.
15399    --
15400    -- PARAMETERS : Passed NONE, requires ASSET_ID to be passed as
15401    --              additional parameter from okl_execute_formula_pub
15402    --              which is the asset on quote for which to calculate
15403    --              financed amount.
15404    -- ---------------------------------------------------------------
15405    FUNCTION lease_quote_financed_amount
15406    RETURN NUMBER  IS
15407    --cursor to get asset cost
15408      CURSOR c_asset_cost (p_asset_id IN NUMBER) IS
15409            SELECT  (ASSETCOMP.NUMBER_OF_UNITS * ASSETCOMP.UNIT_COST) AST_COST
15410            FROM    OKL_ASSET_COMPONENTS_B ASSETCOMP
15411            WHERE   ASSETCOMP.PRIMARY_COMPONENT = 'YES'
15412            AND     ASSETCOMP.ASSET_ID =  p_asset_id;
15413 
15414    --cursor to get asset Add-On amount
15415      CURSOR c_addOn_cost (p_asset_id IN NUMBER) IS
15416        SELECT  sum(ASSETCOMP.NUMBER_OF_UNITS * ASSETCOMP.UNIT_COST) ADDON_AMNT
15417            FROM    OKL_ASSET_COMPONENTS_B ASSETCOMP
15418            WHERE   ASSETCOMP.PRIMARY_COMPONENT = 'NO'
15419            AND     ASSETCOMP.ASSET_ID = p_asset_id;
15420 
15421    -- cursor to get capitalized fee amount for the asset
15422      CURSOR c_cap_fee_amnt (p_asset_id IN NUMBER) IS
15423            SELECT  SUM(amount) capitalized_fee_amount
15424            FROM    okl_line_relationships_v lre
15425            WHERE   source_line_type = 'ASSET'
15426            AND     related_line_type = 'CAPITALIZED'
15427            AND     source_line_id = p_asset_id;
15428 
15429    --cursor to get capitalized down payment for the asset
15430      CURSOR c_cap_down_pmnt (p_asset_id IN NUMBER) IS
15431            SELECT  sum(adj.value) cap_down_payment
15432        FROM    okl_assets_b ast, okl_cost_adjustments_b adj
15433        WHERE   ast.parent_object_code = 'LEASEQUOTE'
15434        AND     adj.parent_object_id = ast.id
15435        AND     adj.ADJUSTMENT_SOURCE_TYPE = 'DOWN_PAYMENT'
15436        AND     adj.PROCESSING_TYPE = 'CAPITALIZE'
15437        AND     ast.id =  p_asset_id;
15438 
15439    --cursor to get trade-in amount for the asset
15440      CURSOR c_tradein_amnt (p_asset_id IN NUMBER) IS
15441            SELECT  sum(adj.value) tradeIn_amount
15442        FROM    okl_assets_b ast,  okl_cost_adjustments_b adj
15443        WHERE   ast.parent_object_code = 'LEASEQUOTE'
15444        AND     adj.parent_object_id = ast.id
15445        AND     adj.adjustment_source_type = 'TRADEIN'
15446        AND     ast.id = p_asset_id;
15447 
15448        l_asset_id         NUMBER;
15449 
15450        l_financed_amount  NUMBER;
15451        l_asset_cost       NUMBER;
15452        l_add_on_amnt      NUMBER;
15453        l_cap_fee_amnt     NUMBER;
15454        l_cap_down_pmnt    NUMBER;
15455        l_trade_in_amnt    NUMBER;
15456 
15457     BEGIN
15458 
15459        -- get asset id passed as additional parameters
15460        IF  okl_execute_formula_pub.g_additional_parameters.EXISTS(1)
15461            AND okl_execute_formula_pub.g_additional_parameters(1).name =
15462 'ASSET_ID'
15463            AND okl_execute_formula_pub.g_additional_parameters(1).value IS NOT
15464 NULL
15465            THEN
15466               l_asset_id :=
15467 to_number(okl_execute_formula_pub.g_additional_parameters(1).value);
15468        END IF;
15469 
15470        IF (l_asset_id IS NULL) THEN
15471            RAISE OKL_API.G_EXCEPTION_ERROR;
15472        END IF;
15473 
15474        -- get asset cost
15475        l_asset_cost := 0;
15476        OPEN   c_asset_cost(l_asset_id);
15477        FETCH  c_asset_cost INTO l_asset_cost;
15478        IF( c_asset_cost%NOTFOUND ) THEN
15479            CLOSE c_asset_cost;
15480            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
15481        END IF;
15482        CLOSE c_asset_cost;
15483 
15484        -- get add-on amount
15485        OPEN   c_addOn_cost(l_asset_id);
15486        FETCH  c_addOn_cost INTO l_add_on_amnt;
15487        CLOSE c_addOn_cost;
15488        IF l_add_on_amnt is null then
15489            l_add_on_amnt := 0;
15490        END IF;
15491 
15492        -- get capitalized fee amount
15493        OPEN   c_cap_fee_amnt(l_asset_id);
15494        FETCH  c_cap_fee_amnt INTO l_cap_fee_amnt;
15495        CLOSE c_cap_fee_amnt;
15496        IF l_cap_fee_amnt is null then
15497            l_cap_fee_amnt := 0;
15498        END IF;
15499 
15500        -- get capitalized down payment amount
15501        OPEN   c_cap_down_pmnt(l_asset_id);
15502        FETCH  c_cap_down_pmnt INTO l_cap_down_pmnt;
15503        CLOSE c_cap_down_pmnt;
15504        IF l_cap_down_pmnt is null then
15505            l_cap_down_pmnt := 0;
15506        END IF;
15507 
15508        -- get trade-in amount
15509        OPEN   c_tradein_amnt(l_asset_id);
15510        FETCH  c_tradein_amnt INTO l_trade_in_amnt;
15511        CLOSE c_tradein_amnt;
15512        IF l_trade_in_amnt is null then
15513            l_trade_in_amnt := 0;
15514        END IF;
15515 
15516        l_financed_amount := l_asset_cost + l_add_on_amnt + l_cap_fee_amnt -
15517 l_cap_down_pmnt - l_trade_in_amnt;
15518 
15519        RETURN l_financed_amount;
15520    EXCEPTION
15521    WHEN OKL_API.G_EXCEPTION_ERROR THEN
15522        IF c_asset_cost%ISOPEN THEN
15523           CLOSE c_asset_cost;
15524        END IF;
15525        IF c_addOn_cost%ISOPEN THEN
15526           CLOSE c_addOn_cost;
15527        END IF;
15528        IF c_cap_fee_amnt%ISOPEN THEN
15529           CLOSE c_cap_fee_amnt;
15530        END IF;
15531        IF c_cap_down_pmnt%ISOPEN THEN
15532           CLOSE c_cap_down_pmnt;
15533        END IF;
15534        IF c_tradein_amnt%ISOPEN THEN
15535           CLOSE c_tradein_amnt;
15536        END IF;
15537        RETURN NULL;
15538    WHEN OTHERS THEN
15539        Okl_Api.SET_MESSAGE(
15540              p_app_name     => G_APP_NAME,
15541              p_msg_name     => G_UNEXPECTED_ERROR,
15542              p_token1       => G_SQLCODE_TOKEN,
15543              p_token1_value => SQLCODE,
15544              p_token2       => G_SQLERRM_TOKEN,
15545              p_token2_value => SQLERRM);
15546        IF c_asset_cost%ISOPEN THEN
15547           CLOSE c_asset_cost;
15548        END IF;
15549        IF c_addOn_cost%ISOPEN THEN
15550           CLOSE c_addOn_cost;
15551        END IF;
15552        IF c_cap_fee_amnt%ISOPEN THEN
15553           CLOSE c_cap_fee_amnt;
15554        END IF;
15555        IF c_cap_down_pmnt%ISOPEN THEN
15556           CLOSE c_cap_down_pmnt;
15557        END IF;
15558        IF c_tradein_amnt%ISOPEN THEN
15559           CLOSE c_tradein_amnt;
15560        END IF;
15561        RETURN NULL;
15562    END lease_quote_financed_amount;
15563    -- End by mansrini for ER Bug#6011738
15564 
15565    -- Start : Added by mansrini for ER Bug#6011738
15566    -- -----------------------------------------------------------------------
15567    -- FUNCTION   : line_financed_amount
15568    --
15569    -- DESC       : Returns Financed Amount for an asset line of a contract
15570    --              which is calculated as
15571    --              Financed Amount =  Asset Cost
15572    --                               + Add-On to the asset
15573    --                               + Capitalized Fee associated to the asset
15574    --                               - Capitalized Down Payment for the asset
15575    --                               - Trade-In Amount associated to the asset
15576    --
15577    -- PARAMETERS : IN p_contract_id, p_contract_line_id
15578    -- -----------------------------------------------------------------------
15579    FUNCTION line_financed_amount(p_contract_id IN NUMBER
15580                                 ,p_contract_line_id IN NUMBER)
15581    RETURN NUMBER  IS
15582       G_APP_NAME                   CONSTANT  VARCHAR2(3)   :=
15583 OKL_API.G_APP_NAME;
15584       G_PKG_NAME                   CONSTANT  VARCHAR2(200) := 'OKL_FORMULA_PVT';
15585       G_COL_NAME_TOKEN             CONSTANT  VARCHAR2(200) :=
15586 OKL_API.G_COL_NAME_TOKEN;
15587       G_NO_MATCHING_RECORD         CONSTANT  VARCHAR2(200) :=
15588 'OKL_LLA_NO_MATCHING_RECORD';
15589       G_SQLERRM_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLERRM';
15590       G_SQLCODE_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLCODE';
15591       G_LINE_RECORD                CONSTANT  VARCHAR2(200) :=
15592 'OKL_LLA_LINE_RECORD';
15593       G_INVALID_CRITERIA           CONSTANT  VARCHAR2(200) :=
15594 'OKL_LLA_INVALID_CRITERIA';
15595       l_return_status                        VARCHAR2(3)   :=
15596 OKL_API.G_RET_STS_SUCCESS;
15597 
15598       l_lty_code                             OKC_LINE_STYLES_V.LTY_CODE%TYPE;
15599       l_financed_amount                      NUMBER;
15600       l_asset_cost                           NUMBER;
15601       l_addon                                NUMBER;
15602       l_cap_fee                              NUMBER;
15603       l_trade_in                             NUMBER;
15604       l_cap_down_pmnt                        NUMBER;
15605       l_cap_down_pct                         NUMBER;
15606       l_cap_down_pmnt_yn                     VARCHAR2(3);
15607 
15608       -- Cursor to get the lty_code
15609       CURSOR get_lty_code(p_line_id NUMBER) IS
15610        SELECT lse.lty_code
15611          FROM okc_k_lines_b cle,
15612               okc_line_styles_b lse
15613         WHERE cle.id = p_line_id
15614           AND cle.lse_id = lse.id;
15615 
15616       -- Cursor to sum up asset cost for given Asset line
15617       CURSOR c_asset_cost(p_line_id NUMBER,
15618                           p_dnz_chr_id NUMBER) IS
15619        SELECT SUM(cle.price_unit * cim.number_of_items) asset_cost
15620          FROM okc_subclass_top_line stl,
15621               okc_line_styles_b lse2,
15622               okc_line_styles_b lse1,
15623               okc_k_items_v cim,
15624               okc_k_lines_v cle
15625         WHERE cle.cle_id = p_line_id
15626           AND cle.dnz_chr_id = p_dnz_chr_id
15627           AND cle.id = cim.cle_id
15628           AND cle.dnz_chr_id = cim.dnz_chr_id
15629           AND cle.lse_id = lse1.id
15630           AND lse1.lty_code = 'ITEM'
15631           AND lse1.lse_parent_id = lse2.id
15632           AND lse2.lty_code = 'FREE_FORM1'
15633           AND lse2.id = stl.lse_id
15634           AND stl.scs_code IN ('LEASE','LOAN');
15635 
15636       -- Cursor to sum up addon amount for a given line
15637       CURSOR c_addon(p_line_id NUMBER,
15638                      p_dnz_chr_id NUMBER) IS
15639        SELECT SUM(cle.price_unit* cim.number_of_items) add_on
15640          FROM okc_subclass_top_line stl,
15641               okc_line_styles_b lse3,
15642               okc_line_styles_b lse2,
15643               okc_line_styles_b lse1,
15644               okc_k_items_v cim,
15645               okc_k_lines_b cle
15646         WHERE cle.dnz_chr_id = p_dnz_chr_id
15647           AND cle.dnz_chr_id = cim.dnz_chr_id
15648           AND cle.id = cim.cle_id
15649           AND cle.lse_id = lse1.id
15650           AND lse1.lty_code = 'ADD_ITEM'
15651           AND lse1.lse_parent_id = lse2.id
15652           AND lse2.lty_code = 'ITEM'
15653           AND lse2.lse_parent_id = lse3.id
15654           AND lse3.lty_code = 'FREE_FORM1'
15655           AND lse3.id = stl.lse_id
15656           AND stl.scs_code IN ('LEASE','LOAN')
15657           AND exists (SELECT 1
15658                         FROM okc_subclass_top_line stlx,
15659                              okc_line_styles_b lse2x,
15660                              okc_line_styles_b lse1x,
15661                              okc_k_lines_b clex
15662                        WHERE clex.cle_id = p_line_id
15663                          AND clex.dnz_chr_id = p_dnz_chr_id
15664                          AND clex.lse_id = lse1x.id
15665                          AND lse1x.lty_code = 'ITEM'
15666                          AND lse1x.lse_parent_id = lse2x.id
15667                          AND lse2x.lty_code = 'FREE_FORM1'
15668                          AND lse2x.id = stlx.lse_id
15669                          AND stlx.scs_code IN ('LEASE','LOAN')
15670                          AND clex.id = cle.cle_id);
15671 
15672       --Cursor for Capitalized Fee
15673       CURSOR c_cap_fee(p_line_id VARCHAR2,
15674                        p_dnz_chr_id OKC_K_HEADERS_B.ID%TYPE) IS
15675        SELECT SUM(kle_cov.capital_amount) Cap_fee
15676          FROM okc_line_styles_b  lseb,
15677               okc_k_items        cim,
15678               okl_k_lines        kle_cov,
15679               okc_k_lines_b      cleb_cov,
15680               okc_statuses_b     stsb
15681         WHERE lseb.id               = cleb_cov.lse_id
15682           AND lseb.lty_code         = 'LINK_FEE_ASSET'
15683           AND cim.jtot_object1_code = 'OKX_COVASST'
15684           AND cleb_cov.id           =  cim.cle_id
15685           AND kle_cov.id            =  cleb_cov.id
15686           AND cleb_cov.dnz_chr_id   =  cim.dnz_chr_id
15687           AND cleb_cov.dnz_chr_id   =  p_dnz_chr_id
15688           AND cim.object1_id1       =  p_line_id
15689           AND cleb_cov.sts_code     =  stsb.code
15690           AND stsb.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED',
15691 'HOLD');
15692 
15693       --Cursor for Trade-in Amount and Capital Down Payment
15694       CURSOR c_asset_adjust(p_line_id NUMBER,
15695                             p_dnz_chr_id NUMBER) IS
15696        SELECT NVL(kle.capital_reduction,0) capital_reduction,
15697               NVL(kle.tradein_amount,0) tradein_amount,
15698               NVL(kle.capital_reduction_percent,0) capital_reduction_percent,
15699               kle.capitalize_down_payment_yn capitalize_down_payment_yn
15700          FROM okc_line_styles_b ls,
15701               okl_k_lines_full_v kle,
15702               okc_statuses_b sts
15703         WHERE kle.dnz_chr_id = p_dnz_chr_id
15704           AND kle.id = p_line_id
15705           AND ls.id = kle.lse_id
15706           AND ls.lty_code ='FREE_FORM1'
15707           AND kle.sts_code = sts.code
15708           AND sts.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED',
15709 'HOLD');
15710 
15711    BEGIN
15712           -- To get the Line Style Code
15713           OPEN  get_lty_code(p_line_id => p_contract_line_id);
15714              IF get_lty_code%NOTFOUND THEN
15715                 OKL_API.set_message(p_app_name     => G_APP_NAME,
15716                                     p_msg_name     => G_NO_MATCHING_RECORD,
15717                                     p_token1       => G_COL_NAME_TOKEN,
15718                                     p_token1_value => 'Financial Asset Line');
15719                 RAISE OKL_API.G_EXCEPTION_ERROR;
15720              END IF;
15721           FETCH get_lty_code INTO l_lty_code;
15722           CLOSE get_lty_code;
15723 
15724           IF l_lty_code = 'FREE_FORM1' THEN
15725              -- To get the asset cost
15726              OPEN c_asset_cost(p_line_id => p_contract_line_id,
15727                                p_dnz_chr_id => p_contract_id);
15728                 IF c_asset_cost%NOTFOUND THEN
15729                    OKL_API.set_message(p_app_name     => G_APP_NAME,
15730                                        p_msg_name     => G_NO_MATCHING_RECORD,
15731                                        p_token1       => G_COL_NAME_TOKEN,
15732                                        p_token1_value => 'Model Line');
15733                    RAISE OKL_API.G_EXCEPTION_ERROR;
15734                 END IF;
15735              FETCH c_asset_cost INTO l_asset_cost;
15736              CLOSE c_asset_cost;
15737 
15738              -- To get the Addon
15739 -- DJANASWA change begin 11/12/08
15740 
15741 /*             OPEN c_addon(p_line_id => p_contract_line_id,
15742                           p_dnz_chr_id => p_contract_id);
15743              FETCH c_addon INTO l_addon;
15744              CLOSE c_addon;
15745 */
15746             l_addon :=  Okl_Seeded_Functions_Pvt.total_asset_addon_cost(
15747                         p_contract_id => p_contract_id, p_contract_line_id => p_contract_line_id);
15748 
15749 -- DJANASWA change end 11/12/08
15750 
15751             l_addon := NVL(l_addon,0);
15752 
15753              -- To get the Capitalized Fee
15754              OPEN c_cap_fee(p_line_id => TO_CHAR(p_contract_line_id),
15755                             p_dnz_chr_id => p_contract_id);
15756              FETCH c_cap_fee INTO l_cap_fee;
15757              CLOSE c_cap_fee;
15758              l_cap_fee := NVL(l_cap_fee,0);
15759 
15760              -- To get the Trade-in and Capitalized Down Payment
15761              OPEN c_asset_adjust(p_line_id => p_contract_line_id,
15762                           p_dnz_chr_id => p_contract_id);
15763              FETCH c_asset_adjust INTO
15764 l_cap_down_pmnt,l_trade_in,l_cap_down_pct,l_cap_down_pmnt_yn;
15765              CLOSE c_asset_adjust;
15766              l_trade_in := NVL(l_trade_in,0);
15767              l_cap_down_pmnt := NVL(l_cap_down_pmnt,0);
15768              l_cap_down_pct := NVL(l_cap_down_pct,0);
15769              l_cap_down_pmnt_yn := NVL(l_cap_down_pmnt_yn,'N');
15770 
15771              IF l_cap_down_pct<>0 THEN
15772                  l_cap_down_pmnt := (l_asset_cost + l_addon) *
15773 l_cap_down_pct/100;
15774              END IF;
15775 
15776              --Calculation of Financed Amount
15777              --on the basis of Capitalized Down Payment Flag
15778              IF l_cap_down_pmnt_yn = 'N' THEN
15779                l_financed_amount := l_asset_cost + l_addon + l_cap_fee  -
15780 l_trade_in;
15781              ELSE
15782                l_financed_amount := l_asset_cost + l_addon + l_cap_fee  -
15783 l_cap_down_pmnt - l_trade_in;
15784              END IF;
15785 
15786           ELSE
15787              OKL_API.set_message(p_app_name     => G_APP_NAME,
15788                                  p_msg_name     => G_LINE_RECORD);
15789              RAISE OKL_API.G_EXCEPTION_ERROR;
15790           END IF;
15791           RETURN l_financed_amount;
15792    EXCEPTION
15793        WHEN OKL_API.G_EXCEPTION_ERROR THEN
15794         -- If the cursor is open then it has to be closed
15795           IF get_lty_code%ISOPEN THEN
15796             CLOSE get_lty_code;
15797           END IF;
15798           IF c_asset_cost%ISOPEN THEN
15799             CLOSE c_asset_cost;
15800           END IF;
15801           IF c_addon%ISOPEN THEN
15802             CLOSE c_addon;
15803           END IF;
15804           IF c_cap_fee%ISOPEN THEN
15805             CLOSE c_cap_fee;
15806           END IF;
15807           IF c_asset_adjust%ISOPEN THEN
15808             CLOSE c_asset_adjust;
15809           END IF;
15810           RETURN NULL;
15811        WHEN OTHERS THEN
15812         -- If the cursor is open then it has to be closed
15813           IF get_lty_code%ISOPEN THEN
15814             CLOSE get_lty_code;
15815           END IF;
15816           IF c_asset_cost%ISOPEN THEN
15817             CLOSE c_asset_cost;
15818           END IF;
15819           IF c_addon%ISOPEN THEN
15820             CLOSE c_addon;
15821           END IF;
15822           IF c_cap_fee%ISOPEN THEN
15823             CLOSE c_cap_fee;
15824           END IF;
15825           IF c_asset_adjust%ISOPEN THEN
15826             CLOSE c_asset_adjust;
15827           END IF;
15828           RETURN NULL;
15829    END line_financed_amount;
15830 
15831    -- --------------------------------------------------------------------
15832    -- FUNCTION   : front_end_financed_amount
15833    --
15834    -- DESC       : Returns Financed Amount for a financial asset line
15835    --              depending upon the parameters passed
15836    --
15837    --              If p_contract_id and p_contract_line_id are NULL,
15838    --              it implies that the function is called from LEASE
15839    --              QUOTE process and the financed amount is calculated
15840    --              using the function lease_quote_financed_amount().
15841    --
15842    --              And if p_contract_id and p_contract_line_id are not
15843    --              NULL, then it implies that the function is called
15844    --              from AUTHORING process and the financed amount is then
15845    --              calculated using the function line_financed_amount().
15846    --
15847    -- PARAMETERS : IN p_contract_id, p_contract_line_id
15848    -- --------------------------------------------------------------------
15849    FUNCTION front_end_financed_amount( p_contract_id IN NUMBER
15850                                       ,p_contract_line_id IN NUMBER)
15851    RETURN NUMBER IS
15852       G_APP_NAME                   CONSTANT  VARCHAR2(3)   :=
15853 OKL_API.G_APP_NAME;
15854       G_PKG_NAME                   CONSTANT  VARCHAR2(200) := 'OKL_FORMULA_PVT';
15855       G_SQLERRM_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLERRM';
15856       G_SQLCODE_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLCODE';
15857       G_INVALID_CRITERIA           CONSTANT  VARCHAR2(200) :=
15858 'OKL_LLA_INVALID_CRITERIA';
15859       l_api_name                   CONSTANT  VARCHAR2(30)  :=
15860 'FRONT_END_FINANCED_AMOUNT';
15861 
15862       l_financed_amt                         NUMBER        := 0;
15863 
15864    BEGIN
15865       -- Call from LEASE QUOTE
15866       IF p_contract_id IS NULL AND p_contract_line_id IS NULL THEN
15867          l_financed_amt := lease_quote_financed_amount;
15868 
15869       -- Call from AUTHORING
15870       ELSIF (p_contract_id IS NOT NULL OR
15871              p_contract_id <> Okl_Api.G_MISS_NUM) AND
15872             (p_contract_line_id IS NOT NULL OR
15873              p_contract_line_id <> Okl_Api.G_MISS_NUM) THEN
15874          l_financed_amt := line_financed_amount(p_contract_id => p_contract_id,
15875                                                 p_contract_line_id =>
15876 p_contract_line_id);
15877 
15878       ELSE
15879          RAISE OKL_API.G_EXCEPTION_ERROR;
15880       END IF;
15881 
15882       RETURN l_financed_amt;
15883 
15884    EXCEPTION
15885       WHEN OKL_API.G_EXCEPTION_ERROR THEN
15886          OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
15887                              p_msg_name     => G_INVALID_CRITERIA);
15888          RETURN NULL;
15889       WHEN OTHERS THEN
15890          OKL_API.SET_MESSAGE(
15891                              p_app_name     => G_APP_NAME,
15892                              p_msg_name     => G_UNEXPECTED_ERROR,
15893                              p_token1       => G_SQLCODE_TOKEN,
15894                              p_token1_value => SQLCODE,
15895                              p_token2       => G_SQLERRM_TOKEN,
15896                              p_token2_value => SQLERRM);
15897          RETURN NULL;
15898    END front_end_financed_amount;
15899    --End by mansrini for Bug#6011738
15900 
15901 
15902    -- --------------------------------------------------------------------
15903    -- FUNCTION   : total_asset_addon_cost
15904    --
15905    -- DESC       : Returns total asset addon cost.
15906    --
15907    -- PARAMETERS : IN p_contract_id, p_contract_line_id
15908    -- Added by Durga Janaswamy
15909    -- --------------------------------------------------------------------
15910    FUNCTION total_asset_addon_cost ( p_contract_id IN NUMBER
15911                                       ,p_contract_line_id IN NUMBER)
15912    RETURN NUMBER IS
15913       G_APP_NAME                   CONSTANT  VARCHAR2(3)   := OKL_API.G_APP_NAME;
15914       G_PKG_NAME                   CONSTANT  VARCHAR2(200) := 'OKL_FORMULA_PVT';
15915       G_SQLERRM_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLERRM';
15916       G_SQLCODE_TOKEN              CONSTANT  VARCHAR2(200) := 'SQLCODE';
15917       G_INVALID_CRITERIA           CONSTANT  VARCHAR2(200) := 'OKL_LLA_INVALID_CRITERIA';
15918       l_api_name                   CONSTANT  VARCHAR2(30)  := 'TOTAL_ASSET_ADDON_COST';
15919 
15920       l_addon_cost                         NUMBER        := 0;
15921 
15922    CURSOR c_addon_cost_csr (p_contract_id IN NUMBER,
15923                             p_contract_line_id IN NUMBER) IS
15924          SELECT SUM(cle.price_unit* cim.number_of_items) add_on_cost
15925          FROM okc_subclass_top_line stl,
15926               okc_line_styles_b lse3,
15927               okc_line_styles_b lse2,
15928               okc_line_styles_b lse1,
15929               okc_k_items_v cim,
15930               okc_k_lines_b cle
15931         WHERE cle.dnz_chr_id = p_contract_id
15932           AND cle.dnz_chr_id = cim.dnz_chr_id
15933           AND cle.id = cim.cle_id
15934           AND cle.lse_id = lse1.id
15935           AND lse1.lty_code = 'ADD_ITEM'    -- G_ADDON_LINE_LTY_CODE
15936           AND lse1.lse_parent_id = lse2.id
15937           AND lse2.lty_code = 'ITEM'          -- G_MODEL_LINE_LTY_CODE
15938           AND lse2.lse_parent_id = lse3.id
15939           AND lse3.lty_code = 'FREE_FORM1'   --  G_FIN_LINE_LTY_CODE
15940           AND lse3.id = stl.lse_id
15941           AND stl.scs_code IN ('LEASE','LOAN')
15942           AND exists (SELECT 1
15943                         FROM okc_subclass_top_line stlx,
15944                              okc_line_styles_b lse2x,
15945                              okc_line_styles_b lse1x,
15946                              okc_k_lines_b clex
15947                        WHERE clex.cle_id = p_contract_line_id   -- lse_id = 33>
15948                          AND clex.dnz_chr_id = p_contract_id
15949                          AND clex.lse_id = lse1x.id
15950                          AND lse1x.lty_code = 'ITEM'  -- G_MODEL_LINE_LTY_CODE
15951                          AND lse1x.lse_parent_id = lse2x.id
15952                          AND lse2x.lty_code = 'FREE_FORM1' -- G_FIN_LINE_LTY_CODE
15953                          AND lse2x.id = stlx.lse_id
15954                          AND stlx.scs_code IN ('LEASE','LOAN')
15955                          AND clex.id = cle.cle_id);
15956 
15957 
15958    BEGIN
15959 
15960         IF (p_contract_id IS NOT NULL OR
15961              p_contract_id <> Okl_Api.G_MISS_NUM) AND
15962             (p_contract_line_id IS NOT NULL OR
15963              p_contract_line_id <> Okl_Api.G_MISS_NUM) THEN
15964 
15965            OPEN  c_addon_cost_csr ( p_contract_id => p_contract_id,
15966                                     p_contract_line_id => p_contract_line_id);
15967 
15968                    IF c_addon_cost_csr%NOTFOUND THEN
15969                           NULL;
15970                    END IF;
15971 
15972            FETCH c_addon_cost_csr INTO l_addon_cost;
15973            CLOSE c_addon_cost_csr;
15974         END IF;
15975 
15976       l_addon_cost := NVL(l_addon_cost,0);
15977 
15978       RETURN(l_addon_cost);
15979 
15980 
15981    EXCEPTION
15982       WHEN OKL_API.G_EXCEPTION_ERROR THEN
15983         IF c_addon_cost_csr%ISOPEN THEN
15984               CLOSE c_addon_cost_csr;
15985         END IF;
15986 
15987          OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
15988                              p_msg_name     => G_INVALID_CRITERIA);
15989          RETURN NULL;
15990 
15991 
15992       WHEN OTHERS THEN
15993          --sechawla 18-nov-08 : close cursor
15994          IF c_addon_cost_csr%ISOPEN THEN
15995               CLOSE c_addon_cost_csr;
15996          END IF;
15997          OKL_API.SET_MESSAGE(
15998                              p_app_name     => G_APP_NAME,
15999                              p_msg_name     => G_UNEXPECTED_ERROR,
16000                              p_token1       => G_SQLCODE_TOKEN,
16001                              p_token1_value => SQLCODE,
16002                              p_token2       => G_SQLERRM_TOKEN,
16003                              p_token2_value => SQLERRM);
16004          RETURN NULL;
16005    END TOTAL_ASSET_ADDON_COST;
16006 
16007 
16008 ----------------------------------------------------------------------------------------------------
16009 
16010     -- Start of Comments
16011     -- Created By:       Durga Janaswamy
16012     -- Function Name  get_line_subsidy_amount
16013     -- Description:   returns the asset line subsidy amount for given contract
16014     -- Dependencies:
16015     -- Parameters: contract id,contract line id, accounting method
16016     --
16017     -- Version: 1.0
16018     --
16019     -- End of Comments
16020 
16021 ----------------------------------------------------------------------------------------------------
16022 FUNCTION get_line_subsidy_amount(
16023     p_contract_id                 IN  NUMBER,
16024     p_fin_asset_line_id           IN  NUMBER,
16025     p_accounting_method           IN  VARCHAR2)
16026 RETURN NUMBER IS
16027 
16028     lx_return_status        VARCHAR2(1)  DEFAULT OKL_API.G_RET_STS_SUCCESS;
16029     l_api_name             CONSTANT     VARCHAR2(30) := 'GET_LINE_ASSET_SUBSIDY';
16030     l_api_version          CONSTANT     NUMBER := 1.0;
16031     l_init_msg_list                     VARCHAR2(1) := OKL_API.G_FALSE;
16032     lx_msg_count                        NUMBER := OKL_API.G_MISS_NUM;
16033     lx_msg_data                         VARCHAR2(2000);
16034 
16035     x_subsidy_amount       NUMBER;
16036 
16037     l_asset_line_subsidy_amount NUMBER;
16038 
16039     --cursor to fetch all the subsidies attached to financial asset
16040     -- passing accounting method as input parameter
16041     CURSOR l_sub_csr(p_contract_id IN NUMBER,
16042                      p_fin_asset_line_id IN  NUMBER,
16043                      p_accounting_method IN  VARCHAR2) IS
16044     SELECT NVL(SUM(sub_kle.amount),0)
16045     FROM   okl_subsidies_b    subb,
16046            okl_k_lines        sub_kle,
16047            okc_k_lines_b      sub_cle,
16048            okc_line_styles_b  sub_lse
16049     WHERE  subb.id                     = sub_kle.subsidy_id
16050     AND    subb.accounting_method_code = NVL(UPPER(p_accounting_method),subb.accounting_method_code)
16051     AND    sub_kle.id                  = sub_cle.id
16052     AND    sub_cle.lse_id              = sub_lse.id
16053     AND    sub_lse.lty_code            = 'SUBSIDY'
16054     AND    sub_cle.sts_code            <> 'ABANDONED'
16055     AND    sub_cle.dnz_chr_id          = p_contract_id
16056     AND    sub_cle.cle_id              = p_fin_asset_line_id
16057     AND    subb.customer_visible_yn    = 'Y'
16058     ;
16059 
16060     l_accounting_method        okl_subsidies_b.accounting_method_code%TYPE;
16061     l_subsidy_cle_id           NUMBER;
16062 
16063 BEGIN
16064 
16065 	l_asset_line_subsidy_amount := 0;
16066 
16067     x_subsidy_amount := 0;
16068 
16069 
16070     IF(p_accounting_method IS NULL OR p_accounting_method = OKL_API.G_MISS_CHAR) THEN
16071         l_accounting_method := NULL;
16072     ELSE
16073         l_accounting_method := p_accounting_method;
16074     END IF;
16075 
16076     --------------------------------------------------------------
16077     --get all the subsidies associated to asset and get amount
16078     --------------------------------------------------------------
16079     OPEN l_sub_csr(p_contract_id , p_fin_asset_line_id, l_accounting_method);
16080     --LOOP  --sechawla 18-nov
16081     FETCH l_sub_csr INTO l_asset_line_subsidy_amount;
16082     --    EXIT WHEN l_sub_csr%NOTFOUND;
16083     -- END LOOP;
16084     CLOSE l_sub_csr;
16085 
16086     x_subsidy_amount := NVL(l_asset_line_subsidy_amount,0);
16087 
16088     RETURN x_subsidy_amount;
16089 
16090     EXCEPTION
16091     WHEN OKL_API.G_EXCEPTION_ERROR THEN
16092     IF l_sub_csr%ISOPEN THEN
16093         CLOSE l_sub_csr;
16094     END IF;
16095     lx_return_status := OKL_API.HANDLE_EXCEPTIONS(
16096                                l_api_name,
16097                                G_PKG_NAME,
16098                                'OKL_API.G_RET_STS_ERROR',
16099                                lx_msg_count,
16100                                lx_msg_data,
16101                                '_PVT');
16102     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
16103     IF l_sub_csr%ISOPEN THEN
16104         CLOSE l_sub_csr;
16105     END IF;
16106     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
16107                               l_api_name,
16108                               G_PKG_NAME,
16109                               'OKL_API.G_RET_STS_UNEXP_ERROR',
16110                               lx_msg_count,
16111                               lx_msg_data,
16112                               '_PVT');
16113     WHEN OTHERS THEN
16114     IF l_sub_csr%ISOPEN THEN
16115         CLOSE l_sub_csr;
16116     END IF;
16117     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
16118                               l_api_name,
16119                               G_PKG_NAME,
16120                               'OTHERS',
16121                               lx_msg_count,
16122                               lx_msg_data,
16123                               '_PVT');
16124 
16125 END get_line_subsidy_amount;
16126 
16127 
16128 ----------------------------------------------------------------------------------------------------
16129 
16130     -- Start of Comments
16131     -- Created By:       Durga Janaswamy
16132     -- Function Name  get_line_subsidy_ovrd_amount
16133     -- Description:   returns the asset line subsidy amount for given contract
16134     -- Dependencies:
16135     -- Parameters: contract id,contract line id, accounting method
16136     --
16137     -- Version: 1.0
16138     --
16139     -- End of Comments
16140 
16141 ----------------------------------------------------------------------------------------------------
16142 FUNCTION get_line_subsidy_ovrd_amount(
16143     p_contract_id                 IN  NUMBER,
16144     p_fin_asset_line_id           IN  NUMBER,
16145     p_accounting_method           IN  VARCHAR2)
16146 RETURN NUMBER IS
16147 
16148     lx_return_status        VARCHAR2(1)  DEFAULT OKL_API.G_RET_STS_SUCCESS;
16149     l_api_name             CONSTANT     VARCHAR2(30) := 'GET_LINE_ASSET_SUBSIDY_OVRD';
16150     l_api_version          CONSTANT     NUMBER := 1.0;
16151     l_init_msg_list                     VARCHAR2(1) := OKL_API.G_FALSE;
16152     lx_msg_count                        NUMBER := OKL_API.G_MISS_NUM;
16153     lx_msg_data                         VARCHAR2(2000);
16154 
16155     x_subsidy_amount       NUMBER;
16156 
16157     l_asset_line_subs_ovrd_amn NUMBER;
16158 
16159     --cursor to fetch all the subsidies attached to financial asset
16160     -- passing accounting method as input parameter
16161     CURSOR l_sub_csr(p_contract_id IN NUMBER,
16162                      p_fin_asset_line_id IN  NUMBER,
16163                      p_accounting_method IN  VARCHAR2) IS
16164     SELECT NVL(SUM(sub_kle.subsidy_override_amount),0)
16165     FROM   okl_subsidies_b    subb,
16166            okl_k_lines        sub_kle,
16167            okc_k_lines_b      sub_cle,
16168            okc_line_styles_b  sub_lse
16169     WHERE  subb.id                     = sub_kle.subsidy_id
16170     AND    subb.accounting_method_code = NVL(UPPER(p_accounting_method),subb.accounting_method_code)
16171     AND    sub_kle.id                  = sub_cle.id
16172     AND    sub_cle.lse_id              = sub_lse.id
16173     AND    sub_lse.lty_code            = 'SUBSIDY'
16174     AND    sub_cle.sts_code            <> 'ABANDONED'
16175     AND    sub_cle.dnz_chr_id          = p_contract_id
16176     AND    sub_cle.cle_id              = p_fin_asset_line_id
16177     AND    subb.customer_visible_yn    = 'Y'
16178     ;
16179 
16180     l_accounting_method        okl_subsidies_b.accounting_method_code%TYPE;
16181     l_subsidy_cle_id           NUMBER;
16182 
16183 BEGIN
16184 
16185 	l_asset_line_subs_ovrd_amn := 0;
16186 
16187     x_subsidy_amount := 0;
16188 
16189     IF(p_accounting_method IS NULL OR p_accounting_method = OKL_API.G_MISS_CHAR) THEN
16190         l_accounting_method := NULL;
16191     ELSE
16192         l_accounting_method := p_accounting_method;
16193     END IF;
16194 
16195     --------------------------------------------------------------
16196     --get all the subsidies associated to asset and get amount
16197     --------------------------------------------------------------
16198     OPEN l_sub_csr(p_contract_id , p_fin_asset_line_id, l_accounting_method);
16199     --LOOP  --sechawla 18-nov-08
16200     FETCH l_sub_csr INTO l_asset_line_subs_ovrd_amn;
16201     --    EXIT WHEN l_sub_csr%NOTFOUND;
16202     --END LOOP;
16203     CLOSE l_sub_csr;
16204 
16205     x_subsidy_amount := NVL(l_asset_line_subs_ovrd_amn,0);
16206 
16207     RETURN x_subsidy_amount;
16208 
16209     EXCEPTION
16210     WHEN OKL_API.G_EXCEPTION_ERROR THEN
16211     IF l_sub_csr%ISOPEN THEN
16212         CLOSE l_sub_csr;
16213     END IF;
16214     lx_return_status := OKL_API.HANDLE_EXCEPTIONS(
16215                                l_api_name,
16216                                G_PKG_NAME,
16217                                'OKL_API.G_RET_STS_ERROR',
16218                                lx_msg_count,
16219                                lx_msg_data,
16220                                '_PVT');
16221     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
16222     IF l_sub_csr%ISOPEN THEN
16223         CLOSE l_sub_csr;
16224     END IF;
16225     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
16226                               l_api_name,
16227                               G_PKG_NAME,
16228                               'OKL_API.G_RET_STS_UNEXP_ERROR',
16229                               lx_msg_count,
16230                               lx_msg_data,
16231                               '_PVT');
16232     WHEN OTHERS THEN
16233     IF l_sub_csr%ISOPEN THEN
16234         CLOSE l_sub_csr;
16235     END IF;
16236     lx_return_status :=OKL_API.HANDLE_EXCEPTIONS(
16237                               l_api_name,
16238                               G_PKG_NAME,
16239                               'OTHERS',
16240                               lx_msg_count,
16241                               lx_msg_data,
16242                               '_PVT');
16243 
16244 END get_line_subsidy_ovrd_amount;
16245 
16246 
16247 ----------------------------------------------------------------------------------------------------
16248 
16249     -- Start of Comments
16250     -- Created By:    Seema Chawla
16251     -- Function Name  Total_Asset_Financed_Fee_Amt
16252     -- Description:   Returns total financed fee amount associated to an asset line
16253     -- Dependencies:
16254     -- Parameters: contract id and line id
16255     -- Version: 1.0
16256     -- End of Commnets
16257 
16258 ----------------------------------------------------------------------------------------------------
16259   FUNCTION Total_Asset_Financed_Fee_Amt(
16260             p_chr_id          IN  NUMBER,
16261             p_line_id         IN  NUMBER) RETURN NUMBER  IS
16262 
16263     l_api_version       CONSTANT NUMBER       := 1;
16264     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
16265     x_msg_count         NUMBER;
16266     x_msg_data          VARCHAR2(256);
16267 
16268     l_Asset_Fin_fees_amt    NUMBER := 0;
16269 
16270     CURSOR l_fee_csr( c_chr_id IN NUMBER, c_fin_asset_line_id IN NUMBER) IS
16271     SELECT sum(kle_cov.amount) asset_fin_fee_amt
16272        FROM   OKC_LINE_STYLES_B  LSEB,
16273               OKC_K_ITEMS        CIM,
16274               OKL_K_LINES        KLE_COV,
16275               okl_k_lines        fee_line,
16276               OKC_K_LINES_B      CLEB_COV,
16277               OKC_STATUSES_B     STSB
16278         WHERE LSEB.ID               = CLEB_COV.LSE_ID
16279         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
16280         AND   CIM.jtot_object1_code = 'OKX_COVASST'
16281         AND   CLEB_COV.id           =  CIM.cle_id
16282         AND   KLE_COV.id            =  CLEB_COV.ID
16283         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
16284         AND   CLEB_COV.dnz_chr_id   =  c_chr_id
16285         AND   cim.object1_id1       =  to_char(c_fin_asset_line_id) --lse_id = 33
16286         AND   CLEB_COV.sts_code     =  STSB.code
16287         and   CLEB_COV.cle_id       =  fee_line.id
16288         and   fee_line.fee_type     =  'FINANCED'
16289         AND   STSB.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
16290 
16291 
16292     CURSOR l_fee_csr_incl_terminated( c_chr_id IN NUMBER, c_fin_asset_line_id IN NUMBER) IS
16293     SELECT sum(kle_cov.amount) asset_fin_fee_amt
16294        FROM   OKC_LINE_STYLES_B  LSEB,
16295               OKC_K_ITEMS        CIM,
16296               OKL_K_LINES        KLE_COV,
16297               okl_k_lines        fee_line,
16298               OKC_K_LINES_B      CLEB_COV,
16299               OKC_STATUSES_B     STSB
16300         WHERE LSEB.ID               = CLEB_COV.LSE_ID
16301         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
16302         AND   CIM.jtot_object1_code = 'OKX_COVASST'
16303         AND   CLEB_COV.id           =  CIM.cle_id
16304         AND   KLE_COV.id            =  CLEB_COV.ID
16305         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
16306         AND   CLEB_COV.dnz_chr_id   =  c_chr_id
16307         AND   cim.object1_id1       =  to_char(c_fin_asset_line_id) --lse_id = 33
16308         AND   CLEB_COV.sts_code     =  STSB.code
16309         and   CLEB_COV.cle_id       =  fee_line.id
16310         and   fee_line.fee_type     =  'FINANCED'
16311         AND   STSB.ste_code NOT IN ( 'EXPIRED', 'CANCELLED', 'HOLD');
16312 
16313 
16314 
16315    l_discount_incl_terminated 	BOOLEAN := FALSE;
16316 
16317   BEGIN
16318 
16319     IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL)) THEN
16320            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
16321     END IF;
16322 
16323 
16324     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
16325       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
16326 	  LOOP
16327         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
16328           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
16329 		  l_discount_incl_terminated := TRUE;
16330         END IF;
16331       END LOOP;
16332     END IF;
16333 
16334 
16335     IF l_discount_incl_terminated THEN
16336        OPEN  l_fee_csr_incl_terminated (p_chr_id, p_line_id );
16337        FETCH l_fee_csr_incl_terminated INTO l_Asset_Fin_fees_amt;
16338        CLOSE l_fee_csr_incl_terminated;
16339     ELSE
16340        OPEN  l_fee_csr( p_chr_id, p_line_id );
16341        FETCH l_fee_csr INTO l_Asset_Fin_fees_amt;
16342        CLOSE l_fee_csr;
16343     END IF;
16344 
16345     l_Asset_Fin_fees_amt := nvl(l_Asset_Fin_fees_amt,0);
16346 
16347     RETURN l_Asset_Fin_fees_amt;
16348 
16349     EXCEPTION
16350 
16351         WHEN OTHERS THEN
16352             IF l_fee_csr_incl_terminated%ISOPEN THEN
16353                CLOSE l_fee_csr_incl_terminated;
16354             END IF;
16355             IF l_fee_csr%ISOPEN THEN
16356                CLOSE l_fee_csr;
16357             END IF;
16358 
16359                 Okl_Api.SET_MESSAGE(
16360                         p_app_name     => G_APP_NAME,
16361                         p_msg_name     => G_UNEXPECTED_ERROR,
16362                         p_token1       => G_SQLCODE_TOKEN,
16363                         p_token1_value => SQLCODE,
16364                         p_token2       => G_SQLERRM_TOKEN,
16365                         p_token2_value => SQLERRM);
16366             RETURN NULL;
16367 
16368   END Total_Asset_Financed_Fee_Amt;
16369 
16370 
16371   ----------------------------------------------------------------------------------------------------
16372 
16373     -- Start of Comments
16374     -- Created By:    Seema Chawla
16375     -- Function Name  Total_Asset_Rollover_Fee_Amt
16376     -- Description:   Returns total Rollover fee amount associated to an asset line
16377     -- Dependencies:
16378     -- Parameters: contract id and line id
16379     -- Version: 1.0
16380     -- End of Commnets
16381 
16382 ----------------------------------------------------------------------------------------------------
16383   FUNCTION Total_Asset_Rollover_Fee_Amt(
16384             p_chr_id          IN  NUMBER,
16385             p_line_id         IN  NUMBER) RETURN NUMBER  IS
16386 
16387     l_api_version       CONSTANT NUMBER       := 1;
16388     x_return_status     VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
16389     x_msg_count         NUMBER;
16390     x_msg_data          VARCHAR2(256);
16391 
16392     l_Asset_Roll_fees_amt    NUMBER := 0;
16393 
16394     CURSOR l_fee_csr( c_chr_id IN NUMBER, c_fin_asset_line_id IN NUMBER) IS
16395     SELECT sum(kle_cov.amount) asset_roll_fee_amt
16396        FROM   OKC_LINE_STYLES_B  LSEB,
16397               OKC_K_ITEMS        CIM,
16398               OKL_K_LINES        KLE_COV,
16399               okl_k_lines        fee_line,
16400               OKC_K_LINES_B      CLEB_COV,
16401               OKC_STATUSES_B     STSB
16402         WHERE LSEB.ID               = CLEB_COV.LSE_ID
16403         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
16404         AND   CIM.jtot_object1_code = 'OKX_COVASST'
16405         AND   CLEB_COV.id           =  CIM.cle_id
16406         AND   KLE_COV.id            =  CLEB_COV.ID
16407         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
16408         AND   CLEB_COV.dnz_chr_id   =  c_chr_id
16409         AND   cim.object1_id1       =  to_char(c_fin_asset_line_id) --lse_id = 33
16410         AND   CLEB_COV.sts_code     =  STSB.code
16411         and   CLEB_COV.cle_id       =  fee_line.id
16412         and   fee_line.fee_type     =  'ROLLOVER'
16413         AND   STSB.ste_code NOT IN ('TERMINATED', 'EXPIRED', 'CANCELLED', 'HOLD');
16414 
16415 
16416     CURSOR l_fee_csr_incl_terminated( c_chr_id IN NUMBER, c_fin_asset_line_id IN NUMBER) IS
16417     SELECT sum(kle_cov.amount) asset_roll_fee_amt
16418        FROM   OKC_LINE_STYLES_B  LSEB,
16419               OKC_K_ITEMS        CIM,
16420               OKL_K_LINES        KLE_COV,
16421               okl_k_lines        fee_line,
16422               OKC_K_LINES_B      CLEB_COV,
16423               OKC_STATUSES_B     STSB
16424         WHERE LSEB.ID               = CLEB_COV.LSE_ID
16425         AND   LSEB.lty_code         = 'LINK_FEE_ASSET'
16426         AND   CIM.jtot_object1_code = 'OKX_COVASST'
16427         AND   CLEB_COV.id           =  CIM.cle_id
16428         AND   KLE_COV.id            =  CLEB_COV.ID
16429         AND   CLEB_COV.DNZ_CHR_ID   =  CIM.DNZ_CHR_ID
16430         AND   CLEB_COV.dnz_chr_id   =  c_chr_id
16431         AND   cim.object1_id1       =  to_char(c_fin_asset_line_id) --lse_id = 33
16432         AND   CLEB_COV.sts_code     =  STSB.code
16433         and   CLEB_COV.cle_id       =  fee_line.id
16434         and   fee_line.fee_type     =  'ROLLOVER'
16435         AND   STSB.ste_code NOT IN ( 'EXPIRED', 'CANCELLED', 'HOLD');
16436 
16437 
16438 
16439    l_discount_incl_terminated 	BOOLEAN := FALSE;
16440 
16441   BEGIN
16442 
16443     IF (( p_chr_id IS NULL ) OR (p_line_id IS NULL)) THEN
16444            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
16445     END IF;
16446 
16447 
16448     IF Okl_Execute_Formula_Pub.G_ADDITIONAL_PARAMETERS.COUNT > 0 THEN
16449       FOR I IN OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.FIRST..OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS.LAST
16450 	  LOOP
16451         IF OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).NAME = 'TERMINATED_LINES_YN' AND
16452           OKL_EXECUTE_FORMULA_PUB.G_ADDITIONAL_PARAMETERS(I).VALUE = 'Y' THEN
16453 		  l_discount_incl_terminated := TRUE;
16454         END IF;
16455       END LOOP;
16456     END IF;
16457 
16458 
16459     IF l_discount_incl_terminated THEN
16460        OPEN  l_fee_csr_incl_terminated (p_chr_id, p_line_id );
16461        FETCH l_fee_csr_incl_terminated INTO l_Asset_roll_fees_amt;
16462        CLOSE l_fee_csr_incl_terminated;
16463     ELSE
16464        OPEN  l_fee_csr( p_chr_id, p_line_id );
16465        FETCH l_fee_csr INTO l_Asset_roll_fees_amt;
16466        CLOSE l_fee_csr;
16467     END IF;
16468 
16469     l_Asset_roll_fees_amt := nvl(l_Asset_roll_fees_amt,0);
16470 
16471     RETURN l_Asset_roll_fees_amt;
16472 
16473     EXCEPTION
16474 
16475         WHEN OTHERS THEN
16476             IF l_fee_csr_incl_terminated%ISOPEN THEN
16477                CLOSE l_fee_csr_incl_terminated;
16478             END IF;
16479             IF l_fee_csr%ISOPEN THEN
16480                CLOSE l_fee_csr;
16481             END IF;
16482 
16483                 Okl_Api.SET_MESSAGE(
16484                         p_app_name     => G_APP_NAME,
16485                         p_msg_name     => G_UNEXPECTED_ERROR,
16486                         p_token1       => G_SQLCODE_TOKEN,
16487                         p_token1_value => SQLCODE,
16488                         p_token2       => G_SQLERRM_TOKEN,
16489                         p_token2_value => SQLERRM);
16490             RETURN NULL;
16491 
16492   END Total_Asset_Rollover_Fee_Amt;
16493 
16494 
16495 END Okl_Seeded_Functions_Pvt;