DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKL_VARIABLE_INTEREST_PVT

Source


1 PACKAGE BODY OKL_VARIABLE_INTEREST_PVT AS
2 /* $Header: OKLRVARB.pls 120.110.12020000.14 2012/11/23 14:41:06 rpillay ship $ */
3 
4     G_DEBUG           CONSTANT VARCHAR2(10) := OKL_DEBUG_PUB.CHECK_LOG_ENABLED;
5     G_INIT_NUMBER     CONSTANT  NUMBER := -9999;
6     G_API_TYPE        CONSTANT  VARCHAR2(4) := '_PVT';
7     G_REQUIRED_VALUE  CONSTANT  VARCHAR2(200) := OKL_API.G_REQUIRED_VALUE;
8     G_COL_NAME_TOKEN  CONSTANT  VARCHAR2(200) := OKL_API.G_COL_NAME_TOKEN;
9 	--G_FIN_LINE_LTY_ID CONSTANT  NUMBER := 33;
10     rule_failed       EXCEPTION;
11 
12     --Bug# 14799218
13     G_MODULE_NAME                CONSTANT VARCHAR2(500) := 'okl.var.plsql.okl_variable_interest_pvt';
14 
15     TYPE vrc_rec_type IS RECORD (
16        CONTRACT_NUMBER                  OKL_K_HEADERS_FULL_V.CONTRACT_NUMBER%TYPE
17       ,CONTRACT_ID                      OKL_K_HEADERS_FULL_V.ID%TYPE
18       ,START_DATE                       OKL_K_HEADERS_FULL_V.START_DATE%TYPE
19       ,END_DATE                         OKL_K_HEADERS_FULL_V.END_DATE%TYPE
20       ,INTEREST_CALCULATION_BASIS       OKL_PRODUCT_PARAMETERS_V.INTEREST_CALCULATION_BASIS%TYPE
21       ,DAYS_IN_A_MONTH_CODE             OKL_K_RATE_PARAMS.DAYS_IN_A_MONTH_CODE%TYPE
22       ,DAYS_IN_A_YEAR_CODE              OKL_K_RATE_PARAMS.DAYS_IN_A_YEAR_CODE%TYPE
23       ,RATE_CHANGE_VALUE                OKL_K_RATE_PARAMS.RATE_CHANGE_VALUE%TYPE
24       ,PROCESS_STATUS                   VARCHAR2(1));
25 
26     TYPE vrc_tbl_type IS TABLE OF vrc_rec_type INDEX BY BINARY_INTEGER;
27 
28     g_to_date                     DATE;
29     g_no_of_contracts_processed   NUMBER;
30     g_no_of_rejected_contracts    NUMBER;
31     g_no_of_successful_contracts  NUMBER;
32 
33 
34 --Bug# 7277007
35 TYPE rpt_summary_rec_type IS RECORD (
36   total_contract_num_success   NUMBER
37  ,total_contract_num_error     NUMBER);
38 
39 TYPE rpt_summary_tbl_type IS TABLE OF rpt_summary_rec_type INDEX BY VARCHAR2(30);
40 g_rpt_summary_tbl         rpt_summary_tbl_type;
41 
42 TYPE error_msg_tbl_type is TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
43 
44 TYPE rpt_error_rec_type IS RECORD (
45   contract_number             okc_k_headers_b.contract_number%TYPE
46  ,product_name                okl_products.name%TYPE
47  ,interest_calc_basis         fnd_lookup_values.lookup_code%TYPE
48  ,last_int_calc_date          DATE
49  ,error_msg_tbl               error_msg_tbl_type);
50 
51 TYPE rpt_error_tbl_type IS TABLE OF rpt_error_rec_type INDEX BY BINARY_INTEGER;
52 g_rpt_error_tbl         rpt_error_tbl_type;
53 g_rpt_error_tbl_counter BINARY_INTEGER := 0;
54 
55 TYPE rpt_success_rec_type IS RECORD (
56    contract_id                okc_k_headers_b.id%TYPE
57   ,contract_number            okc_k_headers_b.contract_number%TYPE
58   ,days_in_a_month_code       okl_k_rate_params.days_in_a_month_code%TYPE
59   ,days_in_a_year_code        okl_k_rate_params.days_in_a_year_code%TYPE);
60 
61 TYPE rpt_success_tbl_type IS TABLE OF rpt_success_rec_type INDEX BY BINARY_INTEGER;
62 
63 TYPE rpt_success_icb_tbl_type IS TABLE OF rpt_success_tbl_type INDEX BY VARCHAR2(30);
64 
65 g_rpt_success_icb_tbl         rpt_success_icb_tbl_type;
66 --Bug# 7277007
67 
68 --Bug# 13447258: Changes to store catchup calculated values in okl_var_int_params_all
69 --Bug# 12974796
70 /*TYPE rpt_catchup_rec_type IS RECORD (
71   catchup_amount          NUMBER
72  ,catchup_settlement_type VARCHAR2(30)
73  ,vir_id                  NUMBER);
74 
75 TYPE rpt_catchup_tbl_type IS TABLE OF rpt_catchup_rec_type INDEX BY BINARY_INTEGER;
76 
77 TYPE rpt_chr_catchup_tbl_type IS TABLE OF rpt_catchup_tbl_type INDEX BY VARCHAR2(120);
78 
79 g_rpt_chr_catchup_tbl         rpt_chr_catchup_tbl_type;*/
80 --Bug# 12974796
81 
82   ------------------------------------------------------------------------------
83   -- PROCEDURE print_line
84   --
85   --  This procedure prints message
86   --
87   -- Calls:
88   -- Called By:
89   ------------------------------------------------------------------------------
90 
91 PROCEDURE print_line (p_message IN VARCHAR2) IS
92 BEGIN
93   FND_FILE.PUT_LINE (FND_FILE.OUTPUT, p_message);
94 EXCEPTION
95   WHEN OTHERS THEN
96     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '** EXCEPTION IN print_line: '||SQLERRM);
97 END print_line;
98 
99   ------------------------------------------------------------------------------
100   -- PROCEDURE print
101   --
102   --  This procedure prints message
103   --
104   -- Calls:
105   -- Called By:
106   ------------------------------------------------------------------------------
107 /* Included this procedure to avoid GSCC error file.sql.26 */
108 PROCEDURE print(p_message IN VARCHAR2) IS
109 BEGIN
110   FND_FILE.PUT(FND_FILE.OUTPUT, p_message);
111 EXCEPTION
112   WHEN OTHERS THEN
113     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '** EXCEPTION IN print_line: '||SQLERRM);
114 END print;
115 
116   ------------------------------------------------------------------------------
117   -- PROCEDURE print_debug
118   --
119   --  This procedure prints message
120   --
121   -- Calls:
122   -- Called By:
123   ------------------------------------------------------------------------------
124 
125 PROCEDURE print_debug (p_message IN VARCHAR2) IS
126 BEGIN
127   --Bug# 14799218: Perform logging only when FND: Debug Log Enabled
128   -- profile is turned on
129   IF ( G_DEBUG = 'Y' ) THEN
130 --    FND_FILE.PUT_LINE (FND_FILE.LOG, p_message);
131 --    OKL_DEBUG_PUB.logmessage(p_message, 25);
132 --    dbms_output.put_line(p_message);
133 
134       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE_NAME, p_message);
135   END IF;
136 EXCEPTION
137   WHEN OTHERS THEN
138     FND_FILE.PUT_LINE (FND_FILE.LOG, '** EXCEPTION IN print_line: '||SQLERRM);
139 END print_debug;
140 
141   ------------------------------------------------------------------------------
142   -- PROCEDURE print_error_message
143   --
144   --  This procedure prints error message in the request log file
145   --
146   -- Calls:
147   -- Called By:
148   ------------------------------------------------------------------------------
149 
150 PROCEDURE print_error_message (p_message IN VARCHAR2) IS
151 BEGIN
152     FND_FILE.PUT_LINE (FND_FILE.LOG, p_message);
153 EXCEPTION
154   WHEN OTHERS THEN
155     FND_FILE.PUT_LINE (FND_FILE.LOG, '** EXCEPTION IN print_line: '||SQLERRM);
156 END print_error_message;
157 
158   ------------------------------------------------------------------------------
159   -- PROCEDURE report_error
160   --
161   --  This procedure prints error messages
162   --
163   -- Calls:
164   -- Called By:
165   ------------------------------------------------------------------------------
166 
167   PROCEDURE Report_Error(p_contract_number     IN VARCHAR2,
168                          p_product_name        IN VARCHAR2,
169                          p_interest_calc_basis IN VARCHAR2,
170                          p_last_int_calc_date  IN DATE,
171                          x_msg_count OUT NOCOPY NUMBER,
172                          x_msg_data  OUT NOCOPY VARCHAR2
173                         ) IS
174 
175   x_msg_index_out NUMBER;
176   x_msg_out       VARCHAR2(2000);
177 
178   BEGIN
179 
180     okl_api.end_activity(
181                          X_msg_count => x_msg_count,
182                          X_msg_data  => x_msg_data
183                         );
184 
185      --Bug# 7277007
186      IF g_rpt_summary_tbl.EXISTS(p_interest_calc_basis)
187      THEN
188        g_rpt_summary_tbl(p_interest_calc_basis).total_contract_num_error :=
189          NVL(g_rpt_summary_tbl(p_interest_calc_basis).total_contract_num_error,0) + 1;
190      ELSE
191        g_rpt_summary_tbl(p_interest_calc_basis).total_contract_num_error := 1;
192      END IF;
193 
194     g_rpt_error_tbl_counter := g_rpt_error_tbl_counter + 1;
195     g_rpt_error_tbl(g_rpt_error_tbl_counter).contract_number      := p_contract_number;
196     g_rpt_error_tbl(g_rpt_error_tbl_counter).product_name         := p_product_name;
197     g_rpt_error_tbl(g_rpt_error_tbl_counter).interest_calc_basis  := p_interest_calc_basis;
198     g_rpt_error_tbl(g_rpt_error_tbl_counter).last_int_calc_date   := p_last_int_calc_date;
199     --Bug# 7277007
200 
201     FOR i in 1..x_msg_count
202     LOOP
203       FND_MSG_PUB.GET(
204                       p_msg_index     => i,
205                       p_encoded       => FND_API.G_FALSE,
206                       p_data          => x_msg_data,
207                       p_msg_index_out => x_msg_index_out
208                      );
209 
210       --Bug# 7277007
211       g_rpt_error_tbl(g_rpt_error_tbl_counter).error_msg_tbl(i) := SUBSTR(x_msg_data,1,2000);
212       print_debug('Error '||to_char(i)||': '||x_msg_data);
213 
214     END LOOP;
215     return;
216   EXCEPTION
217     WHEN OTHERS THEN
218       NULL;
219   END Report_Error;
220 ------------------------------------------------------------------------------
221     -- Start of Comments
222     -- Created By:       Ramesh Seela
223     -- Procedure Name    initialize_contract_params
224     -- Description:      This procedure initializes the package variables
225     -- Dependencies:
226     -- Parameters:
227     -- Version:          1.0
228     -- End of Comments
229 
230   ------------------------------------------------------------------------------
231   PROCEDURE initialize_contract_params (
232             p_api_version        IN  NUMBER,
233             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
234             x_return_status      OUT NOCOPY VARCHAR2,
235             x_msg_count          OUT NOCOPY NUMBER,
236             x_msg_data           OUT NOCOPY VARCHAR2,
237             p_contract_id        IN  NUMBER)   IS
238 
239   l_api_name                   CONSTANT    VARCHAR2(30) := 'INITIALIZE_CONTRACT_PARAMS';
240   l_api_version                CONSTANT    NUMBER       := 1.0;
241   init_ctr_params_failed       EXCEPTION;
242   l_interest_calculation_basis OKL_PRODUCT_PARAMETERS_V.interest_calculation_basis%TYPE;
243 
244 
245   Cursor contract_csr (p_contract_id NUMBER) IS
246       SELECT id,
247 	         deal_type,
248              start_date,
249              end_date,
250              currency_code,
251              pdt_id,
252              authoring_org_id
253       FROM   okl_k_headers_full_v
254       WHERE  id = p_contract_id;
255 
256   Cursor interest_params_csr (p_contract_id NUMBER) IS
257       SELECT interest_basis_code,
258              calculation_formula_id,
259              nvl(principal_basis_code, 'ACTUAL') principal_basis_code,
260              days_in_a_month_code,
261              days_in_a_year_code,
262              catchup_settlement_code
263       FROM   okl_k_rate_params
264       WHERE  khr_id = p_contract_id
265       AND    SYSDATE BETWEEN effective_from_date and nvl(effective_to_date, SYSDATE);
266 
267   Cursor product_params_csr (p_product_id NUMBER) IS
268       SELECT ppm.revenue_recognition_method,
269              ppm.interest_calculation_basis
270       FROM   okl_product_parameters_v ppm
271        WHERE ppm.id = p_product_id;
272 
273   BEGIN
274     x_return_status     := OKL_API.G_RET_STS_SUCCESS;
275 
276     print_debug('Executing procedure INITIALIZE_CONTRACT_PARAMS using following parameters : ');
277     print_debug(' p_contract_id : '|| p_contract_id );
278 
279     IF (G_CONTRACT_ID IS NULL OR G_CONTRACT_ID <> p_contract_id) THEN
280       OPEN contract_csr (p_contract_id);
281       FETCH contract_csr INTO G_CONTRACT_ID, G_DEAL_TYPE, G_CONTRACT_START_DATE, G_CONTRACT_END_DATE,
282 	                          G_CURRENCY_CODE, G_PRODUCT_ID, G_AUTHORING_ORG_ID;
283       IF (contract_csr%NOTFOUND) THEN
284         CLOSE contract_csr;
285         print_error_message('Contract cursor did not return records for contract ID :' || p_contract_id);
286         RAISE init_ctr_params_failed;
287       END IF;
288       CLOSE contract_csr;
289 
290       -- Fix for bug 6760186
291       OPEN product_params_csr (G_PRODUCT_ID);
292       FETCH product_params_csr INTO G_REVENUE_RECOGNITION_METHOD, l_interest_calculation_basis;
293       IF (product_params_csr%NOTFOUND) THEN
294         CLOSE product_params_csr;
295         print_error_message('Product Params cursor did not return records for product ID :' || G_PRODUCT_ID);
296         RAISE init_ctr_params_failed;
297       END IF;
298       CLOSE product_params_csr;
299 
300       OPEN interest_params_csr (p_contract_id);
301       FETCH interest_params_csr INTO G_INTEREST_BASIS_CODE, G_CALCULATION_FORMULA_ID, G_PRINCIPAL_BASIS_CODE,
302 	                          G_DAYS_IN_A_MONTH_CODE, G_DAYS_IN_A_YEAR_CODE, G_CATCHUP_SETTLEMENT_CODE;
303       IF (interest_params_csr%NOTFOUND) THEN
304         CLOSE interest_params_csr;
305         print_error_message('Interest Params cursor did not return records for contract ID :' || p_contract_id);
306         RAISE init_ctr_params_failed;
307       END IF;
308       CLOSE interest_params_csr;
309 
310       /* Moved this code before querying interest rate parameters --6760186 */
311       /*OPEN product_params_csr (G_PRODUCT_ID);
312       FETCH product_params_csr INTO G_REVENUE_RECOGNITION_METHOD, l_interest_calculation_basis;
313       IF (product_params_csr%NOTFOUND) THEN
314         CLOSE product_params_csr;
315         print_error_message('Product Params cursor did not return records for product ID :' || G_PRODUCT_ID);
316         RAISE init_ctr_params_failed;
317       END IF;
318       CLOSE product_params_csr;      */
319       -- 5047041
320       -- These changes are required to meet the requirements of code in procedure Interest_Date_Range
321       IF (G_INTEREST_CALCULATION_BASIS IS NULL OR G_INTEREST_CALCULATION_BASIS <> 'DAILY_INTEREST') THEN
322         G_INTEREST_CALCULATION_BASIS := l_interest_calculation_basis;
323       END IF;
324 
325       IF (l_interest_calculation_basis = 'FIXED' AND
326         G_REVENUE_RECOGNITION_METHOD = 'ACTUAL') THEN
327         G_INTEREST_CALCULATION_BASIS := 'DAILY_INTEREST';
328       END IF;
329       -- These changes are required to meet the requirements of code in procedure Interest_Date_Range
330     END IF;
331 
332 
333 
334         print_debug('Contract ID: '|| G_CONTRACT_ID);
335         print_debug('Authoring Org ID: '|| G_AUTHORING_ORG_ID);
336         print_debug('Product ID: '|| G_PRODUCT_ID);
337   	    print_debug('deal type :'|| G_DEAL_TYPE );
338 	    print_debug('Contract Start Date: '||G_CONTRACT_START_DATE);
339 	    print_debug('Contract End Date: '||G_CONTRACT_END_DATE);
340 	    print_debug('Currency code: '||G_CURRENCY_CODE);
341 	    print_debug('calculation basis : '|| G_INTEREST_CALCULATION_BASIS );
342 	    print_debug('revenue recognition method : '|| G_REVENUE_RECOGNITION_METHOD);
343 	    print_debug('Principal Balance : '|| G_CONTRACT_PRINCIPAL_BALANCE);
344 	    print_debug('Interest basis : '|| G_INTEREST_BASIS_CODE );
345 	    print_debug('Calculation Formula ID : '|| G_CALCULATION_FORMULA_ID);
346 	    print_debug('Principal Basis : '|| G_PRINCIPAL_BASIS_CODE);
347 	    print_debug('Days in a Month : '|| G_DAYS_IN_A_MONTH_CODE);
348 	    print_debug('Days in a Year  : '|| G_DAYS_IN_A_YEAR_CODE);
349 	    print_debug('Catchup Settlement Code  : '|| G_CATCHUP_SETTLEMENT_CODE);
350 
351 	    print_debug ('Exiting initialize_contract_params');
352 
353   EXCEPTION
354      WHEN init_ctr_params_failed THEN
355        print_error_message('init_ctr_params_failed Exception raised in procedure INITIALIZE_CONTRACT_PARAMS');
356        x_return_status := OKL_API.G_RET_STS_ERROR;
357 
358      WHEN OTHERS THEN
359        print_error_message('Exception raised in procedure INITIALIZE_CONTRACT_PARAMS');
360        Okl_Api.SET_MESSAGE(
361                p_app_name     => G_APP_NAME,
362                p_msg_name     => G_UNEXPECTED_ERROR,
363                p_token1       => G_SQLCODE_TOKEN,
364                p_token1_value => SQLCODE,
365                p_token2       => G_SQLERRM_TOKEN,
366                p_token2_value => SQLERRM);
367 
368        x_return_status := OKL_API.G_RET_STS_ERROR;
369 
370   END initialize_contract_params;
371 
372 ------------------------------------------------------------------------------
373     -- Start of Comments
374     -- Created By:       Ramesh Seela
375     -- Procedure Name    Get_contract_financed_amount
376     -- Description:      The function derives the financed amount at Header Level
377     -- Dependencies:
378     -- Parameters:
379     -- Version:          1.0
380     -- End of Comments
381 
382   ------------------------------------------------------------------------------
383   PROCEDURE get_contract_financed_amount (
384             p_api_version        IN  NUMBER,
385             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
386             x_return_status      OUT NOCOPY VARCHAR2,
387             x_msg_count          OUT NOCOPY NUMBER,
388             x_msg_data           OUT NOCOPY VARCHAR2,
389             p_contract_id        IN  NUMBER,
390 			x_principal_balance  OUT NOCOPY NUMBER) IS
391 
392   l_api_name               CONSTANT    VARCHAR2(30) := 'GET_CONTRACT_FINANCED_AMOUNT';
393   l_api_version            CONSTANT    NUMBER       := 1.0;
394   get_ctr_fin_amt_failed   EXCEPTION;
395 
396 
397   BEGIN
398     x_return_status     := OKL_API.G_RET_STS_SUCCESS;
399 
400     print_debug('Executing procedure GET_CONTRACT_FINANCED_AMOUNT using following parameters : ');
401     print_debug(' p_contract_id : '|| p_contract_id );
402     print_debug(' G_CONTRACT_ID : '|| G_CONTRACT_ID );
403     print_debug(' G_CONTRACT_PRINCIPAL_BALANCE : '|| G_CONTRACT_PRINCIPAL_BALANCE );
404 
405 
406     IF (G_CONTRACT_ID IS NULL OR
407         G_CONTRACT_PRINCIPAL_BALANCE IS NULL OR
408 	    G_CONTRACT_ID <> p_contract_id
409 	   ) THEN
410 
411       --Changed the formula to CONTRACT_CAP_AMNT_LOAN by bkatraga for bug 13031080
412       --Bug# 13809156: Changed Formula to CONTRACT_CAP_AMNT_PRICE to reduce
413       --               capitalized downpayment when computing contract cap amount
414       -- Derive Principal Balance
415       Okl_Execute_Formula_Pub.EXECUTE(p_api_version          => 1.0,
416                                       p_init_msg_list        => OKL_API.G_FALSE,
417                                       x_return_status        => x_return_status,
418                                       x_msg_count            => x_msg_count,
419                                       x_msg_data             => x_msg_data,
420                                       p_formula_name         => 'CONTRACT_CAP_AMNT_PRICE',
421                                       p_contract_id          => p_contract_id,
422                                       p_line_id              => NULL,
423                                       p_additional_parameters => Okl_Execute_Formula_Pub.g_additional_parameters, -- vsgandhi Bug 13106699
424                                       x_value               =>  x_principal_balance
425                                      );
426 
427       IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
428 	     print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE completed successfully');
429       ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
430   	     print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned unexpected error');
431   	     print_error_message ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned unexpected error');
432          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
433       ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
434 	     print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned exception');
435 	     print_error_message ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned exception');
436          RAISE get_ctr_fin_amt_failed;
437       END IF;
438 
439 	  G_CONTRACT_ID := p_contract_id;
440 	  G_CONTRACT_PRINCIPAL_BALANCE := x_principal_balance;
441 
442 	ELSE
443       x_principal_balance := G_CONTRACT_PRINCIPAL_BALANCE;
444 	END IF;
445 
446     print_debug('Contract Financed Amount : '|| x_principal_balance);
447 
448 
449   EXCEPTION
450      WHEN get_ctr_fin_amt_failed THEN
451        print_error_message('get_ctr_fin_amt_failed Exception raised in procedure GET_CONTRACT_FINANCED_AMOUNT');
452        x_return_status := OKL_API.G_RET_STS_ERROR;
453 
454      WHEN OTHERS THEN
455        print_error_message('Exception raised in procedure GET_CONTRACT_FINANCED_AMOUNT');
456        Okl_Api.SET_MESSAGE(
457                p_app_name     => G_APP_NAME,
458                p_msg_name     => G_UNEXPECTED_ERROR,
459                p_token1       => G_SQLCODE_TOKEN,
460                p_token1_value => SQLCODE,
461                p_token2       => G_SQLERRM_TOKEN,
462                p_token2_value => SQLERRM);
463 
464        x_return_status := OKL_API.G_RET_STS_ERROR;
465 
466   END get_contract_financed_amount;
467 
468 ------------------------------------------------------------------------------
469     -- Start of Comments
470     -- Created By:       Ramesh Seela
471     -- Procedure Name    Get_Line_financed_amount
472     -- Description:      The function derives the financed amount at Header Level
473     -- Dependencies:
474     -- Parameters:
475     -- Version:          1.0
476     -- End of Comments
477 
478   ------------------------------------------------------------------------------
479   PROCEDURE get_asset_financed_amount (
480             p_api_version        IN  NUMBER,
481             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
482             x_return_status      OUT NOCOPY VARCHAR2,
483             x_msg_count          OUT NOCOPY NUMBER,
484             x_msg_data           OUT NOCOPY VARCHAR2,
485             p_contract_id        IN  NUMBER,
486             p_line_id            IN  NUMBER,
487 			x_principal_balance  OUT NOCOPY NUMBER) IS
488 
489   l_api_name               CONSTANT    VARCHAR2(30) := 'GET_ASSET_FINANCED_AMOUNT';
490   l_api_version            CONSTANT    NUMBER       := 1.0;
491   get_asset_fin_amt_failed   EXCEPTION;
492 
493 
494   BEGIN
495     x_return_status     := OKL_API.G_RET_STS_SUCCESS;
496 
497     print_debug('Executing procedure GET_ASSET_FINANCED_AMOUNT using following parameters : ');
498     print_debug(' p_contract_id : '|| p_contract_id );
499     print_debug(' p_line_id : '|| p_line_id );
500     print_debug(' G_CONTRACT_ID : '|| G_CONTRACT_ID );
501     print_debug(' G_FIN_AST_LINE_ID : '|| G_FIN_AST_LINE_ID);
502     print_debug(' G_ASSET_PRINCIPAL_BALANCE : '|| G_ASSET_PRINCIPAL_BALANCE );
503 
504 
505     IF (G_CONTRACT_ID IS NULL OR
506 	    G_FIN_AST_LINE_ID IS NULL OR
507         G_ASSET_PRINCIPAL_BALANCE IS NULL OR
508 	    G_CONTRACT_ID <> p_contract_id OR
509 		G_FIN_AST_LINE_ID <> p_line_id
510 	   ) THEN
511 
512       --Changed the formula to LINE_CAP_AMNT_LOAN by bkatraga for bug 13031080
513       --Bug# 14637671: Changed Formula to LINE_CAP_AMNT_PRICE to reduce
514       --               capitalized downpayment when computing line cap amount
515       -- Derive Principal Balance
516       Okl_Execute_Formula_Pub.EXECUTE(p_api_version          => 1.0,
517                                       p_init_msg_list        => OKL_API.G_FALSE,
518                                       x_return_status        => x_return_status,
519                                       x_msg_count            => x_msg_count,
520                                       x_msg_data             => x_msg_data,
521                                       p_formula_name         => 'LINE_CAP_AMNT_PRICE',
522                                       p_contract_id          => p_contract_id,
523                                       p_line_id              => p_line_id,
524                                       p_additional_parameters => Okl_Execute_Formula_Pub.g_additional_parameters, -- vsgandhi bug13106699
525                                       x_value               =>  x_principal_balance
526                                      );
527 
528       IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
529 	     print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE completed successfully');
530       ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
531   	     print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned unexpected error');
532   	     print_error_message ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned unexpected error');
533          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
534       ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
535 	     print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned exception');
536 	     print_error_message ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned exception');
537          RAISE get_asset_fin_amt_failed;
538       END IF;
539 
540 	  G_CONTRACT_ID := p_contract_id;
541 	  G_FIN_AST_LINE_ID := p_line_id;
542 	  G_ASSET_PRINCIPAL_BALANCE := x_principal_balance;
543 
544 	ELSE
545       x_principal_balance := G_ASSET_PRINCIPAL_BALANCE;
546 	END IF;
547 
548     print_debug('Asset Line Financed Amount : '|| x_principal_balance);
549 
550 
551   EXCEPTION
552      WHEN get_asset_fin_amt_failed THEN
553        print_error_message('get_asset_fin_amt_failed Exception raised in procedure GET_ASSET_FINANCED_AMOUNT');
554        x_return_status := OKL_API.G_RET_STS_ERROR;
555 
556      WHEN OTHERS THEN
557        print_error_message('Exception raised in procedure GET_ASSET_FINANCED_AMOUNT');
558        Okl_Api.SET_MESSAGE(
559                p_app_name     => G_APP_NAME,
560                p_msg_name     => G_UNEXPECTED_ERROR,
561                p_token1       => G_SQLCODE_TOKEN,
562                p_token1_value => SQLCODE,
563                p_token2       => G_SQLERRM_TOKEN,
564                p_token2_value => SQLERRM);
565 
566        x_return_status := OKL_API.G_RET_STS_ERROR;
567 
568   END get_asset_financed_amount;
569 
570 ------------------------------------------------------------------------------
571   -- PROCEDURE print_report
572   --
573   --  This procedure prints consolidated list of processed contracts
574   --
575   -- Calls:
576   -- Called By:
577   ------------------------------------------------------------------------------
578   --Bug# 13447258: Added support to display Asset Level calculations
579   --Bug# 7277007
580   PROCEDURE Print_Report(
581                          p_contract_number IN VARCHAR2
582                         ) IS
583 
584   l_operating_unit_name  HR_OPERATING_UNITS.name%TYPE;
585   l_currency_code        GL_LEDGERS_PUBLIC_V.currency_code%TYPE;
586   l_index                NUMBER;
587   l_rec_count            NUMBER;
588   l_no_of_days           NUMBER;
589   l_counter              NUMBER;
590   l_contract_number      OKC_K_HEADERS_B.contract_number%TYPE;
591   l_contract_number1     OKC_K_HEADERS_B.contract_number%TYPE;
592   l_contract_number2     OKC_K_HEADERS_B.contract_number%TYPE;
593   l_icb_counter          VARCHAR2(30);
594   l_days_in_a_month_code OKL_K_RATE_PARAMS.days_in_a_month_code%TYPE;
595   l_days_in_a_year_code  OKL_K_RATE_PARAMS.days_in_a_year_code%TYPE;
596   l_separator            VARCHAR2(1);
597   l_success_count        NUMBER;
598   l_rejected_count       NUMBER;
599 
600   --Bug# 12974796
601   l_catchup_amount          NUMBER;
602 
603   CURSOR operating_unit_csr IS
604     SELECT hou.name,
605            book.currency_code
606     FROM   hr_operating_units hou,
607            GL_LEDGERS_PUBLIC_V book
608     WHERE  hou.set_of_books_id = book.ledger_id
609                   AND hou.ORGANIZATION_ID = mo_global.get_current_org_id();
610 
611   --Added ORDER BY clause by bkatraga for bug 13476838
612   CURSOR var_int_params_csr (p_contract_id NUMBER) IS
613     SELECT vip.interest_calc_start_date,
614            vip.interest_calc_end_date,
615            vip.interest_rate,
616            OKL_ACCOUNTING_UTIL.format_amount(NVL(vip.principal_balance,0),chr.currency_code) principal_balance,
617            OKL_ACCOUNTING_UTIL.format_amount(NVL(vip.interest_amt,0),chr.currency_code) interest_amt,
618            vip.interest_calc_days,
619            --Bug# 12974796
620            vip.id vir_id,
621            vip.kle_id,
622            cle.name asset_number,
623            DECODE(NVL(vip.catchup_amt,0),0,' ',OKL_ACCOUNTING_UTIL.format_amount(NVL(vip.catchup_amt,0),chr.currency_code)) catchup_amt,
624            vip.catchup_settlement_code
625     FROM   okl_var_int_params vip,
626            okc_k_headers_b chr,
627            okc_k_lines_v cle
628     WHERE  chr.id = p_contract_id
629     AND    vip.khr_id = chr.id
630     AND    vip.request_id = g_request_id
631     AND    vip.kle_id = cle.id
632     ORDER BY asset_number, vip.interest_calc_start_date;
633 
634   --Bug# 12974796
635   CURSOR fnd_lookup_csr (p_lookup_type VARCHAR2, p_lookup_code VARCHAR2) IS
636   SELECT meaning
637   FROM   fnd_lookups
638   WHERE  lookup_code = p_lookup_code
639   AND    lookup_type = p_lookup_type;
640 
641   l_catchup_settlement_desc VARCHAR2(2000);
642   --Bug# 12974796
643 
644   l_asset_number         OKC_K_LINES_V.NAME%TYPE;
645   l_display_asset_number OKC_K_LINES_V.NAME%TYPE;
646 
647   CURSOR var_int_params_contract_csr (p_contract_id NUMBER) IS
648     SELECT vip.interest_calc_start_date,
649            vip.interest_calc_end_date,
650            vip.interest_rate,
651            SUM(NVL(vip.principal_balance,0)) principal_balance,
652            SUM(NVL(vip.interest_amt,0)) interest_amt,
653            vip.interest_calc_days,
654            chr.currency_code
655     FROM   okl_var_int_params vip,
656            okc_k_headers_b chr
657     WHERE  vip.khr_id = p_contract_id
658     AND    chr.id = vip.khr_id
659     AND    vip.request_id = g_request_id
660     GROUP BY vip.interest_calc_start_date, vip.interest_calc_end_date, vip.interest_rate, vip.interest_calc_days, chr.currency_code
661     ORDER BY vip.interest_calc_start_date;
662 
663     --Bug# 14523043
664     l_contract_label VARCHAR2(15) := 'Contract: ';
665     l_asset_label VARCHAR2(15) := 'Asset: ';
666 
667   BEGIN
668 
669     OPEN operating_unit_csr;
670     FETCH operating_unit_csr INTO l_operating_unit_name, l_currency_code;
671     IF ( operating_unit_csr % NOTFOUND) THEN
672        NULL;
673     END IF;
674     CLOSE operating_unit_csr;
675 
676     print_line('Create Receivables Variable Rate Invoices');
677     print_line('****************************************************************************************************');
678     print_line('Program Run Date: '||trunc(sysdate));
679     print_line('Operating Unit: '||l_operating_unit_name);
680     print_line('Contract Number: '||p_contract_number);
681     print_line('To Due Date: '||trunc(g_to_date));
682     print_line('****************************************************************************************************');
683     print_line(' ');
684     print_line(' ');
685     print_line('====================================================================================================');
686     print_line('Summary');
687     print_line(' ');
688     print_line(' _________________________________________________________________________');
689     print_line('|                               |           Number of contracts           |');
690     print_line('| Interest Calculation Basis    |   Processed |    Rejected |       Total |');
691     print_line('|_______________________________|_____________|_____________|_____________|');
692 
693     l_success_count := 0;
694     l_rejected_count := 0;
695     IF (g_rpt_summary_tbl.COUNT > 0) THEN
696       l_icb_counter := g_rpt_summary_tbl.FIRST;
697       LOOP
698 
699         l_success_count  := l_success_count + NVL(g_rpt_summary_tbl(l_icb_counter).total_contract_num_success,0);
700         l_rejected_count := l_rejected_count + NVL(g_rpt_summary_tbl(l_icb_counter).total_contract_num_error,0);
701 
702         print_line('| ' || RPAD(l_icb_counter,30,' ') || '|' ||
703                            LPAD(NVL(g_rpt_summary_tbl(l_icb_counter).total_contract_num_success,0),12,' ')  || ' |' ||
704                            LPAD(NVL(g_rpt_summary_tbl(l_icb_counter).total_contract_num_error,0),12,' ')    || ' |' ||
705                            LPAD((NVL(g_rpt_summary_tbl(l_icb_counter).total_contract_num_success,0) +
706                                  NVL(g_rpt_summary_tbl(l_icb_counter).total_contract_num_error,0)),12,' ')  || ' |');
707 
708         print_line('|_________________________________________________________________________|');
709 
710         EXIT WHEN l_icb_counter = g_rpt_summary_tbl.LAST;
711         l_icb_counter := g_rpt_summary_tbl.next(l_icb_counter);
712       END LOOP;
713     ELSE
714       print_line('|_________________________________________________________________________|');
715     END IF;
716 
717     print_line('| ' || RPAD('Total',30,' ') || '|' || LPAD(l_success_count,12,' ') || ' |' || LPAD(l_rejected_count,12,' ') || ' |');
718     print_line('|_______________________________|_____________|_____________|');
719 
720     print_line(' ');
721     print_line(' ');
722     print_line('====================================================================================================');
723 
724     IF (g_rpt_error_tbl.COUNT > 0) THEN
725       print_line('Rejected Contracts');
726       print_line('____________________________________________________________________________________________________');
727 
728       FOR i IN g_rpt_error_tbl.FIRST..g_rpt_error_tbl.LAST LOOP
729         print_line(' ');
730         print_line(RPAD('Contract Number: '||g_rpt_error_tbl(i).contract_number,77,' ')||
731                    'Product: '||g_rpt_error_tbl(i).product_name);
732 
733         IF LENGTH(g_rpt_error_tbl(i).contract_number) > 60 THEN
734           print_line(LPAD(SUBSTR(g_rpt_error_tbl(i).contract_number,61),' ',17));
735         END IF;
736 
737         print_line(RPAD('Interest Calculation Basis: '||g_rpt_error_tbl(i).interest_calc_basis,77,' ')||
738                    'Last Interest Calculation Date: '||g_rpt_error_tbl(i).last_int_calc_date);
739         print_line(' ');
740         print_line('Error Description: ');
741 
742         FOR j IN g_rpt_error_tbl(i).error_msg_tbl.FIRST..g_rpt_error_tbl(i).error_msg_tbl.LAST LOOP
743 
744           l_counter := 1;
745           WHILE l_counter <= LENGTH(g_rpt_error_tbl(i).error_msg_tbl(j))
746           LOOP
747             print_line(SUBSTR(g_rpt_error_tbl(i).error_msg_tbl(j),l_counter,105));
748             l_counter := l_counter + 105;
749           END LOOP;
750 
751         END LOOP;
752 
753         print_line(' ');
754         print_line('____________________________________________________________________________________________________');
755       END LOOP;
756 
757       print_line(' ');
758       print_line(' ');
759       print_line('====================================================================================================');
760     END IF;
761 
762     IF (g_rpt_success_icb_tbl.COUNT > 0) THEN
763 
764       print_line('Processed Contracts');
765       print_line(' ');
766 
767       l_icb_counter := g_rpt_success_icb_tbl.FIRST;
768       LOOP
769 
770         print_line('Interest Calculation Basis'||RPAD(' ',30,' ')||': '||l_icb_counter);
771         print_line(' ');
772 
773         --Bug# 12974796
774         IF l_icb_counter = G_INT_CALC_BASIS_CATCHUP THEN
775 
776           print_line(' '|| RPAD('_',203,'_'));
777 
778           print_line('|' || RPAD('Contract Number / Asset Number',50,' ') ||
779                     ' |' || RPAD('Days',15,' ') ||
780                     ' |' || RPAD('Interest',11,' ') ||
781                     ' |' || RPAD('Interest',11,' ') ||
782                     ' |' || LPAD('Interest',10,' ') ||
783                     ' |' || LPAD('Effective(%)',13,' ') ||
784                     ' |' || LPAD('Principal Amount',18,' ') ||
785                     ' |' || LPAD('Interest Amount',18,' ') ||
786                     ' |' || LPAD('Catchup Amount',18,' ') ||
787                     ' |' || RPAD('Catchup Settlement',20,' ') ||
788                     ' |');
789 
790           print_line('|' || RPAD(' ',50,' ') ||
791                     ' |' || RPAD('Month/Year',15,' ') ||
792                     ' |' || RPAD('Start Date',11,' ') ||
793                     ' |' || RPAD('End Date',11,' ') ||
794                     ' |' || LPAD('Calc. Days',10,' ') ||
795                     ' |' || LPAD('Interest Rate',13,' ') ||
796                     ' |' || LPAD(' ',18,' ') ||
797                     ' |' || LPAD(' ',18,' ') ||
798                     ' |' || LPAD(' ',18,' ') ||
799                     ' |' || RPAD(' ',20,' ') ||
800                     ' |');
801 
802           print_line('|' || RPAD('_',203,'_') || '|');
803 
804         ELSE
805 
806           print_line(' '|| RPAD('_',161,'_'));
807 
808           print_line('|' || RPAD('Contract Number / Asset Number',50,' ') ||
809                     ' |' || RPAD('Days',15,' ') ||
810                     ' |' || RPAD('Interest',11,' ') ||
811                     ' |' || RPAD('Interest',11,' ') ||
812                     ' |' || LPAD('Interest',10,' ') ||
813                     ' |' || LPAD('Effective(%)',13,' ') ||
814                     ' |' || LPAD('Principal Amount',18,' ') ||
815                     ' |' || LPAD('Interest Amount',18,' ') ||
816                     ' |');
817 
818           print_line('|' || RPAD(' ',50,' ') ||
819                     ' |' || RPAD('Month/Year',15,' ') ||
820                     ' |' || RPAD('Start Date',11,' ') ||
821                     ' |' || RPAD('End Date',11,' ') ||
822                     ' |' || LPAD('Calc. Days',10,' ') ||
823                     ' |' || LPAD('Interest Rate',13,' ') ||
824                     ' |' || LPAD(' ',18,' ') ||
825                     ' |' || LPAD(' ',18,' ') ||
826                     ' |');
827 
828           print_line('|' || RPAD('_',161,'_') || '|');
829 
830         END IF;
831         --Bug# 12974796
832 
833         FOR i IN  g_rpt_success_icb_tbl(l_icb_counter).FIRST..g_rpt_success_icb_tbl(l_icb_counter).LAST LOOP
834 
835           --Bug# 14523043
836           l_contract_number  := l_contract_label || g_rpt_success_icb_tbl(l_icb_counter)(i).contract_number;
837           l_contract_number1 := NULL;
838           l_contract_number2 := NULL;
839           IF LENGTH(l_contract_number) > 40 THEN
840             l_contract_number1 := SUBSTR(l_contract_number,41,40);
841             l_contract_number2 := SUBSTR(l_contract_number,81,40);
842           END IF;
843 
844           l_asset_number := NULL;
845           l_display_asset_number := ' ';
846           FOR var_int_param_rec IN var_int_params_csr(g_rpt_success_icb_tbl(l_icb_counter)(i).contract_id)
847           LOOP
848 
849             IF (l_asset_number IS NULL OR l_asset_number <> var_int_param_rec.asset_number) THEN
850 
851                 IF l_icb_counter = G_INT_CALC_BASIS_CATCHUP THEN
852 
853                   print_line('|' || RPAD(' ',50,' ') ||
854                             ' |' || RPAD(' ',15,' ') ||
855                             ' |' || RPAD(' ',11,' ') ||
856                             ' |' || RPAD(' ',11,' ') ||
857                             ' |' || LPAD(' ',10,' ') ||
858                             ' |' || LPAD(' ',13,' ') ||
859                             ' |' || LPAD(' ',18,' ') ||
860                             ' |' || LPAD(' ',18,' ') ||
861                             ' |' || LPAD(' ',18,' ') ||
862                             ' |' || RPAD(' ',20,' ') ||
863                             ' |');
864                 ELSE
865                   print_line('|' || RPAD(' ',50,' ') ||
866                             ' |' || RPAD(' ',15,' ') ||
867                             ' |' || RPAD(' ',11,' ') ||
868                             ' |' || RPAD(' ',11,' ') ||
869                             ' |' || LPAD(' ',10,' ') ||
870                             ' |' || LPAD(' ',13,' ') ||
871                             ' |' || LPAD(' ',18,' ') ||
872                             ' |' || LPAD(' ',18,' ') ||
873                             ' |');
874                 END IF;
875 
876               l_asset_number         := var_int_param_rec.asset_number;
877               --Bug# 14523043
878               l_display_asset_number := l_asset_label || var_int_param_rec.asset_number;
879               l_days_in_a_month_code := g_rpt_success_icb_tbl(l_icb_counter)(i).days_in_a_month_code;
880               l_days_in_a_year_code  := g_rpt_success_icb_tbl(l_icb_counter)(i).days_in_a_year_code;
881               l_separator            := '/';
882             ELSE
883               l_days_in_a_month_code := ' ';
884               l_days_in_a_year_code  := ' ';
885               l_separator            := ' ';
886               l_display_asset_number := ' ';
887             END IF;
888 
889             --Bug# 12974796
890             IF l_icb_counter = G_INT_CALC_BASIS_CATCHUP THEN
891 
892               l_catchup_amount          := NULL;
893               l_catchup_settlement_desc := ' ' ;
894 
895               IF var_int_param_rec.catchup_settlement_code = 'INTEREST_CATCHUP' THEN
896                 OPEN fnd_lookup_csr('OKL_STREAM_TYPE_PURPOSE',var_int_param_rec.catchup_settlement_code);
897                 FETCH fnd_lookup_csr INTO l_catchup_settlement_desc;
898                 CLOSE fnd_lookup_csr;
899               ELSE
900                 OPEN fnd_lookup_csr('OKL_CATCHUP_SETTLEMENT_CODE', var_int_param_rec.catchup_settlement_code);
901                 FETCH fnd_lookup_csr INTO l_catchup_settlement_desc;
902                 CLOSE fnd_lookup_csr;
903               END IF;
904 
905               print_line('|' || RPAD(l_display_asset_number,50,' ') ||
906                         ' |' || LPAD(l_days_in_a_month_code,7,' ') || l_separator || RPAD(l_days_in_a_year_code,7,' ') ||
907                         ' |' || RPAD(TO_CHAR(var_int_param_rec.interest_calc_start_date,'DD-MON-RRRR'),11,' ') ||
908                         ' |' || RPAD(TO_CHAR(var_int_param_rec.interest_calc_end_date,'DD-MON-RRRR'),11,' ') ||
909                         ' |' || LPAD(NVL(var_int_param_rec.interest_calc_days,0),10,' ') ||
910                         ' |' || LPAD(NVL(var_int_param_rec.interest_rate,0),13,' ') ||
911                         ' |' || LPAD(NVL(var_int_param_rec.principal_balance,0),18,' ') ||
912                         ' |' || LPAD(NVL(var_int_param_rec.interest_amt,0),18,' ') ||
913                         ' |' || LPAD(NVL(var_int_param_rec.catchup_amt,0),18,' ') ||
914                         ' |' || RPAD(l_catchup_settlement_desc,20,' ') ||
915                         ' |');
916 
917 
918             ELSE
919               print_line('|' || RPAD(l_display_asset_number,50,' ') ||
920                         ' |' || LPAD(l_days_in_a_month_code,7,' ') || l_separator || RPAD(l_days_in_a_year_code,7,' ') ||
921                         ' |' || RPAD(TO_CHAR(var_int_param_rec.interest_calc_start_date,'DD-MON-RRRR'),11,' ') ||
922                         ' |' || RPAD(TO_CHAR(var_int_param_rec.interest_calc_end_date,'DD-MON-RRRR'),11,' ') ||
923                         ' |' || LPAD(NVL(var_int_param_rec.interest_calc_days,0),10,' ') ||
924                         ' |' || LPAD(NVL(var_int_param_rec.interest_rate,0),13,' ') ||
925                         ' |' || LPAD(NVL(var_int_param_rec.principal_balance,0),18,' ') ||
926                         ' |' || LPAD(NVL(var_int_param_rec.interest_amt,0),18,' ') ||
927                         ' |');
928 
929             END IF;
930             --Bug# 12974796
931 
932           END LOOP;
933 
934           IF l_icb_counter = G_INT_CALC_BASIS_CATCHUP THEN
935 
936                   print_line('|' || RPAD(' ',50,' ') ||
937                             ' |' || RPAD(' ',15,' ') ||
938                             ' |' || RPAD(' ',11,' ') ||
939                             ' |' || RPAD(' ',11,' ') ||
940                             ' |' || LPAD(' ',10,' ') ||
941                             ' |' || LPAD(' ',13,' ') ||
942                             ' |' || LPAD(' ',18,' ') ||
943                             ' |' || LPAD(' ',18,' ') ||
944                             ' |' || LPAD(' ',18,' ') ||
945                             ' |' || RPAD(' ',20,' ') ||
946                             ' |');
947           ELSE
948                   print_line('|' || RPAD(' ',50,' ') ||
949                             ' |' || RPAD(' ',15,' ') ||
950                             ' |' || RPAD(' ',11,' ') ||
951                             ' |' || RPAD(' ',11,' ') ||
952                             ' |' || LPAD(' ',10,' ') ||
953                             ' |' || LPAD(' ',13,' ') ||
954                             ' |' || LPAD(' ',18,' ') ||
955                             ' |' || LPAD(' ',18,' ') ||
956                             ' |');
957 
958           END IF;
959 
960           l_days_in_a_month_code := g_rpt_success_icb_tbl(l_icb_counter)(i).days_in_a_month_code;
961           l_days_in_a_year_code  := g_rpt_success_icb_tbl(l_icb_counter)(i).days_in_a_year_code;
962           l_separator            := '/';
963 
964           FOR var_int_param_contract_rec IN var_int_params_contract_csr(g_rpt_success_icb_tbl(l_icb_counter)(i).contract_id)
965           LOOP
966 
967             IF l_icb_counter = G_INT_CALC_BASIS_CATCHUP THEN
968               print_line('|' || RPAD(l_contract_number,50,' ') ||
969                         ' |' || LPAD(l_days_in_a_month_code,7,' ') || l_separator || RPAD(l_days_in_a_year_code,7,' ') ||
970                         ' |' || RPAD(TO_CHAR(var_int_param_contract_rec.interest_calc_start_date,'DD-MON-RRRR'),11,' ') ||
971                         ' |' || RPAD(TO_CHAR(var_int_param_contract_rec.interest_calc_end_date,'DD-MON-RRRR'),11,' ') ||
972                         ' |' || LPAD(NVL(var_int_param_contract_rec.interest_calc_days,0),10,' ') ||
973                         ' |' || LPAD(NVL(var_int_param_contract_rec.interest_rate,0),13,' ') ||
974                         ' |' || LPAD(OKL_ACCOUNTING_UTIL.format_amount(NVL(var_int_param_contract_rec.principal_balance,0),var_int_param_contract_rec.currency_code),18,' ') ||
975                         ' |' || LPAD(OKL_ACCOUNTING_UTIL.format_amount(NVL(var_int_param_contract_rec.interest_amt,0),var_int_param_contract_rec.currency_code),18,' ') ||
976                         ' |' || LPAD(' ',18,' ') ||
977                         ' |' || RPAD(' ',20,' ') ||
978                         ' |');
979 
980               IF l_contract_number1 IS NOT NULL THEN
981                 print_line('|' || RPAD(l_contract_number1,50,' ') ||
982                           ' |' || RPAD(' ',15,' ') ||
983                           ' |' || RPAD(' ',11,' ') ||
984                           ' |' || RPAD(' ',11,' ') ||
985                           ' |' || LPAD(' ',10,' ') ||
986                           ' |' || LPAD(' ',13,' ') ||
987                           ' |' || LPAD(' ',18,' ') ||
988                           ' |' || LPAD(' ',18,' ') ||
989                           ' |' || LPAD(' ',18,' ') ||
990                           ' |' || RPAD(' ',20,' ') ||
991                           ' |');
992               END IF;
993 
994               IF l_contract_number2 IS NOT NULL THEN
995                 print_line('|' || RPAD(l_contract_number2,50,' ') ||
996                           ' |' || RPAD(' ',15,' ') ||
997                           ' |' || RPAD(' ',11,' ') ||
998                           ' |' || RPAD(' ',11,' ') ||
999                           ' |' || LPAD(' ',10,' ') ||
1000                           ' |' || LPAD(' ',13,' ') ||
1001                           ' |' || LPAD(' ',18,' ') ||
1002                           ' |' || LPAD(' ',18,' ') ||
1003                           ' |' || LPAD(' ',18,' ') ||
1004                           ' |' || RPAD(' ',20,' ') ||
1005                           ' |');
1006               END IF;
1007 
1008              ELSE
1009               print_line('|' || RPAD(l_contract_number,50,' ') ||
1010                         ' |' || LPAD(l_days_in_a_month_code,7,' ') || l_separator || RPAD(l_days_in_a_year_code,7,' ') ||
1011                         ' |' || RPAD(TO_CHAR(var_int_param_contract_rec.interest_calc_start_date,'DD-MON-RRRR'),11,' ') ||
1012                         ' |' || RPAD(TO_CHAR(var_int_param_contract_rec.interest_calc_end_date,'DD-MON-RRRR'),11,' ') ||
1013                         ' |' || LPAD(NVL(var_int_param_contract_rec.interest_calc_days,0),10,' ') ||
1014                         ' |' || LPAD(NVL(var_int_param_contract_rec.interest_rate,0),13,' ') ||
1015                         ' |' || LPAD(OKL_ACCOUNTING_UTIL.format_amount(NVL(var_int_param_contract_rec.principal_balance,0),var_int_param_contract_rec.currency_code),18,' ') ||
1016                         ' |' || LPAD(OKL_ACCOUNTING_UTIL.format_amount(NVL(var_int_param_contract_rec.interest_amt,0),var_int_param_contract_rec.currency_code),18,' ') ||
1017                         ' |');
1018 
1019               IF l_contract_number1 IS NOT NULL THEN
1020                 print_line('|' || RPAD(l_contract_number1,50,' ') ||
1021                           ' |' || RPAD(' ',15,' ') ||
1022                           ' |' || RPAD(' ',11,' ') ||
1023                           ' |' || RPAD(' ',11,' ') ||
1024                           ' |' || LPAD(' ',10,' ') ||
1025                           ' |' || LPAD(' ',13,' ') ||
1026                           ' |' || LPAD(' ',18,' ') ||
1027                           ' |' || LPAD(' ',18,' ') ||
1028                           ' |');
1029               END IF;
1030 
1031               IF l_contract_number2 IS NOT NULL THEN
1032                 print_line('|' || RPAD(l_contract_number2,50,' ') ||
1033                           ' |' || RPAD(' ',15,' ') ||
1034                           ' |' || RPAD(' ',11,' ') ||
1035                           ' |' || RPAD(' ',11,' ') ||
1036                           ' |' || LPAD(' ',10,' ') ||
1037                           ' |' || LPAD(' ',13,' ') ||
1038                           ' |' || LPAD(' ',18,' ') ||
1039                           ' |' || LPAD(' ',18,' ') ||
1040                           ' |');
1041               END IF;
1042 
1043              END IF;
1044 
1045             l_contract_number      := ' ';
1046             l_contract_number1     := NULL;
1047             l_contract_number2     := NULL;
1048             l_days_in_a_month_code := ' ';
1049             l_days_in_a_year_code  := ' ';
1050             l_separator            := ' ';
1051 
1052           END LOOP;
1053 
1054           --Bug# 12974796
1055           IF l_icb_counter = G_INT_CALC_BASIS_CATCHUP THEN
1056             print_line('|' || RPAD('_',203,'_') || '|');
1057           ELSE
1058             print_line('|' || RPAD('_',161,'_') || '|');
1059           END IF;
1060           --Bug# 12974796
1061 
1062         END LOOP;
1063 
1064         EXIT WHEN l_icb_counter = g_rpt_success_icb_tbl.LAST;
1065         l_icb_counter := g_rpt_success_icb_tbl.next(l_icb_counter);
1066         print_line(' ');
1067         print_line(' ');
1068       END LOOP;
1069     END IF;
1070 
1071   EXCEPTION
1072     WHEN OTHERS THEN
1073       NULL;
1074   END;
1075 
1076   ------------------------------------------------------------------------------
1077   -- Function GET_PRINT_LEAD_DAYS to extract lead days for invoice generation
1078   ------------------------------------------------------------------------------
1079   FUNCTION get_printing_lead_days
1080 	(p_khr_id		NUMBER)
1081 	RETURN		NUMBER IS
1082 
1083     -- Derive print lead days from the rules
1084     CURSOR c_lead_days(p_khr_id IN NUMBER) IS
1085 	SELECT rule_information3
1086     FROM  okc_rules_b rule,
1087           okc_rule_groups_b rgp
1088     WHERE rgp.id = rule.rgp_id
1089     AND   rgp.dnz_chr_id = p_khr_id
1090     AND   rgd_code = 'LABILL'
1091     AND   rule_information_category = 'LAINVD';
1092 
1093     --Derive print lead days from receivables setup
1094     CURSOR c_default_lead_days(p_khr_id IN NUMBER) IS
1095 	SELECT term.printing_lead_days
1096     FROM  okl_k_headers_full_v khr
1097          ,hz_customer_profiles cp
1098          ,ra_terms term
1099     WHERE khr.id = p_khr_id
1100     AND khr.bill_to_site_use_id = cp.site_use_id
1101     AND cp.standard_terms = term.term_id;
1102 
1103     l_printing_lead_days NUMBER := 0;
1104   BEGIN
1105     OPEN c_lead_days(p_khr_id);
1106     FETCH c_lead_days INTO l_printing_lead_days;
1107     CLOSE c_lead_days;
1108 
1109     IF (l_printing_lead_days IS NULL) THEN
1110       OPEN c_default_lead_days(p_khr_id);
1111       FETCH c_default_lead_days INTO l_printing_lead_days;
1112       CLOSE c_default_lead_days;
1113     END IF;
1114 
1115     RETURN NVL(l_printing_lead_days, 0);
1116   END get_printing_lead_days;
1117 
1118   ------------------------------------------------------------------------------
1119 
1120     -- Start of Comments
1121     -- Created By:       Ramesh Seela
1122     -- Function Name    get_prorated_principal_amt_line
1123     -- Description:     Derives the principal amount from the loan amount passed.
1124     -- Dependencies:
1125     -- Parameters:       contract line id, stream element date, loan amount, and the currency code
1126     -- Version:          1.0
1127     -- End of Comments
1128 
1129   ------------------------------------------------------------------------------
1130   FUNCTION get_prorated_prin_amt_line (
1131             p_line_id             IN  NUMBER,
1132             p_stream_element_date IN  DATE,
1133             p_loan_amount         IN  NUMBER,
1134             p_currency_code       IN  VARCHAR2) RETURN NUMBER IS
1135 
1136   Cursor stream_element_interest_csr (p_line_id             NUMBER,
1137                                       p_stream_element_date DATE) IS
1138       SELECT nvl(sel_int_pmt.amount, 0) interest
1139       FROM   okl_strm_type_v sty_int_pmt
1140              ,okl_streams_v stm_int_pmt
1141              ,okl_strm_elements_v sel_int_pmt
1142        WHERE stm_int_pmt.kle_id = p_line_id
1143          AND stm_int_pmt.id = sel_int_pmt.stm_id
1144          AND sel_int_pmt.stream_element_date = p_stream_element_date
1145          AND stm_int_pmt.sty_id = sty_int_pmt.id
1146          AND stm_int_pmt.active_yn = 'Y'
1147          AND stm_int_pmt.say_code = 'CURR'
1148          AND sty_int_pmt.stream_type_purpose IN ('INTEREST_PAYMENT', 'VARIABLE_INTEREST');
1149 
1150   Cursor stream_element_principal_csr (p_line_id             NUMBER,
1151                                        p_stream_element_date DATE) IS
1152       SELECT nvl(sel_prin_pmt.amount, 0) principal
1153       FROM   okl_strm_type_v sty_prin_pmt
1154              ,okl_streams_v stm_prin_pmt
1155              ,okl_strm_elements_v sel_prin_pmt
1156        WHERE stm_prin_pmt.kle_id = p_line_id
1157          AND stm_prin_pmt.id = sel_prin_pmt.stm_id
1158          AND sel_prin_pmt.stream_element_date = p_stream_element_date
1159          AND stm_prin_pmt.sty_id = sty_prin_pmt.id
1160          AND stm_prin_pmt.active_yn = 'Y'
1161          AND stm_prin_pmt.say_code = 'CURR'
1162          AND sty_prin_pmt.stream_type_purpose = 'PRINCIPAL_PAYMENT';
1163 
1164   l_interest           okl_strm_elements_v.amount%TYPE;
1165   l_principal          okl_strm_elements_v.amount%TYPE;
1166   l_prorated_principal okl_strm_elements_v.amount%TYPE;
1167   BEGIN
1168     OPEN stream_element_interest_csr (p_line_id, p_stream_element_date);
1169     FETCH stream_element_interest_csr INTO l_interest;
1170     IF stream_element_interest_csr%NOTFOUND THEN
1171         l_interest := 0;
1172         l_prorated_principal := p_loan_amount;
1173         RETURN l_prorated_principal;
1174     END IF;
1175     CLOSE stream_element_interest_csr;
1176 
1177     OPEN stream_element_principal_csr (p_line_id, p_stream_element_date);
1178     FETCH stream_element_principal_csr INTO l_principal;
1179     IF stream_element_principal_csr%NOTFOUND THEN
1180         l_interest := 0;
1181         l_prorated_principal := p_loan_amount;
1182         RETURN l_prorated_principal;
1183     END IF;
1184     CLOSE stream_element_principal_csr;
1185 
1186     IF (( l_interest <> 0 ) AND (l_principal <> 0)) THEN
1187       l_prorated_principal :=  (p_loan_amount * l_principal) /(l_principal + l_interest);
1188       RETURN l_prorated_principal;
1189     ELSE
1190       RETURN p_loan_amount;
1191     END IF;
1192   EXCEPTION
1193       WHEN OTHERS THEN
1194       IF ( stream_element_interest_csr%ISOPEN ) THEN
1195          CLOSE stream_element_interest_csr;
1196       END IF;
1197       IF ( stream_element_principal_csr%ISOPEN ) THEN
1198          CLOSE stream_element_interest_csr;
1199       END IF;
1200       RETURN NULL;
1201   END;
1202 
1203   ------------------------------------------------------------------------------
1204 
1205     -- Start of Comments
1206     -- Created By:       Ramesh Seela
1207     -- Function Name    get_prorated_prin_amt_header
1208     -- Description:     Derives the principal amount from the loan amount passed.
1209     -- Dependencies:
1210     -- Parameters:      contract id, contract line id, stream element date, loan amount, and the currency code
1211     -- Version:          1.0
1212     -- End of Comments
1213 
1214   ------------------------------------------------------------------------------
1215   FUNCTION get_prorated_prin_amt_header (
1216             p_contract_id         IN  NUMBER,
1217             p_line_id             IN  NUMBER,
1218             p_stream_element_date IN  DATE,
1219             p_loan_amount         IN  NUMBER,
1220             p_currency_code       IN  VARCHAR2) RETURN NUMBER IS
1221 
1222   Cursor strm_elem_int_line_csr (p_line_id             NUMBER,
1223                                  p_stream_element_date DATE) IS
1224       SELECT nvl(sel_int_pmt.amount, 0) interest
1225       FROM   okl_strm_type_v sty_int_pmt
1226              ,okl_streams_v stm_int_pmt
1227              ,okl_strm_elements_v sel_int_pmt
1228        WHERE stm_int_pmt.kle_id = p_line_id
1229          AND stm_int_pmt.id = sel_int_pmt.stm_id
1230          AND sel_int_pmt.stream_element_date = p_stream_element_date
1231          AND stm_int_pmt.sty_id = sty_int_pmt.id
1232          AND stm_int_pmt.active_yn = 'Y'
1233          AND stm_int_pmt.say_code = 'CURR'
1234          AND sty_int_pmt.stream_type_purpose IN ('INTEREST_PAYMENT', 'VARIABLE_INTEREST');
1235 
1236   Cursor strm_elem_prin_line_csr (p_line_id             NUMBER,
1237                                   p_stream_element_date DATE) IS
1238       SELECT nvl(sel_prin_pmt.amount, 0) principal
1239       FROM   okl_strm_type_v sty_prin_pmt
1240              ,okl_streams_v stm_prin_pmt
1241              ,okl_strm_elements_v sel_prin_pmt
1242        WHERE stm_prin_pmt.kle_id = p_line_id
1243          AND stm_prin_pmt.id = sel_prin_pmt.stm_id
1244          AND sel_prin_pmt.stream_element_date = p_stream_element_date
1245          AND stm_prin_pmt.sty_id = sty_prin_pmt.id
1246          AND stm_prin_pmt.active_yn = 'Y'
1247          AND stm_prin_pmt.say_code = 'CURR'
1248          AND sty_prin_pmt.stream_type_purpose = 'PRINCIPAL_PAYMENT';
1249 
1250   Cursor strm_elem_int_hdr_csr (p_khr_id             NUMBER,
1251                                 p_stream_element_date DATE) IS
1252       SELECT nvl(sel_int_pmt.amount, 0) interest
1253       FROM   okl_strm_type_v sty_int_pmt
1254              ,okl_streams_v stm_int_pmt
1255              ,okl_strm_elements_v sel_int_pmt
1256        WHERE stm_int_pmt.khr_id = p_khr_id
1257          AND stm_int_pmt.id = sel_int_pmt.stm_id
1258          AND sel_int_pmt.stream_element_date = p_stream_element_date
1259          AND stm_int_pmt.sty_id = sty_int_pmt.id
1260          AND stm_int_pmt.active_yn = 'Y'
1261          AND stm_int_pmt.say_code = 'CURR'
1262          AND sty_int_pmt.stream_type_purpose IN ('INTEREST_PAYMENT', 'VARIABLE_INTEREST');
1263 
1264   Cursor strm_elem_prin_hdr_csr ( p_khr_id              NUMBER,
1265                                   p_stream_element_date DATE) IS
1266       SELECT nvl(sel_prin_pmt.amount, 0) principal
1267       FROM   okl_strm_type_v sty_prin_pmt
1268              ,okl_streams_v stm_prin_pmt
1269              ,okl_strm_elements_v sel_prin_pmt
1270        WHERE stm_prin_pmt.khr_id = p_khr_id
1271          AND stm_prin_pmt.id = sel_prin_pmt.stm_id
1272          AND sel_prin_pmt.stream_element_date = p_stream_element_date
1273          AND stm_prin_pmt.sty_id = sty_prin_pmt.id
1274          AND stm_prin_pmt.active_yn = 'Y'
1275          AND stm_prin_pmt.say_code = 'CURR'
1276          AND sty_prin_pmt.stream_type_purpose = 'PRINCIPAL_PAYMENT';
1277 
1278   l_interest           okl_strm_elements_v.amount%TYPE;
1279   l_principal          okl_strm_elements_v.amount%TYPE;
1280   l_prorated_principal okl_strm_elements_v.amount%TYPE;
1281   BEGIN
1282     IF (p_line_id IS NOT NULL) THEN
1283       OPEN strm_elem_int_line_csr (p_line_id, p_stream_element_date);
1284       FETCH strm_elem_int_line_csr INTO l_interest;
1285       IF strm_elem_int_line_csr%NOTFOUND THEN
1286         l_interest := 0;
1287         l_prorated_principal := p_loan_amount;
1288         RETURN l_prorated_principal;
1289       END IF;
1290       CLOSE strm_elem_int_line_csr;
1291 
1292       OPEN strm_elem_prin_line_csr (p_line_id, p_stream_element_date);
1293       FETCH strm_elem_prin_line_csr INTO l_principal;
1294       IF strm_elem_prin_line_csr%NOTFOUND THEN
1295         l_interest := 0;
1296         l_prorated_principal := p_loan_amount;
1297         RETURN l_prorated_principal;
1298       END IF;
1299       CLOSE strm_elem_prin_line_csr;
1300 
1301       IF (( l_interest <> 0 ) AND (l_principal <> 0)) THEN
1302         l_prorated_principal :=  (p_loan_amount * l_principal) /(l_principal + l_interest);
1303         RETURN l_prorated_principal;
1304       ELSE
1305         RETURN p_loan_amount;
1306       END IF;
1307     ELSE  /* p_line_id is NULL */
1308       OPEN strm_elem_int_hdr_csr (p_contract_id, p_stream_element_date);
1309       FETCH strm_elem_int_hdr_csr INTO l_interest;
1310       IF strm_elem_int_hdr_csr%NOTFOUND THEN
1311         l_interest := 0;
1312         l_prorated_principal := p_loan_amount;
1313         RETURN l_prorated_principal;
1314       END IF;
1315       CLOSE strm_elem_int_hdr_csr;
1316 
1317       OPEN strm_elem_prin_hdr_csr (p_contract_id, p_stream_element_date);
1318       FETCH strm_elem_prin_hdr_csr INTO l_principal;
1319       IF strm_elem_prin_hdr_csr%NOTFOUND THEN
1320         l_interest := 0;
1321         l_prorated_principal := p_loan_amount;
1322         RETURN l_prorated_principal;
1323       END IF;
1324       CLOSE strm_elem_prin_hdr_csr;
1325 
1326       IF (( l_interest <> 0 ) AND (l_principal <> 0)) THEN
1327         l_prorated_principal :=  (p_loan_amount * l_principal) /(l_principal + l_interest);
1328         RETURN l_prorated_principal;
1329       ELSE
1330         RETURN p_loan_amount;
1331       END IF;
1332     END IF;
1333   EXCEPTION
1334       WHEN OTHERS THEN
1335       IF ( strm_elem_int_line_csr%ISOPEN ) THEN
1336          CLOSE strm_elem_int_line_csr;
1337       END IF;
1338       IF ( strm_elem_prin_line_csr%ISOPEN ) THEN
1339          CLOSE strm_elem_prin_line_csr;
1340       END IF;
1341       IF ( strm_elem_int_hdr_csr%ISOPEN ) THEN
1342          CLOSE strm_elem_int_hdr_csr;
1343       END IF;
1344       IF ( strm_elem_prin_hdr_csr%ISOPEN ) THEN
1345          CLOSE strm_elem_prin_hdr_csr;
1346       END IF;
1347 
1348       RETURN NULL;
1349   END;
1350 
1351 ------------------------------------------------------------------------------
1352     -- Start of Comments
1353     -- Created By:       Ramesh Seela
1354     -- Procedure Name    print_principal_date_range_tbl
1355     -- Description:      This procedure prints all the records in the principal date range buffer
1356     --
1357     -- Dependencies:
1358     -- Parameters:       .
1359     -- Version:          1.0
1360     -- End of Comments
1361 
1362 ------------------------------------------------------------------------------
1363 
1364   PROCEDURE print_principal_date_range_tbl ( p_principal_balance_tbl IN  principal_balance_tbl_typ) IS
1365 
1366   l_rec_count    NUMBER;
1367   l_index        NUMBER;
1368   l_counter      NUMBER := 0;
1369   BEGIN
1370        l_rec_count      := p_principal_balance_tbl.COUNT;
1371        IF (l_rec_count > 0) THEN
1372           l_index          := p_principal_balance_tbl.FIRST;
1373           print_debug('Principal Balance Table : ');
1374        ELSE
1375           print_debug('No records exist in the table');
1376        END IF;
1377        FOR l_rcpt_tbl_counter in 1 .. l_rec_count
1378        LOOP
1379           l_counter     := l_counter + 1;
1380           print_debug( 'Record : '|| l_counter );
1381 		  print_debug( 'From Date : '|| p_principal_balance_tbl(l_index).from_date);
1382 		  print_debug( 'TO Date : '|| p_principal_balance_tbl(l_index).to_date);
1383 		  print_debug( 'Principal Balance : '|| p_principal_balance_tbl(l_index).principal_balance);
1384 
1385           l_index       := p_principal_balance_tbl.NEXT(l_index);
1386        END LOOP;
1387   EXCEPTION
1388      WHEN OTHERS THEN
1389           Okl_Api.SET_MESSAGE(
1390                   p_app_name     => G_APP_NAME,
1391                   p_msg_name     => G_UNEXPECTED_ERROR,
1392                   p_token1       => G_SQLCODE_TOKEN,
1393                   p_token1_value => SQLCODE,
1394                   p_token2       => G_SQLERRM_TOKEN,
1395                   p_token2_value => SQLERRM);
1396   END;
1397 
1398 ------------------------------------------------------------------------------
1399 
1400     -- Start of Comments
1401     -- Created By:       Ramesh Seela
1402     -- Procedure Name    prin_date_range_loan_old
1403     -- Description:      This procedure is used by Variable Interest Calculation program for LOANS
1404     --                   Returns a PL/SQL table of records with following entries Start Date, End Date,
1405     --                   and Principal Balance
1406     -- Dependencies:
1407     -- Parameters:
1408     -- Version:          1.0
1409     -- Version :         1.1 - Obsoleted this local procedure due to Billing Inline changes - Bug#5898792 - 23/2/2007
1410     -- End of Comments
1411 
1412 ------------------------------------------------------------------------------
1413 
1414 
1415 ------------------------------------------------------------------------------
1416 
1417     -- Start of Comments
1418     -- Created By:       Ramesh Seela
1419     -- Procedure Name    principal_date_range_var_int_loan
1420     -- Description:      This procedure is used by Variable Interest Calculation program for LOANS
1421     --                   Returns a PL/SQL table of records with following entries Start Date, End Date,
1422     --                   and Principal Balance
1423     -- Dependencies:
1424     -- Parameters:
1425     -- Version:          1.0
1426     -- End of Comments
1427 
1428   ------------------------------------------------------------------------------
1429   PROCEDURE prin_date_range_var_int_loan (
1430             p_api_version        IN  NUMBER,
1431             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
1432             x_return_status      OUT NOCOPY VARCHAR2,
1433             x_msg_count          OUT NOCOPY NUMBER,
1434             x_msg_data           OUT NOCOPY VARCHAR2,
1435             p_contract_id        IN  NUMBER,
1436             p_line_id            IN  NUMBER,
1437             p_start_date         IN  DATE,
1438             p_due_date           IN  DATE,
1439             p_principal_basis    IN  VARCHAR2 DEFAULT NULL,
1440             x_principal_balance_tbl OUT	NOCOPY principal_balance_tbl_typ)   IS
1441 
1442   l_api_name                   CONSTANT    VARCHAR2(30) := 'PRIN_DATE_RANGE_VAR_INT_LOAN';
1443   l_api_version                CONSTANT    NUMBER       := 1.0;
1444   l_principal_basis            OKL_K_RATE_PARAMS.principal_basis_code%TYPE;
1445   l_effective_date             DATE := SYSDATE;
1446   l_principal_balance_tbl      principal_balance_tbl_typ ;
1447   l_principal_balance_tbl_tmp   principal_balance_tbl_typ ;
1448 --  l_contract_start_date        DATE;
1449   l_start_date                 DATE;
1450   l_principal_balance          NUMBER;
1451   l_counter                    NUMBER := 0;
1452   l_counter_tmp                NUMBER := 0;
1453   l_receipt_counter            NUMBER := 0;
1454 --  l_revenue_recognition        OKL_PRODUCT_PARAMETERS_V.revenue_recognition_method%TYPE;
1455   l_receipt_date               DATE;
1456 --  l_interest_calc_basis        OKL_PRODUCT_PARAMETERS_V.interest_calculation_basis%TYPE;
1457   l_receipt_tbl                receipt_tbl_type;
1458   lx_receipt_tbl               receipt_tbl_type;
1459   l_rcpt_tbl_count             NUMBER := 0;
1460   l_rcpt_tbl_index             NUMBER := 0;
1461 --  l_currency_code              OKL_K_HEADERS_FULL_V.currency_code%TYPE;
1462   l_prev_rcpt_date             DATE;
1463   l_current_rcpt_date          DATE;
1464   l_total_rcpt_prin_amt        NUMBER;
1465   l_current_rcpt_prin_amt      NUMBER;
1466   l_total_rcpt_loan_amt        NUMBER;
1467   l_current_rcpt_loan_amt      NUMBER;
1468   l_prin_bal_strm_element_date DATE;
1469   prin_date_range_loan_failed  EXCEPTION;
1470   l_previous_receipt_date      DATE;
1471 
1472   --Bug# 12903938
1473   j                            NUMBER := 0;
1474   l_stream_element_date        DATE;
1475 
1476 /*
1477   Cursor principal_basis_csr (p_contract_id NUMBER,
1478                               p_effective_date DATE) IS
1479       SELECT nvl(principal_basis_code, 'ACTUAL')
1480       FROM   okl_k_rate_params
1481       WHERE  khr_id = p_contract_id
1482       AND    p_effective_date BETWEEN effective_from_date and nvl(effective_to_date, p_effective_date)
1483       AND    parameter_type_code = 'ACTUAL';
1484 
1485   Cursor contract_csr (p_contract_id NUMBER) IS
1486       SELECT start_date, currency_code
1487       FROM   okl_k_headers_full_v
1488       WHERE  id = p_contract_id;
1489 */
1490   --Bug# 12903938: Modified cursor
1491   Cursor sch_asset_prin_balance_csr (p_contract_id NUMBER,
1492                                      p_line_id     NUMBER,
1493                                      --Bug# 12903938
1494                                      p_start_date  DATE,
1495                                      p_due_date    DATE) IS
1496 
1497         --Bug# 12903938
1498         SELECT sel.stream_element_date stream_element_date,
1499                sel.amount              amount
1500         FROM
1501              okl_strm_elements sel
1502              ,okl_streams str
1503              ,okl_strm_type_v sty
1504             WHERE  sel.stm_id = str.id
1505               AND  str.khr_id = p_contract_id
1506               AND  str.kle_id = p_line_id
1507               AND  str.say_code = 'CURR'
1508               AND  str.active_yn = 'Y'
1509               --Bug# 12903938
1510               AND  sel.stream_element_date BETWEEN p_start_date AND p_due_date
1511               AND  str.sty_id = sty.id
1512               AND  sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
1513         --Bug# 12903938
1514         ORDER BY sel.stream_element_date;
1515 
1516   --Bug# 12903938: Modified cursor
1517   --Bug# 13384468: Modified cursor to exclude Financed Fees
1518   Cursor sch_ctr_prin_balance_csr (p_contract_id NUMBER,
1519                                    --Bug# 12903938
1520                                    p_start_date  DATE,
1521                                    p_due_date    DATE) IS
1522         --Bug# 12903938
1523         SELECT sel.stream_element_date stream_element_date,
1524                SUM(amount)             amount
1525         FROM
1526              okl_strm_elements sel
1527              ,okl_streams str
1528              ,okl_strm_type_v sty
1529              ,okc_k_lines_b cle
1530              ,okc_statuses_b sts
1531             WHERE  sel.stm_id = str.id
1532               AND  str.khr_id = p_contract_id
1533               AND  str.say_code = 'CURR'
1534               AND  str.active_yn = 'Y'
1535               --Bug# 12903938
1536               AND  sel.stream_element_date BETWEEN p_start_date AND p_due_date
1537               AND  str.sty_id = sty.id
1538               AND  sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
1539               AND  cle.chr_id = str.khr_id
1540               AND  cle.dnz_chr_id = str.khr_id
1541               AND  cle.id = str.kle_id
1542               AND  cle.lse_id = G_FIN_LINE_LTY_ID
1543               AND  cle.sts_code = sts.code
1544               AND  sts.ste_code <> 'CANCELLED'
1545         --Bug# 12903938
1546         GROUP BY sel.stream_element_date
1547         ORDER BY sel.stream_element_date;
1548 
1549   --Bug# 12903938: Added cursor
1550   Cursor sch_asset_prin_balance_csr1 (p_contract_id NUMBER,
1551                                       p_line_id     NUMBER,
1552                                       p_start_date  DATE) IS
1553         SELECT sel.stream_element_date  stream_element_date,
1554                sel.amount               amount
1555         FROM
1556              okl_strm_elements sel
1557              ,okl_streams str
1558              ,okl_strm_type_v sty
1559             WHERE  sel.stm_id = str.id
1560               AND  str.khr_id = p_contract_id
1561               AND  str.kle_id = p_line_id
1562               AND  str.say_code = 'CURR'
1563               AND  str.active_yn = 'Y'
1564               AND  sel.stream_element_date = (SELECT MAX(sel1.stream_element_date)
1565                                               FROM okl_strm_elements sel1
1566                                               WHERE sel1.stm_id = sel.stm_id
1567                                               AND sel1.stream_element_date < p_start_date)
1568               AND  str.sty_id = sty.id
1569               AND  sty.stream_type_purpose = 'PRINCIPAL_BALANCE';
1570 
1571   --Bug# 12903938: Added cursor
1572 
1573   Cursor sch_ctr_prin_balance_csr1 (p_contract_id NUMBER,
1574                                     p_start_date  DATE) IS
1575         SELECT sel.stream_element_date   stream_element_date,
1576                SUM(amount)               amount
1577         FROM
1578              okl_strm_elements sel
1579              ,okl_streams str
1580              ,okl_strm_type_v sty
1581              ,okc_k_lines_b cle
1582              ,okc_statuses_b sts
1583             WHERE  sel.stm_id = str.id
1584               AND  str.khr_id = p_contract_id
1585               AND  str.say_code = 'CURR'
1586               AND  str.active_yn = 'Y'
1587               AND  sel.stream_element_date = (SELECT MAX(sel1.stream_element_date)
1588                                               FROM okl_strm_elements sel1
1589                                               WHERE sel1.stm_id = sel.stm_id
1590                                               AND sel1.stream_element_date < p_start_date)
1591               AND  str.sty_id = sty.id
1592               AND  sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
1593               AND  cle.chr_id = str.khr_id
1594               AND  cle.dnz_chr_id = str.khr_id
1595               AND  cle.id = str.kle_id
1596               AND  cle.lse_id = G_FIN_LINE_LTY_ID
1597               AND  cle.sts_code = sts.code
1598               AND  sts.ste_code <> 'CANCELLED'
1599         GROUP BY stream_element_date;
1600 
1601 -- Begin - Billing Inline changes - Bug#5898792 - varangan - 23/2/2007
1602        --Bug# 6819044: Fetch receipt applications correctly when
1603        --              contracts have multiple asset lines and
1604        --              invoices have lines from multiple contracts
1605 
1606        --Bug# 14179413: Include Credit Memos and Adjustments when calculating
1607        --               Actual Principal Balance
1608        Cursor receipt_details_csr (p_contract_id NUMBER,
1609                               p_line_id     NUMBER,
1610                               p_start_date  DATE,
1611                               p_due_date    DATE) IS
1612        SELECT cra.receipt_date receipt_date
1613              ,SUM(nvl(ad.amount_cr,0))- SUM(nvl(ad.amount_dr,0)) principal_pmt_rcpt_amt -- 4884843, 4872370
1614        FROM  okl_txd_ar_ln_dtls_b tld,
1615              ra_customer_trx_lines_all ractrl,
1616              okl_txl_ar_inv_lns_b til,
1617              okl_trx_ar_invoices_b tai,
1618              ar_payment_schedules_all aps,
1619              ar_receivable_applications_all raa,
1620              ar_cash_receipts_all cra,
1621              okl_strm_type_b sty,
1622              ar_distributions_all ad
1623        WHERE tai.trx_status_code = 'PROCESSED'
1624          AND tai.khr_id = p_contract_id
1625          AND tld.khr_id = p_contract_id
1626          AND tld.kle_id = NVL(p_line_id, tld.kle_id)
1627          AND ractrl.customer_trx_id = aps.customer_trx_id
1628          AND raa.applied_customer_trx_id = aps.customer_trx_id
1629          AND aps.class = 'INV'
1630          AND raa.application_type = 'CASH'
1631          AND raa.status = 'APP'
1632          AND raa.display = 'Y'
1633          AND cra.receipt_date <= NVL(p_due_date, cra.receipt_date)
1634          AND raa.cash_receipt_id = cra.cash_receipt_id
1635          AND tld.sty_id = sty.id
1636          AND sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
1637          AND to_char(tld.id) = ractrl.interface_line_attribute14
1638          AND tld.til_id_details = til.id
1639          AND til.tai_id = tai.id
1640          AND raa.receivable_application_id = ad.source_id
1641          AND ad.source_table = 'RA'
1642          AND ad.ref_customer_trx_Line_Id = ractrl.customer_trx_line_id
1643        GROUP BY cra.receipt_date
1644        UNION ALL
1645        SELECT cra.receipt_date receipt_date
1646               ,SUM(raa.line_applied) principal_pmt_rcpt_amt -- 4884843, 4872370
1647        FROM  okl_txd_ar_ln_dtls_b tld,
1648               ra_customer_trx_lines_all ractrl,
1649               okl_txl_ar_inv_lns_b til,
1650               okl_trx_ar_invoices_b tai,
1651               ar_payment_schedules_all aps,
1652               ar_receivable_applications_all raa,
1653               ar_cash_receipts_all cra,
1654               okl_strm_type_b sty
1655        WHERE tai.trx_status_code = 'PROCESSED'
1656          AND tai.khr_id = p_contract_id
1657          AND tld.khr_id = p_contract_id
1658          AND tld.kle_id = NVL(p_line_id, tld.kle_id)
1659          AND ractrl.customer_trx_id = aps.customer_trx_id
1660          AND raa.applied_customer_trx_id = aps.customer_trx_id
1661          AND aps.class = 'INV'
1662          AND raa.application_type = 'CASH'
1663          AND raa.status = 'APP'
1664          AND raa.display = 'Y'
1665          AND cra.receipt_date <= NVL(p_due_date, cra.receipt_date)
1666          AND raa.cash_receipt_id = cra.cash_receipt_id
1667          AND tld.sty_id = sty.id
1668          AND sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
1669          AND to_char(tld.id) = ractrl.interface_line_attribute14
1670          AND tld.til_id_details = til.id
1671          AND til.tai_id = tai.id
1672          AND  EXISTS (SELECT 1
1673                       FROM ar_distributions_all ad
1674                       WHERE raa.receivable_application_id = ad.source_id
1675                       AND ad.source_table = 'RA'
1676                       AND ad.ref_customer_trx_Line_Id IS NULL)
1677        GROUP BY cra.receipt_date
1678        UNION ALL
1679        SELECT ocb.termination_date receipt_date,
1680               sum(ocb.termination_value_amt) principal_pmt_rcpt_amt
1681        FROM   okl_contract_balances ocb
1682        WHERE  ocb.khr_id = p_contract_id
1683        AND    ocb.kle_id = NVL(p_line_id, kle_id)
1684        AND    ocb.termination_date BETWEEN p_start_date AND p_due_date
1685        GROUP BY ocb.termination_date
1686        UNION ALL
1687         SELECT sel.stream_element_date receipt_date,
1688                sum(sel.amount) principal_pmt_rcpt_amt
1689         FROM
1690              okl_strm_elements sel
1691              ,okl_streams str
1692              ,okl_strm_type_v sty
1693             WHERE  sel.stm_id = str.id
1694               AND  str.khr_id = p_contract_id
1695               AND  str.kle_id = NVL(p_line_id, str.kle_id)
1696               AND  str.say_code = 'CURR'
1697               AND  str.active_yn = 'Y'
1698               AND  sel.stream_element_date BETWEEN p_start_date AND NVL(p_due_date, sel.stream_element_date)
1699               AND  str.sty_id = sty.id
1700               AND  sty.stream_type_purpose = 'PRINCIPAL_CATCHUP'
1701        GROUP BY sel.stream_element_date
1702        UNION ALL
1703        SELECT cm.trx_date receipt_date
1704              ,SUM(nvl(ad.amount_cr,0))- SUM(nvl(ad.amount_dr,0)) principal_pmt_rcpt_amt
1705        FROM  okl_txd_ar_ln_dtls_b tld,
1706              ra_customer_trx_lines_all ractrl,
1707              okl_txl_ar_inv_lns_b til,
1708              okl_trx_ar_invoices_b tai,
1709              ar_payment_schedules_all aps,
1710              ar_receivable_applications_all raa,
1711              ra_customer_trx_all cm,
1712              okl_strm_type_b sty,
1713              ar_distributions_all ad
1714        WHERE tai.trx_status_code = 'PROCESSED'
1715          AND tai.khr_id = p_contract_id
1716          AND tld.khr_id = p_contract_id
1717          AND tld.kle_id = NVL(p_line_id, tld.kle_id)
1718          AND ractrl.customer_trx_id = aps.customer_trx_id
1719          AND raa.applied_customer_trx_id = aps.customer_trx_id
1720          AND aps.class = 'INV'
1721          AND raa.application_type = 'CM'
1722          AND raa.status = 'APP'
1723          AND raa.display = 'Y'
1724          AND cm.trx_date <= NVL(p_due_date, cm.trx_date)
1725          AND raa.customer_trx_id = cm.customer_trx_id
1726          AND tld.sty_id = sty.id
1727          AND sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
1728          AND to_char(tld.id) = ractrl.interface_line_attribute14
1729          AND tld.til_id_details = til.id
1730          AND til.tai_id = tai.id
1731          AND raa.receivable_application_id = ad.source_id
1732          AND ad.source_table = 'RA'
1733          AND ad.ref_customer_trx_Line_Id = ractrl.customer_trx_line_id
1734        GROUP BY cm.trx_date
1735        UNION ALL
1736        SELECT cm.trx_date receipt_date
1737               ,SUM(raa.line_applied) principal_pmt_rcpt_amt -- 4884843, 4872370
1738        FROM   okl_txd_ar_ln_dtls_b tld,
1739               ra_customer_trx_lines_all ractrl,
1740               okl_txl_ar_inv_lns_b til,
1741               okl_trx_ar_invoices_b tai,
1742               ar_payment_schedules_all aps,
1743               ar_receivable_applications_all raa,
1744               ra_customer_trx_all cm,
1745               okl_strm_type_b sty
1746        WHERE tai.trx_status_code = 'PROCESSED'
1747          AND tai.khr_id = p_contract_id
1748          AND tld.khr_id = p_contract_id
1749          AND tld.kle_id = NVL(p_line_id, tld.kle_id)
1750          AND ractrl.customer_trx_id = aps.customer_trx_id
1751          AND raa.applied_customer_trx_id = aps.customer_trx_id
1752          AND aps.class = 'INV'
1753          AND raa.application_type = 'CM'
1754          AND raa.status = 'APP'
1755          AND raa.display = 'Y'
1756          AND cm.trx_date <= NVL(p_due_date, cm.trx_date)
1757          AND raa.customer_trx_id = cm.customer_trx_id
1758          AND tld.sty_id = sty.id
1759          AND sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
1760          AND to_char(tld.id) = ractrl.interface_line_attribute14
1761          AND tld.til_id_details = til.id
1762          AND til.tai_id = tai.id
1763          AND  EXISTS (SELECT 1
1764                       FROM ar_distributions_all ad
1765                       WHERE raa.receivable_application_id = ad.source_id
1766                       AND ad.source_table = 'RA'
1767                       AND ad.ref_customer_trx_Line_Id IS NULL)
1768        GROUP BY cm.trx_date
1769        UNION ALL
1770        SELECT adj.apply_date receipt_date
1771              ,SUM(nvl(ad.amount_dr,0))- SUM(nvl(ad.amount_cr,0)) principal_pmt_rcpt_amt
1772        FROM  okl_txd_ar_ln_dtls_b tld,
1773              ra_customer_trx_lines_all ractrl,
1774              okl_txl_ar_inv_lns_b til,
1775              okl_trx_ar_invoices_b tai,
1776              ar_payment_schedules_all aps,
1777              ar_adjustments_all adj,
1778              okl_strm_type_b sty,
1779              ar_distributions_all ad
1780        WHERE tai.trx_status_code = 'PROCESSED'
1781          AND tai.khr_id = p_contract_id
1782          AND tld.khr_id = p_contract_id
1783          AND tld.kle_id = NVL(p_line_id, tld.kle_id)
1784          AND ractrl.customer_trx_id = aps.customer_trx_id
1785          AND adj.customer_trx_id = aps.customer_trx_id
1786          AND aps.class = 'INV'
1787          AND adj.status = 'A'
1788          AND adj.apply_date <= NVL(p_due_date, adj.apply_date)
1789          AND tld.sty_id = sty.id
1790          AND sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
1791          AND to_char(tld.id) = ractrl.interface_line_attribute14
1792          AND tld.til_id_details = til.id
1793          AND til.tai_id = tai.id
1794          AND adj.adjustment_id = ad.source_id
1795          AND ad.source_table = 'ADJ'
1796          AND ad.ref_customer_trx_Line_Id = ractrl.customer_trx_line_id
1797        GROUP BY adj.apply_date
1798        ORDER BY receipt_date asc;
1799 -- End - Billing Inline changes - Bug#5898792 - varangan - 23/2/2007
1800 
1801   Cursor rcpt_dtls_actual_strm_csr (p_contract_id NUMBER,
1802                               p_line_id     NUMBER,
1803                               p_start_date  DATE,
1804                               p_due_date    DATE) IS
1805         SELECT sel.stream_element_date receipt_date,
1806                sum(sel.amount) principal_pmt_rcpt_amt
1807         FROM
1808              okl_strm_elements sel
1809              ,okl_streams str
1810              ,okl_strm_type_v sty
1811             WHERE  sel.stm_id = str.id
1812               AND  str.khr_id = p_contract_id
1813               AND  str.kle_id = NVL(p_line_id, str.kle_id)
1814               AND  str.say_code = 'CURR'
1815               AND  str.active_yn = 'Y'
1816               AND  sel.stream_element_date <= NVL(p_due_date, sel.stream_element_date)
1817               AND  str.sty_id = sty.id
1818               AND  sty.stream_type_purpose = 'DAILY_INTEREST_PRINCIPAL'
1819        GROUP BY sel.stream_element_date
1820        ORDER BY receipt_date asc;
1821 
1822 
1823   BEGIN
1824     x_return_status     := OKL_API.G_RET_STS_SUCCESS;
1825 
1826     print_debug('Executing procedure PRIN_DATE_RANGE_VAR_INT_LOAN using following parameters : ');
1827     print_debug(' p_contract_id : '|| p_contract_id );
1828 	print_debug(' p_line_id : '|| p_line_id );
1829     print_debug(' p_start_date : '|| to_char(p_start_date));
1830 	print_debug(' p_due_date : '|| to_char(p_due_date));
1831 	print_debug(' p_principal_basis : '|| p_principal_basis);
1832 
1833 	Initialize_contract_params( p_api_version   => 1.0,
1834                                 p_init_msg_list => OKL_API.G_FALSE,
1835                                 x_return_status => x_return_status,
1836                                 x_msg_count     => x_msg_count,
1837                                 x_msg_data      => x_msg_data,
1838                                 p_contract_id   => p_contract_id
1839                               );
1840     IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
1841 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS completed successfully');
1842     ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
1843   	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
1844   	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
1845        RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1846     ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
1847 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
1848 	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
1849        RAISE prin_date_range_loan_failed;
1850     END IF;
1851 
1852 
1853 	IF (p_principal_basis IS NOT NULL) THEN
1854       l_principal_basis := p_principal_basis;
1855     ELSE
1856       l_principal_basis := G_PRINCIPAL_BASIS_CODE;
1857     END IF;
1858 
1859 
1860     print_debug('principal basis : '||l_principal_basis);
1861 
1862     print_debug('contract start date : '||G_CONTRACT_START_DATE );
1863     print_debug('currency code : '|| G_CURRENCY_CODE);
1864 
1865     IF (l_principal_basis = 'ACTUAL') THEN
1866       IF (p_line_id IS NULL) THEN
1867         get_contract_financed_amount (
1868             p_api_version       => 1.0,
1869             p_init_msg_list     => OKL_API.G_FALSE,
1870             x_return_status     => x_return_status,
1871             x_msg_count         => x_msg_count,
1872             x_msg_data          => x_msg_data,
1873             p_contract_id       => p_contract_id,
1874             x_principal_balance => l_principal_balance);
1875 
1876         IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
1877   	      print_debug ('Procedure GET_CONTRACT_FINANCED_AMOUNT completed successfully');
1878         ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
1879   	      print_debug ('Procedure GET_CONTRACT_FINANCED_AMOUNT returned unexpected error');
1880   	      print_error_message ('Procedure GET_CONTRACT_FINANCED_AMOUNT returned unexpected error');
1881           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1882         ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
1883 	      print_debug ('Procedure GET_CONTRACT_FINANCED_AMOUNT returned exception');
1884 	      print_error_message ('Procedure GET_CONTRACT_FINANCED_AMOUNT returned exception');
1885           RAISE prin_date_range_loan_failed;
1886         END IF;
1887       ELSE
1888         get_asset_financed_amount (
1889             p_api_version       => 1.0,
1890             p_init_msg_list     => OKL_API.G_FALSE,
1891             x_return_status     => x_return_status,
1892             x_msg_count         => x_msg_count,
1893             x_msg_data          => x_msg_data,
1894             p_contract_id       => p_contract_id,
1895             p_line_id           => p_line_id,
1896             x_principal_balance => l_principal_balance);
1897 
1898         IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
1899   	      print_debug ('Procedure GET_ASSET_FINANCED_AMOUNT completed successfully');
1900         ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
1901   	      print_debug ('Procedure GET_ASSET_FINANCED_AMOUNT returned unexpected error');
1902   	      print_error_message ('Procedure GET_ASSET_FINANCED_AMOUNT returned unexpected error');
1903           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
1904         ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
1905 	      print_debug ('Procedure GET_ASSET_FINANCED_AMOUNT returned exception');
1906 	      print_error_message ('Procedure GET_ASSET_FINANCED_AMOUNT returned exception');
1907           RAISE prin_date_range_loan_failed;
1908         END IF;
1909       END IF;
1910     END IF;
1911     print_debug('principal balance : '||l_principal_balance);
1912 
1913     IF (l_principal_basis = 'SCHEDULED') THEN
1914           IF (p_line_id IS NOT NULL) THEN
1915              print_debug('Stream Element Date : '|| to_char(p_start_date));
1916 
1917              --Bug# 12903938: Commented out
1918              --Bug# 12903938: New code start
1919 
1920              -- Fetch the first Principal Balance stream element that falls between Start Date and Due Date
1921              -- If no Principal Balance stream element found for this period or if Principal Balance stream
1922              -- element date is later than Start Date, then fetch the immediately preceeding Principal Balance
1923              -- stream element amount
1924 
1925              l_stream_element_date := NULL;
1926              l_principal_balance   := NULL;
1927              OPEN sch_asset_prin_balance_csr (p_contract_id, p_line_id, p_start_date, p_due_date);
1928              FETCH sch_asset_prin_balance_csr INTO l_stream_element_date, l_principal_balance;
1929              CLOSE sch_asset_prin_balance_csr;
1930 
1931              IF (l_stream_element_date IS NULL) OR
1932                 (l_stream_element_date IS NOT NULL AND l_stream_element_date > p_start_date) THEN
1933 
1934                l_counter := l_counter + 1;
1935                l_principal_balance_tbl(l_counter).khr_id                 := p_contract_id;
1936                l_principal_balance_tbl(l_counter).kle_id                 := p_line_id;
1937                l_principal_balance_tbl(l_counter).from_date              := p_start_date;
1938 
1939                OPEN sch_asset_prin_balance_csr1 (p_contract_id, p_line_id, p_start_date);
1940                FETCH sch_asset_prin_balance_csr1 INTO l_stream_element_date, l_principal_balance_tbl(l_counter).principal_balance;
1941                IF (sch_asset_prin_balance_csr1%NOTFOUND) THEN
1942                  CLOSE sch_asset_prin_balance_csr1;
1943                  print_error_message('Scheduled Asset Principal Balance stream cursor1 did not return records for contract ID :' || p_contract_id);
1944                  RAISE prin_date_range_loan_failed;
1945                END IF;
1946                CLOSE sch_asset_prin_balance_csr1;
1947 
1948              END IF;
1949 
1950              FOR sch_asset_prin_balance_rec IN sch_asset_prin_balance_csr(p_contract_id, p_line_id, p_start_date, p_due_date) LOOP
1951 
1952                 l_counter := l_counter + 1;
1953                 l_principal_balance_tbl(l_counter).khr_id                 := p_contract_id;
1954                 l_principal_balance_tbl(l_counter).kle_id                 := p_line_id;
1955                 l_principal_balance_tbl(l_counter).from_date              := sch_asset_prin_balance_rec.stream_element_date;
1956                 l_principal_balance_tbl(l_counter).principal_balance      := sch_asset_prin_balance_rec.amount;
1957 
1958              END LOOP;
1959              --Bug# 12903938: New code end
1960 
1961           ELSE
1962              print_debug('Stream Element Date : '|| to_char(p_start_date));
1963 
1964              --Bug# 12903938: Commented out
1965              --Bug# 12903938: New code start
1966 
1967              -- Fetch the first Principal Balance stream element that falls between Start Date and Due Date
1968              -- If no Principal Balance stream element found for this period or if Principal Balance stream
1969              -- element date is later than Start Date, then fetch the immediately preceeding Principal Balance
1970              -- stream element amount
1971 
1972              l_stream_element_date := NULL;
1973              l_principal_balance   := NULL;
1974              OPEN sch_ctr_prin_balance_csr (p_contract_id, p_start_date, p_due_date);
1975              FETCH sch_ctr_prin_balance_csr INTO l_stream_element_date, l_principal_balance;
1976              CLOSE sch_ctr_prin_balance_csr;
1977 
1978              IF (l_stream_element_date IS NULL) OR
1979                 (l_stream_element_date IS NOT NULL AND l_stream_element_date > p_start_date) THEN
1980 
1981                l_counter := l_counter + 1;
1982                l_principal_balance_tbl(l_counter).khr_id                 := p_contract_id;
1983                l_principal_balance_tbl(l_counter).kle_id                 := NULL;
1984                l_principal_balance_tbl(l_counter).from_date              := p_start_date;
1985 
1986                OPEN sch_ctr_prin_balance_csr1 (p_contract_id, p_start_date);
1987                FETCH sch_ctr_prin_balance_csr1 INTO l_stream_element_date, l_principal_balance_tbl(l_counter).principal_balance;
1988                IF (sch_ctr_prin_balance_csr1%NOTFOUND) THEN
1989                  CLOSE sch_ctr_prin_balance_csr1;
1990                  print_error_message('Scheduled Contract Principal Balance stream cursor1 did not return records for contract ID :' || p_contract_id);
1991                  RAISE prin_date_range_loan_failed;
1992                END IF;
1993                CLOSE sch_ctr_prin_balance_csr1;
1994 
1995              END IF;
1996 
1997              FOR sch_ctr_prin_balance_rec IN sch_ctr_prin_balance_csr(p_contract_id, p_start_date, p_due_date) LOOP
1998 
1999                 l_counter := l_counter + 1;
2000                 l_principal_balance_tbl(l_counter).khr_id                 := p_contract_id;
2001                 l_principal_balance_tbl(l_counter).kle_id                 := NULL;
2002                 l_principal_balance_tbl(l_counter).from_date              := sch_ctr_prin_balance_rec.stream_element_date;
2003                 l_principal_balance_tbl(l_counter).principal_balance      := sch_ctr_prin_balance_rec.amount;
2004 
2005              END LOOP;
2006              --Bug# 12903938: New code end
2007 
2008           END IF;
2009 
2010           --Bug# 12903938: Commented out
2011           --Bug# 12903938: New code start
2012           FOR i IN l_principal_balance_tbl.FIRST..l_principal_balance_tbl.LAST LOOP
2013             j := i + 1;
2014             IF j <= l_principal_balance_tbl.LAST THEN
2015               l_principal_balance_tbl(i).to_date := l_principal_balance_tbl(j).from_date - 1;
2016             ELSE
2017               l_principal_balance_tbl(i).to_date := p_due_date;
2018             END IF;
2019           END LOOP;
2020           --Bug# 12903938: New code end
2021 
2022     ELSIF (l_principal_basis = 'ACTUAL') THEN
2023 
2024        print_debug('revenue recognition method : '|| G_REVENUE_RECOGNITION_METHOD);
2025        print_debug('Interest calculation basis: '|| G_INTEREST_CALCULATION_BASIS);
2026        l_counter := 0;
2027 
2028 	   IF (G_REVENUE_RECOGNITION_METHOD <> 'ACTUAL') THEN
2029           FOR current_receipt in receipt_details_csr (p_contract_id, p_line_id, G_CONTRACT_START_DATE, p_due_date)
2030           LOOP
2031              l_counter                                       := l_counter + 1;
2032              l_receipt_tbl(l_counter).khr_id                 := p_contract_id;
2033              l_receipt_tbl(l_counter).kle_id                 := p_line_id;
2034              l_receipt_tbl(l_counter).receipt_date           := current_receipt.receipt_date;
2035              l_receipt_tbl(l_counter).principal_pmt_rcpt_amt := current_receipt.principal_pmt_rcpt_amt;
2036              l_receipt_tbl(l_counter).loan_pmt_rcpt_amt      := 0;
2037           END LOOP;
2038        ELSE
2039           FOR current_receipt in rcpt_dtls_actual_strm_csr(p_contract_id, p_line_id, G_CONTRACT_START_DATE, p_due_date)
2040           LOOP
2041              l_counter                                       := l_counter + 1;
2042              l_receipt_tbl(l_counter).khr_id                 := p_contract_id;
2043              l_receipt_tbl(l_counter).kle_id                 := p_line_id;
2044              l_receipt_tbl(l_counter).receipt_date           := current_receipt.receipt_date;
2045              l_receipt_tbl(l_counter).principal_pmt_rcpt_amt := current_receipt.principal_pmt_rcpt_amt;
2046              l_receipt_tbl(l_counter).loan_pmt_rcpt_amt      := 0;
2047           END LOOP;
2048         END IF;
2049 
2050         -- Records before Consolidation
2051         l_counter := 0;
2052         l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2053 
2054 		Print_debug ('Contents of Receipts table before consolidation');
2055 
2056 		FOR l_counter IN 1 .. l_rcpt_tbl_count
2057 		LOOP
2058 		  Print_debug('Record Number : '||l_counter);
2059 		  Print_debug('Contract : '||l_receipt_tbl(l_counter).khr_id);
2060 		  Print_debug('Line : '||l_receipt_tbl(l_counter).kle_id);
2061 		  Print_debug('Receipt Date: '|| l_receipt_tbl(l_counter).receipt_date);
2062 		  Print_debug('Principal Payment: '|| l_receipt_tbl(l_counter).principal_pmt_rcpt_amt);
2063 		  Print_debug(' ');
2064 		END LOOP;
2065 
2066 		-- Consolidate the receipts posted after contract start date
2067         l_counter        := 0;
2068         l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2069         l_previous_receipt_date  := NULL;
2070         lx_receipt_tbl.delete;
2071 
2072         FOR l_receipt_tbl_counter in 1 .. l_rcpt_tbl_count
2073         LOOP
2074           IF (l_receipt_tbl(l_receipt_tbl_counter).receipt_date <= G_CONTRACT_START_DATE) THEN
2075             l_counter                                        := l_counter + 1;
2076             lx_receipt_tbl(l_counter).khr_id                 := l_receipt_tbl(l_receipt_tbl_counter).khr_id;
2077             lx_receipt_tbl(l_counter).kle_id                 := l_receipt_tbl(l_receipt_tbl_counter).kle_id;
2078             lx_receipt_tbl(l_counter).receipt_date           := l_receipt_tbl(l_receipt_tbl_counter).receipt_date;
2079             lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2080             lx_receipt_tbl(l_counter).loan_pmt_rcpt_amt      := l_receipt_tbl(l_receipt_tbl_counter).loan_pmt_rcpt_amt;
2081           ELSE
2082             IF (l_receipt_tbl(l_receipt_tbl_counter).receipt_date = l_previous_receipt_date ) THEN
2083               lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt + l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2084               lx_receipt_tbl(l_counter).loan_pmt_rcpt_amt      := lx_receipt_tbl(l_counter).loan_pmt_rcpt_amt + l_receipt_tbl(l_receipt_tbl_counter).loan_pmt_rcpt_amt;
2085             ELSE
2086               l_counter                                        := l_counter + 1;
2087               lx_receipt_tbl(l_counter).khr_id                 := l_receipt_tbl(l_receipt_tbl_counter).khr_id;
2088               lx_receipt_tbl(l_counter).kle_id                 := l_receipt_tbl(l_receipt_tbl_counter).kle_id;
2089               lx_receipt_tbl(l_counter).receipt_date           := l_receipt_tbl(l_receipt_tbl_counter).receipt_date;
2090               lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2091               lx_receipt_tbl(l_counter).loan_pmt_rcpt_amt      := l_receipt_tbl(l_receipt_tbl_counter).loan_pmt_rcpt_amt;
2092               l_previous_receipt_date :=  lx_receipt_tbl(l_counter).receipt_date;
2093             END IF;
2094           END IF;
2095         END LOOP;
2096         l_receipt_tbl := lx_receipt_tbl;
2097 
2098 
2099         -- Records after Consolidation
2100         l_counter := 0;
2101         l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2102 
2103 		Print_debug ('Contents of Receipts table after consolidation');
2104 
2105 		FOR l_counter IN 1 .. l_rcpt_tbl_count
2106 		LOOP
2107 		  Print_debug('Record Number : '||l_counter);
2108 		  Print_debug('Contract : '||l_receipt_tbl(l_counter).khr_id);
2109 		  Print_debug('Line : '||l_receipt_tbl(l_counter).kle_id);
2110 		  Print_debug('Receipt Date: '|| l_receipt_tbl(l_counter).receipt_date);
2111 		  Print_debug('Principal Payment: '|| l_receipt_tbl(l_counter).principal_pmt_rcpt_amt);
2112 		  Print_debug(' ');
2113 		END LOOP;
2114 
2115         -- Process the receipts
2116         l_counter        := 0;
2117         l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2118         lx_receipt_tbl.delete;
2119 
2120         FOR l_receipt_tbl_counter in 1 .. l_rcpt_tbl_count
2121         LOOP
2122           IF (l_receipt_tbl(l_receipt_tbl_counter).receipt_date <= G_CONTRACT_START_DATE) THEN
2123               l_principal_balance := l_principal_balance - l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2124           ELSE
2125             l_counter                                        := l_counter + 1;
2126             lx_receipt_tbl(l_counter).khr_id                 := l_receipt_tbl(l_receipt_tbl_counter).khr_id;
2127             lx_receipt_tbl(l_counter).kle_id                 := l_receipt_tbl(l_receipt_tbl_counter).kle_id;
2128             lx_receipt_tbl(l_counter).receipt_date           := l_receipt_tbl(l_receipt_tbl_counter).receipt_date;
2129             lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2130             lx_receipt_tbl(l_counter).loan_pmt_rcpt_amt      := l_receipt_tbl(l_receipt_tbl_counter).loan_pmt_rcpt_amt;
2131           END IF;
2132         END LOOP;
2133 
2134        l_receipt_tbl    := lx_receipt_tbl;
2135        l_start_date     := G_CONTRACT_START_DATE;
2136        l_counter        := 0;
2137        l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2138 
2139        print_debug('No. of Consolidated Receipts after contract start date: '|| l_rcpt_tbl_count);
2140 
2141        IF (l_rcpt_tbl_count > 0) THEN
2142           l_rcpt_tbl_index := l_receipt_tbl.FIRST;
2143        END IF;
2144 
2145        FOR l_rcpt_tbl_counter in 1 .. l_rcpt_tbl_count
2146        LOOP
2147           l_counter := l_counter + 1;
2148           l_principal_balance_tbl(l_counter).khr_id := p_contract_id;
2149           IF (p_line_id IS NOT NULL) THEN
2150              l_principal_balance_tbl(l_counter).kle_id := p_line_id;
2151           ELSE
2152              l_principal_balance_tbl(l_counter).kle_id := NULL;
2153           END IF;
2154 
2155           l_principal_balance_tbl(l_counter).from_date := l_start_date;
2156 
2157           l_receipt_date := l_receipt_tbl(l_rcpt_tbl_index).receipt_date;
2158 
2159           l_principal_balance_tbl(l_counter).to_date   := l_receipt_tbl(l_rcpt_tbl_index).receipt_date - 1;
2160           l_principal_balance_tbl(l_counter).principal_balance := l_principal_balance;
2161           l_principal_balance := l_principal_balance - l_receipt_tbl(l_rcpt_tbl_index).principal_pmt_rcpt_amt;
2162           l_start_date := l_receipt_tbl(l_rcpt_tbl_index).receipt_date;
2163           l_rcpt_tbl_index := l_receipt_tbl.NEXT(l_rcpt_tbl_index);
2164 
2165        END LOOP;
2166 
2167        l_counter := l_counter + 1;
2168        l_principal_balance_tbl(l_counter).khr_id := p_contract_id;
2169        IF (p_line_id IS NOT NULL) THEN
2170           l_principal_balance_tbl(l_counter).kle_id := p_line_id;
2171        ELSE
2172           l_principal_balance_tbl(l_counter).kle_id := NULL;
2173        END IF;
2174        l_principal_balance_tbl(l_counter).from_date := l_start_date;
2175        l_principal_balance_tbl(l_counter).to_date   := p_due_date;
2176        l_principal_balance_tbl(l_counter).principal_balance := l_principal_balance;
2177 
2178     END IF;
2179 
2180     l_counter := l_principal_balance_tbl.first;
2181     LOOP
2182       EXIT WHEN l_counter IS NULL;
2183       IF ((p_start_date >= l_principal_balance_tbl(l_counter).from_date AND p_start_date <= l_principal_balance_tbl(l_counter).to_date) OR
2184           (p_due_date >= l_principal_balance_tbl(l_counter).from_date AND p_due_date <= l_principal_balance_tbl(l_counter).to_date) OR
2185           (l_principal_balance_tbl(l_counter).from_date >= p_start_date AND l_principal_balance_tbl(l_counter).to_date <= p_due_date)) THEN
2186         l_counter_tmp := l_counter_tmp + 1;
2187         l_principal_balance_tbl_tmp(l_counter_tmp) := l_principal_balance_tbl(l_counter);
2188         l_principal_balance_tbl_tmp(l_counter_tmp).from_date := GREATEST(l_principal_balance_tbl_tmp(l_counter_tmp).from_date, p_start_date);
2189         l_principal_balance_tbl_tmp(l_counter_tmp).to_date := LEAST(l_principal_balance_tbl_tmp(l_counter_tmp).to_date, p_due_date);
2190       END IF;
2191       l_counter := l_principal_balance_tbl.next(l_counter);
2192     END LOOP;
2193 
2194     x_principal_balance_tbl := l_principal_balance_tbl_tmp;
2195 
2196     print_principal_date_range_tbl (x_principal_balance_tbl);
2197 
2198   EXCEPTION
2199      WHEN prin_date_range_loan_failed THEN
2200        print_error_message('prin_date_range_loan_failed Exception Raised in procedure PRIN_DATE_RANGE_VAR_INT_LOAN ');
2201        x_return_status := OKL_API.G_RET_STS_ERROR;
2202      WHEN OTHERS THEN
2203        print_error_message('Exception Raised in procedure PRIN_DATE_RANGE_VAR_INT_LOAN ');
2204        Okl_Api.SET_MESSAGE(
2205                p_app_name     => G_APP_NAME,
2206                p_msg_name     => G_UNEXPECTED_ERROR,
2207                p_token1       => G_SQLCODE_TOKEN,
2208                p_token1_value => SQLCODE,
2209                p_token2       => G_SQLERRM_TOKEN,
2210                p_token2_value => SQLERRM);
2211        x_return_status := OKL_API.G_RET_STS_ERROR;
2212   END prin_date_range_var_int_loan;
2213 
2214 ------------------------------------------------------------------------------
2215 
2216     -- Start of Comments
2217     -- Created By:       Ramesh Seela
2218     -- Procedure Name    prin_date_range_var_int_rloan
2219     -- Description:      This procedure is called by Variable Interest Calculation for Revolving Loans
2220     --                   Returns a PL/SQL table of records with following entries Start Date, End Date,
2221     --                   and Principal Balance
2222     -- Dependencies:
2223     -- Parameters:       contract id, date.
2224     -- Version:          1.0
2225     -- End of Comments
2226 
2227   ------------------------------------------------------------------------------
2228   PROCEDURE prin_date_range_var_int_rloan (
2229             p_api_version        IN  NUMBER,
2230             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
2231             x_return_status      OUT NOCOPY VARCHAR2,
2232             x_msg_count          OUT NOCOPY NUMBER,
2233             x_msg_data           OUT NOCOPY VARCHAR2,
2234             p_contract_id        IN  NUMBER,
2235             p_line_id            IN  NUMBER,
2236             p_start_date         IN DATE,
2237             p_due_date           IN  DATE,
2238             x_principal_balance_tbl OUT NOCOPY principal_balance_tbl_typ)   IS
2239 
2240   l_api_name                    CONSTANT    VARCHAR2(30) := 'PRIN_DATE_RANGE_VAR_INT_RLOAN';
2241   l_api_version                 CONSTANT    NUMBER       := 1.0;
2242   l_principal_balance_tbl       principal_balance_tbl_typ ;
2243   l_principal_balance_tbl_tmp   principal_balance_tbl_typ ;
2244 --  l_contract_start_date         DATE;
2245   l_start_date                  DATE;
2246   l_principal_balance           NUMBER;
2247   l_counter                     NUMBER := 0;
2248   l_counter_tmp                 NUMBER := 0;
2249 --  l_currency_code               OKL_K_HEADERS_FULL_V.currency_code%TYPE;
2250 --  l_revenue_recognition         OKL_PRODUCT_PARAMETERS_V.revenue_recognition_method%TYPE;
2251   l_current_txn_date            DATE;
2252   prin_date_range_rloan_failed EXCEPTION;
2253   l_receipt_tbl                receipt_tbl_type;
2254   lx_receipt_tbl               receipt_tbl_type;
2255   l_previous_receipt_date      DATE;
2256   l_rcpt_tbl_count             NUMBER := 0;
2257   l_rcpt_tbl_counter           NUMBER := 0;
2258 
2259   -- sjalasut, modified the cursor to have khr_id referred from
2260   -- okl_txl_ap_inv_lns_all_b
2261   Cursor pymt_rcpt_actual_var_int_csr (p_contract_id    NUMBER,
2262                                        p_due_date       DATE) IS
2263     SELECT iph.check_date txn_date,
2264            sum(iph.amount) txn_amount,
2265            'P' txn_type
2266     FROM ap_invoices_all ap_inv,
2267          okl_trx_ap_invoices_v okl_inv,
2268          ap_invoice_payment_history_v iph
2269          ,okl_cnsld_ap_invs_all cnsld
2270          ,okl_txl_ap_inv_lns_all_b okl_inv_ln
2271          ,fnd_application fnd_app
2272     WHERE okl_inv.id = okl_inv_ln.tap_id
2273       AND okl_inv_ln.khr_id = p_contract_id
2274       AND ap_inv.application_id = fnd_app.application_id
2275       AND fnd_app.application_short_name = 'OKL'
2276       AND okl_inv_ln.cnsld_ap_inv_id = cnsld.cnsld_ap_inv_id
2277       AND cnsld.cnsld_ap_inv_id = to_number(ap_inv.reference_key1)
2278       AND okl_inv.funding_type_code = 'BORROWER_PAYMENT'
2279       AND ap_inv.invoice_id = iph.invoice_id
2280       AND iph.check_date <= NVL(p_due_date, iph.check_date)
2281     GROUP BY iph.check_date
2282 UNION
2283         SELECT sel.stream_element_date txn_date,
2284                sum(sel.amount) txn_amount,
2285                'R' txn_type
2286         FROM
2287              okl_strm_elements sel
2288              ,okl_streams str
2289              ,okl_strm_type_v sty
2290             WHERE  sel.stm_id = str.id
2291               AND  str.khr_id = p_contract_id
2292               AND  str.say_code = 'CURR'
2293               AND  str.active_yn = 'Y'
2294               AND  sel.stream_element_date <= NVL(p_due_date, sel.stream_element_date)
2295               AND  str.sty_id = sty.id
2296               AND  sty.stream_type_purpose = 'DAILY_INTEREST_PRINCIPAL'
2297        GROUP BY sel.stream_element_date
2298     ORDER BY txn_date asc, txn_type;
2299 
2300   -- sjalasut, modified the cursor to have khr_id referred from okl_txl_Ap_inv_lns_all_b
2301   -- Begin - Billing Inline changes - Bug#5898792 - varangan - 23/2/2007
2302 
2303     --Bug# 14179413: Include Credit Memos and Adjustments when calculating
2304     --               Actual Principal Balance
2305     Cursor pymt_rcpt_est_bill_var_int_csr (p_contract_id    NUMBER,
2306                                          p_due_date       DATE) IS
2307     SELECT iph.check_date txn_date,
2308            sum(iph.amount) txn_amount,
2309            'P' txn_type
2310     FROM ap_invoices_all ap_inv,
2311          okl_trx_ap_invoices_v okl_inv,
2312          ap_invoice_payment_history_v iph
2313          ,okl_cnsld_ap_invs_all cnsld
2314          ,okl_txl_ap_inv_lns_all_b okl_inv_ln
2315          ,fnd_application fnd_app
2316     WHERE okl_inv.id = okl_inv_ln.tap_id
2317       AND okl_inv_ln.khr_id = p_contract_id
2318       AND ap_inv.application_id = fnd_app.application_id
2319       AND fnd_app.application_short_name = 'OKL'
2320       AND okl_inv_ln.cnsld_ap_inv_id = cnsld.cnsld_ap_inv_id
2321       AND cnsld.cnsld_ap_inv_id = to_number(ap_inv.reference_key1)
2322       AND okl_inv.funding_type_code = 'BORROWER_PAYMENT'
2323       AND ap_inv.invoice_id = iph.invoice_id
2324       AND iph.check_date <= NVL(p_due_date, iph.check_date)
2325     GROUP BY iph.check_date
2326 UNION ALL
2327     SELECT cra.receipt_date txn_date,
2328            sum(raa.line_applied) txn_amount, -- 4884843, 4872370
2329            'R' txn_type
2330     FROM   okl_bpd_tld_ar_lines_v tld,
2331            ar_payment_schedules_all aps,
2332            ar_receivable_applications_all raa,
2333            ar_cash_receipts_all cra,
2334            okl_strm_type_v sty
2335     WHERE  tld.trx_status_code = 'PROCESSED'
2336       AND  tld.khr_id = NVL(p_contract_id, tld.khr_id)
2337       AND  tld.customer_trx_id = aps.customer_trx_id
2338       AND  raa.applied_customer_trx_id = aps.customer_trx_id
2339       AND  aps.class = 'INV'
2340       AND  raa.application_type = 'CASH'
2341       AND  raa.status = 'APP'
2342       AND  raa.display = 'Y'
2343       AND  cra.receipt_date <= NVL(p_due_date, cra.receipt_date)
2344       AND  raa.cash_receipt_id = cra.cash_receipt_id
2345       AND  tld.sty_id = sty.id
2346       AND  sty.stream_type_purpose = 'UNSCHEDULED_PRINCIPAL_PAYMENT'
2347     GROUP BY cra.receipt_date
2348 UNION ALL
2349     SELECT cm.trx_date txn_date,
2350            sum(raa.line_applied) txn_amount,
2351            'R' txn_type
2352     FROM   okl_bpd_tld_ar_lines_v tld,
2353            ar_payment_schedules_all aps,
2354            ar_receivable_applications_all raa,
2355            ra_customer_trx_all cm,
2356            okl_strm_type_v sty
2357     WHERE  tld.trx_status_code = 'PROCESSED'
2358       AND  tld.khr_id = NVL(p_contract_id, tld.khr_id)
2359       AND  tld.customer_trx_id = aps.customer_trx_id
2360       AND  raa.applied_customer_trx_id = aps.customer_trx_id
2361       AND  aps.class = 'INV'
2362       AND  raa.application_type = 'CM'
2363       AND  raa.status = 'APP'
2364       AND raa.display = 'Y'
2365       AND  cm.trx_date <= NVL(p_due_date, cm.trx_date)
2366       AND  raa.customer_trx_id = cm.customer_trx_id
2367       AND  tld.sty_id = sty.id
2368       AND  sty.stream_type_purpose = 'UNSCHEDULED_PRINCIPAL_PAYMENT'
2369     GROUP BY cm.trx_date
2370 UNION ALL
2371     SELECT adj.apply_date  txn_date,
2372            sum( -1 * NVL(adj.amount,0)) txn_amount,
2373            'R' txn_type
2374     FROM   okl_bpd_tld_ar_lines_v tld,
2375            ar_payment_schedules_all aps,
2376            ar_adjustments_all adj,
2377            okl_strm_type_v sty
2378     WHERE  tld.trx_status_code = 'PROCESSED'
2379       AND  tld.khr_id = NVL(p_contract_id, tld.khr_id)
2380       AND  tld.customer_trx_id = aps.customer_trx_id
2381       AND  adj.customer_trx_id = aps.customer_trx_id
2382       AND  aps.class = 'INV'
2383       AND  adj.status = 'A'
2384       AND  adj.apply_date <= NVL(p_due_date, adj.apply_date)
2385       AND  tld.sty_id = sty.id
2386       AND  sty.stream_type_purpose = 'UNSCHEDULED_PRINCIPAL_PAYMENT'
2387      GROUP BY adj.apply_date
2388     ORDER BY txn_date asc, txn_type;
2389 -- End - Billing Inline changes - Bug#5898792 - varangan - 23/2/2007
2390 
2391 
2392   BEGIN
2393     x_return_status     := OKL_API.G_RET_STS_SUCCESS;
2394 
2395     print_debug('Executing procedure PRIN_DATE_RANGE_VAR_INT_RLOAN using following parameters : ');
2396     print_debug(' p_contract_id : '|| p_contract_id);
2397 	print_debug(' p_line_id : '|| p_line_id );
2398 	print_debug(' p_due_date : '|| to_char(p_due_date));
2399 
2400 	Initialize_contract_params( p_api_version   => 1.0,
2401                                 p_init_msg_list => OKL_API.G_FALSE,
2402                                 x_return_status => x_return_status,
2403                                 x_msg_count     => x_msg_count,
2404                                 x_msg_data      => x_msg_data,
2405                                 p_contract_id   => p_contract_id
2406                               );
2407     IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
2408 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS completed successfully');
2409     ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
2410   	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
2411   	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
2412        RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2413     ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
2414 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
2415 	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
2416        RAISE prin_date_range_rloan_failed;
2417     END IF;
2418 
2419     print_debug('contract start date : '||G_CONTRACT_START_DATE );
2420     print_debug('currency code : '|| G_CURRENCY_CODE);
2421     print_debug ('Revenue Recognition method : '|| G_REVENUE_RECOGNITION_METHOD);
2422 
2423     l_counter              := 0;
2424 
2425     IF (G_REVENUE_RECOGNITION_METHOD = 'ACTUAL') THEN
2426       FOR current_txn in pymt_rcpt_actual_var_int_csr (p_contract_id, p_due_date)
2427       LOOP
2428         l_counter                                       := l_counter + 1;
2429         l_receipt_tbl(l_counter).khr_id                 := p_contract_id;
2430         l_receipt_tbl(l_counter).kle_id                 := NULL;
2431         l_receipt_tbl(l_counter).receipt_date           := current_txn.txn_date;
2432         l_receipt_tbl(l_counter).transaction_type       := current_txn.txn_type;
2433         l_receipt_tbl(l_counter).principal_pmt_rcpt_amt := current_txn.txn_amount;
2434         l_receipt_tbl(l_counter).loan_pmt_rcpt_amt      := 0;
2435       END LOOP;
2436     ELSE
2437       FOR current_txn in pymt_rcpt_est_bill_var_int_csr (p_contract_id, p_due_date)
2438       LOOP
2439         l_counter                                       := l_counter + 1;
2440         l_receipt_tbl(l_counter).khr_id                 := p_contract_id;
2441         l_receipt_tbl(l_counter).kle_id                 := NULL;
2442         l_receipt_tbl(l_counter).receipt_date           := current_txn.txn_date;
2443         l_receipt_tbl(l_counter).transaction_type       := current_txn.txn_type;
2444         l_receipt_tbl(l_counter).principal_pmt_rcpt_amt := current_txn.txn_amount;
2445         l_receipt_tbl(l_counter).loan_pmt_rcpt_amt      := 0;
2446       END LOOP;
2447     END IF;
2448 
2449     l_counter        := 0;
2450     l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2451 
2452     Print_debug ('Contents of Receipts table before consolidation');
2453 
2454 	FOR l_counter IN 1 .. l_rcpt_tbl_count
2455 	LOOP
2456 	  Print_debug('Record Number : '||l_counter);
2457 	  Print_debug('Contract : '||l_receipt_tbl(l_counter).khr_id);
2458 	  Print_debug('Receipt Date: '|| l_receipt_tbl(l_counter).receipt_date);
2459 	  Print_debug('Type : '|| l_receipt_tbl(l_counter).transaction_type);
2460 	  Print_debug('Principal Payment: '|| l_receipt_tbl(l_counter).principal_pmt_rcpt_amt);
2461 	  Print_debug(' ');
2462 	END LOOP;
2463 
2464 	-- Consolidate the receipts posted after contract start date
2465     l_counter        := 0;
2466     l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2467     l_previous_receipt_date  := NULL;
2468     lx_receipt_tbl.delete;
2469 
2470     FOR l_receipt_tbl_counter in 1 .. l_rcpt_tbl_count
2471     LOOP
2472       IF (l_receipt_tbl(l_receipt_tbl_counter).receipt_date <= G_CONTRACT_START_DATE) THEN
2473         l_counter                                        := 1;
2474         lx_receipt_tbl(l_counter).khr_id                 := l_receipt_tbl(l_receipt_tbl_counter).khr_id;
2475         lx_receipt_tbl(l_counter).receipt_date           := G_CONTRACT_START_DATE;
2476         IF (l_receipt_tbl(l_receipt_tbl_counter).transaction_type = 'P') THEN
2477           IF (nvl(lx_receipt_tbl(l_counter).transaction_type, 'P') = 'P') THEN
2478             lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := nvl(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt,0) + l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2479           ELSE
2480             lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := -1 * nvl(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt,0) + l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2481           END IF;
2482         ELSE -- 'R'
2483           IF (nvl(lx_receipt_tbl(l_counter).transaction_type, 'P') = 'P') THEN
2484             lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := nvl(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt,0) - l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2485           ELSE
2486             lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := -1 * nvl(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt,0) - l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2487           END IF;
2488         END IF;
2489 
2490 		IF (lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt > 0) THEN
2491 		  lx_receipt_tbl(l_counter).transaction_type := 'P';
2492 		ELSE
2493 		  lx_receipt_tbl(l_counter).transaction_type := 'R';
2494 		  lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := abs(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt);
2495 		END IF;
2496       ELSE  -- receipt date > contract start date
2497         IF (l_receipt_tbl(l_receipt_tbl_counter).receipt_date = l_previous_receipt_date ) THEN
2498           IF (l_receipt_tbl(l_receipt_tbl_counter).transaction_type = 'P') THEN
2499             IF (nvl(lx_receipt_tbl(l_counter).transaction_type, 'P') = 'P') THEN
2500               lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := nvl(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt,0) + l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2501             ELSE
2502               lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := -1 * nvl(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt,0) + l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2503             END IF;
2504           ELSE -- transaction type = 'R'
2505             IF (nvl(lx_receipt_tbl(l_counter).transaction_type, 'P') = 'P') THEN
2506               lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := nvl(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt,0) - l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2507             ELSE
2508               lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := -1 * nvl(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt,0) - l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2509             END IF;
2510           END IF;
2511 
2512 		  IF (lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt > 0) THEN
2513 		    lx_receipt_tbl(l_counter).transaction_type := 'P';
2514 		  ELSE
2515 		    lx_receipt_tbl(l_counter).transaction_type := 'R';
2516 		    lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := abs(lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt);
2517 		  END IF;
2518         ELSE  -- receipt date <> previous receipt date
2519           l_counter                                        := l_counter + 1;
2520           lx_receipt_tbl(l_counter).khr_id                 := l_receipt_tbl(l_receipt_tbl_counter).khr_id;
2521           lx_receipt_tbl(l_counter).receipt_date           := l_receipt_tbl(l_receipt_tbl_counter).receipt_date;
2522           lx_receipt_tbl(l_counter).transaction_type       := l_receipt_tbl(l_receipt_tbl_counter).transaction_type;
2523           lx_receipt_tbl(l_counter).principal_pmt_rcpt_amt := l_receipt_tbl(l_receipt_tbl_counter).principal_pmt_rcpt_amt;
2524           l_previous_receipt_date :=  lx_receipt_tbl(l_counter).receipt_date;
2525         END IF;
2526       END IF;
2527     END LOOP;
2528     l_receipt_tbl := lx_receipt_tbl;
2529 
2530     l_counter        := 0;
2531     l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2532 
2533     Print_debug ('Contents of Receipts table after consolidation');
2534 
2535 	FOR l_counter IN 1 .. l_rcpt_tbl_count
2536 	LOOP
2537 	  Print_debug('Record Number : '||l_counter);
2538 	  Print_debug('Contract : '||l_receipt_tbl(l_counter).khr_id);
2539 	  Print_debug('Receipt Date: '|| l_receipt_tbl(l_counter).receipt_date);
2540 	  Print_debug('Type : '|| l_receipt_tbl(l_counter).transaction_type);
2541 	  Print_debug('Principal Payment: '|| l_receipt_tbl(l_counter).principal_pmt_rcpt_amt);
2542 	  Print_debug(' ');
2543 	END LOOP;
2544 
2545     l_counter              := 0;
2546     l_start_date           := G_CONTRACT_START_DATE;
2547     l_principal_balance    := 0;
2548     l_current_txn_date     := NULL;
2549     l_rcpt_tbl_count := l_receipt_tbl.COUNT;
2550 
2551     FOR l_rcpt_tbl_counter IN 1 .. l_rcpt_tbl_count
2552     LOOP
2553       l_current_txn_date := l_receipt_tbl(l_rcpt_tbl_counter).receipt_date;
2554       IF (l_current_txn_date > G_CONTRACT_START_DATE) THEN
2555         l_counter          := l_counter + 1;
2556 --        l_current_txn_date := l_receipt_tbl(l_rcpt_tbl_counter).receipt_date;
2557         l_principal_balance_tbl(l_counter).khr_id     := p_contract_id;
2558         l_principal_balance_tbl(l_counter).kle_id     := NULL;
2559         l_principal_balance_tbl(l_counter).from_date := l_start_date;
2560         l_principal_balance_tbl(l_counter).to_date   := l_current_txn_date - 1;
2561         l_principal_balance_tbl(l_counter).principal_balance      := l_principal_balance;
2562         l_start_date := l_current_txn_date;
2563 
2564         IF (l_receipt_tbl(l_rcpt_tbl_counter).transaction_type = 'P') THEN
2565           l_principal_balance := l_principal_balance + l_receipt_tbl(l_rcpt_tbl_counter).principal_pmt_rcpt_amt;
2566         ELSE
2567           l_principal_balance := l_principal_balance - l_receipt_tbl(l_rcpt_tbl_counter).principal_pmt_rcpt_amt;
2568         END IF;
2569         print_debug ('l_principal_balance_tbl(l_counter).khr_id : '|| l_principal_balance_tbl(l_counter).khr_id);
2570         print_debug ('l_principal_balance_tbl(l_counter).from_date : '|| l_principal_balance_tbl(l_counter).from_date);
2571         print_debug ('l_principal_balance_tbl(l_counter).to_date : '|| l_principal_balance_tbl(l_counter).to_date);
2572         print_debug ('l_principal_balance_tbl(l_counter).principal_balance : '|| l_principal_balance_tbl(l_counter).principal_balance);
2573 
2574       ELSE
2575         l_principal_balance := l_principal_balance + l_receipt_tbl(l_rcpt_tbl_counter).principal_pmt_rcpt_amt;
2576       END IF;
2577 
2578     END LOOP;
2579 
2580     l_counter                                              := l_counter + 1;
2581     l_principal_balance_tbl(l_counter).khr_id              := p_contract_id;
2582     l_principal_balance_tbl(l_counter).kle_id              := NULL;
2583     l_principal_balance_tbl(l_counter).from_date           := l_start_date;
2584     l_principal_balance_tbl(l_counter).to_date             := p_due_date;
2585     l_principal_balance_tbl(l_counter).principal_balance   := l_principal_balance;
2586 
2587     print_debug ('l_principal_balance_tbl(l_counter).khr_id : '|| l_principal_balance_tbl(l_counter).khr_id);
2588     print_debug ('l_principal_balance_tbl(l_counter).from_date : '|| l_principal_balance_tbl(l_counter).from_date);
2589     print_debug ('l_principal_balance_tbl(l_counter).to_date : '|| l_principal_balance_tbl(l_counter).to_date);
2590     print_debug ('l_principal_balance_tbl(l_counter).principal_balance : '|| l_principal_balance_tbl(l_counter).principal_balance);
2591 
2592 
2593     l_counter := l_principal_balance_tbl.first;
2594     LOOP
2595       EXIT WHEN l_counter IS NULL;
2596       IF ((p_start_date >= l_principal_balance_tbl(l_counter).from_date AND p_start_date <= l_principal_balance_tbl(l_counter).to_date) OR
2597           (p_due_date >= l_principal_balance_tbl(l_counter).from_date AND p_due_date <= l_principal_balance_tbl(l_counter).to_date) OR
2598           (l_principal_balance_tbl(l_counter).from_date >= p_start_date AND l_principal_balance_tbl(l_counter).to_date <= p_due_date)) THEN
2599         l_counter_tmp := l_counter_tmp + 1;
2600         l_principal_balance_tbl_tmp(l_counter_tmp) := l_principal_balance_tbl(l_counter);
2601         l_principal_balance_tbl_tmp(l_counter_tmp).from_date := GREATEST(l_principal_balance_tbl_tmp(l_counter_tmp).from_date, p_start_date);
2602         l_principal_balance_tbl_tmp(l_counter_tmp).to_date := LEAST(l_principal_balance_tbl_tmp(l_counter_tmp).to_date, p_due_date);
2603       END IF;
2604       l_counter := l_principal_balance_tbl.next(l_counter);
2605     END LOOP;
2606 
2607     x_principal_balance_tbl := l_principal_balance_tbl_tmp;
2608 
2609     print_principal_date_range_tbl (x_principal_balance_tbl);
2610 
2611   EXCEPTION
2612      WHEN prin_date_range_rloan_failed THEN
2613        print_error_message('print_date_range_rloan_failed Exception raised inside procedure PRIN_DATE_RANGE_VAR_INT_RLOAN');
2614        x_return_status := OKL_API.G_RET_STS_ERROR;
2615 
2616      WHEN OTHERS THEN
2617        print_error_message('Exception raised inside procedure PRIN_DATE_RANGE_VAR_INT_RLOAN');
2618        Okl_Api.SET_MESSAGE(
2619                p_app_name     => G_APP_NAME,
2620                p_msg_name     => G_UNEXPECTED_ERROR,
2621                p_token1       => G_SQLCODE_TOKEN,
2622                p_token1_value => SQLCODE,
2623                p_token2       => G_SQLERRM_TOKEN,
2624                p_token2_value => SQLERRM);
2625 
2626        x_return_status := OKL_API.G_RET_STS_ERROR;
2627 
2628   END prin_date_range_var_int_rloan;
2629 
2630   ------------------------------------------------------------------------------
2631 
2632     -- Start of Comments
2633     -- Created By:       Ramesh Seela
2634     -- Procedure Name    prin_date_range_var_int_rl_old
2635     -- Description:      This procedure is called by Variable Interest Calculation for Revolving Loans
2636     --                   Returns a PL/SQL table of records with following entries Start Date, End Date,
2637     --                   and Principal Balance
2638     -- Dependencies:
2639     -- Parameters:       contract id, date.
2640     -- Version:          1.0
2641     --                   2.0 - Obsoleted this local procedure as part of Billing Inline changes- Bug#5898792 - varangan - 23/2/2007
2642     -- End of Comments
2643 
2644 ------------------------------------------------------------------------------
2645 
2646 ------------------------------------------------------------------------------
2647     -- Start of Comments
2648     -- Created By:       Ramesh Seela
2649     -- Procedure Name    prin_date_range_var_rate_ctr
2650     -- Description:      This procedure is called by Variable Interest Calculation
2651     --                   Returns a PL/SQL table of records with following entries Start Date, End Date,
2652     --                   and Principal Balance
2653     -- Dependencies:
2654     -- Parameters:
2655     -- Version:          1.0
2656     -- End of Comments
2657 
2658   ------------------------------------------------------------------------------
2659   PROCEDURE prin_date_range_var_rate_ctr (
2660             p_api_version        IN  NUMBER,
2661             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
2662             x_return_status      OUT NOCOPY VARCHAR2,
2663             x_msg_count          OUT NOCOPY NUMBER,
2664             x_msg_data           OUT NOCOPY VARCHAR2,
2665             p_contract_id        IN  NUMBER,
2666             p_line_id            IN  NUMBER,
2667             p_start_date         IN  DATE,
2668             p_due_date           IN  DATE,
2669             p_principal_basis    IN  VARCHAR2 DEFAULT NULL,
2670             x_principal_balance_tbl OUT NOCOPY  principal_balance_tbl_typ)   IS
2671 
2672   l_api_name               CONSTANT    VARCHAR2(30) := 'PRIN_DATE_RANGE_VAR_RATE_CTR';
2673   l_api_version            CONSTANT    NUMBER       := 1.0;
2674   r_principal_balance_tbl  principal_balance_tbl_typ ;
2675   l_deal_type              OKL_K_HEADERS_FULL_V.deal_type%TYPE;
2676   prin_date_range_failed   EXCEPTION;
2677 
2678 
2679   Cursor contract_csr (p_contract_id NUMBER) IS
2680       SELECT deal_type
2681       FROM   okl_k_headers_full_v
2682       WHERE  id = p_contract_id;
2683 
2684 
2685   BEGIN
2686     x_return_status     := OKL_API.G_RET_STS_SUCCESS;
2687 
2688     print_debug('Executing procedure PRIN_DATE_RANGE_VAR_RATE_CTR using following parameters : ');
2689     print_debug(' p_contract_id : '|| p_contract_id );
2690 	print_debug(' p_line_id : '|| p_line_id );
2691 	print_debug(' p_start_date : '|| to_char(p_start_date));
2692 	print_debug(' p_due_date : '|| to_char(p_due_date));
2693 
2694 	print_debug(' G_CONTRACT_ID : '|| G_CONTRACT_ID );
2695 
2696     IF (p_contract_id = G_CONTRACT_ID) THEN
2697       l_deal_type := G_DEAL_TYPE;
2698     ELSE
2699       OPEN contract_csr (p_contract_id);
2700       FETCH contract_csr INTO l_deal_type;
2701       IF (contract_csr%NOTFOUND) THEN
2702         CLOSE contract_csr;
2703         print_error_message('Contract cursor did not return records for contract ID :' || p_contract_id);
2704         RAISE prin_date_range_failed;
2705       END IF;
2706       CLOSE contract_csr;
2707     END IF;
2708 
2709     print_debug('deal type : '|| l_deal_type);
2710 
2711     IF (l_deal_type = 'LOAN') THEN
2712        prin_date_range_var_int_loan (
2713                                      p_api_version           => 1.0,
2714                                      p_init_msg_list         => OKL_API.G_FALSE,
2715                                      x_return_status         => x_return_status,
2716                                      x_msg_count             => x_msg_count,
2717                                      x_msg_data              => x_msg_data,
2718                                      p_contract_id           => p_contract_id,
2719                                      p_line_id               => p_line_id,
2720                                      p_start_date            => p_start_date,
2721                                      p_due_date              => p_due_date,
2722                                      p_principal_basis       => p_principal_basis,
2723                                      x_principal_balance_tbl => r_principal_balance_tbl);
2724 
2725        IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
2726          print_error_message('Unexpected error raised in call to PRIN_DATE_RANGE_VAR_INT_LOAN');
2727          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2728        ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
2729          print_error_message('Error raised in call to PRIN_DATE_RANGE_VAR_INT_LOAN');
2730          RAISE prin_date_range_failed;
2731        END IF;
2732 
2733     ELSIF (l_deal_type = 'LOAN-REVOLVING') THEN
2734        prin_date_range_var_int_rloan (
2735                                      p_api_version           => 1.0,
2736                                      p_init_msg_list         => OKL_API.G_FALSE,
2737                                      x_return_status         => x_return_status,
2738                                      x_msg_count             => x_msg_count,
2739                                      x_msg_data              => x_msg_data,
2740                                      p_contract_id           => p_contract_id,
2741                                      p_line_id               => p_line_id,
2742                                      p_start_date            => p_start_date,
2743                                      p_due_date              => p_due_date,
2744                                      x_principal_balance_tbl => r_principal_balance_tbl);
2745        IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
2746          print_error_message('Unexpected error raised in call to PRIN_DATE_RANGE_VAR_INT_RLOAN');
2747          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
2748        ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
2749          print_error_message('Error raised in call to PRIN_DATE_RANGE_VAR_INT_LOAN');
2750          RAISE prin_date_range_failed;
2751        END IF;
2752     END IF;
2753 
2754     x_principal_balance_tbl := r_principal_balance_tbl;
2755 
2756   EXCEPTION
2757      WHEN prin_date_range_failed THEN
2758        print_error_message('prin_date_range_failed Exception raised in procedure PRIN_DATE_RANGE_VAR_INT_CTR');
2759        x_return_status := OKL_API.G_RET_STS_ERROR;
2760 
2761      WHEN OTHERS THEN
2762        print_error_message('Exception raised in procedure PRIN_DATE_RANGE_VAR_INT_CTR');
2763        Okl_Api.SET_MESSAGE(
2764                p_app_name     => G_APP_NAME,
2765                p_msg_name     => G_UNEXPECTED_ERROR,
2766                p_token1       => G_SQLCODE_TOKEN,
2767                p_token1_value => SQLCODE,
2768                p_token2       => G_SQLERRM_TOKEN,
2769                p_token2_value => SQLERRM);
2770 
2771        x_return_status := OKL_API.G_RET_STS_ERROR;
2772 
2773   END prin_date_range_var_rate_ctr;
2774 ------------------------------------------------------------------------------
2775 FUNCTION get_last_int_calc_date(p_khr_id IN NUMBER) RETURN DATE IS
2776   l_ret_date DATE := NULL;
2777 
2778   CURSOR c_int_calc_date_csr(cp_khr_id NUMBER) IS SELECT (max(sel.stream_element_date) - 1) last_interest_calc_date
2779   FROM  okl_streams stm,
2780         okl_strm_elements sel,
2781         okl_strm_type_b sty
2782   WHERE stm.khr_id = cp_khr_id
2783   AND   stm.id = sel.stm_id
2784   AND   stm.sty_id = sty.id
2785   AND   (sty.stream_type_purpose = 'DAILY_INTEREST_PRINCIPAL' OR sty.stream_type_purpose = 'DAILY_INTEREST_INTEREST');
2786 
2787   CURSOR c_khr_start_date_csr(cp_khr_id NUMBER) IS SELECT start_date - 1
2788   FROM okc_k_headers_b
2789   WHERE id = cp_khr_id;
2790 
2791 BEGIN
2792   OPEN c_int_calc_date_csr(p_khr_id);
2793   FETCH c_int_calc_date_csr INTO l_ret_date;
2794   CLOSE c_int_calc_date_csr;
2795 
2796   IF (l_ret_date IS NULL) THEN
2797     OPEN c_khr_start_date_csr(p_khr_id);
2798     FETCH c_khr_start_date_csr INTO l_ret_date;
2799     CLOSE c_khr_start_date_csr;
2800   END IF;
2801 
2802   RETURN l_ret_date;
2803 END;
2804 ------------------------------------------------------------------------------
2805 
2806   /*
2807     Added by bkatraga for bug 13693187
2808     This function returns the next period start date
2809   */
2810   FUNCTION get_next_period_start_date(p_khr_id  IN NUMBER,
2811                                       p_start_date IN DATE) RETURN DATE IS
2812 
2813     CURSOR l_payment_line_csr(p_contract_id NUMBER, p_cle_id NUMBER) IS
2814         SELECT Fnd_Date.canonical_to_date(rulb2.RULE_INFORMATION2) start_date,
2815                rulb2.RULE_INFORMATION3 level_periods,
2816                rulb2.RULE_INFORMATION7 stub_days,
2817                rulb2.RULE_INFORMATION8 stub_amount,
2818                rulb2.object1_id1 frequency
2819         FROM   okc_k_lines_b     cleb,
2820                okc_rule_groups_b rgpb,
2821                okc_rules_b       rulb,
2822                okc_rules_b       rulb2,
2823                okl_strm_type_b   styb
2824         WHERE  rgpb.chr_id     IS NULL
2825         AND    rgpb.dnz_chr_id = cleb.dnz_chr_id
2826         AND    rgpb.cle_id     = cleb.id
2827         AND    cleb.id         = p_cle_id
2828         AND    cleb.dnz_chr_id = p_contract_id
2829         AND    rgpb.rgd_code   = 'LALEVL'
2830         AND    rulb.rgp_id     = rgpb.id
2831         AND    rulb.rule_information_category  = 'LASLH'
2832         AND    TO_CHAR(styb.id)                = rulb.object1_id1
2833         AND    rulb2.object2_id1                = TO_CHAR(rulb.id)
2834         AND    rulb2.rgp_id                    = rgpb.id
2835         AND    rulb2.rule_information_category = 'LASLL'
2836         AND    styb.STREAM_TYPE_PURPOSE IN ('RENT', 'LOAN_PAYMENT', 'PRINCIPAL_PAYMENT')
2837         ORDER BY start_date;
2838 
2839     CURSOR l_assets_csr(p_contract_id NUMBER) IS
2840        SELECT cle.id
2841          FROM okc_k_lines_v cle,
2842               okc_line_styles_b sty,
2843               okc_statuses_b sts
2844        WHERE  cle.lse_id = sty.id
2845          AND  cle.dnz_chr_id = p_contract_id
2846          AND  sty.lty_code = 'FREE_FORM1'
2847          AND  cle.sts_code = sts.code
2848          AND  sts.ste_code NOT IN ( 'HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
2849 
2850     l_return_status      VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
2851     l_next_start_date    DATE := p_start_date;
2852     l_sel_date           DATE;
2853     l_recurrence_date    DATE := NULL;
2854     l_frequency          okc_rules_b.object1_id1%type;
2855     l_adder_months       NUMBER := 0;
2856     l_cle_id             OKC_K_LINES_B.ID%TYPE;
2857 
2858   BEGIN
2859     --Fetch the first asset
2860     OPEN  l_assets_csr(p_khr_id);
2861     FETCH l_assets_csr INTO l_cle_id;
2862     CLOSE l_assets_csr;
2863 
2864     FOR l_payment_line in l_payment_line_csr(p_khr_id, l_cle_id)
2865     LOOP
2866       IF(l_recurrence_date IS NULL) THEN
2867          l_recurrence_date := l_payment_line.start_date;
2868       END IF;
2869 
2870       IF(l_payment_line.stub_days IS NOT NULL) THEN
2871          l_recurrence_date := NULL;
2872          l_sel_date := l_payment_line.start_date + to_number(l_payment_line.stub_days);
2873          IF(l_sel_date > p_start_date) THEN
2874            l_next_start_date := l_sel_date;
2875            RETURN l_next_start_date;
2876          END IF;
2877       ELSIF(l_payment_line.level_periods IS NOT NULL) THEN
2878         l_frequency := l_payment_line.frequency;
2879         IF(l_frequency = 'M') THEN
2880             l_adder_months := 1;
2881         ELSIF(l_frequency = 'Q') THEN
2882             l_adder_months := 3;
2883         ELSIF(l_frequency = 'S') THEN
2884             l_adder_months := 6;
2885         ELSIF(l_frequency = 'A') THEN
2886             l_adder_months := 12;
2887         END IF;
2888 
2889         FOR i IN 1..l_payment_line.level_periods
2890         LOOP
2891           OKL_STREAM_GENERATOR_PVT.get_sel_date(p_start_date         => l_payment_line.start_date,
2892                                                 p_advance_or_arrears => 'ARREARS',
2893                                                 p_periods_after      => i,
2894                                                 p_months_per_period  => l_adder_months,
2895                                                 x_date               => l_sel_date,
2896                                                 x_return_status      => l_return_status,
2897                                                 p_recurrence_date    => l_recurrence_date,
2898                                                 p_arrears_pay_dates_option => 'FIRST_DAY_OF_NEXT_PERIOD');
2899           IF(l_return_status <> OKL_API.G_RET_STS_SUCCESS)THEN
2900              RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2901           END IF;
2902 
2903           IF(l_sel_date > p_start_date) THEN
2904             l_next_start_date := l_sel_date;
2905             RETURN l_next_start_date;
2906           END IF;
2907         END LOOP;
2908       END IF;
2909     END LOOP;
2910     RETURN l_next_start_date;
2911   EXCEPTION
2912     WHEN OTHERS THEN
2913        RETURN NULL;
2914   END get_next_period_start_date;
2915 
2916 
2917   PROCEDURE interest_date_range (
2918             p_api_version        IN  NUMBER,
2919             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
2920             x_return_status      OUT NOCOPY VARCHAR2,
2921             x_msg_count          OUT NOCOPY NUMBER,
2922             x_msg_data           OUT NOCOPY VARCHAR2,
2923             p_contract_id        IN  NUMBER,
2924             p_start_date         IN  DATE,
2925             p_end_date           IN  DATE,
2926             p_process_flag       IN  VARCHAR2,
2927             p_rate_param_rowid   IN  ROWID,
2928             x_interest_rate_tbl OUT NOCOPY interest_rate_tbl_type)   IS
2929 
2930     -----------------------------------------------------------------
2931     -- Declare Process Variable
2932     -----------------------------------------------------------------
2933     l_api_name	        CONSTANT VARCHAR2(30)   := 'interest_date_range';
2934     l_return_status	VARCHAR2(1)             := OKL_API.G_RET_STS_SUCCESS;
2935 
2936     l_interest_rate_tbl interest_rate_tbl_type;
2937     l_start_date        DATE;
2938     l_end_date          DATE;
2939     l_int_tbl_row       NUMBER := 0;
2940     --specifies whether the rate is to be derived from interest index
2941     l_derive_rate_flag  VARCHAR2(1) := 'Y';
2942 
2943     l_rate_change_start_date DATE := NULL;
2944     l_next_rate_change_date DATE := NULL;
2945 
2946     --Added by bkatraga for bug 13258144
2947     l_int_start_date    DATE;
2948     l_int_end_date      DATE;
2949     --end bkatraga
2950 
2951     --Bug# 13247845
2952     l_first_rate_chg_start_date DATE;
2953 
2954     ----------------------------------------------------------------
2955     -- Declare variable interest parameter cursor
2956     -----------------------------------------------------------------
2957     --dkagrawa changed query to use okl_prod_qlty_val_uv than okl_product_parameter_v for performance
2958     CURSOR c_int_param(cp_rate_param_rowid ROWID) IS
2959          SELECT krp.interest_index_id
2960               , NVL(krp.base_rate, 0) base_rate
2961               , NVL(krp.interest_start_date, chr.start_date) interest_start_date
2962               , NVL(krp.adder_rate, 0) adder_rate
2963               , NVL(krp.maximum_rate, 9999) maximum_rate
2964               , NVL(krp.minimum_rate, 0) minimum_rate
2965               , krp.rate_delay_code
2966               , NVL(krp.rate_delay_frequency, 0) rate_delay_frequency
2967               , NVL(krp.rate_change_start_date, chr.start_date) rate_change_start_date
2968               , NVL(krp.rate_change_frequency_code, 'DAILY') rate_change_frequency_code
2969               , NVL(krp.rate_change_value, 0) rate_change_value
2970               --if the calling process is Daily Interest, get the last int cal date from
2971               --the Daily Interest streams
2972               --for a REAMORT contract, if the calling process is Reamortization (initiate_request)
2973               --and it is being run for the first time for the contract, the last interest calc date
2974               --defaults to the start date (as there may be a previously derived value due to the fact
2975               --that the Reamort may not have completed in its entirety)
2976               --if it is called from any other process for a REAMORT contract, the last int calc date
2977               --defaults to start date minus 1
2978               --for all other types of contracts, the last int calc date
2979               --defaults to start date minus 1
2980               , decode(p_process_flag, 'DAILY_INTEREST', get_last_int_calc_date(chr.id),
2981                                    decode(ppm.quality_val, 'REAMORT', NVL(khr.date_last_interim_interest_cal,
2982                                                decode(OKL_VARIABLE_INTEREST_PVT.G_CALC_METHOD_CODE, 'REAMORT', chr.start_date, chr.start_date-1)), NVL(khr.date_last_interim_interest_cal, chr.start_date - 1))) date_last_interim_interest_cal
2983               , chr.start_date contract_start_date
2984               , chr.end_date contract_end_date
2985               , chr.id khr_id
2986               , ppm.quality_val interest_calculation_basis
2987               , NULL pay_freq
2988          FROM okl_k_rate_params krp
2989          , okl_k_headers khr
2990          , okc_k_headers_b chr
2991          , okl_prod_qlty_val_uv ppm
2992          WHERE krp.rowid = cp_rate_param_rowid
2993          AND krp.khr_id = khr.id
2994          AND khr.id = chr.id
2995          --AND TRUNC(SYSDATE) BETWEEN krp.effective_from_date and NVL(krp.effective_to_date, trunc(SYSDATE))
2996          --AND krp.parameter_type_code = 'ACTUAL'
2997          AND khr.pdt_id = ppm.pdt_id
2998          AND ppm.quality_name = 'INTEREST_CALCULATION_BASIS';
2999 
3000     TYPE int_param_tbl_type IS TABLE OF c_int_param%ROWTYPE INDEX BY BINARY_INTEGER;
3001 
3002     l_int_param_tbl int_param_tbl_type;
3003     l_param_tbl_row NUMBER := 0;
3004     x_eff_int_tbl interest_rate_tbl_type;
3005     l_eff_int_row   NUMBER := 0;
3006 
3007     ----------------------------------------------------------------
3008     -- Declare interest rate cursor
3009     -- used to derive interest rates from the interest parameter
3010     -- when interest dates are less than last int calc date
3011     -----------------------------------------------------------------
3012     CURSOR c_param_rate(cp_khr_id NUMBER, cp_start_date DATE, cp_end_date DATE, cp_process_flag IN VARCHAR2) IS
3013     SELECT DISTINCT
3014            vip.interest_rate VALUE,
3015            GREATEST(trunc(cp_start_date),interest_calc_start_date) VALID_FROM,
3016            LEAST(trunc(cp_end_date),NVL(interest_calc_end_date, trunc(sysdate))) VALID_UNTIL
3017     FROM okl_var_int_params vip
3018     WHERE   vip.khr_id = cp_khr_id
3019     AND   (cp_start_date BETWEEN vip.interest_calc_start_date AND nvl(vip.interest_calc_end_date, trunc(cp_start_date))
3020            OR    (cp_end_date BETWEEN vip.interest_calc_start_date AND nvl(vip.interest_calc_end_date, trunc(cp_end_date)))
3021            OR    (vip.interest_calc_start_date >= cp_start_date AND nvl(vip.interest_calc_end_date, trunc(sysdate + 9999)) <= cp_end_date) )
3022     AND   vip.calc_method_code = NVL(cp_process_flag, vip.calc_method_code)
3023     AND   vip.valid_yn = 'Y'
3024     ORDER BY VALID_FROM;
3025 
3026     ----------------------------------------------------------------
3027     -- Declare payment frequency cursor
3028     -----------------------------------------------------------------
3029     CURSOR c_pay_freq(cp_khr_id NUMBER) IS
3030     select sll_rulb.object1_id1 pay_freq
3031     from   okc_rules_b        sll_rulb,
3032       okc_rules_b        slh_rulb,
3033       okl_strm_type_b    styb,
3034       okc_rule_groups_b  rgpb
3035     where  sll_rulb.rgp_id                      = rgpb.id
3036     and    sll_rulb.rule_information_category   = 'LASLL'
3037     and    sll_rulb.dnz_chr_id                  = rgpb.dnz_chr_id
3038     and    sll_rulb.object2_id1                 = to_char(slh_rulb.id)
3039     and    slh_rulb.rgp_id                      = rgpb.id
3040     and    slh_rulb.rule_information_category   = 'LASLH'
3041     and    slh_rulb.dnz_chr_id                  = rgpb.dnz_chr_id
3042     and    styb.id                              = slh_rulb.object1_id1
3043     and    styb.stream_type_purpose             IN ('RENT', 'PRINCIPAL_PAYMENT')
3044     and    rgpb.dnz_chr_id                      = cp_khr_id
3045     and    rgpb.rgd_code                        = 'LALEVL'
3046     order by sll_rulb.rule_information1;
3047 
3048     /*Returns the interest rate from the interest index for inputted index id and date range*/
3049     PROCEDURE get_eff_int_rate(p_start_date IN DATE, p_end_date IN DATE, p_int_param_tbl IN int_param_tbl_type, x_eff_int_tbl IN OUT NOCOPY interest_rate_tbl_type) IS
3050 
3051       --Bug# 14639522: If End Date is not defined on the Interest Rate Index then use the latest of sysdate or cp_end_date
3052       CURSOR c_int_rate(cp_index_id NUMBER, cp_start_date DATE, cp_end_date DATE) IS
3053       SELECT ive.value VALUE,
3054              GREATEST(trunc(cp_start_date),datetime_valid) VALID_FROM,
3055              LEAST(trunc(cp_end_date),NVL(datetime_invalid, GREATEST(trunc(sysdate),trunc(cp_end_date)))) VALID_UNTIL
3056       FROM okl_indices idx,
3057            okl_index_values ive
3058       WHERE   idx.id = cp_index_id
3059       AND idx.id = ive.idx_id
3060       AND   (cp_start_date BETWEEN ive.datetime_valid AND nvl(ive.datetime_invalid, trunc(cp_start_date))
3061              OR    (cp_end_date BETWEEN ive.datetime_valid AND nvl(ive.datetime_invalid, trunc(cp_end_date)))
3062              OR    (ive.datetime_valid >= cp_start_date AND nvl(ive.datetime_invalid, trunc(sysdate + 9999)) <= cp_end_date) )
3063       ORDER BY VALID_FROM;
3064 
3065       l_int_param_row NUMBER := 0;
3066       l_eff_int_row   NUMBER := 0;
3067       l_int_param_tbl int_param_tbl_type;
3068       l_eff_int_tbl   interest_rate_tbl_type;
3069 
3070       --Bug# 14557128: Moved code from interest_date_range
3071       --Bug# 14528742
3072       l_icx_date_format    VARCHAR2(240);
3073 
3074       CURSOR c_last_interest_calc_date(p_khr_id NUMBER) IS
3075       SELECT NVL(khr.date_last_interim_interest_cal, chr.start_date) last_interest_calc_date
3076       FROM okc_k_headers_b chr,
3077            okl_k_headers khr
3078       WHERE chr.id = p_khr_id
3079       AND khr.id = chr.id;
3080 
3081       l_last_interest_calc_date okl_k_headers.date_last_interim_interest_cal%TYPE;
3082       --Bug# 14528742
3083 
3084     BEGIN
3085       l_int_param_tbl := p_int_param_tbl;
3086       l_eff_int_tbl.delete;
3087 
3088       l_int_param_row := l_int_param_tbl.first;
3089       l_eff_int_row := 0;
3090 
3091       print_debug('in procedure get_eff_int_rate for date range : ' || p_start_date || ' - ' || p_end_date);
3092       WHILE l_int_param_row IS NOT NULL
3093       LOOP
3094 
3095         FOR cur_int_rate IN c_int_rate(l_int_param_tbl(l_int_param_row).interest_index_id,
3096                                        p_start_date,
3097                                        p_end_date) LOOP
3098             l_eff_int_row := l_eff_int_row + 1;
3099             l_eff_int_tbl(l_eff_int_row).from_date := cur_int_rate.valid_from;
3100             l_eff_int_tbl(l_eff_int_row).to_date := cur_int_rate.valid_until;
3101             l_eff_int_tbl(l_eff_int_row).rate := cur_int_rate.value + l_int_param_tbl(l_int_param_row).adder_rate;
3102             l_eff_int_tbl(l_eff_int_row).derived_flag := 'Y';
3103             l_eff_int_tbl(l_eff_int_row).apply_tolerance := 'Y';
3104         END LOOP;
3105 
3106         --Bug# 14557128: Moved code from interest_date_range
3107         --Bug# 14528742
3108         -- Raise error is Interest Rates have not been defined for any period
3109         IF (l_eff_int_tbl.COUNT = 0 OR l_eff_int_tbl(l_eff_int_row).to_date < p_end_date) THEN
3110 
3111           l_last_interest_calc_date := NULL;
3112           OPEN c_last_interest_calc_date(p_khr_id => G_CONTRACT_ID);
3113           FETCH c_last_interest_calc_date INTO l_last_interest_calc_date;
3114           CLOSE c_last_interest_calc_date;
3115 
3116           l_icx_date_format := NVL(fnd_profile.value('ICX_DATE_FORMAT_MASK'),'DD-MON-RRRR');
3117 
3118           OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
3119                               p_msg_name     => 'OKL_VAR_INT_RATE_NOT_DEF',
3120                               p_token1       => 'START_DATE',
3121                               p_token1_value => TO_CHAR(p_start_date,l_icx_date_format),
3122                               p_token2       => 'END_DATE',
3123                               p_token2_value => TO_CHAR(p_end_date,l_icx_date_format),
3124                               p_token3       => 'LAST_INTEREST_CALC_DATE',
3125                               p_token3_value => TO_CHAR(l_last_interest_calc_date,l_icx_date_format));
3126 
3127           print_error_message('Interest Rates not defined - Error raised in procedure get_eff_int_rate');
3128           RAISE Okl_Api.G_EXCEPTION_ERROR;
3129         END IF;
3130         --Bug# 14528742
3131 
3132         l_int_param_row := l_int_param_tbl.next(l_int_param_row);
3133       END LOOP;
3134 
3135       print_debug('exit procedure get_eff_int_rate');
3136       x_eff_int_tbl := l_eff_int_tbl;
3137     EXCEPTION
3138 
3139       --Bug# 14528742
3140       WHEN OKL_API.G_EXCEPTION_ERROR THEN
3141         RAISE;
3142 
3143       WHEN OTHERS THEN
3144         OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
3145                           ,p_msg_name     => G_UNEXPECTED_ERROR
3146                           ,p_token1       => G_SQLCODE_TOKEN
3147                           ,p_token1_value => SQLCODE
3148                           ,p_token2       => G_SQLERRM_TOKEN
3149                           ,p_token2_value => SQLERRM);
3150     END get_eff_int_rate;
3151 
3152     /*returnd the next applicable rate change start date for a contract*/
3153     FUNCTION get_next_rate_change_date(p_rate_change_start_date DATE, p_int_param_tbl IN int_param_tbl_type) RETURN DATE IS
3154       l_int_param_tbl int_param_tbl_type;
3155       l_int_param_tbl_row NUMBER := 0;
3156       l_next_rate_change_date DATE;
3157       l_period_start_date DATE;
3158       l_period_end_date DATE;
3159       l_adder_months NUMBER;
3160       x_return_status VARCHAR2(1);
3161       x_msg_count NUMBER;
3162       x_msg_data VARCHAR2(4000);
3163       --Added by bkatraga for bug 12996272
3164       l_arrears_pay_dates_option  okl_st_gen_tmpt_sets_all.isg_arrears_pay_dates_option%type;
3165     BEGIN
3166       print_debug('in function get_next_rate_change_date');
3167       print_debug('input parameters :-');
3168       print_debug('p_rate_change_start_date : ' || p_rate_change_start_date);
3169 
3170       l_int_param_tbl := p_int_param_tbl;
3171       l_int_param_tbl_row := l_int_param_tbl.first;
3172 
3173       IF (l_int_param_tbl(l_int_param_tbl_row).rate_change_frequency_code = 'MONTHLY') THEN
3174         l_next_rate_change_date := add_months(p_rate_change_start_date, 1);
3175       ELSIF (l_int_param_tbl(l_int_param_tbl_row).rate_change_frequency_code = 'QUARTERLY') THEN
3176         l_next_rate_change_date := add_months(p_rate_change_start_date, 3);
3177       --Added by bkatraga for bug 13476838
3178       ELSIF (l_int_param_tbl(l_int_param_tbl_row).rate_change_frequency_code = 'SEMI_ANNUAL') THEN
3179         l_next_rate_change_date := add_months(p_rate_change_start_date, 6);
3180       ELSIF (l_int_param_tbl(l_int_param_tbl_row).rate_change_frequency_code = 'ANNUAL') THEN
3181         l_next_rate_change_date := add_months(p_rate_change_start_date, 12);
3182       --Bug# 13247845
3183       ELSIF  (l_int_param_tbl(l_int_param_tbl_row).rate_change_frequency_code = 'ANNIVERSARY_DATE') THEN
3184         l_next_rate_change_date := add_months(l_int_param_tbl(l_int_param_tbl_row).contract_start_date, 12);
3185         LOOP
3186           EXIT WHEN l_next_rate_change_date > p_rate_change_start_date;
3187           l_next_rate_change_date := add_months(l_next_rate_change_date, 12);
3188         END LOOP;
3189       ELSE -- (l_int_param_tbl(l_int_param_row).rate_change_frequency_code = 'BILLING_DATE' THEN
3190         IF (l_int_param_tbl(l_int_param_tbl_row).interest_calculation_basis = 'FLOAT') THEN
3191             OKL_STREAM_GENERATOR_PVT.get_next_billing_date(
3192                 p_api_version            => p_api_version,
3193        	        p_init_msg_list          => p_init_msg_list,
3194         	   	 	p_khr_id                 => l_int_param_tbl(l_int_param_tbl_row).khr_id,
3195                 p_billing_date           => p_rate_change_start_date,
3196                 x_next_due_date          => l_next_rate_change_date,
3197                 x_next_period_start_date => l_period_start_date,
3198                 x_next_period_end_date   => l_period_end_date,
3199           			x_return_status          => x_return_status,
3200           			x_msg_count              => x_msg_count,
3201           			x_msg_data               => x_msg_data);
3202 
3203             --Added by bkatraga for bug 12996272
3204             OKL_ISG_UTILS_PVT.get_arrears_pay_dates_option(
3205                p_khr_id                   => l_int_param_tbl(l_int_param_tbl_row).khr_id,
3206                x_arrears_pay_dates_option => l_arrears_pay_dates_option,
3207                x_return_status            => x_return_status);
3208 
3209             IF l_arrears_pay_dates_option = 'LAST_DAY_OF_PERIOD' THEN
3210                l_next_rate_change_date := l_next_rate_change_date + 1;
3211             END IF;
3212 	    --end bkatraga for bug 12996272
3213         --Added ESLIF condition by bkatraga for bug 13693187
3214         ELSIF(l_int_param_tbl(l_int_param_tbl_row).interest_calculation_basis = 'REAMORT') THEN
3215            l_next_rate_change_date := get_next_period_start_date(l_int_param_tbl(l_int_param_tbl_row).khr_id, p_rate_change_start_date);
3216         ELSE
3217           IF (l_int_param_tbl(l_int_param_tbl_row).pay_freq = 'M') THEN
3218             l_adder_months := 1;
3219           ELSIF (l_int_param_tbl(l_int_param_tbl_row).pay_freq = 'Q') THEN
3220             l_adder_months := 3;
3221           ELSIF (l_int_param_tbl(l_int_param_tbl_row).pay_freq = 'S') THEN
3222             l_adder_months := 6;
3223           ELSIF (l_int_param_tbl(l_int_param_tbl_row).pay_freq = 'A') THEN
3224             l_adder_months := 12;
3225           ELSE
3226             l_adder_months := 1;
3227           END IF;
3228           l_next_rate_change_date := add_months(p_rate_change_start_date, l_adder_months);
3229         END IF;
3230       END IF;
3231 
3232       print_debug('l_next_rate_change_date : ' || l_next_rate_change_date);
3233       print_debug('exiting function get_next_rate_change_date');
3234       RETURN l_next_rate_change_date;
3235     EXCEPTION
3236       WHEN OTHERS THEN
3237         OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
3238                           ,p_msg_name     => G_UNEXPECTED_ERROR
3239                           ,p_token1       => G_SQLCODE_TOKEN
3240                           ,p_token1_value => SQLCODE
3241                           ,p_token2       => G_SQLERRM_TOKEN
3242                           ,p_token2_value => SQLERRM);
3243 
3244         RETURN l_next_rate_change_date;
3245     END get_next_rate_change_date;
3246 
3247     /*check the derived interest rates for tolerance*/
3248     PROCEDURE apply_tolerance(p_int_param_tbl IN int_param_tbl_type, p_eff_int_tbl IN interest_rate_tbl_type, x_eff_int_with_tol_tbl IN OUT NOCOPY interest_rate_tbl_type) IS
3249       l_int_param_row NUMBER := 0;
3250       l_eff_int_row   NUMBER := 0;
3251       l_eff_int_with_tol_row   NUMBER := 0;
3252       l_prev_eff_int_with_tol_row   NUMBER := 0;
3253 
3254       l_int_param_tbl int_param_tbl_type;
3255       l_eff_int_tbl   interest_rate_tbl_type;
3256       l_eff_int_with_tol_tbl interest_rate_tbl_type;
3257 
3258       l_first_row BOOLEAN := TRUE;
3259       l_compare_to_base BOOLEAN := TRUE;
3260       l_compare_to_min_max BOOLEAN := TRUE;
3261 
3262       cursor c_most_recent_rate(cp_khr_id IN NUMBER, cp_from_date IN DATE, cp_process_flag IN VARCHAR2) IS
3263       select interest_calc_start_date
3264             ,interest_calc_end_date
3265             ,interest_rate
3266       from (select vip.interest_calc_start_date
3267                   ,vip.interest_calc_end_date
3268                   ,vip.interest_rate
3269             from okl_var_int_params vip
3270             where vip.khr_id = cp_khr_id
3271             and   vip.interest_calc_end_date < cp_from_date
3272             AND   vip.calc_method_code = NVL(cp_process_flag, vip.calc_method_code)
3273             AND   vip.valid_yn = 'Y'
3274             order by vip.interest_calc_end_date desc)
3275       where rownum = 1;
3276 
3277     BEGIN
3278       print_debug('in procedure apply_tolerance');
3279       l_int_param_tbl := p_int_param_tbl;
3280       l_eff_int_tbl := p_eff_int_tbl;
3281       l_eff_int_with_tol_tbl.delete;
3282 
3283       l_int_param_row := l_int_param_tbl.first;
3284       l_eff_int_row := l_eff_int_tbl.first;
3285       WHILE l_eff_int_row IS NOT NULL
3286       LOOP
3287         l_prev_eff_int_with_tol_row := l_eff_int_with_tol_row;
3288         l_eff_int_with_tol_row := l_eff_int_with_tol_row + 1;
3289         l_eff_int_with_tol_tbl(l_eff_int_with_tol_row) := l_eff_int_tbl(l_eff_int_row);
3290         l_compare_to_min_max := TRUE;
3291 
3292         IF (l_eff_int_tbl(l_eff_int_row).apply_tolerance = 'Y') THEN
3293           --first row in the effective interest rates table
3294           IF (l_first_row) THEN
3295             --comparing to most recent rate
3296             FOR cur_most_recent_rate IN c_most_recent_rate(l_int_param_tbl(l_int_param_row).khr_id, l_eff_int_tbl(l_eff_int_row).from_date, p_process_flag) LOOP
3297               IF (ABS(l_eff_int_tbl(l_eff_int_row).rate - cur_most_recent_rate.interest_rate) < l_int_param_tbl(l_int_param_row).rate_change_value) THEN
3298                 l_eff_int_with_tol_tbl(l_eff_int_with_tol_row).rate := cur_most_recent_rate.interest_rate;
3299                 l_compare_to_min_max := FALSE;
3300               END IF;
3301               l_compare_to_base := FALSE;
3302             END LOOP;
3303 
3304             --compare to base rate
3305             IF (l_compare_to_base AND ABS(l_eff_int_tbl(l_eff_int_row).rate - l_int_param_tbl(l_int_param_row).base_rate) < l_int_param_tbl(l_int_param_row).rate_change_value) THEN
3306               l_eff_int_with_tol_tbl(l_eff_int_with_tol_row).rate := l_int_param_tbl(l_int_param_row).base_rate;
3307               l_compare_to_min_max := FALSE;
3308             END IF;
3309 
3310             l_first_row := FALSE;
3311           ELSE
3312             --compare to the previous entry in the rates table
3313             IF (ABS(l_eff_int_tbl(l_eff_int_row).rate - l_eff_int_with_tol_tbl(l_prev_eff_int_with_tol_row).rate) < l_int_param_tbl(l_int_param_row).rate_change_value) THEN
3314               l_eff_int_with_tol_tbl(l_eff_int_with_tol_row).rate := l_eff_int_with_tol_tbl(l_prev_eff_int_with_tol_row).rate;
3315               l_compare_to_min_max := FALSE;
3316             END IF;
3317           END IF;
3318 
3319           --compare to minimum and maximum
3320           IF (l_compare_to_min_max) THEN
3321             IF (l_eff_int_with_tol_tbl(l_eff_int_with_tol_row).rate < l_int_param_tbl(l_int_param_row).minimum_rate) THEN
3322               l_eff_int_with_tol_tbl(l_eff_int_with_tol_row).rate := l_int_param_tbl(l_int_param_row).minimum_rate;
3323             END IF;
3324 
3325             IF (l_eff_int_with_tol_tbl(l_eff_int_with_tol_row).rate > l_int_param_tbl(l_int_param_row).maximum_rate) THEN
3326               l_eff_int_with_tol_tbl(l_eff_int_with_tol_row).rate := l_int_param_tbl(l_int_param_row).maximum_rate;
3327             END IF;
3328           END IF;
3329         END IF;
3330 
3331         l_eff_int_row := l_eff_int_tbl.next(l_eff_int_row);
3332       END LOOP;
3333 
3334       x_eff_int_with_tol_tbl := l_eff_int_with_tol_tbl;
3335       print_debug('exiting procedure apply_tolerance');
3336     EXCEPTION
3337       WHEN OTHERS THEN
3338         OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
3339                           ,p_msg_name     => G_UNEXPECTED_ERROR
3340                           ,p_token1       => G_SQLCODE_TOKEN
3341                           ,p_token1_value => SQLCODE
3342                           ,p_token2       => G_SQLERRM_TOKEN
3343                           ,p_token2_value => SQLERRM);
3344     END apply_tolerance;
3345 
3346     /*outputs the contents of tables passed to it*/
3347     PROCEDURE print_table_content(p_int_param_tbl IN int_param_tbl_type, p_eff_int_tbl IN interest_rate_tbl_type) IS
3348       l_int_param_row NUMBER := 0;
3349       l_eff_int_row   NUMBER := 0;
3350       l_out_str varchar2(2000);
3351     BEGIN
3352 
3353       print_debug('*****************************************');
3354       print_debug('****START CONTENTS OF P_INT_PARAM_TBL****');
3355       l_int_param_row := p_int_param_tbl.first;
3356       WHILE l_int_param_row IS NOT NULL
3357       LOOP
3358         print_debug('	interest_index_id : ' || p_int_param_tbl(l_int_param_row).interest_index_id);
3359         print_debug('	base_rate : ' || p_int_param_tbl(l_int_param_row).base_rate);
3360         print_debug('	interest_start_date	 : ' || 	p_int_param_tbl(l_int_param_row).interest_start_date);
3361         print_debug('	adder_rate                    	 : ' || 	p_int_param_tbl(l_int_param_row).adder_rate);
3362         print_debug('	maximum_rate	 : ' || 	p_int_param_tbl(l_int_param_row).maximum_rate);
3363         print_debug('	minimum_rate	 : ' || 	p_int_param_tbl(l_int_param_row).minimum_rate);
3364         print_debug('	rate_delay_code               	 : ' || 	p_int_param_tbl(l_int_param_row).rate_delay_code);
3365         print_debug('	rate_delay_frequency	 : ' || 	p_int_param_tbl(l_int_param_row).rate_delay_frequency);
3366         print_debug('	rate_change_start_date	 : ' || 	p_int_param_tbl(l_int_param_row).rate_change_start_date);
3367         print_debug('	rate_change_frequency_code    	 : ' || 	p_int_param_tbl(l_int_param_row).rate_change_frequency_code);
3368         print_debug('	rate_change_value	 : ' || 	p_int_param_tbl(l_int_param_row).rate_change_value);
3369         print_debug('	date_last_interim_interest_cal	 : ' || 	p_int_param_tbl(l_int_param_row).date_last_interim_interest_cal);
3370         print_debug('	contract_start_date	 : ' || 	p_int_param_tbl(l_int_param_row).contract_start_date);
3371         print_debug('	khr_id	 : ' || 	p_int_param_tbl(l_int_param_row).khr_id);
3372         print_debug('	interest_calculation_basis	 : ' || 	p_int_param_tbl(l_int_param_row).interest_calculation_basis);
3373         print_debug('	pay_freq	 : ' || 	p_int_param_tbl(l_int_param_row).pay_freq);
3374 
3375         l_int_param_row := p_int_param_tbl.next(l_int_param_row);
3376       END LOOP;
3377       print_debug('*****END CONTENTS OF P_INT_PARAM_TBL*****');
3378       print_debug('*****************************************');
3379 
3380       print_debug('*****START CONTENTS OF P_EFF_INT_TBL*****');
3381       l_eff_int_row := p_eff_int_tbl.first;
3382       l_out_str := rpad(' from_date', 14, ' ') || rpad('to_date', 15, ' ')
3383                      || rpad('rate', 15, ' ') || rpad('derived_flag', 15, ' ') || rpad('apply_tolerance', 15, ' ');
3384       print_debug(l_out_str);
3385       WHILE l_eff_int_row IS NOT NULL
3386       LOOP
3387         /*print_debug('	from_date : ' || p_eff_int_tbl(l_eff_int_row).from_date);
3388         print_debug('	to_date : ' || p_eff_int_tbl(l_eff_int_row).to_date);
3389         print_debug('	rate : ' || p_eff_int_tbl(l_eff_int_row).rate);
3390         print_debug('	derived_flag : ' || p_eff_int_tbl(l_eff_int_row).derived_flag);*/
3391         l_out_str := rpad(' ' ||  p_eff_int_tbl(l_eff_int_row).from_date, 14, ' ') ||
3392                      rpad( p_eff_int_tbl(l_eff_int_row).to_date, 15, ' ') ||
3393                      rpad(p_eff_int_tbl(l_eff_int_row).rate, 15, ' ') ||
3394                      rpad( p_eff_int_tbl(l_eff_int_row).derived_flag, 15, ' ') ||
3395                      rpad(p_eff_int_tbl(l_eff_int_row).apply_tolerance, 15, ' ');
3396 
3397         print_debug(l_out_str);
3398         l_eff_int_row := p_eff_int_tbl.next(l_eff_int_row);
3399       END LOOP;
3400       print_debug('******END CONTENTS OF P_EFF_INT_TBL******');
3401       print_debug('*****************************************');
3402 
3403 
3404     EXCEPTION
3405       WHEN OTHERS THEN
3406         print_debug('SQLCODE : ' || SQLCODE || ' SQLERRM : ' || SQLERRM);
3407     END print_table_content;
3408 
3409   BEGIN
3410 
3411     print_debug('in procedure interest_date_range');
3412     l_int_param_tbl.delete;
3413     l_param_tbl_row := 0;
3414 
3415     FOR cur_int_param IN c_int_param(p_rate_param_rowid) LOOP
3416       l_param_tbl_row := l_param_tbl_row + 1;
3417       l_int_param_tbl(l_param_tbl_row) := cur_int_param;
3418 
3419       FOR cur_pay_freq IN c_pay_freq(p_contract_id) LOOP
3420         l_int_param_tbl(l_param_tbl_row).pay_freq := cur_pay_freq.pay_freq;
3421         EXIT;
3422       END LOOP;
3423 
3424       l_interest_rate_tbl.delete;
3425       l_start_date := NVL(p_start_date, cur_int_param.contract_start_date);
3426       l_end_date := p_end_date;
3427 
3428       print_debug('cal start date : ' || l_start_date);
3429       print_debug('cal end   date : ' || l_end_date);
3430       print_debug('value of global variable okl_variable_interest_pvt.g_calc_method_code : ' || OKL_VARIABLE_INTEREST_PVT.G_CALC_METHOD_CODE);
3431 
3432       --check for interest start date
3433       print_debug('in procedure interest_date_range - check for interest start date');
3434       IF (cur_int_param.interest_start_date < l_start_date) THEN
3435         NULL;
3436       ELSE
3437         IF (cur_int_param.interest_start_date <= l_end_date) THEN
3438           l_start_date := cur_int_param.interest_start_date;
3439         ELSE
3440           RETURN;
3441         END IF;
3442       END IF;
3443 
3444       --check for date last interim interest calculated
3445       print_debug('in procedure interest_date_range - check for date last interim interest calculated');
3446       IF ((l_start_date <= cur_int_param.date_last_interim_interest_cal) AND
3447           (((cur_int_param.interest_calculation_basis = 'REAMORT') AND (OKL_VARIABLE_INTEREST_PVT.G_CALC_METHOD_CODE = 'REAMORT')) OR
3448            (cur_int_param.interest_calculation_basis <> 'REAMORT'))) THEN
3449           --check if the start date is before last int calc date and
3450           --if the proc is not called from the variable rate - initiate request
3451           --then derive the rates for the date range passed
3452           --else retrieve the previously derived rates
3453         IF (l_end_date <= cur_int_param.date_last_interim_interest_cal) THEN
3454           --get the interest rate for l_start_date to l_end_date from okl_var_int_params
3455           print_debug('in procedure interest_date_range - get the interest rate for l_start_date to l_end_date from okl_var_int_params');
3456           FOR cur_param_rate IN c_param_rate(p_contract_id, l_start_date, l_end_date, p_process_flag) LOOP
3457             l_int_tbl_row := l_int_tbl_row + 1;
3458             l_interest_rate_tbl(l_int_tbl_row).from_date := cur_param_rate.valid_from;
3459             l_interest_rate_tbl(l_int_tbl_row).to_date := cur_param_rate.valid_until;
3460             l_interest_rate_tbl(l_int_tbl_row).rate := cur_param_rate.value;
3461             l_interest_rate_tbl(l_int_tbl_row).derived_flag := 'N';
3462             l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := 'N';
3463           END LOOP;
3464 
3465           print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3466           l_derive_rate_flag := 'N';
3467         ELSE
3468           --get the interest rate for l_start_date to date last interim interest cal from okl_var_int_params
3469           print_debug('in procedure interest_date_range - get the interest rate for l_start_date to date last interim interest cal from okl_var_int_params');
3470           FOR cur_param_rate IN c_param_rate(p_contract_id, l_start_date, cur_int_param.date_last_interim_interest_cal, p_process_flag) LOOP
3471             l_int_tbl_row := l_int_tbl_row + 1;
3472             l_interest_rate_tbl(l_int_tbl_row).from_date := cur_param_rate.valid_from;
3473             l_interest_rate_tbl(l_int_tbl_row).to_date := cur_param_rate.valid_until;
3474             l_interest_rate_tbl(l_int_tbl_row).rate := cur_param_rate.value;
3475             l_interest_rate_tbl(l_int_tbl_row).derived_flag := 'N';
3476             l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := 'N';
3477           END LOOP;
3478 
3479           print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3480           l_start_date := cur_int_param.date_last_interim_interest_cal + 1;
3481           l_derive_rate_flag := 'Y';
3482         END IF;
3483       END IF;
3484 
3485       --no interest rate was available in the interest params table
3486       --therefore we need to derive the rates from the index
3487       print_debug('in procedure interest_date_range - no interest rate was available in the interest params table');
3488       print_debug('in procedure interest_date_range - therefore we need to derive the rates from the index');
3489       IF ((l_derive_rate_flag = 'N' AND NVL(l_interest_rate_tbl.count, 0) = 0) OR l_derive_rate_flag = 'Y') THEN
3490         --apply rate delay parameters to start date, end date, rate change start date
3491         print_debug('in procedure interest_date_range - apply rate delay parameters to start date, end date, rate change start date');
3492         l_rate_change_start_date := cur_int_param.rate_change_start_date;
3493 
3494         --Bug# 13247845: Compute first rate change start date correctly for frequencies Anniversary Date and Billing Date
3495         IF (cur_int_param.rate_change_frequency_code IN ('ANNIVERSARY_DATE', 'BILLING_DATE')) AND
3496            (l_rate_change_start_date > cur_int_param.contract_start_date) THEN
3497           l_first_rate_chg_start_date := get_next_rate_change_date(cur_int_param.contract_start_date, l_int_param_tbl);
3498           LOOP
3499             IF (l_rate_change_start_date <= l_first_rate_chg_start_date) THEN
3500               l_rate_change_start_date := l_first_rate_chg_start_date;
3501               EXIT;
3502             ELSE
3503               l_first_rate_chg_start_date := get_next_rate_change_date(l_first_rate_chg_start_date, l_int_param_tbl);
3504             END IF;
3505           END LOOP;
3506         END IF;
3507         --Bug# 13247845
3508 
3509         /* Commented by bkatraga for bug 13258144
3510         IF (cur_int_param.rate_delay_code = 'DAYS') THEN
3511           l_start_date := l_start_date - cur_int_param.rate_delay_frequency;
3512           l_end_date := l_end_date - cur_int_param.rate_delay_frequency;
3513           l_rate_change_start_date := l_rate_change_start_date - cur_int_param.rate_delay_frequency;
3514         ELSIF (cur_int_param.rate_delay_code = 'MONTHS') THEN
3515           l_start_date := add_months(l_start_date, -1 * cur_int_param.rate_delay_frequency);
3516           l_end_date := add_months(l_end_date, -1 * cur_int_param.rate_delay_frequency);
3517           l_rate_change_start_date := add_months(l_rate_change_start_date, -1 * cur_int_param.rate_delay_frequency);
3518         END IF;*/
3519 
3520         print_debug('in procedure interest_date_range - values after rate delay application');
3521         print_debug('in procedure interest_date_range - l_start_date: ' || l_start_date);
3522         print_debug('in procedure interest_date_range - l_end_date: ' || l_end_date);
3523         print_debug('in procedure interest_date_range - l_rate_change_start_date: ' || l_rate_change_start_date);
3524 
3525         --start dt LESS THAN RCSD
3526         print_debug('in procedure interest_date_range - start dt LESS THAN RCSD');
3527         IF (l_start_date <= l_rate_change_start_date) THEN
3528           --end dt LESS THAN RCSD
3529           print_debug('in procedure interest_date_range - end dt LESS THAN RCSD');
3530           IF(l_end_date < l_rate_change_start_date) THEN
3531             l_int_tbl_row := l_int_tbl_row + 1;
3532             l_interest_rate_tbl(l_int_tbl_row).from_date := l_start_date;
3533             l_interest_rate_tbl(l_int_tbl_row).to_date := l_end_date;
3534             l_interest_rate_tbl(l_int_tbl_row).rate := cur_int_param.base_rate;
3535             l_interest_rate_tbl(l_int_tbl_row).derived_flag := 'Y';
3536             l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := 'N';
3537 
3538             print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3539           ELSE
3540             --end dt NOT LESS THAN RCSD
3541             print_debug('in procedure interest_date_range - end dt NOT LESS THAN RCSD');
3542             IF (l_start_date < l_rate_change_start_date) THEN
3543               l_int_tbl_row := l_int_tbl_row + 1;
3544               l_interest_rate_tbl(l_int_tbl_row).from_date := l_start_date;
3545               l_interest_rate_tbl(l_int_tbl_row).to_date := l_rate_change_start_date - 1;
3546               l_interest_rate_tbl(l_int_tbl_row).rate := cur_int_param.base_rate;
3547               l_interest_rate_tbl(l_int_tbl_row).derived_flag := 'Y';
3548               l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := 'N';
3549             END IF;
3550 
3551             --get daily rate if rate_change_frequency_code is Daily
3552             print_debug('in procedure interest_date_range - get daily rate if rate_change_frequency_code is Daily');
3553             IF (cur_int_param.rate_change_frequency_code = 'DAILY') THEN
3554               l_start_date := l_rate_change_start_date;
3555               print_debug('1 -> before calling get_eff_int_rate.');
3556 
3557               --Added by bkatraga for bug 13258144
3558               l_int_start_date := l_start_date;
3559               l_int_end_date   := l_end_date;
3560               IF (cur_int_param.rate_delay_code = 'DAYS') THEN
3561                  l_int_start_date := l_int_start_date - cur_int_param.rate_delay_frequency;
3562                  l_int_end_date := l_int_end_date - cur_int_param.rate_delay_frequency;
3563               ELSIF (cur_int_param.rate_delay_code = 'MONTHS') THEN
3564                  l_int_start_date := add_months(l_int_start_date, -1 * cur_int_param.rate_delay_frequency);
3565                  l_int_end_date := add_months(l_int_end_date, -1 * cur_int_param.rate_delay_frequency);
3566               END IF;
3567               --end bkatraga for bug 13258144
3568 
3569               --Modified parameters by bkatraga for bug 13258144
3570               get_eff_int_rate(l_int_start_date, l_int_end_date, l_int_param_tbl , x_eff_int_tbl);
3571               l_eff_int_row := x_eff_int_tbl.first;
3572               WHILE (l_eff_int_row IS NOT NULL)
3573               LOOP
3574                 l_int_tbl_row := l_int_tbl_row + 1;
3575                 l_interest_rate_tbl(l_int_tbl_row).from_date := x_eff_int_tbl(l_eff_int_row).from_date;
3576                 l_interest_rate_tbl(l_int_tbl_row).to_date := x_eff_int_tbl(l_eff_int_row).to_date;
3577                 l_interest_rate_tbl(l_int_tbl_row).rate := x_eff_int_tbl(l_eff_int_row).rate;
3578                 l_interest_rate_tbl(l_int_tbl_row).derived_flag := x_eff_int_tbl(l_eff_int_row).derived_flag;
3579                 l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := x_eff_int_tbl(l_eff_int_row).apply_tolerance;
3580                 l_eff_int_row := x_eff_int_tbl.next(l_eff_int_row);
3581               END LOOP;
3582               print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3583             ELSE
3584               print_debug('in procedure interest_date_range - get the next rate change date');
3585               --get the next rate change date
3586               --and so on and so forth
3587               l_next_rate_change_date := get_next_rate_change_date(l_rate_change_start_date, l_int_param_tbl);
3588               print_debug('in procedure interest_date_range - l_next_rate_change_date : ' || l_next_rate_change_date);
3589               --end dt LESS THAN NRCSD
3590               /*IF (l_end_date < l_next_rate_change_date) THEN
3591                 get_eff_int_rate(l_rate_change_start_date, l_rate_change_start_date, l_int_param_tbl , x_eff_int_tbl);
3592                 l_eff_int_row := x_eff_int_tbl.first;
3593                 WHILE (l_eff_int_row IS NOT NULL)
3594                 LOOP
3595                   l_int_tbl_row := l_int_tbl_row + 1;
3596                   l_interest_rate_tbl(l_int_tbl_row).from_date := l_rate_change_start_date;
3597                   l_interest_rate_tbl(l_int_tbl_row).to_date := l_end_date;
3598                   l_interest_rate_tbl(l_int_tbl_row).rate := x_eff_int_tbl(l_eff_int_row).rate;
3599                   l_interest_rate_tbl(l_int_tbl_row).derived_flag := x_eff_int_tbl(l_eff_int_row).derived_flag;
3600                   l_eff_int_row := x_eff_int_tbl.next(l_eff_int_row);
3601                 END LOOP;
3602               ELSE*/
3603                 --end dt NOT LESS THAN NRCSD
3604                 print_debug('in procedure interest_date_range - end dt NOT LESS THAN NRCSD');
3605                 LOOP
3606                   print_debug('2 -> before calling get_eff_int_rate.');
3607 
3608                   --Added by bkatraga for bug 13258144
3609                   l_int_start_date := l_rate_change_start_date;
3610                   IF (cur_int_param.rate_delay_code = 'DAYS') THEN
3611                     l_int_start_date := l_int_start_date - cur_int_param.rate_delay_frequency;
3612                   ELSIF (cur_int_param.rate_delay_code = 'MONTHS') THEN
3613                     l_int_start_date := add_months(l_int_start_date, -1 * cur_int_param.rate_delay_frequency);
3614                   END IF;
3615                   --end bkatraga for bug 13258144
3616 
3617                   --Modified parameters by bkatraga for bug 13258144
3618                   get_eff_int_rate(l_int_start_date, l_int_start_date, l_int_param_tbl , x_eff_int_tbl);
3619                   l_eff_int_row := x_eff_int_tbl.first;
3620                   WHILE (l_eff_int_row IS NOT NULL)
3621                   LOOP
3622                     l_int_tbl_row := l_int_tbl_row + 1;
3623                     l_interest_rate_tbl(l_int_tbl_row).from_date := l_rate_change_start_date;
3624                     IF (l_end_date < l_next_rate_change_date) THEN
3625                       l_interest_rate_tbl(l_int_tbl_row).to_date := l_end_date;
3626                     ELSE
3627                       IF (l_next_rate_change_date IS NOT NULL) THEN
3628                         l_interest_rate_tbl(l_int_tbl_row).to_date := l_next_rate_change_date - 1;
3629                       ELSE
3630                         l_interest_rate_tbl(l_int_tbl_row).to_date := cur_int_param.contract_end_date;
3631                       END IF;
3632                     END IF;
3633                     l_interest_rate_tbl(l_int_tbl_row).rate := x_eff_int_tbl(l_eff_int_row).rate;
3634                     l_interest_rate_tbl(l_int_tbl_row).derived_flag := x_eff_int_tbl(l_eff_int_row).derived_flag;
3635                     l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := x_eff_int_tbl(l_eff_int_row).apply_tolerance;
3636                     l_eff_int_row := x_eff_int_tbl.next(l_eff_int_row);
3637                   END LOOP;
3638 
3639                   EXIT WHEN ((l_end_date < l_next_rate_change_date) OR
3640                              (l_rate_change_start_date = cur_int_param.contract_end_date));
3641                   l_rate_change_start_date := l_next_rate_change_date;
3642                   l_next_rate_change_date := get_next_rate_change_date(l_rate_change_start_date, l_int_param_tbl);
3643                   print_debug('1 -> l_rate_change_start_date : ' || l_rate_change_start_date);
3644                   print_debug('1 -> l_next_rate_change_date : ' || l_next_rate_change_date);
3645                 END LOOP;
3646                 print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3647               --END IF;
3648             END IF;
3649 
3650           END IF;
3651         ELSE
3652           --start dt NOT LESS THAN RCSD
3653           IF (cur_int_param.rate_change_frequency_code = 'DAILY') THEN
3654             --l_start_date := l_rate_change_start_date;
3655             print_debug('3 -> before calling get_eff_int_rate.');
3656 
3657             --Added by bkatraga for bug 13258144
3658             l_int_start_date := l_start_date;
3659             l_int_end_date   := l_end_date;
3660             IF (cur_int_param.rate_delay_code = 'DAYS') THEN
3661                l_int_start_date := l_int_start_date - cur_int_param.rate_delay_frequency;
3662                l_int_end_date := l_int_end_date - cur_int_param.rate_delay_frequency;
3663             ELSIF (cur_int_param.rate_delay_code = 'MONTHS') THEN
3664                l_int_start_date := add_months(l_int_start_date, -1 * cur_int_param.rate_delay_frequency);
3665                l_int_end_date := add_months(l_int_end_date, -1 * cur_int_param.rate_delay_frequency);
3666             END IF;
3667             --end bkatraga for bug 13258144
3668 
3669             --Modified parameters by bkatraga for bug 13258144
3670             get_eff_int_rate(l_int_start_date, l_int_end_date, l_int_param_tbl , x_eff_int_tbl);
3671             l_eff_int_row := x_eff_int_tbl.first;
3672             WHILE (l_eff_int_row IS NOT NULL)
3673             LOOP
3674               l_int_tbl_row := l_int_tbl_row + 1;
3675               l_interest_rate_tbl(l_int_tbl_row).from_date := x_eff_int_tbl(l_eff_int_row).from_date;
3676               l_interest_rate_tbl(l_int_tbl_row).to_date := x_eff_int_tbl(l_eff_int_row).to_date;
3677               l_interest_rate_tbl(l_int_tbl_row).rate := x_eff_int_tbl(l_eff_int_row).rate;
3678               l_interest_rate_tbl(l_int_tbl_row).derived_flag := x_eff_int_tbl(l_eff_int_row).derived_flag;
3679               l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := x_eff_int_tbl(l_eff_int_row).apply_tolerance;
3680               l_eff_int_row := x_eff_int_tbl.next(l_eff_int_row);
3681             END LOOP;
3682             print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3683           ELSE
3684 
3685             print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3686             print_debug('in procedure interest_date_range - start dt NOT LESS THAN RCSD');
3687             l_next_rate_change_date := get_next_rate_change_date(l_rate_change_start_date, l_int_param_tbl);
3688 
3689             LOOP
3690               print_debug('l_start_date : ' || l_start_date);
3691               print_debug('l_next_rate_change_date : ' || l_next_rate_change_date);
3692 
3693               EXIT WHEN ((l_start_date < l_next_rate_change_date) OR
3694                          (l_rate_change_start_date = cur_int_param.contract_end_date));
3695               l_rate_change_start_date := l_next_rate_change_date;
3696               l_next_rate_change_date := get_next_rate_change_date(l_rate_change_start_date, l_int_param_tbl);
3697             END LOOP;
3698 
3699             --end dt LESS THAN NRCSD
3700             print_debug('in procedure interest_date_range - end dt LESS THAN NRCSD');
3701             IF (l_end_date < l_next_rate_change_date) THEN
3702               print_debug('4 -> before calling get_eff_int_rate.');
3703 
3704               --Added by bkatraga for bug 13258144
3705               l_int_start_date := l_rate_change_start_date;
3706               IF (cur_int_param.rate_delay_code = 'DAYS') THEN
3707                 l_int_start_date := l_int_start_date - cur_int_param.rate_delay_frequency;
3708               ELSIF (cur_int_param.rate_delay_code = 'MONTHS') THEN
3709                 l_int_start_date := add_months(l_int_start_date, -1 * cur_int_param.rate_delay_frequency);
3710               END IF;
3711               --end bkatraga for bug 13258144
3712 
3713               --Modified parameters by bkatraga for bug 13258144
3714               get_eff_int_rate(l_int_start_date, l_int_start_date, l_int_param_tbl , x_eff_int_tbl);
3715               l_eff_int_row := x_eff_int_tbl.first;
3716               WHILE (l_eff_int_row IS NOT NULL)
3717               LOOP
3718                 l_int_tbl_row := l_int_tbl_row + 1;
3719                 l_interest_rate_tbl(l_int_tbl_row).from_date := l_start_date;
3720                 l_interest_rate_tbl(l_int_tbl_row).to_date := l_end_date;
3721                 l_interest_rate_tbl(l_int_tbl_row).rate := x_eff_int_tbl(l_eff_int_row).rate;
3722                 l_interest_rate_tbl(l_int_tbl_row).derived_flag := x_eff_int_tbl(l_eff_int_row).derived_flag;
3723                 l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := x_eff_int_tbl(l_eff_int_row).apply_tolerance;
3724                 l_eff_int_row := x_eff_int_tbl.next(l_eff_int_row);
3725               END LOOP;
3726               --end dt NOT LESS THAN NRCSD
3727               print_debug('in procedure interest_date_range - end dt NOT LESS THAN NRCSD');
3728               print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3729             ELSE
3730               LOOP
3731                 print_debug('5 -> before calling get_eff_int_rate.');
3732 
3733                 --Added by bkatraga for bug 13258144
3734                 l_int_start_date := l_rate_change_start_date;
3735                 IF (cur_int_param.rate_delay_code = 'DAYS') THEN
3736                    l_int_start_date := l_int_start_date - cur_int_param.rate_delay_frequency;
3737                 ELSIF (cur_int_param.rate_delay_code = 'MONTHS') THEN
3738                    l_int_start_date := add_months(l_int_start_date, -1 * cur_int_param.rate_delay_frequency);
3739                 END IF;
3740                 --end bkatraga for bug 13258144
3741 
3742                 --Modified parameters by bkatraga for bug 13258144
3743                 get_eff_int_rate(l_int_start_date, l_int_start_date, l_int_param_tbl , x_eff_int_tbl);
3744                 l_eff_int_row := x_eff_int_tbl.first;
3745                 WHILE (l_eff_int_row IS NOT NULL)
3746                 LOOP
3747                   l_int_tbl_row := l_int_tbl_row + 1;
3748                   IF (l_start_date >= l_rate_change_start_date) THEN
3749                     l_interest_rate_tbl(l_int_tbl_row).from_date := l_start_date;
3750                   ELSE
3751                     l_interest_rate_tbl(l_int_tbl_row).from_date := l_rate_change_start_date;
3752                   END IF;
3753 
3754                   IF (l_end_date < NVL(l_next_rate_change_date, l_end_date)) THEN
3755                     l_interest_rate_tbl(l_int_tbl_row).to_date := l_end_date;
3756                   ELSE
3757                     IF (l_next_rate_change_date IS NOT NULL) THEN
3758                       l_interest_rate_tbl(l_int_tbl_row).to_date := l_next_rate_change_date - 1;
3759                     ELSE
3760                       l_interest_rate_tbl(l_int_tbl_row).to_date := cur_int_param.contract_end_date;
3761                     END IF;
3762                   END IF;
3763                   l_interest_rate_tbl(l_int_tbl_row).rate := x_eff_int_tbl(l_eff_int_row).rate;
3764                   l_interest_rate_tbl(l_int_tbl_row).derived_flag := x_eff_int_tbl(l_eff_int_row).derived_flag;
3765                   l_interest_rate_tbl(l_int_tbl_row).apply_tolerance := x_eff_int_tbl(l_eff_int_row).apply_tolerance;
3766                   l_eff_int_row := x_eff_int_tbl.next(l_eff_int_row);
3767                 END LOOP;
3768 
3769                 EXIT WHEN ((l_end_date < l_next_rate_change_date) OR
3770                             (l_rate_change_start_date = cur_int_param.contract_end_date));
3771                 l_rate_change_start_date := l_next_rate_change_date;
3772                 l_next_rate_change_date := get_next_rate_change_date(l_rate_change_start_date, l_int_param_tbl);
3773                 print_debug('2 -> l_rate_change_start_date : ' || l_rate_change_start_date);
3774                 print_debug('2 -> l_next_rate_change_date : ' || l_next_rate_change_date);
3775               END LOOP;
3776               print_table_content(l_int_param_tbl , l_interest_rate_tbl);
3777             END IF;
3778           END IF;--here
3779         END IF;
3780       END IF;
3781 
3782     END LOOP;
3783 
3784     /*--Commented by bkatraga for bug 13258144
3785     --unapply rate delay*/
3786 
3787 
3788     --apply tolerance
3789     print_debug('in procedure interest_date_range - apply tolerance');
3790     apply_tolerance(l_int_param_tbl, l_interest_rate_tbl, x_interest_rate_tbl);
3791     print_table_content(l_int_param_tbl , x_interest_rate_tbl);
3792 
3793     print_debug('exiting procedure interest_date_range');
3794     x_return_status := l_return_status;
3795   Exception
3796 
3797       --Bug# 14528742
3798       WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3799         print_error_message('Exception raised in procedure interest_date_range');
3800         x_return_status := OKL_API.G_RET_STS_ERROR;
3801 
3802    	WHEN OTHERS THEN
3803       print_debug('sqlcode : ' || sqlcode || ' $ sqlerrm : ' || sqlerrm);
3804    		x_return_status := OKL_API.HANDLE_EXCEPTIONS (
3805     					p_api_name	=> l_api_name,
3806     					p_pkg_name	=> G_PKG_NAME,
3807     					p_exc_name	=> 'OTHERS',
3808     					x_msg_count	=> x_msg_count,
3809     					x_msg_data	=> x_msg_data,
3810     					p_api_type	=> '_PVT');
3811 
3812   END interest_date_range;
3813 
3814   ------------------------------------------------------------------------------
3815 
3816   PROCEDURE interest_date_range (
3817             p_api_version        IN  NUMBER,
3818             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
3819             x_return_status      OUT NOCOPY VARCHAR2,
3820             x_msg_count          OUT NOCOPY NUMBER,
3821             x_msg_data           OUT NOCOPY VARCHAR2,
3822             p_contract_id        IN  NUMBER,
3823             p_start_date         IN  DATE,
3824             p_end_date           IN  DATE,
3825             p_process_flag       IN  VARCHAR2 ,
3826             x_interest_rate_tbl OUT NOCOPY interest_rate_tbl_type)   IS
3827 
3828     -----------------------------------------------------------------
3829     -- Declare Process Variable
3830     -----------------------------------------------------------------
3831     l_api_name	        CONSTANT VARCHAR2(30)   := 'interest_date_range';
3832     l_return_status	VARCHAR2(1)             := OKL_API.G_RET_STS_SUCCESS;
3833 
3834     l_interest_rate_tbl interest_rate_tbl_type;
3835     l_interest_rate_tbl_out interest_rate_tbl_type;
3836     l_int_tbl_row       NUMBER := 0;
3837     l_int_tbl_row_out   NUMBER := 0;
3838 
3839     CURSOR c_param_rate(cp_khr_id NUMBER, cp_start_date DATE, cp_end_date DATE) IS
3840     SELECT krp.rowid rate_param_rowid,
3841            GREATEST(trunc(cp_start_date),krp.effective_from_date) start_date,
3842            LEAST(trunc(cp_end_date),NVL(krp.effective_to_date, trunc(sysdate + 9999))) end_date
3843     FROM  okl_k_rate_params krp
3844     WHERE krp.khr_id = cp_khr_id
3845     AND   krp.parameter_type_code = 'ACTUAL'
3846     AND   (cp_start_date BETWEEN krp.effective_from_date AND nvl(krp.effective_to_date, trunc(cp_start_date))
3847            OR    (cp_end_date BETWEEN krp.effective_from_date AND nvl(krp.effective_to_date, trunc(cp_end_date)))
3848            OR    (krp.effective_from_date >= cp_start_date AND nvl(krp.effective_to_date, trunc(sysdate + 9999)) <= cp_end_date));
3849 
3850   BEGIN
3851     print_debug('entering procedure interest_date_range outer with the foll. parameters:-');
3852     print_debug('p_contract_id: ' || p_contract_id);
3853     print_debug('p_start_date: ' || p_start_date);
3854     print_debug('p_end_date: ' || p_end_date);
3855     print_debug('p_process_flag: ' || p_process_flag);
3856 
3857     l_interest_rate_tbl.delete;
3858     l_interest_rate_tbl_out.delete;
3859     l_int_tbl_row_out := 0;
3860 
3861     FOR cur_param_rate IN c_param_rate(p_contract_id, p_start_date, p_end_date) LOOP
3862       print_debug('calling procedure interest_date_range inner with foll. params:-');
3863       print_debug('p_contract_id: ' || p_contract_id);
3864       print_debug('start_date: ' || cur_param_rate.start_date);
3865       print_debug('end_date: ' || cur_param_rate.end_date);
3866       print_debug('rate_param_rowid: ' || cur_param_rate.rate_param_rowid);
3867       interest_date_range (
3868               p_api_version       => 1.0,
3869               p_init_msg_list     => OKL_API.G_FALSE,
3870               x_return_status     => x_return_status,
3871               x_msg_count         => x_msg_count,
3872               x_msg_data          => x_msg_data,
3873               p_contract_id       => p_contract_id,
3874               p_start_date        => cur_param_rate.start_date,
3875               p_end_date          => cur_param_rate.end_date,
3876               p_process_flag      => p_process_flag,
3877               p_rate_param_rowid  => cur_param_rate.rate_param_rowid,
3878               x_interest_rate_tbl => l_interest_rate_tbl);
3879 
3880       IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
3881         print_error_message('Unexpected error raised in call to INTEREST_DATE_RANGE');
3882         RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
3883       ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
3884         print_error_message('Error raised in call to INTEREST_DATE_RANGE');
3885         RAISE Okl_Api.G_EXCEPTION_ERROR;
3886       END IF;
3887 
3888       print_debug('count in l_interest_rate_tbl: ' || l_interest_rate_tbl.count);
3889       l_int_tbl_row := l_interest_rate_tbl.first;
3890       LOOP
3891         EXIT WHEN l_int_tbl_row IS NULL;
3892         l_int_tbl_row_out := l_int_tbl_row_out + 1;
3893         l_interest_rate_tbl_out(l_int_tbl_row_out) := l_interest_rate_tbl(l_int_tbl_row);
3894 
3895         l_int_tbl_row := l_interest_rate_tbl.next(l_int_tbl_row);
3896       END LOOP;
3897       print_debug('count in l_interest_rate_tbl_out: ' || l_interest_rate_tbl_out.count);
3898     END LOOP;
3899 
3900     x_interest_rate_tbl := l_interest_rate_tbl_out;
3901     x_return_status := l_return_status;
3902     print_debug('exiting procedure interest_date_range outer');
3903   Exception
3904 
3905       --Bug# 14528742
3906       WHEN Okl_Api.G_EXCEPTION_ERROR THEN
3907         print_error_message('Exception raised in procedure interest_date_range');
3908         x_return_status := OKL_API.G_RET_STS_ERROR;
3909 
3910    	WHEN OTHERS THEN
3911       print_debug('sqlcode : ' || sqlcode || ' $ sqlerrm : ' || sqlerrm);
3912    		x_return_status := OKL_API.HANDLE_EXCEPTIONS (
3913     					p_api_name	=> l_api_name,
3914     					p_pkg_name	=> G_PKG_NAME,
3915     					p_exc_name	=> 'OTHERS',
3916     					x_msg_count	=> x_msg_count,
3917     					x_msg_data	=> x_msg_data,
3918     					p_api_type	=> '_PVT');
3919 
3920   END interest_date_range;
3921 
3922   ------------------------------------------------------------------------------
3923     -- Start of Comments
3924     -- Created By:       Ramesh Seela
3925     -- Procedure Name    calculate_interest
3926     -- Description:      This procedure is called by Variable Interest Calculation for Loans
3927     --                   Inputs :
3928     --                   Output : Interest Calculated
3929     -- Dependencies:
3930     -- Parameters:       Start Date, End Date, Interest Rate Range.
3931     -- Version:          1.0
3932     -- End of Comments
3933 
3934   ------------------------------------------------------------------------------
3935   Function  calculate_interest (
3936             p_api_version        IN  NUMBER,
3937             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
3938             x_return_status      OUT NOCOPY VARCHAR2,
3939             x_msg_count          OUT NOCOPY NUMBER,
3940             x_msg_data           OUT NOCOPY VARCHAR2,
3941             p_contract_id        IN  NUMBER,
3942             p_from_date          IN  DATE,
3943             p_to_date            IN  DATE,
3944             p_principal_amount   IN  NUMBER,
3945             p_currency_code      IN  VARCHAR2,
3946             --Bug# 14165508
3947             p_conversion_factor  IN  NUMBER DEFAULT NULL) RETURN NUMBER  IS
3948 
3949   l_api_name                  CONSTANT    VARCHAR2(30) := 'CALCULATE_INTEREST';
3950   l_api_version               CONSTANT    NUMBER       := 1.0;
3951   l_interest_rate_tbl         interest_rate_tbl_type;
3952   l_interest_rate_tbl_count   NUMBER;
3953   l_interest_rate_tbl_counter NUMBER;
3954   l_interest_rate_tbl_index   NUMBER;
3955   l_return_status             VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
3956   l_msg_count                 NUMBER;
3957   l_msg_data                  VARCHAR2(2000);
3958   l_from_date                 DATE;
3959   l_to_date                   DATE;
3960   l_interest_rate             NUMBER;
3961   l_calc_days                 NUMBER;
3962   l_year_days                 NUMBER;
3963   l_interest_amt              NUMBER := 0;
3964   l_total_interest_amt        NUMBER := 0;
3965   l_year_part                 NUMBER;
3966   l_interest_basis            OKL_K_RATE_PARAMS.interest_basis_code%TYPE;
3967   l_calculation_formula_id    OKL_K_RATE_PARAMS.calculation_formula_id%TYPE;
3968   l_derived_flag              VARCHAR2(1);
3969   calculate_interest_failed   EXCEPTION;
3970 
3971 
3972   BEGIN
3973     x_return_status     := OKL_API.G_RET_STS_SUCCESS;
3974 
3975     print_debug('Executing procedure CALCULATE_INTEREST using following parameters : ');
3976     print_debug(' p_contract_id : '|| p_contract_id );
3977 	print_debug(' p_from_date : '|| to_char(p_from_date));
3978 	print_debug(' p_to_date : '|| to_char(p_to_date));
3979 	print_debug(' p_principal_amount: '|| p_principal_amount);
3980 	print_debug(' p_currency_code : '|| p_currency_code);
3981 
3982     print_debug(' g_contract_id : '|| G_CONTRACT_ID );
3983 
3984 	Initialize_contract_params( p_api_version   => 1.0,
3985                                 p_init_msg_list => OKL_API.G_FALSE,
3986                                 x_return_status => x_return_status,
3987                                 x_msg_count     => x_msg_count,
3988                                 x_msg_data      => x_msg_data,
3989                                 p_contract_id   => p_contract_id
3990                               );
3991     IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
3992 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS completed successfully');
3993     ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
3994   	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
3995   	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
3996        RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
3997     ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
3998 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
3999 	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
4000        RAISE calculate_interest_failed;
4001     END IF;
4002 
4003 
4004     print_debug('Days in a month: '|| G_DAYS_IN_A_MONTH_CODE);
4005 	print_debug('Days in a year: '|| G_DAYS_IN_A_YEAR_CODE);
4006 
4007      /* start prasjain bug#5645266
4008              Added the check condition as the interest is getting calculated for
4009              31 days if the interest rate changes on 31st of the month in a 30/360
4010              contract
4011         */
4012 
4013            --Bug# 14165508: Always pass the actual date
4014            interest_date_range (
4015                p_api_version       => 1.0,
4016                p_init_msg_list     => OKL_API.G_FALSE,
4017                x_return_status     => x_return_status,
4018                x_msg_count         => x_msg_count,
4019                x_msg_data          => x_msg_data,
4020                p_contract_id       => p_contract_id,
4021                p_start_date        => p_from_date,
4022                p_end_date          => p_to_date,
4023                p_process_flag      => G_INTEREST_CALCULATION_BASIS, /* value is set in Calculate_total_interest_due */
4024                x_interest_rate_tbl => l_interest_rate_tbl);
4025 
4026       -- end prasjain bug#5645266
4027 
4028     IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
4029       print_error_message('Unexpected error raised in call to INTEREST_DATE_RANGE');
4030       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
4031     ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
4032       print_error_message('Error raised in call to INTEREST_DATE_RANGE');
4033       RAISE calculate_interest_failed;
4034     END IF;
4035 
4036     l_interest_rate_tbl_count := l_interest_rate_tbl.COUNT;
4037 
4038     print_debug('No. of records in Interest Date Range TAble : '|| l_interest_rate_tbl_count);
4039 
4040     IF (l_interest_rate_tbl_count = 0) THEN
4041        RETURN 0;
4042     END IF;
4043     l_interest_rate_tbl_index := l_interest_rate_tbl.FIRST;
4044 
4045     FOR l_interest_rate_tbl_counter in 1 .. l_interest_rate_tbl_count
4046     LOOP
4047        l_from_date     := l_interest_rate_tbl(l_interest_rate_tbl_index).from_date;
4048        l_to_date       := l_interest_rate_tbl(l_interest_rate_tbl_index).to_date;
4049        l_interest_rate := l_interest_rate_tbl(l_interest_rate_tbl_index).rate;
4050        l_derived_flag  := l_interest_rate_tbl(l_interest_rate_tbl_index).derived_flag;
4051 
4052        print_debug('From Date: '|| l_from_date ||' To Date: '|| l_to_date||' Interest: '|| l_interest_rate || 'Derived flag: '|| l_derived_flag);
4053 
4054        IF (G_DAYS_IN_A_MONTH_CODE = '30') THEN
4055           -- gboomina modified for bug 7130132 - Start
4056           -- using correct day count logic from OKL_PRICING_UTILS_PVT
4057 
4058           print_debug('p_conversion_factor '||p_conversion_factor);
4059           l_calc_days := OKL_PRICING_UTILS_PVT.get_day_count( G_DAYS_IN_A_MONTH_CODE,
4060                                                               G_DAYS_IN_A_YEAR_CODE,
4061                                                               l_from_date,
4062                                                               l_to_date,
4063                                                               'Y',
4064                                                               x_return_status,
4065                                                               --Bug# 14165508
4066                                                               p_conversion_factor);
4067           -- gboomina modified for bug 7130132 - End
4068        ELSE
4069           l_calc_days := l_to_date - l_from_date + 1;
4070        END IF;
4071 
4072        print_debug('No. of calc Days : '|| l_calc_days);
4073 
4074        IF (G_DAYS_IN_A_YEAR_CODE = 'ACTUAL') THEN
4075           l_year_part := to_char(l_from_date, 'YYYY');
4076           l_year_days := (to_date(('01-01-'||(l_year_part+1)),'DD-MM-YYYY') - to_date(('01-01-'||l_year_part),
4077 'DD-MM-YYYY'));
4078        ELSE
4079           l_year_days := G_DAYS_IN_A_YEAR_CODE;
4080        END IF;
4081 
4082        print_debug('No. of Days in the year: '|| l_year_days);
4083 
4084        l_interest_amt            := OKL_ACCOUNTING_UTIL.round_amount((p_principal_amount * l_interest_rate/100) * (
4085 l_calc_days / l_year_days), p_currency_code);
4086 
4087        print_debug(' Interest : '|| l_interest_amt);
4088        l_total_interest_amt      := l_total_interest_amt + l_interest_amt;
4089        l_interest_rate_tbl_index := l_interest_rate_tbl.NEXT(l_interest_rate_tbl_index);
4090 
4091        print_debug ('g_request_id : '|| g_request_id);
4092        print_debug ('Concurrent Request ID : '|| fnd_global.conc_request_id);
4093        print_debug ('l_derived_flag : '|| l_derived_flag);
4094 
4095        IF ((g_request_id > 0) AND (l_derived_flag = 'Y'))THEN
4096            g_vir_tbl_counter                                     := nvl(g_vir_tbl_counter,0) + 1;
4097            g_vir_tbl(g_vir_tbl_counter).id                       := okc_p_util.raw_to_number(sys_guid());
4098            g_vir_tbl(g_vir_tbl_counter).khr_id                   := p_contract_id;
4099            g_vir_tbl(g_vir_tbl_counter).kle_id                   := G_CONTRACT_LINE_ID;
4100            IF (G_CALC_METHOD_CODE = 'DAILY_INTEREST') THEN
4101              g_vir_tbl(g_vir_tbl_counter).source_table           := 'OKL_STRM_ELEMENTS_B';
4102            ELSIF (G_CALC_METHOD_CODE = 'REAMORT') THEN
4103              g_vir_tbl(g_vir_tbl_counter).source_table           := 'OKL_VAR_INT_PROCESS_B';
4104            ELSE
4105              g_vir_tbl(g_vir_tbl_counter).source_table           := 'OKL_TRX_AR_INVOICES_V';
4106            END IF;
4107            g_vir_tbl(g_vir_tbl_counter).interest_rate            := l_interest_rate;
4108            g_vir_tbl(g_vir_tbl_counter).interest_calc_start_date := l_from_date;
4109            g_vir_tbl(g_vir_tbl_counter).interest_calc_end_date   := l_to_date;
4110            g_vir_tbl(g_vir_tbl_counter).calc_method_code         := G_CALC_METHOD_CODE;
4111            g_vir_tbl(g_vir_tbl_counter).principal_balance        := p_principal_amount;
4112            g_vir_tbl(g_vir_tbl_counter).valid_yn                 := 'Y';
4113            g_vir_tbl(g_vir_tbl_counter).object_version_number    := 1.0;
4114            g_vir_tbl(g_vir_tbl_counter).org_id                   := g_authoring_org_id;
4115            g_vir_tbl(g_vir_tbl_counter).request_id               := g_request_id;
4116            g_vir_tbl(g_vir_tbl_counter).program_application_id   := NULL;
4117            g_vir_tbl(g_vir_tbl_counter).program_id               := NULL;
4118            g_vir_tbl(g_vir_tbl_counter).program_update_date      := SYSDATE;
4119            g_vir_tbl(g_vir_tbl_counter).attribute_category       := NULL;
4120            g_vir_tbl(g_vir_tbl_counter).attribute1               := NULL;
4121            g_vir_tbl(g_vir_tbl_counter).attribute2               := NULL;
4122            g_vir_tbl(g_vir_tbl_counter).attribute3               := NULL;
4123            g_vir_tbl(g_vir_tbl_counter).attribute4               := NULL;
4124            g_vir_tbl(g_vir_tbl_counter).attribute5               := NULL;
4125            g_vir_tbl(g_vir_tbl_counter).attribute6               := NULL;
4126            g_vir_tbl(g_vir_tbl_counter).attribute7               := NULL;
4127            g_vir_tbl(g_vir_tbl_counter).attribute8               := NULL;
4128            g_vir_tbl(g_vir_tbl_counter).attribute9               := NULL;
4129            g_vir_tbl(g_vir_tbl_counter).attribute10              := NULL;
4130            g_vir_tbl(g_vir_tbl_counter).attribute11              := NULL;
4131            g_vir_tbl(g_vir_tbl_counter).attribute12              := NULL;
4132            g_vir_tbl(g_vir_tbl_counter).attribute13              := NULL;
4133            g_vir_tbl(g_vir_tbl_counter).attribute14              := NULL;
4134            g_vir_tbl(g_vir_tbl_counter).attribute15              := NULL;
4135            g_vir_tbl(g_vir_tbl_counter).created_by               := FND_GLOBAL.user_id;
4136            g_vir_tbl(g_vir_tbl_counter).creation_date            := SYSDATE;
4137            g_vir_tbl(g_vir_tbl_counter).last_updated_by          := FND_GLOBAL.user_id;
4138            g_vir_tbl(g_vir_tbl_counter).last_update_date         := SYSDATE;
4139            g_vir_tbl(g_vir_tbl_counter).last_update_login        := FND_GLOBAL.login_id;
4140            g_vir_tbl(g_vir_tbl_counter).interest_amt             := l_interest_amt;
4141            g_vir_tbl(g_vir_tbl_counter).interest_calc_days       := l_calc_days;
4142            --Bug# 13447258: Changes to store catchup calculated values
4143            g_vir_tbl(g_vir_tbl_counter).catchup_amt              := NULL;
4144            g_vir_tbl(g_vir_tbl_counter).catchup_settlement_code  := NULL;
4145        END IF;
4146     END LOOP;
4147 
4148     print_debug ('Total interest amount : '|| l_total_interest_amt);
4149 
4150     RETURN l_total_interest_amt;
4151 
4152   EXCEPTION
4153      WHEN calculate_interest_failed THEN
4154       print_error_message('Exception calculate_interest_failed raised in function CALCULATE_INTEREST');
4155       x_return_status := OKL_API.G_RET_STS_ERROR;
4156       RETURN NULL;
4157      WHEN OTHERS THEN
4158       print_error_message('Exception raised in function CALCULATE_INTEREST');
4159        Okl_Api.SET_MESSAGE(
4160                p_app_name     => G_APP_NAME,
4161                p_msg_name     => G_UNEXPECTED_ERROR,
4162                p_token1       => G_SQLCODE_TOKEN,
4163                p_token1_value => SQLCODE,
4164                p_token2       => G_SQLERRM_TOKEN,
4165                p_token2_value => SQLERRM);
4166           x_return_status := OKL_API.G_RET_STS_ERROR;
4167           RETURN NULL;
4168 
4169   END calculate_interest;
4170 
4171 ------------------------------------------------------------------------------
4172 
4173     -- Start of Comments
4174     -- Created By:       Ramesh Seela
4175     -- Procedure Name    Calc_Variable_Rate_Interest
4176     -- Description:      This procedure is called by Variable Interest Calculation for Loans
4177     -- Inputs :
4178     -- Output : Interest Calculated
4179     -- Dependencies:
4180     -- Parameters:       Start Date, End Date, Interest Rate Range.
4181     -- Version:          1.0
4182     -- End of Comments
4183 
4184   ------------------------------------------------------------------------------
4185   Function  Calc_Variable_Rate_Interest (
4186             p_api_version        IN  NUMBER,
4187             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
4188             x_return_status      OUT NOCOPY VARCHAR2,
4189             x_msg_count          OUT NOCOPY NUMBER,
4190             x_msg_data           OUT NOCOPY VARCHAR2,
4191             p_contract_id        IN  NUMBER,
4192             p_currency_code      IN  VARCHAR2,
4193             p_principal_balance_tbl IN  principal_balance_tbl_typ,
4194             --Bug# 14165508
4195             p_conversion_factor  IN NUMBER DEFAULT NULL) RETURN NUMBER  IS
4196 
4197   l_api_name                  CONSTANT    VARCHAR2(30) := 'CALC_VARIABLE_RATE_INTEREST';
4198   l_api_version               CONSTANT    NUMBER       := 1.0;
4199   l_principal_balance_tbl     principal_balance_tbl_typ;
4200   l_principal_bal_tbl_count   NUMBER;
4201   l_principal_bal_tbl_counter NUMBER;
4202   l_principal_bal_tbl_index   NUMBER;
4203   l_return_status             VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
4204   l_msg_count                 NUMBER;
4205   l_msg_data                  VARCHAR2(2000);
4206   l_from_date                 DATE;
4207   l_to_date                   DATE;
4208   l_interest_amt              NUMBER := 0;
4209   l_total_interest_amt        NUMBER := 0;
4210   Calc_Var_Rate_Int_failed    EXCEPTION;
4211 
4212   BEGIN
4213     print_debug('Executing function CALC_VARIABLE_RATE_INTEREST using following parameters : ');
4214     print_debug('p_contract_id : '|| p_contract_id );
4215 	print_debug('p_currency_code : '|| p_currency_code);
4216 
4217     x_return_status               := OKL_API.G_RET_STS_SUCCESS;
4218     l_principal_balance_tbl       := p_principal_balance_tbl;
4219     l_principal_bal_tbl_count     := l_principal_balance_tbl.COUNT;
4220 
4221     print_debug ('No. of records in Principal balance table: '|| l_principal_bal_tbl_count);
4222     IF (l_principal_bal_tbl_count = 0) THEN
4223        RETURN 0;
4224     END IF;
4225     l_principal_bal_tbl_index := l_principal_balance_tbl.FIRST;
4226 
4227     FOR l_principal_bal_tbl_counter in 1 .. l_principal_bal_tbl_count
4228     LOOP
4229        l_from_date := l_principal_balance_tbl(l_principal_bal_tbl_index).from_date;
4230        l_to_date   := l_principal_balance_tbl(l_principal_bal_tbl_index).to_date;
4231 
4232        IF (l_principal_balance_tbl(l_principal_bal_tbl_index).principal_balance > 0) THEN
4233          l_interest_amt := calculate_interest (
4234                                                p_api_version       => 1.0,
4235                                                p_init_msg_list     => OKL_API.G_FALSE,
4236                                                x_return_status     => x_return_status,
4237                                                x_msg_count         => x_msg_count,
4238                                                x_msg_data          => x_msg_data,
4239                                                p_contract_id       => p_contract_id,
4240                                                p_from_date         => l_from_date,
4241                                                p_to_date           => l_to_date,
4242                                                p_principal_amount  => l_principal_balance_tbl(l_principal_bal_tbl_index).principal_balance,
4243                                                p_currency_code     => p_currency_code,
4244                                                --Bug# 14165508
4245                                                p_conversion_factor => p_conversion_factor);
4246 
4247          IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
4248            print_error_message('Unexpected error raised in call to CALCULATE_INTEREST');
4249            RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
4250          ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
4251            print_error_message('Error raised in call to CALCULATE_INTEREST');
4252            RAISE Calc_Var_Rate_Int_failed;
4253          END IF;
4254        ELSE
4255 	     l_interest_amt := 0;
4256 	   END IF;
4257 
4258        l_total_interest_amt := l_total_interest_amt + l_interest_amt;
4259        l_principal_bal_tbl_index := l_principal_balance_tbl.NEXT(l_principal_bal_tbl_index);
4260 
4261     END LOOP;
4262     print_debug('Total Interest Amount: '|| l_total_interest_amt);
4263 
4264     RETURN l_total_interest_amt;
4265 
4266   EXCEPTION
4267     WHEN Calc_Var_Rate_Int_failed THEN
4268       print_error_message('Exception Calc_Var_Rate_Int_failed raised in function CALC_VARIABLE_RATE_INTEREST');
4269       x_return_status := OKL_API.G_RET_STS_ERROR;
4270       RETURN NULL;
4271 
4272     WHEN OTHERS THEN
4273       print_error_message('Exception raised in function CALC_VARIABLE_RATE_INTEREST');
4274       Okl_Api.SET_MESSAGE(
4275               p_app_name     => G_APP_NAME,
4276               p_msg_name     => G_UNEXPECTED_ERROR,
4277               p_token1       => G_SQLCODE_TOKEN,
4278               p_token1_value => SQLCODE,
4279               p_token2       => G_SQLERRM_TOKEN,
4280               p_token2_value => SQLERRM);
4281       x_return_status := OKL_API.G_RET_STS_ERROR;
4282       RETURN NULL;
4283 
4284 
4285   END Calc_Variable_Rate_Interest;
4286 
4287 ------------------------------------------------------------------------------
4288 
4289     -- Start of Comments
4290     -- Created By:       Ramesh Seela
4291     -- Procedure Name    UPD_VIR_PARAMS_WITH_INVOICE
4292     -- Description:      This procedure is called by Variable Interest Calculation for Loans
4293     --                   Inputs :
4294     --                   Output : Interest Calculated
4295     -- Dependencies:
4296     -- Parameters:       Start Date, End Date, Interest Rate Range.
4297     -- Version:          1.0
4298     -- End of Comments
4299 
4300   ------------------------------------------------------------------------------
4301   Procedure upd_vir_params_with_invoice (
4302             p_api_version        IN  NUMBER,
4303             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
4304             x_return_status      OUT NOCOPY VARCHAR2,
4305             x_msg_count          OUT NOCOPY NUMBER,
4306             x_msg_data           OUT NOCOPY VARCHAR2,
4307             p_source_id          IN  NUMBER,
4308             p_catchup_amt        IN  NUMBER DEFAULT NULL,
4309             p_catchup_settlement_code IN VARCHAR2 DEFAULT NULL,
4310             p_vir_tbl            IN  vir_tbl_type,
4311             x_vir_tbl            OUT NOCOPY vir_tbl_type,
4312             --Bug# 12974796
4313             p_source_table       IN  VARCHAR2 DEFAULT NULL) IS
4314 
4315   l_api_name                  CONSTANT    VARCHAR2(30) := 'UPD_VIR_PARAMS_WITH_INVOICE';
4316   l_api_version               CONSTANT    NUMBER       := 1.0;
4317   l_index                     NUMBER := 0;
4318 
4319   BEGIN
4320     x_return_status               := OKL_API.G_RET_STS_SUCCESS;
4321     x_vir_tbl                    := p_vir_tbl;
4322 
4323     print_debug('Executing procedure UPD_VIR_PARAMS_WITH_INVOICE using following parameters : ');
4324     print_debug(' p_source_id : '|| p_source_id );
4325     print_debug(' p_catchup_amt : '|| p_catchup_amt );
4326     print_debug(' p_catchup_settlement_code : '|| p_catchup_settlement_code );
4327 
4328     print_debug(' g_vir_tbl_counter : '|| g_vir_tbl_counter );
4329     -- 5034946
4330     IF (NVL(g_vir_tbl_counter,0) > 0 ) THEN
4331       FOR l_index in 1 .. g_vir_tbl_counter
4332       LOOP
4333         x_vir_tbl(l_index).source_id := p_source_id;
4334 
4335         --Bug# 12974796
4336         IF p_source_table IS NOT NULL THEN
4337           x_vir_tbl(l_index).source_table := p_source_table;
4338         END IF;
4339 
4340         IF (p_source_table = 'OKL_VAR_INT_PARAMS') THEN
4341           x_vir_tbl(l_index).source_id := x_vir_tbl(l_index).id;
4342         END IF;
4343         --Bug# 12974796
4344 
4345       END LOOP;
4346 
4347       IF p_catchup_amt IS NOT NULL THEN
4348         x_vir_tbl(x_vir_tbl.LAST).catchup_amt := p_catchup_amt;
4349       END IF;
4350 
4351       IF p_catchup_settlement_code IS NOT NULL THEN
4352         x_vir_tbl(x_vir_tbl.LAST).catchup_settlement_code := p_catchup_settlement_code;
4353       END IF;
4354 
4355     END IF;
4356 
4357  EXCEPTION
4358 
4359      WHEN OTHERS THEN
4360        print_error_message('Exception raised in procedure UPD_VIR_PARAMS_WITH_INVOICE');
4361         x_return_status := OKL_API.G_RET_STS_ERROR;
4362         Okl_Api.SET_MESSAGE(
4363             p_app_name     => G_APP_NAME,
4364             p_msg_name     => G_UNEXPECTED_ERROR,
4365             p_token1       => G_SQLCODE_TOKEN,
4366             p_token1_value => SQLCODE,
4367             p_token2       => G_SQLERRM_TOKEN,
4368             p_token2_value => SQLERRM);
4369 
4370   END upd_vir_params_with_invoice;
4371 
4372 ------------------------------------------------------------------------------
4373     -- Start of Comments
4374     -- Created By:       Ramesh Seela
4375     -- Procedure Name    print_g_vir_tbl
4376     -- Description:      This procedure prints all the records in the PL/SQL table g_vir_tbl
4377     --
4378     -- Dependencies:
4379     -- Parameters:       .
4380     -- Version:          1.0
4381     -- End of Comments
4382 
4383 ------------------------------------------------------------------------------
4384 
4385   PROCEDURE print_vir_tbl ( p_vir_tbl IN  vir_tbl_type) IS
4386 
4387   l_rec_count    NUMBER;
4388   l_index        NUMBER;
4389   l_counter      NUMBER := 0;
4390   BEGIN
4391        l_rec_count      := p_vir_tbl.COUNT;
4392        IF (l_rec_count > 0) THEN
4393           l_index          := p_vir_tbl.FIRST;
4394           print_debug('VIR Table : ');
4395        ELSE
4396           print_debug('No records exist in the table');
4397        END IF;
4398        FOR l_vir_tbl_counter in 1 .. l_rec_count
4399        LOOP
4400           l_counter     := l_counter + 1;
4401           print_debug( 'Record Number : '||l_counter);
4402 		  print_debug( 'id : '||p_vir_tbl(l_index).id );
4403 		  print_debug( 'khr_id : '||p_vir_tbl(l_index).khr_id);
4404           print_debug( 'source_table : '|| p_vir_tbl(l_index).source_table);
4405           print_debug( 'source_id : '|| p_vir_tbl(l_index).source_id);
4406           print_debug( 'interest_rate : '|| p_vir_tbl(l_index).interest_rate);
4407           print_debug( 'interest_calc_start_date : '|| p_vir_tbl(l_index).interest_calc_start_date);
4408           print_debug( 'interest_calc_end_date : '|| p_vir_tbl(l_index).interest_calc_end_date);
4409           print_debug( 'calc_method_code : '|| p_vir_tbl(l_index).calc_method_code);
4410           print_debug( 'principal_balance : '|| p_vir_tbl(l_index).principal_balance);
4411           print_debug( 'valid_yn : '|| p_vir_tbl(l_index).valid_yn);
4412           print_debug( 'Object_Version_Number : '|| p_vir_tbl(l_index).Object_Version_Number);
4413           print_debug( 'Org ID : '|| p_vir_tbl(l_index).Org_id);
4414           print_debug( 'request ID : '|| p_vir_tbl(l_index).request_id);
4415           print_debug( 'Program Application ID : '|| p_vir_tbl(l_index).program_application_id);
4416           print_debug( 'program ID : '|| p_vir_tbl(l_index).program_id);
4417           print_debug( 'Program Update date : '|| p_vir_tbl(l_index).program_update_date);
4418           print_debug( 'attribute category : '|| p_vir_tbl(l_index).attribute_category);
4419           print_debug( 'attribute1 : '|| p_vir_tbl(l_index).attribute1);
4420           print_debug( 'attribute2 : '|| p_vir_tbl(l_index).attribute2);
4421           print_debug( 'attribute3 : '|| p_vir_tbl(l_index).attribute3);
4422           print_debug( 'attribute4 : '|| p_vir_tbl(l_index).attribute4);
4423           print_debug( 'attribute5 : '|| p_vir_tbl(l_index).attribute5);
4424           print_debug( 'attribute6 : '|| p_vir_tbl(l_index).attribute6);
4425           print_debug( 'attribute7 : '|| p_vir_tbl(l_index).attribute7);
4426           print_debug( 'attribute8 : '|| p_vir_tbl(l_index).attribute8);
4427           print_debug( 'attribute9 : '|| p_vir_tbl(l_index).attribute9);
4428           print_debug( 'attribute10 : '|| p_vir_tbl(l_index).attribute10);
4429           print_debug( 'attribute11 : '|| p_vir_tbl(l_index).attribute11);
4430           print_debug( 'attribute12 : '|| p_vir_tbl(l_index).attribute12);
4431           print_debug( 'attribute13 : '|| p_vir_tbl(l_index).attribute13);
4432           print_debug( 'attribute14 : '|| p_vir_tbl(l_index).attribute14);
4433           print_debug( 'attribute15 : '|| p_vir_tbl(l_index).attribute15);
4434           print_debug( 'created_by : '|| p_vir_tbl(l_index).created_by);
4435           print_debug( 'creation_date : '|| p_vir_tbl(l_index).creation_date);
4436           print_debug( 'last_updated_by : '|| p_vir_tbl(l_index).last_updated_by);
4437           print_debug( 'last_update_date : '|| p_vir_tbl(l_index).last_update_date);
4438           print_debug( 'last_update_login : '|| p_vir_tbl(l_index).last_update_login);
4439           print_debug( 'interest_amt : '|| p_vir_tbl(l_index).interest_amt);
4440           print_debug( 'interest_calc_days : '|| p_vir_tbl(l_index).interest_calc_days);
4441           print_debug( 'kle_id : '|| p_vir_tbl(l_index).kle_id);
4442           l_index       := p_vir_tbl.NEXT(l_index);
4443        END LOOP;
4444   EXCEPTION
4445      WHEN OTHERS THEN
4446        print_error_message('Exception raised in procedure PRINT_VIR_TBL');
4447        Okl_Api.SET_MESSAGE(
4448                p_app_name     => G_APP_NAME,
4449                p_msg_name     => G_UNEXPECTED_ERROR,
4450                p_token1       => G_SQLCODE_TOKEN,
4451                p_token1_value => SQLCODE,
4452                p_token2       => G_SQLERRM_TOKEN,
4453                p_token2_value => SQLERRM);
4454   END;
4455 
4456 ------------------------------------------------------------------------------
4457 
4458   FUNCTION calculate_from_khr_start_date(p_khr_id IN NUMBER,
4459             p_from_date IN DATE) RETURN VARCHAR2 IS
4460 
4461   l_return_value varchar2(10) := 'N';
4462 
4463   --checks for online rebook
4464   CURSOR l_rebook_csr(cp_khr_id NUMBER) IS
4465   SELECT 'Y' return_value
4466   FROM   okc_k_headers_b chrb,
4467          okc_k_headers_b chrb2,
4468           okl_trx_contracts ktrx
4469   WHERE  ktrx.khr_id_old = chrb.id
4470   AND    ktrx.tsu_code = 'PROCESSED'
4471   AND    ktrx.rbr_code IS NOT NULL
4472   AND    ktrx.tcn_type = 'TRBK'
4473   --rkuttiya added for 12.1.1 Multi GAAP
4474   AND    ktrx.representation_type = 'PRIMARY'
4475   --
4476   AND    chrb.id = cp_khr_id
4477   AND    chrb2.orig_system_source_code = 'OKL_REBOOK'
4478   AND    chrb2.id = ktrx.khr_id_new
4479   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4480                     WHERE vpb.khr_id = chrb.id
4481                     AND   vpb.source_table = 'OKL_TRX_CONTRACTS'
4482                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4483                     AND   vpb.source_id = ktrx.id);
4484 
4485   --checks if newly created Daily Interest - Principal stream elements exist
4486   --prior to date passed
4487   CURSOR l_daily_int_strm_csr(cp_khr_id NUMBER, cp_from_date DATE) IS
4488   SELECT 'Y' return_value
4489   FROM okl_streams     stm,
4490        okl_strm_type_b sty,
4491        okl_strm_elements sel
4492   WHERE	stm.khr_id = cp_khr_id
4493   AND	  stm.sty_id = sty.id
4494   AND   sty.stream_type_purpose = 'DAILY_INTEREST_PRINCIPAL'
4495   AND	  stm.id = sel.stm_id
4496   AND   sel.stream_element_date < cp_from_date
4497   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4498                     WHERE vpb.khr_id = stm.khr_id
4499                     AND   vpb.source_table = 'OKL_STRM_ELEMENTS_V'
4500                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4501                     AND   vpb.source_id = sel.id);
4502 
4503   --checks if newly created Principal Catchup stream elements exist
4504   --prior to date passed
4505   CURSOR l_prin_catch_strm_csr(cp_khr_id NUMBER, cp_from_date DATE) IS
4506   SELECT 'Y' return_value
4507   FROM okl_streams     stm,
4508        okl_strm_type_b sty,
4509        okl_strm_elements sel
4510   WHERE	stm.khr_id = cp_khr_id
4511   AND	  stm.sty_id = sty.id
4512   AND   sty.stream_type_purpose = 'PRINCIPAL_CATCHUP'
4513   AND	  stm.id = sel.stm_id
4514   AND   sel.stream_element_date < cp_from_date
4515   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4516                     WHERE vpb.khr_id = stm.khr_id
4517                     AND   vpb.source_table = 'OKL_STRM_ELEMENTS_V'
4518                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4519                     AND   vpb.source_id = sel.id);
4520 
4521   --checks if newly created Receipt Application to PRINCIPAL_PAYMENT, UNSCHEDULED_PRINCIPAL_PAYMENT exist
4522   --prior to date passed
4523  -- Begin - Billing Inline changes - Bug#5898792 - varangan - 23/2/2007
4524 --Bug# 6819044: Fetch receipt applications correctly when
4525 --              invoices have lines from multiple contracts
4526 CURSOR l_rcpt_app_csr(cp_khr_id NUMBER, cp_from_date DATE) IS
4527   SELECT /*+ leading(tai, til, tld, sty, ractrl, aps)  */
4528       'Y' return_value
4529   FROM  okl_txd_ar_ln_dtls_b tld
4530        ,ra_customer_trx_lines_all ractrl
4531        ,okl_txl_ar_inv_lns_b til
4532        ,okl_trx_ar_invoices_b tai
4533        ,ar_payment_schedules_all aps
4534        ,ar_receivable_applications_all raa
4535        ,ar_cash_receipts_all cra
4536        ,okl_strm_type_b sty
4537   WHERE  tai.trx_status_code = 'PROCESSED'
4538   AND    tai.khr_id = cp_khr_id
4539   AND    tld.khr_id = cp_khr_id
4540   AND    ractrl.customer_trx_id = aps.customer_trx_id
4541   AND    raa.applied_customer_trx_id = aps.customer_trx_id
4542   AND    aps.class = 'INV'
4543   AND    raa.application_type = 'CASH'
4544   AND    raa.status = 'APP'
4545   AND    raa.display = 'Y'
4546   AND    cra.receipt_date < cp_from_date
4547   AND    raa.cash_receipt_id = cra.cash_receipt_id
4548   AND    tld.sty_id = sty.id
4549   AND    sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
4550   AND    to_char(tld.id) = ractrl.interface_line_attribute14
4551   AND    tld.til_id_details = til.id
4552   AND    til.tai_id = tai.id
4553   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4554                     WHERE vpb.khr_id = tld.khr_id
4555                     AND   vpb.source_table = 'AR_RECEIVABLE_APPLICATIONS_ALL'
4556                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4557                     AND   vpb.source_id = raa.receivable_application_id)
4558   AND    EXISTS (SELECT 1
4559                  FROM ar_distributions_all ad
4560                  WHERE raa.receivable_application_id = ad.source_id
4561                  AND ad.source_table = 'RA'
4562                  AND (ad.ref_customer_trx_Line_Id IS NULL OR
4563                       ad.ref_customer_trx_Line_Id = ractrl.customer_trx_line_id));
4564 -- End - Billing Inline changes - Bug#5898792 - varangan - 23/2/2007
4565 
4566   --checks if newly created Borrower Payment exist
4567   --prior to date passed
4568   -- sjalasut, modified the cursor to have khr_id be passed from okl_txl_ap_inv_lns_all_b
4569   CURSOR l_borrow_payment_csr(cp_khr_id NUMBER, cp_from_date DATE) IS
4570   SELECT 'Y' return_value
4571   FROM ap_invoices_all ap_inv,
4572        okl_trx_ap_invoices_v okl_inv,
4573        ap_invoice_payment_history_v iph
4574       ,okl_cnsld_ap_invs_all cnsld
4575       ,okl_txl_ap_inv_lns_all_b okl_inv_ln
4576       ,fnd_application fnd_app
4577     WHERE okl_inv.id = okl_inv_ln.tap_id
4578       AND okl_inv_ln.khr_id = cp_khr_id
4579       AND ap_inv.application_id = fnd_app.application_id
4580       AND fnd_app.application_short_name = 'OKL'
4581       AND okl_inv_ln.cnsld_ap_inv_id = cnsld.cnsld_ap_inv_id
4582       AND cnsld.cnsld_ap_inv_id = to_number(ap_inv.reference_key1)
4583       AND okl_inv.funding_type_code = 'BORROWER_PAYMENT'
4584       AND ap_inv.invoice_id = iph.invoice_id
4585       AND iph.check_date < cp_from_date
4586       AND NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4587                     WHERE vpb.khr_id = okl_inv_ln.khr_id
4588                     AND   vpb.source_table = 'AP_INVOICE_PAYMENTS_ALL'
4589                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4590                     AND   vpb.source_id = iph.invoice_payment_id);
4591 
4592   --checks if newly created records for okl_contract_balances which have the asset balances
4593   --as of the partial termination date exist prior to date passed
4594   CURSOR l_partial_term_csr(cp_khr_id NUMBER, cp_from_date DATE) IS
4595   SELECT 'Y' return_value
4596   FROM   okl_contract_balances ocb
4597   WHERE  ocb.khr_id = cp_khr_id
4598   AND    ocb.termination_date < cp_from_date
4599   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4600                     WHERE vpb.khr_id = ocb.khr_id
4601                     AND   vpb.source_table = 'OKL_CONTRACT_BALANCES'
4602                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4603                     AND   vpb.source_id = ocb.id);
4604 
4605 --Bug# 14179413: Include Credit Memos and Adjustments when calculating
4606 --               Actual Principal Balance
4607 CURSOR l_credit_memo_csr(cp_khr_id NUMBER, cp_from_date DATE) IS
4608   SELECT /*+ leading(tai, til, tld, sty, ractrl, aps)  */
4609       'Y' return_value
4610   FROM  okl_txd_ar_ln_dtls_b tld
4611        ,ra_customer_trx_lines_all ractrl
4612        ,okl_txl_ar_inv_lns_b til
4613        ,okl_trx_ar_invoices_b tai
4614        ,ar_payment_schedules_all aps
4615        ,ar_receivable_applications_all raa
4616        ,ra_customer_trx_all cm
4617        ,okl_strm_type_b sty
4618   WHERE  tai.trx_status_code = 'PROCESSED'
4619   AND    tai.khr_id = cp_khr_id
4620   AND    tld.khr_id = cp_khr_id
4621   AND    ractrl.customer_trx_id = aps.customer_trx_id
4622   AND    raa.applied_customer_trx_id = aps.customer_trx_id
4623   AND    aps.class = 'INV'
4624   AND    raa.application_type = 'CM'
4625   AND    raa.status = 'APP'
4626   AND    raa.display = 'Y'
4627   AND    cm.trx_date < cp_from_date
4628   AND    raa.customer_trx_id = cm.customer_trx_id
4629   AND    tld.sty_id = sty.id
4630   AND    sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
4631   AND    to_char(tld.id) = ractrl.interface_line_attribute14
4632   AND    tld.til_id_details = til.id
4633   AND    til.tai_id = tai.id
4634   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4635                     WHERE vpb.khr_id = tld.khr_id
4636                     AND   vpb.source_table = 'AR_RECEIVABLE_APPLICATIONS_ALL'
4637                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4638                     AND   vpb.source_id = raa.receivable_application_id)
4639   AND    EXISTS (SELECT 1
4640                  FROM ar_distributions_all ad
4641                  WHERE raa.receivable_application_id = ad.source_id
4642                  AND ad.source_table = 'RA'
4643                  AND (ad.ref_customer_trx_Line_Id IS NULL OR
4644                       ad.ref_customer_trx_Line_Id = ractrl.customer_trx_line_id));
4645 
4646 --Bug# 14179413: Include Credit Memos and Adjustments when calculating
4647 --               Actual Principal Balance
4648 CURSOR l_adjustment_csr(cp_khr_id NUMBER, cp_from_date DATE) IS
4649   SELECT /*+ leading(tai, til, tld, sty, ractrl, aps)  */
4650       'Y' return_value
4651   FROM  okl_txd_ar_ln_dtls_b tld
4652        ,ra_customer_trx_lines_all ractrl
4653        ,okl_txl_ar_inv_lns_b til
4654        ,okl_trx_ar_invoices_b tai
4655        ,ar_payment_schedules_all aps
4656        ,ar_adjustments_all adj
4657        ,okl_strm_type_b sty
4658   WHERE  tai.trx_status_code = 'PROCESSED'
4659   AND    tai.khr_id = cp_khr_id
4660   AND    tld.khr_id = cp_khr_id
4661   AND    ractrl.customer_trx_id = aps.customer_trx_id
4662   AND    adj.customer_trx_id = aps.customer_trx_id
4663   AND    aps.class = 'INV'
4664   AND    adj.status = 'A'
4665   AND    adj.apply_date < cp_from_date
4666   AND    tld.sty_id = sty.id
4667   AND    sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
4668   AND    to_char(tld.id) = ractrl.interface_line_attribute14
4669   AND    tld.til_id_details = til.id
4670   AND    til.tai_id = tai.id
4671   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4672                     WHERE vpb.khr_id = tld.khr_id
4673                     AND   vpb.source_table = 'AR_ADJUSTMENTS_ALL'
4674                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4675                     AND   vpb.source_id = adj.adjustment_id);
4676 
4677   BEGIN
4678     print_debug('Executing function calculate_from_khr_start_date');
4679 
4680     print_debug('Before Checking for existence of Rebook Transactions');
4681     OPEN l_rebook_csr(p_khr_id);
4682     FETCH l_rebook_csr INTO l_return_value;
4683     CLOSE l_rebook_csr;
4684     print_debug('After Checking for existence of Rebook Transactions');
4685 
4686 
4687     IF (G_DEAL_TYPE = 'LOAN') THEN
4688       IF (G_INTEREST_CALCULATION_BASIS = G_INT_CALC_BASIS_FLOAT) THEN
4689         IF (G_REVENUE_RECOGNITION_METHOD = 'ACTUAL') THEN
4690           print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
4691           print_debug('Before Checking for existence of Daily Interest streams');
4692           IF (NVL(l_return_value, 'N') = 'N') THEN
4693             OPEN l_daily_int_strm_csr(p_khr_id, p_from_date);
4694             FETCH l_daily_int_strm_csr INTO l_return_value;
4695             CLOSE l_daily_int_strm_csr;
4696           END IF;
4697           print_debug('After Checking for existence of Daily Interest streams');
4698         ELSE
4699           --rev rec method = ESTIMATED AND BILLED
4700           print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
4701           print_debug('Before Checking for existence of Receipt Applications');
4702           IF (NVL(l_return_value, 'N') = 'N') THEN
4703             OPEN l_rcpt_app_csr(p_khr_id, p_from_date);
4704             FETCH l_rcpt_app_csr INTO l_return_value;
4705             CLOSE l_rcpt_app_csr;
4706           END IF;
4707           print_debug('After Checking for existence of Receipt Applications');
4708 
4709           print_debug('Before Checking for existence of Early Termination records');
4710           IF (NVL(l_return_value, 'N') = 'N') THEN
4711             OPEN l_partial_term_csr(p_khr_id, p_from_date);
4712             FETCH l_partial_term_csr INTO l_return_value;
4713             CLOSE l_partial_term_csr;
4714           END IF;
4715           print_debug('After Checking for existence of Early Termination records');
4716 
4717           --Bug# 14179413
4718           print_debug('Before Checking for existence of Credit Memo');
4719           IF (NVL(l_return_value, 'N') = 'N') THEN
4720             OPEN l_credit_memo_csr(p_khr_id, p_from_date);
4721             FETCH l_credit_memo_csr INTO l_return_value;
4722             CLOSE l_credit_memo_csr;
4723           END IF;
4724           print_debug('After Checking for existence of Credit Memo');
4725 
4726           print_debug('Before Checking for existence of Adjustments');
4727           IF (NVL(l_return_value, 'N') = 'N') THEN
4728             OPEN l_adjustment_csr(p_khr_id, p_from_date);
4729             FETCH l_adjustment_csr INTO l_return_value;
4730             CLOSE l_adjustment_csr;
4731           END IF;
4732           print_debug('After Checking for existence of Adjustments');
4733           --Bug# 14179413
4734 
4735         END IF;
4736       ELSIF (G_INTEREST_CALCULATION_BASIS = G_INT_CALC_BASIS_CATCHUP) THEN
4737           print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
4738           print_debug('Before Checking for existence of Receipt Applications');
4739           IF (NVL(l_return_value, 'N') = 'N') THEN
4740             OPEN l_rcpt_app_csr(p_khr_id, p_from_date);
4741             FETCH l_rcpt_app_csr INTO l_return_value;
4742             CLOSE l_rcpt_app_csr;
4743           END IF;
4744           print_debug('After Checking for existence of Receipt Applications');
4745 
4746           print_debug('Before Checking for existence of Early Termination records');
4747           IF (NVL(l_return_value, 'N') = 'N') THEN
4748             OPEN l_partial_term_csr(p_khr_id, p_from_date);
4749             FETCH l_partial_term_csr INTO l_return_value;
4750             CLOSE l_partial_term_csr;
4751           END IF;
4752           print_debug('After Checking for existence of Early Termination records');
4753 
4754           print_debug('Before Checking for existence of Principal Catchup streams');
4755           IF (NVL(l_return_value, 'N') = 'N') THEN
4756             OPEN l_prin_catch_strm_csr(p_khr_id, p_from_date);
4757             FETCH l_prin_catch_strm_csr INTO l_return_value;
4758             CLOSE l_prin_catch_strm_csr;
4759           END IF;
4760           print_debug('After Checking for existence of Principal Catchup streams');
4761 
4762           print_debug('Before Checking for existence of Catchup settlement code');
4763           IF (NVL(l_return_value, 'N') = 'N') THEN
4764             IF (G_CATCHUP_SETTLEMENT_CODE = 'NOT_ADJUST') THEN
4765               l_return_value := 'Y';
4766             END IF;
4767           END IF;
4768           print_debug('After Checking for existence of Catchup settlement code');
4769 
4770           --Bug# 14179413
4771           print_debug('Before Checking for existence of Credit Memo');
4772           IF (NVL(l_return_value, 'N') = 'N') THEN
4773             OPEN l_credit_memo_csr(p_khr_id, p_from_date);
4774             FETCH l_credit_memo_csr INTO l_return_value;
4775             CLOSE l_credit_memo_csr;
4776           END IF;
4777           print_debug('After Checking for existence of Credit Memo');
4778 
4779           print_debug('Before Checking for existence of Adjustments');
4780           IF (NVL(l_return_value, 'N') = 'N') THEN
4781             OPEN l_adjustment_csr(p_khr_id, p_from_date);
4782             FETCH l_adjustment_csr INTO l_return_value;
4783             CLOSE l_adjustment_csr;
4784           END IF;
4785           print_debug('After Checking for existence of Adjustments');
4786           --Bug# 14179413
4787 
4788       END IF;
4789     ELSIF (G_DEAL_TYPE ='LOAN-REVOLVING') THEN
4790       IF (G_REVENUE_RECOGNITION_METHOD = 'ACTUAL') THEN
4791         print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
4792 
4793         print_debug('Before Checking for existence of Borrower payments');
4794         IF (NVL(l_return_value, 'N') = 'N') THEN
4795           OPEN l_borrow_payment_csr(p_khr_id, p_from_date);
4796           FETCH l_borrow_payment_csr INTO l_return_value;
4797           CLOSE l_borrow_payment_csr;
4798         END IF;
4799         print_debug('After Checking for existence of Borrower payments');
4800 
4801         print_debug('Before Checking for existence of Daily Interest streams');
4802         IF (NVL(l_return_value, 'N') = 'N') THEN
4803           OPEN l_daily_int_strm_csr(p_khr_id, p_from_date);
4804           FETCH l_daily_int_strm_csr INTO l_return_value;
4805           CLOSE l_daily_int_strm_csr;
4806         END IF;
4807         print_debug('After Checking for existence of Daily Interest streams');
4808       ELSE
4809         --rev rec method = ESTIMATED AND BILLED
4810         print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
4811         print_debug('Before Checking for existence of Borrower payments');
4812         IF (NVL(l_return_value, 'N') = 'N') THEN
4813           OPEN l_borrow_payment_csr(p_khr_id, p_from_date);
4814           FETCH l_borrow_payment_csr INTO l_return_value;
4815           CLOSE l_borrow_payment_csr;
4816         END IF;
4817         print_debug('After Checking for existence of Borrower payments');
4818 
4819         print_debug('Before Checking for existence of Receipt Applications');
4820         IF (NVL(l_return_value, 'N') = 'N') THEN
4821           OPEN l_rcpt_app_csr(p_khr_id, p_from_date);
4822           FETCH l_rcpt_app_csr INTO l_return_value;
4823           CLOSE l_rcpt_app_csr;
4824         END IF;
4825         print_debug('After Checking for existence of Receipt Applications');
4826 
4827         --Bug# 14179413
4828         print_debug('Before Checking for existence of Credit Memo');
4829         IF (NVL(l_return_value, 'N') = 'N') THEN
4830           OPEN l_credit_memo_csr(p_khr_id, p_from_date);
4831           FETCH l_credit_memo_csr INTO l_return_value;
4832           CLOSE l_credit_memo_csr;
4833         END IF;
4834         print_debug('After Checking for existence of Credit Memo');
4835 
4836         print_debug('Before Checking for existence of Adjustments');
4837         IF (NVL(l_return_value, 'N') = 'N') THEN
4838           OPEN l_adjustment_csr(p_khr_id, p_from_date);
4839           FETCH l_adjustment_csr INTO l_return_value;
4840           CLOSE l_adjustment_csr;
4841         END IF;
4842         print_debug('After Checking for existence of Adjustments');
4843         --Bug# 14179413
4844 
4845       END IF;
4846     END IF;
4847     return NVL(l_return_value, 'N');
4848   EXCEPTION
4849     WHEN OTHERS THEN
4850       return l_return_value;
4851   END calculate_from_khr_start_date;
4852 
4853 ------------------------------------------------------------------------------
4854     -- Start of Comments
4855     -- Created By:       pgomes
4856     -- Procedure Name    populate_txns
4857     -- Description:      This procedure populates g_vpb_tbl with Daily Interest
4858     --                   stream id, receipt app id, EOT id, Borrower payment id
4859     -- Dependencies:
4860     -- Parameters:       .
4861     -- Version:          1.0
4862     -- End of Comments
4863 
4864 ------------------------------------------------------------------------------
4865 
4866   PROCEDURE populate_txns ( p_api_version        IN  NUMBER,
4867             p_init_msg_list      IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
4868             p_khr_id             IN NUMBER,
4869             p_from_date          IN DATE,
4870             p_to_date            IN DATE,
4871             x_return_status      OUT NOCOPY VARCHAR2,
4872             x_msg_count          OUT NOCOPY NUMBER,
4873             x_msg_data           OUT NOCOPY VARCHAR2) IS
4874 
4875   l_api_name                  CONSTANT    VARCHAR2(30) := 'populate_txns';
4876   l_api_version               CONSTANT    NUMBER       := 1.0;
4877   L_FETCH_SIZE                CONSTANT    NUMBER := 100;
4878   l_source_id                 OKL_VAR_PRINCIPAL_BAL_TXN.source_id%TYPE;
4879   l_source_table              OKL_VAR_PRINCIPAL_BAL_TXN.source_table%TYPE;
4880 
4881   --get the id's of Rebook Transactions
4882   CURSOR l_rebook_csr(cp_khr_id NUMBER) IS
4883   SELECT ktrx.id source_id
4884         ,'OKL_TRX_CONTRACTS' source_table
4885   FROM   okc_k_headers_b chrb,
4886          okc_k_headers_b chrb2,
4887          okl_trx_contracts ktrx
4888   WHERE  ktrx.khr_id_old = chrb.id
4889   AND    ktrx.tsu_code = 'PROCESSED'
4890   AND    ktrx.rbr_code IS NOT NULL
4891   AND    ktrx.tcn_type = 'TRBK'
4892   --rkuttiya added for 12.1.1 Multi GAAP
4893  AND     ktrx.representation_type = 'PRIMARY'
4894   --
4895   AND    chrb.id = cp_khr_id
4896   AND    chrb2.orig_system_source_code = 'OKL_REBOOK'
4897   AND    chrb2.id = ktrx.khr_id_new
4898   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4899                     WHERE vpb.khr_id = chrb.id
4900                     AND   vpb.source_table = 'OKL_TRX_CONTRACTS'
4901                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4902                     AND   vpb.source_id = ktrx.id);
4903 
4904   --get the id's of Daily Interest - Principal stream elements
4905   CURSOR l_daily_int_strm_csr(cp_khr_id NUMBER, cp_from_date DATE, cp_to_date DATE) IS
4906   SELECT sel.id source_id
4907   , 'OKL_STRM_ELEMENTS_V' source_table
4908   FROM okl_streams     stm,
4909        okl_strm_type_b sty,
4910        okl_strm_elements sel
4911   WHERE	stm.khr_id = cp_khr_id
4912   AND	  stm.sty_id = sty.id
4913   AND   sty.stream_type_purpose = 'DAILY_INTEREST_PRINCIPAL'
4914   AND	  stm.id = sel.stm_id
4915   --AND   sel.stream_element_date BETWEEN cp_from_date AND cp_to_date
4916   AND   sel.stream_element_date <= cp_to_date
4917   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4918                     WHERE vpb.khr_id = stm.khr_id
4919                     AND   vpb.source_table = 'OKL_STRM_ELEMENTS_V'
4920                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4921                     AND   vpb.source_id = sel.id);
4922 
4923   --get the id's of Principal Catchup stream elements
4924   CURSOR l_prin_catch_strm_csr(cp_khr_id NUMBER, cp_from_date DATE, cp_to_date DATE) IS
4925   SELECT sel.id source_id
4926   , 'OKL_STRM_ELEMENTS_V' source_table
4927   FROM okl_streams     stm,
4928        okl_strm_type_b sty,
4929        okl_strm_elements sel
4930   WHERE	stm.khr_id = cp_khr_id
4931   AND	  stm.sty_id = sty.id
4932   AND   sty.stream_type_purpose = 'PRINCIPAL_CATCHUP'
4933   AND	  stm.id = sel.stm_id
4934   --AND   sel.stream_element_date BETWEEN cp_from_date AND cp_to_date
4935   AND   sel.stream_element_date <= cp_to_date
4936   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4937                     WHERE vpb.khr_id = stm.khr_id
4938                     AND   vpb.source_table = 'OKL_STRM_ELEMENTS_V'
4939                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4940                     AND   vpb.source_id = sel.id);
4941 
4942   --get the id's of Receipt Application to PRINCIPAL_PAYMENT, UNSCHEDULED_PRINCIPAL_PAYMENT
4943 --Begin - Billing Inline changes - Bug#5898792 - varangan - 23/2/2007
4944   --Bug# 6819044: Fetch receipt applications correctly when
4945   --              invoices have lines from multiple contracts
4946   --Bug# 7007130: Fetch unique receipt application ids for
4947   --              a contract
4948   CURSOR l_rcpt_app_csr(cp_khr_id NUMBER, cp_from_date DATE, cp_to_date DATE) IS
4949   SELECT DISTINCT raa.receivable_application_id source_id
4950   , 'AR_RECEIVABLE_APPLICATIONS_ALL' source_table
4951   FROM  okl_txd_ar_ln_dtls_b tld
4952        ,ra_customer_trx_lines_all ractrl
4953        ,okl_txl_ar_inv_lns_b til
4954        ,okl_trx_ar_invoices_b tai
4955        ,ar_payment_schedules_all aps
4956        ,ar_receivable_applications_all raa
4957        ,ar_cash_receipts_all cra
4958        ,okl_strm_type_b sty
4959   WHERE  tai.trx_status_code = 'PROCESSED'
4960   AND    tai.khr_id = cp_khr_id
4961   AND    tld.khr_id = cp_khr_id
4962   AND    ractrl.customer_trx_id  = aps.customer_trx_id
4963   AND    raa.applied_customer_trx_id = aps.customer_trx_id
4964   AND    aps.class = 'INV'
4965   AND    raa.application_type = 'CASH'
4966   AND    raa.status = 'APP'
4967   AND    raa.display = 'Y'
4968   AND    cra.receipt_date <= cp_to_date
4969   AND    raa.cash_receipt_id = cra.cash_receipt_id
4970   AND    tld.sty_id  = sty.id
4971   AND    sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
4972   AND    to_char(tld.id) = ractrl.interface_line_attribute14
4973   AND    tld.til_id_details = til.id
4974   AND    til.tai_id = tai.id
4975   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
4976                     WHERE vpb.khr_id = tld.khr_id
4977                     AND   vpb.source_table = 'AR_RECEIVABLE_APPLICATIONS_ALL'
4978                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
4979                     AND   vpb.source_id = raa.receivable_application_id)
4980   AND   EXISTS (SELECT 1
4981                 FROM ar_distributions_all ad
4982                 WHERE raa.receivable_application_id = ad.source_id
4983                 AND ad.source_table = 'RA'
4984                 AND (ad.ref_customer_trx_Line_Id IS NULL OR
4985                      ad.ref_customer_trx_Line_Id = ractrl.customer_trx_line_id));
4986 
4987 -- End - Billing Inline changes - Bug#5898792 - varangan - 23/2/2007
4988 
4989   --get the id's of Borrower Payment
4990   CURSOR l_borrow_payment_csr(cp_khr_id NUMBER, cp_from_date DATE, cp_to_date DATE) IS
4991   SELECT iph.invoice_payment_id source_id
4992   , 'AP_INVOICE_PAYMENTS_ALL' source_table
4993   FROM ap_invoices_all ap_inv,
4994        okl_trx_ap_invoices_v okl_inv,
4995        ap_invoice_payment_history_v iph
4996       ,okl_cnsld_ap_invs_all cnsld
4997       ,okl_txl_ap_inv_lns_all_b okl_inv_ln
4998       ,fnd_application fnd_app
4999  WHERE okl_inv.id = okl_inv_ln.tap_id
5000    AND okl_inv_ln.khr_id = cp_khr_id
5001    AND ap_inv.application_id = fnd_app.application_id
5002    AND fnd_app.application_short_name = 'OKL'
5003    AND okl_inv_ln.cnsld_ap_inv_id = cnsld.cnsld_ap_inv_id
5004    AND cnsld.cnsld_ap_inv_id = to_number(ap_inv.reference_key1)
5005    AND   okl_inv.funding_type_code = 'BORROWER_PAYMENT'
5006    AND   ap_inv.invoice_id = iph.invoice_id
5007   --AND   iph.check_date BETWEEN cp_from_date AND cp_to_date
5008    AND   iph.check_date <= cp_to_date
5009    AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
5010                     WHERE vpb.khr_id = okl_inv_ln.khr_id
5011                     AND   vpb.source_table = 'AP_INVOICE_PAYMENTS_ALL'
5012                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
5013                     AND   vpb.source_id = iph.invoice_payment_id);
5014 
5015   --get the id's of records from okl_contract_balances which have the asset balances
5016   --as of the partial termination date
5017   CURSOR l_partial_term_csr(cp_khr_id NUMBER, cp_from_date DATE, cp_to_date DATE) IS
5018   SELECT ocb.id source_id
5019   , 'OKL_CONTRACT_BALANCES' source_table
5020   FROM   okl_contract_balances ocb
5021   WHERE  ocb.khr_id = cp_khr_id
5022   AND    ocb.termination_date BETWEEN cp_from_date AND cp_to_date
5023   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
5024                     WHERE vpb.khr_id = ocb.khr_id
5025                     AND   vpb.source_table = 'OKL_CONTRACT_BALANCES'
5026                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
5027                     AND   vpb.source_id = ocb.id);
5028 
5029 
5030   --Bug# 14179413: Include Credit Memos and Adjustments when calculating
5031   --               Actual Principal Balance
5032   CURSOR l_credit_memo_csr(cp_khr_id NUMBER, cp_from_date DATE, cp_to_date DATE) IS
5033   SELECT DISTINCT raa.receivable_application_id source_id
5034   , 'AR_RECEIVABLE_APPLICATIONS_ALL' source_table
5035   FROM  okl_txd_ar_ln_dtls_b tld
5036        ,ra_customer_trx_lines_all ractrl
5037        ,okl_txl_ar_inv_lns_b til
5038        ,okl_trx_ar_invoices_b tai
5039        ,ar_payment_schedules_all aps
5040        ,ar_receivable_applications_all raa
5041        ,ra_customer_trx_all cm
5042        ,okl_strm_type_b sty
5043   WHERE  tai.trx_status_code = 'PROCESSED'
5044   AND    tai.khr_id = cp_khr_id
5045   AND    tld.khr_id = cp_khr_id
5046   AND    ractrl.customer_trx_id  = aps.customer_trx_id
5047   AND    raa.applied_customer_trx_id = aps.customer_trx_id
5048   AND    aps.class = 'INV'
5049   AND    raa.application_type = 'CM'
5050   AND    raa.status = 'APP'
5051   AND    raa.display = 'Y'
5052   AND    cm.trx_date <= cp_to_date
5053   AND    raa.customer_trx_id = cm.customer_trx_id
5054   AND    tld.sty_id  = sty.id
5055   AND    sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
5056   AND    to_char(tld.id) = ractrl.interface_line_attribute14
5057   AND    tld.til_id_details = til.id
5058   AND    til.tai_id = tai.id
5059   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
5060                     WHERE vpb.khr_id = tld.khr_id
5061                     AND   vpb.source_table = 'AR_RECEIVABLE_APPLICATIONS_ALL'
5062                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
5063                     AND   vpb.source_id = raa.receivable_application_id)
5064   AND   EXISTS (SELECT 1
5065                 FROM ar_distributions_all ad
5066                 WHERE raa.receivable_application_id = ad.source_id
5067                 AND ad.source_table = 'RA'
5068                 AND (ad.ref_customer_trx_Line_Id IS NULL OR
5069                      ad.ref_customer_trx_Line_Id = ractrl.customer_trx_line_id));
5070 
5071 --Bug# 14179413: Include Credit Memos and Adjustments when calculating
5072 --               Actual Principal Balance
5073 CURSOR l_adjustment_csr(cp_khr_id NUMBER, cp_from_date DATE, cp_to_date DATE) IS
5074   SELECT DISTINCT adj.adjustment_id source_id
5075   , 'AR_ADJUSTMENTS_ALL' source_table
5076   FROM  okl_txd_ar_ln_dtls_b tld
5077        ,ra_customer_trx_lines_all ractrl
5078        ,okl_txl_ar_inv_lns_b til
5079        ,okl_trx_ar_invoices_b tai
5080        ,ar_payment_schedules_all aps
5081        ,ar_adjustments_all adj
5082        ,okl_strm_type_b sty
5083   WHERE  tai.trx_status_code = 'PROCESSED'
5084   AND    tai.khr_id = cp_khr_id
5085   AND    tld.khr_id = cp_khr_id
5086   AND    ractrl.customer_trx_id = aps.customer_trx_id
5087   AND    adj.customer_trx_id = aps.customer_trx_id
5088   AND    aps.class = 'INV'
5089   AND    adj.status = 'A'
5090   AND    adj.apply_date <= cp_to_date
5091   AND    tld.sty_id = sty.id
5092   AND    sty.stream_type_purpose IN ('PRINCIPAL_PAYMENT', 'UNSCHEDULED_PRINCIPAL_PAYMENT')
5093   AND    to_char(tld.id) = ractrl.interface_line_attribute14
5094   AND    tld.til_id_details = til.id
5095   AND    til.tai_id = tai.id
5096   AND   NOT EXISTS (select 1 FROM OKL_VAR_PRINCIPAL_BAL_TXN vpb
5097                     WHERE vpb.khr_id = tld.khr_id
5098                     AND   vpb.source_table = 'AR_ADJUSTMENTS_ALL'
5099                     AND   vpb.int_cal_process = 'VARIABLE_INTEREST'
5100                     AND   vpb.source_id = adj.adjustment_id);
5101 
5102   BEGIN
5103     x_return_status  := OKL_API.G_RET_STS_SUCCESS;
5104     print_debug('Executing procedure populate_txns');
5105 
5106     print_debug('Before fetching Rebook Transactions g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5107     OPEN l_rebook_csr(p_khr_id);
5108     LOOP
5109       --FETCH l_rebook_csr INTO g_vpb_tbl(g_vpb_tbl_counter).source_id, g_vpb_tbl(g_vpb_tbl_counter).source_table;
5110       l_source_id := NULL;
5111       l_source_table := NULL;
5112       FETCH l_rebook_csr INTO l_source_id, l_source_table;
5113       EXIT WHEN l_rebook_csr%NOTFOUND;
5114       g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5115       g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5116       g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5117       g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5118       g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5119       g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5120       g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5121       g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5122       g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5123       g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5124       g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5125       g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5126       g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5127       g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5128       g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5129       g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5130       g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5131       g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5132       g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5133       g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5134       g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5135       g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5136       g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5137       g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5138       g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5139       g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5140       g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5141       g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5142       g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5143       g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5144       g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5145       g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5146       g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5147     END LOOP;
5148     CLOSE l_rebook_csr;
5149     print_debug('After fetching Rebook Transactions g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5150 
5151     IF (G_DEAL_TYPE = 'LOAN') THEN
5152       IF (G_INTEREST_CALCULATION_BASIS = G_INT_CALC_BASIS_FLOAT) THEN
5153         IF (G_REVENUE_RECOGNITION_METHOD = 'ACTUAL') THEN
5154           print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
5155           print_debug('Before fetching Daily Interest streams g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5156           OPEN l_daily_int_strm_csr(p_khr_id, p_from_date, p_to_date);
5157           LOOP
5158             l_source_id := NULL;
5159             l_source_table := NULL;
5160             FETCH l_daily_int_strm_csr INTO l_source_id, l_source_table;
5161             EXIT WHEN l_daily_int_strm_csr%NOTFOUND;
5162             g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5163             g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5164             g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5165             g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5166             g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5167             g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5168             g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5169             g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5170             g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5171             g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5172             g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5173             g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5174             g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5175             g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5176             g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5177             g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5178             g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5179             g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5180             g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5181             g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5182             g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5183             g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5184             g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5185             g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5186             g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5187             g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5188             g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5189             g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5190             g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5191             g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5192             g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5193             g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5194             g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5195           END LOOP;
5196           CLOSE l_daily_int_strm_csr;
5197           print_debug('After fetching Daily Interest streams g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5198         ELSE
5199           --rev rec method = ESTIMATED AND BILLED
5200           IF (G_PRINCIPAL_BASIS_CODE = 'ACTUAL') THEN
5201             print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
5202             print_debug('Before fetching Receipt Applications g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5203             OPEN l_rcpt_app_csr(p_khr_id, p_from_date, p_to_date);
5204             LOOP
5205               l_source_id := NULL;
5206               l_source_table := NULL;
5207               FETCH l_rcpt_app_csr INTO l_source_id, l_source_table;
5208               EXIT WHEN l_rcpt_app_csr%NOTFOUND;
5209               g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5210               g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5211               g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5212               g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5213               g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5214               g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5215               g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5216               g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5217               g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5218               g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5219               g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5220               g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5221               g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5222               g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5223               g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5224               g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5225               g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5226               g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5227               g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5228               g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5229               g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5230               g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5231               g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5232               g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5233               g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5234               g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5235               g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5236               g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5237               g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5238               g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5239               g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5240               g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5241               g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5242             END LOOP;
5243             CLOSE l_rcpt_app_csr;
5244             print_debug('After fetching Receipt Applications g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5245 
5246             print_debug('Before fetching Early Termination records g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5247             OPEN l_partial_term_csr(p_khr_id, p_from_date, p_to_date);
5248             LOOP
5249               l_source_id := NULL;
5250               l_source_table := NULL;
5251               FETCH l_partial_term_csr INTO l_source_id, l_source_table;
5252               EXIT WHEN l_partial_term_csr%NOTFOUND;
5253               g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5254               g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5255               g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5256               g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5257               g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5258               g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5259               g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5260               g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5261               g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5262               g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5263               g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5264               g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5265               g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5266               g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5267               g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5268               g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5269               g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5270               g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5271               g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5272               g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5273               g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5274               g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5275               g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5276               g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5277               g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5278               g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5279               g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5280               g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5281               g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5282               g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5283               g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5284               g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5285               g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5286             END LOOP;
5287             CLOSE l_partial_term_csr;
5288             print_debug('After fetching Early Termination records g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5289 
5290             --Bug# 14179413
5291             print_debug('Before fetching Credit Memos g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5292             OPEN l_credit_memo_csr(p_khr_id, p_from_date, p_to_date);
5293             LOOP
5294               l_source_id := NULL;
5295               l_source_table := NULL;
5296               FETCH l_credit_memo_csr INTO l_source_id, l_source_table;
5297               EXIT WHEN l_credit_memo_csr%NOTFOUND;
5298               g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5299               g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5300               g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5301               g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5302               g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5303               g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5304               g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5305               g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5306               g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5307               g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5308               g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5309               g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5310               g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5311               g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5312               g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5313               g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5314               g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5315               g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5316               g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5317               g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5318               g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5319               g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5320               g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5321               g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5322               g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5323               g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5324               g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5325               g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5326               g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5327               g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5328               g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5329               g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5330               g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5331             END LOOP;
5332             CLOSE l_credit_memo_csr;
5333             print_debug('After fetching Credit Memos g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5334 
5335             print_debug('Before fetching Adjustments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5336             OPEN l_adjustment_csr(p_khr_id, p_from_date, p_to_date);
5337             LOOP
5338               l_source_id := NULL;
5339               l_source_table := NULL;
5340               FETCH l_adjustment_csr INTO l_source_id, l_source_table;
5341               EXIT WHEN l_adjustment_csr%NOTFOUND;
5342               g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5343               g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5344               g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5345               g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5346               g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5347               g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5348               g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5349               g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5350               g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5351               g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5352               g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5353               g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5354               g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5355               g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5356               g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5357               g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5358               g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5359               g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5360               g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5361               g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5362               g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5363               g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5364               g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5365               g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5366               g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5367               g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5368               g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5369               g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5370               g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5371               g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5372               g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5373               g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5374               g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5375             END LOOP;
5376             CLOSE l_adjustment_csr;
5377             print_debug('After fetching Adjustments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5378             --Bug# 14179413
5379 
5380           END IF;
5381         END IF;
5382       ELSIF (G_INTEREST_CALCULATION_BASIS = G_INT_CALC_BASIS_CATCHUP) THEN
5383           print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
5384           print_debug('Before fetching Receipt Applications g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5385           OPEN l_rcpt_app_csr(p_khr_id, p_from_date, p_to_date);
5386           LOOP
5387             l_source_id := NULL;
5388             l_source_table := NULL;
5389             FETCH l_rcpt_app_csr INTO l_source_id, l_source_table;
5390             EXIT WHEN l_rcpt_app_csr%NOTFOUND;
5391             g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5392             g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5393             g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5394             g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5395             g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5396             g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5397             g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5398             g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5399             g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5400             g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5401             g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5402             g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5403             g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5404             g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5405             g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5406             g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5407             g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5408             g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5409             g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5410             g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5411             g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5412             g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5413             g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5414             g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5415             g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5416             g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5417             g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5418             g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5419             g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5420             g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5421             g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5422             g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5423             g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5424           END LOOP;
5425           CLOSE l_rcpt_app_csr;
5426           print_debug('After fetching Receipt Applications g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5427 
5428           print_debug('Before fetching Early Termination records g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5429           OPEN l_partial_term_csr(p_khr_id, p_from_date, p_to_date);
5430           LOOP
5431             l_source_id := NULL;
5432             l_source_table := NULL;
5433             FETCH l_partial_term_csr INTO l_source_id, l_source_table;
5434             EXIT WHEN l_partial_term_csr%NOTFOUND;
5435             g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5436             g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5437             g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5438             g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5439             g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5440             g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5441             g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5442             g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5443             g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5444             g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5445             g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5446             g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5447             g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5448             g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5449             g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5450             g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5451             g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5452             g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5453             g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5454             g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5455             g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5456             g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5457             g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5458             g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5459             g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5460             g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5461             g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5462             g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5463             g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5464             g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5465             g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5466             g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5467             g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5468           END LOOP;
5469           CLOSE l_partial_term_csr;
5470           print_debug('After fetching Early Termination records g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5471 
5472           print_debug('Before fetching Principal Catchup streams g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5473           OPEN l_prin_catch_strm_csr(p_khr_id, p_from_date, p_to_date);
5474           LOOP
5475             l_source_id := NULL;
5476             l_source_table := NULL;
5477             FETCH l_prin_catch_strm_csr INTO l_source_id, l_source_table;
5478             EXIT WHEN l_prin_catch_strm_csr%NOTFOUND;
5479             g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5480             g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5481             g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5482             g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5483             g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5484             g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5485             g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5486             g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5487             g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5488             g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5489             g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5490             g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5491             g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5492             g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5493             g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5494             g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5495             g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5496             g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5497             g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5498             g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5499             g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5500             g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5501             g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5502             g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5503             g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5504             g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5505             g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5506             g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5507             g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5508             g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5509             g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5510             g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5511             g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5512           END LOOP;
5513           CLOSE l_prin_catch_strm_csr;
5514           print_debug('After fetching Principal Catchup streams g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5515 
5516             --Bug# 14179413
5517             print_debug('Before fetching Credit Memos g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5518             OPEN l_credit_memo_csr(p_khr_id, p_from_date, p_to_date);
5519             LOOP
5520               l_source_id := NULL;
5521               l_source_table := NULL;
5522               FETCH l_credit_memo_csr INTO l_source_id, l_source_table;
5523               EXIT WHEN l_credit_memo_csr%NOTFOUND;
5524               g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5525               g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5526               g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5527               g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5528               g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5529               g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5530               g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5531               g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5532               g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5533               g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5534               g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5535               g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5536               g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5537               g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5538               g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5539               g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5540               g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5541               g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5542               g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5543               g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5544               g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5545               g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5546               g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5547               g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5548               g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5549               g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5550               g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5551               g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5552               g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5553               g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5554               g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5555               g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5556               g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5557             END LOOP;
5558             CLOSE l_credit_memo_csr;
5559             print_debug('After fetching Credit Memos g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5560 
5561             print_debug('Before fetching Adjustments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5562             OPEN l_adjustment_csr(p_khr_id, p_from_date, p_to_date);
5563             LOOP
5564               l_source_id := NULL;
5565               l_source_table := NULL;
5566               FETCH l_adjustment_csr INTO l_source_id, l_source_table;
5567               EXIT WHEN l_adjustment_csr%NOTFOUND;
5568               g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5569               g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5570               g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5571               g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5572               g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5573               g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5574               g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5575               g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5576               g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5577               g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5578               g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5579               g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5580               g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5581               g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5582               g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5583               g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5584               g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5585               g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5586               g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5587               g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5588               g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5589               g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5590               g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5591               g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5592               g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5593               g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5594               g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5595               g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5596               g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5597               g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5598               g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5599               g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5600               g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5601             END LOOP;
5602             CLOSE l_adjustment_csr;
5603             print_debug('After fetching Adjustments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5604             --Bug# 14179413
5605       END IF;
5606     ELSIF (G_DEAL_TYPE ='LOAN-REVOLVING') THEN
5607       IF (G_REVENUE_RECOGNITION_METHOD = 'ACTUAL') THEN
5608         print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
5609         print_debug('Before fetching Borrower payments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5610         OPEN l_borrow_payment_csr(p_khr_id, p_from_date, p_to_date);
5611         LOOP
5612           l_source_id := NULL;
5613           l_source_table := NULL;
5614           FETCH l_borrow_payment_csr INTO l_source_id, l_source_table;
5615           EXIT WHEN l_borrow_payment_csr%NOTFOUND;
5616           g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5617           g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5618           g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5619           g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5620           g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5621           g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5622           g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5623           g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5624           g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5625           g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5626           g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5627           g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5628           g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5629           g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5630           g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5631           g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5632           g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5633           g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5634           g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5635           g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5636           g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5637           g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5638           g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5639           g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5640           g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5641           g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5642           g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5643           g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5644           g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5645           g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5646           g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5647           g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5648           g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5649         END LOOP;
5650         CLOSE l_borrow_payment_csr;
5651         print_debug('After fetching Borrower payments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5652 
5653         print_debug('Before fetching Daily Interest streams g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5654         OPEN l_daily_int_strm_csr(p_khr_id, p_from_date, p_to_date);
5655         LOOP
5656           l_source_id := NULL;
5657           l_source_table := NULL;
5658           FETCH l_daily_int_strm_csr INTO l_source_id, l_source_table;
5659           EXIT WHEN l_daily_int_strm_csr%NOTFOUND;
5660           g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5661           g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5662           g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5663           g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5664           g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5665           g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5666           g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5667           g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5668           g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5669           g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5670           g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5671           g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5672           g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5673           g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5674           g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5675           g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5676           g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5677           g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5678           g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5679           g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5680           g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5681           g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5682           g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5683           g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5684           g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5685           g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5686           g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5687           g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5688           g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5689           g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5690           g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5691           g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5692           g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5693         END LOOP;
5694         CLOSE l_daily_int_strm_csr;
5695         print_debug('After fetching Daily Interest streams g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5696       ELSE
5697         --rev rec method = ESTIMATED AND BILLED
5698         print_debug('Deal Type => ' || G_DEAL_TYPE || ' Int Calc Basis => ' || G_INTEREST_CALCULATION_BASIS || ' Rev Rec Method => ' || G_REVENUE_RECOGNITION_METHOD);
5699         print_debug('Before fetching Borrower payments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5700         OPEN l_borrow_payment_csr(p_khr_id, p_from_date, p_to_date);
5701         LOOP
5702           l_source_id := NULL;
5703           l_source_table := NULL;
5704           FETCH l_borrow_payment_csr INTO l_source_id, l_source_table;
5705           EXIT WHEN l_borrow_payment_csr%NOTFOUND;
5706           g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5707           g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5708           g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5709           g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5710           g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5711           g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5712           g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5713           g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5714           g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5715           g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5716           g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5717           g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5718           g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5719           g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5720           g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5721           g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5722           g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5723           g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5724           g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5725           g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5726           g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5727           g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5728           g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5729           g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5730           g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5731           g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5732           g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5733           g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5734           g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5735           g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5736           g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5737           g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5738           g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5739         END LOOP;
5740         CLOSE l_borrow_payment_csr;
5741         print_debug('After fetching Borrower payments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5742 
5743         print_debug('Before fetching Receipt Applications g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5744         OPEN l_rcpt_app_csr(p_khr_id, p_from_date, p_to_date);
5745         LOOP
5746           l_source_id := NULL;
5747           l_source_table := NULL;
5748           FETCH l_rcpt_app_csr INTO l_source_id, l_source_table;
5749           EXIT WHEN l_rcpt_app_csr%NOTFOUND;
5750           g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5751           g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5752           g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5753           g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5754           g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5755           g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5756           g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5757           g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5758           g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5759           g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5760           g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5761           g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5762           g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5763           g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5764           g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5765           g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5766           g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5767           g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5768           g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5769           g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5770           g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5771           g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5772           g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5773           g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5774           g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5775           g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5776           g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5777           g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5778           g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5779           g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5780           g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5781           g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5782           g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5783         END LOOP;
5784         CLOSE l_rcpt_app_csr;
5785         print_debug('After fetching Receipt Applications g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5786 
5787         --Bug# 14179413
5788         print_debug('Before fetching Credit Memos g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5789         OPEN l_credit_memo_csr(p_khr_id, p_from_date, p_to_date);
5790         LOOP
5791           l_source_id := NULL;
5792           l_source_table := NULL;
5793           FETCH l_credit_memo_csr INTO l_source_id, l_source_table;
5794           EXIT WHEN l_credit_memo_csr%NOTFOUND;
5795           g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5796           g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5797           g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5798           g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5799           g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5800           g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5801           g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5802           g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5803           g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5804           g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5805           g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5806           g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5807           g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5808           g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5809           g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5810           g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5811           g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5812           g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5813           g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5814           g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5815           g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5816           g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5817           g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5818           g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5819           g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5820           g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5821           g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5822           g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5823           g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5824           g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5825           g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5826           g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5827           g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5828         END LOOP;
5829         CLOSE l_credit_memo_csr;
5830         print_debug('After fetching Credit Memos g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5831 
5832         print_debug('Before fetching Adjustments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5833         OPEN l_adjustment_csr(p_khr_id, p_from_date, p_to_date);
5834         LOOP
5835           l_source_id := NULL;
5836           l_source_table := NULL;
5837           FETCH l_adjustment_csr INTO l_source_id, l_source_table;
5838           EXIT WHEN l_adjustment_csr%NOTFOUND;
5839           g_vpb_tbl_counter := g_vpb_tbl_counter + 1;
5840           g_vpb_tbl(g_vpb_tbl_counter).source_id := l_source_id;
5841           g_vpb_tbl(g_vpb_tbl_counter).source_table := l_source_table;
5842           g_vpb_tbl(g_vpb_tbl_counter).id := okc_p_util.raw_to_number(sys_guid());
5843           g_vpb_tbl(g_vpb_tbl_counter).khr_id := p_khr_id;
5844           g_vpb_tbl(g_vpb_tbl_counter).int_cal_process := 'VARIABLE_INTEREST';
5845           g_vpb_tbl(g_vpb_tbl_counter).OBJECT_VERSION_NUMBER := 1.0;
5846           g_vpb_tbl(g_vpb_tbl_counter).org_id                   := g_authoring_org_id;
5847           g_vpb_tbl(g_vpb_tbl_counter).request_id               := g_request_id;
5848           g_vpb_tbl(g_vpb_tbl_counter).program_application_id   := NULL;
5849           g_vpb_tbl(g_vpb_tbl_counter).program_id               := NULL;
5850           g_vpb_tbl(g_vpb_tbl_counter).program_update_date      := SYSDATE;
5851           g_vpb_tbl(g_vpb_tbl_counter).attribute_category       := NULL;
5852           g_vpb_tbl(g_vpb_tbl_counter).attribute1               := NULL;
5853           g_vpb_tbl(g_vpb_tbl_counter).attribute2               := NULL;
5854           g_vpb_tbl(g_vpb_tbl_counter).attribute3               := NULL;
5855           g_vpb_tbl(g_vpb_tbl_counter).attribute4               := NULL;
5856           g_vpb_tbl(g_vpb_tbl_counter).attribute5               := NULL;
5857           g_vpb_tbl(g_vpb_tbl_counter).attribute6               := NULL;
5858           g_vpb_tbl(g_vpb_tbl_counter).attribute7               := NULL;
5859           g_vpb_tbl(g_vpb_tbl_counter).attribute8               := NULL;
5860           g_vpb_tbl(g_vpb_tbl_counter).attribute9               := NULL;
5861           g_vpb_tbl(g_vpb_tbl_counter).attribute10              := NULL;
5862           g_vpb_tbl(g_vpb_tbl_counter).attribute11              := NULL;
5863           g_vpb_tbl(g_vpb_tbl_counter).attribute12              := NULL;
5864           g_vpb_tbl(g_vpb_tbl_counter).attribute13              := NULL;
5865           g_vpb_tbl(g_vpb_tbl_counter).attribute14              := NULL;
5866           g_vpb_tbl(g_vpb_tbl_counter).attribute15              := NULL;
5867           g_vpb_tbl(g_vpb_tbl_counter).created_by               := FND_GLOBAL.USER_ID;
5868           g_vpb_tbl(g_vpb_tbl_counter).creation_date            := SYSDATE;
5869           g_vpb_tbl(g_vpb_tbl_counter).last_updated_by          := FND_GLOBAL.USER_ID;
5870           g_vpb_tbl(g_vpb_tbl_counter).last_update_date         := SYSDATE;
5871           g_vpb_tbl(g_vpb_tbl_counter).last_update_login        := FND_GLOBAL.LOGIN_ID;
5872         END LOOP;
5873         CLOSE l_adjustment_csr;
5874         print_debug('After fetching Adjustments g_vpb_tbl count is: '|| g_vpb_tbl.COUNT);
5875         --Bug# 14179413
5876 
5877       END IF;
5878     END IF;
5879   EXCEPTION
5880      WHEN OTHERS THEN
5881        print_error_message('Exception raised in procedure POPULATE_TXNS');
5882        x_return_status  := OKL_API.G_RET_STS_UNEXP_ERROR;
5883        Okl_Api.SET_MESSAGE(
5884                p_app_name     => G_APP_NAME,
5885                p_msg_name     => G_UNEXPECTED_ERROR,
5886                p_token1       => G_SQLCODE_TOKEN,
5887                p_token1_value => SQLCODE,
5888                p_token2       => G_SQLERRM_TOKEN,
5889                p_token2_value => SQLERRM);
5890   END populate_txns;
5891 
5892 ------------------------------------------------------------------------------
5893     -- Start of Comments
5894     -- Created By:       pgomes
5895     -- Procedure Name    print_vpb_tbl
5896     -- Description:      This procedure prints all the records in the PL/SQL table g_vpb_tbl
5897     --
5898     -- Dependencies:
5899     -- Parameters:       .
5900     -- Version:          1.0
5901     -- End of Comments
5902 
5903 ------------------------------------------------------------------------------
5904 
5905   PROCEDURE print_vpb_tbl ( p_vpb_tbl IN  vpb_tbl_type) IS
5906 
5907   l_index        NUMBER;
5908   BEGIN
5909        print_debug('Start => Contents of p_vpb_tbl');
5910        print_debug('******************************');
5911        l_index := p_vpb_tbl.first;
5912        LOOP
5913           EXIT when l_index IS NULL;
5914           print_debug( 'Record Number : '||l_index);
5915     		  print_debug( 'id : '||p_vpb_tbl(l_index).id );
5916     		  print_debug( 'khr_id : '||p_vpb_tbl(l_index).khr_id);
5917           print_debug( 'source_table : '|| p_vpb_tbl(l_index).source_table);
5918           print_debug( 'source_id : '|| p_vpb_tbl(l_index).source_id);
5919           print_debug( 'int_cal_process : '|| p_vpb_tbl(l_index).int_cal_process);
5920           print_debug( 'Object_Version_Number : '|| p_vpb_tbl(l_index).Object_Version_Number);
5921           print_debug( 'Org ID : '|| p_vpb_tbl(l_index).Org_id);
5922           print_debug( 'request ID : '|| p_vpb_tbl(l_index).request_id);
5923           print_debug( 'Program Application ID : '|| p_vpb_tbl(l_index).program_application_id);
5924           print_debug( 'program ID : '|| p_vpb_tbl(l_index).program_id);
5925           print_debug( 'Program Update date : '|| p_vpb_tbl(l_index).program_update_date);
5926           print_debug( 'attribute category : '|| p_vpb_tbl(l_index).attribute_category);
5927           print_debug( 'attribute1 : '|| p_vpb_tbl(l_index).attribute1);
5928           print_debug( 'attribute2 : '|| p_vpb_tbl(l_index).attribute2);
5929           print_debug( 'attribute3 : '|| p_vpb_tbl(l_index).attribute3);
5930           print_debug( 'attribute4 : '|| p_vpb_tbl(l_index).attribute4);
5931           print_debug( 'attribute5 : '|| p_vpb_tbl(l_index).attribute5);
5932           print_debug( 'attribute6 : '|| p_vpb_tbl(l_index).attribute6);
5933           print_debug( 'attribute7 : '|| p_vpb_tbl(l_index).attribute7);
5934           print_debug( 'attribute8 : '|| p_vpb_tbl(l_index).attribute8);
5935           print_debug( 'attribute9 : '|| p_vpb_tbl(l_index).attribute9);
5936           print_debug( 'attribute10 : '|| p_vpb_tbl(l_index).attribute10);
5937           print_debug( 'attribute11 : '|| p_vpb_tbl(l_index).attribute11);
5938           print_debug( 'attribute12 : '|| p_vpb_tbl(l_index).attribute12);
5939           print_debug( 'attribute13 : '|| p_vpb_tbl(l_index).attribute13);
5940           print_debug( 'attribute14 : '|| p_vpb_tbl(l_index).attribute14);
5941           print_debug( 'attribute15 : '|| p_vpb_tbl(l_index).attribute15);
5942           print_debug( 'created_by : '|| p_vpb_tbl(l_index).created_by);
5943           print_debug( 'creation_date : '|| p_vpb_tbl(l_index).creation_date);
5944           print_debug( 'last_updated_by : '|| p_vpb_tbl(l_index).last_updated_by);
5945           print_debug( 'last_update_date : '|| p_vpb_tbl(l_index).last_update_date);
5946           print_debug( 'last_update_login : '|| p_vpb_tbl(l_index).last_update_login);
5947           l_index       := p_vpb_tbl.NEXT(l_index);
5948        END LOOP;
5949        print_debug('****************************');
5950        print_debug('End => Contents of p_vpb_tbl');
5951   EXCEPTION
5952      WHEN OTHERS THEN
5953        print_error_message('Exception raised in procedure PRINT_VPB_TBL');
5954        Okl_Api.SET_MESSAGE(
5955                p_app_name     => G_APP_NAME,
5956                p_msg_name     => G_UNEXPECTED_ERROR,
5957                p_token1       => G_SQLCODE_TOKEN,
5958                p_token1_value => SQLCODE,
5959                p_token2       => G_SQLERRM_TOKEN,
5960                p_token2_value => SQLERRM);
5961   END print_vpb_tbl;
5962 
5963 ------------------------------------------------------------------------------
5964 
5965     -- Start of Comments
5966     -- Created By:       Ramesh Seela
5967     -- Procedure Name    Create_Daily_Interest_Streams
5968     -- Description:      This procedure is called by Daily Interest Calculation program
5969     --                   Inputs :
5970     --                   Output :
5971     -- Dependencies:
5972     -- Parameters:
5973     -- Version:          1.0
5974     -- End of Comments
5975 
5976   ------------------------------------------------------------------------------
5977   Procedure Create_Daily_Interest_Streams (
5978             p_api_version             IN  NUMBER,
5979             p_init_msg_list           IN  VARCHAR2 DEFAULT OKL_API.G_FALSE,
5980             x_return_status           OUT NOCOPY VARCHAR2,
5981             x_msg_count               OUT NOCOPY NUMBER,
5982             x_msg_data                OUT NOCOPY VARCHAR2,
5983             p_contract_id             IN  NUMBER,
5984             p_line_id                 IN  NUMBER DEFAULT NULL, -- not currently used
5985             p_amount                  IN  NUMBER,
5986             p_due_date                IN  DATE,
5987             p_stream_type_purpose     IN  VARCHAR2,
5988             p_create_invoice_flag     IN  VARCHAR2 DEFAULT OKL_API.G_TRUE,
5989  	        p_process_flag            IN  VARCHAR2 DEFAULT NULL,
5990 			p_currency_code           IN  VARCHAR2 DEFAULT NULL ) IS
5991 
5992   l_api_name                  CONSTANT    VARCHAR2(30) := 'CREATE_DAILY_INTEREST_STREAMS';
5993   l_api_version               CONSTANT    NUMBER       := 1.0;
5994   l_invoice_id                NUMBER;
5995   l_stream_element_id         OKL_STRM_ELEMENTS_V.id%TYPE;
5996   i_vir_tbl                   vir_tbl_type;
5997   r_vir_tbl                   vir_tbl_type;
5998   Create_Daily_Int_Str_failed EXCEPTION;
5999   l_asset_cost                NUMBER;
6000   l_total_asset_val           NUMBER := 0;
6001   l_asset_line_tbl            okl_kle_pvt.kle_tbl_type;
6002   l_line_index                NUMBER := 0;
6003   l_index                     NUMBER := 0;
6004   l_asset_line_tbl_count      NUMBER := 0;
6005   l_invoice_amt               NUMBER;
6006   l_prorated_invoice_amt      NUMBER := 0;
6007 
6008 
6009   CURSOR contract_line_csr (p_khr_id NUMBER, p_due_date DATE) IS
6010     SELECT id
6011     FROM   okl_k_lines_full_v
6012     WHERE  chr_id = p_khr_id
6013     AND    lse_id = G_FIN_LINE_LTY_ID
6014     AND    nvl(date_terminated, p_due_date + 1) > p_due_date
6015     ORDER BY id;
6016 
6017 
6018   BEGIN
6019     print_debug('Executing procedure CREATE_DAILY_INTEREST_STREAMS using following parameters : ');
6020     print_debug(' p_contract_id : '|| p_contract_id );
6021 	print_debug(' p_line_id : '|| p_line_id);
6022     print_debug(' p_amount : '|| p_amount );
6023 	print_debug(' p_due_date: '|| p_due_date);
6024     print_debug(' p_stream_type_purpose : '||p_stream_type_purpose);
6025 	print_debug(' p_create_invoice_flag: '|| p_create_invoice_flag);
6026     print_debug(' p_process_flag : '|| p_process_flag);
6027 
6028     x_return_status               := OKL_API.G_RET_STS_SUCCESS;
6029 
6030 	Initialize_contract_params( p_api_version   => 1.0,
6031                                 p_init_msg_list => OKL_API.G_FALSE,
6032                                 x_return_status => x_return_status,
6033                                 x_msg_count     => x_msg_count,
6034                                 x_msg_data      => x_msg_data,
6035                                 p_contract_id   => p_contract_id
6036                               );
6037     IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
6038 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS completed successfully');
6039     ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6040   	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
6041   	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
6042        RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6043     ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6044 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
6045 	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
6046        RAISE Create_Daily_Int_Str_failed;
6047     END IF;
6048 
6049     IF (p_stream_type_purpose = 'DAILY_INTEREST_INTEREST') THEN
6050 
6051       OKL_VR_DOCUMENT_PVT.Create_Stream_Invoice (
6052              p_api_version            => 1.0,
6053              p_init_msg_list          => OKL_API.G_FALSE,
6054              x_return_status          => x_return_status,
6055              x_msg_count              => x_msg_count,
6056              x_msg_data               => x_msg_data,
6057              p_contract_id            => p_contract_id,
6058              p_line_id                => NULL,
6059              p_amount                 => p_amount,
6060              p_due_date               => p_due_date,
6061              p_stream_type_purpose    => p_stream_type_purpose,
6062              p_create_invoice_flag    => p_create_invoice_flag,
6063              p_process_flag           => p_process_flag,
6064              p_parent_strm_element_id => NULL,
6065 		     x_invoice_id             => l_invoice_id,
6066 			 x_stream_element_id      => l_stream_element_id);
6067 
6068       IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6069         print_error_message('Unexpected error raised in call to CREATE_STREAM_INVOICE');
6070         RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6071       ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6072         print_error_message('Error raised in call to CREATE_STREAM_INVOICE');
6073         RAISE Create_Daily_Int_Str_failed;
6074       END IF;
6075 
6076       i_vir_tbl := g_vir_tbl;
6077 
6078       upd_vir_params_with_invoice (
6079               p_api_version   => 1.0,
6080               p_init_msg_list => OKL_API.G_TRUE,
6081               x_return_status => x_return_status,
6082               x_msg_count     => x_msg_count,
6083               x_msg_data      => x_msg_data,
6084               p_source_id     => l_stream_element_id,
6085               p_vir_tbl       => i_vir_tbl,
6086               x_vir_tbl       => r_vir_tbl);
6087       IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6088         print_error_message('Unexpected error raised in call to UPD_VIR_PARAMS_WITH_INVOICE');
6089         RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6090       ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6091         print_error_message('Error raised in call to UPD_VIR_PARAMS_WITH_INVOICE');
6092         RAISE Create_Daily_Int_Str_failed;
6093       END IF;
6094 
6095       g_vir_tbl := r_vir_tbl;
6096 
6097       OKL_VR_DATA_HANDLER_PVT.insert_vir_params(
6098                p_api_version    => 1.0,
6099                p_init_msg_list  => OKL_API.G_TRUE,
6100                x_return_status  => x_return_status,
6101                x_msg_count      => x_msg_count,
6102                x_msg_data       => x_msg_data,
6103                p_vir_tbl        => g_vir_tbl);
6104       IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6105         print_error_message('Unexpected error raised in call to POPULATE_VIR_PARAMS');
6106         RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6107       ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6108         print_error_message('Error raised in call to POPULATE_VIR_PARAMS');
6109         RAISE Create_Daily_Int_Str_failed;
6110       END IF;
6111 
6112       g_vir_tbl.delete;
6113 	  g_vir_tbl_counter := 0;
6114 
6115 	ELSIF (p_stream_type_purpose = 'DAILY_INTEREST_PRINCIPAL') THEN
6116 	  l_total_asset_val := 0;
6117 	  FOR current_line in contract_line_csr(p_contract_id, p_due_date)
6118 	  LOOP
6119         -- Derive Asset Cost
6120         Okl_Execute_Formula_Pub.EXECUTE(
6121 		    p_api_version          => 1.0,
6122             p_init_msg_list        => OKL_API.G_FALSE,
6123             x_return_status        => x_return_status,
6124             x_msg_count            => x_msg_count,
6125             x_msg_data             => x_msg_data,
6126             p_formula_name         => 'LINE_OEC',
6127             p_contract_id          => p_contract_id,
6128             p_line_id              => current_line.id,
6129             x_value               =>  l_asset_cost);
6130         IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
6131 	      print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE completed successfully');
6132         ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6133 	      print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned unexpected error');
6134 	      print_error_message ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned unexpected error');
6135           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6136         ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6137   	      print_debug ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned exception');
6138 	      print_error_message ('Procedure OKL_EXECUTE_FORMULA_PUB.EXECUTE returned exception');
6139           RAISE Create_Daily_Int_Str_failed;
6140         END IF;
6141 
6142         IF (l_asset_cost > 0) THEN
6143           l_line_index                          := l_line_index + 1;
6144           l_asset_line_tbl(l_line_index).id     := current_line.id;
6145           l_asset_line_tbl(l_line_index).amount := l_asset_cost;
6146           l_total_asset_val                     := l_total_asset_val + l_asset_cost;
6147           print_debug('Asset id :' || l_asset_line_tbl(l_line_index).id || ' Asset Cost :' || l_asset_cost);
6148         END IF;
6149 	  END LOOP;
6150 
6151       l_asset_line_tbl_count := l_asset_line_tbl.COUNT;
6152       l_invoice_amt          := p_amount;
6153 
6154       IF (l_asset_line_tbl_count > 0) THEN
6155         print_debug('Creating DAILY_INTEREST_PRINCIPAL streams for assets.');
6156 
6157         FOR l_index in 1 .. l_asset_line_tbl_count
6158         LOOP
6159           l_prorated_invoice_amt := OKL_ACCOUNTING_UTIL.round_amount((l_asset_line_tbl(l_index).amount * l_invoice_amt / l_total_asset_val),p_currency_code);
6160 
6161           print_debug('Creating DAILY_INTEREST_PRINCIPAL streams for asset id : ' || l_asset_line_tbl(l_index).id || ' for Amount :' || l_prorated_invoice_amt);
6162 
6163           OKL_VR_DOCUMENT_PVT.Create_Stream_Invoice (
6164                  p_api_version            => 1.0,
6165                  p_init_msg_list          => OKL_API.G_FALSE,
6166                  x_return_status          => x_return_status,
6167                  x_msg_count              => x_msg_count,
6168                  x_msg_data               => x_msg_data,
6169                  p_contract_id            => p_contract_id,
6170                  p_line_id                => l_asset_line_tbl(l_index).id,
6171                  p_amount                 => l_prorated_invoice_amt,
6172                  p_due_date               => p_due_date,
6173                  p_stream_type_purpose    => p_stream_type_purpose,
6174                  p_create_invoice_flag    => p_create_invoice_flag,
6175                  p_process_flag           => p_process_flag,
6176                  p_parent_strm_element_id => NULL,
6177        			 x_invoice_id             => l_invoice_id,
6178             	 x_stream_element_id      => l_stream_element_id);
6179 
6180           IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6181             print_error_message('Unexpected error raised in call to CREATE_STREAM_INVOICE');
6182             RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6183           ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6184             print_error_message('Error raised in call to CREATE_STREAM_INVOICE');
6185             RAISE Create_Daily_Int_Str_failed;
6186           END IF;
6187           print_debug('Successfully created DAILY_INTEREST_PRINCIPAL streams for asset id : ' || l_asset_line_tbl(l_index).id || ' for Amount :' || l_prorated_invoice_amt);
6188           l_invoice_amt     := l_invoice_amt - l_prorated_invoice_amt;
6189 		  l_total_asset_val := l_total_asset_val - l_asset_line_tbl(l_index).amount;
6190         END LOOP;
6191       ELSE /* The contract is a revolving loan */
6192         print_debug('Creating DAILY_INTEREST_PRINCIPAL streams '|| ' for Amount :' || l_invoice_amt);
6193 
6194         OKL_VR_DOCUMENT_PVT.Create_Stream_Invoice (
6195                p_api_version            => 1.0,
6196                p_init_msg_list          => OKL_API.G_FALSE,
6197                x_return_status          => x_return_status,
6198                x_msg_count              => x_msg_count,
6199                x_msg_data               => x_msg_data,
6200                p_contract_id            => p_contract_id,
6201                p_line_id                => NULL,
6202                p_amount                 => l_invoice_amt,
6203                p_due_date               => p_due_date,
6204                p_stream_type_purpose    => p_stream_type_purpose,
6205                p_create_invoice_flag    => p_create_invoice_flag,
6206                p_process_flag           => p_process_flag,
6207                p_parent_strm_element_id => NULL,
6208    			   x_invoice_id             => l_invoice_id,
6209                x_stream_element_id      => l_stream_element_id);
6210 
6211         IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6212           print_error_message('Unexpected error raised in call to CREATE_STREAM_INVOICE');
6213           RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6214         ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6215           print_error_message('Error raised in call to CREATE_STREAM_INVOICE');
6216           RAISE Create_Daily_Int_Str_failed;
6217         END IF;
6218         print_debug('Successfully created DAILY_INTEREST_PRINCIPAL streams ' || ' for Amount :' || l_invoice_amt);
6219 
6220       END IF;
6221     END IF;
6222 
6223   EXCEPTION
6224     WHEN Create_Daily_Int_Str_failed THEN
6225       print_error_message('Exception Create_Daily_Int_Str_failed raised in procedure CREATE_DAILY_INTEREST_STREAMS');
6226       x_return_status := OKL_API.G_RET_STS_ERROR;
6227     WHEN OTHERS THEN
6228       print_error_message('Exception raised in procedure CREATE_DAILY_INTEREST_STREAMS');
6229       x_return_status := OKL_API.G_RET_STS_ERROR;
6230       Okl_Api.SET_MESSAGE(
6231               p_app_name     => G_APP_NAME,
6232               p_msg_name     => G_UNEXPECTED_ERROR,
6233               p_token1       => G_SQLCODE_TOKEN,
6234               p_token1_value => SQLCODE,
6235               p_token2       => G_SQLERRM_TOKEN,
6236               p_token2_value => SQLERRM);
6237 
6238   END Create_Daily_Interest_Streams;
6239 ------------------------------------------------------------------------------
6240 
6241     -- Start of Comments
6242     -- Created By:       Ramesh Seela
6243     -- Procedure Name    calculate_total_interest_due
6244     -- Description:      This procedure is called by Variable Interest Calculation for Loans
6245     --                   Inputs :
6246     --                   Output : Interest Calculated
6247     -- Dependencies:
6248     -- Parameters:       Start Date, End Date, Interest Rate Range.
6249     -- Version:          1.0
6250     -- End of Comments
6251 
6252   ------------------------------------------------------------------------------
6253   --Bug# 13447258: Added p_line_id parameter
6254   FUNCTION calculate_total_interest_due(
6255             p_api_version     IN  NUMBER,
6256             p_init_msg_list   IN  VARCHAR2,
6257             x_return_status   OUT NOCOPY VARCHAR2,
6258             x_msg_count       OUT NOCOPY NUMBER,
6259             x_msg_data        OUT NOCOPY VARCHAR2,
6260             p_contract_id     IN  NUMBER,
6261             p_currency_code   IN  VARCHAR2,
6262             p_start_date      IN  DATE,
6263             p_due_date        IN  DATE,
6264             p_principal_basis IN  VARCHAR2 DEFAULT NULL,
6265             p_line_id         IN  NUMBER DEFAULT NULL,
6266             --Bug# 14165508
6267             p_conversion_factor IN NUMBER DEFAULT NULL) RETURN NUMBER IS
6268 
6269   l_api_version             CONSTANT NUMBER := 1.0;
6270   l_api_name	            CONSTANT VARCHAR2(30) := 'CALCULATE_TOTAL_INTEREST_DUE';
6271   l_return_status           VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
6272   l_interest_calculated     NUMBER := 0;
6273   r_principal_balance_tbl   principal_balance_tbl_typ;
6274   l_formula_name            OKL_FORMULAE_V.name%TYPE;
6275   calc_total_int_due_failed EXCEPTION;
6276 
6277   Cursor formula_csr (p_formula_id NUMBER) IS
6278       SELECT name
6279       FROM   okl_formulae_v
6280       WHERE  id = p_formula_id;
6281 
6282   BEGIN
6283     ------------------------------------------------------------
6284     -- Start processing
6285     ------------------------------------------------------------
6286 
6287     x_return_status := OKL_API.G_RET_STS_SUCCESS;
6288 
6289     print_debug('Executing function CALCULATE_TOTAL_INTEREST_DUE using following parameters : ');
6290     print_debug('contract ID : '|| p_contract_id);
6291 	print_debug('Currency Code : '|| p_currency_code);
6292 	print_debug('start date : '|| p_start_date);
6293 	print_Debug('Due date : '|| p_due_date);
6294 
6295 	print_Debug('Line ID : '|| p_line_id);
6296 
6297       G_CONTRACT_LINE_ID := p_line_id;
6298 
6299 	Initialize_contract_params( p_api_version   => 1.0,
6300                                 p_init_msg_list => OKL_API.G_FALSE,
6301                                 x_return_status => x_return_status,
6302                                 x_msg_count     => x_msg_count,
6303                                 x_msg_data      => x_msg_data,
6304                                 p_contract_id   => p_contract_id
6305                               );
6306     IF (x_return_status = Okl_Api.G_RET_STS_SUCCESS) THEN
6307 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS completed successfully');
6308     ELSIF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6309   	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
6310   	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned unexpected error');
6311        RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6312     ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6313 	   print_debug ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
6314 	   print_error_message ('Procedure INITIALIZE_CONTRACT_PARAMS returned exception');
6315        RAISE calc_total_int_due_failed;
6316     END IF;
6317 
6318     print_debug('Interest Basis: '|| G_INTEREST_BASIS_CODE || ' formula ID :'|| G_CALCULATION_FORMULA_ID);
6319 
6320     IF (G_INTEREST_BASIS_CODE = 'SIMPLE') THEN
6321 
6322        prin_date_range_var_rate_ctr (
6323                                      p_api_version           => 1.0,
6324                                      p_init_msg_list         => OKL_API.G_FALSE,
6325                                      x_return_status         => x_return_status,
6326                                      x_msg_count             => x_msg_count,
6327                                      x_msg_data              => x_msg_data,
6328                                      p_contract_id           => p_contract_id,
6329                                      p_line_id               => p_line_id,
6330                                      p_start_date            => p_start_date,
6331                                      p_due_date              => p_due_date,
6332                                      p_principal_basis       => p_principal_basis,
6333                                      x_principal_balance_tbl => r_principal_balance_tbl);
6334        IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6335          print_error_message('Unexpected error raised in call to PRIN_DATE_RANGE_VAR_RATE_CTR');
6336          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6337        ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6338          print_error_message('Error raised in call to PRIN_DATE_RANGE_VAR_RATE_CTR');
6339          RAISE calc_total_int_due_failed;
6340        END IF;
6341        print_debug ('Before call to Calc_Variable_Rate_Interest');
6342 
6343        l_interest_calculated := Calc_Variable_Rate_Interest (
6344                                                              p_api_version           => p_api_version,
6345                                                              p_init_msg_list         => OKL_API.G_FALSE,
6346                                                              x_return_status         => x_return_status,
6347                                                              x_msg_count             => x_msg_count,
6348                                                              x_msg_data              => x_msg_data,
6349                                                              p_contract_id           => p_contract_id,
6350                                                              p_currency_code         => p_currency_code,
6351                                                              p_principal_balance_tbl => r_principal_balance_tbl,
6352                                                              --Bug# 14165508
6353                                                              p_conversion_factor     => p_conversion_factor);
6354        IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6355          print_error_message('Unexpected error raised in call to CALC_VARIABLE_RATE_INTEREST');
6356          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6357        ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6358          print_error_message('Error raised in call to CALC_VARIABLE_RATE_INTEREST');
6359          RAISE calc_total_int_due_failed;
6360        END IF;
6361     ELSE
6362        OPEN  formula_csr(G_CALCULATION_FORMULA_ID);
6363        FETCH formula_csr INTO l_formula_name;
6364        IF (formula_csr%NOTFOUND) THEN
6365          CLOSE formula_csr;
6366          print_error_message('Formula cursor did not return any records for formula ID: '|| G_CALCULATION_FORMULA_ID);
6367          RAISE calc_total_int_due_failed;
6368        END IF;
6369        CLOSE formula_csr;
6370 
6371        -- Derive Interest using formula
6372        Okl_Execute_Formula_Pub.EXECUTE(p_api_version          => 1.0,
6373                                        p_init_msg_list        => OKL_API.G_TRUE,
6374                                        x_return_status        => x_return_status,
6375                                        x_msg_count            => x_msg_count,
6376                                        x_msg_data             => x_msg_data,
6377                                        p_formula_name         => l_formula_name,
6378                                        p_contract_id          => p_contract_id,
6379                                        p_line_id              => p_line_id,
6380                                        p_additional_parameters => Okl_Execute_Formula_Pub.g_additional_parameters, -- vsgandhi bug 13106699
6381                                        x_value               =>  l_interest_calculated
6382                                       );
6383        IF (x_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6384          print_error_message('Unexpected error raised in call to OKL_EXECUTE_FORMULA_PUB.EXECUTE');
6385          RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6386        ELSIF (x_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6387          print_error_message('Error raised in call to OKL_EXECUTE_FORMULA_PUB.EXECUTE');
6388          RAISE calc_total_int_due_failed;
6389        END IF;
6390     END IF;
6391     RETURN l_interest_calculated;
6392   EXCEPTION
6393     WHEN calc_total_int_due_failed THEN
6394       print_error_message('Exception calc_total_int_due_failed raised in function CALCULATE_TOTAL_INTEREST_DUE');
6395       x_return_status := OKL_API.G_RET_STS_ERROR;
6396       RETURN -1;
6397     WHEN OTHERS  THEN
6398       print_error_message('Exception raised in function CALCULATE_TOTAL_INTEREST_DUE');
6399       Okl_Api.SET_MESSAGE(
6400               p_app_name     => G_APP_NAME,
6401               p_msg_name     => G_UNEXPECTED_ERROR,
6402               p_token1       => G_SQLCODE_TOKEN,
6403               p_token1_value => SQLCODE,
6404               p_token2       => G_SQLERRM_TOKEN,
6405               p_token2_value => SQLERRM);
6406 
6407       x_return_status := OKL_API.G_RET_STS_ERROR;
6408       RETURN -1;
6409   END calculate_total_interest_due;
6410 
6411 -----------------------------------------------------------------
6412   PROCEDURE variable_interest(
6413         p_api_version     IN  NUMBER,
6414         p_init_msg_list   IN  VARCHAR2,
6415         x_return_status   OUT NOCOPY VARCHAR2,
6416         x_msg_count       OUT NOCOPY NUMBER,
6417         x_msg_data        OUT NOCOPY VARCHAR2,
6418         p_contract_number IN VARCHAR2,
6419         P_to_date         IN  DATE)
6420 
6421     IS
6422     ------------------------------------------------------------
6423     -- Declare variables required by APIs
6424     ------------------------------------------------------------
6425 
6426     l_api_version                CONSTANT NUMBER := 1.0;
6427     l_api_name                   CONSTANT VARCHAR2(30) := 'VARIABLE_INTEREST';
6428     l_return_status	             VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
6429     l_msg_data                   VARCHAR2(2000);
6430   	l_def_no_val	             CONSTANT NUMBER		    := -1;
6431   	l_bill_date	                 OKL_TRX_AR_INVOICES_V.date_invoiced%TYPE;
6432   	l_kle_id	                 OKL_TXL_AR_INV_LNS_V.kle_id%TYPE;
6433   	l_stm_date  	             DATE;
6434   	l_period_start_date  	     DATE;
6435   	l_period_end_date  	         DATE;
6436   	l_due_date  	             DATE;
6437     l_last_interest_cal_date     DATE;
6438     l_end_of_process             BOOLEAN := FALSE;
6439     l_int_params_exist           BOOLEAN := TRUE;
6440   	l_msg_count			         NUMBER;
6441     l_from_date                  DATE;
6442     l_to_date                    DATE;
6443     l_rate_change_value          OKL_K_RATE_PARAMS.rate_change_value%TYPE;
6444     l_catchup_date               DATE;
6445     l_termination_date           DATE;
6446     l_print_lead_days            NUMBER;
6447     l_vrc_report_tbl             vrc_tbl_type;
6448     variable_interest_failed     EXCEPTION;
6449     l_int_cal_start_date         DATE;
6450     l_calculate_from_khr_start   VARCHAR2(10) := 'Y';
6451 
6452     --Bug# 13026821
6453     CURSOR l_varint_sll_csr( khrid NUMBER ) IS
6454     SELECT  NVL(rul2.rule_information10,'N') arrears_yn
6455       FROM  okc_rule_groups_b rgp,
6456             okc_rules_b rul1,
6457             okc_rules_b rul2,
6458 	      okl_strm_type_b sty
6459       WHERE  rul2.dnz_chr_id = rgp.dnz_chr_id
6460         AND  rul2.rule_information_category = 'LASLL'
6461         AND  rul2.rgp_id = rgp.id
6462         AND  rgp.cle_id IS NULL
6463         AND  rgp.chr_id = khrid
6464         AND  rgp.dnz_chr_id = khrid
6465         AND  rgp.rgd_code = 'LALEVL'
6466         AND  rul1.dnz_chr_id = rgp.dnz_chr_id
6467         AND  rul1.rule_information_category = 'LASLH'
6468         AND  rul1.rgp_id = rgp.id
6469         AND  TO_NUMBER(rul2.object2_id1) = rul1.id
6470         AND  TO_NUMBER(rul1.object1_id1) = sty.id
6471         AND  sty.stream_type_purpose = 'VARIABLE_INTEREST_SCHEDULE'
6472     ORDER BY FND_DATE.canonical_to_date(rul2.rule_information2);
6473 
6474     l_arrears_pay_dates_option VARCHAR2(50);
6475     l_arrears_yn VARCHAR2(50);
6476     l_invoice_date DATE;
6477     --Bug# 13026821
6478 
6479     --Bug# 7277007
6480     l_counter                    NUMBER;
6481     l_contract_number            OKC_K_HEADERS_B.contract_number%TYPE;
6482     l_product_name               OKL_PRODUCTS.name%TYPE;
6483 
6484     CURSOR c_var_int_params_csr(p_chr_id IN NUMBER,
6485                                 p_req_id IN NUMBER) IS
6486     SELECT 'Y'
6487     FROM   okl_var_int_params
6488     WHERE  khr_id = p_chr_id
6489     AND    request_id = p_req_id;
6490 
6491     l_var_int_params_found_yn VARCHAR2(1);
6492     --Bug# 7277007
6493 
6494     /* Cursor to evaluate contracts eligible for calculating Variable Interest depending on
6495     Principal Payment streams are between the last interest calculation date and the date
6496     user wants to run upto
6497     */
6498     CURSOR c_contracts_csr ( p_contract_number VARCHAR2, p_to_date DATE )IS
6499        SELECT distinct khr.id khr_id,
6500               khr.deal_type,
6501               khr.date_last_interim_interest_cal,
6502               chr.contract_number,
6503               chr.start_date start_date,
6504               chr.date_terminated termination_date,
6505               chr.end_date   end_date,
6506               chr.currency_code,
6507               ppm.interest_calculation_basis,
6508               ppm.revenue_recognition_method,
6509               chr.authoring_org_id,
6510               khr.pdt_id,
6511               --Bug# 7277007
6512               iex_wf_ban_status_pub.get_turninvoff(hca.party_id,hca.cust_account_id,SYSDATE) bankruptcy_sts,  --- Added as part of Bug# 14119181
6513               ppm.name product_name
6514        FROM   okc_k_headers_b chr,
6515               okl_k_headers   khr,
6516               okc_statuses_b  khs,
6517               okl_product_parameters_v ppm,
6518               hz_cust_accounts hca           --- Added as part of Bug# 14119181
6519        WHERE  CHR.CONTRACT_NUMBER = NVL(p_contract_number,CHR.CONTRACT_NUMBER)
6520        AND	  khr.deal_type IN ('LOAN','LEASEDF','LOAN-REVOLVING','LEASEST','LEASEOP')
6521        AND	  chr.id = khr.id
6522        AND	  khs.code = chr.sts_code
6523        AND    khs.ste_code = 'ACTIVE'
6524        AND    khr.pdt_id = ppm.id
6525        AND    ppm.interest_calculation_basis <> 'FIXED'
6526        AND    hca.cust_account_id  = chr.cust_acct_id  	  --- Added as part of Bug# 14119181
6527        AND    hca.status	  = 'A'                   --- Added as part of Bug# 14119181
6528       ORDER BY khr.deal_type, chr.contract_number;
6529 
6530 
6531     CURSOR interest_params_csr (p_contract_id NUMBER,
6532                                 p_effective_date DATE) IS
6533        SELECT interest_basis_code,
6534 	          calculation_formula_id,
6535 			  nvl(principal_basis_code, 'ACTUAL'),
6536               days_in_a_month_code,
6537               days_in_a_year_code,
6538               rate_change_value,
6539               catchup_settlement_code
6540        FROM   okl_k_rate_params
6541        WHERE  khr_id = p_contract_id
6542        AND    p_effective_date BETWEEN effective_from_date and nvl(effective_to_date, p_effective_date)
6543        AND    parameter_type_code = 'ACTUAL';
6544 
6545     l_next_period_start_date     DATE;  --Added by bkatraga for bug 13693187
6546 
6547   BEGIN
6548 
6549     ------------------------------------------------------------
6550     -- Start processing
6551     ------------------------------------------------------------
6552 
6553     x_return_status := OKL_API.G_RET_STS_SUCCESS;
6554 
6555     g_request_id    := FND_GLOBAL.CONC_REQUEST_ID;
6556 
6557     print_debug ('g_request_id : '|| g_request_id);
6558     print_debug ('Concurrent Request ID : '|| FND_GLOBAL.CONC_REQUEST_ID);
6559 
6560     g_to_date           := p_to_date;
6561 
6562     ------------------------------------------------------------
6563     -- Initialise local variables
6564     ------------------------------------------------------------
6565 
6566   	l_kle_id	:= l_def_no_val;
6567 
6568 
6569     -- **********************
6570     -- ** Process contracts *
6571     -- **********************
6572 
6573     print_debug('***Start of Processing***');
6574     print_debug('Contract Number: '||p_contract_number);
6575 
6576     g_no_of_contracts_processed   := 0;
6577     g_no_of_rejected_contracts    := 0;
6578     g_no_of_successful_contracts  := 0;
6579 
6580     FOR r_contracts_csr IN c_contracts_csr ( p_contract_number, p_to_date) LOOP
6581 
6582      -- Start of Code added as part of Bug# 14119181
6583      IF ( r_contracts_csr.bankruptcy_sts = 'Y')
6584      THEN
6585             print_debug('Invoices of contract => ' || r_contracts_csr.contract_number || ' not billed due to bankruptcy.');
6586             print_error_message ('Invoices of contract => ' || r_contracts_csr.contract_number || ' not billed due to bankruptcy.');
6587 
6588      ELSIF ( r_contracts_csr.bankruptcy_sts = 'N')
6589      THEN
6590      -- End of Code added as part of Bug# 14119181
6591 
6592       print_debug ('--------------------------------------------------------------------------');
6593       print_debug ('--------------------------------------------------------------------------');
6594       print_debug ('Start Processing for Contract Number: ' ||r_contracts_csr.contract_number);
6595       print_debug('Last Interest Calculation Date: ' ||r_contracts_csr.date_last_interim_interest_cal);
6596 
6597       G_CONTRACT_ID                := r_contracts_csr.khr_id;
6598       G_AUTHORING_ORG_ID           := r_contracts_csr.authoring_org_id;
6599       G_PRODUCT_ID                 := r_contracts_csr.pdt_id;
6600       G_DEAL_TYPE                  := r_contracts_csr.deal_type;
6601       G_CONTRACT_START_DATE        := r_contracts_csr.start_date;
6602       G_CONTRACT_END_DATE          := r_contracts_csr.end_date;
6603       G_CURRENCY_CODE              := r_contracts_csr.currency_code;
6604       G_INTEREST_CALCULATION_BASIS := r_contracts_csr.interest_calculation_basis;
6605       G_CALC_METHOD_CODE           := r_contracts_csr.interest_calculation_basis;
6606       G_REVENUE_RECOGNITION_METHOD := r_contracts_csr.revenue_recognition_method;
6607       G_CONTRACT_PRINCIPAL_BALANCE := NULL;
6608       l_termination_date           := r_contracts_csr.termination_date;
6609       l_last_interest_cal_date     := r_contracts_csr.date_last_interim_interest_cal;
6610 
6611       G_FIN_AST_LINE_ID            := NULL;
6612       G_ASSET_PRINCIPAL_BALANCE    := NULL;
6613 
6614       l_print_lead_days := get_printing_lead_days (G_CONTRACT_ID);
6615 
6616       --Bug# 7277007
6617       l_contract_number := r_contracts_csr.contract_number;
6618       l_product_name    := r_contracts_csr.product_name;
6619       --Bug# 7277007
6620 IF G_CONTRACT_START_DATE > nvl(p_to_date,SYSDATE) THEN
6621      OPEN interest_params_csr (G_CONTRACT_ID, G_CONTRACT_START_DATE);
6622 ELSE
6623    OPEN interest_params_csr (G_CONTRACT_ID, nvl(p_to_date,SYSDATE));
6624 
6625 END IF;
6626     --  OPEN interest_params_csr (G_CONTRACT_ID, nvl(p_to_date,SYSDATE));
6627       FETCH interest_params_csr INTO G_INTEREST_BASIS_CODE, G_CALCULATION_FORMULA_ID,
6628 			                         G_PRINCIPAL_BASIS_CODE, G_DAYS_IN_A_MONTH_CODE,
6629                                      G_DAYS_IN_A_YEAR_CODE, l_rate_change_value,
6630 									 G_CATCHUP_SETTLEMENT_CODE;
6631 
6632       IF interest_params_csr%NOTFOUND THEN
6633         l_int_params_exist := FALSE;
6634         print_error_message('Interest Params cursor did not return any records for contract ID: '||G_CONTRACT_ID);
6635 --       	RAISE variable_interest_failed;
6636       ELSE
6637         l_int_params_exist := TRUE;
6638       END IF;
6639       CLOSE interest_params_csr;
6640 
6641       IF (l_int_params_exist) THEN
6642         print_debug('Contract Number: '||r_contracts_csr.contract_number);
6643         print_debug('Contract ID: '|| G_CONTRACT_ID);
6644         print_debug('Authoring Org ID: '|| G_AUTHORING_ORG_ID);
6645         print_debug('Product ID: '|| G_PRODUCT_ID);
6646   	    print_debug('deal type :'|| G_DEAL_TYPE );
6647 	    print_debug('Contract Start Date: '||G_CONTRACT_START_DATE);
6648 	    print_debug('Contract End Date: '||G_CONTRACT_END_DATE);
6649 	    print_debug('Currency code: '||G_CURRENCY_CODE);
6650 	    print_debug('calculation basis : '|| G_INTEREST_CALCULATION_BASIS );
6651 	    print_debug('revenue recognition method : '|| G_REVENUE_RECOGNITION_METHOD);
6652 	    print_debug('Principal Balance : '|| G_CONTRACT_PRINCIPAL_BALANCE);
6653 	    print_debug('Last Interest Calculation Date: ' ||r_contracts_csr.date_last_interim_interest_cal );
6654 
6655 	    print_debug('Interest basis : '|| G_INTEREST_BASIS_CODE );
6656 	    print_debug('Calculation Formula ID : '|| G_CALCULATION_FORMULA_ID);
6657 	    print_debug('Principal Basis : '|| G_PRINCIPAL_BASIS_CODE);
6658 	    print_debug('Days in a Month : '|| G_DAYS_IN_A_MONTH_CODE);
6659 	    print_debug('Days in a Year  : '|| G_DAYS_IN_A_YEAR_CODE);
6660 	    print_debug('Catchup Settlement Code  : '|| G_CATCHUP_SETTLEMENT_CODE);
6661 
6662       IF (G_INTEREST_CALCULATION_BASIS = G_INT_CALC_BASIS_FLOAT_FACTORS) THEN
6663         BEGIN
6664           --Bug# 13447258: New API For Float Factor calculations
6665           OKL_VAR_INT_FLOAT_FACTOR_PVT.process_interest_float_factor(
6666                    p_api_version            => 1.0,
6667                    p_init_msg_list          => OKL_API.G_TRUE,
6668                    x_return_status          => l_return_status,
6669                    x_msg_count              => l_msg_count,
6670                    x_msg_data               => l_msg_data,
6671                    p_contract_id            => G_CONTRACT_ID,
6672                    p_to_date                => p_to_date,
6673                    p_last_interest_cal_date => l_last_interest_cal_date,
6674                    p_print_lead_days        => l_print_lead_days);
6675           IF (l_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6676             print_error_message('Unexpected error raised in call to PROCESS_INTEREST_FLOAT_FACTOR');
6677      	    RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6678           ELSIF (l_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6679             print_error_message('Error raised in call to PROCESS_INTEREST_FLOAT_FACTOR');
6680       	    RAISE variable_interest_failed;
6681           END IF;
6682 
6683           g_no_of_successful_contracts := g_no_of_successful_contracts + 1;
6684         EXCEPTION
6685           WHEN OTHERS THEN
6686             g_no_of_rejected_contracts := g_no_of_rejected_contracts + 1;
6687             ROLLBACK;
6688             report_error (
6689               p_contract_number     => l_contract_number,
6690               p_product_name        => l_product_name,
6691               p_interest_calc_basis => G_INTEREST_CALCULATION_BASIS,
6692               p_last_int_calc_date  => l_last_interest_cal_date,
6693               x_msg_count           => x_msg_count,
6694               x_msg_data            => x_msg_data);
6695 
6696             x_return_status := OKL_API.G_RET_STS_ERROR;
6697         END;
6698       ELSIF (G_INTEREST_CALCULATION_BASIS = G_INT_CALC_BASIS_REAMORT) THEN
6699         BEGIN
6700            --Bug# 13447258: New API For Reamort calculations
6701            OKL_VAR_INT_REAMORT_PVT.process_interest_reamort(
6702                    p_api_version            => 1.0,
6703                    p_init_msg_list          => OKL_API.G_TRUE,
6704                    x_return_status          => l_return_status,
6705                    x_msg_count              => l_msg_count,
6706                    x_msg_data               => l_msg_data,
6707                    p_contract_id            => G_CONTRACT_ID,
6708                    p_to_date                => p_to_date,
6709                    p_last_interest_cal_date => l_last_interest_cal_date,
6710                    p_print_lead_days        => l_print_lead_days);
6711            IF (l_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6712              print_error_message('Unexpected error raised in call to PROCESS_INTEREST_REAMORT');
6713      	       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6714            ELSIF (l_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6715              print_error_message('Error raised in call to PROCESS_INTEREST_REAMORT');
6716       	 RAISE variable_interest_failed;
6717            END IF;
6718 
6719            g_no_of_successful_contracts := g_no_of_successful_contracts + 1;
6720         EXCEPTION
6721           WHEN OTHERS THEN
6722             g_no_of_rejected_contracts := g_no_of_rejected_contracts + 1;
6723             ROLLBACK;
6724             report_error (
6725               p_contract_number     => l_contract_number,
6726               p_product_name        => l_product_name,
6727               p_interest_calc_basis => G_INTEREST_CALCULATION_BASIS,
6728               p_last_int_calc_date  => l_last_interest_cal_date,
6729               x_msg_count           => x_msg_count,
6730               x_msg_data            => x_msg_data);
6731 
6732             x_return_status := OKL_API.G_RET_STS_ERROR;
6733         END;
6734       ELSIF (G_INTEREST_CALCULATION_BASIS = G_INT_CALC_BASIS_FLOAT) THEN
6735          BEGIN
6736            --Bug# 13447258: New API For Float calculations
6737            OKL_VAR_INT_FLOAT_PVT.process_interest_float(
6738                    p_api_version            => 1.0,
6739                    p_init_msg_list          => OKL_API.G_TRUE,
6740                    x_return_status          => l_return_status,
6741                    x_msg_count              => l_msg_count,
6742                    x_msg_data               => l_msg_data,
6743                    p_contract_id            => G_CONTRACT_ID,
6744                    p_to_date                => p_to_date,
6745                    p_last_interest_cal_date => l_last_interest_cal_date,
6746                    p_print_lead_days        => l_print_lead_days);
6747            IF (l_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6748              print_error_message('Unexpected error raised in call to PROCESS_INTEREST_FLOAT');
6749      	       RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6750            ELSIF (l_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6751              print_error_message('Error raised in call to PROCESS_INTEREST_FLOAT');
6752       	 RAISE variable_interest_failed;
6753            END IF;
6754 
6755            g_no_of_successful_contracts := g_no_of_successful_contracts + 1;
6756          EXCEPTION
6757            WHEN OTHERS THEN
6758              g_no_of_rejected_contracts := g_no_of_rejected_contracts + 1;
6759              x_return_status := OKL_API.G_RET_STS_ERROR;
6760              l_end_of_process := TRUE;
6761              report_error (
6762                p_contract_number     => l_contract_number,
6763                p_product_name        => l_product_name,
6764                p_interest_calc_basis => G_INTEREST_CALCULATION_BASIS,
6765                p_last_int_calc_date  => l_last_interest_cal_date,
6766                x_msg_count           => x_msg_count,
6767                x_msg_data            => x_msg_data);
6768              ROLLBACK;
6769          END;
6770        ELSIF (G_INTEREST_CALCULATION_BASIS = G_INT_CALC_BASIS_CATCHUP) THEN
6771          BEGIN
6772           --Bug# 13447258: New API For Catchup-Cleanup calculations
6773           OKL_VAR_INT_CATCHUP_PVT.process_interest_catchup(
6774                    p_api_version            => 1.0,
6775                    p_init_msg_list          => OKL_API.G_TRUE,
6776                    x_return_status          => l_return_status,
6777                    x_msg_count              => l_msg_count,
6778                    x_msg_data               => l_msg_data,
6779                    p_contract_id            => G_CONTRACT_ID,
6780                    p_to_date                => p_to_date,
6781                    p_last_interest_cal_date => l_last_interest_cal_date,
6782                    p_print_lead_days        => l_print_lead_days);
6783           IF (l_return_status = Okl_Api.G_RET_STS_UNEXP_ERROR) THEN
6784             print_error_message('Unexpected error raised in call to PROCESS_INTEREST_CATCHUP');
6785      	      RAISE Okl_Api.G_EXCEPTION_UNEXPECTED_ERROR;
6786           ELSIF (l_return_status = Okl_Api.G_RET_STS_ERROR) THEN
6787             print_error_message('Error raised in call to PROCESS_INTEREST_CATCHUP');
6788       	RAISE variable_interest_failed;
6789           END IF;
6790 
6791           g_no_of_successful_contracts := g_no_of_successful_contracts + 1;
6792         EXCEPTION
6793            WHEN OTHERS THEN
6794              g_no_of_rejected_contracts := g_no_of_rejected_contracts + 1;
6795              x_return_status := OKL_API.G_RET_STS_ERROR;
6796              l_end_of_process := TRUE;
6797              report_error (
6798                p_contract_number     => l_contract_number,
6799                p_product_name        => l_product_name,
6800                p_interest_calc_basis => G_INTEREST_CALCULATION_BASIS,
6801                p_last_int_calc_date  => l_last_interest_cal_date,
6802                x_msg_count           => x_msg_count,
6803                x_msg_data            => x_msg_data);
6804              ROLLBACK;
6805         END;
6806       END IF;
6807       END IF;
6808 
6809       g_no_of_contracts_processed := g_no_of_contracts_processed + 1;
6810 
6811       l_vrc_report_tbl(g_no_of_contracts_processed).contract_number            := r_contracts_csr.contract_number;
6812       l_vrc_report_tbl(g_no_of_contracts_processed).contract_id                := G_CONTRACT_ID;
6813       l_vrc_report_tbl(g_no_of_contracts_processed).start_date                 := G_CONTRACT_START_DATE;
6814       l_vrc_report_tbl(g_no_of_contracts_processed).end_date                   := G_CONTRACT_END_DATE;
6815       l_vrc_report_tbl(g_no_of_contracts_processed).interest_calculation_basis := G_INTEREST_CALCULATION_BASIS;
6816       l_vrc_report_tbl(g_no_of_contracts_processed).days_in_a_month_code       := G_DAYS_IN_A_MONTH_CODE;
6817       l_vrc_report_tbl(g_no_of_contracts_processed).days_in_a_year_code        := G_DAYS_IN_A_YEAR_CODE;
6818       l_vrc_report_tbl(g_no_of_contracts_processed).rate_change_value          := l_rate_change_value;
6819       l_vrc_report_tbl(g_no_of_contracts_processed).process_status             := x_return_status;
6820 
6821       --Bug# 7277007
6822       --Bug# 14528742: Include partially processed contracts also in Successful contracts report
6823       IF (x_return_status IN ('S','E')) THEN
6824 
6825         l_var_int_params_found_yn := 'N';
6826         OPEN c_var_int_params_csr(p_chr_id => g_contract_id,
6827                                   p_req_id => g_request_id);
6828         FETCH c_var_int_params_csr INTO l_var_int_params_found_yn;
6829         CLOSE c_var_int_params_csr;
6830 
6831         IF (l_var_int_params_found_yn = 'Y') THEN
6832           IF g_rpt_summary_tbl.EXISTS(G_INTEREST_CALCULATION_BASIS) THEN
6833             g_rpt_summary_tbl(G_INTEREST_CALCULATION_BASIS).total_contract_num_success :=
6834             NVL(g_rpt_summary_tbl(G_INTEREST_CALCULATION_BASIS).total_contract_num_success,0) + 1;
6835           ELSE
6836             g_rpt_summary_tbl(G_INTEREST_CALCULATION_BASIS).total_contract_num_success := 1;
6837           END IF;
6838 
6839           l_counter := 1;
6840           IF g_rpt_success_icb_tbl.EXISTS(G_INTEREST_CALCULATION_BASIS) THEN
6841             l_counter := g_rpt_success_icb_tbl(G_INTEREST_CALCULATION_BASIS).LAST + 1;
6842           END IF;
6843 
6844           g_rpt_success_icb_tbl(G_INTEREST_CALCULATION_BASIS)(l_counter).contract_id          := G_CONTRACT_ID;
6845           g_rpt_success_icb_tbl(G_INTEREST_CALCULATION_BASIS)(l_counter).contract_number      := r_contracts_csr.contract_number;
6846           g_rpt_success_icb_tbl(G_INTEREST_CALCULATION_BASIS)(l_counter).days_in_a_month_code := G_DAYS_IN_A_MONTH_CODE;
6847           g_rpt_success_icb_tbl(G_INTEREST_CALCULATION_BASIS)(l_counter).days_in_a_year_code  := G_DAYS_IN_A_YEAR_CODE;
6848         END IF;
6849       END IF;
6850       --Bug# 7277007
6851 
6852       print_debug ('End Processing for Contract Number: ' ||r_contracts_csr.contract_number);
6853      END IF;  -- Added as part of Bug# 14119181
6854     END LOOP;
6855     print_debug('***Printing Report***');
6856     Print_Report(p_contract_number => p_contract_number);
6857     print_debug('***End of Processing***');
6858     	 -- Added for bug 13931371
6859      IF g_no_of_rejected_contracts > 0 THEN
6860             x_return_status := 'W';
6861     END IF;
6862 
6863 
6864   EXCEPTION
6865     	------------------------------------------------------------
6866     	-- Exception handling
6867     	------------------------------------------------------------
6868     WHEN OTHERS THEN
6869       print_error_message('Exception raised in procedure VARIABLE_INTEREST');
6870       report_error (
6871         p_contract_number     => l_contract_number,
6872         p_product_name        => l_product_name,
6873         p_interest_calc_basis => G_INTEREST_CALCULATION_BASIS,
6874         p_last_int_calc_date  => l_last_interest_cal_date,
6875         x_msg_count           => x_msg_count,
6876         x_msg_data            => x_msg_data);
6877       x_return_status := OKL_API.G_RET_STS_ERROR;
6878       ROLLBACK;
6879    END variable_interest;
6880 END;