DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKL_LOAN_BAL_UPDATE_PVT

Source


1 PACKAGE BODY OKL_LOAN_BAL_UPDATE_PVT AS
2   /* $Header: OKLRLBUB.pls 120.4 2006/07/13 12:36:41 adagur noship $ */
3 
4 
5   ------------------------------------------------------------------------------
6     -- Start of Comments
7     -- Created By:       smadhava
8     -- Procedure Name:   get_loan_amounts
9     -- Description:      This Procedure is called from concurrent program "OKL Loan Balances Update"
10     --                   as of a given date for a Loan
11     --                   Inputs :
12     --                   Output :
13     -- Dependencies:
14     -- Parameters:       Contract id, As of Date
15     -- Version:          1.0
16     -- End of Comments
17   -----------------------------------------------------------------------------
18   PROCEDURE get_loan_amounts(
19                               p_api_version      IN         NUMBER
20                             , p_init_msg_list    IN         VARCHAR2 DEFAULT OKL_API.G_FALSE
21                             , x_return_status    OUT NOCOPY VARCHAR2
22                             , x_msg_count        OUT NOCOPY NUMBER
23                             , x_msg_data         OUT NOCOPY VARCHAR2
24                             , p_khr_rec          IN         khr_rec_type
25                             , p_as_of_date       IN         DATE) IS
26     l_api_version CONSTANT NUMBER DEFAULT 1.0;
27     l_api_name CONSTANT VARCHAR2(30) DEFAULT 'GET_LOAN_AMOUNTS';
28 
29     l_module CONSTANT fnd_log_messages.MODULE%TYPE := 'okl.plsql.OKL_LOAN_BAL_UPDATE_PVT.GET_LOAN_AMOUNTS';
30     l_debug_enabled VARCHAR2(10);
31 
32     --l_khr_id NUMBER;
33     --l_asset_exists BOOLEAN := FALSE;
34 
35     l_kle_prin_bal              NUMBER := 0;
36     l_khr_prin_bal              NUMBER := 0;
37     l_tot_interest_amt_due      NUMBER := 0;
38     l_tot_interest_amt_billed   NUMBER := 0;
39     l_tot_interest_amt_received NUMBER := 0;
40 
41     l_cblv_rec okl_cblv_rec;
42     l_crt_cblv_tbl okl_cblv_tbl;
43     lx_crt_cblv_tbl okl_cblv_tbl;
44     l_upd_cblv_tbl okl_cblv_tbl;
45     lx_upd_cblv_tbl okl_cblv_tbl;
46 
47 
48     i   NUMBER   := 0;
49     j   NUMBER   := 0;
50 
51     /*
52        CURSOR TO CHECK IF THE contract's Book classification is LOAN or REVOLVING-LOAN
53        AND IF contract status is booked or terminated
54      */
55     /*CURSOR check_contract_loan_bal(p_contract_number VARCHAR2) IS
56       SELECT
57              KHR.ID
58        FROM
59              OKC_K_HEADERS_B CHR
60            , OKL_K_HEADERS KHR
61            , OKL_PRODUCT_PARAMETERS_V PPM
62            , OKC_STATUSES_V STS
63        WHERE chr.id = khr.id
64        AND   khr.pdt_id = ppm.id
65        AND   chr.sts_code = sts.code
66        AND   (sts.code = 'BOOKED'    OR sts.ste_code = 'TERMINATED')
67        AND   (ppm.deal_type = 'LOAN' OR ppm.deal_type = 'LOAN-REVOLVING')
68        AND   CHR.CONTRACT_NUMBER = p_contract_number;*/
69 
70     -- Cursor to obtain the Assets in a contract
71     CURSOR get_assets(cp_khr_id NUMBER) IS
72       SELECT assets.id     asset_id
73           , assets.name   asset_number
74       FROM okc_k_lines_v     assets
75           , okc_line_styles_b lse
76           ,okc_statuses_v sts
77       WHERE assets.dnz_chr_id   = cp_khr_id
78       AND lse.id              = assets.lse_id
79       AND lse.lty_code        = 'FREE_FORM1'
80       AND assets.sts_code = sts.code
81       AND sts.ste_code in ('ACTIVE', 'TERMINATED');
82 
83     -- Cursor to check the presence of contract balances for a contract
84     CURSOR chk_contract_bal(p_chr_id NUMBER) IS
85       SELECT  id
86             , object_version_number
87       FROM  okl_contract_balances
88       WHERE  khr_id = p_chr_id
89       AND kle_id IS NULL ;
90 
91     -- Cursor to check the presence of contract balances for a contract asset
92     CURSOR chk_asset_bal(p_chr_id NUMBER, p_kle_id NUMBER) IS
93       SELECT  id
94             , object_version_number
95       FROM  okl_contract_balances
96       WHERE khr_id = p_chr_id
97       AND kle_id = p_kle_id;
98   BEGIN
99     l_debug_enabled := okl_debug_pub.check_log_enabled;
100 
101     IF(NVL(l_debug_enabled,'N')='Y') THEN
102       okl_debug_pub.log_debug(FND_LOG.LEVEL_PROCEDURE,l_module,'begin debug OKLRLBUB.pls call GET_LOAN_AMOUNTS');
103     END IF;
104 
105     -- call START_ACTIVITY to create savepoint, check compatibility and initialize message list
106     /*x_return_status := OKL_API.START_ACTIVITY(
107         p_api_name      => l_api_name
108       , p_pkg_name      => G_PKG_NAME
109       , p_init_msg_list => p_init_msg_list
110       , l_api_version   => l_api_version
111       , p_api_version   => p_api_version
112       , p_api_type      => G_API_TYPE
113       , x_return_status => x_return_status);
114     -- check if activity started successfully
115     IF(x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
116       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
117     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
118       RAISE OKL_API.G_EXCEPTION_ERROR;
119     END IF;*/
120 
121     x_return_status := OKL_API.G_RET_STS_SUCCESS;
122     -- check if the contract is of Book classification LOAN or REVOLVING-LOAN and is Booked
123     /*OPEN check_contract_loan_bal(p_contract_number);
124       FETCH check_contract_loan_bal INTO l_khr_id;
125       IF check_contract_loan_bal%NOTFOUND THEN
126          FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Contract Book classification is not valid or the contract status is not Booked ');
127          FND_FILE.PUT_LINE (FND_FILE.LOG,'Contract Book classification is not valid or the contract status is not Booked ');
128         RAISE OKL_API.G_EXCEPTION_ERROR;
129       END IF;
130     CLOSE check_contract_loan_bal;*/
131 
132     i :=1;
133     j :=1;
134     -- Get the asset IDs of the contract
135     IF (p_khr_rec.deal_type = 'LOAN') THEN
136       FOR l_kle_rec IN get_assets(p_khr_rec.khr_id)
137       LOOP
138          --l_asset_exists := TRUE;
139          --FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Calculation for Asset Number: '|| l_kle_rec.asset_number);
140          --FND_FILE.PUT_LINE (FND_FILE.LOG,'Calculation for Asset Number: '|| l_kle_rec.asset_number);
141         /********************************************
142          * Calculation FOR Actual Principal Balance *
143          ********************************************/
144          FND_FILE.PUT_LINE (FND_FILE.LOG,'Calculation for Actual Principal Balance');
145          -- Get the total principal balance
146          l_kle_prin_bal :=
147                OKL_VARIABLE_INT_UTIL_PVT.get_principal_bal( x_return_status
148                                                           , p_khr_rec.khr_id -- Contract ID
149                                                           , l_kle_rec.asset_id -- Asset ID
150                                                           , p_as_of_date );
151 
152         IF(x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
153           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate principal balance for Asset Number: '|| l_kle_rec.asset_number);
154         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
155           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate principal balance for Asset Number: '|| l_kle_rec.asset_number);
156         END IF;
157         FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Asset Number: '|| l_kle_rec.asset_number || ' Principal Balance : ' || l_kle_prin_bal);
158         --l_khr_prin_bal := l_khr_prin_bal + l_kle_prin_bal;
159 
160         -- Actual Principal balance = outstanding principal balance
161         --l_actual_prin_bal := l_outstanding_prin_bal;
162         --FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Actual Principal balance (outstanding principal balance)='||l_actual_prin_bal);
163         --FND_FILE.PUT_LINE (FND_FILE.LOG,'Actual Principal balance (outstanding principal balance )='||l_actual_prin_bal);
164 
165         -- Initialize the contract balances record with the values
166         l_cblv_rec.khr_id                          := p_khr_rec.khr_id;
167         l_cblv_rec.kle_id                          := l_kle_rec.asset_id;
168         l_cblv_rec.actual_principal_balance_amt    := l_kle_prin_bal;
169         l_cblv_rec.actual_principal_balance_date   := p_as_of_date;
170 
171         -- Check if there are balances for this asset
172         OPEN chk_asset_bal(p_khr_rec.khr_id, l_kle_rec.asset_id);
173         FETCH chk_asset_bal INTO l_cblv_rec.id, l_cblv_rec.object_version_number;
174 
175         IF chk_asset_bal%NOTFOUND THEN
176             l_crt_cblv_tbl(i) := l_cblv_rec;
177             i := i + 1;
178         ELSE
179             l_upd_cblv_tbl(j) := l_cblv_rec;
180             j := j + 1;
181         END IF; -- end of check for presence of contract asset balances
182         CLOSE chk_asset_bal; -- end of check for Balances for asset
183 
184       END LOOP; -- end of for loop for Assets
185    END IF;
186 
187 
188     --FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'--------------------------------------------------------------------------');
189     --FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Contract Balances for Contract Number: ' ||p_contract_number);
190     --FND_FILE.PUT_LINE (FND_FILE.LOG,'--------------------------------------------------------------------------');
191     --FND_FILE.PUT_LINE (FND_FILE.LOG,'Contract Balances for Contract Number: ' ||p_contract_number);
192 
193     -- Re-initialize the principal balance columns
194     l_cblv_rec.actual_principal_balance_amt    := null;
195     l_cblv_rec.actual_principal_balance_date   := null;
196 
197     -- A revolving loan doesnot have any assets and hence has a contract level information only.
198     --IF NOT l_asset_exists THEN
199       /********************************************
200        * Calculation FOR Actual Principal Balance *
201        ********************************************/
202        --FND_FILE.PUT_LINE (FND_FILE.LOG,'Calculation for Actual Principal Balance');
203       -- Get the total principal balance
204       l_khr_prin_bal :=
205              OKL_VARIABLE_INT_UTIL_PVT.get_principal_bal( x_return_status
206                                                         , p_khr_rec.khr_id -- Contract ID
207                                                         , null     --Asset id is null for revolving Loan
208                                                         , p_as_of_date );
209       IF(x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
210           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate principal balance for Contract Number: '|| p_khr_rec.contract_number);
211       ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
212           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate principal balance for Contract Number: '|| p_khr_rec.contract_number);
213       END IF;
214       FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Contract Number: '|| p_khr_rec.contract_number || ' Principal Balance : ' || l_khr_prin_bal);
215 
216       -- Actual Principal balance = outstanding principal balance
217       --l_actual_prin_bal := l_outstanding_prin_bal;
218 
219       l_cblv_rec.actual_principal_balance_amt    := l_khr_prin_bal;
220       l_cblv_rec.actual_principal_balance_date   := p_as_of_date;
221 
222       --FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Actual Principal balance (outstanding principal balance)='||l_actual_prin_bal);
223       --FND_FILE.PUT_LINE (FND_FILE.LOG,'Actual Principal balance (outstanding principal balance )='||l_actual_prin_bal);
224     --END IF; -- end of check for existence of asset for the contract
225 
226      /*********************************************
227       * Calculation FOR Total Interest Amount Due *
228       *********************************************/
229       --FND_FILE.PUT_LINE (FND_FILE.LOG,'Calculation for Total Interest Amount Due');
230       -- Get the total interest amount due
231       l_tot_interest_amt_due :=
232              OKL_VARIABLE_INT_UTIL_PVT.get_interest_due(  x_return_status
233                                                         , p_khr_rec.khr_id -- Contract ID
234                                                         , p_as_of_date );
235       IF(x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
236           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate interest due for Contract Number: '|| p_khr_rec.contract_number);
237       ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
238           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate interest due for Contract Number: '|| p_khr_rec.contract_number);
239       END IF;
240       FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Contract Number: '|| p_khr_rec.contract_number || ' Interest Due : ' || l_tot_interest_amt_due);
241       /************************************************
242        * Calculation FOR Total Interest Amount Billed *
243        ************************************************/
244       -- Get the total interest amount billed
245       l_tot_interest_amt_billed :=
246              OKL_VARIABLE_INT_UTIL_PVT.get_interest_billed( x_return_status
247                                                           , p_khr_rec.khr_id -- Contract ID
248                                                           , NULL
249                                                           , p_as_of_date );
250       IF(x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
251           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate interest billed for Contract Number: '|| p_khr_rec.contract_number);
252       ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
253           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate interest billed for Contract Number: '|| p_khr_rec.contract_number);
254       END IF;
255       FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Contract Number: '|| p_khr_rec.contract_number || ' Interest Billed : ' || l_tot_interest_amt_billed);
256       --FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Total interest amount billed ='|| l_tot_interest_amt_billed );
257       --FND_FILE.PUT_LINE (FND_FILE.LOG,'Total interest amount billed ='|| l_tot_interest_amt_billed );
258       /**************************************************
259        * Calculation FOR Total Interest Amount Received *
260        **************************************************/
261       -- Get the total interest amount received
262       l_tot_interest_amt_received :=
263              OKL_VARIABLE_INT_UTIL_PVT.get_interest_paid( x_return_status
264                                                         , p_khr_rec.khr_id -- Contract ID
265                                                         , NULL
266                                                         , p_as_of_date );
267       IF(x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
268           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate interest received for Contract Number: '|| p_khr_rec.contract_number);
269       ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
270           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to calculate interest received for Contract Number: '|| p_khr_rec.contract_number);
271       END IF;
272       FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Contract Number: '|| p_khr_rec.contract_number || ' Interest Received : ' || l_tot_interest_amt_received);
273       --FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Total interest amount received ='|| l_tot_interest_amt_received);
274       --FND_FILE.PUT_LINE (FND_FILE.LOG,'Total interest amount received ='|| l_tot_interest_amt_received);
275 
276       -- Initialize the contract balances record with the values
277       l_cblv_rec.khr_id                          := p_khr_rec.khr_id;
278       l_cblv_rec.kle_id                          := NULL;
279       l_cblv_rec.interest_amt                    := l_tot_interest_amt_due;
280       l_cblv_rec.interest_calc_date              := p_as_of_date;
281       l_cblv_rec.interest_billed_amt             := l_tot_interest_amt_billed;
282       l_cblv_rec.interest_billed_date            := p_as_of_date;
283       l_cblv_rec.interest_received_amt           := l_tot_interest_amt_received;
284       l_cblv_rec.interest_received_date          := p_as_of_date;
285 
286       -- Check if there are balances for this contract
287       OPEN chk_contract_bal(p_khr_rec.khr_id);
288       FETCH chk_contract_bal INTO l_cblv_rec.id, l_cblv_rec.object_version_number;
289       IF chk_contract_bal%NOTFOUND THEN
290           l_crt_cblv_tbl(i) := l_cblv_rec;
291       ELSE
292           l_upd_cblv_tbl(j) := l_cblv_rec;
293       END IF; -- end of check for presence of contract asset balances
294       CLOSE chk_contract_bal;
295 
296     IF l_crt_cblv_tbl.COUNT > 0 THEN
297       -- Insert the table of records into OKL_CONTRACT_BALANCES
298       OKL_CONTRACT_BALANCES_PVT.create_contract_balance(
299                          p_api_version      => l_api_version
300                        , p_init_msg_list    => p_init_msg_list
301                        , x_return_status    => x_return_status
302                        , x_msg_count        => x_msg_count
303                        , x_msg_data         => x_msg_data
304                        , p_cblv_tbl         => l_crt_cblv_tbl
305                        , x_cblv_tbl         => lx_crt_cblv_tbl);
306       IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
307           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to create balances for Contract Number: '|| p_khr_rec.contract_number);
308       ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
309           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to create balances for Contract Number: '|| p_khr_rec.contract_number);
310       END IF;
311       FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Successfully created balances for Contract Number: '|| p_khr_rec.contract_number);
312     END IF;
313 
314     IF l_upd_cblv_tbl.COUNT > 0 THEN
315       -- Update the table of records in OKL_CONTRACT_BALANCES
316       OKL_CONTRACT_BALANCES_PVT.update_contract_balance(
317                          p_api_version      => l_api_version
318                        , p_init_msg_list    => p_init_msg_list
319                        , x_return_status    => x_return_status
320                        , x_msg_count        => x_msg_count
321                        , x_msg_data         => x_msg_data
322                        , p_cblv_tbl         => l_upd_cblv_tbl
323                        , x_cblv_tbl         => lx_upd_cblv_tbl);
324       IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
325           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to update balances for Contract Number: '|| p_khr_rec.contract_number);
326       ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
327           FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Unable to update balances for Contract Number: '|| p_khr_rec.contract_number);
328       END IF;
329       FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Successfully updated balances for Contract Number: '|| p_khr_rec.contract_number);
330     END IF;
331     -- commit the savepoint
332     --OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data  => x_msg_data);
333 
334     IF(NVL(l_debug_enabled,'N')='Y') THEN
335       okl_debug_pub.log_debug(FND_LOG.LEVEL_PROCEDURE,l_module,'end debug OKLRLBUB.pls call GET_LOAN_AMOUNTS');
336     END IF;
337 
338   EXCEPTION
339     WHEN OTHERS THEN
340       x_return_status := x_return_status;
341   END get_loan_amounts;
342 
343   --------------------------------------------------------------------------------
344     --Start of Comments
345     --API Name    : calculate_loan_amounts
346     --Description : Process API to calculate the balances for a contract and its
347     --              assets. The API is called by the Loan Balances concurrent
348     --              program to create/update the balances for the contract based
349     --              on the given date.
350     --History     :
351     --              02-SEP-2005 dkagrawa Created
352     --End of Comments
353   ------------------------------------------------------------------------------
354 
355   PROCEDURE calculate_loan_amounts(
356                        errbuf  OUT NOCOPY VARCHAR2
357                      , retcode OUT NOCOPY NUMBER
358                      , p_contract_number IN VARCHAR2
359                      , p_as_of_date         IN VARCHAR2 ) IS
360     l_api_version CONSTANT NUMBER DEFAULT 1.0;
361 
362     lx_msg_count      NUMBER;
363     lx_msg_data       VARCHAR2(450);
364     l_msg_index_out   NUMBER;
365     lx_return_status  VARCHAR(1) := OKL_API.G_RET_STS_SUCCESS;
366     l_as_of_date      DATE := TRUNC(SYSDATE);
367     l_khr_rec         khr_rec_type;
368 
369     CURSOR c_khr_csr(cp_contract_number IN VARCHAR2) IS SELECT chr.id khr_id,
370         chr.contract_number,
371         sts.code status,
372         ppm.deal_type,
373         ppm.interest_calculation_basis ,
374         ppm.revenue_recognition_method
375     FROM okc_k_headers_b chr
376        , okl_k_headers khr
377        , okl_product_parameters_v ppm
378        , okc_statuses_v sts
379     WHERE chr.contract_number = NVL(cp_contract_number, chr.contract_number)
380     AND   chr.id = khr.id
381     AND   khr.pdt_id = ppm.id
382     AND   chr.sts_code = sts.code
383     AND   (sts.code = 'BOOKED'     OR sts.ste_code = 'TERMINATED')
384     AND   (ppm.deal_type = 'LOAN' OR ppm.deal_type = 'LOAN-REVOLVING')
385     AND   (NOT(ppm.interest_calculation_basis = 'FIXED' AND ppm.revenue_recognition_method = 'STREAMS'))
386     ORDER BY chr.contract_number;
387   BEGIN
388 
389     IF p_as_of_date IS NOT NULL THEN
390       l_as_of_date :=  FND_DATE.CANONICAL_TO_DATE(p_as_of_date);
391     END IF;
392 
393     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '***********************************************');
394     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'OKL Loan Balances Update for Variable Interest');
395     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '***********************************************');
396     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'Program Run Date: '||sysdate);
397     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'To Date: '||l_as_of_date);
398     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'Success or Error Detailed Messages Each Update');
399 
400     FOR cur_khr IN c_khr_csr(p_contract_number) LOOP
401       l_khr_rec := cur_khr;
402       FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '***********************************************');
403       FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'Processing Contract Number: '|| l_khr_rec.contract_number);
404       FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '  Status: ' || l_khr_rec.status);
405       FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '  Book classification: ' || l_khr_rec.deal_type);
406       FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '  Interest calculation method: ' || l_khr_rec.interest_calculation_basis);
407       FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '  Revenue recognition method: ' || l_khr_rec.revenue_recognition_method);
408 
409       get_loan_amounts(
410                       p_api_version      => l_api_version,
411                       p_init_msg_list    => FND_API.G_FALSE,
412                       x_return_status    => lx_return_status,
413                       x_msg_count        => lx_msg_count,
414                       x_msg_data         => errbuf,
415                       p_khr_rec          => l_khr_rec,
416                       p_as_of_date       => l_as_of_date);
417 
418       IF (lx_return_status = OKL_API.G_RET_STS_SUCCESS) THEN
419         FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'Successfully processed contract: ' || l_khr_rec.contract_number);
420         Commit;
421       ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
422         FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'Error processing contract: ' || l_khr_rec.contract_number);
423       ELSIF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
424         FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'Unexpected error processing contract: ' || l_khr_rec.contract_number);
425         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
426       END IF;
427       FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '***********************************************');
428     END LOOP;
429 
430     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'OKL Loan Balances Update for Variable Interest Completed Successfully');
431     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, 'Program End Date: '||sysdate);
432     FND_FILE.PUT_LINE (FND_FILE.OUTPUT, '***********************************************');
433 
434     errbuf := lx_msg_data;
435     IF lx_msg_count >= 1 THEN
436       FOR i in 1..lx_msg_count LOOP
437         fnd_msg_pub.get (p_msg_index     => i,
438                          p_encoded       => 'F',
439                          p_data          => lx_msg_data,
440                          p_msg_index_out => l_msg_index_out);
441 
442         FND_FILE.PUT_LINE (FND_FILE.OUTPUT,to_char(i) || ': ' || lx_msg_data);
443       END LOOP; -- end of for loop
444     END IF; -- end of check for message count
445     retcode := 0;
446   EXCEPTION
447     WHEN Okl_Api.G_EXCEPTION_ERROR THEN
448       retcode := 2;
449       lx_return_status := Okl_Api.HANDLE_EXCEPTIONS(G_APP_NAME,
450                                                     G_PKG_NAME,
451                                                    'Okl_Api.G_RET_STS_ERROR',
452                                                     lx_msg_count,
453                                                     lx_msg_data,
454                                                     '_PVT');
455     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
456       retcode := 2;
457       lx_return_status := OKL_API.HANDLE_EXCEPTIONS(
458                            p_api_name  => G_APP_NAME,
459                            p_pkg_name  => G_PKG_NAME,
460                            p_exc_name  => 'OKL_API.G_RET_STS_UNEXP_ERROR',
461                            x_msg_count => lx_msg_count,
462                            x_msg_data  => lx_msg_data,
463                            p_api_type  => '_PVT');
464     WHEN OTHERS THEN
465       retcode := 2;
466       errbuf := SQLERRM;
467       FND_FILE.PUT_LINE (FND_FILE.OUTPUT,'Error '||SQLCODE||': '||SQLERRM);
468   END calculate_loan_amounts;
469 
470 END OKL_LOAN_BAL_UPDATE_PVT; -- end of Body