DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKL_CS_LC_CONTRACT_PVT

Source


1 PACKAGE BODY Okl_Cs_Lc_Contract_Pvt AS
2 /* $Header: OKLRLCRB.pls 120.32 2008/04/10 12:11:06 dkagrawa noship $ */
3    g_user_id               NUMBER                           := Okl_Api.G_MISS_NUM;
4    g_resp_id               NUMBER                           := Okl_Api.G_MISS_NUM;
5    g_user_resource_id      okc_k_accesses.resource_id%TYPE  := Okl_Api.G_MISS_NUM;
6    g_resp_access           okc_k_accesses.access_level%TYPE := Okl_Api.G_MISS_CHAR;
7    g_reset_access_flag     BOOLEAN                          := FALSE;
8    g_scs_code              okc_k_headers_b.scs_code%TYPE    := Okl_Api.G_MISS_CHAR;
9    g_groups_processed      BOOLEAN := FALSE;
10    g_reset_lang_flag       BOOLEAN                          := FALSE;
11    g_reset_resp_flag       BOOLEAN                          := FALSE;
12  --varangan added the formula name variable for bug #5036582
13    g_formula_out_billed    CONSTANT okl_formulae_v.name%TYPE := 'OKL_LC_OUTSTANDING_BILLED';
14    g_formula_out_unbilled  CONSTANT okl_formulae_v.name%TYPE := 'OKL_LC_OUTSTANDING_UNBILLED';
15  --varangan added the formula name variable for bug #5036582
16 
17   --varangan added the formula name variable for bug #5009351
18    g_formula_next_payment_amt CONSTANT okl_formulae_v.name%TYPE := 'OKL_LC_NEXT_PAYMENT_AMOUNT';
19 
20    TYPE sec_group_tbl IS TABLE OF okc_k_accesses.group_id%TYPE;
21    g_sec_groups  sec_group_tbl;
22 
23   PROCEDURE EXECUTE(p_api_version           IN  NUMBER
24                    ,p_init_msg_list         IN  VARCHAR2 DEFAULT Okc_Api.G_FALSE
25                    ,x_return_status         OUT NOCOPY VARCHAR2
26                    ,x_msg_count             OUT NOCOPY NUMBER
27                    ,x_msg_data              OUT NOCOPY VARCHAR2
28                    ,p_formula_name          IN  VARCHAR2
29                    ,p_contract_id           IN  NUMBER
30                    ,x_value                 OUT NOCOPY NUMBER
31                    ) IS
32     CURSOR deal_type IS
33       SELECT khr.deal_type
34       FROM okl_k_headers_v khr ,fnd_lookups fnd
35       WHERE fnd.lookup_type = 'OKL_BOOK_CLASS'
36       AND fnd.lookup_code = khr.deal_type
37       AND id = p_contract_id;
38 
39   --bug# 5032491 rkuttiya added cursor for revenue recognition
40    CURSOR c_revenue_recogn(p_khr_id IN NUMBER) IS
41    SELECT revenue_recognition_method
42    FROM  okl_product_parameters_v pdt,
43          okl_k_headers            khr
44    WHERE KHR.ID = p_khr_id
45    AND KHR.PDT_ID = PDT.ID;
46 
47    l_deal_type           VARCHAR2(30);
48  --bug# 5032491
49    l_revenue_recogn      VARCHAR2(150);
50    l_outstanding_bal     NUMBER;
51  --
52     l_formula_name        VARCHAR2(100);
53   BEGIN
54     OPEN deal_type;
55     FETCH deal_type INTO l_deal_type;
56     CLOSE deal_type;
57     OPEN c_revenue_recogn(p_contract_id);
58     FETCH c_revenue_recogn INTO l_revenue_recogn;
59     CLOSE c_revenue_recogn;
60 
61 --bug# 5032491 to check for Loan and Loan Revolving
62    IF l_deal_type NOT IN ('LOAN','LOAN-REVOLVING') THEN
63       IF l_deal_type IN ('LEASEDF','LEASEST') THEN
64         l_formula_name := 'CONTRACT_NET_INVESTMENT_DF';
65       --bug# 5032491 rkuttiya commenting out following
66       --ELSIF l_deal_type IN ('LOAN','LOAN-REVOLVING') THEN
67         --l_formula_name := 'CONTRACT_NET_INVESTMENT_LOAN';
68       ELSIF l_deal_type IN ('LEASEOP') THEN
69         l_formula_name := 'CONTRACT_NET_INVESTMENT_OP';
70       END IF;
71       Okl_Execute_Formula_Pub.EXECUTE(p_api_version          => p_api_version
72                                    ,p_init_msg_list        =>p_init_msg_list
73                                    ,x_return_status        =>x_return_status
74                                    ,x_msg_count            =>x_msg_count
75                                    ,x_msg_data             =>x_msg_data
76                                    ,p_formula_name         =>l_formula_name
77                                    ,p_contract_id          =>p_contract_id
78                                    ,x_value               =>x_value
79                                    );
80     END IF;
81 
82 -- bug# 5032491 rkuttiya added the following for Loan and Loan Revolving contracts
83     IF l_deal_type  IN ('LOAN','LOAN-REVOLVING') THEN
84       OPEN c_revenue_recogn(p_contract_id);
85       FETCH c_revenue_recogn INTO l_revenue_recogn;
86       CLOSE c_revenue_recogn;
87 
88       l_outstanding_bal := OKL_VARIABLE_INT_UTIL_PVT.get_principal_bal(x_return_status => x_return_status,
89                                                                    p_khr_id        => p_contract_id,
90                                                                    p_kle_id        => NULL,
91                                                                    p_date          => SYSDATE);
92 
93       IF l_revenue_recogn = 'ACTUAL' AND l_outstanding_bal <> 0 THEN
94         x_value := 0;
95       ELSE
96         l_formula_name := 'CONTRACT_NET_INVESTMENT_LOAN';
97         Okl_Execute_Formula_Pub.EXECUTE(p_api_version          => p_api_version
98                                        ,p_init_msg_list        =>p_init_msg_list
99                                        ,x_return_status        =>x_return_status
100                                        ,x_msg_count            =>x_msg_count
101                                        ,x_msg_data             =>x_msg_data
102                                        ,p_formula_name         =>l_formula_name
103                                        ,p_contract_id          =>p_contract_id
104                                        ,x_value               =>x_value
105                                         );
106 
107       END IF;
108     END IF;
109 
110     EXCEPTION
111     WHEN OTHERS THEN
112       CLOSE deal_type;
113       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
114                           ,p_msg_name     => G_UNEXPECTED_ERROR
115                           ,p_token1       => G_SQLCODE_TOKEN
116                           ,p_token1_value => SQLCODE
117                           ,p_token2       => G_SQLERRM_TOKEN
118                           ,p_token2_value => SQLERRM);
119   END;
120 
121 
122   PROCEDURE next_due(p_contract_id     IN  NUMBER,
123                      o_next_due_amt    OUT NOCOPY NUMBER,
124                      o_next_due_date   OUT NOCOPY DATE
125         		    ) IS
126 --Begin-varangan-bug#5009351
127 
128  CURSOR cr_next_payment_date(c_contract_id IN NUMBER) IS
129   SELECT MIN(sel.stream_element_date)
130   FROM   okl_strm_elements sel,
131          okl_streams stm,
132          okl_strm_type_v sty
133   WHERE  stm.sty_id = sty.id
134   AND    stm.say_code = 'CURR'
135   AND    stm.active_yn = 'Y'
136   AND    sty.billable_yn = 'Y'
137   AND    sty.code NOT LIKE '%TAX%'
138   AND    stm.purpose_code is NULL
139   AND    stm.khr_id = c_contract_id
140   AND    sel.stm_id = stm.id
141   AND    sel.stream_element_date > sysdate;
142 
143   lx_return_status VARCHAR2(1);
144   lx_msg_count     NUMBER;
145   lx_msg_data      VARCHAR2(2000);
146 BEGIN
147   OPEN cr_next_payment_date(p_contract_id);
148   FETCH cr_next_payment_date INTO o_next_due_date;
149   CLOSE cr_next_payment_date;
150 
151   Okl_Execute_Formula_Pub.EXECUTE(p_api_version          => 1.0
152                                  ,p_init_msg_list        => null
153                                  ,x_return_status        => lx_return_status
154                                  ,x_msg_count            => lx_msg_count
155                                  ,x_msg_data             => lx_msg_data
156                                  ,p_formula_name         => g_formula_next_payment_amt
157                                  ,p_contract_id          => p_contract_id
158                                  ,x_value                => o_next_due_amt
159                                  );
160 
161 --End-varangan-bug#5009351
162 
163 /*  --Start-commented old code - varangan-Bug#5009351*
164 
165   -- rvaduri to fix bug 2949018
166   -- and added the following code.
167   --NOTE: No Multi currency conversions reqd because amounts in
168   --Streams tables are already in Contract Currency.
169 
170   --Modified the following cursor by adding c_stream_name
171   --for bug fix 2993308
172   -- replaced type name with purpose, enhancements for user defined streams bug
173   -- 3924303
174   CURSOR next_due_date(c_contract_id NUMBER,c_stream_type_purpose VARCHAR2) IS
175   SELECT MIN(sel.stream_element_date)
176   FROM okl_strm_elements sel
177     ,okl_streams stm
178     ,okl_strm_type_v sty
179   WHERE sty.stream_type_purpose = c_stream_type_purpose
180   AND stm.sty_id = sty.id
181   AND stm.say_code = 'CURR'
182   AND stm.active_yn = 'Y'
183   AND stm.purpose_code is NULL
184   AND stm.khr_id = c_contract_id
185   AND sel.stm_id = stm.id
186   and date_billed is null
187   AND sel.amount > 0 ;
188 
189 
190   --Modified the following cursor by adding c_stream_name
191   --for bug fix 2993308
192   -- replaced type name with purpose, enhancements for user defined streams bug
193   -- 3924303
194   CURSOR next_due_amount(c_next_due_date DATE,c_contract_id NUMBER
195 			,c_stream_type_purpose  VARCHAR2) IS
196   SELECT NVL(sum(sel.amount),0)
197       FROM okl_strm_elements sel,
198            okl_streams stm,
199            okl_strm_type_v sty
200 	--Bug 4084405
201       WHERE sty.stream_type_purpose = c_stream_type_purpose
202         AND stm.sty_id = sty.id
203         AND stm.say_code = 'CURR'
204         AND stm.active_yn = 'Y'
205         AND stm.purpose_code is NULL
206         AND stm.khr_id = c_contract_id
207         AND sel.stm_id = stm.id
208         AND date_billed is null
209         AND sel.stream_element_date = c_next_due_date;
210 
211 --Added the following cursor for bug fix 2993308
212 
213     CURSOR deal_type IS
214       SELECT deal_type
215       FROM okl_k_headers
216       WHERE  id = p_contract_id;
217 
218    l_deal_type   VARCHAR2(30);
219    l_stream_name   VARCHAR2(30);
220    l_stream_type_purpose_for_date VARCHAR2(100);
221    l_stream_type_purpose_for_amt VARCHAR2(100);
222 
223 BEGIN
224 
225    OPEN deal_type;
226    FETCH deal_type INTO l_deal_type;
227    CLOSE deal_type;
228 
229    IF l_deal_type IN ('LOAN','LOAN-REVOLVING') THEN
230 	--l_stream_name := 'LOAN PAYMENT';
231 	--Bug 4084405
232 	--For getting the Due date we will use Principal Payment
233 	--as loan payment is not a billable stream.
234 	--For getting the next payment amount we will use loan payment
235 	--as the payment comprises of prin payment + int Payment.
236        l_stream_type_purpose_for_date := 'PRINCIPAL_PAYMENT';
237        l_stream_type_purpose_for_amt := 'LOAN_PAYMENT';
238 
239    ELSE
240 --	l_stream_name := 'RENT';
241 	--bug 4084405
242         l_stream_type_purpose_for_date := 'RENT';
243         l_stream_type_purpose_for_amt := 'RENT';
244    END IF;
245 
246   OPEN next_due_date(p_contract_id,l_stream_type_purpose_for_date);
247   FETCH next_due_date INTO o_next_due_date;
248   CLOSE next_due_date;
249   IF (o_next_due_date is not null) then
250       OPEN next_due_amount(o_next_due_date,p_contract_id
251 				,l_stream_type_purpose_for_amt);
252       FETCH next_due_amount INTO  o_next_due_amt;
253       CLOSE next_due_amount;
254   ELSE
255       o_next_due_amt := 0;
256   END IF;
257   --End-commented-varangan-Bug#5009351*/
258  EXCEPTION
259     WHEN OTHERS THEN
260      IF cr_next_payment_date%ISOPEN
261     THEN
262       CLOSE cr_next_payment_date;
263     END IF;
264 
265     /* Commented-varangan-Bug#5009351
266        CLOSE next_due_date;
267        CLOSE next_due_amount; */
268 
269     Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
270                           ,p_msg_name     => G_UNEXPECTED_ERROR
271                           ,p_token1       => G_SQLCODE_TOKEN
272                           ,p_token1_value => SQLCODE
273                           ,p_token2       => G_SQLERRM_TOKEN
274                           ,p_token2_value => SQLERRM);
275 END next_due;
276 
277 
278 
279 PROCEDURE last_due(p_customer_id     IN  NUMBER,
280                    p_contract_id     IN NUMBER,
281                    o_last_due_amt    OUT NOCOPY NUMBER,
282                    o_last_due_date   OUT NOCOPY DATE
283         		    ) IS
284 CURSOR last_due IS
285 --MultiCurrency Changes.
286 --mutlipying the amount with exchange rate to convert the currency from
287 --Transaction currency to Functional Curreny.
288 --dkagrawa changed the query to adopt new billing architecture
289 /*SELECT (AR.amount * NVL(AR.exchange_rate,1)), AR.receipt_date
290 FROM ar_cash_receipts_all ar,
291 okc_k_headers_b chr,
292 ar_receivable_applications_all ara,
293 okl_cnSld_ar_strms_b lsm
294 WHERE
295 ar.pay_from_customer = chr.cust_acct_id
296 and chr.id = p_contract_id
297 AND ar.cash_receipt_id = ara.cash_receipt_id
298 AND LSM.RECEIVABLES_INVOICE_ID = ARA.APPLIED_CUSTOMER_TRX_ID
299 AND lsm.khr_id  = p_contract_id
300 ORDER BY receipt_date DESC;*/
301 
302 SELECT (AR.amount * NVL(AR.exchange_rate,1)), AR.receipt_date
303 FROM ar_cash_receipts_all ar,
304 okl_receipt_applications_uv app,
305 okc_k_headers_b chr
306 WHERE chr.id = p_contract_id
307 AND ar.cash_receipt_id = app.cash_receipt_id
308 AND ar.pay_from_customer = p_customer_id
309 AND CHR.contract_number = app.contract_number
310 ORDER BY receipt_date DESC;
311 
312  BEGIN
313   OPEN last_due;
314   FETCH last_due INTO  o_last_due_amt,o_last_due_date;
315   CLOSE last_due;
316     EXCEPTION
317     WHEN OTHERS THEN
318       CLOSE last_due;
319       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
320                           ,p_msg_name     => G_UNEXPECTED_ERROR
321                           ,p_token1       => G_SQLCODE_TOKEN
322                           ,p_token1_value => SQLCODE
323                           ,p_token2       => G_SQLERRM_TOKEN
324                           ,p_token2_value => SQLERRM);
325 END;
326 PROCEDURE total_asset_cost(p_contract_id     IN  NUMBER,
327                            o_asset_cost     OUT NOCOPY NUMBER
328                  	  ) IS
329 
330 CURSOR asset_cost IS
331 select nvl(sum(okl.oec) ,0)
332 from okc_k_lines_v okc
333     ,okl_k_lines okl
334     ,okc_line_styles_v lse
335 where okc.id=okl.id
336 and  okc.lse_id = lse.id
337 and lse.lty_code='FREE_FORM1'
338 and okc.chr_id = p_contract_id;
339 
340  BEGIN
341   OPEN asset_cost;
342   FETCH asset_cost INTO  o_asset_cost;
343   CLOSE asset_cost;
344     EXCEPTION
345     WHEN OTHERS THEN
346     CLOSE asset_cost;
347       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
348                           ,p_msg_name     => G_UNEXPECTED_ERROR
349                           ,p_token1       => G_SQLCODE_TOKEN
350                           ,p_token1_value => SQLCODE
351                           ,p_token2       => G_SQLERRM_TOKEN
352                           ,p_token2_value => SQLERRM);
353 END;
354 
355 -- smoduga
356 -- Added for displaying Total subsidised cost for the Contract on forms Overview tab.
357 PROCEDURE total_subsidy_cost(p_contract_id     IN  NUMBER,
358                            o_subsidy_cost     OUT NOCOPY NUMBER
359                  	  ) IS
360 
361 l_parent_line_id NUMBER;
362 
363 CURSOR parent_line_id IS
364 select okc.id
365 from okc_k_lines_v okc
366     ,okl_k_lines okl
367     ,okc_line_styles_v lse
368 where okc.id=okl.id
369 and  okc.lse_id = lse.id
370 and lse.lty_code='FREE_FORM1'
371 and okc.chr_id = p_contract_id;
372 
373  CURSOR c_subsidy(c_contract_id IN NUMBER,c_parent_line_id IN NUMBER) IS
374   select nvl(sum(nvl(KLE1.subsidy_override_amount,KLE1.amount)),0) amount
375   from OKL_K_LINES KLE1,
376      OKC_K_LINES_B CLE1,
377      OKC_LINE_STYLES_B LS1,
378      OKL_ASSET_SUBSIDY_UV SUB,
379      OKL_SUBSIDIES_B SUBB,
380      OKL_SUBSIDIES_TL SUBT,
381      OKC_STATUSES_V STS1
382   where KLE1.ID = CLE1.ID
383       AND CLE1.LSE_ID = LS1.ID
384       AND LS1.LTY_CODE ='SUBSIDY'
385       AND cle1.dnz_chr_id = c_contract_id -- from parameter
386       AND CLE1.STS_CODE = STS1.CODE
387       AND CLE1.STS_CODE <> 'ABANDONED'
388       AND SUB.SUBSIDY_ID = KLE1.SUBSIDY_ID
389       AND SUB.ASSET_CLE_ID = c_parent_line_id -- parent_line_id from grid
390       AND SUB.dnz_chr_id = cle1.dnz_chr_id
391       AND SUB.subsidy_cle_id = KLE1.ID
392       AND SUBB.ID = KLE1.SUBSIDY_ID
393       AND SUBT.ID = SUBB.ID
394       And subt.language  = userenv('LANG')
395       AND SUBB.accounting_method_code = 'NET'
396       AND SUBB.CUSTOMER_VISIBLE_YN = 'Y';
397 
398 
399 
400  BEGIN
401   OPEN parent_line_id;
402   FETCH parent_line_id INTO  l_parent_line_id;
403   CLOSE parent_line_id;
404 
405   OPEN c_subsidy(p_contract_id,l_parent_line_id);
406   FETCH c_subsidy INTO o_subsidy_cost;
407    IF (c_subsidy%NOTFOUND) THEN
408     CLOSE c_subsidy;
409     o_subsidy_cost := 0;
410    END IF;
411   CLOSE c_subsidy;
412 
413     EXCEPTION
414     WHEN OTHERS THEN
415     CLOSE parent_line_id;
416     CLOSE c_subsidy;
417       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
418                           ,p_msg_name     => G_UNEXPECTED_ERROR
419                           ,p_token1       => G_SQLCODE_TOKEN
420                           ,p_token1_value => SQLCODE
421                           ,p_token2       => G_SQLERRM_TOKEN
422                           ,p_token2_value => SQLERRM);
423 END;
424 
425 --varangan bug#5036582, added the procedures to get the billed and unbilled
426 --outstanding using formulas starts
427 
428  PROCEDURE out_standing_rcvble(p_contract_id     IN  NUMBER,
429                                 o_rcvble_amt     OUT NOCOPY NUMBER) IS
430     lx_return_status VARCHAR2(1);
431     lx_msg_count     NUMBER;
432     lx_msg_data      VARCHAR2(2000);
433   BEGIN
434     null;
435   EXCEPTION
436     WHEN OTHERS THEN
437      Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
438                          ,p_msg_name     => G_UNEXPECTED_ERROR
439                          ,p_token1       => G_SQLCODE_TOKEN
440                          ,p_token1_value => SQLCODE
441                          ,p_token2       => G_SQLERRM_TOKEN
442                          ,p_token2_value => SQLERRM);
443   END out_standing_rcvble;
444 
445   PROCEDURE outstanding_billed_amt(p_contract_id     IN  NUMBER,
446                                    o_billed_amt      OUT NOCOPY NUMBER) IS
447     lx_return_status VARCHAR2(1);
448     lx_msg_count     NUMBER;
449     lx_msg_data      VARCHAR2(2000);
450   BEGIN
451     OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => 1.0,
452                                     p_init_msg_list => null,
453                                     x_return_status => lx_return_status,
454                                     x_msg_count     => lx_msg_count,
455                                     x_msg_data      => lx_msg_data,
456                                     p_formula_name  => g_formula_out_billed,
457                                     p_contract_id   => p_contract_id,
458                                     x_value         => o_billed_amt);
459   EXCEPTION
460     WHEN OTHERS THEN
461      Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
462                          ,p_msg_name     => G_UNEXPECTED_ERROR
463                          ,p_token1       => G_SQLCODE_TOKEN
464                          ,p_token1_value => SQLCODE
465                          ,p_token2       => G_SQLERRM_TOKEN
466                          ,p_token2_value => SQLERRM);
467   END outstanding_billed_amt;
468 
469   PROCEDURE outstanding_unbilled_amt(p_contract_id     IN  NUMBER,
470                                      o_unbilled_amt    OUT NOCOPY NUMBER) IS
471     lx_return_status VARCHAR2(1);
472     lx_msg_count     NUMBER;
473     lx_msg_data      VARCHAR2(2000);
474   BEGIN
475     OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => 1.0,
476                                     p_init_msg_list => null,
477                                     x_return_status => lx_return_status,
478                                     x_msg_count     => lx_msg_count,
479                                     x_msg_data      => lx_msg_data,
480                                     p_formula_name  => g_formula_out_unbilled,
481                                     p_contract_id   => p_contract_id,
482                                     x_value         => o_unbilled_amt);
483   EXCEPTION
484     WHEN OTHERS THEN
485      Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
486                          ,p_msg_name     => G_UNEXPECTED_ERROR
487                          ,p_token1       => G_SQLCODE_TOKEN
488                          ,p_token1_value => SQLCODE
489                          ,p_token2       => G_SQLERRM_TOKEN
490                          ,p_token2_value => SQLERRM);
491   END outstanding_unbilled_amt;
492 
493  --varangan bug#5036582 end
494 
495 
496 PROCEDURE contract_dates(p_contract_id     IN  NUMBER,
497                            o_start_date      OUT NOCOPY DATE,
498                            o_end_date        OUT NOCOPY DATE,
499                            o_term_duration   OUT NOCOPY NUMBER) IS
500 CURSOR contract_dates IS
501 SELECT khr.start_date,khr.end_date,okhr.term_duration
502 FROM OKL_K_HEADERS okhr ,okc_k_headers_v khr
503 WHERE okhr.id = khr.id
504       AND khr.id = p_contract_id;
505  BEGIN
506   OPEN contract_dates;
507   FETCH contract_dates INTO  o_start_date,o_end_date,o_term_duration;
508   CLOSE contract_dates ;
509   EXCEPTION
510     WHEN OTHERS THEN
511     CLOSE contract_dates ;
512       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
513                           ,p_msg_name     => G_UNEXPECTED_ERROR
514                           ,p_token1       => G_SQLCODE_TOKEN
515                           ,p_token1_value => SQLCODE
516                           ,p_token2       => G_SQLERRM_TOKEN
517                           ,p_token2_value => SQLERRM);
518 END;
519   PROCEDURE     rent_security_interest(p_contract_id      IN  NUMBER,
520                            o_advance_rent     OUT NOCOPY NUMBER,
521                            o_security_deposit OUT NOCOPY NUMBER,
522                            o_interest_type    OUT NOCOPY VARCHAR2) IS
523 CURSOR advance_rent IS
524   SELECT SUM(NVL(orv1.rule_information6,0))
525   FROM okc_rules_v orv1,
526        okc_rule_groups_b org1
527   WHERE  org1.dnz_chr_id = p_contract_id
528      and org1.dnz_chr_id = org1.chr_id
529      AND org1.id = orv1.rgp_id
530      AND orv1.rule_information_category = 'LASLL'
531      AND exists
532         ( SELECT 'x'
533           FROM okc_k_headers_v okhdr,
534                okc_rule_groups_b org,
535                okc_rules_v  orv,
536                OKL_STRMTYP_SOURCE_V stm
537           WHERE okhdr.id = org1.dnz_chr_id
538             and okhdr.id = org.dnz_chr_id
539             and org.chr_id = org.dnz_chr_id
540             AND org.rgd_code = 'LALEVL'
541             AND org.id = orv.rgp_id
542             AND orv.rule_information_category ='LASLH'
543             AND jtot_object1_code ='OKL_STRMTYP'
544             AND object1_id1 = stm.id1
545             AND object1_id2 = stm.id2
546             AND stm.stream_type_purpose ='RENT');
547 -- cursor changed to filter the streams based on the purpose 'SECURITY_DEPOSIT'
548 -- and the amounts summed up, enhancement done for user defined streams impacts, bug 3924303
549 
550   CURSOR security_deposit IS
551     SELECT	ste.amount		amount
552 		FROM	okc_k_lines_b		kle,
553 			okc_line_styles_b	lse,
554 			okc_k_items		ite,
555 			okl_strm_type_b		sty1,
556 			okl_streams		stm,
557 			okl_strm_type_b		sty2,
558 			okl_strm_elements	ste
559 		WHERE	kle.chr_id		= p_contract_id
560 		AND	lse.id			= kle.lse_id
561 		AND	lse.lty_code		= 'FEE'
562 		AND	ite.cle_id		= kle.id
563 		AND	ite.jtot_object1_code	= 'OKL_STRMTYP'
564 		AND	sty1.id			= ite.object1_id1
565 		AND	sty1.stream_type_purpose= 'SECURITY_DEPOSIT'
566 		AND	stm.kle_id		= kle.id
567 		AND	stm.khr_id		= p_contract_id
568 		AND	stm.active_yn		= 'Y'
569 		AND	stm.say_code		= 'CURR'
570            	--multigaap changes
571            	AND     stm.PURPOSE_CODE	IS NULL
572            	--end multigaap changes
573 		AND	sty2.id			= stm.sty_id
574 		AND	sty2.stream_type_purpose= 'SECURITY_DEPOSIT'
575 		AND	ste.stm_id		= stm.id
576 		AND	ste.date_billed		IS NOT NULL
577 		AND	NVL (ste.amount, 0)	<> 0;
578 --rkuttiya modifed for bug # 5031455 join condition of cursor to use dnz_chr_id instead of chr_id
579 CURSOR Interest_Type IS
580   SELECT DECODE(rule_information1, 'Y', 'Variable', 'N', 'Fixed', 'Unknown')
581   FROM OKC_K_HEADERS_B CHR,okc_rule_groups_b RGP,okc_rules_b RUL
582   WHERE CHR.ID = RGP.DNZ_CHR_ID AND
583    --CHR.ID = RGP.CHR_ID AND
584         RGP.ID = RUL.RGP_ID AND
585         RUL.rule_information_category = 'LAINTP' AND
586 		CHR.id = p_contract_id;
587 
588  BEGIN
589   OPEN advance_rent;
590   FETCH advance_rent INTO o_advance_rent;
591   CLOSE advance_rent ;
592   OPEN security_deposit;
593   FETCH security_deposit INTO o_security_deposit;
594   CLOSE security_deposit;
595   OPEN Interest_type;
596   FETCH Interest_type INTO o_interest_type;
597   CLOSE Interest_type;
598   EXCEPTION
599     WHEN OTHERS THEN
600     CLOSE advance_rent ;
601     CLOSE security_deposit;
602     CLOSE Interest_type;
603       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
604                           ,p_msg_name     => G_UNEXPECTED_ERROR
605                           ,p_token1       => G_SQLCODE_TOKEN
606                           ,p_token1_value => SQLCODE
607                           ,p_token2       => G_SQLERRM_TOKEN
608                           ,p_token2_value => SQLERRM);
609 END;
610   PROCEDURE notes(p_contract_id     IN  NUMBER,
611                   o_notes           OUT NOCOPY VARCHAR2
612       		    ) IS
613 CURSOR notes IS
614  SELECT notes,last_update_date FROM jtf_notes_vl
615  WHERE source_object_id = p_contract_id
616        AND SOURCE_OBJECT_CODE = 'OKC_K_HEADER'
617  ORDER BY last_update_date DESC;
618   l_date  DATE;
619    BEGIN
620   OPEN notes;
621   FETCH notes INTO  o_notes,l_date;
622   CLOSE notes;
623   EXCEPTION
624   WHEN OTHERS THEN
625     CLOSE notes;
626       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
627                           ,p_msg_name     => G_UNEXPECTED_ERROR
628                           ,p_token1       => G_SQLCODE_TOKEN
629                           ,p_token1_value => SQLCODE
630                           ,p_token2       => G_SQLERRM_TOKEN
631                           ,p_token2_value => SQLERRM);
632 END;
633   ---------------------------------------------------------------------------
634   -- FUNCTION get_vendor_program
635   ---------------------------------------------------------------------------
636   FUNCTION get_vendor_program(
637      p_contract_id			IN NUMBER,
638      x_vendor_program		     	OUT NOCOPY VARCHAR2)
639   RETURN VARCHAR2
640   IS
641     CURSOR vendor_program_cur(p_contract_id NUMBER) IS
642       SELECT PROGRAM_CONTRACT_NUMBER
643       FROM okl_k_hdrs_full_uv
644       WHERE  CHR_ID = p_contract_id;
645     l_vendor_program		    VARCHAR2(240);
646     l_api_version           NUMBER;
647     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
648     l_msg_count             NUMBER;
649     l_msg_data              VARCHAR2(2000);
650   BEGIN
651     OPEN  vendor_program_cur(p_contract_id);
652     FETCH vendor_program_cur INTO l_vendor_program;
653     CLOSE vendor_program_cur;
654     x_vendor_program := l_vendor_program;
655     RETURN l_return_status;
656     EXCEPTION
657     WHEN OTHERS THEN
658       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
659                           ,p_msg_name     => G_UNEXPECTED_ERROR
660                           ,p_token1       => G_SQLCODE_TOKEN
661                           ,p_token1_value => SQLCODE
662                           ,p_token2       => G_SQLERRM_TOKEN
663                           ,p_token2_value => SQLERRM);
664       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
665       RETURN(l_return_status);
666   END get_vendor_program;
667   ---------------------------------------------------------------------------
668   -- FUNCTION get_private_label
669   ---------------------------------------------------------------------------
670   FUNCTION get_private_label(
671      p_contract_id			IN NUMBER,
672      x_private_label          	OUT NOCOPY VARCHAR2)
673   RETURN VARCHAR2
674   IS
675     l_api_version           NUMBER :=1;
676     l_init_msg_list         VARCHAR2(1) DEFAULT Okl_Api.G_FALSE;
677     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
678     l_msg_count             NUMBER;
679     l_msg_data              VARCHAR2(2000);
680     l_party_tab             Okl_Jtot_Extract.party_tab_type;
681   BEGIN
682     -- Procedure to call to get Private Label ID, nothing but
683     -- a Role
684     Okl_Jtot_Extract.Get_Party (
685           l_api_version,
686           l_init_msg_list,
687           l_return_status,
688           l_msg_count,
689           l_msg_data,
690           p_contract_id,
691           NULL,
692           'PRIVATE_LABEL',
693           'S',
694           l_party_tab
695           );
696     x_private_label := l_party_tab(1).name;
697     RETURN l_return_status;
698     EXCEPTION
699     WHEN OTHERS THEN
700       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
701                           ,p_msg_name     => G_UNEXPECTED_ERROR
702                           ,p_token1       => G_SQLCODE_TOKEN
703                           ,p_token1_value => SQLCODE
704                           ,p_token2       => G_SQLERRM_TOKEN
705                           ,p_token2_value => SQLERRM);
706       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
707       RETURN(l_return_status);
708   END get_private_label;
709   ---------------------------------------------------------------------------
710   -- FUNCTION get_currency
711   ---------------------------------------------------------------------------
712   FUNCTION get_currency(
713      p_contract_id			IN NUMBER,
714      x_currency			     	OUT NOCOPY VARCHAR2)
715   RETURN VARCHAR2
716   IS
717     CURSOR currency_cur(p_contract_id NUMBER) IS
718       SELECT currency_code
719       FROM   okc_k_headers_b
720       WHERE  id = p_contract_id;
721     l_currency			    VARCHAR2(240);
722     l_api_version           NUMBER;
723     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
724     l_msg_count             NUMBER;
725     l_msg_data              VARCHAR2(2000);
726   BEGIN
727     OPEN  currency_cur(p_contract_id);
728     FETCH currency_cur INTO l_currency;
729     CLOSE currency_cur;
730     x_currency := l_currency;
731     RETURN l_return_status;
732     EXCEPTION
733     WHEN OTHERS THEN
734       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
735                           ,p_msg_name     => G_UNEXPECTED_ERROR
736                           ,p_token1       => G_SQLCODE_TOKEN
737                           ,p_token1_value => SQLCODE
738                           ,p_token2       => G_SQLERRM_TOKEN
739                           ,p_token2_value => SQLERRM);
740       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
741       RETURN(l_return_status);
742   END get_currency;
743   ---------------------------------------------------------------------------
744   -- FUNCTION get_syndicate_flag
745   ---------------------------------------------------------------------------
746   FUNCTION get_syndicate_flag(
747      p_contract_id			IN NUMBER,
748      x_syndicate_flag		     	OUT NOCOPY VARCHAR2)
749   RETURN VARCHAR2
750   IS
751     CURSOR syndicate_flag_cur(p_contract_id NUMBER) IS
752       SELECT 'Y'  FROM okc_k_headers_b CHR
753       WHERE id = p_contract_id
754       AND EXISTS
755           (
756            SELECT 'x' FROM okc_k_items cim
757            WHERE  cim.object1_id1 = TO_CHAR(CHR.id)
758            AND    EXISTS
759                   (
760                    SELECT 'x' FROM okc_k_lines_b cle, okc_line_styles_b lse
761                    WHERE  cle.lse_id = lse.id
762                    AND    lse.lty_code = 'SHARED'
763                    AND    cle.id = cim.cle_id
764                   )
765            AND    EXISTS
766                   (
767                    SELECT 'x' FROM okc_k_headers_b chr2
768                    WHERE  chr2.id = cim.dnz_chr_id
769                    AND    chr2.scs_code = 'SYNDICATION'
770                    AND    chr2.sts_code NOT IN ('TERMINATED','ABANDONED')
771                   )
772           )
773       AND CHR.scs_code IN ('LEASE','LOAN');
774     l_syndicate_flag		    VARCHAR2(1) := 'N';
775     l_api_version           NUMBER;
776     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
777     l_msg_count             NUMBER;
778     l_msg_data              VARCHAR2(2000);
779   BEGIN
780     OPEN  syndicate_flag_cur(p_contract_id);
781     FETCH syndicate_flag_cur INTO l_syndicate_flag;
782     CLOSE syndicate_flag_cur;
783     x_syndicate_flag := l_syndicate_flag;
784     RETURN l_return_status;
785     EXCEPTION
786     WHEN OTHERS THEN
787       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
788                           ,p_msg_name     => G_UNEXPECTED_ERROR
789                           ,p_token1       => G_SQLCODE_TOKEN
790                           ,p_token1_value => SQLCODE
791                           ,p_token2       => G_SQLERRM_TOKEN
792                           ,p_token2_value => SQLERRM);
793       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
794       RETURN(l_return_status);
795   END get_syndicate_flag;
796   ---------------------------------------------------------------------------
797   -- FUNCTION GET_ORG_ID
798   ---------------------------------------------------------------------------
799   FUNCTION GET_ORG_ID(
800 			     	p_contract_id	IN NUMBER,
801 				x_org_id		OUT NOCOPY NUMBER
802 			   )
803   RETURN VARCHAR2 AS
804   -- get org_id for contract
805     CURSOR get_org_id_cur (p_contract_id IN VARCHAR2) IS
806       SELECT authoring_org_id
807       FROM   okc_k_headers_b
808       WHERE  id = p_contract_id;
809     l_api_version           NUMBER;
810     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
811     l_msg_count             NUMBER;
812     l_msg_data              VARCHAR2(2000);
813   BEGIN
814     OPEN get_org_id_cur(p_contract_id);
815     FETCH get_org_id_cur INTO x_org_id;
816     CLOSE get_org_id_cur;
817     RETURN l_return_status;
818     EXCEPTION
819     WHEN OTHERS THEN
820     CLOSE get_org_id_cur;
821       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
822                           ,p_msg_name     => G_UNEXPECTED_ERROR
823                           ,p_token1       => G_SQLCODE_TOKEN
824                           ,p_token1_value => SQLCODE
825                           ,p_token2       => G_SQLERRM_TOKEN
826                           ,p_token2_value => SQLERRM);
827       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
828       RETURN(l_return_status);
829   END GET_ORG_ID;
830   ---------------------------------------------------------------------------
831   -- FUNCTION GET_RESOURCE_ID
832   ---------------------------------------------------------------------------
833   FUNCTION GET_RESOURCE_ID(	x_res_id		OUT NOCOPY NUMBER
834  			   )
835   RETURN VARCHAR2 AS
836   -- get org_id for contract
837     CURSOR get_res_id_cur(l_user_id NUMBER) IS
838       SELECT resource_id
839 	  FROM jtf_rs_resource_extns
840       WHERE user_id = l_user_id;
841     l_api_version           NUMBER;
842     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
843     l_msg_count             NUMBER;
844     l_msg_data              VARCHAR2(2000);
845     l_user_id               NUMBER(10);
846   BEGIN
847     l_user_id := Fnd_Profile.value('USER_ID');
848     OPEN get_res_id_cur(l_user_id );
849     FETCH get_res_id_cur INTO x_res_id;
850     CLOSE get_res_id_cur;
851     RETURN l_return_status;
852     EXCEPTION
853     WHEN OTHERS THEN
854     CLOSE get_res_id_cur;
855       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
856                           ,p_msg_name     => G_UNEXPECTED_ERROR
857                           ,p_token1       => G_SQLCODE_TOKEN
858                           ,p_token1_value => SQLCODE
859                           ,p_token2       => G_SQLERRM_TOKEN
860                           ,p_token2_value => SQLERRM);
861       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
862       RETURN(l_return_status);
863   END GET_resource_ID;
864   FUNCTION get_warning_message(
865      p_contract_id			IN NUMBER,
866      x_delinquent_flag		     	OUT NOCOPY VARCHAR2,
867      x_bankrupt_flag		     	OUT NOCOPY VARCHAR2,
868      x_syndicate_flag		     	OUT NOCOPY VARCHAR2,
869      x_special_handling_flag	     	OUT NOCOPY VARCHAR2
870 )
871   RETURN VARCHAR2
872   IS
873     CURSOR syndicate_flag_cur(p_contract_id NUMBER) IS
874       SELECT 'Y'  FROM okc_k_headers_b CHR
875       WHERE id = p_contract_id
876       AND EXISTS
877           (
878            SELECT 'x' FROM okc_k_items cim
879            WHERE  cim.object1_id1 = TO_CHAR(CHR.id)
880            AND    EXISTS
881                   (
882                    SELECT 'x' FROM okc_k_lines_b cle, okc_line_styles_b lse
883                    WHERE  cle.lse_id = lse.id
884                    AND    lse.lty_code = 'SHARED'
885                    AND    cle.id = cim.cle_id
886                   )
887            AND    EXISTS
888                   (
889                    SELECT 'x' FROM okc_k_headers_b chr2
890                    WHERE  chr2.id = cim.dnz_chr_id
891                    AND    chr2.scs_code = 'SYNDICATION'
892                    AND    chr2.sts_code NOT IN ('TERMINATED','ABANDONED')
893                   )
894           )
895       AND CHR.scs_code IN ('LEASE','LOAN');
896     l_flag		    VARCHAR2(1) := 'N';
897     l_api_version           NUMBER;
898     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
899     l_msg_count             NUMBER;
900     l_msg_data              VARCHAR2(2000);
901   BEGIN
902     OPEN  syndicate_flag_cur(p_contract_id);
903     FETCH syndicate_flag_cur INTO l_flag;
904     CLOSE syndicate_flag_cur;
905     x_syndicate_flag := l_flag;
906     RETURN l_return_status;
907     EXCEPTION
908     WHEN OTHERS THEN
909       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
910                           ,p_msg_name     => G_UNEXPECTED_ERROR
911                           ,p_token1       => G_SQLCODE_TOKEN
912                           ,p_token1_value => SQLCODE
913                           ,p_token2       => G_SQLERRM_TOKEN
914                           ,p_token2_value => SQLERRM);
915       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
916       RETURN(l_return_status);
917   END get_warning_message;
918   PROCEDURE Set_Connection_Context IS
919    BEGIN
920 	IF (g_user_id = Okl_Api.G_MISS_NUM) OR
921 	   (g_user_id <> Fnd_Global.user_id) THEN
922        g_user_id := Fnd_Global.user_id;
923 	  g_reset_access_flag := TRUE;
924 	  g_reset_lang_flag := TRUE;
925      END IF;
926 	IF (g_resp_id = Okl_Api.G_MISS_NUM) OR
927 	   (g_resp_id <> Fnd_Global.resp_id) THEN
928        g_resp_id := Fnd_Global.resp_id;
929 	  g_reset_resp_flag := TRUE;
930      END IF;
931    END;
932   FUNCTION Get_K_Access_Level(p_chr_id IN NUMBER,
933                             p_scs_code IN VARCHAR2 DEFAULT NULL)
934   RETURN VARCHAR2 IS
935   l_scs_code okc_k_headers_b.scs_code%TYPE;
936   l_modify_access         CONSTANT VARCHAR2(1) := 'U';
937   l_read_access           CONSTANT VARCHAR2(1) := 'R';
938   l_no_access             CONSTANT VARCHAR2(1) := 'N';
939   l_resp_access           okc_subclass_resps.access_level%TYPE;
940   l_resource_access       okc_subclass_resps.access_level%TYPE;
941   l_group_access          okc_k_accesses.access_level%TYPE;
942   l_group_id              okc_k_accesses.group_id%TYPE;
943   l_row_notfound          BOOLEAN;
944   l_group_has_read_access BOOLEAN;
945   l_date                  DATE := SYSDATE;
946   exception_modify_access EXCEPTION;
947   exception_read_access   EXCEPTION;
948   exception_no_access     EXCEPTION;
949   -- This cursor retrieves the sub class code for the contract. This is
950   -- executed only if the subclass is not passed in
951   CURSOR chr_csr IS
952   SELECT scs_code
953     FROM okc_k_headers_b
954    WHERE id = p_chr_id;
955   -- This cursor checks to see the type of access granted to the current
956   -- user'S responsibility TO the sub class
957   CURSOR resp_csr IS
958   SELECT ras.access_level
959     FROM okc_subclass_resps ras
960    WHERE ras.scs_code = l_scs_code
961      AND ras.resp_id  = Fnd_Global.resp_id
962      AND l_date BETWEEN ras.start_date AND NVL(ras.end_date, l_date);
963   -- This cursor retrieves the resource id corresponding to the logged
964   -- in user. The resource has to have a role of CONTRACT for this to be
965   -- considered
966   CURSOR res_csr IS
967   SELECT res.resource_id
968     FROM jtf_rs_resource_extns res,
969          jtf_rs_role_relations rrr,
970          jtf_rs_roles_b        rr
971    WHERE res.user_id              = Fnd_Global.user_id
972      AND l_date BETWEEN res.start_date_active
973                     AND NVL(res.end_date_active, l_date)
974      AND res.resource_id          = rrr.role_resource_id
975      AND rrr.role_resource_type   = 'RS_INDIVIDUAL'
976      AND NVL(rrr.delete_flag,'N') = 'N'
977      AND l_date BETWEEN rrr.start_date_active
978                      AND NVL(rrr.end_date_active, l_date)
979      AND rrr.role_id              = rr.role_id
980      AND rr.role_type_code        = 'CONTRACTS';
981   -- This checks the access level for the resource and the contract
982   CURSOR res_acc_csr IS
983   SELECT cas.access_level
984     FROM okc_k_accesses cas
985    WHERE cas.chr_id = p_chr_id
986      AND cas.resource_id = g_user_resource_id;
987   -- This cursor selects all the resource groups and the access level
988   -- for the contract.
989   CURSOR grp_acc_csr IS
990   SELECT cas.group_id,
991          cas.access_level
992     FROM okc_k_accesses cas
993    WHERE cas.chr_id = p_chr_id
994      AND cas.group_id IS NOT NULL
995    ORDER BY 2 DESC;
996   -- This cursor selects all the resource groups that the resource
997   -- belongs to. Fetched only once per session. The retrieved rows are
998   -- stored in pl/sql global table and this table is used for
999   -- subsequent contracts in the same session.
1000   CURSOR res_grp_csr IS
1001   SELECT rgm.group_id
1002     FROM jtf_rs_group_members  rgm,
1003          jtf_rs_role_relations rrr,
1004          jtf_rs_roles_b        rr,
1005          jtf_rs_groups_b       rgb
1006    WHERE rgm.resource_id          = g_user_resource_id
1007      AND rgm.group_id             = rgb.group_id
1008      AND l_date BETWEEN NVL(rgb.start_date_active, l_date)
1009                     AND NVL(rgb.end_date_active, l_date)
1010      AND rgm.group_id             = rrr.role_resource_id
1011      AND NVL(rgm.delete_flag,'N') = 'N'
1012      AND rrr.role_resource_type   = 'RS_GROUP'
1013      AND NVL(rrr.delete_flag,'N') = 'N'
1014      AND l_date BETWEEN rrr.start_date_active
1015                     AND NVL(rrr.end_date_active, l_date)
1016      AND rrr.role_id              = rr.role_id
1017      AND rr.role_type_code        = 'CONTRACTS'
1018    UNION
1019   SELECT rgd.parent_group_id
1020     FROM jtf_rs_group_members  rgm,
1021          jtf_rs_groups_denorm  rgd,
1022          jtf_rs_role_relations rrr,
1023          jtf_rs_roles_b        rr,
1024          jtf_rs_groups_b       rgb
1025    WHERE rgm.resource_id          = g_user_resource_id
1026      AND NVL(rgm.delete_flag,'N') = 'N'
1027      AND rgd.group_id             = rgm.group_id
1028      AND rgd.parent_group_id      = rgb.group_id
1029      AND l_date BETWEEN NVL(rgb.start_date_active, l_date)
1030                     AND NVL(rgb.end_date_active, l_date)
1031      AND rgd.parent_group_id      = rrr.role_resource_id
1032      AND rrr.role_resource_type   = 'RS_GROUP'
1033      AND NVL(rrr.delete_flag,'N') = 'N'
1034      AND l_date BETWEEN rrr.start_date_active
1035                      AND NVL(rrr.end_date_active, l_date)
1036      AND rrr.role_id              = rr.role_id
1037      AND rr.role_type_code        = 'CONTRACTS';
1038 BEGIN
1039   -- Global variable g_user_id introduced to resolve the problem of connection pooling.
1040   -- This variable is not guaranteed to be same for the same user across multiple
1041   -- web requests. So everytime a global needs to be checked, make sure it was built
1042   -- by the same user.
1043   Set_Connection_Context;
1044   -- If no contract identifier is passed, then do not allow access
1045   IF p_chr_id IS NULL THEN
1046     RAISE Exception_No_Access;
1047   END IF;
1048   -- If the sub class is not passed in, then derive it using the
1049   -- contract identifier
1050   l_scs_code := p_scs_code;
1051   IF l_scs_code IS NULL THEN
1052     -- Get the subclass/category from the contracts table
1053     OPEN chr_csr;
1054     FETCH chr_csr INTO l_scs_code;
1055     l_row_notfound := chr_csr%NOTFOUND;
1056     CLOSE chr_csr;
1057     IF l_row_notfound THEN
1058       RAISE Exception_No_Access;
1059     END IF;
1060   END IF;
1061   -- fnd_log.string(1, 'okl', 'l_scs_code : ' || l_scs_code);
1062   -- Determine if the access for the category and responsibility has
1063   -- been determined earlier and cached in the global variables. If not,
1064   -- then determine it using the resp_csr g_resp_access is initialized
1065   -- to g_miss_char. If this could not be determined the first time
1066   -- around, the variables are set to null and not examined during the
1067   -- next round
1068   IF (l_scs_code <> g_scs_code) OR (g_reset_resp_flag) THEN
1069     OPEN resp_csr;
1070     FETCH resp_csr INTO l_resp_access;
1071     l_row_notfound := resp_csr%NOTFOUND;
1072     CLOSE resp_csr;
1073     IF l_row_notfound THEN
1074       l_resp_access := NULL;
1075     END IF;
1076     -- fnd_log.string(1, 'okl', 'l_resp_access : ' || l_resp_access);
1077     -- Save the current access level into global variables. If no access
1078     -- was determined, the local variables hold null and so do the global
1079     -- variables
1080     g_scs_code    := l_scs_code;
1081     g_resp_access := l_resp_access;
1082     IF g_reset_resp_flag THEN
1083       g_reset_resp_flag := FALSE;
1084     END IF;
1085   END IF;
1086   -- Check the access level at the category and responsibility level first
1087   IF g_resp_access = l_modify_access THEN
1088     RAISE Exception_Modify_Access;
1089   END IF;
1090   -- If could not find 'Update' access from the user's responsibility,
1091   -- continue to check if granted any access at the user resource level.
1092   -- If the user resource id is not determined earlier, then retrieve it
1093   -- and cache it as it will not change during the current session
1094   IF (g_user_resource_id = Okl_Api.G_MISS_NUM) OR
1095 	(g_reset_access_flag) THEN
1096     OPEN res_csr;
1097     FETCH res_csr INTO g_user_resource_id;
1098     l_row_notfound := res_csr%NOTFOUND;
1099     CLOSE res_csr;
1100     g_groups_processed := FALSE;
1101     IF l_row_notfound THEN
1102       g_user_resource_id := NULL;
1103     END IF;
1104   END IF;
1105   -- Determine the access level for the resource id on the contract
1106   IF g_user_resource_id IS NOT NULL THEN
1107     OPEN res_acc_csr;
1108     FETCH res_acc_csr INTO l_resource_access;
1109     CLOSE res_acc_csr;
1110     IF l_resource_access = l_modify_access THEN
1111       RAISE Exception_Modify_Access;
1112     END IF;
1113     -- fnd_log.string(1, 'okl', 'l_resource_access : ' || l_resource_access);
1114     -- Since the resource does not have Update access, we need to get its
1115     -- parent group and its grand parent groups (recursively). Cache it in
1116     -- the global pl/sql table since this hierarchy is not going to change
1117     -- for a resource. So do it only for the first time. Do this by
1118     -- examining the global variable g_groups_processed. This indicates
1119     -- that the array of groups has been retrieved for the session
1120     IF g_groups_processed THEN
1121 	 NULL;
1122     ELSE
1123       OPEN res_grp_csr;
1124       FETCH res_grp_csr BULK COLLECT INTO g_sec_groups;
1125       CLOSE res_grp_csr;
1126       g_groups_processed := TRUE;
1127     END IF;
1128     -- Finally check for any access granted at the group level.
1129     -- Do it only if the resource belongs to at least one group
1130     -- fnd_log.string(1, 'okl', 'g_sec_groups.count : ' || to_char(g_sec_groups.count));
1131     l_group_has_read_access := FALSE;
1132     IF g_sec_groups.COUNT > 0 THEN
1133       OPEN grp_acc_csr;
1134       LOOP
1135         -- Get all the groups assigned to the contract
1136         FETCH grp_acc_csr INTO l_group_id, l_group_access;
1137 	   EXIT WHEN grp_acc_csr%NOTFOUND;
1138         FOR i IN 1 .. g_sec_groups.LAST
1139         LOOP
1140 	     IF g_sec_groups(i) = l_group_id THEN
1141             -- If the groups match and access level is 'U', exit immediately
1142 		  IF l_group_access = l_modify_access THEN
1143               RAISE Exception_Modify_Access;
1144             END IF;
1145 		  IF l_group_access = l_read_access THEN
1146 		    l_group_has_read_access := TRUE;
1147             END IF;
1148           END IF;
1149         END LOOP;
1150       END LOOP;
1151       CLOSE grp_acc_csr;
1152     END IF;
1153   END IF;
1154   IF (l_read_access IN (g_resp_access, l_resource_access)) OR
1155      l_group_has_read_access THEN
1156     RAISE Exception_Read_Access;
1157   END IF;
1158   RAISE Exception_No_Access;
1159 EXCEPTION
1160   WHEN Exception_Modify_Access THEN
1161     IF grp_acc_csr%ISOPEN THEN
1162       CLOSE grp_acc_csr;
1163     END IF;
1164     IF g_reset_access_flag THEN
1165       g_reset_access_flag := FALSE;
1166     END IF;
1167     RETURN(l_modify_access);
1168   WHEN Exception_Read_Access THEN
1169     IF g_reset_access_flag THEN
1170       g_reset_access_flag := FALSE;
1171     END IF;
1172     RETURN(l_read_access);
1173   WHEN Exception_No_Access THEN
1174     IF g_reset_access_flag THEN
1175       g_reset_access_flag := FALSE;
1176     END IF;
1177     RETURN(l_no_access);
1178 END get_k_access_level;
1179 
1180 
1181 PROCEDURE note_context_info (
1182 	p_sql_statement IN VARCHAR2,
1183 -- SPILLAIP - 2689257 - Start
1184 	p_object_info IN OUT NOCOPY VARCHAR2,
1185 	p_object_id IN NUMBER) IS
1186 BEGIN
1187 	EXECUTE IMMEDIATE p_sql_statement INTO p_object_info USING p_object_id;
1188 END note_context_info;
1189 
1190 FUNCTION read_clob (
1191 	p_clob CLOB)
1192 RETURN VARCHAR2 IS
1193   amount BINARY_INTEGER := 32000;
1194   clob_size INTEGER;
1195   buffer VARCHAR2(32000);
1196 BEGIN
1197   IF p_clob IS NULL THEN
1198 	RETURN NULL;
1199   ELSE
1200 	clob_size := dbms_lob.getlength(p_clob);
1201 	IF clob_size < amount THEN
1202 		amount := clob_size;
1203 	END IF;
1204 	IF clob_size = 0 THEN
1205 		RETURN NULL;
1206 	END IF;
1207 	dbms_lob.READ(p_clob, amount, 1, buffer);
1208 	IF amount > 0 THEN
1209 		RETURN buffer;
1210 	ELSE
1211 		RETURN NULL;
1212 	END IF;
1213   END IF;
1214 END read_clob;
1215 
1216 FUNCTION read_clob (
1217 	p_note_id NUMBER)
1218 RETURN VARCHAR2 IS
1219   amount BINARY_INTEGER := 32000;
1220   clob_size INTEGER;
1221   buffer VARCHAR2(32000);
1222 
1223   p_clob CLOB;
1224   CURSOR c_clob (p_note_id NUMBER) IS
1225 	SELECT notes_detail
1226      FROM jtf_notes_tl
1227      WHERE jtf_note_id = p_note_id
1228      AND LANGUAGE = USERENV('LANG');
1229 
1230 BEGIN
1231   OPEN c_clob(p_note_id);
1232   FETCH c_clob INTO p_clob;
1233   CLOSE c_clob;
1234 
1235   IF p_clob IS NULL THEN
1236 	RETURN NULL;
1237   ELSE
1238 	clob_size := dbms_lob.getlength(p_clob);
1239 	IF clob_size < amount THEN
1240 		amount := clob_size;
1241 	END IF;
1242 	IF clob_size = 0 THEN
1243 		RETURN NULL;
1244 	END IF;
1245 	dbms_lob.READ(p_clob, amount, 1, buffer);
1246 	IF amount > 0 THEN
1247 		RETURN buffer;
1248 	ELSE
1249 		RETURN NULL;
1250 	END IF;
1251   END IF;
1252 END read_clob;
1253 
1254 FUNCTION party_type_info (
1255 	p_object_id NUMBER)
1256 RETURN VARCHAR2 IS
1257   l_party_type_name VARCHAR2(2000);
1258   CURSOR C_party_type_name (p_object_id NUMBER) IS
1259   SELECT A.meaning
1260   FROM ar_lookups A, hz_parties p
1261   WHERE p.party_id = p_object_id
1262   AND A.lookup_code = p.party_type
1263   AND A.lookup_type = 'PARTY_TYPE';
1264 
1265 BEGIN
1266   l_party_type_name := 'Party';
1267 
1268   IF p_object_id IS NOT NULL THEN
1269 	OPEN C_party_type_name (p_object_id);
1270 	FETCH C_party_type_name INTO l_party_type_name;
1271 	CLOSE C_party_type_name;
1272   END IF;
1273 
1274   RETURN l_party_type_name;
1275 
1276 END party_type_info;
1277 
1278 FUNCTION note_context_info (
1279 	p_select_id VARCHAR2,
1280 	p_select_name VARCHAR2,
1281 	p_select_details VARCHAR2,
1282 	p_from_table VARCHAR2,
1283 	p_where_clause VARCHAR2,
1284 	p_object_id NUMBER)
1285 RETURN VARCHAR2 IS
1286   l_sql_statement VARCHAR2(2000);
1287   l_object_info VARCHAR2(2000);
1288 BEGIN
1289   l_sql_statement := NULL;
1290   l_object_info := NULL;
1291 
1292   IF p_from_table IS NOT NULL AND p_select_id IS NOT NULL AND p_object_id IS NOT NULL THEN
1293      IF p_select_name IS NOT NULL THEN
1294           l_sql_statement := 'SELECT ' || p_select_name || ' ';
1295      END IF;
1296      IF p_select_details IS NOT NULL THEN
1297           IF l_sql_statement IS NOT NULL THEN
1298                l_sql_statement := l_sql_statement || ' || '' - '' || ';
1299           ELSE
1300                l_sql_statement := 'SELECT ';
1301           END IF;
1302           l_sql_statement := l_sql_statement || p_select_details || ' ';
1303      END IF;
1304      IF l_sql_statement IS NOT NULL THEN
1305           l_sql_statement := l_sql_statement || 'FROM ' || p_from_table || ' ';
1306           l_sql_statement := l_sql_statement || 'WHERE ' || p_select_id || ' = :p_object_id ';
1307 	          IF p_where_clause IS NOT NULL THEN
1308                l_sql_statement := l_sql_statement || 'AND ' || p_where_clause;
1309           END IF;
1310      END IF;
1311   END IF;
1312 
1313   IF l_sql_statement IS NOT NULL THEN
1314 	EXECUTE IMMEDIATE l_sql_statement INTO l_object_info USING p_object_id;
1315   END IF;
1316 
1317   RETURN l_object_info;
1318 
1319 END note_context_info;
1320 
1321 
1322   FUNCTION get_contract_status(
1323      p_contract_id			IN NUMBER,
1324 	 p_working_mode         IN VARCHAR2 DEFAULT 'QUERY',
1325 	 p_contract_status      OUT NOCOPY VARCHAR2,
1326      x_allowed		     	OUT NOCOPY VARCHAR2 )
1327   RETURN VARCHAR2
1328   IS
1329     CURSOR okl_status_cur(p_contract_id NUMBER) IS
1330       SELECT sts_code FROM okc_k_headers_b
1331       WHERE  ID = p_contract_id;
1332 
1333     CURSOR okc_status_cur(p_okl_status VARCHAR2) IS
1334       SELECT ste_code FROM okc_statuses_b
1335       WHERE  code=p_okl_Status;
1336 
1337 
1338     l_api_version           NUMBER;
1339     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1340     l_msg_count             NUMBER;
1341     l_msg_data              VARCHAR2(2000);
1342 	l_user_status           VARCHAR2(100);
1343    	l_okc_status            VARCHAR2(100);
1344 	l_allowed               VARCHAR2(10) := 'FALSE';
1345   BEGIN
1346     OPEN  okl_status_cur(p_contract_id);
1347     FETCH okl_status_cur INTO l_user_status;
1348     CLOSE okl_status_cur;
1349 
1350     OPEN  okc_status_cur(l_user_status);
1351     FETCH okc_status_cur INTO l_okc_status;
1352     CLOSE okc_status_cur;
1353 
1354 	IF p_working_mode = 'QUERY' AND l_user_status IN (--User Status
1355 	            'BOOKED','EVERGREEN','UNDER REVISION','ABANDONED','COMPLETE','INCOMPLETE',
1356 		 'NEW','PASSED','BANKRUPTCY_HOLD','LITIGATION_HOLD','TERMINATION_HOLD','APPROVED',
1357 					'PENDING_APPROVAL','AMENDED','REVERSED','TERMINATED',
1358 -----OKC Status
1359 	                'ACTIVE','CANCELLED','HOLD','SIGNED','TERMINATED','EXPIRED') THEN
1360 		l_allowed := 'TRUE' ;
1361 /**start 11i9 code  */
1362 	ELSIF p_working_mode = 'MODIFY_PARTY' AND  l_okc_status IN ('ACTIVE','HOLD')
1363 	        AND l_user_status IN (--User Status
1364 		                'BOOKED','EVERGREEN','BANKRUPTCY_HOLD','LITIGATION_HOLD',
1365 				'TERMINATION_HOLD')
1366 	               THEN
1367 		l_allowed := 'TRUE' ;
1368 	ELSIF p_working_mode = 'NON_BILLING' AND l_okc_status IN ('ACTIVE','HOLD')
1369 	      AND l_user_status IN (--User Status
1370 	            'BOOKED','EVERGREEN','BANKRUPTCY_HOLD','LITIGATION_HOLD'
1371 			,'TERMINATION_HOLD') THEN
1372 		l_allowed := 'TRUE' ;
1373 	ELSIF p_working_mode = 'RENEW_MIDTERM' AND	l_okc_status IN ('ACTIVE','HOLD')
1374 	      AND l_user_status IN (--User Status
1375 	            'BOOKED','BANKRUPTCY_HOLD','LITIGATION_HOLD','TERMINATION_HOLD') THEN
1376 		l_allowed := 'TRUE' ;
1377 /**end 11i9 code  */
1378 	ELSIF p_working_mode IN ( 'EXCHANGE','RENEWAL','TRANSFER','MODIFY UBB','TAX SCHEDULES') --User Status
1379           AND l_okc_status IN ('ACTIVE','HOLD')
1380      	  AND l_user_status IN ('BOOKED','EVERGREEN','BANKRUPTCY_HOLD'
1381 				,'TERMINATION_HOLD','LITIGATION_HOLD','UNDER REVISION') THEN
1382                l_allowed := 'TRUE' ;
1383          ELSIF p_working_mode = 'CREDIT MEMO' 	--User Status
1384           AND l_okc_status IN ('ACTIVE','HOLD','ENTERED','SIGNED','TERMINATED','EXPIRED')
1385      	  AND l_user_status IN ('BOOKED','EVERGREEN','UNDER REVISION','COMPLETE'
1386 				,'INCOMPLETE','NEW','PASSED', 'BANKRUPTCY_HOLD'
1387 				,'TERMINATION_HOLD','LITIGATION_HOLD','APPROVED'
1388 				,'PENDING_PPROVAL','REVERSED','TERMINATED','EXPIRED') THEN
1389 		l_allowed := 'TRUE' ;
1390 
1391     ELSIF p_working_mode IN ('PAYDOWN','CONVERT INTEREST','MODIFY TC','TERMINATION QUOTE')
1392      	  AND l_okc_status IN ('ACTIVE','HOLD')
1393           AND l_user_status IN ('BOOKED','EVERGREEN','BANKRUPTCY_HOLD',
1394 		                   'LITIGATION_HOLD','TERMINATION_HOLD') THEN
1395 		l_allowed := 'TRUE' ;
1396     ELSIF p_working_mode IN ('ASSET') 	--User Status
1397      	  AND l_okc_status IN ('ACTIVE','HOLD')
1398           AND l_user_status IN ('BOOKED','EVERGREEN','BANKRUPTCY_HOLD','APPROVED'
1399 		                   ,'LITIGATION_HOLD','TERMINATION_HOLD') THEN
1400 		l_allowed := 'TRUE' ;
1401 
1402         --Added Code for Payment Schedule for 11i10 ER
1403         -- Added by rvaduri
1404 	ELSIF p_working_mode IN ( 'REQUEST TERMINATION','PAYMENT_SCHEDULE') 	--User Status
1405           AND l_okc_status IN ('ACTIVE','HOLD')
1406      	  AND l_user_status IN ('BOOKED','EVERGREEN','ACTIVE') THEN
1407 		l_allowed := 'TRUE' ;
1408 	ELSIF p_working_mode = 'RESTRUCTURE' 	--User Status
1409      	  AND l_okc_status IN ('ACTIVE','HOLD')
1410           AND l_user_status IN ('BOOKED','ACTIVE','BANKRUPTCY_HOLD','HOLD','LITIGATION_HOLD') THEN
1411 		l_allowed := 'TRUE' ;
1412 	ELSIF p_working_mode = 'EXPIRATION' 	--User Status
1413      	  AND l_okc_status IN ('ACTIVE','HOLD')
1414           AND l_user_status IN ('BOOKED','ACTIVE') THEN
1415 		l_allowed := 'TRUE' ;
1416         ELSIF p_working_mode = 'TAX OVERRIDE'
1417           AND l_user_status NOT IN ('ABANDONED','APPROVED','COMPLETE','INCOMPLETE','NEW','PASSED','PENDING_APPROVAL') THEN
1418          l_allowed := 'TRUE' ;
1419     ELSE
1420 		l_allowed := 'FALSE' ;
1421     END IF;
1422 	p_contract_status := l_user_status;
1423     x_allowed := l_allowed;
1424     RETURN l_return_status;
1425     EXCEPTION
1426     WHEN OTHERS THEN
1427       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
1428                           ,p_msg_name     => G_UNEXPECTED_ERROR
1429                           ,p_token1       => G_SQLCODE_TOKEN
1430                           ,p_token1_value => SQLCODE
1431                           ,p_token2       => G_SQLERRM_TOKEN
1432                           ,p_token2_value => SQLERRM);
1433       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
1434       RETURN(l_return_status);
1435   END get_contract_status;
1436 
1437 
1438   FUNCTION contract_cust_accounts(	p_cust_acct_id	IN NUMBER,
1439     				                x_no_contracts	OUT NOCOPY NUMBER
1440 			                      )
1441   RETURN VARCHAR2 AS
1442   -- get org_id for contract
1443     CURSOR get_contract_no (p_cust_acct_id IN VARCHAR2) IS
1444       SELECT COUNT(*)
1445       FROM  HZ_CUST_ACCOUNTS CA,
1446             HZ_PARTIES P,OKC_K_HEADERS_V CHR,OKC_STATUSES_V STAT
1447       WHERE CHR.scs_code = 'LEASE' AND
1448             CHR.authoring_org_id = mo_global.get_current_org_id() AND
1449             ca.cust_account_id =chr.cust_acct_id AND
1450             ca.party_id = p.party_id AND
1451             CHR.sts_code = stat.code AND
1452             stat.code = 'BOOKED' AND
1453             ca.cust_account_id =  p_cust_acct_id;
1454 
1455     l_api_version           NUMBER;
1456     l_return_status         VARCHAR2(1) := Okl_Api.G_RET_STS_SUCCESS;
1457     l_msg_count             NUMBER;
1458     l_msg_data              VARCHAR2(2000);
1459   BEGIN
1460     OPEN get_contract_no(p_cust_acct_id);
1461     FETCH get_contract_no INTO x_no_contracts;
1462     CLOSE get_contract_no;
1463     RETURN l_return_status;
1464     EXCEPTION
1465     WHEN OTHERS THEN
1466     CLOSE get_contract_no;
1467       Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
1468                           ,p_msg_name     => G_UNEXPECTED_ERROR
1469                           ,p_token1       => G_SQLCODE_TOKEN
1470                           ,p_token1_value => SQLCODE
1471                           ,p_token2       => G_SQLERRM_TOKEN
1472                           ,p_token2_value => SQLERRM);
1473       l_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
1474       RETURN(l_return_status);
1475   END contract_cust_accounts;
1476   PROCEDURE update_deal(
1477       p_api_version                  IN NUMBER,
1478       p_init_msg_list                IN VARCHAR2 DEFAULT OKC_API.G_FALSE,
1479       x_return_status                OUT NOCOPY VARCHAR2,
1480       x_msg_count                    OUT NOCOPY NUMBER,
1481       x_msg_data                     OUT NOCOPY VARCHAR2,
1482       p_durv_tbl                     IN  deal_tbl_type,
1483       x_durv_tbl                     OUT NOCOPY deal_tbl_type
1484       ) AS
1485     i                        number;
1486     l_return_status          VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
1487     l_msg_count              NUMBER;
1488     l_msg_data               VARCHAR2(2000);
1489     l_overall_status          VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
1490   BEGIN
1491 
1492     OKC_API.init_msg_list(p_init_msg_list);
1493     IF (p_durv_tbl.COUNT > 0) THEN
1494       i := p_durv_tbl.FIRST;
1495      LOOP
1496 
1497       okl_deal_create_pub.update_deal(
1498 	    p_api_version                 => p_api_version,
1499 	    p_init_msg_list               => FND_API.G_FALSE,
1500 	    x_return_status               => x_return_status,
1501 	    x_msg_count                   => x_msg_count,
1502 	    x_msg_data                    => x_msg_data,
1503 	    p_durv_rec       			  => p_durv_tbl(i),
1504 	    x_durv_rec			          => x_durv_tbl(i));
1505 
1506         IF x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1507            IF l_overall_status <> OKC_API.G_RET_STS_UNEXP_ERROR THEN
1508               l_overall_status := x_return_status;
1509            END IF;
1510         END IF;
1511         EXIT WHEN (i = p_durv_tbl.LAST);
1512         i := p_durv_tbl.NEXT(i);
1513       END LOOP;
1514       x_return_status := l_overall_status;
1515     END IF;
1516 
1517   END update_deal;
1518 
1519   PROCEDURE commit_update AS
1520   BEGIN
1521     commit;
1522   END;
1523   PROCEDURE contract_securitized(
1524                    p_contract_id           IN  NUMBER
1525                    ,x_value                 OUT NOCOPY VARCHAR2
1526                    ) IS
1527    cursor investor_assigned IS
1528    select SECURITIZED_CODE
1529    from OKL_K_HEADERS
1530    where id = p_contract_id;
1531    l_securitized   VARCHAR2(1);
1532    BEGIN
1533      open investor_assigned;
1534      fetch investor_assigned into l_securitized;
1535      close investor_assigned;
1536      x_value := l_securitized;
1537    EXCEPTION
1538      WHEN OTHERS THEN
1539         Okl_Api.SET_MESSAGE( p_app_name     => G_APP_NAME
1540                            ,p_msg_name     => G_UNEXPECTED_ERROR
1541                            ,p_token1       => G_SQLCODE_TOKEN
1542                            ,p_token1_value => SQLCODE
1543                            ,p_token2       => G_SQLERRM_TOKEN
1544                            ,p_token2_value => SQLERRM);
1545   END;
1546 
1547  ---------------------------------------------------------------------------------------
1548   --Start of comments
1549   --
1550   --Procedure Name        : get_total_tax_amount
1551   --Purpose               : Returns the total tax amount for the asset tax lines created due to asset location change
1552   --Modification History  :
1553   --19-May-2005    Rkuttiya  Created
1554   --Notes :
1555   --End of Comments
1556 -------------------------------------------------------------------------------------------
1557 FUNCTION Get_Total_Tax_Amount(p_trx_id IN NUMBER)
1558 RETURN NUMBER
1559 IS
1560   CURSOR c_tax_amount(p_trx_id IN NUMBER) IS
1561   SELECT SUM(tax_amt)
1562   FROM OKL_TAX_TRX_DETAILS
1563   WHERE txs_id = p_trx_id;
1564   l_tax_amount      NUMBER;
1565 BEGIN
1566   OPEN c_tax_amount(p_trx_id);
1567   FETCH c_tax_amount INTO l_tax_amount;
1568   CLOSE c_tax_amount;
1569 
1570   RETURN l_tax_amount;
1571  EXCEPTION
1572 
1573     WHEN OTHERS THEN
1574       -- store SQL error message on message stack for caller
1575       OKC_API.set_message(
1576               G_APP_NAME,
1577               G_UNEXPECTED_ERROR,
1578               G_SQLCODE_TOKEN,
1579               SQLCODE,
1580               G_SQLERRM_TOKEN,
1581               SQLERRM);
1582 
1583 END;
1584 
1585 ---------------------------------------------------------------------------------------
1586   --Start of comments
1587   --
1588   --Procedure Name        : get_total_stream_amount
1589   --Purpose               : Returns the total strm amount at contract or line level
1590   --Modification History  :
1591   --15-SEP-2005    Rkuttiya  Created
1592   --Notes :
1593   --End of Comments
1594 -------------------------------------------------------------------------------------------
1595 FUNCTION Get_Total_Stream_Amount(p_khr_id  IN NUMBER,
1596                                   p_kle_id  IN NUMBER,
1597                                   p_sty_id  IN NUMBER)
1598 RETURN NUMBER
1599 IS
1600   CURSOR c_strm_amount(p_khr_id IN NUMBER,
1601                        p_kle_id IN NUMBER,
1602                        p_sty_id IN NUMBER) IS
1603   SELECT sum(amount) from okl_cs_payment_detail_uv
1604   WHERE khr_id = p_khr_id
1605   AND   sty_id = p_sty_id
1606   AND   nvl(kle_id,-1) = nvl(p_kle_id,-1) ;
1607   l_strm_amount      NUMBER;
1608 BEGIN
1609   OPEN c_strm_amount(p_khr_id,p_kle_id,p_sty_id);
1610   FETCH c_strm_amount INTO l_strm_amount;
1611   CLOSE c_strm_amount;
1612 
1613   RETURN l_strm_amount;
1614  EXCEPTION
1615 
1616     WHEN OTHERS THEN
1617       -- store SQL error message on message stack for caller
1618       OKC_API.set_message(
1619               G_APP_NAME,
1620               G_UNEXPECTED_ERROR,
1621               G_SQLCODE_TOKEN,
1622               SQLCODE,
1623               G_SQLERRM_TOKEN,
1624               SQLERRM);
1625 
1626 END;
1627 
1628 --dkagrawa added the function for bug # 4723838
1629 FUNCTION get_asset_number(p_kle_id IN NUMBER)
1630 RETURN VARCHAR2 IS
1631   CURSOR l_asset_number_csr(cp_kle_id IN NUMBER) IS
1632   SELECT fat.name
1633   FROM okc_k_lines_b fa,
1634        okc_k_lines_tl fat,
1635        okc_line_styles_b stl,
1636        okc_k_lines_b top_cle,
1637        okc_line_styles_b top_stl,
1638        okc_k_lines_b sub_cle,
1639        okc_line_styles_b sub_stl,
1640        okc_k_items   cim
1641   WHERE top_cle.lse_id = top_stl.id
1642   AND top_stl.lty_code in ('SOLD_SERVICE','FEE')
1643   AND top_cle.id = sub_cle.cle_id
1644   AND sub_cle.lse_id = sub_stl.id
1645   AND sub_stl.lty_code in ('LINK_SERV_ASSET','LINK FEE ASSET')
1646   AND cim.cle_id = sub_cle.id
1647   AND CIM.JTOT_OBJECT1_CODE = 'OKX_COVASST'
1648   AND CIM.OBJECT1_ID1  = FA.ID
1649   AND FA.LSE_ID = STL.ID
1650   AND fa.id = fat.id
1651   AND fat.language = USERENV('LANG')
1652   AND STL.LTY_CODE = 'FREE_FORM1'
1653   AND sub_cle.id = cp_kle_id;
1654  l_asset_number  okc_k_lines_tl.name%TYPE;
1655 BEGIN
1656   OPEN l_asset_number_csr(p_kle_id);
1657   FETCH l_asset_number_csr INTO l_asset_number;
1658   CLOSE l_asset_number_csr;
1659   RETURN l_asset_number;
1660 END get_asset_number;
1661 --Bug 4723838 ends
1662 
1663 ---------------------------------------------------------------------------------------
1664   --Start of comments
1665   --
1666   --function Name         : get_ap_line_tax
1667   --Purpose               : Returns the total tax amount for an ap invoice at line level
1668   --Modification History  :
1669   --12-FEB--2007    dkagrawa  Created
1670   --Notes :
1671   --End of Comments
1672 -------------------------------------------------------------------------------------------
1673 FUNCTION get_ap_line_tax(p_invoice_id IN NUMBER, p_line_number IN NUMBER)
1674 RETURN NUMBER IS
1675   CURSOR c_tax_amount IS
1676   SELECT SUM(tax_line.tax_amt) TAX_AMOUNT
1677   FROM ap_invoice_lines_all inv_ln
1678      , zx_lines tax_line
1679      , fnd_application app_ap
1680   WHERE tax_line.application_id = app_ap.application_id
1681   AND app_ap.application_short_name = 'SQLAP'
1682   AND tax_line.entity_code = 'AP_INVOICES'
1683   AND tax_line.event_class_code = 'STANDARD INVOICES'
1684   AND tax_line.trx_id = inv_ln.invoice_id
1685   AND tax_line.trx_level_type = 'LINE'
1686   AND tax_line.trx_line_number = inv_ln.line_number
1687   AND inv_ln.invoice_id = p_invoice_id
1688   AND inv_ln.line_number = p_line_number;
1689   l_tax_amount  NUMBER;
1690 BEGIN
1691   OPEN c_tax_amount;
1692   FETCH c_tax_amount INTO l_tax_amount;
1693   CLOSE c_tax_amount;
1694   RETURN l_tax_amount;
1695 END get_ap_line_tax;
1696 
1697 --asawanka added for ebtax project
1698   ---------------------------------------------------------------------------
1699   -- FUNCTION get_private_label
1700   ---------------------------------------------------------------------------
1701   FUNCTION get_tax_sch_Req_flag(
1702      p_contract_id			IN NUMBER)
1703   RETURN VARCHAR2
1704   IS
1705     l_tax_Sch_req           VARCHAR2(30) := 'N';
1706     CURSOR get_taxsch_rule_csr IS
1707     select rule_information5
1708     from okc_rules_b
1709     where dnz_chr_id = p_contract_id
1710     and rule_information_category = 'LASTPR';
1711   BEGIN
1712     OPEN get_taxsch_rule_csr;
1713     FETCH get_taxsch_rule_csr INTO l_tax_Sch_req;
1714     CLOSE get_taxsch_rule_csr;
1715      RETURN l_tax_Sch_req;
1716 
1717   END get_tax_sch_Req_flag;
1718 
1719 
1720 ---------------------------------------------------------------------------------------
1721   --Start of comments
1722   --
1723   --Procedure Name        : get_cov_asset_id
1724   --Purpose               : Returns the asset_id of the asset associated to a service line,
1725   --                        created to fix bug#5759229
1726   --Modification History  :
1727   --27-AUG-2007    Zrehman  Created
1728   --Notes :
1729   --End of Comments
1730 -------------------------------------------------------------------------------------------
1731 
1732 FUNCTION get_cov_asset_id(p_kle_id IN NUMBER)
1733    RETURN NUMBER IS
1734    CURSOR l_asset_id_csr(cp_kle_id IN NUMBER) IS
1735    SELECT  cim1.object1_id1
1736    FROM okc_k_lines_b cle,
1737         okc_k_lines_b cle1,  /* to get all line types associated with free form 1 in that FIXED_ASSET */
1738         okc_k_items cim,   /* to get the one having covered asset */
1739         okc_k_lines_b cle2, /* After getting the one having the covered asset take the id of the service line */
1740         okc_line_styles_b lse, /* to get free_form 1 */
1741         okc_line_styles_b lse1, /* to get FIXED_ASSET lty_code */
1742         okc_line_styles_b lse2, /* to get LINK_SERV_ASSET lty_code */
1743         okc_k_items cim1 /* to take the actual asset id */
1744    WHERE  lse.id = cle.lse_id
1745    AND lse1.id = cle1.lse_id
1746    AND lse1.lty_code = 'FIXED_ASSET'
1747    AND cle.id = cle1.cle_id
1748    AND lse.lty_code = 'FREE_FORM1'
1749    AND cle1.cle_id = cim.object1_id1
1750    AND cim.jtot_object1_code = 'OKX_COVASST'
1751    AND cim.cle_id = cle2.id
1752    AND lse2.id = cle2.lse_id
1753    AND cle1.id = cim1.cle_id
1754    AND cim1.jtot_object1_code = 'OKX_ASSET'
1755    AND cle2.id = cp_kle_id;
1756    /*
1757      For clarity in the query result, select the following in the above SELECT statement to see
1758      the asset_id of the asset associated to a service line, the line id of the associated asset line and
1759      the service id to which the asset is associated.
1760      Also the corresponding lty_code is selected to verify the result set of the query.
1761 
1762       SELECT  cim1.object1_id1 "Asset ID",
1763            cle1.id "FIXED ASSET LINE ID", lse1.lty_code "lty code of fixed asset line",
1764            cle2.id "SERVICE LINE ID", lse2.lty_code "lty code of service line"
1765 
1766      Note: The input for the above query would be the id of the service line.
1767    */
1768 
1769    l_asset_id  okc_k_items.object1_id1%TYPE;
1770 
1771    BEGIN
1772 
1773       OPEN l_asset_id_csr(p_kle_id);
1774       FETCH l_asset_id_csr INTO l_asset_id;
1775       CLOSE l_asset_id_csr;
1776 
1777       RETURN l_asset_id;
1778 
1779    END get_cov_asset_id;
1780 
1781   ---------------------------------------------------------------------------------------
1782   --Start of comments
1783   --
1784   --Procedure Name        : get_payment_remaining
1785   --Purpose               : Returns the No of payment remaining for given contract
1786   --                        created to enhance usability in sprint 7
1787   --Modification History  :
1788   --28-JAN-2008    dkagrawa  Created
1789   --Notes :
1790   --End of Comments
1791   -------------------------------------------------------------------------------------------
1792   FUNCTION get_payment_remaining(p_khr_id  IN NUMBER) RETURN VARCHAR2
1793   IS
1794     CURSOR c_get_unbilled_payment(p_contract_id IN NUMBER,p_cle_id IN NUMBER)
1795     IS
1796     SELECT COUNT(1) payment_remaining
1797     FROM   OKL_STRM_TYPE_v STYT,
1798            okl_strm_elements sele,
1799            okl_streams str
1800     WHERE  sele.stm_id = str.id
1801     AND str.sty_id = styt.id
1802     AND str.say_code = 'CURR'
1803     AND STR.ACTIVE_YN = 'Y'
1804     AND STR.PURPOSE_CODE IS NULL
1805     AND SELE.DATE_BILLED IS NULL
1806     AND styt.billable_yn     = 'Y'
1807     AND styt.stream_type_purpose IN ('RENT','PRINCIPAL_PAYMENT','LOAN_PAYMENT')
1808     AND str.khr_id =  p_contract_id
1809     AND str.kle_id = p_cle_id;
1810 
1811     CURSOR c_get_payment_details(p_contract_id IN NUMBER) IS
1812     SELECT rgp_lalevl.cle_id,
1813        RUL_LASLL.RULE_INFORMATION5 STRUCTURE_CODE,
1814        RUL_LASLL.OBJECT1_ID1 FREQUENCY_CODE,
1815        NVL(RUL_LASLL.RULE_INFORMATION10,'N') ARREARS_YN,
1816        FND_DATE.canonical_to_date(rul_lasll.rule_information2) start_date,
1817        rul_lasll.rule_information7 stub_days,
1818        rul_lasll.rule_information3 periods
1819 FROM   OKC_RULE_GROUPS_B RGP_LALEVL,
1820        OKC_RULES_B RUL_LASLH,
1821        OKC_RULES_B RUL_LASLL,
1822        OKL_STRM_TYPE_v STYT
1823 WHERE  RGP_LALEVL.RGD_CODE = 'LALEVL'
1824        AND RUL_LASLH.RGP_ID = RGP_LALEVL.ID
1825        AND RUL_LASLH.RULE_INFORMATION_CATEGORY = 'LASLH'
1826        AND RUL_LASLH.DNZ_CHR_ID = RGP_LALEVL.DNZ_CHR_ID
1827        AND STYT.ID = RUL_LASLH.OBJECT1_ID1
1828        AND RUL_LASLL.RULE_INFORMATION_CATEGORY = 'LASLL'
1829        AND RUL_LASLL.RGP_ID = RUL_LASLH.RGP_ID
1830        AND RUL_LASLL.DNZ_CHR_ID = RUL_LASLH.DNZ_CHR_ID
1831        AND RUL_LASLL.OBJECT2_ID1 = RUL_LASLH.ID
1832        AND NVL(RUL_LASLL.OBJECT2_ID2,'#') = '#'
1833        AND RUL_LASLL.JTOT_OBJECT2_CODE = 'OKL_STRMHDR'
1834        AND styt.stream_type_purpose IN ('RENT','PRINCIPAL_PAYMENT','LOAN_PAYMENT')
1835        AND RGP_LALEVL.DNZ_CHR_ID  = p_contract_id;
1836 
1837     l_diff BOOLEAN := FALSE;
1838     l_in NUMBER :=1;
1839     l_unbillled_remaining  NUMBER;
1840     l_structure_code VARCHAR2(30);
1841     l_frequency_code VARCHAR2(30);
1842     l_arrears VARCHAR2(30);
1843     l_start_date DATE;
1844     l_stub_days  NUMBER;
1845     l_periods NUMBER;
1846     l_cle_id NUMBER;
1847   BEGIN
1848 
1849     FOR rec IN c_get_payment_details(p_khr_id) LOOP
1850       l_cle_id := rec.cle_id;
1851       IF l_in = 1 THEN
1852         l_structure_code := rec.STRUCTURE_CODE;
1853         l_frequency_code := rec.frequency_code;
1854         l_arrears := rec.arrears_yn;
1855         l_start_date := rec.START_DATE;
1856         l_stub_days := rec.stub_days;
1857         l_periods := rec.periods;
1858        ELSE
1859         IF   l_structure_code <> rec.STRUCTURE_CODE OR
1860         l_frequency_code <> rec.frequency_code OR
1861         l_arrears <> rec.arrears_yn OR
1862         l_start_date <> rec.START_DATE OR
1863         l_stub_days <> rec.stub_days OR
1864         l_periods <> rec.periods THEN
1865           l_diff := TRUE;
1866           EXIT;
1867         END IF;
1868        END IF;
1869     END LOOP;
1870     IF l_diff THEN
1871       RETURN 'Multiple';
1872     ELSE
1873       OPEN c_get_unbilled_payment(p_khr_id,l_cle_id);
1874       FETCH c_get_unbilled_payment INTO l_unbillled_remaining;
1875       CLOSE c_get_unbilled_payment;
1876 
1877       RETURN to_char(l_unbillled_remaining);
1878     END IF;
1879   END;
1880 
1881    ---------------------------------------------------------------------------------------
1882   --Start of comments
1883   --
1884   --Procedure Name        : get_term_remaining
1885   --Purpose               : Returns the No terms remaining for given contract
1886   --                        created to enhance usability in sprint 7
1887   --Modification History  :
1888   --28-JAN-2008    dkagrawa  Created
1889   --Notes :
1890   --End of Comments
1891   -------------------------------------------------------------------------------------------
1892 
1893   FUNCTION get_term_remaining(p_khr_id  IN NUMBER) RETURN NUMBER
1894   IS
1895     CURSOR c_get_terms_rem (p_contract_id IN NUMBER)
1896     IS
1897     SELECT okhr.term_duration-DECODE(sign(sysdate-khr.start_date),-1,0,DECODE(sign(sysdate-khr.end_date),1,okhr.term_duration,TRUNC(MONTHS_BETWEEN(sysdate,khr.start_date))))
1898            payment_remaining
1899     FROM okl_k_headers okhr ,
1900          okc_k_headers_v khr
1901     WHERE okhr.id = khr.id
1902     AND khr.id = p_contract_id;
1903 
1904     l_terms_remaining NUMBER;
1905    BEGIN
1906      OPEN c_get_terms_rem(p_khr_id);
1907      FETCH c_get_terms_rem INTO l_terms_remaining;
1908      CLOSE c_get_terms_rem;
1909      RETURN l_terms_remaining;
1910    END;
1911 
1912   FUNCTION get_total_billed(p_khr_id  IN NUMBER) RETURN NUMBER IS
1913     CURSOR c_get_billed(cp_khr_id IN NUMBER) IS
1914     SELECT SUM(amount_original+amount_adjusted)
1915     FROM okl_cs_bpd_inv_dtl_v
1916     WHERE amount_remaining > 0
1917     AND chr_id = cp_khr_id;
1918 
1919 /*    CURSOR c_get_total_adjusted(cp_khr_id IN NUMBER) IS
1920     SELECT SUM(NVL(APS.AMOUNT_ADJUSTED,0)) AMOUNT_ADJUSTED
1921     FROM   AR_PAYMENT_SCHEDULES_ALL APS,
1922            RA_CUSTOMER_TRX_ALL RACTRX,
1923            RA_CUSTOMER_TRX_LINES_ALL RACTRX_LINE,
1924            OKC_K_HEADERS_B OKC
1925     WHERE  RACTRX.CUSTOMER_TRX_ID = APS.CUSTOMER_TRX_ID
1926     AND    RACTRX.CUSTOMER_TRX_ID = RACTRX_LINE.CUSTOMER_TRX_ID
1927     AND    OKC.CONTRACT_NUMBER = RACTRX_LINE.INTERFACE_LINE_ATTRIBUTE6
1928     AND    OKC.ID = cp_khr_id;
1929 */
1930  -- l_total_adjusted    NUMBER;
1931     l_billed            NUMBER;
1932   BEGIN
1933 
1934    OPEN c_get_billed(p_khr_id);
1935    FETCH c_get_billed INTO l_billed;
1936    CLOSE c_get_billed;
1937 
1938 /* OPEN c_get_total_adjusted(p_khr_id);
1939    FETCH c_get_total_adjusted INTO l_total_adjusted;
1940    CLOSE c_get_total_adjusted;
1941 */
1942 -- RETURN NVL(l_billed,0) + NVL(l_total_adjusted,0);
1943    RETURN NVL(l_billed,0);
1944   END get_total_billed;
1945 
1946   FUNCTION get_total_paid_credited(p_khr_id  IN NUMBER) RETURN NUMBER IS
1947     CURSOR c_get_paid_credited(cp_khr_id IN NUMBER) IS
1948     SELECT SUM(amount_applied) + SUM(amount_credited)
1949     FROM okl_cs_bpd_inv_dtl_v
1950     WHERE amount_remaining > 0
1951     AND chr_id = cp_khr_id;
1952     l_paid_credited NUMBER;
1953   BEGIN
1954 
1955    OPEN c_get_paid_credited(p_khr_id);
1956    FETCH c_get_paid_credited INTO l_paid_credited;
1957    CLOSE c_get_paid_credited;
1958 
1959    RETURN NVL(l_paid_credited,0);
1960   END get_total_paid_credited;
1961 
1962   FUNCTION get_total_remaining(p_khr_id  IN NUMBER) RETURN NUMBER IS
1963     CURSOR c_get_remaining(cp_khr_id IN NUMBER) IS
1964     SELECT SUM(amount_remaining)
1965     FROM okl_cs_bpd_inv_dtl_v
1966     WHERE amount_remaining > 0
1967     AND chr_id = cp_khr_id;
1968     l_remaining NUMBER;
1969   BEGIN
1970 
1971    OPEN c_get_remaining(p_khr_id);
1972    FETCH c_get_remaining INTO l_remaining;
1973    CLOSE c_get_remaining;
1974 
1975    RETURN NVL(l_remaining,0);
1976   END get_total_remaining;
1977 END Okl_Cs_Lc_Contract_Pvt;