DBA Data[Home] [Help]

PACKAGE BODY: APPS.LNS_BILLING_BATCH_PUB

Source


1 PACKAGE BODY LNS_BILLING_BATCH_PUB as
2 /* $Header: LNS_BILLING_B.pls 120.74.12020000.4 2012/10/17 12:59:35 scherkas ship $ */
3 
4 
5 /*=======================================================================+
6  |  Package Global Constants
7  +=======================================================================*/
8     G_PKG_NAME                      CONSTANT VARCHAR2(30):= 'LNS_BILLING_BATCH_PUB';
9     G_LOG_ENABLED                   varchar2(5);
10     G_MSG_LEVEL                     NUMBER;
11     g_org_id                        number;
12     g_batch_source_id               number;
13     g_days_to_bill_before_dd        number;
14     g_trx_type_id                   number;
15     g_day_togl_after_dd             number;
16     g_multiple_lines                VARCHAR2(1);
17     g_sys_opt_num                   number;
18     g_int_trx_type_id               number;
19     g_fee_trx_type_id               number;
20     g_cr_return_status              varchar2(10);
21     g_receivables_trx_id            number;
22     g_USSGL_TRANSACTION_CODE        varchar2(30);
23     g_last_billing_report           clob;
24     g_last_all_statements           clob;
25     g_forgiveness_rec_trx_id        number;
26     g_set_of_books_id               number;
27 
28 
29 PROCEDURE FORGIVENESS_ADJUSTMENT(
30     P_API_VERSION		    IN          NUMBER,
31     P_INIT_MSG_LIST		    IN          VARCHAR2,
32     P_COMMIT			    IN          VARCHAR2,
33     P_VALIDATION_LEVEL	    IN          NUMBER,
34     P_LOAN_ID               IN          NUMBER,
35     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
36     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
37     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2);
38 
39 PROCEDURE REVERSE_BILLED_FEES(p_amortization_id IN NUMBER);
40 
41 
42 /*========================================================================
43  | PRIVATE PROCEDURE LogMessage
44  |
45  | DESCRIPTION
46  |      This procedure logs debug messages to db and to CM log
47  |
48  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
49  |      init
50  |      CREATE_AR_INVOICES
51  |      CREATE_AR_CM
52  |      APPLY_RECEIPT
53  |      BILL_SINGLE_LOAN
54  |      CALC_SINGLE_LOAN_NEXT_DD
55  |      LNS_BILLING_CONCUR
56  |      LNS_RVRS_PMT_CONCUR
57  |      BILL_LOANS
58  |      CALC_PAST_DUE_LOANS_NEXT_DD
59  |      REVERSE_LAST_AMORTIZATION
60  |      CREATE_SINGLE_OFFCYCLE_BILL
61  |      CREATE_OFFCYCLE_BILLS
62  |      REVERSE_OFFCYCLE_BILL
63  |
64  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
65  |      None
66  |
67  | PARAMETERS
68  |      p_msg_level     IN      Debug msg level
69  |      p_msg           IN      Debug msg itself
70  |
71  | KNOWN ISSUES
72  |      None
73  |
74  | NOTES
75  |      Any interesting aspect of the code in the package body which needs
76  |      to be stated.
77  |
78  | MODIFICATION HISTORY
79  | Date                  Author            Description of Changes
80  | 01-01-2004            scherkas          Created
81  |
82  *=======================================================================*/
83 Procedure LogMessage(p_msg_level IN NUMBER, p_msg in varchar2)
84 IS
85 BEGIN
86 
87     if (p_msg_level >= G_MSG_LEVEL) then
88         FND_LOG.STRING(p_msg_level, G_PKG_NAME, p_msg);
89     end if;
90 
91     if FND_GLOBAL.Conc_Request_Id is not null then
92         fnd_file.put_line(FND_FILE.LOG, p_msg);
93     end if;
94 
95 EXCEPTION
96     WHEN OTHERS THEN
97         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: ' || sqlerrm);
98 END;
99 
100 
101 
102 /*========================================================================
103  | PRIVATE PROCEDURE init
104  |
105  | DESCRIPTION
106  |      This procedure inits data needed for processing
107  |
108  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
109  |      LNS_BILLING_CONCUR
110  |      LNS_RVRS_PMT_CONCUR
111  |      BILL_LOANS
112  |      CALC_PAST_DUE_LOANS_NEXT_DD
113  |      REVERSE_LAST_AMORTIZATION
114  |      CREATE_SINGLE_OFFCYCLE_BILL
115  |      REVERSE_OFFCYCLE_BILL
116  |
117  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
118  |      LogMessage
119  |
120  | PARAMETERS
121  |      None
122  |
123  | KNOWN ISSUES
124  |      None
125  |
126  | NOTES
127  |      Any interesting aspect of the code in the package body which needs
128  |      to be stated.
129  |
130  | MODIFICATION HISTORY
131  | Date                  Author            Description of Changes
132  | 01-01-2004            scherkas          Created
133  |
134  *=======================================================================*/
135 Procedure init
136 IS
137     l_api_name                      CONSTANT VARCHAR2(30) := 'INIT';
138     l_org_status                    varchar2(1);
139 BEGIN
140 
141     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
142     --fnd_global.apps_initialize(FND_GLOBAL.USER_ID, FND_GLOBAL.RESP_ID, FND_GLOBAL.RESP_APPL_ID, FND_GLOBAL.SECURITY_GROUP_ID);
143 
144     /* getting msg logging info */
145     G_LOG_ENABLED := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'), 'N');
146     G_MSG_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
147     /*
148     if (G_LOG_ENABLED = 'N') then
149        G_MSG_LEVEL := FND_LOG.LEVEL_UNEXPECTED;
150     else
151        G_MSG_LEVEL := NVL(to_number(FND_PROFILE.VALUE('AFLOG_LEVEL')), FND_LOG.LEVEL_UNEXPECTED);
152     end if;
153     */
154 
155     LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_LOG_ENABLED: ' || G_LOG_ENABLED);
156     LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_MSG_LEVEL: ' || G_MSG_LEVEL);
157 
158     /* getting org_id */
159 --    g_org_id := to_number(fnd_profile.value('ORG_ID'));
160     g_org_id := MO_GLOBAL.GET_CURRENT_ORG_ID();
161     LogMessage(FND_LOG.LEVEL_STATEMENT, 'g_org_id: ' || g_org_id);
162     l_org_status := MO_GLOBAL.check_valid_org(g_org_id);
163     LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.check_valid_org(' || g_org_id || '): ' || l_org_status);
164 
165     /* checking for number of system options record for giving org_id */
166     select count(1) into g_sys_opt_num from LNS_SYSTEM_OPTIONS where ORG_ID = g_org_id;
167 
168     if g_sys_opt_num = 0 then
169 
170 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No system options found for the org ' || g_org_id);
171         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_SYSTEM_OPTIONS');
172 		FND_MESSAGE.SET_TOKEN('ORG', g_org_id);
173 		FND_MSG_PUB.Add;
174         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
175         RAISE FND_API.G_EXC_ERROR;
176 
177     elsif g_sys_opt_num > 1 then
178 
179 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Found more then 1 system options records for the org ' || g_org_id);
180     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MANY_SYSTEM_OPTIONS');
181 		FND_MESSAGE.SET_TOKEN('ORG', g_org_id);
182 		FND_MSG_PUB.Add;
183         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
184         RAISE FND_API.G_EXC_ERROR;
185 
186     end if;
187 
188     /* getting system options */
189     select BATCH_SOURCE_ID,
190         DAYS_TOBILL_BEFORE_DUE_DATE,
191         TRX_TYPE_ID,
192         DAYS_TOGL_AFTER_DUE_DATE,
193         COMBINE_INT_PRIN_FLAG,
194         INTEREST_TRX_TYPE_ID,
195         FEE_TRX_TYPE_ID,
196         RECEIVABLES_TRX_ID,
197         ADJUST_USSGL_TRX_CODE,
198         FORGIVENESS_REC_TRX_ID,
199         SET_OF_BOOKS_ID
200      into g_batch_source_id,
201         g_days_to_bill_before_dd,
202         g_trx_type_id,
203         g_day_togl_after_dd,
204         g_multiple_lines,
205         g_int_trx_type_id,
206         g_fee_trx_type_id,
207         g_receivables_trx_id,
208         g_USSGL_TRANSACTION_CODE,
209         g_forgiveness_rec_trx_id,
210         g_set_of_books_id
211      FROM LNS_SYSTEM_OPTIONS
212     WHERE ORG_ID = g_org_id;
213 
214     LogMessage(FND_LOG.LEVEL_STATEMENT, 'System options:');
215     LogMessage(FND_LOG.LEVEL_STATEMENT, 'batch_source_id: ' || g_batch_source_id);
216     LogMessage(FND_LOG.LEVEL_STATEMENT, 'days_to_bill_before_dd: ' || g_days_to_bill_before_dd);
217     LogMessage(FND_LOG.LEVEL_STATEMENT, 'trx_type_id: ' || g_trx_type_id);
218     LogMessage(FND_LOG.LEVEL_STATEMENT, 'day_togl_after_dd: ' || g_day_togl_after_dd);
219     LogMessage(FND_LOG.LEVEL_STATEMENT, 'multiple_lines: ' || g_multiple_lines);
220     LogMessage(FND_LOG.LEVEL_STATEMENT, 'int_trx_type_id: ' || g_int_trx_type_id);
221     LogMessage(FND_LOG.LEVEL_STATEMENT, 'fee_trx_type_id: ' || g_fee_trx_type_id);
222     LogMessage(FND_LOG.LEVEL_STATEMENT, 'receivables_trx_id: ' || g_receivables_trx_id);
223     LogMessage(FND_LOG.LEVEL_STATEMENT, 'USSGL_TRANSACTION_CODE: ' || g_USSGL_TRANSACTION_CODE);
224     LogMessage(FND_LOG.LEVEL_STATEMENT, 'g_forgiveness_rec_trx_id: ' || g_forgiveness_rec_trx_id);
225     LogMessage(FND_LOG.LEVEL_STATEMENT, 'g_set_of_books_id: ' || g_set_of_books_id);
226 
227     if g_batch_source_id is null then
228 
229 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Batch Source is not set in the system option.');
230     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_BATCH_IN_SYS_OPT');
231 		FND_MSG_PUB.Add;
232         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
233         RAISE FND_API.G_EXC_ERROR;
234 
235     end if;
236 
237     if g_trx_type_id is null then
238 
239 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Default Transaction Type is not set in the system option.');
240     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_TYPE_IN_SYS_OPT');
241 		FND_MSG_PUB.Add;
242         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
243         RAISE FND_API.G_EXC_ERROR;
244 
245     end if;
246 
247     if g_multiple_lines is null then
248 
249 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Combination Invoice is not set in the system option.');
250     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INV_COMB_IN_SYS_OPT');
251 		FND_MSG_PUB.Add;
252         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
253         RAISE FND_API.G_EXC_ERROR;
254 
255     end if;
256 
257     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
258 
259 END;
260 
261 
262 
263 FUNCTION GET_BILLING_DATE(P_DAYS IN NUMBER) RETURN VARCHAR2 IS
264     l_return    varchar2(20);
265 BEGIN
266 
267     if P_DAYS is not null then
268 --        l_return := ' ( ' || (sysdate + P_DAYS) || ' )';
269         l_return := to_char(sysdate + P_DAYS,'YYYY-MM-DD');
270     end if;
271 
272     return l_return;
273 END;
274 
275 
276 
277 /*========================================================================
278  | PRIVATE PROCEDURE STORE_LAST_PAYMENT_NUMBER
279  |
280  | DESCRIPTION
281  |      This procedure stores last payment number and last amortization id in lns_loan_headers_all
282  |
283  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
284  |
285  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
286  |      LogMessage
287  |
288  | PARAMETERS
289  |      P_LOAN_ID       IN      Loan ID
290  |
291  | KNOWN ISSUES
292  |      None
293  |
294  | NOTES
295  |      Any interesting aspect of the code in the package body which needs
296  |      to be stated.
297  |
298  | MODIFICATION HISTORY
299  | Date                  Author            Description of Changes
300  | 02-11-2005            scherkas          Created
301  |
302  *=======================================================================*/
303 Procedure STORE_LAST_PAYMENT_NUMBER(P_LOAN_ID IN NUMBER)
304 IS
305 
306 /*-----------------------------------------------------------------------+
307  | Local Variable Declarations and initializations                       |
308  +-----------------------------------------------------------------------*/
309 
310     l_api_name                      CONSTANT VARCHAR2(30) := 'STORE_LAST_PAYMENT_NUMBER';
311     l_api_version                   CONSTANT NUMBER := 1.0;
312     l_return_status                 VARCHAR2(1);
313     l_msg_count                     NUMBER;
314     l_msg_data                      VARCHAR2(32767);
315     l_version_number                number;
316     l_loan_id                       number;
317     l_Count                         number;
318     l_loan_number                   varchar2(60);
319     l_last_payment_number           number;
320     l_amortization_id               number;
321     l_old_last_payment_number       number;
322     l_old_amortization_id           number;
323     l_current_phase                 varchar2(30);
324 
325     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
326 
327 /*-----------------------------------------------------------------------+
328  | Cursor Declarations                                                   |
329  +-----------------------------------------------------------------------*/
330     CURSOR loan_ver_cur(P_LOAN_ID NUMBER) IS
331         select
332         head.OBJECT_VERSION_NUMBER,
333         head.loan_id,
334         head.loan_number,
335         head.LAST_PAYMENT_NUMBER,
336         head.LAST_AMORTIZATION_ID,
337         nvl(head.CURRENT_PHASE, 'TERM')
338         from
339         LNS_LOAN_HEADERS head
340         where
341         head.loan_id = P_LOAN_ID;
342 
343     CURSOR pay_number_cur(P_LOAN_ID NUMBER, P_PHASE VARCHAR2) IS
344         select max(PAYMENT_NUMBER)
345         from LNS_AMORTIZATION_SCHEDS
346         where LOAN_ID = P_LOAN_ID
347         and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
348         and REAMORTIZATION_AMOUNT is null
349         and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM');
350 
351     CURSOR amortization_cur(P_LOAN_ID NUMBER, P_PHASE VARCHAR2) IS
352         select max(AMORTIZATION_SCHEDULE_ID)
353         from LNS_AMORTIZATION_SCHEDS
354         where LOAN_ID = P_LOAN_ID
355         and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
356         and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM')
357         and PAYMENT_NUMBER =
358             nvl((select max(PAYMENT_NUMBER)
359             from LNS_AMORTIZATION_SCHEDS
360             where LOAN_ID = P_LOAN_ID
361             and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
362             and REAMORTIZATION_AMOUNT is null
363             and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM')), 0);
364 BEGIN
365 
366     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
367 
368     open loan_ver_cur(P_LOAN_ID);
369     fetch loan_ver_cur into
370         l_version_number,
371         l_loan_id,
372         l_loan_number,
373         l_old_last_payment_number,
374         l_old_amortization_id,
375         l_current_phase;
376     close loan_ver_cur;
377 
378     open pay_number_cur(P_LOAN_ID, l_current_phase);
379     fetch pay_number_cur into l_last_payment_number;
380     close pay_number_cur;
381 
382     open amortization_cur(P_LOAN_ID, l_current_phase);
383     fetch amortization_cur into l_amortization_id;
384     close amortization_cur;
385 
386     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Old LAST_PAYMENT_NUMBER: ' || l_old_last_payment_number);
387     LogMessage(FND_LOG.LEVEL_STATEMENT, 'New LAST_PAYMENT_NUMBER: ' || l_last_payment_number);
388     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Old LAST_AMORTIZATION_ID: ' || l_old_amortization_id);
389     LogMessage(FND_LOG.LEVEL_STATEMENT, 'New LAST_AMORTIZATION_ID: ' || l_amortization_id);
390 
391     /* updating loan header table */
392     l_loan_header_rec.loan_id := l_loan_id;
393 
394     if l_last_payment_number is null then
395         l_loan_header_rec.LAST_PAYMENT_NUMBER := FND_API.G_MISS_NUM;
396     else
397         l_loan_header_rec.LAST_PAYMENT_NUMBER := l_last_payment_number;
398     end if;
399 
400     if l_amortization_id is null then
401         l_loan_header_rec.LAST_AMORTIZATION_ID := FND_API.G_MISS_NUM;
402     else
403         l_loan_header_rec.LAST_AMORTIZATION_ID := l_amortization_id;
404     end if;
405 
406     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header...');
407 
408     LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
409                                     P_LOAN_HEADER_REC => l_loan_header_rec,
410                                     P_INIT_MSG_LIST => FND_API.G_FALSE,
411                                     X_RETURN_STATUS => l_return_status,
412                                     X_MSG_COUNT => l_msg_count,
413                                     X_MSG_DATA => l_msg_data);
414 
415     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
416 
417     IF l_return_status = 'S' THEN
418         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
419     ELSE
420         FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
421         FND_MSG_PUB.Add;
422         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
423         RAISE FND_API.G_EXC_ERROR;
424     END IF;
425 
426     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
427 
428 END;
429 
430 
431 
432 /*========================================================================
433  | PUBLIC PROCEDURE PROCESS_PAID_LOANS
434  |
435  | DESCRIPTION
436  |      This procedure sets still active paid off loans to status PAIDOFF
437  |
438  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
439  |      None
440  |
441  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
442  |      LogMessage
443  |
444  | PARAMETERS
445  |      P_API_VERSION		IN          Standard in parameter
446  |      P_INIT_MSG_LIST		IN          Standard in parameter
447  |      P_COMMIT			IN          Standard in parameter
448  |      P_VALIDATION_LEVEL	IN          Standard in parameter
449  |      P_LOAN_ID           IN          Loan
450  |      P_PAYOFF_DATE       IN          Pay off date
451  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
452  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
453  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
454 
455  | KNOWN ISSUES
456  |      None
457  |
458  | NOTES
459  |      Any interesting aspect of the code in the package body which needs
460  |      to be stated.
461  |
462  | MODIFICATION HISTORY
463  | Date                  Author            Description of Changes
464  | 01-01-2004            scherkas          Created
465  |
466  *=======================================================================*/
467 PROCEDURE PROCESS_PAID_LOANS(
468     P_API_VERSION            IN          NUMBER,
469     P_INIT_MSG_LIST          IN          VARCHAR2,
470     P_COMMIT                 IN          VARCHAR2,
471     P_VALIDATION_LEVEL       IN          NUMBER,
472     P_LOAN_ID                IN          NUMBER,
473     P_PAYOFF_DATE            IN          DATE,
474     X_RETURN_STATUS          OUT NOCOPY  VARCHAR2,
475     X_MSG_COUNT              OUT NOCOPY  NUMBER,
476     X_MSG_DATA               OUT NOCOPY  VARCHAR2)
477 IS
478 
479 /*-----------------------------------------------------------------------+
480  | Local Variable Declarations and initializations                       |
481  +-----------------------------------------------------------------------*/
482 
483     l_api_name                      CONSTANT VARCHAR2(30) := 'PROCESS_PAID_LOANS';
484     l_api_version                   CONSTANT NUMBER := 1.0;
485     l_return_status                 VARCHAR2(1);
486     l_msg_count                     NUMBER;
487     l_msg_data                      VARCHAR2(32767);
488     l_version_number                number;
489     l_loan_id                       number;
490     l_Count                         number;
491     l_loan_number                   varchar2(60);
492     l_remaining_amount              number;
493     l_end                           date;
494     l_start                         date;
495 
496     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
497 
498 /*-----------------------------------------------------------------------+
499  | Cursor Declarations                                                   |
500  +-----------------------------------------------------------------------*/
501 
502     /* query paid off loans that are still active */
503     CURSOR paidoff_loans_cur(P_LOAN_ID number) IS
504         select
505         head.OBJECT_VERSION_NUMBER,
506         head.loan_id,
507         head.loan_number
508         from
509         LNS_PAY_SUM_V sum,
510         LNS_LOAN_HEADERS head
511         where
512         head.loan_id = nvl(P_LOAN_ID, head.loan_id) and
513         head.loan_id = sum.loan_id and
514         head.loan_status in ('ACTIVE', 'DEFAULT', 'DELINQUENT') and
515         head.last_payment_number is not null and
516         head.last_amortization_id is not null and
517         sum.total_principal_balance <= 0 and
518         (head.REQUESTED_AMOUNT + nvl(head.ADD_REQUESTED_AMOUNT, 0)) = sum.TOTAL_PRIN_PAID_TODATE;
519 
520     CURSOR validate_loan_cur(P_LOAN_ID number) IS
521         select nvl(sum(total_remaining_amount),0)
522         from LNS_AM_SCHEDS_V
523         where loan_id = P_LOAN_ID and
524               reversed_code = 'N';
525 
526 BEGIN
527 
528     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
529     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing paid off loans...');
530     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input parameters:');
531     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ID: ' || P_LOAN_ID);
532     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Payoff date: ' || P_PAYOFF_DATE);
533     -- Standard Start of API savepoint
534     SAVEPOINT PROCESS_PAID_LOANS;
535 
536     -- Initialize message list IF p_init_msg_list is set to TRUE.
537     IF FND_API.to_Boolean(p_init_msg_list) THEN
538         FND_MSG_PUB.initialize;
539     END IF;
540 
541     -- Initialize API return status to SUCCESS
542     x_return_status := FND_API.G_RET_STS_SUCCESS;
543 
544     --
545     -- Api body
546     -- ----------------------------------------------------------------
547 
548     /* init variables */
549     l_Count := 0;
550 
551     l_start := sysdate;
552     open paidoff_loans_cur(P_LOAN_ID);
553 
554     LOOP
555 
556         fetch paidoff_loans_cur into
557             l_version_number,
558             l_loan_id,
559             l_loan_number;
560         exit when paidoff_loans_cur%NOTFOUND;
561 
562         l_Count := l_Count + 1;
563         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Processing loan ' || l_loan_number || ' id ' || l_loan_id);
564 
565         BEGIN
566 
567             open validate_loan_cur(l_loan_id);
568             fetch validate_loan_cur into l_remaining_amount;
569             close validate_loan_cur;
570 
571             if l_remaining_amount = 0  then
572 
573                 LNS_FUNDING_PUB.VALIDATE_DISB_FOR_PAYOFF(
574                     P_API_VERSION		    => 1.0,
575                     P_INIT_MSG_LIST		    => FND_API.G_TRUE,
576                     P_COMMIT			    => FND_API.G_FALSE,
577                     P_VALIDATION_LEVEL	    => FND_API.G_VALID_LEVEL_FULL,
578                     P_LOAN_ID               => l_loan_id,
579                     X_RETURN_STATUS		    => l_return_status,
580                     X_MSG_COUNT			    => l_msg_count,
581                     X_MSG_DATA	    	    => l_msg_data);
582 
583                 IF l_return_status <> 'S' THEN
584                     RAISE FND_API.G_EXC_ERROR;
585                 END IF;
586 
587                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_fee_assignments...');
588                 update lns_fee_assignments
589                 set end_date_active = P_PAYOFF_DATE
590                 where loan_id = l_loan_id
591                 and (end_date_active is null OR end_date_active > P_PAYOFF_DATE);
592                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'lns_fee_assignments is updated');
593 
594                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_fee_schedules...');
595                 update lns_fee_schedules
596                 set billed_flag = 'Y'
597                 where loan_id = l_loan_id
598                 and active_flag = 'Y'
599                 and billed_flag = 'N'
600                 and object_version_number = object_version_number + 1;
601                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'lns_fee_schedules is updated');
602 
603                 /* updating loan header table */
604                 l_loan_header_rec.loan_id := l_loan_id;
605                 l_loan_header_rec.LOAN_STATUS := 'PAIDOFF';
606                 l_loan_header_rec.SECONDARY_STATUS := FND_API.G_MISS_CHAR;
607 
608                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
609                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_STATUS: ' || l_loan_header_rec.LOAN_STATUS);
610                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Secondary status: ' || l_loan_header_rec.SECONDARY_STATUS);
611 
612                 LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
613                                                 P_LOAN_HEADER_REC => l_loan_header_rec,
614                                                 P_INIT_MSG_LIST => FND_API.G_FALSE,
615                                                 X_RETURN_STATUS => l_return_status,
616                                                 X_MSG_COUNT => l_msg_count,
617                                                 X_MSG_DATA => l_msg_data);
618 
619                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
620 
621                 IF l_return_status = 'S' THEN
622                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
623                 ELSE
624                     FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
625                     FND_MSG_PUB.Add;
626                     LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
627                     RAISE FND_API.G_EXC_ERROR;
628                 END IF;
629 
630                 if P_COMMIT = FND_API.G_TRUE then
631                     COMMIT WORK;
632                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
633                 end if;
634 
635                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully paid off loan ' || l_loan_number || ' id ' || l_loan_id);
636 
637             else
638 
639                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Cannot pay off loan ' || l_loan_number || '. Outstanding amount is ' || l_remaining_amount);
640 
641             end if;
642 
643         EXCEPTION
644             WHEN OTHERS THEN
645                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to process loan ' || l_loan_number);
646         END;
647 
648     END LOOP;
649 
650     close paidoff_loans_cur;
651 
652     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
653     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || l_Count || ' loan(s)');
654     l_end := sysdate;
655     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Process Paid Loans Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
656 
657     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
658 
659 EXCEPTION
660 
661         WHEN FND_API.G_EXC_ERROR THEN
662              ROLLBACK TO PROCESS_PAID_LOANS;
663              x_return_status := FND_API.G_RET_STS_ERROR;
664              logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
665 
666         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
667              ROLLBACK TO PROCESS_PAID_LOANS;
668              x_return_status := FND_API.G_RET_STS_ERROR;
669              logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
670 
671         WHEN OTHERS THEN
672              ROLLBACK TO PROCESS_PAID_LOANS;
673              x_return_status := FND_API.G_RET_STS_ERROR;
674              logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
675 
676 END;
677 
678 
679 
680 
681 /*========================================================================
682  | PRIVATE PROCEDURE REACTIVATE_PAID_LOANS
683  |
684  | DESCRIPTION
685  |      This procedure sets still active paid off loans to status PAIDOFF
686  |
687  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
688  |      None
689  |
690  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
691  |      LogMessage
692  |
693  | PARAMETERS
694  |      None
695  |
696  | KNOWN ISSUES
697  |      None
698  |
699  | NOTES
700  |      Any interesting aspect of the code in the package body which needs
701  |      to be stated.
702  |
703  | MODIFICATION HISTORY
704  | Date                  Author            Description of Changes
705  | 01-01-2004            scherkas          Created
706  |
707  *=======================================================================*/
708 PROCEDURE REACTIVATE_PAID_LOANS(
709     P_API_VERSION		IN          NUMBER,
710     P_INIT_MSG_LIST		IN          VARCHAR2,
711     P_COMMIT			IN          VARCHAR2,
712     P_VALIDATION_LEVEL	IN          NUMBER,
713     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
714     X_MSG_COUNT			OUT NOCOPY  NUMBER,
715     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
716 IS
717 
718 /*-----------------------------------------------------------------------+
719  | Local Variable Declarations and initializations                       |
720  +-----------------------------------------------------------------------*/
721 
722     l_api_name                      CONSTANT VARCHAR2(30) := 'REACTIVATE_PAID_LOANS';
723     l_api_version                   CONSTANT NUMBER := 1.0;
724     l_return_status                 VARCHAR2(1);
725     l_msg_count                     NUMBER;
726     l_msg_data                      VARCHAR2(32767);
727     l_version_number                number;
728     l_loan_id                       number;
729     l_Count                         number;
730     l_loan_number                   varchar2(60);
731     l_end                           date;
732     l_start                         date;
733 
734     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
735 
736 /*-----------------------------------------------------------------------+
737  | Cursor Declarations                                                   |
738  +-----------------------------------------------------------------------*/
739 
740     /* query paid off loans that must be reactivated */
741     CURSOR paidoff_loans_cur IS
742         select
743         head.OBJECT_VERSION_NUMBER,
744         head.loan_id,
745         head.loan_number
746         from
747         LNS_LOAN_HEADERS head
748         where
749         head.loan_status = 'PAIDOFF' and
750             ((select nvl(sum(total_remaining_amount),0)
751             from LNS_AM_SCHEDS_V
752             where loan_id = head.loan_id and
753                 reversed_code = 'N') > 0);
754 
755 BEGIN
756 
757     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
758     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reactivating paid off loans...');
759 
760     /* init variables */
761     l_Count := 0;
762 
763     l_start := sysdate;
764     open paidoff_loans_cur;
765 
766     LOOP
767 
768         fetch paidoff_loans_cur into
769             l_version_number,
770             l_loan_id,
771             l_loan_number;
772         exit when paidoff_loans_cur%NOTFOUND;
773 
774         l_Count := l_Count + 1;
775         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ' || l_loan_number || ' id ' || l_loan_id);
776 
777         BEGIN
778             /* updating loan header table */
779             l_loan_header_rec.loan_id := l_loan_id;
780             l_loan_header_rec.LOAN_STATUS := 'ACTIVE';
781 
782             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
783             LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_STATUS: ' || l_loan_header_rec.LOAN_STATUS);
784 
785             LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
786                                             P_LOAN_HEADER_REC => l_loan_header_rec,
787                                             P_INIT_MSG_LIST => FND_API.G_FALSE,
788                                             X_RETURN_STATUS => l_return_status,
789                                             X_MSG_COUNT => l_msg_count,
790                                             X_MSG_DATA => l_msg_data);
791 
792             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
793 
794             IF l_return_status = 'S' THEN
795                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully updated LNS_LOAN_HEADERS_ALL');
796             ELSE
797                 FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
798                 FND_MSG_PUB.Add;
799                 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
800                 RAISE FND_API.G_EXC_ERROR;
801             END IF;
802 
803             if P_COMMIT = FND_API.G_TRUE then
804                 COMMIT WORK;
805                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
806             end if;
807 
808             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reactivated loan ' || l_loan_number || ' id ' || l_loan_id);
809 
810         EXCEPTION
811             WHEN OTHERS THEN
812                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to process loan ' || l_loan_number);
813         END;
814 
815     END LOOP;
816 
817     close paidoff_loans_cur;
818 
819     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
820     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || l_Count || ' loan(s)');
821     l_end := sysdate;
822     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reactivate Loans Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
823 
824     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
825 
826 EXCEPTION
827     WHEN OTHERS THEN
828         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to reactivate paid off loans');
829 
830 END;
831 
832 
833 
834 
835 /*========================================================================
836  | PRIVATE PROCEDURE GET_RECEIVABLES_FUND_DESC
837  |
838  | DESCRIPTION
839  |      This procedure gets receivable fund description for appending to AR line description
840  |
841  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
842  |      None
843  |
844  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
845  |      LogMessage
846  |
847  | PARAMETERS
848  |      None
849  |
850  | KNOWN ISSUES
851  |      None
852  |
853  | NOTES
854  |      Any interesting aspect of the code in the package body which needs
855  |      to be stated.
856  |
857  | MODIFICATION HISTORY
858  | Date                  Author            Description of Changes
859  | 01-01-2004            scherkas          Created
860  |
861  *=======================================================================*/
862 FUNCTION GET_RECEIVABLES_FUND_DESC(P_CC_ID number) RETURN VARCHAR2
863 IS
864 
865 /*-----------------------------------------------------------------------+
866  | Local Variable Declarations and initializations                       |
867  +-----------------------------------------------------------------------*/
868 
869     l_api_name                      CONSTANT VARCHAR2(30) := 'GET_RECEIVABLES_FUND_DESC';
870     l_description                   varchar2(240);
871 
872 /*-----------------------------------------------------------------------+
873  | Cursor Declarations                                                   |
874  +-----------------------------------------------------------------------*/
875 
876     /* query receivable fund description */
877     CURSOR rec_fund_desc_cur(P_ORG_ID number, P_CC_ID number) IS
878         SELECT
879             FVL.DESCRIPTION
880         FROM LNS_SYSTEM_OPTIONS LSO
881             ,gl_sets_of_books SB
882             ,FND_ID_FLEX_STRUCTURES_VL STR
883             ,FND_ID_FLEX_SEGMENTS_VL SEG
884             ,fnd_flex_value_sets FVS
885             ,FND_FLEX_VALUES_VL FVL
886             ,FND_SEGMENT_ATTRIBUTE_VALUES SAV
887             ,GL_CODE_COMBINATIONS GL
888         WHERE STR.APPLICATION_ID = 101  -- GENERAL LEDGER
889         and lso.set_of_books_id = sb.set_of_books_id
890         and sb.chart_of_accounts_id = STR.id_flex_num
891         and gl.chart_of_accounts_id = sb.chart_of_accounts_id
892         and SEG.FLEX_VALUE_SET_ID = FVS.FLEX_VALUE_SET_ID
893         and FVS.FLEX_VALUE_SET_ID = FVL.FLEX_VALUE_SET_ID
894         and str.id_flex_num = SEG.ID_FLEX_NUM
895         and STR.id_flex_num = sav.id_flex_num
896         and STR.ID_FLEX_CODE='GL#'
897         and seg.id_flex_code ='GL#'
898         and STR.enabled_flag = 'Y'
899         and LSO.org_id = P_ORG_ID
900         and gl.code_combination_id = P_CC_ID
901         and fvl.flex_value = (decode(sav.application_column_name,
902             'SEGMENT1', GL.segment1,
903             'SEGMENT2', GL.segment2,
904             'SEGMENT3', GL.segment3,
905             'SEGMENT4', GL.segment4,
906             'SEGMENT5', GL.segment5))
907         and (('' IS NULL) OR (structured_hierarchy_level IN
908                                             (SELECT h.hierarchy_id
909                                                 FROM fnd_flex_hierarchies_vl h
910                                             WHERE h.flex_value_set_id = FVL.flex_value_set_id
911                                                 AND h.hierarchy_name like '')))
912         and exists
913         ( SELECT 1
914         FROM FND_SEGMENT_ATTRIBUTE_TYPES T
915         WHERE T.APPLICATION_ID = SAV.APPLICATION_ID
916             AND T.ID_FLEX_CODE = SAV.ID_FLEX_CODE
917             AND T.SEGMENT_ATTRIBUTE_TYPE = SAV.SEGMENT_ATTRIBUTE_TYPE
918             AND GLOBAL_FLAG = 'N'
919             and SAV.ID_FLEX_CODE='GL#'
920             and SAV.APPLICATION_ID=101
921             and sav.segment_attribute_type = 'GL_BALANCING'
922             and attribute_value = 'Y'
923         );
924 
925 
926 BEGIN
927 
928     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
929 
930     l_description := null;
931 
932     open rec_fund_desc_cur(g_org_id, P_CC_ID);
933     fetch rec_fund_desc_cur into l_description;
934     close rec_fund_desc_cur;
935 
936     if l_description is not null then
937         l_description := ' - ' || l_description;
938     end if;
939 
940     return l_description;
941 
942     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
943 
944 EXCEPTION
945     WHEN OTHERS THEN
946         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to get receivable fund description');
947         return l_description;
948 
949 END;
950 
951 
952 
953 
954 /*========================================================================
955  | PRIVATE PROCEDURE CREATE_AR_INVOICES
956  |
957  | DESCRIPTION
958  |      This procedure creates AR invoices.
959  |
960  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
961  |      BILL_SINGLE_LOAN
962  |      CREATE_SINGLE_OFFCYCLE_BILL
963  |
964  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
965  |      LogMessage
966  |
967  | PARAMETERS
968  |      P_LOAN_REC  IN OUT NOCOPY   Loan record
969  |      P_LINES_TBL  IN OUT NOCOPY  Lines table
970  |
971  | KNOWN ISSUES
972  |      None
973  |
974  | NOTES
975  |      Any interesting aspect of the code in the package body which needs
976  |      to be stated.
977  |
978  | MODIFICATION HISTORY
979  | Date                  Author            Description of Changes
980  | 03-31-2006            karamach          Revert the billing_date = due_date change in trx header since invoice api throws AR_TAPI_BFB_BILLING_DATE_INV error if billing_date is passed when bfb is disabled based on ar_bfb_utils_pvt.is_valid_billing_date
981  | 03-28-2006            karamach          Pass the taxable_flag 'N' in trx line and billing_date = due_date in trx header for bug5124908
982  | 01-01-2004            scherkas          Created
983  |
984  *=======================================================================*/
985 PROCEDURE CREATE_AR_INVOICES(P_LOAN_REC  IN OUT NOCOPY  LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC,
986                              P_LINES_TBL  IN OUT NOCOPY  LNS_BILLING_BATCH_PUB.BILL_LINES_TBL)
987 IS
988 
989 /*-----------------------------------------------------------------------+
990  | Local Variable Declarations and initializations                       |
991  +-----------------------------------------------------------------------*/
992 
993     l_api_name                      CONSTANT VARCHAR2(30) := 'CREATE_AR_INVOICES';
994     l_return_status                 VARCHAR2(1);
995     l_msg_count                     NUMBER;
996     l_msg_data                      VARCHAR2(32767);
997     l_Count1                        number;
998     l_Count2                        number;
999     l_Count3                        number;
1000     l_Count4                        number;
1001     l_Count5                        number;
1002     l_Count6                        number;
1003     l_customer_trx_id               number;
1004     l_trx_number                    VARCHAR2(20);
1005     l_customer_trx_line_id          number;
1006     l_payment_schedule_id           number;
1007     l_due_date                      date;
1008     l_batch_id                      number;
1009     l_line_type                     varchar2(30);
1010     l_amount                        number;
1011     l_id                            number;
1012     l_next_line                     varchar2(5);
1013     l_generate_trx_number           varchar2(1);
1014     l_COPY_DOC_NUMBER_FLAG          varchar2(1);
1015     l_AUTO_TRX_NUMBERING_FLAG       varchar2(1);
1016     l_search_str                    varchar2(1);
1017     l_exit_loop                     varchar2(1);
1018 	l_start_pos		                number;
1019 	l_end_pos		                number;
1020     l_populate_dist                 varchar2(1);
1021     l_cc_id                         number;
1022     l_percent                       number;
1023     l_payment_order                 number;
1024     l_trx_header_id                 number;
1025     l_trx_line_id                   number;
1026     l_error_message                 varchar2(2000);
1027     l_invalid_value                 varchar2(2000);
1028     l_principal_trx_id              number;
1029     l_interest_trx_id               number;
1030     l_fee_trx_id                    number;
1031     l_prin_trx_type                 number;
1032     l_USSGL_TRANSACTION_CODE        VARCHAR2(30);
1033     l_line_desc                     VARCHAR2(240);
1034     l_orig_line_amount              number;
1035     l_split_flag                    varchar2(1);
1036     l_running_sum                   number;
1037     l_ar_error_counter              number;
1038     l_fee_header                    number;
1039     l_fee_line_num                  number;
1040     l_site_use_id                   number;
1041     l_amortization_line_id          number;
1042     l_precision                     number;
1043     l_ext_precision                 number;
1044     l_min_acct_unit                 number;
1045     l_org_status                    varchar2(1);
1046     l_org_id                        number;
1047     l_start                         date;
1048     l_end                           date;
1049     l_phase                         varchar2(10);
1050     l_int_header                    number;
1051     l_int_line_num                  number;
1052     l_bill_0_prin_inv               varchar2(1);
1053     l_inv_comment                   varchar2(240);
1054     l_is_disable_bill		        varchar2(1);
1055     l_feeRec_exists		            varchar2(1);
1056     l_disb_hdr_id			        NUMBER;
1057     l_trx_date                      date;
1058     l_term_id                       number;
1059     l_ar_inv_created                boolean;
1060     l_PRIMARY_SALESREP_ID           number;
1061 
1062     l_batch_source_rec              ar_invoice_api_pub.batch_source_rec_type;
1063     l_trx_header_tbl                ar_invoice_api_pub.trx_header_tbl_type;
1064     l_trx_lines_tbl                 ar_invoice_api_pub.trx_line_tbl_type;
1065     l_trx_dist_tbl                  ar_invoice_api_pub.trx_dist_tbl_type;
1066     l_trx_salescredits_tbl          ar_invoice_api_pub.trx_salescredits_tbl_type;
1067     l_new_lines_tbl                 LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
1068 
1069 /*-----------------------------------------------------------------------+
1070  | Cursor Declarations                                                   |
1071  +-----------------------------------------------------------------------*/
1072 
1073     /* query of batch source attributes */
1074     CURSOR gen_trx_num_cur(P_SOURCE_ID number) IS
1075         select COPY_DOC_NUMBER_FLAG,
1076                AUTO_TRX_NUMBERING_FLAG
1077         FROM RA_BATCH_SOURCES
1078         where BATCH_SOURCE_ID = P_SOURCE_ID;
1079 
1080     /* generate new trx number */
1081     CURSOR new_trx_num_cur IS
1082         select LNS_TRX_NUMBER_S.NEXTVAL
1083         from dual;
1084 
1085     /* query of meaning of PAYMENT_APPLICATION_TYPE */
1086     CURSOR meaning_cur(P_LOOKUP_CODE varchar2) IS
1087         select meaning
1088         from LNS_LOOKUPS
1089         where lookup_type = 'PAYMENT_APPLICATION_TYPE' and
1090               lookup_code = P_LOOKUP_CODE;
1091 
1092     /* query of distributions for principal dr */
1093     CURSOR prin_dr_dist_cur(P_LOAN_ID number) IS
1094         select CODE_COMBINATION_ID,
1095                 DISTRIBUTION_PERCENT,
1096                 USSGL_TRANSACTION_CODE
1097         from lns_distributions
1098         where LOAN_ID = P_LOAN_ID and
1099             account_type = 'DR' and
1100             account_name = 'PRINCIPAL_RECEIVABLE' and
1101             line_type = 'PRIN';
1102 
1103     /* query of distributions for interest dr */
1104     CURSOR int_dr_dist_cur(P_LOAN_ID number) IS
1105         select CODE_COMBINATION_ID,
1106                 DISTRIBUTION_PERCENT,
1107                 USSGL_TRANSACTION_CODE
1108         from lns_distributions
1109         where LOAN_ID = P_LOAN_ID and
1110             account_type = 'DR' and
1111             account_name = 'INTEREST_RECEIVABLE' and
1112             line_type = 'INT' and
1113             activity is null;
1114 
1115     /* query of distributions for fee dr */
1116     CURSOR cur_fee_dr_dist(c_loan_id NUMBER, c_fee_id NUMBER, c_disb_hdr_id NUMBER) IS
1117         select CODE_COMBINATION_ID,
1118                 DISTRIBUTION_PERCENT,
1119                 USSGL_TRANSACTION_CODE
1120         from lns_distributions
1121         where LOAN_ID = c_loan_id and
1122 	    fee_id = c_fee_id and
1123 	    -- The below code criteria retrieves though the disb_header_id is null for fees, which are not disbFees
1124 	    nvl(disb_header_id, -1) = nvl(c_disb_hdr_id, -1) and
1125             account_type = 'DR' and
1126             account_name = 'FEE_RECEIVABLE' and
1127             line_type = 'FEE';
1128 
1129      /* query of distributions for fee dr  based on loan
1130          This is used for existed disbFees(before fix bug#9054623), wihch doesn't contain FEE_RECEIVABLE for all fees.
1131 	 These existed disbFees contains one FEE_RECEIVABLE a/c for all fees per loan  		*/
1132     CURSOR fee_dr_dist_cur(P_LOAN_ID number) IS
1133         select CODE_COMBINATION_ID,
1134                 DISTRIBUTION_PERCENT,
1135                 USSGL_TRANSACTION_CODE
1136         from lns_distributions
1137         where LOAN_ID = P_LOAN_ID and
1138             account_type = 'DR' and
1139             account_name = 'FEE_RECEIVABLE' and
1140             line_type = 'FEE';
1141 
1142     /* query of distributions for principal cr */
1143     CURSOR prin_cr_dist_cur(P_LOAN_ID number, P_DATE date) IS
1144         select dist.CODE_COMBINATION_ID,
1145                 sum(dist.DISTRIBUTION_PERCENT),
1146                 dist.USSGL_TRANSACTION_CODE
1147         from lns_distributions dist
1148         where dist.LOAN_ID = P_LOAN_ID and
1149             dist.account_type = 'CR' and
1150             dist.account_name = 'LOAN_RECEIVABLE' and
1151             dist.line_type = 'PRIN' and
1152             nvl(dist.loan_line_id, -1) =
1153                 nvl((select max(loan_line_id)
1154                 from lns_loan_lines
1155                 where status = 'APPROVED'
1156                 and LOAN_ID = P_LOAN_ID
1157                 and original_flag = 'N'
1158                 and adjustment_date <= P_DATE), -1)
1159         group by dist.CODE_COMBINATION_ID, dist.USSGL_TRANSACTION_CODE;
1160 
1161     /* query of distributions for interest cr */
1162     CURSOR int_cr_dist_cur(P_LOAN_ID number) IS
1163         select CODE_COMBINATION_ID,
1164                 DISTRIBUTION_PERCENT,
1165                 USSGL_TRANSACTION_CODE
1166         from lns_distributions
1167         where LOAN_ID = P_LOAN_ID and
1168             account_type = 'CR' and
1169             account_name = 'INTEREST_INCOME' and
1170             line_type = 'INT' and
1171             activity is null;
1172 
1173     /* query of distributions for fee cr */
1174     CURSOR fee_cr_dist_cur(P_LOAN_ID number, P_FEE_ID number, C_DISB_HDR_ID number) IS
1175         select CODE_COMBINATION_ID,
1176                 DISTRIBUTION_PERCENT,
1177                 USSGL_TRANSACTION_CODE
1178         from lns_distributions
1179         where LOAN_ID = P_LOAN_ID and
1180             account_type = 'CR' and
1181             account_name = 'FEE_INCOME' and
1182             line_type = 'FEE' and
1183             fee_id = P_FEE_ID and
1184 	    nvl(disb_header_id, -1) = nvl(C_DISB_HDR_ID, -1);
1185 
1186     /* query of AR errors */
1187     CURSOR ar_invoice_err_cur IS
1188         SELECT trx_header_id, trx_line_id, error_message, invalid_value
1189         from ar_trx_errors_gt;
1190 
1191     /* query invoice details */
1192     CURSOR ar_invoices_cur(P_BATCH_ID number) IS
1193         select
1194             trx.customer_trx_id,
1195             trx.trx_number,
1196             lines.customer_trx_line_id,
1197             psa.payment_schedule_id,
1198             psa.due_date,
1199             lines.extended_amount,
1200             lines.INTERFACE_LINE_ATTRIBUTE5,
1201             lines.INTERFACE_LINE_ATTRIBUTE6
1202         from RA_CUSTOMER_TRX trx,
1203             RA_CUSTOMER_TRX_LINES lines,
1204             ar_payment_schedules_all psa
1205         where
1206             trx.batch_id = P_BATCH_ID
1207             and trx.customer_trx_id = lines.customer_trx_id
1208             and trx.customer_trx_id = psa.customer_trx_id(+)    -- outer join is for case when invoice is created incomplete
1209             and lines.line_type = 'LINE'
1210         ORDER BY lines.customer_trx_line_id;
1211 
1212     /* query trx_type_id */
1213     CURSOR trx_type_cur(P_LOAN_ID number) IS
1214         select REFERENCE_TYPE_ID
1215         from LNS_LOAN_HEADERS
1216         where loan_id = P_LOAN_ID;
1217 
1218     /* query for site_use_id */
1219     CURSOR site_use_id_cur(P_SITE_ID number) IS
1220         select site_use_id, PRIMARY_SALESREP_ID
1221         from hz_cust_site_uses
1222         where cust_acct_site_id = P_SITE_ID
1223         and site_use_code = 'BILL_TO'
1224         and status = 'A';
1225 
1226    CURSOR cur_get_disbHdr_id(c_fee_schd_id number) IS
1227        SELECT disb_header_id
1228        from lns_fee_schedules
1229        where fee_schedule_id =c_fee_schd_id;
1230 
1231 BEGIN
1232     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
1233 
1234     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Checking the Disable_billing_flag in '||l_api_name);
1235     l_is_disable_bill := IS_BILLING_DISABLED(P_LOAN_REC.LOAN_ID);
1236     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_is_disable_bill is '||l_is_disable_bill);
1237     IF l_is_disable_bill = 'Y' THEN
1238     	    --  LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: BILLING is Disabled for the loan '||p_loan_rec.loan_number);
1239              FND_MESSAGE.SET_NAME('LNS', 'LNS_BILLING_DISABLED');
1240 	     FND_MESSAGE.SET_TOKEN('LOAN_NUMBER', p_loan_rec.loan_number);
1241              FND_MSG_PUB.Add;
1242              LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1243              RAISE FND_API.G_EXC_ERROR;
1244     END IF;
1245 
1246     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Preparing to call AR invoice api...');
1247 
1248 
1249     /* init variables */
1250     l_generate_trx_number  := 'Y';
1251     l_COPY_DOC_NUMBER_FLAG := 'N';
1252     l_AUTO_TRX_NUMBERING_FLAG := 'N';
1253     l_search_str := '_';
1254 	l_start_pos := 1;
1255 	l_end_pos := 1;
1256 
1257     l_batch_source_rec.batch_source_id := g_batch_source_id;
1258 
1259     /* check if we need to generate trx_number */
1260     open gen_trx_num_cur(l_batch_source_rec.batch_source_id);
1261     fetch gen_trx_num_cur into l_COPY_DOC_NUMBER_FLAG, l_AUTO_TRX_NUMBERING_FLAG;
1262     close gen_trx_num_cur;
1263 
1264     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_COPY_DOC_NUMBER_FLAG: ' || l_COPY_DOC_NUMBER_FLAG);
1265     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_AUTO_TRX_NUMBERING_FLAG: ' || l_AUTO_TRX_NUMBERING_FLAG);
1266 
1267     if l_COPY_DOC_NUMBER_FLAG = 'Y' or l_AUTO_TRX_NUMBERING_FLAG = 'Y' then
1268         l_generate_trx_number := 'N';
1269     end if;
1270 
1271     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_generate_trx_number: ' || l_generate_trx_number);
1272 
1273     /* query trx_type_id */
1274     open trx_type_cur(P_LOAN_REC.LOAN_ID);
1275     fetch trx_type_cur into l_prin_trx_type;
1276     close trx_type_cur;
1277 
1278     LogMessage(FND_LOG.LEVEL_STATEMENT, 'prin_trx_type: ' || l_prin_trx_type);
1279 
1280     /* query for site_use_id */
1281     open site_use_id_cur(P_LOAN_REC.BILL_TO_ADDRESS_ID);
1282     fetch site_use_id_cur into l_site_use_id, l_PRIMARY_SALESREP_ID;
1283     close site_use_id_cur;
1284 
1285     /* check exchange rate: if its User - pass exchange rate; otherwise - pass null */
1286     if P_LOAN_REC.EXCHANGE_RATE_TYPE is null or
1287        (P_LOAN_REC.EXCHANGE_RATE_TYPE is not null and P_LOAN_REC.EXCHANGE_RATE_TYPE <> 'User') then
1288 
1289         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Setting exchange rate = null');
1290         P_LOAN_REC.EXCHANGE_RATE := null;
1291 
1292     end if;
1293 
1294     -- setting phase for invoice reference
1295     if P_LOAN_REC.CURRENT_PHASE = 'OPEN' then
1296         l_phase := 'Disb';
1297     else
1298         l_phase := 'Term';
1299     end if;
1300 
1301     -- fix for bug 5840180: get LNS_CREATE_ZERO_PRIN_INV profile value to see if we need to bill 0 amount principal invoices
1302     l_bill_0_prin_inv := NVL(FND_PROFILE.VALUE('LNS_CREATE_ZERO_PRIN_INV'), 'N');
1303     LogMessage(FND_LOG.LEVEL_STATEMENT, 'The profile LNS_CREATE_ZERO_PRIN_INV value is : '||l_bill_0_prin_inv);
1304 
1305     select LNS_AMORTIZATION_SCHEDS_S.NEXTVAL into P_LOAN_REC.NEXT_AMORTIZATION_ID from dual;
1306 
1307     l_Count1 := 0;  -- lines counter
1308     l_Count2 := 0;  -- distributions counter
1309     l_Count3 := 0;  -- header counter
1310     l_Count6 := 0;  -- returned lines table
1311     l_fee_header := -1;
1312     l_int_header := -1;
1313     l_exit_loop := 'N';
1314     l_end_pos := instr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_search_str, l_start_pos, 1);
1315     l_inv_comment := substr(P_LOAN_REC.LOAN_DESCRIPTION, 1, 240);
1316 
1317     LNS_BILLING_UTIL_PUB.GET_TRX_DATE(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
1318                                       P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
1319                                       X_TRX_DATE => l_trx_date,
1320                                       X_RA_TERM_ID => l_term_id);
1321 
1322 	while true loop
1323 
1324 		if l_end_pos <> 0 then
1325 			l_next_line := substr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_start_pos, l_end_pos-l_start_pos);
1326 		else
1327 			l_next_line := substr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_start_pos,
1328                                   LENGTH(P_LOAN_REC.PAYMENT_APPLICATION_ORDER)-l_start_pos+1);
1329 			l_exit_loop := 'Y';
1330 		end if;
1331 
1332         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_next_line: ' || l_next_line);
1333 
1334         FOR l_Count4 IN 1..P_LINES_TBL.COUNT LOOP
1335 
1336             if P_LINES_TBL(l_Count4).LINE_TYPE = l_next_line and
1337                P_LINES_TBL(l_Count4).LINE_AMOUNT is not null and
1338                P_LINES_TBL(l_Count4).PAYMENT_ORDER is null and
1339 	           (P_LINES_TBL(l_Count4).LINE_AMOUNT <> 0 or
1340                (P_LINES_TBL(l_Count4).LINE_AMOUNT = 0 and P_LINES_TBL(l_Count4).LINE_TYPE = 'PRIN' and l_bill_0_prin_inv = 'Y')) --fix for bug 5840180
1341 
1342             then
1343 
1344                 l_Count1 := l_Count1 + 1;   -- lines
1345 
1346                 if ((g_multiple_lines = 'Y' and l_Count3 = 0) or
1347 --                   (g_multiple_lines = 'N' and (l_next_line = 'PRIN' or l_next_line = 'INT')) or
1348                    (g_multiple_lines = 'N' and l_next_line = 'PRIN') or
1349                    (g_multiple_lines = 'N' and l_next_line = 'INT' and l_int_header = -1) or
1350                    (g_multiple_lines = 'N' and l_next_line = 'FEE' and l_fee_header = -1))
1351                 then
1352                     l_Count3 := l_Count3 + 1;   -- header
1353                 end if;
1354 
1355                 /* populate line description */
1356                 open meaning_cur(l_next_line);
1357                 fetch meaning_cur into l_line_desc;
1358                 close meaning_cur;
1359 
1360                 if P_LINES_TBL(l_Count4).LINE_DESC is not null then
1361                     l_trx_lines_tbl(l_Count1).description := l_line_desc || ' - ' || P_LINES_TBL(l_Count4).LINE_DESC;
1362                 else
1363                     l_trx_lines_tbl(l_Count1).description := l_line_desc;
1364                 end if;
1365 
1366                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Line ' || l_Count1 || ' - ' || l_trx_lines_tbl(l_Count1).description);
1367 
1368                 if g_multiple_lines = 'Y' then
1369 
1370                     if l_Count3 = 1 then
1371 
1372                         if l_generate_trx_number = 'Y' then
1373 /*
1374                             -- generate new id for new AR invoice_number
1375                             open new_trx_num_cur;
1376                             fetch new_trx_num_cur into l_id;
1377                             close new_trx_num_cur;
1378 
1379                             l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1380 */
1381                             l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1382 
1383                         end if;
1384 
1385                         /* populate header info */
1386                         l_trx_header_tbl(l_Count3).comments := l_inv_comment;
1387                         l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1388                         l_trx_header_tbl(l_Count3).trx_date := l_trx_date;
1389                         --l_trx_header_tbl(l_Count3).trx_date := trunc(P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1390                         --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1391                         l_trx_header_tbl(l_Count3).gl_date := l_trx_header_tbl(l_Count3).trx_date + g_day_togl_after_dd;
1392                         l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1393                         l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1394                         l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1395                         l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1396                         l_trx_header_tbl(l_Count3).cust_trx_type_id := nvl(l_prin_trx_type, g_trx_type_id);
1397                         l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1398                         l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1399                         l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1400                         l_trx_header_tbl(l_Count3).primary_salesrep_id := l_PRIMARY_SALESREP_ID;
1401                         l_trx_header_tbl(l_Count3).term_id := l_term_id; --5; --always IMMEDIATE
1402                         l_trx_header_tbl(l_Count3).finance_charges := 'N';
1403                         l_trx_header_tbl(l_Count3).status_trx := 'OP';
1404                         l_trx_header_tbl(l_Count3).printing_option := null;  -- fix for bug 7714411
1405                         l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1406                             l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1407                         l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1408                         l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1409 
1410                         if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1411                             l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1412                         end if;
1413 
1414                     end if;
1415 
1416                     l_trx_lines_tbl(l_Count1).line_number := l_Count1;
1417                     l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1418 
1419                 else
1420 
1421 --                    if l_next_line = 'PRIN' or l_next_line = 'INT' then
1422                     if l_next_line = 'PRIN' then
1423 
1424                         if l_generate_trx_number = 'Y' then
1425     /*
1426                             -- generate new id for new AR invoice_number
1427                             open new_trx_num_cur;
1428                             fetch new_trx_num_cur into l_id;
1429                             close new_trx_num_cur;
1430 
1431                             l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1432     */
1433                             l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1434 
1435                         end if;
1436 
1437                         /* populate rest of header info */
1438                         l_trx_header_tbl(l_Count3).comments := l_inv_comment;
1439                         l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1440                         l_trx_header_tbl(l_Count3).trx_date := l_trx_date;
1441                         --l_trx_header_tbl(l_Count3).trx_date := trunc(P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1442                         --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1443                         l_trx_header_tbl(l_Count3).gl_date := l_trx_header_tbl(l_Count3).trx_date + g_day_togl_after_dd;
1444                         l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1445                         l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1446                         l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1447                         l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1448                         l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1449                         l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1450                         l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1451                         l_trx_header_tbl(l_Count3).primary_salesrep_id := l_PRIMARY_SALESREP_ID;
1452                         l_trx_header_tbl(l_Count3).term_id := l_term_id; --5; --always IMMEDIATE
1453                         l_trx_header_tbl(l_Count3).finance_charges := 'N';
1454                         l_trx_header_tbl(l_Count3).status_trx := 'OP';
1455                         l_trx_header_tbl(l_Count3).printing_option := null;  -- fix for bug 7714411
1456                         l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1457                             l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1458                         l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1459                         l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1460 
1461                         if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1462                             l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1463                         end if;
1464 
1465                         -- set trx_type_id
1466                         l_trx_header_tbl(l_Count3).cust_trx_type_id := nvl(l_prin_trx_type, g_trx_type_id);
1467                         l_trx_lines_tbl(l_Count1).line_number := 1;
1468                         l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1469 
1470                     elsif l_next_line = 'INT' then
1471 
1472                         if l_int_header = -1 then
1473 
1474                             if l_generate_trx_number = 'Y' then
1475         /*
1476                                 -- generate new id for new AR invoice_number
1477                                 open new_trx_num_cur;
1478                                 fetch new_trx_num_cur into l_id;
1479                                 close new_trx_num_cur;
1480 
1481                                 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1482         */
1483                                 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1484 
1485                             end if;
1486 
1487                             /* populate rest of header info */
1488                             l_trx_header_tbl(l_Count3).comments := l_inv_comment;
1489                             l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1490                             l_trx_header_tbl(l_Count3).trx_date := l_trx_date;
1491                             --l_trx_header_tbl(l_Count3).trx_date := trunc(P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1492                             l_trx_header_tbl(l_Count3).gl_date := l_trx_header_tbl(l_Count3).trx_date + g_day_togl_after_dd;
1493                             l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1494                             l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1495                             l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1496                             l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1497                             l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1498                             l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1499                             l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1500                             l_trx_header_tbl(l_Count3).primary_salesrep_id := l_PRIMARY_SALESREP_ID;
1501                             l_trx_header_tbl(l_Count3).term_id := l_term_id; --5; --always IMMEDIATE
1502                             l_trx_header_tbl(l_Count3).finance_charges := 'N';
1503                             l_trx_header_tbl(l_Count3).status_trx := 'OP';
1504                             l_trx_header_tbl(l_Count3).printing_option := null;  -- fix for bug 7714411
1505                             l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1506                                 l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1507                             l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1508                             l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1509 
1510                             if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1511                                 l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1512                             end if;
1513 
1514                             /* set trx_type_id */
1515 
1516                             if g_int_trx_type_id is null then
1517 
1518     --                            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Interest transaction type is not set.');
1519                                 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INT_TRX_TYPE_IN_SYS_OPT');
1520                                 FND_MSG_PUB.Add;
1521                                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1522                                 RAISE FND_API.G_EXC_ERROR;
1523 
1524                             end if;
1525 
1526                             l_trx_header_tbl(l_Count3).cust_trx_type_id := g_int_trx_type_id;
1527                             l_int_line_num := 1;
1528                             l_trx_lines_tbl(l_Count1).line_number := l_int_line_num;
1529                             l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1530 
1531                         else
1532 
1533                             l_int_line_num := l_int_line_num + 1;
1534                             l_trx_lines_tbl(l_Count1).line_number := l_int_line_num;
1535                             l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_int_header).trx_header_id;
1536 
1537                         end if;
1538 
1539                     elsif l_next_line = 'FEE' then
1540 
1541                         if l_fee_header = -1 then
1542 
1543                             if l_generate_trx_number = 'Y' then
1544         /*
1545                                 -- generate new id for new AR invoice_number
1546                                 open new_trx_num_cur;
1547                                 fetch new_trx_num_cur into l_id;
1548                                 close new_trx_num_cur;
1549 
1550                                 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1551         */
1552                                 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1553 
1554                             end if;
1555 
1556                             /* populate rest of header info */
1557                             l_trx_header_tbl(l_Count3).comments := l_inv_comment;
1558                             l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1559                             l_trx_header_tbl(l_Count3).trx_date := l_trx_date;
1560                             --l_trx_header_tbl(l_Count3).trx_date := trunc(P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1561                             --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1562                             l_trx_header_tbl(l_Count3).gl_date := l_trx_header_tbl(l_Count3).trx_date + g_day_togl_after_dd;
1563                             l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1564                             l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1565                             l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1566                             l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1567                             l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1568                             l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1569                             l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1570                             l_trx_header_tbl(l_Count3).primary_salesrep_id := l_PRIMARY_SALESREP_ID;
1571                             l_trx_header_tbl(l_Count3).term_id := l_term_id; --5; --always IMMEDIATE
1572                             l_trx_header_tbl(l_Count3).finance_charges := 'N';
1573                             l_trx_header_tbl(l_Count3).status_trx := 'OP';
1574                             l_trx_header_tbl(l_Count3).printing_option := null;  -- fix for bug 7714411
1575                             l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1576                                 l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1577                             l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1578                             l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1579 
1580                             if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1581                                 l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1582                             end if;
1583 
1584                             /* set trx_type_id */
1585                             if g_fee_trx_type_id is null then
1586 
1587     --                            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Fee transaction type is not set.');
1588                                 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_FEE_TRX_TYPE_IN_SYS_OPT');
1589                                 FND_MSG_PUB.Add;
1590                                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1591                                 RAISE FND_API.G_EXC_ERROR;
1592 
1593                             end if;
1594 
1595                             l_trx_header_tbl(l_Count3).cust_trx_type_id := g_fee_trx_type_id;
1596                             l_fee_line_num := 1;
1597                             l_trx_lines_tbl(l_Count1).line_number := l_fee_line_num;
1598                             l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1599 
1600                         else
1601 
1602                             l_fee_line_num := l_fee_line_num + 1;
1603                             l_trx_lines_tbl(l_Count1).line_number := l_fee_line_num;
1604                             l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_fee_header).trx_header_id;
1605 
1606                         end if;
1607 
1608                     end if;
1609 
1610                 end if;
1611 
1612                 /* populate rest of line info */
1613 
1614                 l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1615                 l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1616                 l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1617                 l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1618                 l_trx_lines_tbl(l_Count1).unit_selling_price := P_LINES_TBL(l_Count4).LINE_AMOUNT;
1619                 l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1620                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1621                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1622                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1623                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1624                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1625                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1626                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1627 
1628                 /* populate new return lines table */
1629                 l_Count6 := l_Count6 +1;
1630                 l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1631                 l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1632                 l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1633                 l_new_lines_tbl(l_Count6).LINE_AMOUNT := P_LINES_TBL(l_Count4).LINE_AMOUNT;
1634                 l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1635                 l_new_lines_tbl(l_Count6).LINE_DESC := P_LINES_TBL(l_Count4).LINE_DESC;
1636                 l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1637                 l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1638                 l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1639                 l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1640                 l_new_lines_tbl(l_Count6).LINE_DETAILS := P_LINES_TBL(l_Count4).LINE_DETAILS;
1641 
1642                 P_LINES_TBL(l_Count4).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1643 
1644                 if l_next_line = 'PRIN' then
1645 
1646                     /* query and populate distribution lines for principal dr */
1647                     open prin_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1648 
1649                     fetch prin_dr_dist_cur into
1650                         l_cc_id,
1651                         l_percent,
1652                         l_USSGL_TRANSACTION_CODE;
1653 
1654                     if prin_dr_dist_cur%FOUND then
1655 
1656                         l_Count2 := l_Count2 + 1;
1657                         l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1658                         l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1659                         l_trx_dist_tbl(l_Count2).percent := l_percent;
1660                         l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1661 
1662                         if g_multiple_lines = 'Y' then
1663                             l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1664                             --l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1665                         else
1666                             l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1667                             --l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1668                         end if;
1669 
1670                     end if;
1671                     close prin_dr_dist_cur;
1672 
1673                     /* query and populate distribution lines for principal cr */
1674                     open prin_cr_dist_cur(P_LOAN_REC.LOAN_ID, P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1675 
1676                     l_Count5 := 0;
1677                     l_split_flag := 'N';
1678                     l_running_sum := 0;
1679                     LOOP
1680 
1681                         fetch prin_cr_dist_cur into
1682                             l_cc_id,
1683                             l_percent,
1684                             l_USSGL_TRANSACTION_CODE;
1685                         exit when prin_cr_dist_cur%NOTFOUND;
1686 
1687                         l_Count5 := l_Count5 + 1;
1688                         l_Count2 := l_Count2 + 1;
1689                         l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1690                         l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1691                         l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1692                         l_trx_dist_tbl(l_Count2).percent := l_percent;
1693                         l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1694 
1695                         /* for each distribution create seperate trx line for current trx header */
1696 
1697                         if l_Count5 = 1 then
1698                             l_orig_line_amount := l_trx_lines_tbl(l_Count1).unit_selling_price;
1699 
1700                             fnd_currency.GET_INFO(CURRENCY_CODE => P_LOAN_REC.LOAN_CURRENCY,
1701                                                 PRECISION => l_precision,
1702                                                 EXT_PRECISION => l_ext_precision,
1703                                                 MIN_ACCT_UNIT => l_min_acct_unit);
1704 
1705                         else
1706 
1707                             l_split_flag := 'Y';
1708                             l_Count1 := l_Count1 + 1;
1709                             l_trx_lines_tbl(l_Count1).line_number := l_Count5;
1710                             l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1711                             l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1712                             l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1713                             l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1714                             l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1715                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1716                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1717                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1718                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1719                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1720                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1721                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1722 
1723                             l_Count6 := l_Count6 +1;
1724                             l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1725                             l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1726                             l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1727                             l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1728                             l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1729                             l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1730                             l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1731                             l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1732 
1733                             if g_multiple_lines = 'Y' then
1734                                 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1735                             else
1736                                 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1737                             end if;
1738 
1739                             l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1740 
1741                         end if;
1742 
1743                         --l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1744                         l_trx_lines_tbl(l_Count1).description := l_trx_lines_tbl(l_Count1).description || GET_RECEIVABLES_FUND_DESC(l_cc_id);
1745                         l_trx_lines_tbl(l_Count1).unit_selling_price := round(l_orig_line_amount * l_trx_dist_tbl(l_Count2).percent / 100, l_precision);
1746                         l_trx_dist_tbl(l_Count2).percent := 100;
1747                         l_running_sum := l_running_sum + l_trx_lines_tbl(l_Count1).unit_selling_price;
1748 
1749                         l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1750                         l_new_lines_tbl(l_Count6).LINE_DESC := l_trx_lines_tbl(l_Count1).description;
1751 
1752                     END LOOP;
1753 
1754                     if l_split_flag = 'Y' then
1755                         l_trx_lines_tbl(l_Count1).unit_selling_price := l_orig_line_amount -
1756                             (l_running_sum - l_trx_lines_tbl(l_Count1).unit_selling_price);
1757                         l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1758                     end if;
1759 
1760                     close prin_cr_dist_cur;
1761 
1762                 elsif l_next_line = 'INT' then
1763 
1764                     if l_int_header = -1 then
1765                         /* query and populate distribution lines for interest dr */
1766                         open int_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1767 
1768                         fetch int_dr_dist_cur into
1769                             l_cc_id,
1770                             l_percent,
1771                             l_USSGL_TRANSACTION_CODE;
1772 
1773                         if int_dr_dist_cur%FOUND then
1774 
1775                             l_Count2 := l_Count2 + 1;
1776                             l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1777                             l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1778                             l_trx_dist_tbl(l_Count2).percent := l_percent;
1779                             l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1780 
1781                             if g_multiple_lines = 'Y' then
1782                                 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1783                                 --l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1784                             else
1785                                 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1786                                 --l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1787                             end if;
1788 
1789                         end if;
1790                         close int_dr_dist_cur;
1791                     end if;
1792 
1793                     /* query and populate distribution lines for interest cr */
1794                     open int_cr_dist_cur(P_LOAN_REC.LOAN_ID);
1795 
1796                     l_Count5 := 0;
1797                     l_split_flag := 'N';
1798                     l_running_sum := 0;
1799                     LOOP
1800 
1801                         fetch int_cr_dist_cur into
1802                             l_cc_id,
1803                             l_percent,
1804                             l_USSGL_TRANSACTION_CODE;
1805                         exit when int_cr_dist_cur%NOTFOUND;
1806 
1807                         l_Count5 := l_Count5 + 1;
1808                         l_Count2 := l_Count2 + 1;
1809                         l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1810                         l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1811                         l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1812                         l_trx_dist_tbl(l_Count2).percent := l_percent;
1813                         l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1814 
1815                         /* for each distribution create seperate trx line for current trx header */
1816 
1817                         if l_Count5 = 1 then
1818                             l_orig_line_amount := l_trx_lines_tbl(l_Count1).unit_selling_price;
1819 
1820                             fnd_currency.GET_INFO(CURRENCY_CODE => P_LOAN_REC.LOAN_CURRENCY,
1821                                                 PRECISION => l_precision,
1822                                                 EXT_PRECISION => l_ext_precision,
1823                                                 MIN_ACCT_UNIT => l_min_acct_unit);
1824 
1825                         else
1826 
1827                             l_split_flag := 'Y';
1828                             l_Count1 := l_Count1 + 1;
1829                             l_trx_lines_tbl(l_Count1).line_number := l_Count5;
1830                             l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1831                             l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1832                             l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1833                             l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1834                             l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1835                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1836                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1837                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1838                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1839                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1840                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1841                             l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1842 
1843                             l_Count6 := l_Count6 +1;
1844                             l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1845                             l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1846                             l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1847                             l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1848                             l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1849                             l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1850                             l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1851                             l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1852 
1853                             if g_multiple_lines = 'Y' then
1854                                 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1855                             else
1856                                 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1857                             end if;
1858 
1859                             l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1860 
1861                         end if;
1862 
1863                         --l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1864                         l_trx_lines_tbl(l_Count1).description := l_trx_lines_tbl(l_Count1).description || GET_RECEIVABLES_FUND_DESC(l_cc_id);
1865                         l_trx_lines_tbl(l_Count1).unit_selling_price := round(l_orig_line_amount * l_trx_dist_tbl(l_Count2).percent / 100, l_precision);
1866                         l_trx_dist_tbl(l_Count2).percent := 100;
1867                         l_running_sum := l_running_sum + l_trx_lines_tbl(l_Count1).unit_selling_price;
1868 
1869                         l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1870                         l_new_lines_tbl(l_Count6).LINE_DESC := l_trx_lines_tbl(l_Count1).description;
1871 
1872                     END LOOP;
1873 
1874                     if l_split_flag = 'Y' then
1875                         l_trx_lines_tbl(l_Count1).unit_selling_price := l_orig_line_amount -
1876                             (l_running_sum - l_trx_lines_tbl(l_Count1).unit_selling_price);
1877                         l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1878                     end if;
1879 
1880                     close int_cr_dist_cur;
1881 
1882                     if l_int_header = -1 then
1883                         l_int_header := l_Count3;
1884                     end if;
1885 
1886                 elsif l_next_line = 'FEE' then
1887 
1888                     if P_LINES_TBL(l_Count4).LINE_REF_ID is not null then
1889 
1890 		    	        l_disb_hdr_id := null;
1891 
1892 		    	        open cur_get_disbHdr_id(P_LINES_TBL(l_Count4).fee_schedule_id);
1893                         fetch cur_get_disbHdr_id into l_disb_hdr_id;
1894                         close cur_get_disbHdr_id;
1895                         LogMessage(FND_LOG.LEVEL_STATEMENT, 'disb_header_id is '||l_disb_hdr_id||' for fee_schedule_id : '||P_LINES_TBL(l_Count4).fee_schedule_id);
1896 
1897                         if l_fee_header = -1 then
1898 
1899                             l_feeRec_exists := 'N';
1900                             /* query and populate distribution lines for fee dr */
1901                             open cur_fee_dr_dist(P_LOAN_REC.LOAN_ID, P_LINES_TBL(l_Count4).LINE_REF_ID, l_disb_hdr_id);
1902             			    fetch cur_fee_dr_dist into
1903                                 l_cc_id,
1904                                 l_percent,
1905                                 l_USSGL_TRANSACTION_CODE;
1906 
1907 			                IF (cur_fee_dr_dist%NOTFOUND) THEN
1908 
1909                                 /* Existed disbFees before fix of bug#9054263, contains only one FEE_RECEIVABLE
1910 				                    for all fees in a loan */
1911                                 /* query and populate distribution lines for fee dr */
1912                                 open fee_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1913 
1914                                 fetch fee_dr_dist_cur into
1915                                     l_cc_id,
1916                                     l_percent,
1917                                     l_USSGL_TRANSACTION_CODE;
1918 
1919                                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Executed cursor fee_dr_dist_cur(for a LOAN)');
1920                                 if(fee_dr_dist_cur%FOUND) THEN
1921                                     l_feeRec_exists := 'Y';
1922                                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Records found for cursor fee_dr_dist_cur(for a LOAN)');
1923                                 end if;
1924                                 close fee_dr_dist_cur;
1925                             ELSE
1926                                 l_feeRec_exists := 'Y';
1927                                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Records found for cursor cur_fee_dr_dist(for each fee)');
1928                             end if;
1929 
1930                             if l_feeRec_exists = 'Y' then
1931 
1932                                 l_Count2 := l_Count2 + 1;
1933                                 l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1934                                 l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1935                                 l_trx_dist_tbl(l_Count2).percent := l_percent;
1936                                 l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1937 
1938                                 if g_multiple_lines = 'Y' then
1939                                     l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1940                                     --l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1941                                 else
1942                                     l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1943                                     --l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1944                                 end if;
1945 
1946                             end if;
1947 
1948 			                close cur_fee_dr_dist;
1949 
1950                         end if;
1951 
1952                         /* query and populate distribution lines for fee cr */
1953                         open fee_cr_dist_cur(P_LOAN_REC.LOAN_ID, P_LINES_TBL(l_Count4).LINE_REF_ID, l_disb_hdr_id);
1954 
1955                         LOOP
1956 
1957                             fetch fee_cr_dist_cur into
1958                                 l_cc_id,
1959                                 l_percent,
1960                                 l_USSGL_TRANSACTION_CODE;
1961                             exit when fee_cr_dist_cur%NOTFOUND;
1962 
1963                             l_Count2 := l_Count2 + 1;
1964                             l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1965                             l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1966                             l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1967                             l_trx_dist_tbl(l_Count2).percent := l_percent;
1968                             l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1969 
1970                             --l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1971 
1972                         END LOOP;
1973 
1974                         close fee_cr_dist_cur;
1975 
1976                     end if;
1977 
1978                     if l_fee_header = -1 then
1979                         l_fee_header := l_Count3;
1980                     end if;
1981 
1982                 end if;
1983 
1984                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will create invoice/line for ' || l_trx_lines_tbl(l_Count1).description || ' with amount ' || l_trx_lines_tbl(l_Count1).unit_selling_price);
1985 
1986             end if;
1987 
1988         END LOOP;
1989 
1990         /* exit looping */
1991         if l_exit_loop = 'Y' then
1992             exit;
1993         end if;
1994 
1995         l_start_pos := l_end_pos+1;
1996 		l_end_pos := instr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_search_str, l_start_pos, 1);
1997 
1998 	end loop;
1999 
2000     l_ar_inv_created := false;
2001     if l_trx_header_tbl.COUNT > 0 then
2002 	-- fix for bug 7000066: returning without error if there are no data to create invoices
2003         --LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'WARNING: No data available to create invoices. Returning.');
2004         --return;
2005     /*
2006 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No data to create invoices.');
2007     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_DATA_CR_INV');
2008 		FND_MSG_PUB.Add;
2009         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2010         RAISE FND_API.G_EXC_ERROR;
2011    */
2012 
2013         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Creating AR invoices with following values:');
2014         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_batch_source_rec.batch_source_id: ' || l_batch_source_rec.batch_source_id);
2015 
2016         FOR l_Count3 IN 1..l_trx_header_tbl.COUNT LOOP
2017 
2018             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice header ' || l_Count3);
2019             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_header_tbl(l_Count3).trx_header_id);
2020             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_number: ' || l_trx_header_tbl(l_Count3).trx_number);
2021             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_date: ' || l_trx_header_tbl(l_Count3).trx_date);
2022             --LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').billing_date: ' || l_trx_header_tbl(l_Count3).billing_date);
2023             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_currency: ' || l_trx_header_tbl(l_Count3).trx_currency);
2024             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_rate_type: ' || l_trx_header_tbl(l_Count3).exchange_rate_type);
2025             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_date: ' || l_trx_header_tbl(l_Count3).exchange_date);
2026             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_rate: ' || l_trx_header_tbl(l_Count3).exchange_rate);
2027             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').cust_trx_type_id: ' || l_trx_header_tbl(l_Count3).cust_trx_type_id);
2028             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').bill_to_customer_id: ' || l_trx_header_tbl(l_Count3).bill_to_customer_id);
2029             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').bill_to_address_id: ' || l_trx_header_tbl(l_Count3).bill_to_address_id);
2030             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').bill_to_site_use_id: ' || l_trx_header_tbl(l_Count3).bill_to_site_use_id);
2031             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').primary_salesrep_id: ' || l_trx_header_tbl(l_Count3).primary_salesrep_id);
2032             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').term_id: ' || l_trx_header_tbl(l_Count3).term_id);
2033             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').finance_charges: ' || l_trx_header_tbl(l_Count3).finance_charges);
2034             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').status_trx: ' || l_trx_header_tbl(l_Count3).status_trx);
2035             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').printing_option: ' || l_trx_header_tbl(l_Count3).printing_option);
2036             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').interface_header_attribute1: ' || l_trx_header_tbl(l_Count3).interface_header_attribute1);
2037             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').default_ussgl_transaction_code: ' || l_trx_header_tbl(l_Count3).default_ussgl_transaction_code);
2038             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').org_id: ' || l_trx_header_tbl(l_Count3).org_id);
2039             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').legal_entity_id: ' || l_trx_header_tbl(l_Count3).legal_entity_id);
2040 
2041             -- fix for bug 8859462
2042             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE...');
2043             LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
2044                     p_gl_date => l_trx_header_tbl(l_Count3).gl_date,
2045                     p_trx_date => l_trx_header_tbl(l_Count3).trx_date,
2046                     p_set_of_books_id => g_set_of_books_id,
2047                     x_default_gl_date => l_trx_header_tbl(l_Count3).gl_date);
2048             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').gl_date: ' || l_trx_header_tbl(l_Count3).gl_date);
2049 
2050         END LOOP;
2051 
2052         FOR l_Count3 IN 1..l_trx_lines_tbl.COUNT LOOP
2053 
2054             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice line ' || l_Count3);
2055             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').trx_line_id: ' || l_trx_lines_tbl(l_Count3).trx_line_id);
2056             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_lines_tbl(l_Count3).trx_header_id);
2057             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').line_number: ' || l_trx_lines_tbl(l_Count3).line_number);
2058             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').description: ' || l_trx_lines_tbl(l_Count3).description);
2059             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').quantity_invoiced: ' || l_trx_lines_tbl(l_Count3).quantity_invoiced);
2060             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').unit_selling_price: ' || l_trx_lines_tbl(l_Count3).unit_selling_price);
2061             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').line_type: ' || l_trx_lines_tbl(l_Count3).line_type);
2062             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').interface_line_context: ' || l_trx_lines_tbl(l_Count3).interface_line_context);
2063             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE1: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE1);
2064             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE2: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE2);
2065             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE3: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE3);
2066             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE4: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE4);
2067             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE5: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE5);
2068             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE6: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE6);
2069             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE7: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE7);
2070             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').default_ussgl_transaction_code: ' || l_trx_lines_tbl(l_Count3).default_ussgl_transaction_code);
2071 
2072         END LOOP;
2073 
2074         FOR l_Count3 IN 1..l_trx_dist_tbl.COUNT LOOP
2075 
2076             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Distribution ' || l_Count3);
2077             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_dist_id: ' || l_trx_dist_tbl(l_Count3).trx_dist_id);
2078             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_dist_tbl(l_Count3).trx_header_id);
2079             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_line_id: ' || l_trx_dist_tbl(l_Count3).trx_line_id);
2080             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').ACCOUNT_CLASS: ' || l_trx_dist_tbl(l_Count3).ACCOUNT_CLASS);
2081             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').percent: ' || l_trx_dist_tbl(l_Count3).percent);
2082             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').CODE_COMBINATION_ID: ' || l_trx_dist_tbl(l_Count3).CODE_COMBINATION_ID);
2083 
2084         END LOOP;
2085 
2086     --    fnd_global.apps_initialize(FND_GLOBAL.USER_ID, FND_GLOBAL.RESP_ID, FND_GLOBAL.RESP_APPL_ID, FND_GLOBAL.SECURITY_GROUP_ID);
2087 
2088         l_batch_id := null;
2089         ar_invoice_api_pub.g_api_outputs.batch_id := null;
2090 
2091         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Org info just before call to invoice api');
2092         l_org_id := MO_GLOBAL.GET_CURRENT_ORG_ID();
2093         LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.GET_CURRENT_ORG_ID(): ' || l_org_id);
2094         l_org_status := MO_GLOBAL.check_valid_org(g_org_id);
2095         LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.check_valid_org(' || g_org_id || '): ' || l_org_status);
2096 
2097         BEGIN
2098 
2099             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Calling AR_INVOICE_API_PUB.CREATE_INVOICE...');
2100             l_start := sysdate;
2101             AR_INVOICE_API_PUB.CREATE_INVOICE(
2102                 p_api_version           => 1.0,
2103                 p_init_msg_list         => FND_API.G_TRUE,
2104                 p_commit                => FND_API.G_FALSE,
2105                 p_batch_source_rec	    => l_batch_source_rec,
2106                 p_trx_header_tbl        => l_trx_header_tbl,
2107                 p_trx_lines_tbl         => l_trx_lines_tbl,
2108                 p_trx_dist_tbl          => l_trx_dist_tbl,
2109                 p_trx_salescredits_tbl  => l_trx_salescredits_tbl,
2110                 x_return_status         => l_return_status,
2111                 x_msg_count             => l_msg_count,
2112                 x_msg_data              => l_msg_data);
2113 
2114         EXCEPTION
2115             WHEN OTHERS THEN
2116 
2117                 l_end := sysdate;
2118                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Invoice API timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
2119                 LogMessage(FND_LOG.LEVEL_ERROR, 'Invoice API throws exception!');
2120 
2121                 /* query AR errors */
2122                 l_ar_error_counter := 0;
2123                 open ar_invoice_err_cur;
2124 
2125                 LOOP
2126 
2127                     fetch ar_invoice_err_cur into
2128                         l_trx_header_id,
2129                         l_trx_line_id,
2130                         l_error_message,
2131                         l_invalid_value;
2132                     exit when ar_invoice_err_cur%NOTFOUND;
2133 
2134                     l_ar_error_counter := l_ar_error_counter + 1;
2135 
2136                     if l_ar_error_counter = 1 then
2137                         FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_FAIL');
2138                         FND_MESSAGE.SET_TOKEN('MSG', l_msg_data);
2139                         FND_MSG_PUB.Add;
2140                         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2141                     end if;
2142 
2143                     FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_ERROR');
2144                     FND_MESSAGE.SET_TOKEN('ERR', l_error_message);
2145                     FND_MESSAGE.SET_TOKEN('VALUE', l_invalid_value);
2146                     FND_MESSAGE.SET_TOKEN('HEADER', l_trx_header_id);
2147                     FND_MESSAGE.SET_TOKEN('LINE', l_trx_line_id);
2148                     FND_MSG_PUB.Add;
2149                     LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2150 
2151                 END LOOP;
2152 
2153                 close ar_invoice_err_cur;
2154 
2155                 if l_ar_error_counter = 0 then
2156                     LogMessage(FND_LOG.LEVEL_ERROR, 'No AR errors found.');
2157                 end if;
2158 
2159                 RAISE FND_API.G_EXC_ERROR;
2160         END;
2161 
2162         l_end := sysdate;
2163         LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Invoice API timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
2164 
2165         l_batch_id := ar_invoice_api_pub.g_api_outputs.batch_id;
2166 
2167         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2168         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2169         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_batch_id: ' || l_batch_id);
2170 
2171         l_ar_error_counter := 0;
2172         IF l_return_status = fnd_api.g_ret_sts_error OR l_return_status = fnd_api.g_ret_sts_unexp_error OR l_batch_id is null THEN
2173 
2174             l_ar_error_counter := 1;
2175             FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_FAIL');
2176             FND_MESSAGE.SET_TOKEN('MSG', l_msg_data);
2177             FND_MSG_PUB.Add;
2178             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2179 
2180         END IF;
2181 
2182         /* query AR errors */
2183         open ar_invoice_err_cur;
2184 
2185         LOOP
2186 
2187             fetch ar_invoice_err_cur into
2188                 l_trx_header_id,
2189                 l_trx_line_id,
2190                 l_error_message,
2191                 l_invalid_value;
2192             exit when ar_invoice_err_cur%NOTFOUND;
2193 
2194             l_ar_error_counter := l_ar_error_counter + 1;
2195             FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_ERROR');
2196             FND_MESSAGE.SET_TOKEN('ERR', l_error_message);
2197             FND_MESSAGE.SET_TOKEN('VALUE', l_invalid_value);
2198             FND_MESSAGE.SET_TOKEN('HEADER', l_trx_header_id);
2199             FND_MESSAGE.SET_TOKEN('LINE', l_trx_line_id);
2200             FND_MSG_PUB.Add;
2201             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2202 
2203         END LOOP;
2204 
2205         close ar_invoice_err_cur;
2206 
2207         if l_ar_error_counter > 0  then
2208             RAISE FND_API.G_EXC_ERROR;
2209         else
2210             l_ar_inv_created := true;
2211             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoices successfully created!') ;
2212         end if;
2213 
2214     end if;
2215 
2216     /* inserting record into LNS_AMORTIZATION_SCHEDS */
2217     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Inserting new record into LNS_AMORTIZATION_SCHEDS w following values:');
2218     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_LOAN_REC.LOAN_ID);
2219     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || P_LOAN_REC.NEXT_PAYMENT_NUMBER);
2220     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
2221     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LATE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_LATE_DATE);
2222     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT);
2223     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || P_LOAN_REC.NEXT_INTEREST_AMOUNT);
2224     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || P_LOAN_REC.NEXT_FEE_AMOUNT);
2225     LogMessage(FND_LOG.LEVEL_STATEMENT, 'RATE_ID: ' || P_LOAN_REC.RATE_ID);
2226     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PARENT_AMORTIZATION_ID: ' || P_LOAN_REC.PARENT_AMORTIZATION_ID);
2227     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_BALANCE: ' || P_LOAN_REC.PRINCIPAL_BALANCE);
2228     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PHASE: ' || P_LOAN_REC.CURRENT_PHASE);
2229     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || P_LOAN_REC.FUNDED_AMOUNT);
2230     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DEFERRED_INT_AMOUNT: ' || P_LOAN_REC.DEFERRED_INT_AMOUNT);
2231     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURR_CAP_INT_AMOUNT: ' || P_LOAN_REC.CURR_CAP_INT_AMOUNT);
2232     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CAP_INT_AMOUNT: ' || P_LOAN_REC.CAP_INT_AMOUNT);
2233 
2234     LNS_AMORTIZATION_SCHEDS_PKG.Insert_Row(
2235         X_AMORTIZATION_SCHEDULE_ID => P_LOAN_REC.NEXT_AMORTIZATION_ID
2236         ,P_LOAN_ID => P_LOAN_REC.LOAN_ID
2237         ,P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER
2238         ,P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE
2239         ,P_LATE_DATE => P_LOAN_REC.NEXT_PAYMENT_LATE_DATE
2240         ,P_PRINCIPAL_AMOUNT => P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT
2241         ,P_INTEREST_AMOUNT => P_LOAN_REC.NEXT_INTEREST_AMOUNT
2242         ,P_FEE_AMOUNT => P_LOAN_REC.NEXT_FEE_AMOUNT
2243         ,P_REVERSED_FLAG => 'N'
2244         ,P_RATE_ID => P_LOAN_REC.RATE_ID
2245         ,P_OBJECT_VERSION_NUMBER => 1
2246         ,P_PARENT_AMORTIZATION_ID => P_LOAN_REC.PARENT_AMORTIZATION_ID
2247 	    ,P_PRINCIPAL_BALANCE => P_LOAN_REC.PRINCIPAL_BALANCE
2248 	    ,P_PHASE => P_LOAN_REC.CURRENT_PHASE
2249 	    ,P_FUNDED_AMOUNT => P_LOAN_REC.FUNDED_AMOUNT
2250 	    ,P_DEFERRED_INT_AMOUNT => P_LOAN_REC.DEFERRED_INT_AMOUNT
2251         ,P_CURR_CAP_INT_AMOUNT => P_LOAN_REC.CURR_CAP_INT_AMOUNT
2252 	    ,P_CAP_INT_AMOUNT => P_LOAN_REC.CAP_INT_AMOUNT);
2253 
2254     LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_SCHEDULE_ID: ' || P_LOAN_REC.NEXT_AMORTIZATION_ID);
2255     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully inserted record into LNS_AMORTIZATION_SCHEDS');
2256 
2257     if l_ar_inv_created = true then
2258 
2259         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fetching inserted ar invoice details...');
2260 
2261         /* query for cust_trx_id(s) and payment_schedule_id(s) */
2262         open ar_invoices_cur(l_batch_id);
2263 
2264         l_Count2 := 0; -- counter
2265 
2266         LOOP
2267 
2268             fetch ar_invoices_cur into
2269                 l_customer_trx_id,
2270                 l_trx_number,
2271                 l_customer_trx_line_id,
2272                 l_payment_schedule_id,
2273                 l_due_date,
2274                 l_amount,
2275                 l_line_type,
2276                 l_payment_order;
2277             exit when ar_invoices_cur%NOTFOUND;
2278 
2279             l_Count2 := l_Count2+1;
2280             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Trx ' || l_Count2 ||'; trx_number: ' || l_trx_number);
2281             LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_ID: ' || l_customer_trx_id);
2282             LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_LINE_ID: ' || l_customer_trx_line_id);
2283             LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || l_payment_schedule_id);
2284             LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_due_date);
2285             LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMOUNT: ' || l_amount);
2286             LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_line_type);
2287             LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_ORDER: ' || l_payment_order);
2288 
2289             if l_payment_schedule_id is null then
2290                 LogMessage(FND_LOG.LEVEL_ERROR, 'WARNING: Invoice ' || l_trx_number || '(id ' || l_customer_trx_id || ') ' ||  l_line_type || ' is incomplete!');
2291             end if;
2292 
2293             if l_line_type = 'PRIN' then
2294                 l_principal_trx_id := l_customer_trx_id;
2295             elsif l_line_type = 'INT' then
2296                 l_interest_trx_id := l_customer_trx_id;
2297             elsif l_line_type = 'FEE' then
2298                 l_fee_trx_id := l_customer_trx_id;
2299             end if;
2300 
2301             /* search right record in l_new_lines_tbl table and set AR info */
2302             FOR l_Count3 IN 1..l_new_lines_tbl.COUNT LOOP
2303 
2304                 if l_line_type = l_new_lines_tbl(l_Count3).LINE_TYPE and l_payment_order = l_new_lines_tbl(l_Count3).PAYMENT_ORDER then
2305 
2306                     l_new_lines_tbl(l_Count3).CUSTOMER_TRX_ID := l_customer_trx_id;
2307                     l_new_lines_tbl(l_Count3).PAYMENT_SCHEDULE_ID := l_payment_schedule_id;
2308                     l_new_lines_tbl(l_Count3).CUSTOMER_TRX_LINE_ID := l_customer_trx_line_id;
2309 
2310                     /* inserting new record into LNS_AMORTIZATION_LINES */
2311                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Inserting new record into LNS_AMORTIZATION_LINES w following values:');
2312                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_SCHEDULE_ID: ' || P_LOAN_REC.NEXT_AMORTIZATION_ID);
2313                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_LOAN_REC.LOAN_ID);
2314                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_line_type);
2315                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMOUNT: ' || l_amount);
2316                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_ID: ' || l_customer_trx_id);
2317                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_LINE_ID: ' || l_customer_trx_line_id);
2318                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_ID: ' || l_new_lines_tbl(l_Count3).LINE_REF_ID);
2319                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_SCHEDULE_ID: ' || l_new_lines_tbl(l_Count3).FEE_SCHEDULE_ID);
2320 
2321                     l_amortization_line_id := null;
2322                     LNS_AMORTIZATION_LINES_PKG.Insert_Row(
2323                         X_AMORTIZATION_LINE_ID => l_amortization_line_id
2324                         ,P_AMORTIZATION_SCHEDULE_ID => P_LOAN_REC.NEXT_AMORTIZATION_ID
2325                         ,P_LOAN_ID	=> P_LOAN_REC.LOAN_ID
2326                         ,P_LINE_TYPE => l_line_type
2327                         ,P_AMOUNT => l_amount
2328                         ,P_CUST_TRX_ID => l_customer_trx_id
2329                         ,P_CUST_TRX_LINE_ID => l_customer_trx_line_id
2330                         ,P_FEE_ID => l_new_lines_tbl(l_Count3).LINE_REF_ID
2331                         ,P_OBJECT_VERSION_NUMBER => 1
2332                         ,P_FEE_SCHEDULE_ID => l_new_lines_tbl(l_Count3).FEE_SCHEDULE_ID
2333                         ,P_LINE_DETAILS => l_new_lines_tbl(l_Count3).LINE_DETAILS);
2334 
2335                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_LINE_ID: ' || l_amortization_line_id);
2336                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully inserted record into LNS_AMORTIZATION_LINES');
2337 
2338                     exit;
2339 
2340                 end if;
2341 
2342             END LOOP;
2343 
2344         END LOOP;
2345 
2346         close ar_invoices_cur;
2347 
2348         if l_Count2 = 0 then
2349     --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No AR invoices fetched');
2350             FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INV_FETCHED');
2351             FND_MSG_PUB.Add;
2352             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2353             RAISE FND_API.G_EXC_ERROR;
2354         end if;
2355 
2356         /* Update interest and fee trxs with principal_trx_id as RELATED_CUSTOMER_TRX_ID */
2357         if g_multiple_lines = 'N' and l_principal_trx_id is not null then
2358 
2359             if l_interest_trx_id is not null then
2360 
2361                 update RA_CUSTOMER_TRX_ALL set RELATED_CUSTOMER_TRX_ID = l_principal_trx_id where CUSTOMER_TRX_ID = l_interest_trx_id;
2362 
2363                 if (sql%notfound) then
2364     --                LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Update RA_CUSTOMER_TRX_ALL with RELATED_CUSTOMER_TRX_ID failed');
2365                     FND_MESSAGE.SET_NAME('LNS', 'LNS_RELATE_INV_FAIL');
2366                     FND_MSG_PUB.Add;
2367                     LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2368                     RAISE FND_API.G_EXC_ERROR;
2369                 end if;
2370 
2371             end if;
2372 
2373             if l_fee_trx_id is not null then
2374 
2375                 update RA_CUSTOMER_TRX_ALL set RELATED_CUSTOMER_TRX_ID = l_principal_trx_id where CUSTOMER_TRX_ID = l_fee_trx_id;
2376 
2377                 if (sql%notfound) then
2378     --                LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Update RA_CUSTOMER_TRX_ALL with RELATED_CUSTOMER_TRX_ID failed');
2379                     FND_MESSAGE.SET_NAME('LNS', 'LNS_RELATE_INV_FAIL');
2380                     FND_MSG_PUB.Add;
2381                     LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2382                     RAISE FND_API.G_EXC_ERROR;
2383                 end if;
2384 
2385             end if;
2386 
2387         end if;
2388 
2389         /* Update amortization table with new principal, interest and fee ids */
2390 
2391         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_AMORTIZATION_SCHEDS with new trx ids:');
2392         LogMessage(FND_LOG.LEVEL_STATEMENT, 'principal_trx_id: ' || l_principal_trx_id);
2393         LogMessage(FND_LOG.LEVEL_STATEMENT, 'interest_trx_id: ' || l_interest_trx_id);
2394         LogMessage(FND_LOG.LEVEL_STATEMENT, 'fee_trx_id: ' || l_fee_trx_id);
2395 
2396         LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
2397             P_AMORTIZATION_SCHEDULE_ID  => P_LOAN_REC.NEXT_AMORTIZATION_ID
2398             ,P_PRINCIPAL_TRX_ID	        => l_principal_trx_id
2399             ,P_INTEREST_TRX_ID	        => l_interest_trx_id
2400             ,P_FEE_TRX_ID	            => l_fee_trx_id);
2401 
2402         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
2403 
2404         P_LINES_TBL := l_new_lines_tbl;
2405 
2406     end if;
2407 
2408     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2409 END;
2410 
2411 
2412 
2413 /*========================================================================
2414  | PRIVATE PROCEDURE CREATE_AR_CM
2415  |
2416  | DESCRIPTION
2417  |      This procedure creates AR credit memos.
2418  |
2419  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2420  |      REVERSE_LAST_AMORTIZATION
2421  |      REVERSE_OFFCYCLE_BILL
2422  |
2423  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2424  |      LogMessage
2425  |
2426  | PARAMETERS
2427  |      P_REVERSE_TBL  IN OUT       Table of records needs to be reversed
2428  |
2429  | KNOWN ISSUES
2430  |      None
2431  |
2432  | NOTES
2433  |      Any interesting aspect of the code in the package body which needs
2434  |      to be stated.
2435  |
2436  | MODIFICATION HISTORY
2437  | Date                  Author            Description of Changes
2438  | 01-01-2004            scherkas          Created
2439  |
2440  *=======================================================================*/
2441 PROCEDURE CREATE_AR_CM(P_REVERSE_TBL  IN OUT NOCOPY  LNS_BILLING_BATCH_PUB.REVERSE_TBL)
2442 IS
2443 
2444 /*-----------------------------------------------------------------------+
2445  | Local Variable Declarations and initializations                       |
2446  +-----------------------------------------------------------------------*/
2447 
2448     l_api_name                      CONSTANT VARCHAR2(30) := 'CREATE_AR_CM';
2449     l_return_status                 VARCHAR2(1);
2450     l_msg_count                     NUMBER;
2451     l_msg_data                      VARCHAR2(2000);
2452     l_Count                         number;
2453     l_Count1                        number;
2454     l_Count2                        number;
2455     l_trx_found                     varchar2(1);
2456     l_request_id                    varchar2(50);
2457     l_batch_source_name             VARCHAR2(50);
2458     l_cm_batch_source_name          VARCHAR2(50);
2459     l_cm_batch_source_id            number;
2460     l_Count4                        number;
2461     l_LINE_CREDIT_FLAG              varchar2(1);
2462     l_amount                        number;
2463 
2464     l_trx_tbl                       DBMS_SQL.NUMBER_TABLE;
2465     l_cm_line_tbl                   AR_CREDIT_MEMO_API_PUB.Cm_Line_Tbl_Type_Cover%type;
2466 
2467 /*-----------------------------------------------------------------------+
2468  | Cursor Declarations                                                   |
2469  +-----------------------------------------------------------------------*/
2470 
2471     /* query for batch_source_name and cm_batch_source_id */
2472     CURSOR batch_source_cur(P_BATCH_SOURCE_ID number) IS
2473         select name, CREDIT_MEMO_BATCH_SOURCE_ID
2474         from RA_BATCH_SOURCES
2475         where batch_source_id = P_BATCH_SOURCE_ID;
2476 
2477     /* query for cm_batch_source_name */
2478     CURSOR cm_batch_source_cur(P_BATCH_SOURCE_ID number) IS
2479         select name
2480         from RA_BATCH_SOURCES
2481         where batch_source_id = P_BATCH_SOURCE_ID;
2482 
2483 BEGIN
2484     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2485 
2486     init;
2487 
2488     l_Count1 := 0;
2489     FOR l_Count IN 1..P_REVERSE_TBL.count LOOP
2490 
2491         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Trx Line #' || l_Count);
2492         LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_NUMBER: ' || P_REVERSE_TBL(l_Count).TRX_NUMBER);
2493         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_ID: ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID);
2494         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || P_REVERSE_TBL(l_Count).PAYMENT_SCHEDULE_ID);
2495         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_LINE_ID: ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_LINE_ID);
2496         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || P_REVERSE_TBL(l_Count).LINE_TYPE);
2497         LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_AMOUNT: ' || P_REVERSE_TBL(l_Count).TRX_AMOUNT);
2498         LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLIED_AMOUNT: ' || P_REVERSE_TBL(l_Count).APPLIED_AMOUNT);
2499         LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || P_REVERSE_TBL(l_Count).ORG_ID);
2500 
2501         if P_REVERSE_TBL(l_Count).APPLIED_AMOUNT <> 0 then
2502 
2503 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot reverse because there are some valid activities on trx.');
2504         	FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_REV_BILL');
2505     		FND_MSG_PUB.Add;
2506             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2507             RAISE FND_API.G_EXC_ERROR;
2508 
2509         end if;
2510 
2511         /* searching/adding trx(s) into unique trx table */
2512         l_trx_found := 'N';
2513 
2514         FOR l_Count1 IN 1..l_trx_tbl.count LOOP
2515 
2516             if l_trx_tbl(l_Count1) = P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID then
2517                 l_trx_found := 'Y';
2518                 exit;
2519             end if;
2520 
2521         END LOOP;
2522 
2523         if l_trx_found = 'N' then
2524 
2525             l_Count1 := l_Count1 + 1;
2526             l_trx_tbl(l_Count1) := P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID;
2527             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added trx ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID || ' into unique trx table');
2528 
2529         end if;
2530 
2531     END LOOP;
2532 
2533     LogMessage(FND_LOG.LEVEL_STATEMENT, '______________');
2534     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Total found ' || l_trx_tbl.count || ' unique trx(s)');
2535     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Total found ' || P_REVERSE_TBL.count || ' trx line(s)');
2536 
2537     if P_REVERSE_TBL.count = 0 or l_trx_tbl.count = 0 then
2538 
2539 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No AR transactions found to reverse.');
2540     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_REVERSE');
2541 		FND_MSG_PUB.Add;
2542         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2543         RAISE FND_API.G_EXC_ERROR;
2544 
2545     end if;
2546 
2547     /* query for batch_source_name and cm_batch_source_id */
2548     open batch_source_cur(g_batch_source_id);
2549     fetch batch_source_cur into l_batch_source_name, l_cm_batch_source_id;
2550     close batch_source_cur;
2551 
2552     if l_cm_batch_source_id is null then
2553 
2554     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CM_BATCH');
2555       	FND_MESSAGE.SET_TOKEN('BATCH', l_batch_source_name);
2556 		FND_MSG_PUB.Add;
2557         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2558         RAISE FND_API.G_EXC_ERROR;
2559 
2560     end if;
2561 
2562     /* query for cm_batch_source_name */
2563     open cm_batch_source_cur(l_cm_batch_source_id);
2564     fetch cm_batch_source_cur into l_cm_batch_source_name;
2565     close cm_batch_source_cur;
2566 
2567     --l_batch_source_name := 'Credit Memo';
2568     LogMessage(FND_LOG.LEVEL_STATEMENT, 'batch_source_name: ' || l_batch_source_name);
2569     LogMessage(FND_LOG.LEVEL_STATEMENT, 'cm_batch_source_name: ' || l_cm_batch_source_name);
2570 
2571     /* looping thru table of unique trx(s) */
2572     FOR l_Count1 IN 1..l_trx_tbl.count LOOP
2573 
2574         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Processing trx ' || l_trx_tbl(l_Count1));
2575 
2576         l_cm_line_tbl.delete;
2577         l_Count2 := 0;
2578         l_Count4 := 0;
2579         l_LINE_CREDIT_FLAG := 'Y';
2580         l_amount := null;
2581 
2582         FOR l_Count IN 1..P_REVERSE_TBL.count LOOP
2583 
2584             if l_trx_tbl(l_Count1) = P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID then
2585 
2586                 if P_REVERSE_TBL(l_Count).CUSTOMER_TRX_LINE_ID is null then
2587                     l_amount := -P_REVERSE_TBL(l_Count).TRX_AMOUNT;
2588                     l_LINE_CREDIT_FLAG := 'N';
2589                     exit;
2590                 else
2591                     l_Count2 := l_Count2 + 1;
2592                     l_Count4 := l_Count;
2593                     l_cm_line_tbl(l_Count2).customer_trx_line_id := P_REVERSE_TBL(l_Count).CUSTOMER_TRX_LINE_ID;
2594                     l_cm_line_tbl(l_Count2).extended_amount := -P_REVERSE_TBL(l_Count).TRX_AMOUNT;
2595                     l_cm_line_tbl(l_Count2).quantity_credited := 1;
2596                     l_cm_line_tbl(l_Count2).price := -P_REVERSE_TBL(l_Count).TRX_AMOUNT;
2597 
2598                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding a line to cm_line_tbl:');
2599                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').customer_trx_line_id: ' || l_cm_line_tbl(l_Count2).customer_trx_line_id);
2600                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').extended_amount: ' || l_cm_line_tbl(l_Count2).extended_amount);
2601                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').quantity_credited: ' || l_cm_line_tbl(l_Count2).quantity_credited);
2602                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').price: ' || l_cm_line_tbl(l_Count2).price);
2603                 end if;
2604             end if;
2605 
2606         END LOOP;
2607 
2608         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST for trx ' || l_trx_tbl(l_Count1));
2609         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_LINE_CREDIT_FLAG = ' || l_LINE_CREDIT_FLAG);
2610         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_amount = ' || l_amount);
2611         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl.count = ' || l_cm_line_tbl.count);
2612         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_batch_source_name = ' || l_cm_batch_source_name);
2613 
2614         begin
2615             AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST(
2616                     P_API_VERSION => 1.0,
2617                     P_INIT_MSG_LIST	=> FND_API.G_TRUE,
2618                     P_COMMIT => FND_API.G_FALSE,
2619                     P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
2620                     P_CUSTOMER_TRX_ID => l_trx_tbl(l_Count1),
2621                     P_LINE_CREDIT_FLAG => l_LINE_CREDIT_FLAG,
2622                     p_line_amount => l_amount,
2623                     P_CM_REASON_CODE => 'CANCELLATION',
2624                     p_cm_line_tbl => l_cm_line_tbl,
2625                     P_SKIP_WORKFLOW_FLAG => 'Y',
2626                     P_CREDIT_METHOD_INSTALLMENTS => null,
2627                     P_CREDIT_METHOD_RULES => null,
2628                     P_BATCH_SOURCE_NAME => l_cm_batch_source_name,
2629                     P_ORG_ID => P_REVERSE_TBL(l_Count4).ORG_ID,
2630                     X_REQUEST_ID => l_request_id,
2631                     X_RETURN_STATUS	=> l_return_status,
2632                     X_MSG_COUNT => l_msg_count,
2633                     X_MSG_DATA => l_msg_data);
2634 
2635         EXCEPTION
2636             WHEN OTHERS THEN
2637                 LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: ' || sqlerrm);
2638                 RAISE FND_API.G_EXC_ERROR;
2639         end;
2640 
2641         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2642         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2643         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_request_id: ' || l_request_id);
2644 
2645         IF l_return_status = fnd_api.g_ret_sts_error OR l_return_status = fnd_api.g_ret_sts_unexp_error OR
2646            l_request_id is null OR l_request_id = -1
2647 
2648         THEN
2649 
2650 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST raised unexpected error: ' || substr(l_msg_data,1,225));
2651         	FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_CM_FAIL');
2652         	FND_MESSAGE.SET_TOKEN('BATCH', l_cm_batch_source_name);
2653     		FND_MSG_PUB.Add;
2654             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2655             RAISE FND_API.G_EXC_ERROR;
2656 
2657         ELSE
2658 
2659             if l_msg_data is not null then
2660                 g_cr_return_status := 'WARNING';
2661             end if;
2662 
2663             LogMessage(FND_LOG.LEVEL_STATEMENT, 'CM successfully created!') ;
2664 
2665 
2666         END IF;
2667 
2668     END LOOP;
2669 
2670     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2671 END;
2672 
2673 
2674 
2675 /*========================================================================
2676  | PRIVATE PROCEDURE APPLY_RECEIPT
2677  |
2678  | DESCRIPTION
2679  |      This procedure applies cash receipt to invoice.
2680  |
2681  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2682  |      CREATE_SINGLE_OFFCYCLE_BILL
2683  |
2684  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2685  |      LogMessage
2686  |
2687  | PARAMETERS
2688  |      P_CASH_RECEIPT_ID   IN      Cash receipt to apply
2689  |      P_TRX_ID            IN      Apply receipt to this trx
2690  |      P_TRX_LINE_ID       IN      Apply receipt to this trx line
2691  |      P_APPLY_AMOUNT      IN      Apply amount
2692  |
2693  | KNOWN ISSUES
2694  |      None
2695  |
2696  | NOTES
2697  |      Any interesting aspect of the code in the package body which needs
2698  |      to be stated.
2699  |
2700  | MODIFICATION HISTORY
2701  | Date                  Author            Description of Changes
2702  | 01-01-2004            scherkas          Created
2703  |
2704  *=======================================================================*/
2705 PROCEDURE APPLY_RECEIPT(P_CASH_RECEIPT_ID   IN      NUMBER,
2706                         P_TRX_ID            IN      NUMBER,
2707                         P_TRX_LINE_ID       IN      NUMBER,
2708                         P_APPLY_AMOUNT      IN      NUMBER)
2709 IS
2710 
2711 /*-----------------------------------------------------------------------+
2712  | Local Variable Declarations and initializations                       |
2713  +-----------------------------------------------------------------------*/
2714 
2715     l_api_name                      CONSTANT VARCHAR2(30) := 'APPLY_RECEIPT';
2716     l_return_status                 VARCHAR2(1);
2717     l_msg_count                     NUMBER;
2718     l_msg_data                      VARCHAR2(32767);
2719     l_receipt_rem_amount            number;
2720 
2721 /*-----------------------------------------------------------------------+
2722  | Cursor Declarations                                                   |
2723  +-----------------------------------------------------------------------*/
2724 
2725     CURSOR receipt_cur(P_RECEIPT_ID number) IS
2726         select ABS(AMOUNT_DUE_REMAINING)
2727         from ar_payment_schedules
2728         where CASH_RECEIPT_ID = P_RECEIPT_ID
2729         and status = 'OP'
2730         and class = 'PMT';
2731 
2732 BEGIN
2733 
2734     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2735     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Applying cash receipt ' || P_CASH_RECEIPT_ID);
2736 
2737     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input data:');
2738     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_CASH_RECEIPT_ID: ' || P_CASH_RECEIPT_ID);
2739     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_TRX_ID: ' || P_TRX_ID);
2740     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_TRX_LINE_ID: ' || P_TRX_LINE_ID);
2741     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_APPLY_AMOUNT: ' || P_APPLY_AMOUNT);
2742 
2743     /* verify input data */
2744 
2745     if P_CASH_RECEIPT_ID is null then
2746 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cash Receipt ID is not set.');
2747     	FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_NOT_SET');
2748 		FND_MSG_PUB.Add;
2749         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2750         RAISE FND_API.G_EXC_ERROR;
2751     end if;
2752 
2753     if P_TRX_ID is null then
2754 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Trx ID is not set.');
2755     	FND_MESSAGE.SET_NAME('LNS', 'LNS_TRX_NOT_SET');
2756 		FND_MSG_PUB.Add;
2757         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2758         RAISE FND_API.G_EXC_ERROR;
2759     end if;
2760 
2761     if P_TRX_LINE_ID is null then
2762 --        LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Trx Line ID is not set.');
2763     	FND_MESSAGE.SET_NAME('LNS', 'LNS_TRX_LINE_NOT_SET');
2764 		FND_MSG_PUB.Add;
2765         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2766         RAISE FND_API.G_EXC_ERROR;
2767     end if;
2768 
2769     if P_APPLY_AMOUNT is null or P_APPLY_AMOUNT <= 0 then
2770 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Apply Amount is not set.');
2771     	FND_MESSAGE.SET_NAME('LNS', 'LNS_AMOUNT_NOT_SET');
2772 		FND_MSG_PUB.Add;
2773         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2774         RAISE FND_API.G_EXC_ERROR;
2775     end if;
2776 
2777     /* verifying requested qpply amount */
2778 
2779     open receipt_cur(P_CASH_RECEIPT_ID);
2780     fetch receipt_cur into l_receipt_rem_amount;
2781 
2782     if receipt_cur%NOTFOUND then
2783 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No receipt found to apply.');
2784     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CR_FOUND');
2785 		FND_MSG_PUB.Add;
2786         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2787         RAISE FND_API.G_EXC_ERROR;
2788     end if;
2789 
2790     close receipt_cur;
2791 
2792     if l_receipt_rem_amount < P_APPLY_AMOUNT then
2793 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The receipt does not have enough funds to apply requested amount.');
2794     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CR_FUNDS');
2795 		FND_MSG_PUB.Add;
2796         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2797         RAISE FND_API.G_EXC_ERROR;
2798     end if;
2799 
2800     /* Applying cash receipt to invoice */
2801 /*
2802     AR_RECEIPT_API_PUB.APPLY(
2803         P_API_VERSION => 1.0,
2804         P_INIT_MSG_LIST => FND_API.G_FALSE,
2805         P_COMMIT => FND_API.G_TRUE,
2806         X_RETURN_STATUS => L_RETURN_STATUS,
2807         X_MSG_COUNT => L_MSG_COUNT,
2808         X_MSG_DATA => L_MSG_DATA,
2809         p_cash_receipt_id => P_CASH_RECEIPT_ID,
2810         p_customer_trx_id => P_TRX_ID,
2811         p_amount_applied => P_APPLY_AMOUNT,
2812         p_customer_trx_line_id => P_TRX_LINE_ID);
2813 */
2814     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2815     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2816 
2817     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2818 
2819 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: AR_RECEIPT_API_PUB.APPLY raised error: ' || substr(l_msg_data,1,225));
2820     	FND_MESSAGE.SET_NAME('LNS', 'LNS_APPL_CR_FAIL');
2821 		FND_MSG_PUB.Add;
2822         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2823         RAISE FND_API.G_EXC_ERROR;
2824 
2825     ELSE
2826         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully applied cash receipt to trx ' || P_TRX_ID || ' line ' || P_TRX_LINE_ID);
2827     END IF;
2828 
2829     -- END OF BODY OF API
2830 
2831     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2832 
2833 EXCEPTION
2834     WHEN OTHERS THEN
2835         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to apply cash receipt to trx ' || P_TRX_ID || ' line ' || P_TRX_LINE_ID);
2836 
2837 END;
2838 
2839 
2840 
2841 
2842 /*========================================================================
2843  | PRIVATE PROCEDURE CREATE_AR_ADJ
2844  |
2845  | DESCRIPTION
2846  |      This procedure creates AR adjustment.
2847  |
2848  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2849  |      CREATE_SINGLE_OFFCYCLE_BILL
2850  |
2851  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2852  |      LogMessage
2853  |
2854  | PARAMETERS
2855  |      P_TYPE                  IN      Adjustment type
2856  |      P_PAYMENT_SCHEDULE_ID   IN      Payment schedule ID
2857  |      P_RECEIVABLES_TRX_ID    IN      Receivables trx ID
2858  |      P_AMOUNT                IN      Adjust amount
2859  |      P_CUSTOMER_TRX_LINE_ID  IN      Trx line ID
2860  |      P_CODE_COMBINATION_ID   IN      Code combination ID
2861  |      P_USSGL_TRX_CODE        IN      USSGL Trx code
2862  |      P_REASON_CODE           IN      Adjust reason
2863  |      P_COMMENTS              IN      Adjust comments
2864  |      X_ADJ_ID                OUT     Adjust comments
2865  |      X_ADJ_NUMBER            OUT     Adjust comments
2866  |
2867  | KNOWN ISSUES
2868  |      None
2869  |
2870  | NOTES
2871  |      Any interesting aspect of the code in the package body which needs
2872  |      to be stated.
2873  |
2874  | MODIFICATION HISTORY
2875  | Date                  Author            Description of Changes
2876  | 03-16-2006            karamach          Always pass INVOICE for adjustment type and also pass p_check_amount 'F' to fix bug5092620 when adjusting invoice with Tax/Freight/Charges
2877  | 01-01-2004            scherkas          Created
2878  |
2879  *=======================================================================*/
2880 PROCEDURE CREATE_AR_ADJ(P_TYPE                  IN  VARCHAR2,
2881                         P_PAYMENT_SCHEDULE_ID   IN  NUMBER,
2882                         P_RECEIVABLES_TRX_ID    IN  NUMBER,
2883                         P_AMOUNT                IN  NUMBER,
2884                         P_APPLY_DATE            IN  DATE,
2885                         P_GL_DATE               IN  DATE,
2886                         P_CUSTOMER_TRX_LINE_ID  IN  NUMBER,
2887                         P_CODE_COMBINATION_ID   IN  NUMBER,
2888                         P_USSGL_TRX_CODE        IN  VARCHAR2,
2889                         P_REASON_CODE           IN  VARCHAR2,
2890                         P_COMMENTS              IN  VARCHAR2,
2891                         X_ADJ_ID                OUT NOCOPY NUMBER,
2892                         X_ADJ_NUMBER            OUT NOCOPY VARCHAR2,
2893                         P_ORG_ID                IN  NUMBER)
2894 IS
2895 
2896 /*-----------------------------------------------------------------------+
2897  | Local Variable Declarations and initializations                       |
2898  +-----------------------------------------------------------------------*/
2899 
2900     l_api_name                      CONSTANT VARCHAR2(30) := 'CREATE_AR_ADJ';
2901     l_return_status                 VARCHAR2(1);
2902     l_msg_count                     NUMBER;
2903     l_msg_data                      VARCHAR2(32767);
2904     l_adj_rec                       ar_adjustments%rowtype;
2905     l_adj_num                       varchar2(20);
2906     l_adj_id                        number;
2907     l_index                         number := 0;
2908     l_indexNo                       number := 1;
2909     l_msg                           varchar2(4000) := null;
2910 
2911 /*-----------------------------------------------------------------------+
2912  | Cursor Declarations                                                   |
2913  +-----------------------------------------------------------------------*/
2914 
2915 
2916 BEGIN
2917 
2918     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2919     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adjusting invoice...');
2920 
2921     if P_AMOUNT < 0 then
2922         l_adj_rec.type := 'INVOICE'; --P_TYPE; --karamach Bug5092620
2923     else
2924         l_adj_rec.type := P_TYPE;
2925     end if;
2926 
2927     l_adj_rec.payment_schedule_id := P_PAYMENT_SCHEDULE_ID;
2928     l_adj_rec.RECEIVABLES_TRX_ID := P_RECEIVABLES_TRX_ID;
2929     l_adj_rec.apply_date := P_APPLY_DATE;
2930     l_adj_rec.gl_date := P_GL_DATE;
2931     l_adj_rec.created_from := G_PKG_NAME;
2932     l_adj_rec.amount := P_AMOUNT;
2933     l_adj_rec.customer_trx_line_id := P_CUSTOMER_TRX_LINE_ID;
2934     l_adj_rec.code_combination_id := P_CODE_COMBINATION_ID;
2935     --l_adj_rec.ussgl_transaction_code := P_USSGL_TRX_CODE;
2936     l_adj_rec.reason_code := P_REASON_CODE;
2937     l_adj_rec.comments := P_COMMENTS;
2938     l_adj_rec.org_id := P_ORG_ID;
2939 
2940     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE...');
2941     LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
2942             p_gl_date => P_GL_DATE,
2943             p_trx_date => P_APPLY_DATE,
2944             p_set_of_books_id => g_set_of_books_id,
2945             x_default_gl_date => l_adj_rec.gl_date);
2946 
2947     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Sending following data to adjustment api:');
2948     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.type: ' || l_adj_rec.type);
2949     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.payment_schedule_id: ' || l_adj_rec.payment_schedule_id);
2950     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.RECEIVABLES_TRX_ID: ' || l_adj_rec.RECEIVABLES_TRX_ID);
2951     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.apply_date: ' || l_adj_rec.apply_date);
2952     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.gl_date: ' || l_adj_rec.gl_date);
2953     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.created_from: ' || l_adj_rec.created_from);
2954     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.amount: ' || l_adj_rec.amount);
2955     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.customer_trx_line_id: ' || l_adj_rec.customer_trx_line_id);
2956     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.code_combination_id: ' || l_adj_rec.code_combination_id);
2957     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.ussgl_transaction_code: ' || l_adj_rec.ussgl_transaction_code);
2958     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.reason_code: ' || l_adj_rec.reason_code);
2959     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.comments: ' || l_adj_rec.comments);
2960     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.org_id: ' || l_adj_rec.org_id);
2961 
2962     /* Adjusting invoice */
2963 
2964     AR_ADJUST_PUB.Create_Adjustment(
2965         p_api_name => 'AR_ADJUST_PUB',
2966         p_api_version => 1.0,
2967         p_init_msg_list => FND_API.G_TRUE,
2968         p_commit_flag => FND_API.G_FALSE,
2969         p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2970         p_msg_count => l_msg_count,
2971         p_msg_data => l_msg_data,
2972         p_return_status => l_return_status,
2973         p_adj_rec => l_adj_rec,
2974         p_chk_approval_limits => 'F',
2975         p_check_amount => 'F', --karamach Bug5092620
2976         p_new_adjust_number => l_adj_num,
2977         p_new_adjust_id => l_adj_id,
2978         p_org_id => P_ORG_ID);
2979 
2980 
2981     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2982     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_id: ' || l_adj_id);
2983     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_num: ' || l_adj_num);
2984 
2985     IF l_return_status <> FND_API.G_RET_STS_SUCCESS or
2986         l_adj_id is null or
2987         l_adj_num is null
2988     THEN
2989         FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_ADJ_FAIL');
2990         if l_return_status = FND_API.G_RET_STS_SUCCESS and l_adj_id is null then
2991 		    FND_MESSAGE.SET_TOKEN('REASON', 'new_adjust_id is null');
2992         elsif l_return_status = FND_API.G_RET_STS_SUCCESS and l_adj_num is null then
2993 		    FND_MESSAGE.SET_TOKEN('REASON', 'new_adjust_number is null');
2994         else
2995 		    FND_MESSAGE.SET_TOKEN('REASON', 'unknown');
2996         end if;
2997         FND_MSG_PUB.Add;
2998         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2999 
3000         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_count: ' || l_msg_count);
3001         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
3002 
3003         while (l_indexNo <= l_msg_Count ) loop
3004             fnd_msg_pub.get(l_indexNo, 'F', l_msg, l_index);
3005             LogMessage(FND_LOG.LEVEL_ERROR, 'Error: ' || l_msg);
3006             l_indexNo := l_indexNo + 1;
3007         End Loop;
3008 
3009         RAISE FND_API.G_EXC_ERROR;
3010 
3011     END IF;
3012 
3013     X_ADJ_ID := l_adj_id;
3014     X_ADJ_NUMBER := l_adj_num;
3015 
3016     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3017 
3018 END;
3019 
3020 
3021 
3022 
3023 /*========================================================================
3024  | PRIVATE PROCEDURE BUILD_ERROR_STATEMENT
3025  |
3026  | DESCRIPTION
3027  |      This procedure builds error statement.
3028  |
3029  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3030  |
3031  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3032  |      LogMessage
3033  |
3034  | PARAMETERS
3035  |       P_BORROWER_ID         IN             Bborrower ID
3036  |       P_LOAN_ID             IN             Loans ID
3037  |       P_FROM_DAYS_TO_DD     IN             From days
3038  |       P_TO_DAYS_TO_DD       IN             To days
3039  |       X_REPORT_XML          OUT NOCOPY     Return full report xml
3040  |
3041  | KNOWN ISSUES
3042  |      None
3043  |
3044  | NOTES
3045  |      Any interesting aspect of the code in the package body which needs
3046  |      to be stated.
3047  |
3048  | MODIFICATION HISTORY
3049  | Date                  Author            Description of Changes
3050  | 04-21-2005            scherkas          Created
3051  |
3052  *=======================================================================*/
3053 PROCEDURE BUILD_ERROR_STATEMENT(
3054         P_LOAN_ID           IN              NUMBER,
3055         P_PAYMENT_NUMBER    IN              NUMBER,
3056         P_PRIN_AMOUNT_DUE   IN              NUMBER,
3057         P_INT_AMOUNT_DUE    IN              NUMBER,
3058         P_FEE_AMOUNT_DUE    IN              NUMBER,
3059         P_DUE_DATE          IN              DATE,
3060         P_ERR_COUNT			IN              NUMBER,
3061         X_STATEMENT_XML     OUT NOCOPY      CLOB)
3062 IS
3063 
3064 /*-----------------------------------------------------------------------+
3065  | Local Variable Declarations and initializations                       |
3066  +-----------------------------------------------------------------------*/
3067 
3068     l_api_name          CONSTANT VARCHAR2(30) := 'BUILD_ERROR_STATEMENT';
3069     l_new_line          varchar2(1);
3070     l_statement         varchar2(2000);
3071     l_borrower          VARCHAR2(360);
3072     l_loan              VARCHAR2(60);
3073     l_currency          VARCHAR2(15);
3074     l_f_prin_amount     varchar2(50);
3075     l_f_int_amount      varchar2(50);
3076     l_f_fee_amount      varchar2(50);
3077     l_f_sum_amount      varchar2(50);
3078     l_index             number;
3079     l_indexNo           number;
3080     l_error             varchar2(500);
3081 /*-----------------------------------------------------------------------+
3082  | Cursor Declarations                                                   |
3083  +-----------------------------------------------------------------------*/
3084 
3085     /* query for loan number and borrower name */
3086     CURSOR loan_cur(P_LOAN_ID number, P_PRIN_AMOUNT_DUE number, P_INT_AMOUNT_DUE number, P_FEE_AMOUNT_DUE number) IS
3087         select party.party_name,
3088         loan.loan_number,
3089         loan.LOAN_CURRENCY,
3090         to_char(P_PRIN_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
3091         to_char(P_INT_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
3092         to_char(P_FEE_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
3093         to_char((P_PRIN_AMOUNT_DUE + P_INT_AMOUNT_DUE + P_FEE_AMOUNT_DUE), FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50))
3094         from lns_loan_headers loan,
3095         hz_parties party
3096         where party.party_id = loan.PRIMARY_BORROWER_ID and
3097         loan.loan_id = P_LOAN_ID;
3098 
3099 BEGIN
3100 
3101     l_index := 0;
3102     l_indexNo := 1;
3103     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
3104     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3105 
3106     l_new_line := '
3107 ';
3108 
3109     /* query for loan number and borrower name */
3110     open loan_cur(P_LOAN_ID, P_PRIN_AMOUNT_DUE, P_INT_AMOUNT_DUE, P_FEE_AMOUNT_DUE);
3111     fetch loan_cur into l_borrower, l_loan, l_currency, l_f_prin_amount, l_f_int_amount, l_f_fee_amount, l_f_sum_amount;
3112     close loan_cur;
3113     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_borrower: ' || l_borrower);
3114     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan: ' || l_loan);
3115 
3116     /* build error */
3117     l_statement := '<LOAN>';
3118     l_statement := l_statement || l_new_line || '<LOAN_ID>' || P_LOAN_ID || '</LOAN_ID>';
3119     l_statement := l_statement || l_new_line || '<BILL_DATE>' || sysdate || '</BILL_DATE>';
3120     l_statement := l_statement || l_new_line || '<LOAN_NUMBER>' || l_loan || '</LOAN_NUMBER>';
3121     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_NUMBER>' || P_PAYMENT_NUMBER || '</NEXT_PAYMENT_NUMBER>';
3122     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_DUE_DATE>' || P_DUE_DATE || '</NEXT_PAYMENT_DUE_DATE>';
3123     l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_PRINCIPAL_DUE>' || l_f_prin_amount || '</F_NEXT_PAYMENT_PRINCIPAL_DUE>';
3124     l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_INTEREST_DUE>' || l_f_int_amount || '</F_NEXT_PAYMENT_INTEREST_DUE>';
3125     l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_FEE_DUE>' || l_f_fee_amount || '</F_NEXT_PAYMENT_FEE_DUE>';
3126     l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_TOTAL_DUE>' || l_f_sum_amount || '</F_NEXT_PAYMENT_TOTAL_DUE>';
3127     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_PRINCIPAL_DUE>' || P_PRIN_AMOUNT_DUE || '</NEXT_PAYMENT_PRINCIPAL_DUE>';
3128     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_INTEREST_DUE>' || P_INT_AMOUNT_DUE || '</NEXT_PAYMENT_INTEREST_DUE>';
3129     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_FEE_DUE>' || P_FEE_AMOUNT_DUE || '</NEXT_PAYMENT_FEE_DUE>';
3130     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_TOTAL_DUE>' || (P_PRIN_AMOUNT_DUE + P_INT_AMOUNT_DUE + P_FEE_AMOUNT_DUE) || '</NEXT_PAYMENT_TOTAL_DUE>';
3131     l_statement := l_statement || l_new_line || '<BORROWER_NAME>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_borrower) || '</BORROWER_NAME>';
3132     l_statement := l_statement || l_new_line || '<LOAN_CURRENCY_CODE>' || l_currency || '</LOAN_CURRENCY_CODE>';
3133 
3134     l_statement := l_statement || l_new_line || '<ERROR>' || l_new_line;
3135     while (l_indexNo <= P_ERR_COUNT ) loop
3136         fnd_msg_pub.get(l_indexNo, 'F', l_error, l_index);
3137         l_error := LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_error);
3138         l_statement := l_statement || l_error;
3139         l_indexNo := l_indexNo + 1;
3140     End Loop;
3141     l_statement := l_statement || '</ERROR>';
3142 
3143     l_statement := l_statement || l_new_line || '</LOAN>';
3144     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_statement: ' || l_statement);
3145 
3146     /* init statement xml */
3147     DBMS_LOB.createtemporary(X_STATEMENT_XML, FALSE, DBMS_LOB.CALL);
3148     DBMS_LOB.open(X_STATEMENT_XML, DBMS_LOB.lob_readwrite);
3149 
3150     /* building clob */
3151     DBMS_LOB.write(X_STATEMENT_XML, length(l_statement), 1, l_statement);
3152 
3153     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3154 
3155 EXCEPTION
3156     WHEN OTHERS THEN
3157         LogMessage(FND_LOG.LEVEL_ERROR, 'Failed to generate error statement for loan ' || l_loan);
3158 END;
3159 
3160 
3161 
3162 
3163 /*========================================================================
3164  | PRIVATE PROCEDURE BUILD_BILLING_REPORT
3165  |
3166  | DESCRIPTION
3167  |      This procedure builds billing report.
3168  |
3169  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3170  |
3171  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3172  |      LogMessage
3173  |
3174  | PARAMETERS
3175  |       P_TYPE_ID             IN             Loan type ID
3176  |       P_PRODUCT_ID          IN             Loan product ID
3177  |       P_BORROWER_ID         IN             Bborrower ID
3178  |       P_LOAN_ID             IN             Loans ID
3179  |       P_FROM_DAYS_TO_DD     IN             From days
3180  |       P_TO_DAYS_TO_DD       IN             To days
3181  |       X_REPORT_XML          OUT NOCOPY     Return full report xml
3182  |
3183  | KNOWN ISSUES
3184  |      None
3185  |
3186  | NOTES
3187  |      Any interesting aspect of the code in the package body which needs
3188  |      to be stated.
3189  |
3190  | MODIFICATION HISTORY
3191  | Date                  Author            Description of Changes
3192  | 04-21-2005            scherkas          Created
3193  |
3194  *=======================================================================*/
3195 PROCEDURE BUILD_BILLING_REPORT(
3196         P_TYPE_ID             IN             NUMBER,
3197         P_PRODUCT_ID          IN             NUMBER,
3198         P_BORROWER_ID         IN             NUMBER,
3199         P_LOAN_ID             IN             NUMBER,
3200         P_FROM_DAYS_TO_DD     IN             NUMBER,
3201         P_TO_DAYS_TO_DD       IN             NUMBER,
3202         P_STATEMENTS_XML      IN             CLOB)
3203 IS
3204 
3205 /*-----------------------------------------------------------------------+
3206  | Local Variable Declarations and initializations                       |
3207  +-----------------------------------------------------------------------*/
3208 
3209     l_api_name      CONSTANT VARCHAR2(30) := 'BUILD_BILLING_REPORT';
3210     l_new_line      varchar2(1);
3211     l_header        varchar2(1000);
3212     l_footer        varchar2(100);
3213     l_parameters    varchar2(1000);
3214     l_borrower      VARCHAR2(360);
3215     l_loan          VARCHAR2(60);
3216     l_from_days     varchar2(50);
3217     l_to_days       varchar2(50);
3218     l_org_name      VARCHAR2(240);
3219     l_from_days_date varchar2(100);
3220     l_to_days_date  varchar2(100);
3221     l_product       varchar2(80);
3222     l_type          varchar2(80);
3223 /*-----------------------------------------------------------------------+
3224  | Cursor Declarations                                                   |
3225  +-----------------------------------------------------------------------*/
3226 
3227     /* query for borrower name */
3228     CURSOR borrower_cur(P_BORROWER_ID number) IS
3229     select party_name from hz_parties party where party_id = P_BORROWER_ID;
3230 
3231     /* query for loan number */
3232     CURSOR loan_cur(P_LOAN_ID number) IS
3233     select loan_number from lns_loan_headers where loan_id = P_LOAN_ID;
3234 
3235     /* query for org name */
3236     CURSOR org_cur(P_ORG_ID number) IS
3237     select name
3238     from hr_all_organization_units_tl
3239     where ORGANIZATION_ID = P_ORG_ID and
3240     language(+) = userenv('LANG');
3241 
3242     /* query for loan product name */
3243     CURSOR loan_product_cur(P_PRODUCT_ID number) IS
3244     select LOAN_PRODUCT_NAME from lns_loan_products_vl where LOAN_PRODUCT_ID = P_PRODUCT_ID;
3245 
3246     /* query for loan type name */
3247     CURSOR loan_type_cur(P_TYPE_ID number) IS
3248     select LOAN_TYPE_NAME from LNS_LOAN_TYPES_VL where LOAN_TYPE_ID = P_TYPE_ID;
3249 
3250 BEGIN
3251 
3252     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
3253     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3254 
3255     /* init report clob */
3256     dbms_lob.createtemporary(g_last_billing_report, FALSE, DBMS_LOB.CALL);
3257     dbms_lob.open(g_last_billing_report, dbms_lob.lob_readwrite);
3258 
3259     l_new_line := '
3260 ';
3261     l_header := '<?xml version="1.0" encoding="UTF-8"?>' || l_new_line || '<BILLBATCH>';
3262     l_footer := l_new_line || '</BILLBATCH>' || l_new_line;
3263     l_parameters := l_new_line || '<PARAMETERS>';
3264 
3265     /* adding org name to parameter list */
3266     open org_cur(g_org_id);
3267     fetch org_cur into l_org_name;
3268     close org_cur;
3269     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_org_name: ' || l_org_name);
3270     l_parameters := l_parameters || l_new_line || '<ORG_NAME>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_org_name) || '</ORG_NAME>';
3271 
3272     /* adding loan type to parameter list */
3273     if P_TYPE_ID is not null then
3274         open loan_type_cur(P_TYPE_ID);
3275         fetch loan_type_cur into l_type;
3276         close loan_type_cur;
3277     end if;
3278     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_type: ' || l_type);
3279     l_parameters := l_parameters || l_new_line || '<LOAN_TYPE>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_type) || '</LOAN_TYPE>';
3280 
3281     /* adding loan product to parameter list */
3282     if P_PRODUCT_ID is not null then
3283         open loan_product_cur(P_PRODUCT_ID);
3284         fetch loan_product_cur into l_product;
3285         close loan_product_cur;
3286     end if;
3287     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_product: ' || l_product);
3288     l_parameters := l_parameters || l_new_line || '<LOAN_PRODUCT>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_product) || '</LOAN_PRODUCT>';
3289 
3290     /* adding borrower to parameter list */
3291     if P_BORROWER_ID is not null then
3292         open borrower_cur(P_BORROWER_ID);
3293         fetch borrower_cur into l_borrower;
3294         close borrower_cur;
3295     end if;
3296     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_borrower: ' || l_borrower);
3297     l_parameters := l_parameters || l_new_line || '<BORROWER_NAME>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_borrower) || '</BORROWER_NAME>';
3298 
3299     /* adding loan to parameter list */
3300     if P_LOAN_ID is not null then
3301         open loan_cur(P_LOAN_ID);
3302         fetch loan_cur into l_loan;
3303         close loan_cur;
3304     end if;
3305     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan: ' || l_loan);
3306     l_parameters := l_parameters || l_new_line || '<LOAN_NUMBER>' || l_loan || '</LOAN_NUMBER>';
3307 
3308     /* adding from days to parameter list */
3309     if P_FROM_DAYS_TO_DD is not null then
3310         l_from_days := P_FROM_DAYS_TO_DD;
3311 	l_from_days_date := GET_BILLING_DATE(P_FROM_DAYS_TO_DD);
3312     end if;
3313     l_parameters := l_parameters || l_new_line || '<FROM_DAYS_TO_DD>' || l_from_days || '  -  ' || '</FROM_DAYS_TO_DD>';
3314     --Added as part of International Calender Support
3315     l_parameters := l_parameters || l_new_line || '<FROM_DAYS_TO_DD_DATE>' || l_from_days_date || '</FROM_DAYS_TO_DD_DATE>';
3316     l_parameters := l_parameters || l_new_line || '<REPORT_GENERATION_DATE>' || to_char(sysdate,'YYYY-MM-DD') || '</REPORT_GENERATION_DATE>';
3317 
3318     /* adding to days to parameter list */
3319     if P_TO_DAYS_TO_DD is not null then
3320         l_to_days := P_TO_DAYS_TO_DD;
3321 	l_to_days_date := GET_BILLING_DATE(P_TO_DAYS_TO_DD);
3322     end if;
3323     l_parameters := l_parameters || l_new_line || '<TO_DAYS_TO_DD>' || l_to_days || '  -  ' || '</TO_DAYS_TO_DD>';
3324     --Added as part of International Calender Support
3325     l_parameters := l_parameters || l_new_line || '<TO_DAYS_TO_DD_DATE>' || l_to_days_date || '</TO_DAYS_TO_DD_DATE>';
3326     l_parameters := l_parameters || l_new_line || '</PARAMETERS>' || l_new_line;
3327     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_parameters: ' || l_parameters);
3328 
3329 
3330     /* add header to billing report */
3331     DBMS_LOB.write(g_last_billing_report, length(l_header), 1, l_header);
3332     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added header to report');
3333 
3334     /* add parameters to billing report */
3335     dbms_lob.writeAppend(g_last_billing_report, length(l_parameters), l_parameters);
3336     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added parameters to report');
3337 
3338     /* add all statements to billing report */
3339     if dbms_lob.getlength(P_STATEMENTS_XML) > 0 then
3340         DBMS_LOB.Append(g_last_billing_report, P_STATEMENTS_XML);
3341         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added statements to report');
3342     end if;
3343 
3344     /* add footer to billing report */
3345     dbms_lob.writeAppend(g_last_billing_report, length(l_footer), l_footer);
3346     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added footer to report');
3347 
3348     /* print report to output file */
3349     LNS_REP_UTILS.PRINT_CLOB(g_last_billing_report);  -- fix for bug 6938098
3350     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Printed report into output file.');
3351 
3352     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3353 
3354 EXCEPTION
3355     WHEN OTHERS THEN
3356         LogMessage(FND_LOG.LEVEL_ERROR, 'Failed to generate billing report');
3357         g_cr_return_status := 'WARNING';
3358 END;
3359 
3360 
3361 
3362 /*========================================================================
3363  | PUBLIC PROCEDURE GENERATE_BILLING_STATEMENT_XML
3364  |
3365  | DESCRIPTION
3366  |      This procedure creates the billing statement xml for single loan
3367  |
3368  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3369  |      BILL_SINGLE_LOAN
3370  |
3371  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3372  |      LogMessage
3373  |
3374  | PARAMETERS
3375  |      P_LOAN_ID IN NUMBER
3376  |      P_AMORTIZATION_SCHEDULE_ID IN NUMBER
3377  | KNOWN ISSUES
3378  |      None
3379  |
3380  | NOTES
3381  |      Any interesting aspect of the code in the package body which needs
3382  |      to be stated.
3383  |
3384  | MODIFICATION HISTORY
3385  | Date                  Author            Description of Changes
3386  | 04-24-2004            karamach          Created
3387  | 05-04-2004            scherkas          Modified
3388  | 06-19-2004            karamach          Changed to use DBMS_XMLQUERY (8i pkg) instead of DBMS_XMLGEN (9i pkg)
3389  |					   to be compatible with the supported Oracle database version 8.1.7.4
3390  |					   and avoid 9i dependency
3391  | 06-21-2006            karamach          Added cursor c_get_currency_format_mask and changed query to improve performance to fix bug5264818
3392  |
3393  *=======================================================================*/
3394 PROCEDURE GENERATE_BILLING_STATEMENT_XML(p_loan_id IN NUMBER,
3395                                          p_amortization_schedule_id IN NUMBER) IS
3396 
3397 /*-----------------------------------------------------------------------+
3398  | Local Variable Declarations and initializations                       |
3399  +-----------------------------------------------------------------------*/
3400 
3401     l_api_name                      CONSTANT VARCHAR2(30) := 'GENERATE_BILLING_STATEMENT_XML';
3402     qry_string                      Varchar2(12000);
3403 --    qryCtx                          DBMS_XMLGEN.ctxHandle;
3404     qryCtx                          DBMS_XMLQuery.ctxType;
3405     result                          CLOB;
3406     l_current_phase                 varchar2(30);
3407     l_currency_format_mask          varchar2(4000);
3408 /*-----------------------------------------------------------------------+
3409  | Cursor Declarations                                                   |
3410  +-----------------------------------------------------------------------*/
3411 
3412  CURSOR c_get_currency_format_mask(pLoanId Number) is
3413  select FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50) mask
3414  from lns_loan_headers_all loan
3415  where loan.loan_id = pLoanId;
3416 
3417 BEGIN
3418 
3419     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3420 
3421     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting Currency Format Mask for loan');
3422     OPEN c_get_currency_format_mask(p_loan_id);
3423     FETCH c_get_currency_format_mask INTO l_currency_format_mask;
3424     CLOSE c_get_currency_format_mask;
3425 
3426     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Generating billing statement...');
3427 
3428     qry_string := 'SELECT loan.loan_id, ' ||
3429         'PAY_SUM.next_payment_amortization_id, ' ||
3430         'to_char(sysdate, ''YYYY-MM-DD'') bill_date, ' ||
3431 	    'to_char(sysdate, ''YYYY-MM-DD'') report_generation_date, ' ||
3432         'loan.loan_number, ' ||
3433         'loan.LOAN_DESCRIPTION, ' ||
3434         'am.PAYMENT_NUMBER next_payment_number, ' ||
3435         'to_char(am.DUE_DATE, ''YYYY-MM-DD'') next_payment_due_date, ' ||
3436         'to_char(am.PRINCIPAL_AMOUNT, :CURRENCY_FORMAT1) f_next_payment_principal_due, ' ||
3437         'to_char(am.INTEREST_AMOUNT, :CURRENCY_FORMAT2) f_next_payment_interest_due, ' ||
3438         'to_char(am.FEE_AMOUNT, :CURRENCY_FORMAT3) f_next_payment_fee_due, ' ||
3439         'to_char((am.PRINCIPAL_AMOUNT+am.INTEREST_AMOUNT+am.FEE_AMOUNT), :CURRENCY_FORMAT4) f_next_payment_total_due, ' ||
3440         'am.PRINCIPAL_AMOUNT next_payment_principal_due, ' ||
3441         'am.INTEREST_AMOUNT next_payment_interest_due, ' ||
3442         'am.FEE_AMOUNT next_payment_fee_due, ' ||
3443         '(am.PRINCIPAL_AMOUNT+am.INTEREST_AMOUNT+am.FEE_AMOUNT) next_payment_total_due, ' ||
3444         'party.party_name Borrower_Name, ' ||
3445         'loc.address1 || '' '' || loc.city || '' '' || loc.state || '' '' || loc.postal_code || '' '' || terr.TERRITORY_SHORT_NAME Primary_Address, ' ||
3446         'party.jgzz_fiscal_code tax_id, ' ||
3447         'org.name operating_unit, ' ||
3448         'loan_type.loan_type_name loan_type, ' ||
3449         'loan_class.meaning loan_class, ' ||
3450         'loan.loan_term || '' '' || periodlkup.meaning loan_term, ' ||
3451         'to_char(LNS_FIN_UTILS.getActiveRate(loan.loan_id))  current_interest_rate, ' ||
3452         'to_char(loan.loan_maturity_date, ''YYYY-MM-DD'') loan_maturity_date, ' ||
3453         'to_char(PAY_SUM.total_principal_balance, :CURRENCY_FORMAT5) f_remaining_balance_amount, ' ||
3454         'to_char(PAY_SUM.principal_paid_todate, :CURRENCY_FORMAT6) f_principal_paid_todate, ' ||
3455         'to_char(PAY_SUM.interest_paid_todate, :CURRENCY_FORMAT7) f_interest_paid_todate, ' ||
3456         'to_char(PAY_SUM.fee_paid_todate, :CURRENCY_FORMAT8) f_fee_paid_todate, ' ||
3457         'to_char(PAY_SUM.total_prin_paid_todate, :CURRENCY_FORMAT9) f_total_prin_paid_todate, ' ||
3458         'to_char(PAY_SUM_YEARLY.principal_paid_ytd, :CURRENCY_FORMAT10) f_principal_paid_ytd, ' ||
3459         'to_char(PAY_SUM_YEARLY.interest_paid_ytd, :CURRENCY_FORMAT11) f_interest_paid_ytd, ' ||
3460         'to_char(PAY_SUM_YEARLY.fee_paid_ytd, :CURRENCY_FORMAT12) f_fee_paid_ytd, ' ||
3461         'to_char(PAY_SUM_OVERDUE.principal_overdue, :CURRENCY_FORMAT13) f_principal_overdue, ' ||
3462         'to_char(PAY_SUM_OVERDUE.interest_overdue, :CURRENCY_FORMAT14) f_interest_overdue, ' ||
3463         'to_char(PAY_SUM_OVERDUE.fee_overdue, :CURRENCY_FORMAT15) f_fee_overdue, ' ||
3464         'to_char(PAY_SUM_OVERDUE.total_overdue, :CURRENCY_FORMAT16) f_total_overdue, ' ||
3465         'PAY_SUM.total_principal_balance remaining_balance_amount, ' ||
3466         'PAY_SUM.principal_paid_todate principal_paid_todate, ' ||
3467         'PAY_SUM.interest_paid_todate interest_paid_todate, ' ||
3468         'PAY_SUM.fee_paid_todate fee_paid_todate, ' ||
3469         'PAY_SUM.total_prin_paid_todate total_prin_paid_todate, ' ||
3470         'PAY_SUM_YEARLY.principal_paid_ytd principal_paid_ytd, ' ||
3471         'PAY_SUM_YEARLY.interest_paid_ytd interest_paid_ytd, ' ||
3472         'PAY_SUM_YEARLY.fee_paid_ytd fee_paid_ytd, ' ||
3473         'PAY_SUM_OVERDUE.principal_overdue principal_overdue, ' ||
3474         'PAY_SUM_OVERDUE.interest_overdue interest_overdue, ' ||
3475         'PAY_SUM_OVERDUE.fee_overdue fee_overdue, ' ||
3476         'PAY_SUM_OVERDUE.total_overdue total_overdue, ' ||
3477         'PAY_SUM_OVERDUE.number_overdue_bills number_of_overdue_payments, ' ||
3478         'to_char(PAY_SUM_OVERDUE.last_overdue_date, ''YYYY-MM-DD'') last_overdue_date, ' ||
3479         'to_char(PAY_SUM_OVERDUE.last_payment_amount, :CURRENCY_FORMAT17) f_last_payment_amount, ' ||
3480         'PAY_SUM_OVERDUE.last_payment_amount last_payment_amount, ' ||
3481         'to_char(PAY_SUM_OVERDUE.last_payment_date, ''YYYY-MM-DD'') last_payment_date, ' ||
3482         '(LNS_FIN_UTILS.getNumberInstallments(loan.loan_id, nvl(loan.current_phase, ''TERM'')) - PAY_SUM.next_payment_number) remaining_number_of_payments, ' ||
3483         'contact_person.party_name PRIMARY_LOAN_CONTACT, ' ||
3484         'loan.LOAN_CURRENCY LOAN_CURRENCY_CODE, ' ||
3485         'curr.name LOAN_CURRENCY_MEANING, ' ||
3486         'loan_subtype.meaning loan_subtype, ' ||
3487         'nvl(loan.current_phase, ''TERM'') phase, ' ||
3488         'rate_type.meaning rate_type, ' ||
3489         'int_rate_hdr.INTEREST_RATE_NAME index_rate, ' ||
3490         'rate_freq.meaning floating_frequency, ' ||
3491         'pay_freq.meaning payment_frequency, ' ||
3492         'to_char(terms.LOCK_IN_DATE, ''YYYY-MM-DD'') lock_date, ' ||
3493         'to_char(terms.LOCK_TO_DATE, ''YYYY-MM-DD'') lock_exp_date, ' ||
3494         'terms.CEILING_RATE Ceiling_Rate, ' ||
3495         'terms.FLOOR_RATE floor_rate, ' ||
3496         'loan.open_to_term_flag open_to_term, ' ||
3497         'open_to_term.meaning open_to_term_flag, ' ||
3498         'product.loan_product_name loan_product, ' ||
3499         'decode(nvl(loan.current_phase, ''TERM''), ''OPEN'',
3500             to_char(rate_sched1.INDEX_DATE, ''YYYY-MM-DD''), null) open_index_date, ' ||
3501         'decode(nvl(loan.current_phase, ''TERM''), ''OPEN'',
3502             rate_sched1.CURRENT_INTEREST_RATE, null) open_interest_rate, ' ||
3503         'decode(nvl(loan.current_phase, ''TERM''), ''OPEN'',
3504             to_char(rate_sched2.INDEX_DATE, ''YYYY-MM-DD''),
3505             to_char(rate_sched1.INDEX_DATE, ''YYYY-MM-DD'')) term_index_date, ' ||
3506         'decode(nvl(loan.current_phase, ''TERM''), ''OPEN'',
3507             rate_sched2.CURRENT_INTEREST_RATE,
3508             rate_sched1.CURRENT_INTEREST_RATE) term_interest_rate, ' ||
3509         'loan.MULTIPLE_FUNDING_FLAG, ' ||
3510 
3511         -- adding disbursement schedule
3512         'CURSOR ' ||
3513         '(select head.DISB_HEADER_ID, ' ||
3514         'head.DISBURSEMENT_NUMBER, ' ||
3515         'to_char(head.TARGET_DATE, ''YYYY-MM-DD'') TARGET_DATE, ' ||
3516         'to_char(head.PAYMENT_REQUEST_DATE, ''YYYY-MM-DD'') PAYMENT_REQUEST_DATE, ' ||
3517         'head.HEADER_PERCENT, ' ||
3518         'to_char(head.HEADER_AMOUNT, :CURRENCY_FORMAT18) f_header_amount, ' ||
3519         'fnd_date.date_to_chardate((select max(DISBURSEMENT_DATE) from lns_disb_lines where DISB_HEADER_ID = head.DISB_HEADER_ID)) DISBURSEMENT_DATE, ' ||
3520         'fund_status.meaning status, ' ||
3521         'fund_act.meaning activity_name ' ||
3522         'from lns_disb_headers head, ' ||
3523         'lns_lookups fund_status, ' ||
3524         'lns_lookups fund_act ' ||
3525         'where head.loan_id = loan.loan_id and ' ||
3526         'fund_status.lookup_type(+) = ''FUNDING_STATUS'' and ' ||
3527         'fund_status.lookup_code(+) = head.STATUS and ' ||
3528         'fund_act.lookup_type(+) = ''DISB_ACTIVITY'' and ' ||
3529         'fund_act.lookup_code(+) = head.ACTIVITY_CODE) ' ||
3530         'AS Disbursement_Schedule, ' ||
3531 
3532         -- adding payment history
3533         'CURSOR ' ||
3534         '(select amortization_schedule_id, ' ||
3535         'loan_id, ' ||
3536         'payment_number, ' ||
3537         'to_char(creation_date, ''YYYY-MM-DD'') bill_date, ' ||
3538         'to_char(last_applied_date, ''YYYY-MM-DD'') paid_date, ' ||
3539         'to_char(due_date, ''YYYY-MM-DD'') due_date, ' ||
3540         'to_char(principal_amount, :CURRENCY_FORMAT19) f_principal_amount, ' ||
3541         'to_char(interest_amount, :CURRENCY_FORMAT20) f_interest_amount, ' ||
3542         'to_char(fee_amount, :CURRENCY_FORMAT21) f_fee_amount, ' ||
3543         'to_char(total_billed_amount, :CURRENCY_FORMAT22) f_total_billed_amount, ' ||
3544         'to_char((PRINCIPAL_PAID + INTEREST_PAID + FEE_PAID), :CURRENCY_FORMAT23) f_total_payment_amount, '  ||
3545         'principal_amount principal_amount, ' ||
3546         'interest_amount interest_amount, ' ||
3547         'fee_amount fee_amount, ' ||
3548         'total_billed_amount total_billed_amount, ' ||
3549         '(PRINCIPAL_PAID + INTEREST_PAID + FEE_PAID) total_payment_amount '  ||
3550         'from lns_am_scheds_v payment_history ' ||
3551         'where payment_history.loan_id = loan.loan_id and ' ||
3552         'nvl(payment_history.PHASE, ''TERM'') = nvl(loan.CURRENT_PHASE, ''TERM'') and ' ||
3553         'payment_history.reversed_code = ''N'' and ' ||
3554         '(payment_history.payment_number between (PAY_SUM.next_payment_number - 2) and PAY_SUM.next_payment_number) and ' ||
3555         'payment_history.AMORTIZATION_SCHEDULE_ID < PAY_SUM.next_payment_amortization_id ' ||
3556         'order by payment_history.AMORTIZATION_SCHEDULE_ID) ' ||
3557         'AS Recent_Payment_History ' ||
3558 
3559         'FROM lns_loan_headers_all_vl loan, ' ||
3560         'hz_parties party, ' ||
3561         'fnd_territories_tl terr, ' ||
3562         'hr_all_organization_units_tl org, ' ||
3563         'LNS_PAY_SUM_V PAY_SUM, ' ||
3564         'LNS_PAY_SUM_YEARLY_V PAY_SUM_YEARLY, ' ||
3565         'LNS_PAY_SUM_OVERDUE_V PAY_SUM_OVERDUE, ' ||
3566         'lns_amortization_scheds am, ' ||
3567         'hz_locations loc, ' ||
3568         'hz_cust_acct_sites_all acct_site, ' ||
3569         'hz_party_sites site, ' ||
3570         'fnd_currencies_tl curr, ' ||
3571         'hz_parties contact_person, ' ||
3572         'lns_loan_types_vl loan_type, ' ||
3573         'lns_lookups loan_class, ' ||
3574         'lns_lookups periodlkup, ' ||
3575         'lns_lookups loan_subtype, ' ||
3576         'lns_terms terms, ' ||
3577         'lns_int_rate_headers_vl int_rate_hdr, ' ||
3578         'lns_lookups rate_type, ' ||
3579         'lns_lookups rate_freq, ' ||
3580         'lns_lookups pay_freq, ' ||
3581         'fnd_lookups open_to_term, ' ||
3582         'lns_loan_products_vl product, ' ||
3583         'lns_rate_schedules rate_sched1, ' ||
3584         'lns_rate_schedules rate_sched2 ' ||
3585 
3586         'WHERE party.party_id = loan.primary_borrower_id and ' ||
3587         'org.organization_id = loan.org_id and ' ||
3588         'org.language = userenv(''LANG'') and ' ||
3589         'acct_site.cust_acct_site_id = loan.bill_to_acct_site_id and ' ||
3590         'acct_site.org_id = loan.org_id and ' ||
3591         'site.party_site_id = acct_site.party_site_id and ' ||
3592         'site.location_id = loc.location_id and ' ||
3593         'loc.country = terr.TERRITORY_CODE and ' ||
3594         'terr.language = userenv(''LANG'') and ' ||
3595         'loan.LOAN_CURRENCY = curr.currency_code and ' ||
3596         'curr.language = userenv(''LANG'') and ' ||
3597         'loan.contact_pers_party_id = contact_person.party_id(+) and ' ||
3598         'loan_type.loan_type_id = loan.loan_type_id AND ' ||
3599         'loan_class.lookup_type = ''LOAN_CLASS'' AND ' ||
3600         'loan_class.lookup_code = loan.loan_class_code AND ' ||
3601         'periodlkup.lookup_type = ''PERIOD'' and ' ||
3602         'periodlkup.lookup_code = loan.loan_term_period and ' ||
3603         'loan_subtype.lookup_type = ''LOAN_SUBTYPE'' and ' ||
3604         'loan_subtype.lookup_code = loan.loan_subtype and ' ||
3605         'loan.loan_id = PAY_SUM.loan_id and ' ||
3606         'loan.loan_id = PAY_SUM_YEARLY.loan_id and ' ||
3607         'loan.loan_id = PAY_SUM_OVERDUE.loan_id and ' ||
3608         'loan.loan_id = terms.loan_id and ' ||
3609         'rate_type.lookup_type = ''RATE_TYPE'' and ' ||
3610         'rate_type.lookup_code = terms.RATE_TYPE and ' ||
3611         'terms.INDEX_RATE_ID = int_rate_hdr.INTEREST_RATE_ID(+) and ' ||
3612         'rate_freq.lookup_type(+) = ''FREQUENCY'' and ' ||
3613         'rate_freq.lookup_code(+) = terms.RATE_CHANGE_FREQUENCY and ' ||
3614         'pay_freq.lookup_type = ''FREQUENCY'' and ' ||
3615         'pay_freq.lookup_code = terms.LOAN_PAYMENT_FREQUENCY and ' ||
3616         'open_to_term.lookup_type = ''YES_NO'' and ' ||
3617         'open_to_term.lookup_code = nvl(loan.open_to_term_flag, ''N'') and ' ||
3618         'loan.product_id = product.LOAN_PRODUCT_ID(+) and ' ||
3619         'rate_sched1.term_id = terms.term_id and ' ||
3620         'rate_sched1.PHASE = nvl(loan.current_phase, ''TERM'') and ' ||
3621         '(decode(am.PAYMENT_NUMBER, 0, rate_sched1.begin_installment_number, -1) = 1 or ' ||
3622         'am.PAYMENT_NUMBER between rate_sched1.begin_installment_number and rate_sched1.end_installment_number) and ' ||
3623         'rate_sched1.end_date_active is null and ' ||
3624         'rate_sched2.term_id = terms.term_id and ' ||
3625         'rate_sched2.PHASE = ''TERM'' and ' ||
3626         'rate_sched2.begin_installment_number = 1 and  ' ||
3627         'rate_sched2.end_date_active is null and ' ||
3628         'loan.loan_id = am.loan_id and ' ||
3629         'am.AMORTIZATION_SCHEDULE_ID = PAY_SUM.next_payment_amortization_id and ' ||
3630         'nvl(am.phase, ''TERM'')  = nvl(loan.current_phase, ''TERM'') and ' ||
3631         'loan.loan_id = :LOAN_ID';
3632 
3633     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Before set new context');
3634     qryCtx := DBMS_XMLQuery.newContext(qry_string);
3635 --    qryCtx := DBMS_XMLGEN.newContext(qry_string);
3636     LogMessage(FND_LOG.LEVEL_STATEMENT, 'After set new context');
3637 
3638     -- set the rowset header to null
3639     DBMS_XMLQuery.setRowSetTag(qryCtx, 'LOANSET');
3640 --    DBMS_XMLGEN.setRowSetTag(qryCtx, 'LOANSET');
3641 
3642     -- set the row tag name to be LOAN
3643      DBMS_XMLQuery.setRowTag(qryCtx, 'LOAN');
3644 --    DBMS_XMLGEN.setRowTag(qryCtx, 'LOAN');
3645 
3646     --Set bind values
3647     DBMS_XMLQuery.setBindValue(qryCtx, 'LOAN_ID', p_loan_id);
3648 --    DBMS_XMLGEN.setBindValue(qryCtx, 'LOAN_ID', p_loan_id);
3649 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT1', l_currency_format_mask);
3650 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT2', l_currency_format_mask);
3651 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT3', l_currency_format_mask);
3652 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT4', l_currency_format_mask);
3653 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT5', l_currency_format_mask);
3654 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT6', l_currency_format_mask);
3655 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT7', l_currency_format_mask);
3656 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT8', l_currency_format_mask);
3657 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT9', l_currency_format_mask);
3658 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT10', l_currency_format_mask);
3659 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT11', l_currency_format_mask);
3660 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT12', l_currency_format_mask);
3661 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT13', l_currency_format_mask);
3662 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT14', l_currency_format_mask);
3663 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT15', l_currency_format_mask);
3664 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT16', l_currency_format_mask);
3665 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT17', l_currency_format_mask);
3666 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT18', l_currency_format_mask);
3667 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT19', l_currency_format_mask);
3668 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT20', l_currency_format_mask);
3669 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT21', l_currency_format_mask);
3670 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT22', l_currency_format_mask);
3671 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT23', l_currency_format_mask);
3672 
3673     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Bind value: LOAN_ID = ' || p_loan_id);
3674     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Bind value: CURRENCY_FORMAT = ' || l_currency_format_mask);
3675 
3676     -- now get the result
3677         result := DBMS_XMLQuery.getXml(qryCtx);
3678 --    result := DBMS_XMLGEN.getXml(qryCtx);
3679 --    LogMessage(FND_LOG.LEVEL_STATEMENT, 'Result xml: ' || result);
3680 
3681     if (result is not null) then
3682 
3683         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Generated billing statement');
3684 
3685         /* Update amortization table */
3686         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
3687 
3688         LNS_AMORTIZATION_SCHEDS_PKG.Update_Statement(
3689             P_AMORTIZATION_SCHEDULE_ID => p_amortization_schedule_id
3690             ,P_STATEMENT_XML => result);
3691 
3692         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
3693 
3694     else
3695         RAISE FND_API.G_EXC_ERROR;
3696     end if;
3697 
3698     --close context
3699     DBMS_XMLQuery.closeContext(qryCtx);
3700 --    DBMS_XMLGEN.closeContext(qryCtx);
3701 
3702     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3703 
3704 EXCEPTION
3705     WHEN OTHERS THEN
3706     	-- Bug#8848035 - Thow the user defined exception if it fails
3707     	FND_MESSAGE.SET_NAME('LNS', 'LNS_BILL_STMT_GEN_FAIL');
3708 	FND_MSG_PUB.Add;
3709         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3710         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to generate billing statement');
3711         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: ' || sqlerrm);
3712         RAISE FND_API.G_EXC_ERROR;
3713 
3714 END GENERATE_BILLING_STATEMENT_XML;
3715 
3716 -- this function returns available amount to be billed for the specified date
3717 FUNCTION GET_AVAILABLE_PRIN_AMOUNT(P_LOAN_ID NUMBER, P_DATE DATE) return NUMBER
3718 IS
3719 
3720 /*-----------------------------------------------------------------------+
3721  | Local Variable Declarations and initializations                       |
3722  +-----------------------------------------------------------------------*/
3723     l_api_name              CONSTANT VARCHAR2(30) := 'GET_AVAILABLE_PRIN_AMOUNT';
3724     l_billed_amount         number;
3725     l_funded_amount         number;
3726     l_available_amount      number;
3727 
3728 /*-----------------------------------------------------------------------+
3729  | Cursor Declarations                                                   |
3730  +-----------------------------------------------------------------------*/
3731 
3732     CURSOR verify_amount_cur(P_LOAN_ID number) IS
3733         select nvl(sum(am.PRINCIPAL_AMOUNT), 0)
3734         from
3735             LNS_AMORTIZATION_SCHEDS am,
3736             lns_loan_headers head
3737         where
3738             head.loan_id = P_LOAN_ID
3739             and head.loan_id = am.LOAN_ID
3740             and (am.REVERSED_FLAG is null or am.REVERSED_FLAG = 'N')
3741             and nvl(am.PHASE, 'TERM') = nvl(head.CURRENT_PHASE, 'TERM');
3742 BEGIN
3743 
3744     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3745 
3746     /* verify amount that we will bill */
3747     open verify_amount_cur(P_LOAN_ID);
3748     fetch verify_amount_cur into l_billed_amount;
3749     close verify_amount_cur;
3750     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_billed_amount = ' || l_billed_amount) ;
3751 
3752     l_funded_amount := LNS_FINANCIALS.getFundedAmount(P_LOAN_ID, P_DATE, 'CURRENT');
3753     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_funded_amount = ' || l_funded_amount) ;
3754 
3755     l_available_amount := l_funded_amount - l_billed_amount;
3756     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_available_amount = ' || l_available_amount) ;
3757 
3758     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3759 
3760     return l_available_amount;
3761 END;
3762 
3763 
3764 PROCEDURE VALIDATE_PRIN_AMOUNT(P_LOAN_ID NUMBER, P_PRIN_AMOUNT NUMBER, P_DATE DATE)
3765 IS
3766 
3767 /*-----------------------------------------------------------------------+
3768  | Local Variable Declarations and initializations                       |
3769  +-----------------------------------------------------------------------*/
3770     l_available_amount      number;
3771 
3772 /*-----------------------------------------------------------------------+
3773  | Cursor Declarations                                                   |
3774  +-----------------------------------------------------------------------*/
3775 BEGIN
3776 
3777     l_available_amount := GET_AVAILABLE_PRIN_AMOUNT(P_LOAN_ID, P_DATE);
3778 
3779     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_PRIN_AMOUNT = ' || P_PRIN_AMOUNT) ;
3780 
3781     if P_PRIN_AMOUNT > l_available_amount then
3782 --        FND_MESSAGE.SET_ENCODED('Principal bill amount cannot be greater than ' || l_valid_amount);
3783         FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_PRIN_BILL_AMOUNT');
3784         FND_MSG_PUB.Add;
3785         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3786         RAISE FND_API.G_EXC_ERROR;
3787     end if;
3788 
3789 END;
3790 
3791 
3792 
3793 /*========================================================================
3794  | PRIVATE PROCEDURE BILL_SINGLE_LOAN
3795  |
3796  | DESCRIPTION
3797  |      This procedure process a single loan.
3798  |
3799  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3800  |      BILL_LOANS
3801  |
3802  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3803  |      LogMessage
3804  |      CREATE_AR_INVOICES
3805  |
3806  | PARAMETERS
3807  |      P_LOAN_REC          IN OUT NOCOPY       Loan record to bill
3808  |
3809  | KNOWN ISSUES
3810  |      None
3811  |
3812  | NOTES
3813  |      Any interesting aspect of the code in the package body which needs
3814  |      to be stated.
3815  |
3816  | MODIFICATION HISTORY
3817  | Date                    Author            Description of Changes
3818  | 01-01-2004         scherkas         Created
3819  |
3820  *=======================================================================*/
3821 PROCEDURE BILL_SINGLE_LOAN(
3822     P_API_VERSION		IN          NUMBER,
3823     P_INIT_MSG_LIST		IN          VARCHAR2,
3824     P_COMMIT			IN          VARCHAR2,
3825     P_VALIDATION_LEVEL	IN          NUMBER,
3826     P_LOAN_REC          IN OUT NOCOPY     LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC,
3827     X_STATEMENT_XML     OUT NOCOPY  CLOB,
3828     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
3829     X_MSG_COUNT			OUT NOCOPY  NUMBER,
3830     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
3831 IS
3832 
3833 /*-----------------------------------------------------------------------+
3834  | Local Variable Declarations and initializations                       |
3835  +-----------------------------------------------------------------------*/
3836 
3837     l_api_name                      CONSTANT VARCHAR2(30) := 'BILL_SINGLE_LOAN';
3838     l_api_version                   CONSTANT NUMBER := 1.0;
3839     l_return_status                 VARCHAR2(1);
3840     l_msg_count                     NUMBER;
3841     l_msg_data                      VARCHAR2(32767);
3842     l_org_id                        number;
3843     l_Count                         number;
3844     l_header_id                     number;
3845     l_Count1                        number;
3846     l_prin_bal                      number;
3847     l_billed_0th_yn                 varchar2(1);
3848     l_do_billing                    number;
3849     l_offset                        number(38);
3850     l_statement_xml                 clob;
3851     l_prin_balance                  number;
3852     l_start                         date;
3853     l_end                           date;
3854 --    l_floating_flag                 varchar2(1);
3855    l_create_zero_instal            varchar2(1);
3856    l_profile_name                  VARCHAR2(240);
3857 
3858     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
3859     l_amortization_rec              LNS_FINANCIALS.AMORTIZATION_REC;
3860     l_lines_tbl                     LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
3861     l_fee_tbl                       LNS_FINANCIALS.FEES_TBL;
3862     l_is_disable_bill		        varchar2(1);
3863 
3864 /*-----------------------------------------------------------------------+
3865  | Cursor Declarations                                                   |
3866  +-----------------------------------------------------------------------*/
3867 
3868     /* check to start billing for 0-th installment */
3869     CURSOR do_billing_cur(C_LOAN_ID number, C_PHASE varchar2) IS
3870         select nvl(count(1),0)
3871         from lns_fee_assignments
3872         where begin_installment_number = 0
3873         and end_installment_number = 0
3874         and end_date_active is null
3875         and (billing_option = 'ORIGINATION'
3876              -- Only for Term Pase, check the Event_conversion Fees
3877                 OR billing_option = decode(nvl(C_PHASE, 'TERM'), 'TERM','TERM_CONVERSION', null)
3878               )
3879         and loan_id = C_LOAN_ID
3880 	and phase = C_PHASE;
3881 
3882     /* get statement after its billed */
3883     CURSOR get_statement_cur(P_LOAN_ID number) IS
3884         select STATEMENT_XML
3885         from LNS_LOAN_HEADERS loan,
3886         lns_amortization_scheds am
3887         where loan.loan_id = am.loan_id	and
3888         am.AMORTIZATION_SCHEDULE_ID = loan.LAST_AMORTIZATION_ID	and
3889         am.PAYMENT_NUMBER = loan.LAST_PAYMENT_NUMBER and
3890         loan.loan_id = P_LOAN_ID;
3891 
3892     -- getting loan version
3893     CURSOR loan_version_cur(P_LOAN_ID number) IS
3894         select OBJECT_VERSION_NUMBER
3895         from LNS_LOAN_HEADERS
3896         where LOAN_ID = P_LOAN_ID;
3897 /*
3898     cursor cur_floating(p_loan_id number, p_phase varchar2, p_installment number) is
3899     select nvl(floating_flag, 'N')
3900       from lns_rate_schedules rs
3901           ,lns_terms t
3902       where t.loan_id = p_loan_id
3903         and t.term_id = rs.term_id
3904         and rs.end_date_active is null
3905         and rs.phase = p_phase
3906         and p_installment between rs.begin_installment_number and rs.end_installment_number;
3907 */
3908 BEGIN
3909 
3910     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3911 
3912     -- Standard start of API savepoint
3913     SAVEPOINT PROCESS_SINGLE_LOAN_PVT;
3914     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
3915 
3916     -- Standard call to check for call compatibility
3917     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3918       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3919     END IF;
3920 
3921     -- Initialize message list if p_init_msg_list is set to TRUE
3922     IF FND_API.To_Boolean(p_init_msg_list) THEN
3923       FND_MSG_PUB.initialize;
3924     END IF;
3925 
3926     -- Initialize API return status to success
3927     l_return_status := FND_API.G_RET_STS_SUCCESS;
3928 
3929     -- START OF BODY OF API
3930 
3931 
3932     dbms_lob.createtemporary(X_STATEMENT_XML, FALSE, DBMS_LOB.CALL);
3933     dbms_lob.open(X_STATEMENT_XML, dbms_lob.lob_readwrite);
3934 
3935     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing loan ' || P_LOAN_REC.LOAN_NUMBER);
3936     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'LOAN ID: ' || P_LOAN_REC.LOAN_ID);
3937     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'LOAN DESCRIPTION: ' || P_LOAN_REC.LOAN_DESCRIPTION);
3938     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || P_LOAN_REC.FUNDED_AMOUNT);
3939     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FIRST_PAYMENT_DATE: ' || P_LOAN_REC.FIRST_PAYMENT_DATE);
3940     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
3941     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || P_LOAN_REC.BILLED_FLAG);
3942     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || P_LOAN_REC.LOAN_CURRENCY);
3943     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || P_LOAN_REC.CUST_ACCOUNT_ID);
3944     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || P_LOAN_REC.BILL_TO_ADDRESS_ID);
3945     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || P_LOAN_REC.CUSTOM_PAYMENTS_FLAG);
3946     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_PAYMENT_FREQUENCY: ' || P_LOAN_REC.LOAN_PAYMENT_FREQUENCY);
3947     LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || P_LOAN_REC.NUMBER_GRACE_DAYS);
3948     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || P_LOAN_REC.PAYMENT_APPLICATION_ORDER);
3949     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || P_LOAN_REC.EXCHANGE_RATE_TYPE);
3950     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || P_LOAN_REC.EXCHANGE_DATE);
3951     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || P_LOAN_REC.EXCHANGE_RATE);
3952     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'ORG ID: ' || P_LOAN_REC.ORG_ID);
3953     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'LE ID: ' || P_LOAN_REC.LEGAL_ENTITY_ID);
3954     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'CURRENT_PHASE: ' || P_LOAN_REC.CURRENT_PHASE);
3955 
3956     /* Check for loan data */
3957     if P_LOAN_REC.PAYMENT_APPLICATION_ORDER is null or
3958        P_LOAN_REC.FIRST_PAYMENT_DATE is null or
3959        P_LOAN_REC.NEXT_PAYMENT_DUE_DATE is null or
3960        P_LOAN_REC.LOAN_PAYMENT_FREQUENCY is null then
3961 
3962 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan misses some important data. Cannot proceed with billing of this loan.');
3963     	FND_MESSAGE.SET_NAME('LNS', 'LNS_LOAN_MISS_DATA');
3964     	FND_MESSAGE.SET_TOKEN('LOAN', P_LOAN_REC.LOAN_NUMBER);
3965 		FND_MSG_PUB.Add;
3966         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3967         RAISE FND_API.G_EXC_ERROR;
3968 
3969     end if;
3970 
3971     /* getting current payment number */
3972     P_LOAN_REC.NEXT_PAYMENT_NUMBER := LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER_EXT_2(P_LOAN_REC.LOAN_ID);
3973 
3974     if P_LOAN_REC.NEXT_PAYMENT_NUMBER = -1 then
3975 
3976         P_LOAN_REC.NEXT_PAYMENT_NUMBER := 0;
3977 
3978         /* check to start billing for 0-th installment */
3979         open do_billing_cur(P_LOAN_REC.LOAN_ID, P_LOAN_REC.CURRENT_PHASE);
3980         fetch do_billing_cur into l_do_billing;
3981         close do_billing_cur;
3982 
3983         if l_do_billing > 0 then
3984 
3985             LNS_BILLING_BATCH_PUB.PREBILL_SINGLE_LOAN(
3986                 P_API_VERSION		    => 1.0,
3987                 P_INIT_MSG_LIST		    => FND_API.G_TRUE,
3988                 P_COMMIT			    => FND_API.G_FALSE,
3989                 P_VALIDATION_LEVEL		=> FND_API.G_VALID_LEVEL_FULL,
3990                 P_LOAN_ID               => P_LOAN_REC.LOAN_ID,
3991                 X_BILLED_YN             => l_billed_0th_yn,
3992                 x_return_status         => l_return_status,
3993                 x_msg_count             => l_msg_count,
3994                 x_msg_data              => l_msg_data);
3995 
3996             if l_return_status <> 'S' then
3997                 RAISE FND_API.G_EXC_ERROR;
3998             end if;
3999 
4000             if l_billed_0th_yn = 'Y' then
4001 
4002                 /* get statement after its billed */
4003                 open get_statement_cur(P_LOAN_REC.LOAN_ID);
4004                 fetch get_statement_cur into l_statement_xml;
4005                 close get_statement_cur;
4006 
4007                 /* remove xml header */
4008                 l_offset := DBMS_LOB.INSTR(lob_loc => l_statement_xml,
4009                                         pattern => '>',
4010                                         offset => 1,
4011                                         nth => 1);
4012                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have removed header from the statement');
4013 
4014                 /* copy generated statement to output */
4015                 dbms_lob.copy(dest_lob => X_STATEMENT_XML,
4016                             src_lob => l_statement_xml,
4017                             amount => dbms_lob.getlength(l_statement_xml)-l_offset,
4018                             src_offset => l_offset+1);
4019 
4020                 x_return_status := l_return_status;  --fix for bug 8830573
4021                 return;
4022             end if;
4023 
4024         end if;
4025 
4026     end if;
4027 
4028     /* setting next payment number */
4029     P_LOAN_REC.NEXT_PAYMENT_NUMBER := P_LOAN_REC.NEXT_PAYMENT_NUMBER + 1;
4030     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || P_LOAN_REC.NEXT_PAYMENT_NUMBER);
4031 
4032     /* new principal and interest amounts from getInstallment api */
4033 
4034     if P_LOAN_REC.CURRENT_PHASE = 'TERM' then
4035 
4036         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
4037         l_start := sysdate;
4038         lns_financials.getInstallment(
4039             p_api_version => 1.0,
4040             p_init_msg_list => FND_API.G_TRUE,
4041             p_commit => FND_API.G_FALSE,
4042             p_loan_Id => P_LOAN_REC.LOAN_ID,
4043             p_installment_number => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4044             x_amortization_rec => l_amortization_rec,
4045             x_fees_tbl => l_fee_tbl,
4046             X_RETURN_STATUS => l_return_status,
4047             X_MSG_COUNT => l_msg_count,
4048             X_MSG_DATA => l_msg_data);
4049 
4050         l_end := sysdate;
4051         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'getInstallment Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4052 
4053     else
4054 
4055         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getOpenInstallment...');
4056         l_start := sysdate;
4057         lns_financials.getOpenInstallment(
4058             p_init_msg_list => FND_API.G_TRUE,
4059             p_loan_Id => P_LOAN_REC.LOAN_ID,
4060             p_installment_number => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4061             x_amortization_rec => l_amortization_rec,
4062             x_fees_tbl => l_fee_tbl,
4063             X_RETURN_STATUS => l_return_status,
4064             X_MSG_COUNT => l_msg_count,
4065             X_MSG_DATA => l_msg_data);
4066 
4067         l_end := sysdate;
4068         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'getOpenInstallment Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4069 
4070     end if;
4071 
4072     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4073     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
4074 
4075     if l_return_status <> 'S' then
4076         RAISE FND_API.G_EXC_ERROR;
4077     end if;
4078 
4079     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Data returned from lns_financials.getInstallment:');
4080     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
4081     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
4082     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_amortization_rec.PRINCIPAL_AMOUNT);
4083     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_amortization_rec.INTEREST_AMOUNT);
4084     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DEFERRED_INT_AMOUNT: ' || l_amortization_rec.DEFERRED_INT_AMOUNT);
4085     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURR_CAP_INT_AMOUNT: ' || l_amortization_rec.CURR_CAP_INT_AMOUNT);
4086     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CAP_INT_AMOUNT: ' || l_amortization_rec.CAP_INT_AMOUNT);
4087     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EARLY_PAY_CR_AMOUNT: ' || l_amortization_rec.EARLY_PAY_CR_AMOUNT);
4088     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_amortization_rec.FEE_AMOUNT);
4089 
4090     P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT := l_amortization_rec.PRINCIPAL_AMOUNT;
4091     P_LOAN_REC.NEXT_INTEREST_AMOUNT  := l_amortization_rec.INTEREST_AMOUNT;
4092     P_LOAN_REC.NEXT_FEE_AMOUNT       := l_amortization_rec.FEE_AMOUNT;
4093     P_LOAN_REC.RATE_ID               := l_amortization_rec.RATE_ID;
4094     P_LOAN_REC.NEXT_PAYMENT_DUE_DATE := l_amortization_rec.due_date;
4095 
4096     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Checking the Disable_billing_flag in '||l_api_name);
4097     l_is_disable_bill := IS_BILLING_DISABLED(P_LOAN_REC.LOAN_ID);
4098     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_is_disable_bill is '||l_is_disable_bill);
4099     IF l_is_disable_bill = 'Y' THEN
4100     	    --  LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: BILLING is Disabled for the loan '||p_loan_rec.loan_number);
4101              FND_MESSAGE.SET_NAME('LNS', 'LNS_BILLING_DISABLED');
4102 	     FND_MESSAGE.SET_TOKEN('LOAN_NUMBER', p_loan_rec.loan_number);
4103              FND_MSG_PUB.Add;
4104              LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
4105              RAISE FND_API.G_EXC_ERROR;
4106     END IF;
4107 
4108 
4109     /* checking for returned values */
4110     if l_amortization_rec.INSTALLMENT_NUMBER is null and
4111        l_amortization_rec.due_date is null
4112     then
4113 
4114         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'lns_financials.getInstallment returns no data. Nothing to bill. Returning.');
4115 	return;
4116 
4117     end if;
4118 
4119     if (P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT is null or P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT = 0) and
4120        (P_LOAN_REC.NEXT_INTEREST_AMOUNT is null or P_LOAN_REC.NEXT_INTEREST_AMOUNT = 0) and
4121        (P_LOAN_REC.NEXT_FEE_AMOUNT is null or P_LOAN_REC.NEXT_FEE_AMOUNT = 0)
4122     then
4123 
4124         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All amounts returned from lns_financials.getInstallment = 0. ');
4125 
4126 	-- fix for bug 7000066: get LNS_CREATE_ZERO_INSTAL profile value to see if we need to create 0 amount installment
4127         l_create_zero_instal := NVL(FND_PROFILE.VALUE('LNS_CREATE_ZERO_INSTAL'), 'N');
4128         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LNS_CREATE_ZERO_INSTAL profile: ' || l_create_zero_instal);
4129 
4130         if l_create_zero_instal = 'N' then
4131 
4132             select USER_PROFILE_OPTION_NAME into l_profile_name
4133             from FND_PROFILE_OPTIONS_VL
4134             where PROFILE_OPTION_NAME = 'LNS_CREATE_ZERO_INSTAL';
4135 
4136             FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_BILL_ZERO_AMOUNT');
4137     		FND_MESSAGE.SET_TOKEN('PROFILE', l_profile_name);
4138             FND_MSG_PUB.Add;
4139             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
4140             RAISE FND_API.G_EXC_ERROR;
4141          --   return;
4142         end if;
4143 
4144     end if;
4145 
4146     /* adding principal and interest amounts into lines table */
4147     l_Count1 := 1;
4148     l_lines_tbl(l_Count1).LINE_TYPE := 'PRIN';
4149     l_lines_tbl(l_Count1).LINE_AMOUNT := P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT;
4150 
4151     if l_amortization_rec.INTEREST_AMOUNT > 0 and l_amortization_rec.CURR_CAP_INT_AMOUNT = 0 then
4152 
4153         if l_amortization_rec.NORMAL_INT_AMOUNT > 0 or l_amortization_rec.ADD_PRIN_INT_AMOUNT > 0 or
4154            l_amortization_rec.ADD_INT_INT_AMOUNT > 0 or l_amortization_rec.PENAL_INT_AMOUNT > 0 or
4155            l_amortization_rec.PREV_DEFERRED_INT_AMOUNT > 0 or l_amortization_rec.PREV_CAP_INT_AMOUNT > 0
4156         then
4157 
4158             if l_amortization_rec.NORMAL_INT_AMOUNT > 0 then
4159                 l_Count1 := l_Count1 + 1;
4160                 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4161                 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.NORMAL_INT_DETAILS;
4162                 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.NORMAL_INT_AMOUNT;
4163                 l_lines_tbl(l_Count1).LINE_DESC := 'Normal Interest';
4164                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4165             end if;
4166             if l_amortization_rec.ADD_PRIN_INT_AMOUNT > 0 then
4167                 l_Count1 := l_Count1 + 1;
4168                 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4169                 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.ADD_PRIN_INT_DETAILS;
4170                 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.ADD_PRIN_INT_AMOUNT;
4171                 l_lines_tbl(l_Count1).LINE_DESC := 'Additional Interest on Unpaid Principal';
4172                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4173             end if;
4174             if l_amortization_rec.ADD_INT_INT_AMOUNT > 0 then
4175                 l_Count1 := l_Count1 + 1;
4176                 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4177                 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.ADD_INT_INT_DETAILS;
4178                 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.ADD_INT_INT_AMOUNT;
4179                 l_lines_tbl(l_Count1).LINE_DESC := 'Additional Interest on Unpaid Interest';
4180                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4181             end if;
4182             if l_amortization_rec.PENAL_INT_AMOUNT > 0 then
4183                 l_Count1 := l_Count1 + 1;
4184                 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4185                 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.PENAL_INT_DETAILS;
4186                 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.PENAL_INT_AMOUNT;
4187                 l_lines_tbl(l_Count1).LINE_DESC := 'Penal Interest';
4188                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4189             end if;
4190             if l_amortization_rec.PREV_DEFERRED_INT_AMOUNT > 0 then
4191                 l_Count1 := l_Count1 + 1;
4192                 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4193                 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.DEFERRED_INT_DETAILS;
4194                 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.PREV_DEFERRED_INT_AMOUNT;
4195                 l_lines_tbl(l_Count1).LINE_DESC := 'Previously Deferred Interest';
4196                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4197             end if;
4198             if l_amortization_rec.PREV_CAP_INT_AMOUNT > 0 then
4199                 l_Count1 := l_Count1 + 1;
4200                 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4201                 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.CAP_INT_DETAILS;
4202                 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.PREV_CAP_INT_AMOUNT;
4203                 l_lines_tbl(l_Count1).LINE_DESC := 'Previously Capitalized Interest';
4204                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4205             end if;
4206             if l_amortization_rec.EARLY_PAY_CR_AMOUNT < 0 then
4207                 l_Count1 := l_Count1 + 1;
4208                 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4209                 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.EARLY_PAY_CR_DETAILS;
4210                 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.EARLY_PAY_CR_AMOUNT;
4211                 l_lines_tbl(l_Count1).LINE_DESC := 'Interest Credit for Early Payment';
4212                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4213             end if;
4214 
4215         else
4216 
4217             l_Count1 := l_Count1 + 1;
4218             l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4219             l_lines_tbl(l_Count1).LINE_AMOUNT := P_LOAN_REC.NEXT_INTEREST_AMOUNT;
4220 
4221         end if;
4222 
4223 --    else
4224 --        l_curr_cap_int_amount := P_LOAN_REC.NEXT_INTEREST_AMOUNT;
4225 --        P_LOAN_REC.NEXT_INTEREST_AMOUNT := 0;
4226     end if;
4227 
4228     /* adding fee amounts into lines table */
4229     FOR l_Count IN 1..l_fee_tbl.count LOOP
4230 
4231         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fee #' || l_Count || ' Name: ' || l_fee_tbl(l_Count).FEE_NAME || ' Amount: ' || l_fee_tbl(l_Count).FEE_AMOUNT);
4232 
4233         l_Count1 := l_Count1 + 1;
4234         l_lines_tbl(l_Count1).LINE_REF_ID := l_fee_tbl(l_Count).FEE_ID;
4235         l_lines_tbl(l_Count1).LINE_TYPE := 'FEE';
4236         l_lines_tbl(l_Count1).LINE_DESC := l_fee_tbl(l_Count).FEE_NAME;
4237         l_lines_tbl(l_Count1).LINE_AMOUNT := l_fee_tbl(l_Count).FEE_AMOUNT;
4238         l_lines_tbl(l_Count1).FEE_SCHEDULE_ID := l_fee_tbl(l_Count).FEE_SCHEDULE_ID;
4239 
4240         /* added fee installment validation by raverma request */
4241         if l_amortization_rec.INSTALLMENT_NUMBER <> l_fee_tbl(l_Count).FEE_INSTALLMENT then
4242 
4243             FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_FEE_INSTAL');
4244             FND_MSG_PUB.Add;
4245             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4246             RAISE FND_API.G_EXC_ERROR;
4247 
4248         end if;
4249 
4250         /* updating LNS_FEE_SCHEDULES with billed_flag = Y */
4251         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_FEE_SCHEDULES with billed_flag = Y ...');
4252         UPDATE LNS_FEE_SCHEDULES
4253         SET
4254             BILLED_FLAG                     =     'Y',
4255             last_update_date                =     LNS_UTILITY_PUB.LAST_UPDATE_DATE,
4256             last_updated_by                 =     LNS_UTILITY_PUB.LAST_UPDATED_BY,
4257             last_update_login               =     LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
4258         WHERE
4259             FEE_SCHEDULE_ID = l_fee_tbl(l_Count).fee_schedule_id;
4260         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_FEE_SCHEDULES');
4261 
4262     END LOOP;
4263 
4264     /* validate principal amount */
4265     VALIDATE_PRIN_AMOUNT(P_LOAN_REC.LOAN_ID, P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
4266 
4267     /* late date */
4268     P_LOAN_REC.NEXT_PAYMENT_LATE_DATE := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE + nvl(P_LOAN_REC.NUMBER_GRACE_DAYS, 0);
4269 
4270     P_LOAN_REC.PRINCIPAL_BALANCE := null;
4271     if P_LOAN_REC.CURRENT_PHASE is not null and P_LOAN_REC.CURRENT_PHASE = 'OPEN' then
4272         P_LOAN_REC.PRINCIPAL_BALANCE := P_LOAN_REC.FUNDED_AMOUNT;
4273     end if;
4274     P_LOAN_REC.FUNDED_AMOUNT := l_amortization_rec.FUNDED_AMOUNT;
4275     P_LOAN_REC.DEFERRED_INT_AMOUNT := l_amortization_rec.DEFERRED_INT_AMOUNT;
4276     P_LOAN_REC.CURR_CAP_INT_AMOUNT := l_amortization_rec.CURR_CAP_INT_AMOUNT;
4277     P_LOAN_REC.CAP_INT_AMOUNT := l_amortization_rec.CAP_INT_AMOUNT;
4278 
4279     /* creating AR invoices */
4280     CREATE_AR_INVOICES(P_LOAN_REC, l_lines_tbl);
4281 
4282     /* updating loan header table */
4283 
4284     -- getting loan version
4285     open loan_version_cur(P_LOAN_REC.LOAN_ID);
4286     fetch loan_version_cur into P_LOAN_REC.OBJECT_VERSION_NUMBER;
4287     close loan_version_cur;
4288 
4289     l_loan_header_rec.loan_id := P_LOAN_REC.LOAN_ID;
4290     l_loan_header_rec.BILLED_FLAG := 'Y';
4291     l_loan_header_rec.LAST_BILLED_DATE := sysdate;
4292 
4293     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
4294     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || l_loan_header_rec.BILLED_FLAG);
4295     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LAST_BILLED_DATE: ' || l_loan_header_rec.LAST_BILLED_DATE);
4296 
4297     LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => P_LOAN_REC.OBJECT_VERSION_NUMBER,
4298                                     P_LOAN_HEADER_REC => l_loan_header_rec,
4299                                     P_INIT_MSG_LIST => FND_API.G_FALSE,
4300                                     X_RETURN_STATUS => l_return_status,
4301                                     X_MSG_COUNT => l_msg_count,
4302                                     X_MSG_DATA => l_msg_data);
4303 
4304     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4305 
4306     IF l_return_status = 'S' THEN
4307         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
4308     ELSE
4309 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_LOAN_HEADER_PUB.UPDATE_LOAN returned error: ' || substr(l_msg_data,1,225));
4310     	FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
4311 		FND_MSG_PUB.Add;
4312         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4313 	    RAISE FND_API.G_EXC_ERROR;
4314     END IF;
4315 
4316     STORE_LAST_PAYMENT_NUMBER(P_LOAN_REC.LOAN_ID);
4317 
4318     /* Generate xml for printable billing statement */
4319     l_start := sysdate;
4320 
4321     GENERATE_BILLING_STATEMENT_XML(
4322 					p_loan_id => P_LOAN_REC.LOAN_ID,
4323 					p_amortization_schedule_id => P_LOAN_REC.NEXT_AMORTIZATION_ID);
4324 
4325     l_end := sysdate;
4326     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Statement generation timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4327 
4328     /* get statement after it stored in db */
4329     open get_statement_cur(P_LOAN_REC.LOAN_ID);
4330     fetch get_statement_cur into l_statement_xml;
4331     close get_statement_cur;
4332 
4333     /* remove xml header */
4334     l_offset := DBMS_LOB.INSTR(lob_loc => l_statement_xml,
4335                               pattern => '>',
4336 			                  offset => 1,
4337 			                  nth => 1);
4338     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have removed header from the statement');
4339     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_offset: ' || l_offset);
4340 
4341     /* copy generated statement to output */
4342     dbms_lob.copy(dest_lob => X_STATEMENT_XML,
4343                  src_lob => l_statement_xml,
4344                  amount => dbms_lob.getlength(l_statement_xml)-l_offset,
4345                  src_offset => l_offset+1);
4346     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have copied generated statement to output');
4347 
4348     if P_COMMIT = FND_API.G_TRUE then
4349         COMMIT WORK;
4350         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan ' || P_LOAN_REC.LOAN_NUMBER);
4351     end if;
4352 
4353     -- END OF BODY OF API
4354     x_return_status := FND_API.G_RET_STS_SUCCESS;
4355 
4356     -- Standard call to get message count and if count is 1, get message info
4357     FND_MSG_PUB.Count_And_Get(
4358                 p_encoded => FND_API.G_FALSE,
4359                 p_count => x_msg_count,
4360                 p_data => x_msg_data);
4361 
4362     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully processed loan ' || P_LOAN_REC.LOAN_NUMBER);
4363     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
4364 
4365 EXCEPTION
4366     WHEN FND_API.G_EXC_ERROR THEN
4367         ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4368         x_return_status := FND_API.G_RET_STS_ERROR;
4369         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4370         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4371         g_cr_return_status := 'WARNING';
4372 
4373         /* building error statement */
4374         BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4375                          P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4376                          P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4377                          P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4378                          P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4379                          P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4380                          P_ERR_COUNT => x_msg_count,
4381                          X_STATEMENT_XML => X_STATEMENT_XML);
4382 
4383     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4384         ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4385         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4386         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4387         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4388         g_cr_return_status := 'WARNING';
4389 
4390         /* building error statement */
4391         BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4392                          P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4393                          P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4394                          P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4395                          P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4396                          P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4397                          P_ERR_COUNT => x_msg_count,
4398                          X_STATEMENT_XML => X_STATEMENT_XML);
4399 
4400     WHEN OTHERS THEN
4401         ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4402         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4403         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
4404             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
4405         END IF;
4406         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4407         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4408         g_cr_return_status := 'WARNING';
4409 
4410         /* building error statement */
4411         BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4412                          P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4413                          P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4414                          P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4415                          P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4416                          P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4417                          P_ERR_COUNT => x_msg_count,
4418                          X_STATEMENT_XML => X_STATEMENT_XML);
4419 
4420 END;
4421 
4422 /*========================================================================
4423  | PRIVATE PROCEDURE CALC_SINGLE_LOAN_NEXT_DD
4424  |
4425  | DESCRIPTION
4426  |      This procedure recalculates next payment due date for single loan
4427  |
4428  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4429  |      CALC_PAST_DUE_LOANS_NEXT_DD
4430  |
4431  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4432  |      LogMessage
4433  |
4434  | PARAMETERS
4435  |      P_LOAN_NEXT_DD_REC  IN      Loan record that needs new due date
4436  |
4437  | KNOWN ISSUES
4438  |      None
4439  |
4440  | NOTES
4441  |      Any interesting aspect of the code in the package body which needs
4442  |      to be stated.
4443  |
4444  | MODIFICATION HISTORY
4445  | Date                  Author            Description of Changes
4446  | 01-01-2004            scherkas          Created
4447  |
4448  *=======================================================================*/
4449 PROCEDURE CALC_SINGLE_LOAN_NEXT_DD(
4450     P_API_VERSION		IN          NUMBER,
4451     P_INIT_MSG_LIST		IN          VARCHAR2,
4452     P_COMMIT			IN          VARCHAR2,
4453     P_VALIDATION_LEVEL	IN          NUMBER,
4454     P_LOAN_NEXT_DD_REC  IN          LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC,
4455     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
4456     X_MSG_COUNT			OUT NOCOPY  NUMBER,
4457     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
4458 IS
4459 
4460 /*-----------------------------------------------------------------------+
4461  | Local Variable Declarations and initializations                       |
4462  +-----------------------------------------------------------------------*/
4463 
4464     l_api_name                      CONSTANT VARCHAR2(30) := 'CALC_SINGLE_LOAN_NEXT_DD';
4465     l_api_version                   CONSTANT NUMBER := 1.0;
4466     l_return_status                 VARCHAR2(1);
4467     l_msg_count                     NUMBER;
4468     l_msg_data                      VARCHAR2(32767);
4469     l_next_payment_due_date         date;
4470     l_object_version_number         number;
4471     l_term_id                       number;
4472     l_version_number                number;
4473     l_prin_bal                      number;
4474     l_cur_phase                     varchar2(30);
4475     l_end                           date;
4476     l_start                         date;
4477 
4478     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
4479     l_amortization_rec              lns_financials.AMORTIZATION_REC;
4480     l_term_rec                      LNS_TERMS_PUB.loan_term_rec_type;
4481 
4482 /*-----------------------------------------------------------------------+
4483  | Cursor Declarations                                                   |
4484  +-----------------------------------------------------------------------*/
4485 
4486     CURSOR term_version_cur(P_LOAN_ID number) IS
4487         select TERM_ID,
4488         OBJECT_VERSION_NUMBER
4489         from LNS_TERMS
4490         where LOAN_ID = P_LOAN_ID;
4491 
4492     /* get loan current phase */
4493     CURSOR loan_cur_phase_cur(P_LOAN_ID number) IS
4494         select nvl(CURRENT_PHASE, 'TERM')
4495         from LNS_LOAN_HEADERS
4496         where LOAN_ID = P_LOAN_ID;
4497 
4498 BEGIN
4499 
4500     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4501     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
4502 
4503     -- Standard start of API savepoint
4504     SAVEPOINT SINGLE_LOAN_NEXT_DD_PVT;
4505     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
4506 
4507     -- Standard call to check for call compatibility
4508     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4509       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4510     END IF;
4511 
4512     -- Initialize message list if p_init_msg_list is set to TRUE
4513     IF FND_API.To_Boolean(p_init_msg_list) THEN
4514       FND_MSG_PUB.initialize;
4515     END IF;
4516 
4517     -- Initialize API return status to success
4518     l_return_status := FND_API.G_RET_STS_SUCCESS;
4519 
4520     -- START OF BODY OF API
4521     l_start := sysdate;
4522 
4523     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4524     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id: ' || P_LOAN_NEXT_DD_REC.LOAN_ID);
4525     LogMessage(FND_LOG.LEVEL_STATEMENT, 'object_version: ' || P_LOAN_NEXT_DD_REC.OBJECT_VERSION_NUMBER);
4526     LogMessage(FND_LOG.LEVEL_STATEMENT, 'next_payment_number: ' || P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER);
4527     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || P_LOAN_NEXT_DD_REC.CUSTOM_PAYMENTS_FLAG);
4528 
4529     /* get loan current phase */
4530     open loan_cur_phase_cur(P_LOAN_NEXT_DD_REC.LOAN_ID);
4531     fetch loan_cur_phase_cur into l_cur_phase;
4532     close loan_cur_phase_cur;
4533 
4534     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_cur_phase);
4535     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting next payment due date from lns_financials.preProcessInstallment...');
4536 
4537     if l_cur_phase = 'TERM' then
4538         lns_financials.preProcessInstallment(
4539                 P_API_VERSION => 1.0,
4540                 P_INIT_MSG_LIST	=> FND_API.G_FALSE,
4541                 P_COMMIT => FND_API.G_FALSE,
4542                 p_loan_Id => P_LOAN_NEXT_DD_REC.LOAN_ID,
4543                 p_installment_number => P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER,
4544                 X_AMORTIZATION_REC => l_amortization_rec,
4545                 X_RETURN_STATUS => l_return_status,
4546                 X_MSG_COUNT => l_msg_count,
4547                 X_MSG_DATA => l_msg_data);
4548     else
4549         lns_financials.preProcessOpenInstallment(
4550 --                P_API_VERSION => 1.0,
4551                 P_INIT_MSG_LIST	=> FND_API.G_FALSE,
4552                 P_COMMIT => FND_API.G_FALSE,
4553                 p_loan_Id => P_LOAN_NEXT_DD_REC.LOAN_ID,
4554                 p_installment_number => P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER,
4555                 X_AMORTIZATION_REC => l_amortization_rec,
4556                 X_RETURN_STATUS => l_return_status,
4557                 X_MSG_COUNT => l_msg_count,
4558                 X_MSG_DATA => l_msg_data);
4559     end if;
4560 
4561     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Returns from lns_financials.preProcessInstallment:');
4562     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
4563     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
4564 
4565     l_next_payment_due_date := l_amortization_rec.due_date;
4566 
4567     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'next_payment_due_date: ' || l_next_payment_due_date);
4568 
4569     if l_next_payment_due_date is null then
4570 
4571 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Next installment date is unknown.');
4572     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INST_DUE_DATE');
4573 		FND_MSG_PUB.Add;
4574         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4575 	    -- RAISE FND_API.G_EXC_ERROR;
4576 
4577     end if;
4578 
4579     /* Updating loan header */
4580     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_LOAN_HEADER_ALL table...');
4581 
4582     l_loan_header_rec.loan_id := P_LOAN_NEXT_DD_REC.LOAN_ID;
4583     l_loan_header_rec.BILLED_FLAG := 'N';
4584     l_object_version_number := P_LOAN_NEXT_DD_REC.OBJECT_VERSION_NUMBER;
4585 
4586     LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_object_version_number,
4587                                     P_LOAN_HEADER_REC => l_loan_header_rec,
4588                                     P_INIT_MSG_LIST => FND_API.G_FALSE,
4589                                     X_RETURN_STATUS => l_return_status,
4590                                     X_MSG_COUNT => l_msg_count,
4591                                     X_MSG_DATA => l_msg_data);
4592 
4593     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4594 
4595     IF l_return_status = 'S' THEN
4596         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
4597     ELSE
4598 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_LOAN_HEADER_PUB.UPDATE_LOAN returned error: ' || substr(l_msg_data,1,225));
4599     	FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
4600 		FND_MSG_PUB.Add;
4601         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4602         RAISE FND_API.G_EXC_ERROR;
4603     END IF;
4604 
4605     /* getting terms version for future update */
4606     open term_version_cur(P_LOAN_NEXT_DD_REC.LOAN_ID);
4607     fetch term_version_cur into l_term_id, l_version_number;
4608     close term_version_cur;
4609 
4610     /* Updating terms */
4611     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_terms w following values:');
4612 
4613     l_term_rec.TERM_ID := l_term_id;
4614     l_term_rec.LOAN_ID := P_LOAN_NEXT_DD_REC.LOAN_ID;
4615 
4616     if l_cur_phase is null or l_cur_phase = 'TERM' then
4617         l_term_rec.NEXT_PAYMENT_DUE_DATE := l_next_payment_due_date;
4618         LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_DUE_DATE: ' || l_term_rec.NEXT_PAYMENT_DUE_DATE);
4619     elsif l_cur_phase = 'OPEN' then
4620         l_term_rec.OPEN_NEXT_PAYMENT_DATE := l_next_payment_due_date;
4621         LogMessage(FND_LOG.LEVEL_STATEMENT, 'OPEN_NEXT_PAYMENT_DATE: ' || l_term_rec.OPEN_NEXT_PAYMENT_DATE);
4622     end if;
4623 
4624     LNS_TERMS_PUB.update_term(P_OBJECT_VERSION_NUMBER => l_version_number,
4625                               p_init_msg_list => FND_API.G_FALSE,
4626                               p_loan_term_rec => l_term_rec,
4627                               X_RETURN_STATUS => l_return_status,
4628                               X_MSG_COUNT => l_msg_count,
4629                               X_MSG_DATA => l_msg_data);
4630 
4631     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4632 
4633     IF l_return_status = 'S' THEN
4634         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_TERMS');
4635     ELSE
4636 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_TERMS_PUB.update_term returned error: ' || substr(l_msg_data,1,225));
4637     	FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_TERM_FAIL');
4638 		FND_MSG_PUB.Add;
4639         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4640 	    RAISE FND_API.G_EXC_ERROR;
4641     END IF;
4642 
4643     l_end := sysdate;
4644     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4645 
4646     if P_COMMIT = FND_API.G_TRUE then
4647         COMMIT WORK;
4648         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4649     end if;
4650 
4651     -- END OF BODY OF API
4652     x_return_status := FND_API.G_RET_STS_SUCCESS;
4653 
4654     -- Standard call to get message count and if count is 1, get message info
4655     FND_MSG_PUB.Count_And_Get(
4656                 p_encoded => FND_API.G_FALSE,
4657                 p_count => x_msg_count,
4658                 p_data => x_msg_data);
4659 
4660     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully processed loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4661     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
4662 
4663 EXCEPTION
4664     WHEN FND_API.G_EXC_ERROR THEN
4665       ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4666       x_return_status := FND_API.G_RET_STS_ERROR;
4667       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4668       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4669     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4670       ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4671       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4672       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4673       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4674     WHEN OTHERS THEN
4675       ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4676       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4677       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
4678             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
4679       END IF;
4680       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4681       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4682 END;
4683 
4684 
4685 
4686 /*========================================================================
4687  | PUBLIC PROCEDURE LNS_BILLING_CONCUR
4688  |
4689  | DESCRIPTION
4690  |      This procedure got called from concurent manager to bill loans
4691  |
4692  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4693  |      None
4694  |
4695  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4696  |      init
4697  |      CALC_PAST_DUE_LOANS_NEXT_DD
4698  |      BILL_LOANS
4699  |      LogMessage
4700  |
4701  | PARAMETERS
4702  |      ERRBUF              OUT     Returns errors to CM
4703  |      RETCODE             OUT     Returns error code to CM
4704  |      TYPE_ID             IN      Inputs loan type id
4705  |      PRODUCT_ID          IN      Inputs loan product id
4706  |      BORROWER_ID         IN      Inputs borrower id
4707  |      LOAN_ID             IN      Inputs loan
4708  |      FROM_DAYS_TO_DD     IN      Inputs from days
4709  |      TO_DAYS_TO_DD       IN      Inputs to days
4710  |
4711  | KNOWN ISSUES
4712  |      None
4713  |
4714  | NOTES
4715  |      Any interesting aspect of the code in the package body which needs
4716  |      to be stated.
4717  |
4718  | MODIFICATION HISTORY
4719  | Date                  Author            Description of Changes
4720  | 01-01-2004            scherkas          Created
4721  |
4722  *=======================================================================*/
4723 PROCEDURE LNS_BILLING_CONCUR(
4724 	    ERRBUF              OUT NOCOPY     VARCHAR2,
4725 	    RETCODE             OUT NOCOPY     VARCHAR2,
4726         TYPE_ID             IN             NUMBER,
4727         PRODUCT_ID          IN             NUMBER,
4728         BORROWER_ID         IN             NUMBER,
4729         LOAN_ID             IN             NUMBER,
4730         FROM_DAYS_TO_DD     IN             NUMBER,
4731         TO_DAYS_TO_DD       IN             NUMBER)
4732 IS
4733 
4734 /*-----------------------------------------------------------------------+
4735  | Local Variable Declarations and initializations                       |
4736  +-----------------------------------------------------------------------*/
4737 	l_msg_count	        number;
4738     l_return            boolean;
4739 BEGIN
4740 
4741     g_cr_return_status := 'NORMAL';
4742 
4743     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4744     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Processing paid off loans...-------->>');
4745 
4746     PROCESS_PAID_LOANS(
4747     	P_API_VERSION => 1.0,
4748     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4749     	P_COMMIT => FND_API.G_TRUE,
4750     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4751         P_LOAN_ID => null,
4752         P_PAYOFF_DATE => sysdate,
4753     	X_RETURN_STATUS	=> RETCODE,
4754     	X_MSG_COUNT => l_msg_count,
4755     	X_MSG_DATA => ERRBUF);
4756 
4757     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4758 
4759     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4760     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Processing paid off loans that must be reactivated...-------->>');
4761 
4762     REACTIVATE_PAID_LOANS(
4763     	P_API_VERSION => 1.0,
4764     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4765     	P_COMMIT => FND_API.G_TRUE,
4766     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4767     	X_RETURN_STATUS	=> RETCODE,
4768     	X_MSG_COUNT => l_msg_count,
4769     	X_MSG_DATA => ERRBUF);
4770 
4771     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4772     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Recalculating due date for past due loans...-------->>');
4773 
4774     CALC_PAST_DUE_LOANS_NEXT_DD(
4775     	P_API_VERSION => 1.0,
4776     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4777     	P_COMMIT => FND_API.G_TRUE,
4778     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4779     	X_RETURN_STATUS	=> RETCODE,
4780     	X_MSG_COUNT => l_msg_count,
4781     	X_MSG_DATA => ERRBUF);
4782 
4783     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4784     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Billing loans...-------->>');
4785 
4786     /* bill loans and stores all last billed statements in g_last_all_statements */
4787     BILL_LOANS(
4788         P_API_VERSION => 1.0,
4789     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4790     	P_COMMIT => FND_API.G_TRUE,
4791     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4792         P_TYPE_ID => TYPE_ID,
4793         P_PRODUCT_ID => PRODUCT_ID,
4794         P_BORROWER_ID => BORROWER_ID,
4795         P_LOAN_ID => LOAN_ID,
4796         P_FROM_DAYS_TO_DD => FROM_DAYS_TO_DD,
4797         P_TO_DAYS_TO_DD => TO_DAYS_TO_DD,
4798     	X_RETURN_STATUS	=> RETCODE,
4799     	X_MSG_COUNT => l_msg_count,
4800     	X_MSG_DATA => ERRBUF);
4801 
4802     /* build billing report and stores it in g_last_billing_report */
4803     BUILD_BILLING_REPORT(P_TYPE_ID => TYPE_ID,
4804                          P_PRODUCT_ID => PRODUCT_ID,
4805                          P_BORROWER_ID => BORROWER_ID,
4806                          P_LOAN_ID => LOAN_ID,
4807                          P_FROM_DAYS_TO_DD => FROM_DAYS_TO_DD,
4808                          P_TO_DAYS_TO_DD => TO_DAYS_TO_DD,
4809                          P_STATEMENTS_XML => g_last_all_statements);
4810 
4811     if g_cr_return_status = 'WARNING' then
4812         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4813                         status => g_cr_return_status,
4814 			            message => 'Not all loans were billed successfully. Please review log file.');
4815     elsif g_cr_return_status = 'ERROR' then
4816         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4817                         status => g_cr_return_status,
4818 			            message => 'Billing process has failed. Please review log file.');
4819     end if;
4820 
4821 END;
4822 
4823 
4824 
4825 /*========================================================================
4826  | PUBLIC PROCEDURE LNS_RVRS_PMT_CONCUR
4827  |
4828  | DESCRIPTION
4829  |      This procedure got called from concurent manager to bill loans
4830  |
4831  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4832  |      None
4833  |
4834  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4835  |      init
4836  |      REVERSE_LAST_AMORTIZATION
4837  |      LogMessage
4838  |
4839  | PARAMETERS
4840  |      ERRBUF              OUT     Returns errors to CM
4841  |      RETCODE             OUT     Returns error code to CM
4842  |      LOAN_ID             IN      Inputs loan
4843  |      REBILL_FLAG         IN      Inputs rebill flag
4844  |
4845  | KNOWN ISSUES
4846  |      None
4847  |
4848  | NOTES
4849  |      Any interesting aspect of the code in the package body which needs
4850  |      to be stated.
4851  |
4852  | MODIFICATION HISTORY
4853  | Date                  Author            Description of Changes
4854  | 01-01-2004            scherkas          Created
4855  |
4856  *=======================================================================*/
4857 PROCEDURE LNS_RVRS_PMT_CONCUR(
4858         ERRBUF              OUT NOCOPY     VARCHAR2,
4859         RETCODE             OUT NOCOPY     VARCHAR2,
4860         LOAN_ID             IN             NUMBER,
4861         REBILL_FLAG         IN             VARCHAR2)
4862 IS
4863 
4864 /*-----------------------------------------------------------------------+
4865  | Local Variable Declarations and initializations                       |
4866  +-----------------------------------------------------------------------*/
4867 	l_msg_count	number;
4868     l_return    boolean;
4869 
4870 BEGIN
4871 
4872     g_cr_return_status := 'NORMAL';
4873 
4874     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4875     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Reversing a loans last payment...-------->>');
4876 
4877     REVERSE_LAST_AMORTIZATION(
4878         P_API_VERSION => 1.0,
4879     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4880     	P_COMMIT => FND_API.G_TRUE,
4881     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4882         P_LOAN_ID => LOAN_ID,
4883         P_REBILL_FLAG => REBILL_FLAG,
4884     	X_RETURN_STATUS	=> RETCODE,
4885     	X_MSG_COUNT => l_msg_count,
4886     	X_MSG_DATA => ERRBUF);
4887 
4888     if g_cr_return_status = 'WARNING' then
4889         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4890                         status => g_cr_return_status,
4891 			            message => 'Reversing process has succeeded with warnings. Please review log file.');
4892     elsif g_cr_return_status = 'ERROR' then
4893         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4894                         status => g_cr_return_status,
4895 			            message => 'Reversing process has failed. Please review log file.');
4896     end if;
4897 
4898 END;
4899 
4900 
4901 
4902 /*========================================================================
4903  | PUBLIC PROCEDURE LNS_ADJUST_RECEIV_CONCUR
4904  |
4905  | DESCRIPTION
4906  |      This procedure got called from concurent manager to adjust original receivables for a loan
4907  |
4908  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4909  |      None
4910  |
4911  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4912  |      init
4913  |      ADJUST_ORIGINAL_RECEIVABLE
4914  |      LogMessage
4915  |
4916  | PARAMETERS
4917  |      ERRBUF              OUT     Returns errors to CM
4918  |      RETCODE             OUT     Returns error code to CM
4919  |      LOAN_ID             IN      Inputs loan
4920  |
4921  | KNOWN ISSUES
4922  |      None
4923  |
4924  | NOTES
4925  |      Any interesting aspect of the code in the package body which needs
4926  |      to be stated.
4927  |
4928  | MODIFICATION HISTORY
4929  | Date                  Author            Description of Changes
4930  | 01-01-2004            scherkas          Created
4931  |
4932  *=======================================================================*/
4933 PROCEDURE LNS_ADJUST_RECEIV_CONCUR(
4934 	    ERRBUF              OUT NOCOPY     VARCHAR2,
4935 	    RETCODE             OUT NOCOPY     VARCHAR2,
4936         LOAN_ID             IN             NUMBER)
4937 IS
4938 
4939 /*-----------------------------------------------------------------------+
4940  | Local Variable Declarations and initializations                       |
4941  +-----------------------------------------------------------------------*/
4942 	l_msg_count	number;
4943     l_return    boolean;
4944 
4945 BEGIN
4946 
4947     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4948 
4949     ADJUST_ORIGINAL_RECEIVABLE(
4950         P_API_VERSION => 1.0,
4951         P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4952         P_COMMIT => FND_API.G_TRUE,
4953         P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4954         P_LOAN_ID => LOAN_ID,
4955         X_RETURN_STATUS	=> RETCODE,
4956         X_MSG_COUNT	=> l_msg_count,
4957         X_MSG_DATA => ERRBUF);
4958 
4959     if RETCODE <> 'S' then
4960         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4961                         status => 'ERROR',
4962 			            message => 'Adjustment of original receivable has failed. Please review log file.');
4963     end if;
4964 
4965 END;
4966 
4967 
4968 /*========================================================================
4969  | PRIVATE PROCEDURE BILL_LOANS_EXT
4970  |
4971  | DESCRIPTION
4972  |      This procedure process passed loans table
4973  |
4974  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4975  |      LNS_BILLING_CONCUR
4976  |
4977  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4978  |      init
4979  |      BILL_SINGLE_LOAN
4980  |      LogMessage
4981  |
4982  | PARAMETERS
4983  |      P_API_VERSION		IN          Standard in parameter
4984  |      P_INIT_MSG_LIST		IN          Standard in parameter
4985  |      P_COMMIT			IN          Standard in parameter
4986  |      P_VALIDATION_LEVEL	IN          Standard in parameter
4987  |      P_LOANS_TO_BILL_TBL IN          Inputs table of loans to be billed
4988  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
4989  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
4990  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
4991  |
4992  | KNOWN ISSUES
4993  |      None
4994  |
4995  | NOTES
4996  |      Any interesting aspect of the code in the package body which needs
4997  |      to be stated.
4998  |
4999  | MODIFICATION HISTORY
5000  | Date                  Author            Description of Changes
5001  | 27-06-2008            scherkas          Created for bug 7129399: bill passed loans table
5002  |
5003  *=======================================================================*/
5004 PROCEDURE BILL_LOANS_EXT(
5005     P_API_VERSION		IN          NUMBER,
5006     P_INIT_MSG_LIST		IN          VARCHAR2,
5007     P_COMMIT			IN          VARCHAR2,
5008     P_VALIDATION_LEVEL	IN          NUMBER,
5009     P_LOANS_TO_BILL_TBL IN          LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL,
5010     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
5011     X_MSG_COUNT			OUT NOCOPY  NUMBER,
5012     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
5013 IS
5014 
5015 /*-----------------------------------------------------------------------+
5016  | Local Variable Declarations and initializations                       |
5017  +-----------------------------------------------------------------------*/
5018 
5019     l_api_name                      CONSTANT VARCHAR2(30) := 'BILL_LOANS_EXT';
5020     l_api_version                   CONSTANT NUMBER := 1.0;
5021     l_return_status                 VARCHAR2(1);
5022     l_msg_count                     NUMBER;
5023     l_msg_data                      VARCHAR2(32767);
5024     l_Count                         number;
5025     l_Count1                        number;
5026     l_new_line                      varchar2(1);
5027     l_error_statements_xml          clob;
5028     l_error_header                  varchar2(20);
5029     l_error_footer                  varchar2(20);
5030     l_single_statement_xml          clob;
5031     l_start                         date;
5032     l_end                           date;
5033     l_start1                        date;
5034     l_end1                          date;
5035 
5036     l_loans_to_bill_tbl		        LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
5037 
5038 /*-----------------------------------------------------------------------+
5039  | Cursor Declarations                                                   |
5040  +-----------------------------------------------------------------------*/
5041 
5042 BEGIN
5043 
5044     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5045 
5046     -- Standard start of API savepoint
5047     SAVEPOINT BILL_LOANS_EXT_PVT;
5048     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
5049 
5050     -- Standard call to check for call compatibility
5051     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5052         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5053     END IF;
5054 
5055     -- Initialize message list if p_init_msg_list is set to TRUE
5056     IF FND_API.To_Boolean(p_init_msg_list) THEN
5057       FND_MSG_PUB.initialize;
5058     END IF;
5059 
5060     -- Initialize API return status to success
5061     l_return_status := FND_API.G_RET_STS_SUCCESS;
5062 
5063     -- START OF BODY OF API
5064 
5065     l_loans_to_bill_tbl := P_LOANS_TO_BILL_TBL;
5066 
5067     dbms_lob.createtemporary(l_error_statements_xml, FALSE, DBMS_LOB.CALL);
5068     dbms_lob.open(l_error_statements_xml, dbms_lob.lob_readwrite);
5069 
5070     /* bill all selected loans */
5071     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing loans...');
5072     FOR l_Count1 IN 1..l_loans_to_bill_tbl.COUNT LOOP
5073 
5074         LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
5075         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing loan #' || l_Count1);
5076 
5077         BEGIN
5078 
5079             SAVEPOINT BILL_LOANS_EXT_PVT1;
5080 
5081             l_start := sysdate;
5082             BILL_SINGLE_LOAN(
5083                     P_API_VERSION => 1.0,
5084                     P_INIT_MSG_LIST	=> FND_API.G_TRUE,
5085                     P_COMMIT => FND_API.G_FALSE,
5086                     P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5087                     P_LOAN_REC => l_loans_to_bill_tbl(l_Count1),
5088                     X_STATEMENT_XML => l_single_statement_xml,
5089                     X_RETURN_STATUS	=> l_return_status,
5090                     X_MSG_COUNT => l_msg_count,
5091                     X_MSG_DATA => l_msg_data);
5092 
5093             l_end := sysdate;
5094             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
5095 
5096             IF l_return_status = 'S' THEN   /* append to all statements clob */
5097 
5098                 -- loan forgiveness adjustment: fix for bug 7387659
5099                 if l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG = 'Y' and
5100                    l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT > 0 and
5101                    g_forgiveness_rec_trx_id is not null then
5102 
5103                     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Performing loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID || '...');
5104                     l_start1 := sysdate;
5105                     FORGIVENESS_ADJUSTMENT(
5106                             P_API_VERSION => 1.0,
5107                             P_INIT_MSG_LIST	=> FND_API.G_TRUE,
5108                             P_COMMIT => FND_API.G_FALSE,
5109                             P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5110                             P_LOAN_ID => l_loans_to_bill_tbl(l_Count1).LOAN_ID,
5111                             X_RETURN_STATUS	=> l_return_status,
5112                             X_MSG_COUNT => l_msg_count,
5113                             X_MSG_DATA => l_msg_data);
5114 
5115                     l_end1 := sysdate;
5116                     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness adjustment timing: ' || round((l_end1 - l_start1)*86400, 2) || ' sec');
5117 
5118                     IF l_return_status = 'S' THEN
5119                         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully performed forgiveness adjustment.');
5120                     ELSE
5121 --                        g_cr_return_status := 'WARNING';
5122 --                        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to perform forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5123                         FND_MESSAGE.SET_NAME('LNS', 'LNS_FORGIVENESS_FAIL');
5124                         FND_MSG_PUB.Add;
5125                         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
5126                         RAISE FND_API.G_EXC_ERROR;
5127                     END IF;
5128 
5129                 else
5130                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will not perform loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
5131                 end if;
5132 
5133                 dbms_lob.Append(g_last_all_statements, l_single_statement_xml);
5134 
5135                 if P_COMMIT = FND_API.G_TRUE then
5136                     COMMIT WORK;
5137                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5138                 end if;
5139 
5140             ELSE    /* otherwise append to errors clob */
5141 
5142                 dbms_lob.Append(l_error_statements_xml, l_single_statement_xml);
5143 
5144             END IF;
5145 
5146         EXCEPTION
5147             WHEN OTHERS THEN
5148                 ROLLBACK TO BILL_LOANS_EXT_PVT1;
5149                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5150                 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5151                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5152                 g_cr_return_status := 'WARNING';
5153 
5154                 /* building error statement */
5155                 BUILD_ERROR_STATEMENT(P_LOAN_ID => l_loans_to_bill_tbl(l_Count1).LOAN_ID,
5156                                 P_PAYMENT_NUMBER => l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_NUMBER,
5157                                 P_PRIN_AMOUNT_DUE => nvl(l_loans_to_bill_tbl(l_Count1).NEXT_PRINCIPAL_AMOUNT, 0),
5158                                 P_INT_AMOUNT_DUE => nvl(l_loans_to_bill_tbl(l_Count1).NEXT_INTEREST_AMOUNT, 0),
5159                                 P_FEE_AMOUNT_DUE => nvl(l_loans_to_bill_tbl(l_Count1).NEXT_FEE_AMOUNT, 0),
5160                                 P_DUE_DATE => l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE,
5161                                 P_ERR_COUNT => x_msg_count,
5162                                 X_STATEMENT_XML => l_single_statement_xml);
5163 
5164                 dbms_lob.Append(l_error_statements_xml, l_single_statement_xml);
5165         END;
5166 
5167     END LOOP;
5168 
5169     /* if there are errors, add errors section */
5170     if dbms_lob.getlength(l_error_statements_xml) > 0 then
5171 
5172         l_new_line := '
5173 ';
5174         l_error_header := l_new_line || '<ERRORS>' || l_new_line;
5175         l_error_footer := l_new_line || '</ERRORS>' || l_new_line;
5176         dbms_lob.writeAppend(g_last_all_statements, length(l_error_header), l_error_header);
5177         dbms_lob.Append(g_last_all_statements, l_error_statements_xml);
5178         dbms_lob.writeAppend(g_last_all_statements, length(l_error_footer), l_error_footer);
5179 
5180     end if;
5181 
5182     IF l_return_status <> 'S' THEN
5183 	-- Above the error statements are created and now raise the error
5184 	RAISE FND_API.G_EXC_ERROR;
5185     END IF;
5186 
5187     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
5188     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || l_loans_to_bill_tbl.COUNT || ' loan(s)');
5189 
5190     if P_COMMIT = FND_API.G_TRUE then
5191         COMMIT WORK;
5192         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loans');
5193     end if;
5194 
5195     -- END OF BODY OF API
5196     x_return_status := FND_API.G_RET_STS_SUCCESS;
5197 
5198     -- Standard call to get message count and if count is 1, get message info
5199     FND_MSG_PUB.Count_And_Get(
5200                 p_encoded => FND_API.G_FALSE,
5201                 p_count => x_msg_count,
5202                 p_data => x_msg_data);
5203 
5204     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5205 
5206 EXCEPTION
5207     WHEN FND_API.G_EXC_ERROR THEN
5208         ROLLBACK TO BILL_LOANS_EXT_PVT;
5209         x_return_status := FND_API.G_RET_STS_ERROR;
5210         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5211         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loans');
5212         g_cr_return_status := 'ERROR';
5213     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5214         ROLLBACK TO BILL_LOANS_EXT_PVT;
5215         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5216         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5217         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loans');
5218         g_cr_return_status := 'ERROR';
5219     WHEN OTHERS THEN
5220         ROLLBACK TO BILL_LOANS_EXT_PVT;
5221         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5222         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5223             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5224         END IF;
5225         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5226         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loans');
5227         g_cr_return_status := 'ERROR';
5228 END;
5229 
5230 
5231 
5232 
5233 /*========================================================================
5234  | PUBLIC PROCEDURE BILL_LOANS
5235  |
5236  | DESCRIPTION
5237  |      This procedure process all available loans
5238  |
5239  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5240  |      LNS_BILLING_CONCUR
5241  |
5242  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5243  |      init
5244  |      BILL_SINGLE_LOAN
5245  |      LogMessage
5246  |
5247  | PARAMETERS
5248  |      P_API_VERSION		IN          Standard in parameter
5249  |      P_INIT_MSG_LIST		IN          Standard in parameter
5250  |      P_COMMIT			IN          Standard in parameter
5251  |      P_VALIDATION_LEVEL	IN          Standard in parameter
5252  |      P_TYPE_ID           IN          Inputs loan type id
5253  |      P_PRODUCT_ID        IN          Inputs loan product id
5254  |      P_BORROWER_ID       IN          Inputs borrower id
5255  |      P_LOAN_ID           IN          Inputs loan id
5256  |      P_FROM_DAYS_TO_DD   IN          Inputs from days
5257  |      P_TO_DAYS_TO_DD     IN          Inputs to days
5258  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
5259  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
5260  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
5261  |
5262  | KNOWN ISSUES
5263  |      None
5264  |
5265  | NOTES
5266  |      Any interesting aspect of the code in the package body which needs
5267  |      to be stated.
5268  |
5269  | MODIFICATION HISTORY
5270  | Date                  Author            Description of Changes
5271  | 01-01-2004            scherkas          Created
5272  |
5273  *=======================================================================*/
5274 PROCEDURE BILL_LOANS(
5275     P_API_VERSION		IN          NUMBER,
5276     P_INIT_MSG_LIST		IN          VARCHAR2,
5277     P_COMMIT			IN          VARCHAR2,
5278     P_VALIDATION_LEVEL	IN          NUMBER,
5279     P_TYPE_ID           IN          NUMBER,
5280     P_PRODUCT_ID        IN          NUMBER,
5281     P_BORROWER_ID       IN          NUMBER,
5282     P_LOAN_ID           IN          NUMBER,
5283     P_FROM_DAYS_TO_DD   IN          NUMBER,
5284     P_TO_DAYS_TO_DD     IN          NUMBER,
5285     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
5286     X_MSG_COUNT			OUT NOCOPY  NUMBER,
5287     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
5288 IS
5289 
5290 /*-----------------------------------------------------------------------+
5291  | Local Variable Declarations and initializations                       |
5292  +-----------------------------------------------------------------------*/
5293 
5294     l_api_name                      CONSTANT VARCHAR2(30) := 'BILL_LOANS';
5295     l_api_version                   CONSTANT NUMBER := 1.0;
5296     l_return_status                 VARCHAR2(1);
5297     l_msg_count                     NUMBER;
5298     l_msg_data                      VARCHAR2(32767);
5299     l_Count                         number;
5300     l_Count1                        number;
5301     l_borrower_id                   number;
5302     l_loan_id                       number;
5303     l_from_date                     number;
5304     l_to_date                       number;
5305     l_new_line                      varchar2(1);
5306     l_error_statements_xml          clob;
5307     l_error_header                  varchar2(20);
5308     l_error_footer                  varchar2(20);
5309     l_single_statement_xml          clob;
5310     l_start                         date;
5311     l_end                           date;
5312     l_start1                        date;
5313     l_end1                          date;
5314     l_type_id                       number;
5315     l_product_id                    number;
5316 
5317     l_loans_to_bill_tbl		        LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
5318 
5319 /*-----------------------------------------------------------------------+
5320  | Cursor Declarations                                                   |
5321  +-----------------------------------------------------------------------*/
5322 
5323     /* get all loans to bill in all stages */
5324     CURSOR loans_to_bill_cur(P_TYPE_ID number, P_PRODUCT_ID number, P_BORROWER_ID number, P_LOAN_ID number, P_FROM_DAYS_TO_DD number, P_TO_DAYS_TO_DD number) IS
5325         select
5326             head.LOAN_ID,
5327             head.LOAN_NUMBER,
5328             head.LOAN_DESCRIPTION,
5329             head.OBJECT_VERSION_NUMBER,
5330             head.FUNDED_AMOUNT,
5331             head.BILL_TO_ACCT_SITE_ID,
5332             decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_FIRST_PAYMENT_DATE, term.FIRST_PAYMENT_DATE),
5333             decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE),
5334             nvl(head.BILLED_FLAG, 'N'),
5335             head.LOAN_CURRENCY,
5336             head.CUST_ACCOUNT_ID,
5337             decode(head.CURRENT_PHASE, 'OPEN', 'N', head.CUSTOM_PAYMENTS_FLAG),
5338             decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_PAYMENT_FREQUENCY, term.LOAN_PAYMENT_FREQUENCY),
5339             term.NUMBER_GRACE_DAYS,
5340             term.PAYMENT_APPLICATION_ORDER,
5341             head.EXCHANGE_RATE_TYPE,
5342             head.EXCHANGE_DATE,
5343             head.EXCHANGE_RATE,
5344             head.ORG_ID,
5345             head.LEGAL_ENTITY_ID,
5346             nvl(head.CURRENT_PHASE, 'TERM'),
5347             nvl(head.FORGIVENESS_FLAG, 'N'),
5348             nvl(head.FORGIVENESS_PERCENT, 0),
5349 	        nvl(head.DISABLE_BILLING_FLAG, 'N')
5350         from LNS_LOAN_HEADERS_VL head,
5351             LNS_TERMS term
5352         where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
5353             and head.loan_id = term.loan_id
5354             and LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) < LNS_FIN_UTILS.getNumberInstallments(head.LOAN_ID, nvl(head.current_phase, 'TERM'))
5355 	        and (head.BILLED_FLAG is null or head.BILLED_FLAG = 'N')
5356             and head.LOAN_TYPE_ID = nvl(P_TYPE_ID, head.LOAN_TYPE_ID)
5357             and nvl(head.PRODUCT_ID, -1) = nvl(P_PRODUCT_ID, nvl(head.PRODUCT_ID, -1)) -- fix for bug 14153250
5358             and head.PRIMARY_BORROWER_ID = nvl(P_BORROWER_ID, head.PRIMARY_BORROWER_ID)
5359             and head.LOAN_ID = nvl(P_LOAN_ID, head.LOAN_ID)
5360             and (trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
5361 				>= nvl(P_FROM_DAYS_TO_DD, trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
5362             and (trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
5363 				<= nvl(P_TO_DAYS_TO_DD, trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
5364         ORDER BY head.LOAN_ID;
5365 
5366 BEGIN
5367 
5368     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5369 
5370     -- Standard start of API savepoint
5371     SAVEPOINT BILL_LOANS_PVT;
5372     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
5373 
5374     -- Standard call to check for call compatibility
5375     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5376         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5377     END IF;
5378 
5379     -- Initialize message list if p_init_msg_list is set to TRUE
5380     IF FND_API.To_Boolean(p_init_msg_list) THEN
5381       FND_MSG_PUB.initialize;
5382     END IF;
5383 
5384     -- Initialize API return status to success
5385     l_return_status := FND_API.G_RET_STS_SUCCESS;
5386 
5387     -- START OF BODY OF API
5388 
5389     /* init all_statements clob */
5390     dbms_lob.createtemporary(g_last_all_statements, FALSE, DBMS_LOB.CALL);
5391     dbms_lob.open(g_last_all_statements, dbms_lob.lob_readwrite);
5392 
5393     init;
5394 
5395     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Passed input parameters:');
5396     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Type ID: ' || P_TYPE_ID);
5397     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Product ID: ' || P_PRODUCT_ID);
5398     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Borrower ID: ' || P_BORROWER_ID);
5399     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ID: ' || P_LOAN_ID);
5400     LogMessage(FND_LOG.LEVEL_STATEMENT, 'From Days/Date: ' || P_FROM_DAYS_TO_DD || GET_BILLING_DATE(P_FROM_DAYS_TO_DD));
5401     LogMessage(FND_LOG.LEVEL_STATEMENT, 'To Days/Date: ' || P_TO_DAYS_TO_DD || GET_BILLING_DATE(P_TO_DAYS_TO_DD));
5402 
5403     /* making decision what to do */
5404     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Using following parameters:');
5405 
5406     if P_LOAN_ID is not null then   -- if loan_id is passed - ignore all other input parameters
5407 
5408         l_loan_id := P_LOAN_ID;
5409         l_type_id := null;
5410         l_product_id := null;
5411         l_borrower_id := null;
5412         l_from_date := null;
5413         l_to_date := null;
5414 
5415         LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Loan ID: ' || l_loan_id);
5416 
5417     elsif P_TYPE_ID is null and P_PRODUCT_ID is null and P_BORROWER_ID is null and P_FROM_DAYS_TO_DD is null and P_TO_DAYS_TO_DD is null then
5418 
5419         if g_days_to_bill_before_dd is null then
5420 --          LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: At least one of the days must be set.');
5421             FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_BILLING_INP_PAR');
5422             FND_MSG_PUB.Add;
5423             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
5424             RAISE FND_API.G_EXC_ERROR;
5425         else
5426             l_to_date := g_days_to_bill_before_dd;
5427             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'To Days/Date: ' || l_to_date || GET_BILLING_DATE(l_to_date));
5428         end if;
5429 
5430 
5431     else
5432 
5433         l_loan_id := null;
5434         l_type_id := P_TYPE_ID;
5435         l_product_id := P_PRODUCT_ID;
5436         l_borrower_id := P_BORROWER_ID;
5437         l_from_date := P_FROM_DAYS_TO_DD;
5438         l_to_date := P_TO_DAYS_TO_DD;
5439 
5440         if l_type_id is not null then
5441             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Type ID: ' || l_type_id);
5442         end if;
5443 
5444         if l_product_id is not null then
5445             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Product ID: ' || l_product_id);
5446         end if;
5447 
5448         if l_borrower_id is not null then
5449             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Borrower ID: ' || l_borrower_id);
5450         end if;
5451 
5452         if l_from_date is not null then
5453             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'From Days/Date: ' || l_from_date || GET_BILLING_DATE(l_from_date));
5454         end if;
5455 
5456         if l_to_date is not null then
5457             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'To Days/Date: ' || l_to_date || GET_BILLING_DATE(l_to_date));
5458         end if;
5459 
5460     end if;
5461 
5462     /* quering for loans */
5463     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Searching for not billed yet loans to process...');
5464 
5465     open loans_to_bill_cur(l_type_id, l_product_id, l_borrower_id, l_loan_id, l_from_date, l_to_date);
5466 
5467     l_Count1 := 0;
5468 
5469     LOOP
5470 
5471         l_Count1 := l_Count1+1;
5472 
5473         fetch loans_to_bill_cur into
5474             l_loans_to_bill_tbl(l_Count1).LOAN_ID,
5475             l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER,
5476             l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION,
5477             l_loans_to_bill_tbl(l_Count1).OBJECT_VERSION_NUMBER,
5478             l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT,
5479             l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID,
5480             l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE,
5481             l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE,
5482             l_loans_to_bill_tbl(l_Count1).BILLED_FLAG,
5483             l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY,
5484             l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID,
5485             l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG,
5486             l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY,
5487             l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS,
5488             l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER,
5489             l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE,
5490             l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE,
5491             l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE,
5492             l_loans_to_bill_tbl(l_Count1).ORG_ID,
5493             l_loans_to_bill_tbl(l_Count1).LEGAL_ENTITY_ID,
5494             l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE,
5495             l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG,
5496             l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT,
5497 	    l_loans_to_bill_tbl(l_Count1).DISABLE_BILLING_FLAG;
5498 
5499         exit when loans_to_bill_cur%NOTFOUND;
5500 
5501         LogMessage(FND_LOG.LEVEL_STATEMENT, ' ');
5502         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan #' || l_Count1);
5503         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
5504         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER: ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5505         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_DESCRIPTION: ' || l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION);
5506         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT);
5507         LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID);
5508         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FIRST_PAYMENT_DATE: ' || l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE);
5509         LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_DUE_DATE: ' || l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE);
5510         LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || l_loans_to_bill_tbl(l_Count1).BILLED_FLAG);
5511         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY);
5512         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID);
5513         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG);
5514         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_PAYMENT_FREQUENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY);
5515         LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS);
5516         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER);
5517         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE);
5518         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE);
5519         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE);
5520         LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || l_loans_to_bill_tbl(l_Count1).ORG_ID);
5521         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LEGAL_ENTITY_ID: ' || l_loans_to_bill_tbl(l_Count1).LEGAL_ENTITY_ID);
5522         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE);
5523         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG);
5524         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_PERCENT: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT);
5525 	LogMessage(FND_LOG.LEVEL_STATEMENT, 'DISABLE_BILLING_FLAG : ' || l_loans_to_bill_tbl(l_Count1).DISABLE_BILLING_FLAG);
5526 
5527     END LOOP;
5528 
5529     close loans_to_bill_cur;
5530 
5531     l_Count := l_loans_to_bill_tbl.count;
5532     LogMessage(FND_LOG.LEVEL_STATEMENT, '______________');
5533     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total found ' || l_Count || ' loan(s) to process');
5534 
5535     if l_Count > 0 then
5536 
5537         dbms_lob.createtemporary(l_error_statements_xml, FALSE, DBMS_LOB.CALL);
5538         dbms_lob.open(l_error_statements_xml, dbms_lob.lob_readwrite);
5539 
5540         /* bill all selected loans */
5541         FOR l_Count1 IN 1..l_loans_to_bill_tbl.COUNT LOOP
5542 
5543             LogMessage(FND_LOG.LEVEL_PROCEDURE, ' ');
5544             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Processing loan #' || l_Count1);
5545 
5546             l_start := sysdate;
5547             BILL_SINGLE_LOAN(
5548             		P_API_VERSION => 1.0,
5549             		P_INIT_MSG_LIST	=> FND_API.G_FALSE,
5550             		P_COMMIT => P_COMMIT,
5551             		P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5552                     P_LOAN_REC => l_loans_to_bill_tbl(l_Count1),
5553                     X_STATEMENT_XML => l_single_statement_xml,
5554             		X_RETURN_STATUS	=> l_return_status,
5555             		X_MSG_COUNT => l_msg_count,
5556             		X_MSG_DATA => l_msg_data);
5557 
5558             l_end := sysdate;
5559             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total billing timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
5560 
5561             IF l_return_status = 'S' THEN   /* append to all statements clob */
5562 
5563                 dbms_lob.Append(g_last_all_statements, l_single_statement_xml);
5564 
5565 	            -- loan forgiveness adjustment: fix for bug 7387659
5566 	            if l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG = 'Y' and
5567 	               l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT > 0 and
5568 	               g_forgiveness_rec_trx_id is not null then
5569 
5570 	                LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Performing loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID || '...');
5571 	                l_start1 := sysdate;
5572 	                FORGIVENESS_ADJUSTMENT(
5573 	                        P_API_VERSION => 1.0,
5574 	                        P_INIT_MSG_LIST	=> FND_API.G_FALSE,
5575 	                        P_COMMIT => P_COMMIT,
5576 	                        P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5577 	                        P_LOAN_ID => l_loans_to_bill_tbl(l_Count1).LOAN_ID,
5578 	                        X_RETURN_STATUS	=> l_return_status,
5579 	                        X_MSG_COUNT => l_msg_count,
5580 	                        X_MSG_DATA => l_msg_data);
5581 
5582 	                IF l_return_status = 'S' THEN
5583 	                    LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully performed forgiveness adjustment.');
5584 	                ELSE
5585 	                    g_cr_return_status := 'WARNING';
5586 	                    LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to perform forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5587 	                END IF;
5588 
5589 	                l_end1 := sysdate;
5590 	                LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness adjustment timing: ' || round((l_end1 - l_start1)*86400, 2) || ' sec');
5591 
5592 	            else
5593 	                LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will not perform loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
5594 	            end if;
5595 
5596             ELSE    /* otherwise append to errors clob */
5597 
5598                 dbms_lob.Append(l_error_statements_xml, l_single_statement_xml);
5599 
5600             END IF;
5601 
5602         END LOOP;
5603 
5604         /* if there are errors, add errors section */
5605         if dbms_lob.getlength(l_error_statements_xml) > 0 then
5606 
5607             l_new_line := '
5608 ';
5609             l_error_header := l_new_line || '<ERRORS>' || l_new_line;
5610             l_error_footer := l_new_line || '</ERRORS>' || l_new_line;
5611             dbms_lob.writeAppend(g_last_all_statements, length(l_error_header), l_error_header);
5612             dbms_lob.Append(g_last_all_statements, l_error_statements_xml);
5613             dbms_lob.writeAppend(g_last_all_statements, length(l_error_footer), l_error_footer);
5614 
5615         end if;
5616 
5617 
5618     END IF;
5619 
5620     LogMessage(FND_LOG.LEVEL_PROCEDURE, '______________');
5621     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total processed ' || (l_Count1-1) || ' loan(s)');
5622 
5623     if P_COMMIT = FND_API.G_TRUE then
5624         COMMIT WORK;
5625         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loans');
5626     end if;
5627 
5628     -- END OF BODY OF API
5629     x_return_status := FND_API.G_RET_STS_SUCCESS;
5630 
5631     -- Standard call to get message count and if count is 1, get message info
5632     FND_MSG_PUB.Count_And_Get(
5633                 p_encoded => FND_API.G_FALSE,
5634                 p_count => x_msg_count,
5635                 p_data => x_msg_data);
5636 
5637     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5638 
5639 EXCEPTION
5640     WHEN FND_API.G_EXC_ERROR THEN
5641         ROLLBACK TO BILL_LOANS_PVT;
5642         x_return_status := FND_API.G_RET_STS_ERROR;
5643         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5644         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5645         g_cr_return_status := 'ERROR';
5646     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5647         ROLLBACK TO BILL_LOANS_PVT;
5648         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5649         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5650         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5651         g_cr_return_status := 'ERROR';
5652     WHEN OTHERS THEN
5653         ROLLBACK TO BILL_LOANS_PVT;
5654         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5655         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5656             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5657         END IF;
5658         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5659         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5660         g_cr_return_status := 'ERROR';
5661 END;
5662 
5663 
5664 
5665 /*========================================================================
5666  | PUBLIC PROCEDURE CALC_PAST_DUE_LOANS_NEXT_DD
5667  |
5668  | DESCRIPTION
5669  |      This procedure recalculates next payment due date for all past due loans
5670  |
5671  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5672  |      LNS_BILLING_CONCUR
5673  |
5674  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5675  |      init
5676  |      CALC_SINGLE_LOAN_NEXT_DD
5677  |      LogMessage
5678  |
5679  | PARAMETERS
5680  |      P_API_VERSION		IN          Standard in parameter
5681  |      P_INIT_MSG_LIST		IN          Standard in parameter
5682  |      P_COMMIT			IN          Standard in parameter
5683  |      P_VALIDATION_LEVEL	IN          Standard in parameter
5684  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
5685  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
5686  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
5687  |
5688  | KNOWN ISSUES
5689  |      None
5690  |
5691  | NOTES
5692  |      Any interesting aspect of the code in the package body which needs
5693  |      to be stated.
5694  |
5695  | MODIFICATION HISTORY
5696  | Date                  Author            Description of Changes
5697  | 01-01-2004            scherkas          Created
5698  |
5699  *=======================================================================*/
5700 PROCEDURE CALC_PAST_DUE_LOANS_NEXT_DD(
5701     P_API_VERSION		IN          NUMBER,
5702     P_INIT_MSG_LIST		IN          VARCHAR2,
5703     P_COMMIT			IN          VARCHAR2,
5704     P_VALIDATION_LEVEL	IN          NUMBER,
5705     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
5706     X_MSG_COUNT			OUT NOCOPY  NUMBER,
5707     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
5708 IS
5709 
5710 /*-----------------------------------------------------------------------+
5711  | Local Variable Declarations and initializations                       |
5712  +-----------------------------------------------------------------------*/
5713 
5714     l_api_name                      CONSTANT VARCHAR2(30) := 'CALC_PAST_DUE_LOANS_NEXT_DD';
5715     l_api_version                   CONSTANT NUMBER := 1.0;
5716     l_return_status                 VARCHAR2(1);
5717     l_msg_count                     NUMBER;
5718     l_msg_data                      VARCHAR2(32767);
5719     l_org_id                        number;
5720     l_Count1                        number;
5721     l_next_payment_due_date         date;
5722     l_end                           date;
5723     l_start                         date;
5724 
5725     l_loans_next_dd_rec             LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
5726 
5727 /*-----------------------------------------------------------------------+
5728  | Cursor Declarations                                                   |
5729  +-----------------------------------------------------------------------*/
5730 
5731     CURSOR past_due_loans_cur IS
5732         select
5733             head.LOAN_ID,
5734             head.LOAN_NUMBER,
5735             head.OBJECT_VERSION_NUMBER,
5736             LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) + 1,
5737             head.CUSTOM_PAYMENTS_FLAG
5738         from LNS_LOAN_HEADERS head,
5739             LNS_TERMS term
5740         where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
5741             and head.loan_id = term.loan_id
5742             and (head.BILLED_FLAG = 'Y' or head.BILLED_FLAG is null)  -- scherkas; fix for bug 5687852
5743             and LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) < LNS_FIN_UTILS.getNumberInstallments(head.LOAN_ID, nvl(head.current_phase, 'TERM'))
5744             and trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE) + nvl(term.NUMBER_GRACE_DAYS, 0)) < trunc(sysdate)
5745         ORDER BY head.LOAN_ID;
5746 
5747 BEGIN
5748 
5749     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5750 
5751     -- Standard start of API savepoint
5752     SAVEPOINT LOANS_NEXT_DD_PVT;
5753     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
5754 
5755     -- Standard call to check for call compatibility
5756     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5757       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5758     END IF;
5759 
5760     -- Initialize message list if p_init_msg_list is set to TRUE
5761     IF FND_API.To_Boolean(p_init_msg_list) THEN
5762       FND_MSG_PUB.initialize;
5763     END IF;
5764 
5765     -- Initialize API return status to success
5766     l_return_status := FND_API.G_RET_STS_SUCCESS;
5767 
5768     -- START OF BODY OF API
5769 
5770     init;
5771 
5772     /* quering for loans past due */
5773     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Searching for loans to process...');
5774 
5775     l_start := sysdate;
5776     open past_due_loans_cur;
5777 
5778     l_Count1 := 1;
5779 
5780     LOOP
5781 
5782             fetch past_due_loans_cur into
5783                 l_loans_next_dd_rec.LOAN_ID,
5784                 l_loans_next_dd_rec.LOAN_NUMBER,
5785                 l_loans_next_dd_rec.OBJECT_VERSION_NUMBER,
5786                 l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER,
5787                 l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG;
5788 
5789             exit when past_due_loans_cur%NOTFOUND;
5790 
5791             l_Count1 := l_Count1+1;
5792 
5793             CALC_SINGLE_LOAN_NEXT_DD(
5794         		P_API_VERSION => 1.0,
5795         		P_INIT_MSG_LIST	=> FND_API.G_FALSE,
5796         		P_COMMIT => P_COMMIT,
5797         		P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5798                 P_LOAN_NEXT_DD_REC => l_loans_next_dd_rec,
5799         		X_RETURN_STATUS	=> l_return_status,
5800         		X_MSG_COUNT => l_msg_count,
5801         		X_MSG_DATA => l_msg_data);
5802 
5803     END LOOP;
5804 
5805     close past_due_loans_cur;
5806 
5807     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
5808     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || (l_Count1-1) || ' loan(s)');
5809     l_end := sysdate;
5810     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All Recalc Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
5811 
5812     if P_COMMIT = FND_API.G_TRUE then
5813         COMMIT WORK;
5814         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loans');
5815     end if;
5816 
5817     -- END OF BODY OF API
5818     x_return_status := FND_API.G_RET_STS_SUCCESS;
5819 
5820     -- Standard call to get message count and if count is 1, get message info
5821     FND_MSG_PUB.Count_And_Get(
5822                 p_encoded => FND_API.G_FALSE,
5823                 p_count => x_msg_count,
5824                 p_data => x_msg_data);
5825 
5826     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5827 
5828 EXCEPTION
5829     WHEN FND_API.G_EXC_ERROR THEN
5830       ROLLBACK TO LOANS_NEXT_DD_PVT;
5831       x_return_status := FND_API.G_RET_STS_ERROR;
5832       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5833       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5834     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5835       ROLLBACK TO LOANS_NEXT_DD_PVT;
5836       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5837       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5838       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5839     WHEN OTHERS THEN
5840       ROLLBACK TO LOANS_NEXT_DD_PVT;
5841       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5842       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5843             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5844       END IF;
5845       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5846       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5847 END;
5848 
5849 
5850 
5851 /*========================================================================
5852  | PUBLIC PROCEDURE REVERSE_LAST_AMORTIZATION
5853  |
5854  | DESCRIPTION
5855  |      This procedure reverses a loans last bill
5856  |
5857  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5858  |      LNS_RVRS_PMT_CONCUR
5859  |
5860  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5861  |      init
5862  |      CREATE_AR_CM
5863  |      LogMessage
5864  |
5865  | PARAMETERS
5866  |      P_API_VERSION		IN          Standard in parameter
5867  |      P_INIT_MSG_LIST		IN          Standard in parameter
5868  |      P_COMMIT			IN          Standard in parameter
5869  |      P_VALIDATION_LEVEL	IN          Standard in parameter
5870  |      P_LOAN_ID           IN          Inputs loan id
5871  |      P_REBILL_FLAG       IN          Inputs rebill flag
5872  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
5873  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
5874  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
5875  |
5876  | KNOWN ISSUES
5877  |      None
5878  |
5879  | NOTES
5880  |      Any interesting aspect of the code in the package body which needs
5881  |      to be stated.
5882  |
5883  | MODIFICATION HISTORY
5884  | Date                  Author            Description of Changes
5885  | 01-01-2004            scherkas          Created
5886  | 01-20-2006            raverma           delete row from rate_scheds for variable rate loan
5887  | 06-16-2006            karamach          Removed code that deleted the rate sch row from lns_rate_schedules
5888  | and added fix in LNS_FINANCIAL_B.pls floatingRatePostProcessing procedure to update existing row to fix bug5331888
5889  | 07-31-2006            karamach          Added code to update active_flag to N in lns_fee_schedules for unbilled manual fees to fix bug5397345
5890  *=======================================================================*/
5891 PROCEDURE REVERSE_LAST_AMORTIZATION(
5892     P_API_VERSION		IN          NUMBER,
5893     P_INIT_MSG_LIST		IN          VARCHAR2,
5894     P_COMMIT			IN          VARCHAR2,
5895     P_VALIDATION_LEVEL	IN          NUMBER,
5896     P_LOAN_ID           IN          NUMBER,
5897     P_REBILL_FLAG       IN          VARCHAR2,
5898     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
5899     X_MSG_COUNT			OUT NOCOPY  NUMBER,
5900     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
5901 IS
5902 
5903 /*-----------------------------------------------------------------------+
5904  | Local Variable Declarations and initializations                       |
5905  +-----------------------------------------------------------------------*/
5906     l_api_name                      CONSTANT VARCHAR2(30) := 'REVERSE_LAST_AMORTIZATION';
5907     l_api_version                   CONSTANT NUMBER := 1.0;
5908     l_return_status                 VARCHAR2(1);
5909     l_msg_count                     NUMBER;
5910     l_msg_data                      VARCHAR2(32767);
5911     l_Count                         number;
5912     l_LAST_PAYMENT_NUMBER           number;
5913     l_amortization_schedule_id      number;
5914     l_batch_source_name             varchar2(50);
5915     l_custom_payment_flag           varchar2(1);
5916     l_next_payment_due_date         date;
5917     l_term_id                       number;
5918     l_version_number                number;
5919     l_BILL_PAY_ID                   number;
5920     l_CUSTOMER_TRX_ID               number;
5921     l_PAYMENT_SCHEDULE_ID           number;
5922     l_CUSTOMER_TRX_LINE_ID          number;
5923     l_LINE_TYPE                     varchar2(30);
5924     l_TRX_AMOUNT                    number;
5925     l_APPLIED_AMOUNT                number;
5926     l_request_id                    number;
5927     l_TRX_NUMBER                    varchar2(20);
5928     l_loan_number                   varchar2(60);
5929     l_due_date                      date;
5930     l_ORG_ID                        number;
5931     l_last_rate_id                  number;
5932     l_rate_type                     varchar2(30);
5933 
5934     l_reverse_tbl                   LNS_BILLING_BATCH_PUB.REVERSE_TBL;
5935     l_loans_next_dd_rec             LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
5936     l_INSTALLMENT_REC               LNS_CUSTOM_PUB.custom_sched_type;
5937     l_principal                     NUMBER;
5938     l_interest                      NUMBER;
5939 
5940 /*-----------------------------------------------------------------------+
5941  | Cursor Declarations                                                   |
5942  +-----------------------------------------------------------------------*/
5943 
5944     CURSOR last_loan_amort_cur(P_LOAN_ID number) IS
5945         select PAYMENT_NUMBER,
5946             DUE_DATE,
5947             AMORTIZATION_SCHEDULE_ID,
5948             RATE_ID
5949         from LNS_AMORTIZATION_SCHEDS
5950         where LOAN_ID = P_LOAN_ID
5951             and AMORTIZATION_SCHEDULE_ID = LNS_BILLING_UTIL_PUB.LAST_AMORTIZATION_SCHED(LOAN_ID);
5952 
5953     CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number) IS
5954         select
5955             trx.trx_number,
5956             trx.customer_trx_id,
5957             psa.payment_schedule_id,
5958             lines.CUST_TRX_LINE_ID,
5959             lines.LINE_TYPE,
5960             lines.AMOUNT,
5961             (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
5962             trx.org_id
5963         from
5964             RA_CUSTOMER_TRX_ALL trx,
5965             lns_amortization_lines lines,
5966             ar_payment_schedules psa
5967         where
5968             trx.customer_trx_id = lines.CUST_TRX_ID and
5969             trx.customer_trx_id = psa.customer_trx_id and
5970             lines.LOAN_ID = P_LOAN_ID and
5971             lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
5972 
5973     CURSOR loan_version_cur(P_LOAN_ID number) IS
5974         select
5975             LOAN_NUMBER,
5976             OBJECT_VERSION_NUMBER,
5977             CUSTOM_PAYMENTS_FLAG
5978         from LNS_LOAN_HEADERS
5979         where LOAN_ID = P_LOAN_ID;
5980 
5981     CURSOR terms_cur(P_LOAN_ID number) IS
5982         select rate_type
5983         from LNS_TERMS
5984         where LOAN_ID = P_LOAN_ID;
5985 
5986 BEGIN
5987 
5988     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5989 
5990     -- Standard start of API savepoint
5991     SAVEPOINT REVERSE_LAST_AMORTIZATION;
5992     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
5993 
5994     -- Standard call to check for call compatibility
5995     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5996       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5997     END IF;
5998 
5999     -- Initialize message list if p_init_msg_list is set to TRUE
6000     IF FND_API.To_Boolean(p_init_msg_list) THEN
6001       FND_MSG_PUB.initialize;
6002     END IF;
6003 
6004     -- Initialize API return status to success
6005     l_return_status := FND_API.G_RET_STS_SUCCESS;
6006 
6007     -- START OF BODY OF API
6008 
6009     init;
6010 
6011     /* getting object version and custom flag for further loan update */
6012 
6013     open loan_version_cur(P_LOAN_ID);
6014     fetch loan_version_cur into l_loan_number, l_version_number, l_custom_payment_flag;
6015     close loan_version_cur;
6016 
6017     open terms_cur(p_loan_id);
6018       fetch terms_cur into l_rate_type;
6019     close terms_cur;
6020 
6021     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reversing loan ' || l_loan_number);
6022     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id ' || P_LOAN_ID);
6023     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'rate type ' || l_rate_type);
6024 
6025     /* verify input parameters */
6026     if P_LOAN_ID is null then
6027 
6028 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
6029     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
6030 		FND_MSG_PUB.Add;
6031         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6032         RAISE FND_API.G_EXC_ERROR;
6033 
6034     end if;
6035 
6036     /* quering for last loan amortization record */
6037     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for last amortization record in LNS_AMORTIZATION_SCHEDS:');
6038 
6039     open last_loan_amort_cur(P_LOAN_ID);
6040 
6041     fetch last_loan_amort_cur into
6042         l_LAST_PAYMENT_NUMBER,
6043         l_due_date,
6044         l_amortization_schedule_id,
6045         l_last_rate_id;
6046 
6047     if last_loan_amort_cur%NOTFOUND then
6048 
6049 		LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'No amortization record found. Exiting');
6050         return;
6051 
6052 	else
6053 
6054 	    LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
6055         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || l_LAST_PAYMENT_NUMBER);
6056         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || l_due_date);
6057         LogMessage(FND_LOG.LEVEL_STATEMENT, 'amortization_schedule_id: ' || l_amortization_schedule_id);
6058 
6059 	end if;
6060 
6061     close last_loan_amort_cur;
6062 
6063     /* Quering for invoices with lines to reverse */
6064     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to reverse...');
6065 
6066     l_Count := 0;
6067     l_principal := 0;
6068     l_interest := 0;
6069     open trx_to_reverse_cur(P_LOAN_ID, l_amortization_schedule_id);
6070 
6071     LOOP
6072 
6073         fetch trx_to_reverse_cur into
6074             l_TRX_NUMBER,
6075             l_CUSTOMER_TRX_ID,
6076             l_PAYMENT_SCHEDULE_ID,
6077             l_CUSTOMER_TRX_LINE_ID,
6078             l_LINE_TYPE,
6079             l_TRX_AMOUNT,
6080             l_APPLIED_AMOUNT,
6081             l_ORG_ID;
6082 
6083         exit when trx_to_reverse_cur%NOTFOUND;
6084 
6085         l_Count := l_Count+1;
6086 
6087         l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
6088         l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
6089         l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
6090         l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
6091         l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
6092         l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
6093         l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
6094         l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
6095 
6096         if l_LINE_TYPE = 'PRIN' then
6097             l_principal := l_principal + l_TRX_AMOUNT;
6098         elsif l_LINE_TYPE = 'INT' then
6099             l_interest := l_interest + l_TRX_AMOUNT;
6100         end if;
6101 
6102     END LOOP;
6103 
6104     close trx_to_reverse_cur;
6105 
6106     /* Verify count */
6107     if l_reverse_tbl.count = 0 then
6108 
6109 	LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'No trx lines found to reverse - will not create AR CM.');
6110      /*
6111     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
6112 		FND_MSG_PUB.Add;
6113         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6114 	    RAISE FND_API.G_EXC_ERROR;
6115     */
6116     else
6117 
6118 	/* Create credit memos */
6119 	CREATE_AR_CM(l_reverse_tbl);
6120 
6121     end if;
6122 
6123 
6124     /* Deleting reamortize record */
6125     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Deleting reamortize record...');
6126 
6127     delete from LNS_AMORTIZATION_SCHEDS
6128     where loan_id = P_LOAN_ID and
6129     REAMORTIZE_FROM_INSTALLMENT = l_last_payment_number;
6130 
6131     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Deleted!');
6132 
6133     /* Update amortization table */
6134     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
6135 
6136     LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
6137         P_AMORTIZATION_SCHEDULE_ID => l_amortization_schedule_id
6138         ,P_REVERSED_FLAG => 'Y'
6139         ,P_REVERSED_DATE => sysdate);
6140 
6141     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
6142 
6143     -- fix for bug 7716548: if its custom schedule call LNS_CUSTOM_PUB.addMissingInstallment to add custom row if needed
6144     if l_custom_payment_flag = 'Y' then
6145 
6146         l_INSTALLMENT_REC.LOAN_ID := P_LOAN_ID;
6147         l_INSTALLMENT_REC.PAYMENT_NUMBER := l_LAST_PAYMENT_NUMBER;
6148         l_INSTALLMENT_REC.DUE_DATE := l_due_date;
6149         l_INSTALLMENT_REC.PRINCIPAL_AMOUNT := l_principal;
6150         l_INSTALLMENT_REC.INTEREST_AMOUNT := l_interest;
6151         l_INSTALLMENT_REC.LOCK_PRIN := 'Y';
6152         l_INSTALLMENT_REC.LOCK_INT := 'Y';
6153 
6154         LNS_CUSTOM_PUB.addMissingInstallment(
6155             P_API_VERSION		=> 1.0,
6156             P_INIT_MSG_LIST		=> FND_API.G_FALSE,
6157             P_COMMIT			=> FND_API.G_FALSE,
6158             P_VALIDATION_LEVEL	=> FND_API.G_VALID_LEVEL_FULL,
6159             P_INSTALLMENT_REC   => l_INSTALLMENT_REC,
6160             X_RETURN_STATUS		=> l_return_status,
6161             X_MSG_COUNT			=> l_msg_count,
6162             X_MSG_DATA	    	=> l_msg_data);
6163 
6164         IF l_return_status <> 'S' THEN
6165             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to insert missing custom schedule row.');
6166         END IF;
6167 
6168     end if;
6169 
6170 
6171     /* recalculating next due date */
6172     l_loans_next_dd_rec.LOAN_ID := P_LOAN_ID;
6173     l_loans_next_dd_rec.LOAN_NUMBER := l_loan_number;
6174     l_loans_next_dd_rec.OBJECT_VERSION_NUMBER := l_version_number;
6175     l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER := l_LAST_PAYMENT_NUMBER;
6176     l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG := l_custom_payment_flag;
6177 
6178     CALC_SINGLE_LOAN_NEXT_DD(
6179         P_API_VERSION => 1.0,
6180         P_INIT_MSG_LIST	=> FND_API.G_FALSE,
6181         P_COMMIT => P_COMMIT,
6182         P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6183         P_LOAN_NEXT_DD_REC => l_loans_next_dd_rec,
6184         X_RETURN_STATUS	=> l_return_status,
6185         X_MSG_COUNT => l_msg_count,
6186         X_MSG_DATA => l_msg_data);
6187 
6188 
6189     IF l_return_status = 'S' THEN
6190         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully calculated next payment due date.');
6191     ELSE
6192 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to calculate next payment due date.');
6193     	FND_MESSAGE.SET_NAME('LNS', 'LNS_CALC_NEXT_DUE_FAIL');
6194 		FND_MSG_PUB.Add;
6195         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6196         RAISE FND_API.G_EXC_ERROR;
6197     END IF;
6198 
6199     STORE_LAST_PAYMENT_NUMBER(P_LOAN_ID);
6200 
6201     if P_COMMIT = FND_API.G_TRUE then
6202         COMMIT WORK;
6203         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
6204     end if;
6205 
6206     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reversed loan ' || l_loan_number);
6207 
6208     /* start billing process if P_REBILL_FLAG = 'Y' */
6209     if P_REBILL_FLAG = 'Y' then
6210 
6211         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Reprocessing Fees for loan ' || l_loan_number || ' payment number ' || l_LAST_PAYMENT_NUMBER);
6212         LNS_FEE_ENGINE.reprocessFees(
6213 	        p_init_msg_list      => FND_API.G_TRUE,
6214             p_commit             => FND_API.G_TRUE,
6215             p_loan_id            => P_LOAN_ID,
6216             p_installment_number => l_LAST_PAYMENT_NUMBER,
6217 	        p_phase	         =>  'TERM',  -- At present change it as 'TERM' which is null
6218             x_return_status      => l_return_status,
6219             x_msg_count          => l_msg_count,
6220             x_msg_data           => l_msg_data);
6221 
6222         IF l_return_status = 'S' THEN
6223             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully reprocessed fees.');
6224         ELSE
6225             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to reprocess fees.');
6226             RAISE FND_API.G_EXC_ERROR;
6227         END IF;
6228 
6229         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Starting billing for loan ' || l_loan_number);
6230 
6231         BILL_LOANS(
6232             P_API_VERSION => 1.0,
6233             P_INIT_MSG_LIST	=> FND_API.G_TRUE,
6234             P_COMMIT => FND_API.G_TRUE,
6235             P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6236             P_TYPE_ID => null,
6237             P_PRODUCT_ID => null,
6238             P_BORROWER_ID => null,
6239             P_LOAN_ID => P_LOAN_ID,
6240             P_FROM_DAYS_TO_DD => null,
6241             P_TO_DAYS_TO_DD => null,
6242             X_RETURN_STATUS	=> l_return_status,
6243             X_MSG_COUNT => l_msg_count,
6244             X_MSG_DATA => l_msg_data);
6245 
6246         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Done billing for loan ' || l_loan_number);
6247 
6248     else
6249         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Before inactivating unbilled manual fees for this installment: ' || l_LAST_PAYMENT_NUMBER);
6250 	--Bug5397345
6251 	--Make sure unbilled manual fees for this reversed installment are inactivated
6252 	UPDATE LNS_FEE_SCHEDULES SET ACTIVE_FLAG = 'N', LAST_UPDATE_DATE = sysdate, LAST_UPDATED_BY = lns_utility_pub.last_updated_by, LAST_UPDATE_LOGIN = lns_utility_pub.last_update_login, OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER+1
6253 	WHERE LOAN_ID = P_LOAN_ID AND BILLED_FLAG = 'N' AND FEE_INSTALLMENT = l_LAST_PAYMENT_NUMBER;
6254         LogMessage(FND_LOG.LEVEL_STATEMENT, 'After inactivating unbilled manual fees by updating the active_flag in lns_fee_schedules for this loan and installment');
6255 
6256     end if;
6257 
6258     -- END OF BODY OF API
6259     x_return_status := FND_API.G_RET_STS_SUCCESS;
6260 
6261     -- Standard call to get message count and if count is 1, get message info
6262     FND_MSG_PUB.Count_And_Get(
6263                 p_encoded => FND_API.G_FALSE,
6264                 p_count => x_msg_count,
6265                 p_data => x_msg_data);
6266 
6267     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6268 
6269 EXCEPTION
6270     WHEN FND_API.G_EXC_ERROR THEN
6271         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6272         x_return_status := FND_API.G_RET_STS_ERROR;
6273         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6274         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6275         g_cr_return_status := 'ERROR';
6276     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6277         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6278         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6279         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6280         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6281         g_cr_return_status := 'ERROR';
6282     WHEN OTHERS THEN
6283         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6284         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6285         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6286             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6287         END IF;
6288         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6289         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6290         g_cr_return_status := 'ERROR';
6291 END;
6292 
6293 
6294 /*========================================================================
6295  | PUBLIC PROCEDURE CREDIT_AMORTIZATION_PARTIAL
6296  |
6297  | DESCRIPTION
6298  |      This procedure will credit a portion of the last amortization.
6299  |       The portion can be principal interest or fees
6300  |
6301  | PSEUDO CODE/LOGIC
6302  |
6303  | PARAMETERS
6304  |      P_API_VERSION       IN          Standard in parameter
6305  |      P_INIT_MSG_LIST     IN          Standard in parameter
6306  |      P_COMMIT            IN          Standard in parameter
6307  |      P_VALIDATION_LEVEL  IN          Standard in parameter
6308  |      P_LOAN_ID           IN          Inputs loan id
6309  |      P_LINE_TYPE         IN          PRIN or INT or FEE
6310  |      X_RETURN_STATUS     OUT NOCOPY  Standard out parameter
6311  |      X_MSG_COUNT         OUT NOCOPY  Standard out parameter
6312  |      X_MSG_DATA          OUT NOCOPY  Standard out parameter
6313  |
6314  | KNOWN ISSUES
6315  |      None
6316  |
6317  | NOTES
6318  |
6319  | MODIFICATION HISTORY
6320  | Date                  Author            Description of Changes
6321  | 10-12-2004            raverma          Created
6322  |
6323  *=======================================================================*/
6324 PROCEDURE CREDIT_AMORTIZATION_PARTIAL(P_API_VERSION       IN          NUMBER
6325                                      ,P_INIT_MSG_LIST     IN          VARCHAR2
6326                                      ,P_COMMIT            IN          VARCHAR2
6327                                      ,P_VALIDATION_LEVEL  IN          NUMBER
6328                                      ,P_LOAN_ID           IN          NUMBER
6329                                      ,P_LINE_TYPE         IN          VARCHAR2
6330                                      ,X_RETURN_STATUS     OUT NOCOPY  VARCHAR
6331                                      ,X_MSG_COUNT         OUT NOCOPY  NUMBER
6332                                      ,X_MSG_DATA          OUT NOCOPY  VARCHAR2)
6333 
6334 is
6335 /*-----------------------------------------------------------------------+
6336  | Local Variable Declarations and initializations                       |
6337  +-----------------------------------------------------------------------*/
6338     l_api_name                      CONSTANT VARCHAR2(30) := 'CREDIT_AMORTIZATION_PARTIAL';
6339     l_api_version                   CONSTANT NUMBER := 1.0;
6340     l_return_status                 VARCHAR2(1);
6341     l_msg_count                     NUMBER;
6342     l_msg_data                      VARCHAR2(32767);
6343     l_Count                         number;
6344     l_LAST_PAYMENT_NUMBER           number;
6345     l_amortization_schedule_id      number;
6346     l_batch_source_name             varchar2(50);
6347     l_custom_payment_flag           varchar2(1);
6348     l_next_payment_due_date         date;
6349     l_term_id                       number;
6350     l_version_number                number;
6351     l_BILL_PAY_ID                   number;
6352     l_CUSTOMER_TRX_ID               number;
6353     l_PAYMENT_SCHEDULE_ID           number;
6354     l_CUSTOMER_TRX_LINE_ID          number;
6355     l_LINE_TYPE                     varchar2(30);
6356     l_TRX_AMOUNT                    number;
6357     l_APPLIED_AMOUNT                number;
6358     l_request_id                    number;
6359     l_TRX_NUMBER                    varchar2(20);
6360     l_loan_number                   varchar2(60);
6361     l_due_date                      date;
6362     l_ORG_ID                        number;
6363 
6364     l_reverse_tbl                   LNS_BILLING_BATCH_PUB.REVERSE_TBL;
6365     l_loans_next_dd_rec             LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
6366 
6367 
6368 /*-----------------------------------------------------------------------+
6369  | Cursor Declarations                                                   |
6370  +-----------------------------------------------------------------------*/
6371 
6372     CURSOR last_loan_amort_cur(P_LOAN_ID number) IS
6373         select PAYMENT_NUMBER,
6374             DUE_DATE,
6375             AMORTIZATION_SCHEDULE_ID
6376         from LNS_AMORTIZATION_SCHEDS
6377         where LOAN_ID = P_LOAN_ID
6378             and AMORTIZATION_SCHEDULE_ID = LNS_BILLING_UTIL_PUB.LAST_AMORTIZATION_SCHED(LOAN_ID);
6379 
6380     CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number, p_line_type varchar2) IS
6381         select
6382             trx.trx_number,
6383             trx.customer_trx_id,
6384             psa.payment_schedule_id,
6385             lines.CUST_TRX_LINE_ID,
6386             lines.LINE_TYPE,
6387             lines.AMOUNT,
6388             (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
6389             trx.org_id
6390         from
6391             RA_CUSTOMER_TRX_ALL trx,
6392             lns_amortization_lines lines,
6393             ar_payment_schedules psa
6394         where
6395             trx.customer_trx_id = lines.CUST_TRX_ID and
6396             trx.customer_trx_id = psa.customer_trx_id and
6397             lines.LOAN_ID = P_LOAN_ID and
6398             lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID and
6399             lines.LINE_TYPE = p_line_type;
6400 
6401     CURSOR loan_version_cur(P_LOAN_ID number) IS
6402         select
6403             LOAN_NUMBER,
6404             OBJECT_VERSION_NUMBER,
6405             CUSTOM_PAYMENTS_FLAG
6406         from LNS_LOAN_HEADERS
6407         where LOAN_ID = P_LOAN_ID;
6408 
6409 BEGIN
6410 
6411     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
6412 
6413     -- Standard start of API savepoint
6414     SAVEPOINT REVERSE_LAST_AMORTIZATION;
6415     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
6416 
6417     -- Standard call to check for call compatibility
6418     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6419       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6420     END IF;
6421 
6422     -- Initialize message list if p_init_msg_list is set to TRUE
6423     IF FND_API.To_Boolean(p_init_msg_list) THEN
6424       FND_MSG_PUB.initialize;
6425     END IF;
6426 
6427     -- Initialize API return status to success
6428     l_return_status := FND_API.G_RET_STS_SUCCESS;
6429 
6430     -- START OF BODY OF API
6431 
6432     init;
6433 
6434     /* getting object version and custom flag for further loan update */
6435 
6436     open loan_version_cur(P_LOAN_ID);
6437     fetch loan_version_cur into l_loan_number, l_version_number, l_custom_payment_flag;
6438     close loan_version_cur;
6439 
6440     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Crediting loan ' || l_loan_number);
6441     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id ' || P_LOAN_ID);
6442 
6443     /* verify input parameters */
6444     if P_LOAN_ID is null then
6445 
6446 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
6447         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
6448         FND_MSG_PUB.Add;
6449         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6450         RAISE FND_API.G_EXC_ERROR;
6451 
6452     end if;
6453 
6454     if P_LINE_TYPE is null then
6455         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LINE_TYPE');
6456         FND_MSG_PUB.Add;
6457         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6458         RAISE FND_API.G_EXC_ERROR;
6459     end if;
6460 
6461     /* quering for last loan amortization record */
6462     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for last amortization record in LNS_AMORTIZATION_SCHEDS:');
6463 
6464     open last_loan_amort_cur(P_LOAN_ID);
6465 
6466     fetch last_loan_amort_cur into
6467         l_LAST_PAYMENT_NUMBER,
6468         l_due_date,
6469         l_amortization_schedule_id;
6470 
6471     if last_loan_amort_cur%NOTFOUND then
6472 
6473         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'No amortization record found. Exiting');
6474         return;
6475 
6476     else
6477 
6478         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
6479         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || l_LAST_PAYMENT_NUMBER);
6480         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || l_due_date);
6481         LogMessage(FND_LOG.LEVEL_STATEMENT, 'amortization_schedule_id: ' || l_amortization_schedule_id);
6482 
6483     end if;
6484 
6485     close last_loan_amort_cur;
6486 
6487     /* Quering for invoices with lines to reverse */
6488     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to Credit...');
6489 
6490     l_Count := 0;
6491     open trx_to_reverse_cur(P_LOAN_ID, l_amortization_schedule_id, p_line_type);
6492 
6493     LOOP
6494 
6495         fetch trx_to_reverse_cur into
6496             l_TRX_NUMBER,
6497             l_CUSTOMER_TRX_ID,
6498             l_PAYMENT_SCHEDULE_ID,
6499             l_CUSTOMER_TRX_LINE_ID,
6500             l_LINE_TYPE,
6501             l_TRX_AMOUNT,
6502             l_APPLIED_AMOUNT,
6503             l_ORG_ID;
6504 
6505         exit when trx_to_reverse_cur%NOTFOUND;
6506 
6507         l_Count := l_Count+1;
6508         l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
6509         l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
6510         l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
6511         l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
6512         l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
6513         l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
6514         l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
6515         l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
6516 
6517     END LOOP;
6518 
6519     close trx_to_reverse_cur;
6520 
6521     /* Verify count */
6522     if l_reverse_tbl.count = 0 then
6523 
6524         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
6525         FND_MSG_PUB.Add;
6526         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6527         RAISE FND_API.G_EXC_ERROR;
6528 
6529     end if;
6530 
6531     /* Create credit memos */
6532     CREATE_AR_CM(l_reverse_tbl);
6533 
6534     if P_COMMIT = FND_API.G_TRUE then
6535         COMMIT WORK;
6536         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
6537     end if;
6538 
6539     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully credit loan ' || l_loan_number);
6540 
6541     -- END OF BODY OF API
6542     x_return_status := FND_API.G_RET_STS_SUCCESS;
6543 
6544     -- Standard call to get message count and if count is 1, get message info
6545     FND_MSG_PUB.Count_And_Get(
6546                 p_encoded => FND_API.G_FALSE,
6547                 p_count => x_msg_count,
6548                 p_data => x_msg_data);
6549 
6550     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6551 
6552 EXCEPTION
6553     WHEN FND_API.G_EXC_ERROR THEN
6554         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6555         x_return_status := FND_API.G_RET_STS_ERROR;
6556         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6557         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6558         g_cr_return_status := 'ERROR';
6559     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6560         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6561         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6562         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6563         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6564         g_cr_return_status := 'ERROR';
6565     WHEN OTHERS THEN
6566         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6567         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6568         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6569             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6570         END IF;
6571         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6572         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6573         g_cr_return_status := 'ERROR';
6574 
6575 END CREDIT_AMORTIZATION_PARTIAL;
6576 
6577 /*========================================================================
6578  | PUBLIC PROCEDURE CREATE_SINGLE_OFFCYCLE_BILL
6579  |
6580  | DESCRIPTION
6581  |      This procedure creates a single OFFCYCLE bill
6582  |
6583  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
6584  |      CREATE_OFFCYCLE_BILLS
6585  |
6586  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
6587  |      init
6588  |      CREATE_AR_INVOICES
6589  |      LogMessage
6590  |
6591  | PARAMETERS
6592  |      P_API_VERSION		IN          Standard in parameter
6593  |      P_INIT_MSG_LIST		IN          Standard in parameter
6594  |      P_COMMIT			IN          Standard in parameter
6595  |      P_VALIDATION_LEVEL	IN          Standard in parameter
6596  |      P_BILL_HEADER_REC   IN          Manual bill header record
6597  |      P_BILL_LINES_TBL    IN          Manual bill lines
6598  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
6599  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
6600  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
6601  |
6602  | KNOWN ISSUES
6603  |      None
6604  |
6605  | NOTES
6606  |      Any interesting aspect of the code in the package body which needs
6607  |      to be stated.
6608  |
6609  | MODIFICATION HISTORY
6610  | Date                  Author            Description of Changes
6611  | 01-01-2004            scherkas          Created
6612  |
6613  *=======================================================================*/
6614 PROCEDURE CREATE_SINGLE_OFFCYCLE_BILL(
6615     P_API_VERSION		    IN              NUMBER,
6616     P_INIT_MSG_LIST		    IN              VARCHAR2,
6617     P_COMMIT			    IN              VARCHAR2,
6618     P_VALIDATION_LEVEL	    IN              NUMBER,
6619     P_BILL_HEADER_REC       IN              LNS_BILLING_BATCH_PUB.BILL_HEADER_REC,
6620     P_BILL_LINES_TBL        IN              LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
6621     X_RETURN_STATUS		    OUT     NOCOPY  VARCHAR2,
6622     X_MSG_COUNT			    OUT     NOCOPY  NUMBER,
6623     X_MSG_DATA	    	    OUT     NOCOPY  VARCHAR2)
6624 IS
6625 
6626 /*-----------------------------------------------------------------------+
6627  | Local Variable Declarations and initializations                       |
6628  +-----------------------------------------------------------------------*/
6629     l_api_name              CONSTANT VARCHAR2(30) := 'CREATE_SINGLE_OFFCYCLE_BILL';
6630     l_api_version           CONSTANT NUMBER := 1.0;
6631     l_return_status         VARCHAR2(1);
6632     l_msg_count             NUMBER;
6633     l_msg_data              VARCHAR2(32767);
6634     l_Count                 NUMBER;
6635     l_prin_balance          number;
6636     l_funded_amount         number;
6637 
6638     l_loan_header_rec       LNS_LOAN_HEADER_PUB.loan_header_rec_type;
6639     l_loan_rec              LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC;
6640     l_lines_tbl             LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
6641 
6642 /*-----------------------------------------------------------------------+
6643  | Cursor Declarations                                                   |
6644  +-----------------------------------------------------------------------*/
6645 
6646     CURSOR loan_cur(P_LOAN_ID number, P_PAYMENT_NUMBER number) IS
6647         select
6648             head.LOAN_ID,
6649             head.LOAN_NUMBER,
6650             head.LOAN_DESCRIPTION,
6651             head.LOAN_CURRENCY,
6652             head.CUST_ACCOUNT_ID,
6653             head.BILL_TO_ACCT_SITE_ID,
6654             term.NUMBER_GRACE_DAYS,
6655             term.PAYMENT_APPLICATION_ORDER,
6656             decode(am.AMORTIZATION_SCHEDULE_ID, null, -1, am.AMORTIZATION_SCHEDULE_ID) AMORTIZATION_SCHEDULE_ID,
6657             head.EXCHANGE_RATE_TYPE,
6658             head.EXCHANGE_DATE,
6659             head.EXCHANGE_RATE,
6660             head.ORG_ID,
6661             head.LEGAL_ENTITY_ID,
6662             head.FUNDED_AMOUNT,
6663             nvl(head.CURRENT_PHASE, 'TERM'),
6664             nvl(head.FORGIVENESS_FLAG, 'N'),
6665             nvl(head.FORGIVENESS_PERCENT, 0),
6666             decode(am.AMORTIZATION_SCHEDULE_ID, null, head.FUNDED_AMOUNT, am.FUNDED_AMOUNT)
6667         from LNS_LOAN_HEADERS_VL head,
6668             LNS_TERMS term,
6669             LNS_AMORTIZATION_SCHEDS am
6670         where  head.LOAN_ID = P_LOAN_ID
6671 	-- Bug#6830765 - Enable billing for all loan status, used in Application fee 'SubmitForApproval Fee'
6672 	 -- and head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
6673             and head.loan_id = term.loan_id
6674             and head.loan_id = am.loan_id(+)
6675             and am.PARENT_AMORTIZATION_ID(+) is null
6676             and am.PAYMENT_NUMBER(+) = P_PAYMENT_NUMBER
6677             and (am.REVERSED_FLAG is null or am.REVERSED_FLAG = 'N')
6678             and nvl(am.PHASE(+), 'TERM') = nvl(head.CURRENT_PHASE, 'TERM');
6679 
6680 	-- getting loan version
6681 	CURSOR loan_version_cur(P_LOAN_ID number) IS
6682 		select OBJECT_VERSION_NUMBER
6683 		from LNS_LOAN_HEADERS
6684 		where LOAN_ID = P_LOAN_ID;
6685 
6686 
6687 BEGIN
6688 
6689     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
6690 
6691     l_lines_tbl := P_BILL_LINES_TBL;
6692 
6693     -- Standard start of API savepoint
6694     SAVEPOINT CREATE_SINGLE_OFFCYCLE_BILL;
6695     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
6696 
6697     -- Standard call to check for call compatibility
6698     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6699       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6700     END IF;
6701 
6702     -- Initialize message list if p_init_msg_list is set to TRUE
6703     IF FND_API.To_Boolean(p_init_msg_list) THEN
6704       FND_MSG_PUB.initialize;
6705     END IF;
6706 
6707     -- Initialize API return status to success
6708     l_return_status := FND_API.G_RET_STS_SUCCESS;
6709 
6710     -- START OF BODY OF API
6711 
6712     init;
6713 
6714     /* verify input parameters */
6715 
6716     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Header data:');
6717     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_BILL_HEADER_REC.LOAN_ID);
6718     LogMessage(FND_LOG.LEVEL_STATEMENT, 'ASSOC_PAYMENT_NUM: ' || P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6719     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || P_BILL_HEADER_REC.DUE_DATE);
6720 
6721     if P_BILL_HEADER_REC.LOAN_ID is null then
6722 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan ID is not set.');
6723     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LOAN');
6724 		FND_MSG_PUB.Add;
6725         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6726         RAISE FND_API.G_EXC_ERROR;
6727     end if;
6728 
6729     if P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM is null then
6730 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Associated Payment Number is not set.');
6731     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_NUM');
6732 		FND_MSG_PUB.Add;
6733         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6734         RAISE FND_API.G_EXC_ERROR;
6735     end if;
6736 
6737     if P_BILL_HEADER_REC.DUE_DATE is null then
6738 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Bill Due Date is not set.');
6739     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_DUE');
6740 		FND_MSG_PUB.Add;
6741         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6742         RAISE FND_API.G_EXC_ERROR;
6743     end if;
6744 
6745     if l_lines_tbl.count = 0 then
6746 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No lines found for header ' || P_BILL_HEADER_REC.HEADER_ID);
6747     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINES');
6748     	FND_MESSAGE.SET_TOKEN('HEADER', P_BILL_HEADER_REC.HEADER_ID);
6749 		FND_MSG_PUB.Add;
6750         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6751         RAISE FND_API.G_EXC_ERROR;
6752     end if;
6753 
6754     /* init amounts */
6755     l_loan_rec.NEXT_PRINCIPAL_AMOUNT := 0;
6756     l_loan_rec.NEXT_INTEREST_AMOUNT := 0;
6757     l_loan_rec.NEXT_FEE_AMOUNT := 0;
6758 
6759     /* looping and suming amounts */
6760     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Lines data:');
6761 
6762     FOR l_Count IN 1..l_lines_tbl.count LOOP
6763 
6764         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Line # ' || l_Count);
6765         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_ID: ' || l_lines_tbl(l_Count).LINE_ID);
6766         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_AMOUNT: ' || l_lines_tbl(l_Count).LINE_AMOUNT);
6767         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_lines_tbl(l_Count).LINE_TYPE);
6768         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_DESC: ' || l_lines_tbl(l_Count).LINE_DESC);
6769         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_REF_ID: ' || l_lines_tbl(l_Count).LINE_REF_ID);
6770         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CASH_RECEIPT_ID: ' || l_lines_tbl(l_Count).CASH_RECEIPT_ID);
6771         LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLY_AMOUNT: ' || l_lines_tbl(l_Count).APPLY_AMOUNT);
6772         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_SCHEDULE_ID: ' || l_lines_tbl(l_Count).FEE_SCHEDULE_ID);
6773 
6774         /* Verifying lines data */
6775         if l_lines_tbl(l_Count).LINE_AMOUNT is null or l_lines_tbl(l_Count).LINE_AMOUNT = 0 then
6776 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Amount for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6777         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_AMOUNT');
6778         	FND_MESSAGE.SET_TOKEN('LINE', l_lines_tbl(l_Count).LINE_ID);
6779     		FND_MSG_PUB.Add;
6780             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6781             RAISE FND_API.G_EXC_ERROR;
6782         end if;
6783 
6784         if l_lines_tbl(l_Count).LINE_TYPE is null then
6785 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Line type for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6786         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_TYPE');
6787         	FND_MESSAGE.SET_TOKEN('LINE', l_lines_tbl(l_Count).LINE_ID);
6788     		FND_MSG_PUB.Add;
6789             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6790             RAISE FND_API.G_EXC_ERROR;
6791         end if;
6792 /*
6793         if l_lines_tbl(l_Count).LINE_DESC is null then
6794             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Line description for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6795             RAISE FND_API.G_EXC_ERROR;
6796         end if;
6797 */
6798         /* Suming amounts */
6799         if l_lines_tbl(l_Count).LINE_TYPE = 'PRIN' then
6800             l_loan_rec.NEXT_PRINCIPAL_AMOUNT := l_loan_rec.NEXT_PRINCIPAL_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6801         elsif l_lines_tbl(l_Count).LINE_TYPE = 'INT' then
6802             l_loan_rec.NEXT_INTEREST_AMOUNT := l_loan_rec.NEXT_INTEREST_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6803         elsif l_lines_tbl(l_Count).LINE_TYPE = 'FEE' then
6804             l_loan_rec.NEXT_FEE_AMOUNT := l_loan_rec.NEXT_FEE_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6805         end if;
6806 
6807     END LOOP;
6808 
6809     /* validate principal amount */
6810     VALIDATE_PRIN_AMOUNT(P_BILL_HEADER_REC.LOAN_ID, l_loan_rec.NEXT_PRINCIPAL_AMOUNT, P_BILL_HEADER_REC.DUE_DATE);
6811 
6812     /* quering for data needed for billing */
6813     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Creating OFFCYCLE bill for loan ' || P_BILL_HEADER_REC.LOAN_ID);
6814 
6815     open loan_cur(P_BILL_HEADER_REC.LOAN_ID, P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6816 
6817     fetch loan_cur into
6818         l_loan_rec.LOAN_ID,
6819         l_loan_rec.LOAN_NUMBER,
6820         l_loan_rec.LOAN_DESCRIPTION,
6821         l_loan_rec.LOAN_CURRENCY,
6822         l_loan_rec.CUST_ACCOUNT_ID,
6823         l_loan_rec.BILL_TO_ADDRESS_ID,
6824         l_loan_rec.NUMBER_GRACE_DAYS,
6825         l_loan_rec.PAYMENT_APPLICATION_ORDER,
6826         l_loan_rec.PARENT_AMORTIZATION_ID,
6827         l_loan_rec.EXCHANGE_RATE_TYPE,
6828         l_loan_rec.EXCHANGE_DATE,
6829         l_loan_rec.EXCHANGE_RATE,
6830         l_loan_rec.ORG_ID,
6831         l_loan_rec.LEGAL_ENTITY_ID,
6832         l_loan_rec.FUNDED_AMOUNT,
6833         l_loan_rec.CURRENT_PHASE,
6834         l_loan_rec.FORGIVENESS_FLAG,
6835         l_loan_rec.FORGIVENESS_PERCENT,
6836         l_funded_amount;
6837 
6838         if loan_cur%NOTFOUND then
6839 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No amortization record found.');
6840         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_INSTALLMENT');
6841         	FND_MESSAGE.SET_TOKEN('LOAN',P_BILL_HEADER_REC.LOAN_ID);
6842         	FND_MESSAGE.SET_TOKEN('INST', P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6843     		FND_MSG_PUB.Add;
6844             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6845             RAISE FND_API.G_EXC_ERROR;
6846         end if;
6847 
6848     close loan_cur;
6849 
6850     if P_BILL_HEADER_REC.CUST_ACCOUNT_ID is not null and P_BILL_HEADER_REC.BILL_TO_ADDRESS_ID is not null then
6851         l_loan_rec.CUST_ACCOUNT_ID := P_BILL_HEADER_REC.CUST_ACCOUNT_ID;
6852         l_loan_rec.BILL_TO_ADDRESS_ID := P_BILL_HEADER_REC.BILL_TO_ADDRESS_ID;
6853     end if;
6854 
6855     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
6856     LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_ID: ' || l_loan_rec.PARENT_AMORTIZATION_ID);
6857     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER: ' || l_loan_rec.LOAN_NUMBER);
6858     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_DESCRIPTION: ' || l_loan_rec.LOAN_DESCRIPTION);
6859     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || l_loan_rec.LOAN_CURRENCY);
6860     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || l_loan_rec.CUST_ACCOUNT_ID);
6861     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || l_loan_rec.BILL_TO_ADDRESS_ID);
6862     LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || l_loan_rec.NUMBER_GRACE_DAYS);
6863     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || l_loan_rec.PAYMENT_APPLICATION_ORDER);
6864     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_loan_rec.EXCHANGE_RATE_TYPE);
6865     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_loan_rec.EXCHANGE_DATE);
6866     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_loan_rec.EXCHANGE_RATE);
6867     LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || l_loan_rec.ORG_ID);
6868     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LEGAL_ENTITY_ID: ' || l_loan_rec.LEGAL_ENTITY_ID);
6869     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || l_loan_rec.FUNDED_AMOUNT);
6870     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_loan_rec.CURRENT_PHASE);
6871     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_FLAG: ' || l_loan_rec.FORGIVENESS_FLAG);
6872     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_PERCENT: ' || l_loan_rec.FORGIVENESS_PERCENT);
6873 
6874     /* setting new values */
6875     l_loan_rec.NEXT_PAYMENT_NUMBER := P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM;
6876     l_loan_rec.NEXT_PAYMENT_DUE_DATE := P_BILL_HEADER_REC.DUE_DATE;
6877     l_loan_rec.NEXT_PAYMENT_LATE_DATE := P_BILL_HEADER_REC.DUE_DATE + nvl(l_loan_rec.NUMBER_GRACE_DAYS, 0);
6878 
6879     /* Inserting new record into LNS_AMORTIZATION_SCHEDS */
6880     l_prin_balance := null;
6881     if l_loan_rec.CURRENT_PHASE is not null and l_loan_rec.CURRENT_PHASE = 'OPEN' then
6882         l_prin_balance := l_loan_rec.FUNDED_AMOUNT;
6883     end if;
6884 
6885     l_loan_rec.PRINCIPAL_BALANCE := null;
6886     if l_loan_rec.CURRENT_PHASE is not null and l_loan_rec.CURRENT_PHASE = 'OPEN' then
6887         l_loan_rec.PRINCIPAL_BALANCE := l_loan_rec.FUNDED_AMOUNT;
6888     end if;
6889     l_loan_rec.FUNDED_AMOUNT := l_funded_amount;
6890     l_loan_rec.DEFERRED_INT_AMOUNT := 0;
6891     l_loan_rec.CURR_CAP_INT_AMOUNT := 0;
6892     l_loan_rec.CAP_INT_AMOUNT := 0;
6893 
6894     /* Creating AR invoices */
6895     CREATE_AR_INVOICES(l_loan_rec, l_lines_tbl);
6896 
6897     STORE_LAST_PAYMENT_NUMBER(l_loan_rec.LOAN_ID);
6898 
6899     GENERATE_BILLING_STATEMENT_XML(
6900 					p_loan_id => l_loan_rec.LOAN_ID,
6901 					p_amortization_schedule_id => l_loan_rec.NEXT_AMORTIZATION_ID);
6902 
6903     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created OFFCYCLE bill');
6904 
6905     -- loan forgiveness adjustment for manual bills: fix for bug 7429910
6906     -- fix for bug 14488464 - dont do forgiveness if its for loan split
6907     if l_loan_rec.FORGIVENESS_FLAG = 'Y' and
6908        l_loan_rec.FORGIVENESS_PERCENT > 0 and
6909        g_forgiveness_rec_trx_id is not null and
6910        P_BILL_HEADER_REC.CUST_ACCOUNT_ID is null and P_BILL_HEADER_REC.BILL_TO_ADDRESS_ID is null  --fix for bug 14488464
6911     then
6912 
6913         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Performing loan forgiveness adjustment...');
6914         FORGIVENESS_ADJUSTMENT(
6915                 P_API_VERSION => 1.0,
6916                 P_INIT_MSG_LIST	=> FND_API.G_TRUE,
6917                 P_COMMIT => FND_API.G_FALSE,
6918                 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6919                 P_LOAN_ID => l_loan_rec.LOAN_ID,
6920                 X_RETURN_STATUS	=> l_return_status,
6921                 X_MSG_COUNT => l_msg_count,
6922                 X_MSG_DATA => l_msg_data);
6923 
6924         IF l_return_status = 'S' THEN
6925             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully performed forgiveness adjustment.');
6926         ELSE
6927             --LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to perform forgiveness adjustment');
6928             FND_MESSAGE.SET_NAME('LNS', 'LNS_FORGIVENESS_FAIL');
6929             FND_MSG_PUB.Add;
6930             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6931             RAISE FND_API.G_EXC_ERROR;
6932         END IF;
6933 
6934     else
6935         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will not perform loan forgiveness adjustment');
6936     end if;
6937 
6938     if P_COMMIT = FND_API.G_TRUE then
6939         COMMIT WORK;
6940         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
6941     end if;
6942 
6943     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created OFFCYCLE bill');
6944 
6945     /* applying cash receipts */
6946 
6947     FOR l_Count IN 1..l_lines_tbl.count LOOP
6948 
6949         if l_lines_tbl(l_Count).CASH_RECEIPT_ID is not null and
6950            l_lines_tbl(l_Count).APPLY_AMOUNT is not null and l_lines_tbl(l_Count).APPLY_AMOUNT > 0 then
6951 
6952             APPLY_RECEIPT(P_CASH_RECEIPT_ID => l_lines_tbl(l_Count).CASH_RECEIPT_ID,
6953                         P_TRX_ID => l_lines_tbl(l_Count).CUSTOMER_TRX_ID,
6954                         P_TRX_LINE_ID => l_lines_tbl(l_Count).CUSTOMER_TRX_LINE_ID,
6955                         P_APPLY_AMOUNT => l_lines_tbl(l_Count).APPLY_AMOUNT);
6956 
6957         end if;
6958 
6959     END LOOP;
6960 
6961     -- END OF BODY OF API
6962     x_return_status := FND_API.G_RET_STS_SUCCESS;
6963 
6964     -- Standard call to get message count and if count is 1, get message info
6965     FND_MSG_PUB.Count_And_Get(
6966                 p_encoded => FND_API.G_FALSE,
6967                 p_count => x_msg_count,
6968                 p_data => x_msg_data);
6969 
6970     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6971 
6972 EXCEPTION
6973     WHEN FND_API.G_EXC_ERROR THEN
6974         ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6975         x_return_status := FND_API.G_RET_STS_ERROR;
6976         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6977         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6978     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6979         ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6980         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6981         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6982         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6983     WHEN OTHERS THEN
6984         ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6985         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6986         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6987             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6988         END IF;
6989         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6990         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6991 END;
6992 
6993 
6994 
6995 /*========================================================================
6996  | PUBLIC PROCEDURE CREATE_OFFCYCLE_BILLS
6997  |
6998  | DESCRIPTION
6999  |      This procedure creates many OFFCYCLE bills
7000  |
7001  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7002  |      None
7003  |
7004  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7005  |      CREATE_SINGLE_OFFCYCLE_BILL
7006  |      LogMessage
7007  |
7008  | PARAMETERS
7009  |      P_API_VERSION		IN          Standard in parameter
7010  |      P_INIT_MSG_LIST		IN          Standard in parameter
7011  |      P_COMMIT			IN          Standard in parameter
7012  |      P_VALIDATION_LEVEL	IN          Standard in parameter
7013  |      P_BILL_HEADERS_TBL  IN          Manual bill headers
7014  |      P_BILL_LINES_TBL    IN          Manual bill lines
7015  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
7016  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
7017  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
7018  |
7019  | KNOWN ISSUES
7020  |      None
7021  |
7022  | NOTES
7023  |      Any interesting aspect of the code in the package body which needs
7024  |      to be stated.
7025  |
7026  | MODIFICATION HISTORY
7027  | Date                  Author            Description of Changes
7028  | 01-01-2004            scherkas          Created
7029  |
7030  *=======================================================================*/
7031 PROCEDURE CREATE_OFFCYCLE_BILLS(
7032     P_API_VERSION		    IN              NUMBER,
7033     P_INIT_MSG_LIST		    IN              VARCHAR2,
7034     P_COMMIT			    IN              VARCHAR2,
7035     P_VALIDATION_LEVEL	    IN              NUMBER,
7036     P_BILL_HEADERS_TBL      IN              LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL,
7037     P_BILL_LINES_TBL        IN              LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
7038     X_RETURN_STATUS		    OUT     NOCOPY  VARCHAR2,
7039     X_MSG_COUNT			    OUT     NOCOPY  NUMBER,
7040     X_MSG_DATA	    	    OUT     NOCOPY  VARCHAR2)
7041 IS
7042 
7043 /*-----------------------------------------------------------------------+
7044  | Local Variable Declarations and initializations                       |
7045  +-----------------------------------------------------------------------*/
7046 
7047     l_api_name              CONSTANT VARCHAR2(30) := 'CREATE_OFFCYCLE_BILLS';
7048     l_api_version           CONSTANT NUMBER := 1.0;
7049     l_return_status         VARCHAR2(1);
7050     l_msg_count             NUMBER;
7051     l_msg_data              VARCHAR2(32767);
7052     l_Count                 NUMBER;
7053     l_Count1                NUMBER;
7054     l_Count2                NUMBER;
7055     l_bill_lines_tbl        LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
7056 
7057 BEGIN
7058 
7059     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7060 
7061     -- Standard start of API savepoint
7062     SAVEPOINT CREATE_OFFCYCLE_BILLS;
7063     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7064 
7065     -- Standard call to check for call compatibility
7066     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7067       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7068     END IF;
7069 
7070     -- Initialize message list if p_init_msg_list is set to TRUE
7071     IF FND_API.To_Boolean(p_init_msg_list) THEN
7072       FND_MSG_PUB.initialize;
7073     END IF;
7074 
7075     -- Initialize API return status to success
7076     l_return_status := FND_API.G_RET_STS_SUCCESS;
7077 
7078     -- START OF BODY OF API
7079     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Creating OFFCYCLE bills...');
7080 
7081     /* Looping thru headers table */
7082     FOR l_Count IN 1..P_BILL_HEADERS_TBL.count LOOP
7083 
7084         if P_BILL_HEADERS_TBL(l_Count).HEADER_ID is null then
7085 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Header ID is not set.');
7086         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_HEADER');
7087     		FND_MSG_PUB.Add;
7088             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7089             RAISE FND_API.G_EXC_ERROR;
7090         end if;
7091 
7092         /* Init lines table */
7093         l_Count2 := 0;
7094         l_bill_lines_tbl.delete;
7095 
7096         /* Looping thru lines table */
7097         FOR l_Count1 IN 1..P_BILL_LINES_TBL.count LOOP
7098 
7099             if P_BILL_LINES_TBL(l_Count1).HEADER_ID is null then
7100 --                LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Header ID for line ' || P_BILL_LINES_TBL(l_Count1).LINE_ID || ' is not set.');
7101             	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_HEADER');
7102             	FND_MESSAGE.SET_TOKEN('LINE', P_BILL_LINES_TBL(l_Count1).LINE_ID);
7103         		FND_MSG_PUB.Add;
7104                 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7105                 RAISE FND_API.G_EXC_ERROR;
7106             end if;
7107 
7108             /* Adding current line record to lines table of current header */
7109             if P_BILL_HEADERS_TBL(l_Count).HEADER_ID = P_BILL_LINES_TBL(l_Count1).HEADER_ID then
7110                 l_Count2 := l_Count2+1;
7111                 l_bill_lines_tbl(l_Count2) := P_BILL_LINES_TBL(l_Count1);
7112             end if;
7113 
7114         END LOOP;
7115 
7116         /* Create a single offcycle bill */
7117         CREATE_SINGLE_OFFCYCLE_BILL(
7118             P_API_VERSION => 1.0,
7119             P_INIT_MSG_LIST	=> FND_API.G_TRUE,
7120             P_COMMIT => FND_API.G_FALSE,
7121             P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
7122             P_BILL_HEADER_REC => P_BILL_HEADERS_TBL(l_Count),
7123             P_BILL_LINES_TBL => l_bill_lines_tbl,
7124             X_RETURN_STATUS	=> l_return_status,
7125             X_MSG_COUNT => l_msg_count,
7126             X_MSG_DATA => l_msg_data);
7127 
7128         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7129             RAISE FND_API.G_EXC_ERROR;
7130         END IF;
7131 
7132     END LOOP;
7133 
7134     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
7135     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || P_BILL_HEADERS_TBL.count || ' OFFCYCLE bill(s)');
7136 
7137     if P_COMMIT = FND_API.G_TRUE then
7138         COMMIT WORK;
7139         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
7140     end if;
7141 
7142     -- END OF BODY OF API
7143     x_return_status := FND_API.G_RET_STS_SUCCESS;
7144 
7145     -- Standard call to get message count and if count is 1, get message info
7146     FND_MSG_PUB.Count_And_Get(
7147                 p_encoded => FND_API.G_FALSE,
7148                 p_count => x_msg_count,
7149                 p_data => x_msg_data);
7150 
7151     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7152 
7153 EXCEPTION
7154     WHEN FND_API.G_EXC_ERROR THEN
7155         ROLLBACK TO CREATE_OFFCYCLE_BILLS;
7156         x_return_status := FND_API.G_RET_STS_ERROR;
7157         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7158         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
7159     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7160         ROLLBACK TO CREATE_OFFCYCLE_BILLS;
7161         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7162         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7163         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
7164     WHEN OTHERS THEN
7165         ROLLBACK TO CREATE_OFFCYCLE_BILLS;
7166         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7167         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7168             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7169         END IF;
7170         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7171         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
7172 END;
7173 
7174 
7175 
7176 /*========================================================================
7177  | PUBLIC PROCEDURE REVERSE_OFFCYCLE_BILL
7178  |
7179  | DESCRIPTION
7180  |      This procedure reverses an offcycle bill
7181  |
7182  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7183  |      None
7184  |
7185  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7186  |      init
7187  |      CREATE_AR_CM
7188  |      LogMessage
7189  |
7190  | PARAMETERS
7191  |      P_API_VERSION		IN          Standard in parameter
7192  |      P_INIT_MSG_LIST		IN          Standard in parameter
7193  |      P_COMMIT			IN          Standard in parameter
7194  |      P_VALIDATION_LEVEL	IN          Standard in parameter
7195  |      P_AMORTIZATION_ID   IN          Input amortization id to reverse
7196  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
7197  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
7198  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
7199  |
7200  | KNOWN ISSUES
7201  |      None
7202  |
7203  | NOTES
7204  |      Any interesting aspect of the code in the package body which needs
7205  |      to be stated.
7206  |
7207  | MODIFICATION HISTORY
7208  | Date                  Author            Description of Changes
7209  | 01-01-2004            scherkas          Created
7210  |
7211  *=======================================================================*/
7212 PROCEDURE REVERSE_OFFCYCLE_BILL(
7213     P_API_VERSION		IN          NUMBER,
7214     P_INIT_MSG_LIST		IN          VARCHAR2,
7215     P_COMMIT			IN          VARCHAR2,
7216     P_VALIDATION_LEVEL	IN          NUMBER,
7217     P_AMORTIZATION_ID   IN          NUMBER,
7218     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
7219     X_MSG_COUNT			OUT NOCOPY  NUMBER,
7220     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
7221 IS
7222 
7223 /*-----------------------------------------------------------------------+
7224  | Local Variable Declarations and initializations                       |
7225  +-----------------------------------------------------------------------*/
7226 
7227     l_api_name                      CONSTANT VARCHAR2(30) := 'REVERSE_OFFCYCLE_BILL';
7228     l_api_version                   CONSTANT NUMBER := 1.0;
7229     l_return_status                 VARCHAR2(1);
7230     l_msg_count                     NUMBER;
7231     l_msg_data                      VARCHAR2(32767);
7232     l_Count                         number;
7233     l_LOAN_ID                       number;
7234     l_BILL_PAY_ID                   number;
7235     l_CUSTOMER_TRX_ID               number;
7236     l_PAYMENT_SCHEDULE_ID           number;
7237     l_CUSTOMER_TRX_LINE_ID          number;
7238     l_LINE_TYPE                     varchar2(30);
7239     l_TRX_AMOUNT                    number;
7240     l_APPLIED_AMOUNT                number;
7241     l_PAYMENT_NUMBER                number;
7242     l_DUE_DATE                      date;
7243     l_PARENT_AMORTIZATION_ID        number;
7244     l_REVERSED_FLAG                 varchar2(1);
7245     l_TRX_NUMBER                    varchar2(20);
7246     l_ORG_ID                        number;
7247 
7248     l_reverse_tbl                   LNS_BILLING_BATCH_PUB.REVERSE_TBL;
7249     l_lns_status			 LNS_LOAN_HEADERS_ALL.loan_status%TYPE;
7250 
7251 /*-----------------------------------------------------------------------+
7252  | Cursor Declarations                                                   |
7253  +-----------------------------------------------------------------------*/
7254 
7255     CURSOR amort_cur(P_AMORTIZATION_ID number) IS
7256         select LOAN_ID,
7257             PAYMENT_NUMBER,
7258             DUE_DATE,
7259             PARENT_AMORTIZATION_ID,
7260             REVERSED_CODE
7261         from LNS_AM_SCHEDS_V
7262         where AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
7263 
7264 
7265     CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number) IS
7266         select
7267             trx.trx_number,
7268             trx.customer_trx_id,
7269             psa.payment_schedule_id,
7270             lines.CUST_TRX_LINE_ID,
7271             lines.LINE_TYPE,
7272             lines.AMOUNT,
7273             (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
7274             trx.org_id
7275         from
7276             RA_CUSTOMER_TRX_ALL trx,
7277             lns_amortization_lines lines,
7278             ar_payment_schedules psa
7279         where
7280             trx.customer_trx_id = lines.CUST_TRX_ID and
7281             trx.customer_trx_id = psa.customer_trx_id and
7282             lines.LOAN_ID = P_LOAN_ID and
7283             lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
7284 
7285 BEGIN
7286 
7287     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7288 
7289     -- Standard start of API savepoint
7290     SAVEPOINT REVERSE_OFFCYCLE_BILL;
7291     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7292 
7293     -- Standard call to check for call compatibility
7294     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7295       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7296     END IF;
7297 
7298     -- Initialize message list if p_init_msg_list is set to TRUE
7299     IF FND_API.To_Boolean(p_init_msg_list) THEN
7300       FND_MSG_PUB.initialize;
7301     END IF;
7302 
7303     -- Initialize API return status to success
7304     l_return_status := FND_API.G_RET_STS_SUCCESS;
7305 
7306     -- START OF BODY OF API
7307 
7308     init;
7309 
7310     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reversing offcycle bill with amortization_id ' || P_AMORTIZATION_ID);
7311 
7312     /* verify input parameters */
7313     if P_AMORTIZATION_ID is null then
7314 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Amortization ID must be set.');
7315     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NO_AMORT');
7316 		FND_MSG_PUB.Add;
7317         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7318         RAISE FND_API.G_EXC_ERROR;
7319     end if;
7320 
7321     /* verify is it really offcycle bill, reversed etc. */
7322     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for details of the amortization:');
7323 
7324     open amort_cur(P_AMORTIZATION_ID);
7325     fetch amort_cur into
7326         l_LOAN_ID,
7327         l_PAYMENT_NUMBER,
7328         l_DUE_DATE,
7329         l_PARENT_AMORTIZATION_ID,
7330         l_REVERSED_FLAG;
7331 
7332     if amort_cur%NOTFOUND then
7333 
7334 --		LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: No amortization record found.');
7335     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NO_BILL_FOUND');
7336 		FND_MSG_PUB.Add;
7337         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7338 	    RAISE FND_API.G_EXC_ERROR;
7339 
7340 	else
7341 
7342         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_LOAN_ID);
7343         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_NUMBER: ' || l_PAYMENT_NUMBER);
7344         LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_DUE_DATE);
7345         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PARENT_AMORTIZATION_ID: ' || l_PARENT_AMORTIZATION_ID);
7346         LogMessage(FND_LOG.LEVEL_STATEMENT, 'REVERSED_FLAG: ' || l_REVERSED_FLAG);
7347 
7348         if l_PARENT_AMORTIZATION_ID is null then
7349 
7350 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The amortization is not offcycle bill.');
7351         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NOT_MAN_BILL');
7352     		FND_MSG_PUB.Add;
7353             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7354             RAISE FND_API.G_EXC_ERROR;
7355 
7356         elsif l_REVERSED_FLAG = 'Y' then
7357 
7358 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The amortization is already reversed.');
7359         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_ALREADY_REV');
7360     		FND_MSG_PUB.Add;
7361             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7362             RAISE FND_API.G_EXC_ERROR;
7363 
7364         end if;
7365 
7366 	end if;
7367 
7368     close amort_cur;
7369 
7370     /* Quering for invoices with lines to reverse */
7371     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to reverse...');
7372 
7373     open trx_to_reverse_cur(l_LOAN_ID, P_AMORTIZATION_ID);
7374 
7375     l_Count := 0;
7376     LOOP
7377         fetch trx_to_reverse_cur into
7378             l_TRX_NUMBER,
7379             l_CUSTOMER_TRX_ID,
7380             l_PAYMENT_SCHEDULE_ID,
7381             l_CUSTOMER_TRX_LINE_ID,
7382             l_LINE_TYPE,
7383             l_TRX_AMOUNT,
7384             l_APPLIED_AMOUNT,
7385             l_ORG_ID;
7386         exit when trx_to_reverse_cur%NOTFOUND;
7387 
7388         l_Count := l_Count+1;
7389         l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
7390         l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
7391         l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
7392         l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
7393         l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
7394         l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
7395         l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
7396         l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
7397 
7398     END LOOP;
7399 
7400     close trx_to_reverse_cur;
7401 
7402     /* Check for table count */
7403     if l_reverse_tbl.count = 0 then
7404 
7405 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No trx lines found to reverse.');
7406     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
7407 		FND_MSG_PUB.Add;
7408         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7409 	    RAISE FND_API.G_EXC_ERROR;
7410 
7411     end if;
7412 
7413     /* Create credit memos */
7414     CREATE_AR_CM(l_reverse_tbl);
7415 
7416     /* Updating amortization table */
7417     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
7418 
7419     LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
7420         P_AMORTIZATION_SCHEDULE_ID => P_AMORTIZATION_ID
7421         ,P_REVERSED_FLAG => 'Y'
7422         ,P_REVERSED_DATE => sysdate);
7423 
7424     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
7425 
7426     SELECT  lhdr.loan_status INTO l_lns_status FROM  lns_loan_headers lhdr WHERE lhdr.loan_id = l_LOAN_ID;
7427 
7428     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'The LoanStatus of loanid '||l_LOAN_ID||' is '||l_lns_status) ;
7429 
7430     -- If the loanStatus is INCOMPLETE, then only update the lns_fee_schedules.billed_flag = 'N' for the submitForApproval fees
7431     IF l_lns_status = 'INCOMPLETE' THEN
7432 	    REVERSE_BILLED_FEES(p_amortization_id);
7433     END IF;
7434 
7435     STORE_LAST_PAYMENT_NUMBER(l_LOAN_ID);
7436 
7437     if P_COMMIT = FND_API.G_TRUE then
7438         COMMIT WORK;
7439         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
7440     end if;
7441 
7442     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reversed offcycle bill');
7443 
7444     -- END OF BODY OF API
7445     x_return_status := FND_API.G_RET_STS_SUCCESS;
7446 
7447     -- Standard call to get message count and if count is 1, get message info
7448     FND_MSG_PUB.Count_And_Get(
7449                 p_encoded => FND_API.G_FALSE,
7450                 p_count => x_msg_count,
7451                 p_data => x_msg_data);
7452 
7453     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7454 
7455 EXCEPTION
7456     WHEN FND_API.G_EXC_ERROR THEN
7457         ROLLBACK TO REVERSE_OFFCYCLE_BILL;
7458         x_return_status := FND_API.G_RET_STS_ERROR;
7459         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7460         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7461     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7462         ROLLBACK TO REVERSE_OFFCYCLE_BILL;
7463         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7464         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7465         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7466     WHEN OTHERS THEN
7467         ROLLBACK TO REVERSE_OFFCYCLE_BILL;
7468         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7469         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7470             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7471         END IF;
7472         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7473         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7474 END;
7475 
7476 
7477 
7478 
7479 /*========================================================================
7480  | PUBLIC PROCEDURE ADJUST_ORIGINAL_RECEIVABLE
7481  |
7482  | DESCRIPTION
7483  |      This procedure adjusts loans original receivable in AR
7484  |
7485  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7486  |      None
7487  |
7488  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7489  |      init
7490  |      LogMessage
7491  |
7492  | PARAMETERS
7493  |      P_API_VERSION		    IN          Standard in parameter
7494  |      P_INIT_MSG_LIST		    IN          Standard in parameter
7495  |      P_COMMIT			    IN          Standard in parameter
7496  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
7497  |      P_LOAN_ID               IN          Loan ID
7498  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
7499  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
7500  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
7501  |
7502  | KNOWN ISSUES
7503  |      None
7504  |
7505  | NOTES
7506  |      Any interesting aspect of the code in the package body which needs
7507  |      to be stated.
7508  |
7509  | MODIFICATION HISTORY
7510  | Date                  Author            Description of Changes
7511  | 01-01-2004            scherkas          Created
7512  |
7513  *=======================================================================*/
7514 PROCEDURE ADJUST_ORIGINAL_RECEIVABLE(
7515     P_API_VERSION		      IN          NUMBER,
7516     P_INIT_MSG_LIST		    IN          VARCHAR2,
7517     P_COMMIT			        IN          VARCHAR2,
7518     P_VALIDATION_LEVEL	  IN          NUMBER,
7519     P_LOAN_ID             IN          NUMBER,
7520     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
7521     X_MSG_COUNT			      OUT NOCOPY  NUMBER,
7522     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
7523 IS
7524 
7525 /*-----------------------------------------------------------------------+
7526  | Local Variable Declarations and initializations                       |
7527  +-----------------------------------------------------------------------*/
7528 
7529     l_api_name                      CONSTANT VARCHAR2(30) := 'ADJUST_ORIGINAL_RECEIVABLE';
7530     l_api_version                   CONSTANT NUMBER := 1.0;
7531     l_return_status                 VARCHAR2(1);
7532     l_msg_count                     NUMBER;
7533     l_msg_data                      VARCHAR2(32767);
7534     l_loan_number                   varchar2(60);
7535 --    l_funded_amount                 number;
7536     l_trx_number                    varchar2(20);
7537     l_payment_schedule_id           number;
7538     l_amount_due_remaining          number;
7539     l_type                          varchar2(15);
7540     l_loan_desc                     varchar2(250);
7541     l_comments                      varchar2(2000);
7542     l_adj_number                    varchar2(20);
7543     l_adj_id                        number;
7544 --    l_version_number                number;
7545     l_ussgl_flag                    varchar2(3);
7546     l_Count                         number;
7547     l_requested_amount              number;
7548     l_line_id                       number;
7549     l_apply_date                    date;
7550     l_gl_date                       date;
7551     l_org_id                        number;
7552 	l_legal_entity_id               number;
7553 
7554 	-- for on-line accounting call
7555 	l_err                           varchar2(50);
7556 	l_ret                           number;
7557 	ls_info                         xla_events_pub_pkg.t_event_source_info;
7558 	l_accounting_batch_id           number;
7559 	l_request_id                    number;
7560 	l_ledger_id                     number;
7561     l_installment_number            number;
7562     l_loan_start_date               date;
7563 
7564 		cursor c_ledger is
7565     SELECT  so.set_of_books_id
7566       FROM  lns_system_options so
7567            ,gl_sets_of_books sb
7568      WHERE sb.set_of_books_id = so.set_of_books_id;
7569 
7570 /*-----------------------------------------------------------------------+
7571  | Cursor Declarations                                                   |
7572  +-----------------------------------------------------------------------*/
7573 
7574     /* querying trx, psa and loan details */
7575     CURSOR orig_rec_cur(P_LOAN_ID number) IS
7576         select
7577 	        loan.loan_number,
7578             loan.LOAN_DESCRIPTION,
7579             lines.REQUESTED_AMOUNT,
7580             lines.reference_number,
7581             lines.REC_ADJUSTMENT_NUMBER,
7582             nvl(lines.payment_schedule_id, psa.payment_schedule_id),
7583             psa.AMOUNT_DUE_REMAINING,
7584             lines.LOAN_LINE_ID,
7585             psa.TRX_DATE,
7586             psa.GL_DATE,
7587             trx.org_id,
7588     		trx.legal_entity_id,
7589             lines.REC_ADJUSTMENT_ID,
7590             nvl(lines.installment_number, 1),
7591             loan.LOAN_START_DATE
7592         from LNS_LOAN_HEADERS_VL loan,
7593             RA_CUSTOMER_TRX trx,
7594             ar_payment_schedules psa,
7595             lns_loan_lines lines
7596         where loan.loan_id = P_LOAN_ID and
7597         	loan.loan_id = lines.loan_id and
7598             lines.reference_type = 'RECEIVABLE' and
7599             lines.REFERENCE_ID = trx.CUSTOMER_TRX_ID and
7600             lines.REFERENCE_NUMBER = trx.trx_number and
7601             lines.end_date is null and
7602             trx.CUSTOMER_TRX_ID = psa.CUSTOMER_TRX_ID and
7603             nvl(lines.installment_number, 1) = psa.terms_sequence_number
7604         order by lines.LOAN_LINE_ID;
7605 
7606 BEGIN
7607 
7608     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7609 
7610     -- Standard start of API savepoint
7611     SAVEPOINT ADJUST_ORIGINAL_RECEIVABLE;
7612     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7613 
7614     -- Standard call to check for call compatibility
7615     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7616       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7617     END IF;
7618 
7619     -- Initialize message list if p_init_msg_list is set to TRUE
7620     IF FND_API.To_Boolean(p_init_msg_list) THEN
7621       FND_MSG_PUB.initialize;
7622     END IF;
7623 
7624     -- Initialize API return status to success
7625     l_return_status := FND_API.G_RET_STS_SUCCESS;
7626 
7627     -- START OF BODY OF API
7628 
7629     init;
7630 
7631     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id :' || P_LOAN_ID);
7632 
7633     /* verify input parameters */
7634     if P_LOAN_ID is null then
7635 
7636 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
7637 	    	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
7638 				FND_MSG_PUB.Add;
7639         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7640         RAISE FND_API.G_EXC_ERROR;
7641 
7642     end if;
7643 
7644     /* checking for system options values required for adjustment */
7645     if g_receivables_trx_id is null then
7646 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Receivables activity name is not set in the system option.');
7647     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_REC_TRX_IN_SYS_OPT');
7648 		FND_MSG_PUB.Add;
7649         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7650         RAISE FND_API.G_EXC_ERROR;
7651 
7652     end if;
7653 
7654 
7655     /* based on profile USSGL_OPTION value verify value for USSGL_TRANSACTION_CODE */
7656     /* commented out by raverma 07-29-2005
7657 		l_ussgl_flag := NVL(FND_PROFILE.VALUE('USSGL_OPTION'), 'N');
7658 
7659     if l_ussgl_flag = 'Y' then
7660 
7661         if g_USSGL_TRANSACTION_CODE is null then
7662     --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: USSGL Transaction Code is not set in the system option.');
7663             FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_CODE_IN_SYS_OPT');
7664             FND_MSG_PUB.Add;
7665             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7666             RAISE FND_API.G_EXC_ERROR;
7667 
7668         end if;
7669 
7670     end if;
7671 		*/
7672 
7673     /* querying trx, psa, loan and loan lines details */
7674     l_Count := 0;
7675     open orig_rec_cur(P_LOAN_ID);
7676 
7677     LOOP
7678 
7679         fetch orig_rec_cur into
7680             l_loan_number,
7681             l_loan_desc,
7682             l_requested_amount,
7683             l_trx_number,
7684             l_adj_number,
7685             l_payment_schedule_id,
7686             l_amount_due_remaining,
7687             l_line_id,
7688             l_apply_date,
7689             l_gl_date,
7690             l_org_id,
7691 		    l_legal_entity_id,
7692             l_adj_id,
7693             l_installment_number,
7694             l_loan_start_date;
7695         exit when orig_rec_cur%NOTFOUND;
7696 
7697         l_Count := l_Count + 1;
7698 
7699         if l_Count = 1 then
7700             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjusting original receivables for loan ' ||  l_loan_number || ' (id ' || P_LOAN_ID || ')...');
7701         end if;
7702 
7703         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjusting receivable ' || l_trx_number || '...');
7704 
7705         /* verify adjust amount and set adjustment type */
7706         if l_requested_amount > l_amount_due_remaining then
7707     --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Adjust amount cannot be greater than receivable remaining amount.');
7708             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
7709             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount: ' || l_amount_due_remaining);
7710             FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_ADJ_AMT');
7711             FND_MSG_PUB.Add;
7712             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7713             RAISE FND_API.G_EXC_ERROR;
7714         else
7715             l_type := 'LINE';
7716         end if;
7717 
7718         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
7719         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount: ' || l_amount_due_remaining);
7720 
7721         /* checking if adjustment for this loan already was made */
7722         if l_adj_number is not null or l_adj_id is not null then
7723     --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Attempt to duplicate adjustment. Receivable has been already adjusted for this loan by adjustment xxx' );
7724             FND_MESSAGE.SET_NAME('LNS', 'LNS_DUPL_ADJ_ORIG_REC');
7725             FND_MESSAGE.SET_TOKEN('ADJ', l_adj_number);
7726             FND_MSG_PUB.Add;
7727             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7728             RAISE FND_API.G_EXC_ERROR;
7729         end if;
7730 
7731         /* buld comments */
7732         l_comments := 'Loan ' || l_loan_number || ' - line ' || l_Count;
7733         /*
7734         if l_loan_desc is not null then
7735             l_comments := 'Loan ' || l_loan_number || ' - ' || l_loan_desc;
7736         else
7737             l_comments := 'Loan ' || l_loan_number;
7738         end if;
7739         */
7740 
7741         -- setting adj_apply_date and adj_gl_date
7742         /*
7743         if trunc(l_apply_date) < trunc(sysdate) then
7744             l_apply_date := sysdate;
7745         end if;
7746 
7747         if trunc(l_gl_date) < trunc(sysdate) then
7748             l_gl_date := sysdate;
7749         end if;
7750         */
7751 
7752         l_apply_date := l_loan_start_date;
7753         l_gl_date := l_loan_start_date;
7754 
7755         /* do adjustment */
7756         CREATE_AR_ADJ(P_TYPE => l_type,
7757             P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id,
7758             P_RECEIVABLES_TRX_ID => g_receivables_trx_id,
7759             P_AMOUNT => -l_requested_amount,
7760             P_APPLY_DATE => l_apply_date,
7761             P_GL_DATE => l_gl_date,
7762             P_CUSTOMER_TRX_LINE_ID => null,
7763             P_CODE_COMBINATION_ID => null,
7764             P_USSGL_TRX_CODE => g_USSGL_TRANSACTION_CODE,
7765             P_REASON_CODE => 'LOAN_CONV',
7766             P_COMMENTS => l_comments,
7767             X_ADJ_ID => l_adj_id,
7768             X_ADJ_NUMBER => l_adj_number,
7769             P_ORG_ID => l_org_id);
7770 
7771         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_LOAN_LINES...');
7772         LNS_LOAN_LINE_PUB.UPDATE_LINE_ADJUSTMENT_NUMBER(
7773             p_init_msg_list             => FND_API.G_FALSE
7774             ,p_loan_id                  => P_LOAN_ID
7775             ,p_loan_line_id             => l_line_id
7776             ,p_rec_adjustment_number    => l_adj_number
7777             ,p_rec_adjustment_id        => l_adj_id
7778             ,P_PAYMENT_SCHEDULE_ID      => l_payment_schedule_id
7779             ,P_INSTALLMENT_NUMBER       => l_installment_number
7780             ,p_adjustment_date          => l_apply_date
7781             ,p_original_flag            => 'Y'
7782             ,x_return_status            => l_return_status
7783             ,x_msg_count                => l_msg_count
7784             ,x_msg_data                 => l_msg_data);
7785 
7786         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
7787         IF l_return_status = 'S' THEN
7788             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully updated LNS_LOAN_LINES');
7789         ELSE
7790             RAISE FND_API.G_EXC_ERROR;
7791         END IF;
7792         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created adjustment ' || l_adj_number || ' for original receivable ' || l_trx_number);
7793 
7794     END LOOP;
7795 
7796     close orig_rec_cur;
7797 
7798     if l_Count = 0 then
7799 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot find receivable to adjust.');
7800     	FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_FIND_ORIG_REC');
7801 		FND_MSG_PUB.Add;
7802         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7803         RAISE FND_API.G_EXC_ERROR;
7804     end if;
7805 
7806     if P_COMMIT = FND_API.G_TRUE then
7807         COMMIT WORK;
7808         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
7809     end if;
7810 
7811     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully adjusted ' || l_Count || ' original receivable for loan ' || l_loan_number);
7812 
7813     -- END OF BODY OF API
7814     x_return_status := FND_API.G_RET_STS_SUCCESS;
7815 
7816     -- Standard call to get message count and if count is 1, get message info
7817     FND_MSG_PUB.Count_And_Get(
7818                 p_encoded => FND_API.G_FALSE,
7819                 p_count => x_msg_count,
7820                 p_data => x_msg_data);
7821 
7822     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7823 
7824 EXCEPTION
7825     WHEN FND_API.G_EXC_ERROR THEN
7826         ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7827         x_return_status := FND_API.G_RET_STS_ERROR;
7828         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7829         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7830     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7831         ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7832         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7833         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7834         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7835     WHEN OTHERS THEN
7836         ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7837         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7838         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7839             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7840         END IF;
7841         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7842         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7843 END;
7844 
7845 
7846 /*========================================================================
7847  | PUBLIC PROCEDURE PREBILL_SINGLE_LOAN
7848  |
7849  | DESCRIPTION
7850  |      This procedure prebill (do initial billing) for single loan
7851  |
7852  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7853  |      None
7854  |
7855  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7856  |      init
7857  |      LogMessage
7858  |      CREATE_OFFCYCLE_BILLS
7859  |
7860  | PARAMETERS
7861  |      P_API_VERSION		    IN          Standard in parameter
7862  |      P_INIT_MSG_LIST		    IN          Standard in parameter
7863  |      P_COMMIT			    IN          Standard in parameter
7864  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
7865  |      P_LOAN_ID               IN          Loan ID
7866  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
7867  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
7868  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
7869  |
7870  | KNOWN ISSUES
7871  |      None
7872  |
7873  | NOTES
7874  |      Any interesting aspect of the code in the package body which needs
7875  |      to be stated.
7876  |
7877  | MODIFICATION HISTORY
7878  | Date                  Author            Description of Changes
7879  | 12-23-2004            scherkas          Created
7880  |
7881  *=======================================================================*/
7882 PROCEDURE PREBILL_SINGLE_LOAN(
7883     P_API_VERSION		    IN          NUMBER,
7884     P_INIT_MSG_LIST		    IN          VARCHAR2,
7885     P_COMMIT			    IN          VARCHAR2,
7886     P_VALIDATION_LEVEL	    IN          NUMBER,
7887     P_LOAN_ID               IN          NUMBER,
7888     X_BILLED_YN             OUT NOCOPY  VARCHAR2,
7889     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
7890     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
7891     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
7892 IS
7893 
7894 /*-----------------------------------------------------------------------+
7895  | Local Variable Declarations and initializations                       |
7896  +-----------------------------------------------------------------------*/
7897 
7898     l_api_name                      CONSTANT VARCHAR2(30) := 'PREBILL_SINGLE_LOAN';
7899     l_api_version                   CONSTANT NUMBER := 1.0;
7900     l_return_status                 VARCHAR2(1);
7901     l_msg_count                     NUMBER;
7902     l_msg_data                      VARCHAR2(32767);
7903     l_installment_num               number;
7904     l_Count                         number;
7905     l_Count1                        number;
7906     l_header_count                  number;
7907     l_loan_number                   varchar2(60);
7908     l_cur_phase                     VARCHAR2(30);
7909 
7910 
7911     l_amortization_rec              LNS_FINANCIALS.AMORTIZATION_REC;
7912     l_fee_tbl                       LNS_FINANCIALS.FEES_TBL;
7913     l_BILL_HEADERS_TBL              LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL;
7914     l_BILL_LINES_TBL                LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
7915 
7916 /*-----------------------------------------------------------------------+
7917  | Cursor Declarations                                                   |
7918  +-----------------------------------------------------------------------*/
7919 
7920     /* querying loan number */
7921     CURSOR loan_cur(P_LOAN_ID number) IS
7922         select
7923             LOAN_NUMBER, nvl(CURRENT_PHASE, 'TERM')
7924         from LNS_LOAN_HEADERS
7925         where LOAN_ID = P_LOAN_ID;
7926 
7927 BEGIN
7928 
7929     X_BILLED_YN := 'N';
7930 
7931     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7932 
7933     -- Standard start of API savepoint
7934     SAVEPOINT PREBILL_SINGLE_LOAN;
7935     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7936 
7937     -- Standard call to check for call compatibility
7938     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7939       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7940     END IF;
7941 
7942     -- Initialize message list if p_init_msg_list is set to TRUE
7943     IF FND_API.To_Boolean(p_init_msg_list) THEN
7944       FND_MSG_PUB.initialize;
7945     END IF;
7946 
7947     -- Initialize API return status to success
7948     l_return_status := FND_API.G_RET_STS_SUCCESS;
7949 
7950     -- START OF BODY OF API
7951     l_installment_num := 0;
7952 
7953     /* verify input parameters */
7954     if P_LOAN_ID is null then
7955 
7956 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
7957         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
7958         FND_MSG_PUB.Add;
7959         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7960         RAISE FND_API.G_EXC_ERROR;
7961 
7962     end if;
7963 
7964     /* getting loan_number */
7965     open loan_cur(P_LOAN_ID);
7966     fetch loan_cur into l_loan_number, l_cur_phase;
7967     close loan_cur;
7968 
7969     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing 0-th installment for loan ' || l_loan_number || '...');
7970 
7971     /* new principal and interest amounts from getInstallment api */
7972     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
7973 
7974     if l_cur_phase = 'TERM' then
7975 
7976         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
7977         lns_financials.getInstallment(
7978             p_api_version => 1.0,
7979             p_init_msg_list => FND_API.G_TRUE,
7980             p_commit => FND_API.G_FALSE,
7981             p_loan_Id => P_LOAN_ID,
7982             p_installment_number => l_installment_num,
7983             x_amortization_rec => l_amortization_rec,
7984             x_fees_tbl => l_fee_tbl,
7985             X_RETURN_STATUS => l_return_status,
7986             X_MSG_COUNT => l_msg_count,
7987             X_MSG_DATA => l_msg_data);
7988 
7989     else
7990 
7991         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getOpenInstallment...');
7992         lns_financials.getOpenInstallment(
7993 --            p_api_version => 1.0,
7994             p_init_msg_list => FND_API.G_TRUE,
7995 --            p_commit => FND_API.G_FALSE,
7996             p_loan_Id => P_LOAN_ID,
7997             p_installment_number => l_installment_num,
7998             x_amortization_rec => l_amortization_rec,
7999             x_fees_tbl => l_fee_tbl,
8000             X_RETURN_STATUS => l_return_status,
8001             X_MSG_COUNT => l_msg_count,
8002             X_MSG_DATA => l_msg_data);
8003 
8004     end if;
8005 
8006     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
8007     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
8008 
8009     if l_return_status <> 'S' then
8010         RAISE FND_API.G_EXC_ERROR;
8011     end if;
8012 
8013     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Data returned from lns_financials.getInstallment:');
8014     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
8015     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
8016     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_amortization_rec.PRINCIPAL_AMOUNT);
8017     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_amortization_rec.INTEREST_AMOUNT);
8018     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CAP_INT_AMOUNT: ' || l_amortization_rec.CAP_INT_AMOUNT);
8019     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_amortization_rec.FEE_AMOUNT);
8020 
8021     l_header_count := 101;
8022     l_BILL_HEADERS_TBL(1).HEADER_ID := l_header_count;
8023     l_BILL_HEADERS_TBL(1).LOAN_ID := P_LOAN_ID;
8024     l_BILL_HEADERS_TBL(1).ASSOC_PAYMENT_NUM := l_installment_num;
8025     l_BILL_HEADERS_TBL(1).DUE_DATE := l_amortization_rec.due_date;
8026 
8027     /* checking for returned values */
8028 
8029     if l_amortization_rec.INSTALLMENT_NUMBER is null and
8030        l_amortization_rec.due_date is null
8031     then
8032 
8033         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'lns_financials.getInstallment returns no data. Nothing to bill. Returning.');
8034         return;
8035 
8036     end if;
8037 
8038     if (l_amortization_rec.PRINCIPAL_AMOUNT is null or l_amortization_rec.PRINCIPAL_AMOUNT = 0) and
8039        (l_amortization_rec.INTEREST_AMOUNT is null or l_amortization_rec.INTEREST_AMOUNT = 0) and
8040        (l_amortization_rec.FEE_AMOUNT is null or l_amortization_rec.FEE_AMOUNT = 0)
8041     then
8042 
8043         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All amounts returned from lns_financials.getInstallment = 0. Nothing to bill.');
8044         return;
8045 
8046     end if;
8047 
8048     l_Count1 := 0;
8049 
8050     /* adding principal and interest amounts into lines table */
8051 
8052     if l_amortization_rec.PRINCIPAL_AMOUNT > 0 then
8053 
8054         l_Count1 := l_Count1 + 1;
8055         l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
8056         l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
8057         l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_amortization_rec.PRINCIPAL_AMOUNT;
8058         l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'PRIN';
8059 
8060     end if;
8061 
8062     if l_amortization_rec.INTEREST_AMOUNT > 0 then
8063 
8064         l_Count1 := l_Count1 + 1;
8065         l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
8066         l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
8067         l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_amortization_rec.INTEREST_AMOUNT;
8068         l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'INT';
8069 
8070     end if;
8071 
8072     /* adding fee amounts into lines table */
8073     FOR l_Count IN 1..l_fee_tbl.count LOOP
8074 
8075         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fee #' || l_Count || ' Name: ' || l_fee_tbl(l_Count).FEE_NAME || ' Amount: ' || l_fee_tbl(l_Count).FEE_AMOUNT);
8076 
8077         l_Count1 := l_Count1 + 1;
8078         l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
8079         l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
8080         l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_fee_tbl(l_Count).FEE_AMOUNT;
8081         l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'FEE';
8082         l_BILL_LINES_TBL(l_Count1).LINE_REF_ID := l_fee_tbl(l_Count).FEE_ID;
8083         l_BILL_LINES_TBL(l_Count1).LINE_DESC := l_fee_tbl(l_Count).FEE_NAME;
8084         l_BILL_LINES_TBL(l_Count1).FEE_SCHEDULE_ID := l_fee_tbl(l_Count).FEE_SCHEDULE_ID;
8085 
8086         /* added fee installment validation by raverma request */
8087         if l_amortization_rec.INSTALLMENT_NUMBER <> l_fee_tbl(l_Count).FEE_INSTALLMENT then
8088 
8089             FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_FEE_INSTAL');
8090             FND_MSG_PUB.Add;
8091             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8092             RAISE FND_API.G_EXC_ERROR;
8093 
8094         end if;
8095 
8096         /* updating LNS_FEE_SCHEDULES with billed_flag = Y */
8097         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_FEE_SCHEDULES with billed_flag = Y ...');
8098         UPDATE LNS_FEE_SCHEDULES
8099         SET
8100             BILLED_FLAG                     =     'Y',
8101             last_update_date                =     LNS_UTILITY_PUB.LAST_UPDATE_DATE,
8102             last_updated_by                 =     LNS_UTILITY_PUB.LAST_UPDATED_BY,
8103             last_update_login               =     LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
8104         WHERE
8105             FEE_SCHEDULE_ID = l_fee_tbl(l_Count).fee_schedule_id;
8106         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_FEE_SCHEDULES');
8107 
8108     END LOOP;
8109 
8110     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS...');
8111 
8112     LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS(
8113         P_API_VERSION		    => 1.0,
8114         P_INIT_MSG_LIST		    => FND_API.G_TRUE,
8115         P_COMMIT			    => FND_API.G_FALSE,
8116         P_VALIDATION_LEVEL		=> FND_API.G_VALID_LEVEL_FULL,
8117         P_BILL_HEADERS_TBL      => l_BILL_HEADERS_TBL,
8118         P_BILL_LINES_TBL        => l_BILL_LINES_TBL,
8119         x_return_status         => l_return_status,
8120         x_msg_count             => l_msg_count,
8121         x_msg_data              => l_msg_data);
8122 
8123     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
8124 
8125     if l_return_status <> 'S' then
8126         RAISE FND_API.G_EXC_ERROR;
8127     end if;
8128 
8129     if P_COMMIT = FND_API.G_TRUE then
8130         COMMIT WORK;
8131         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
8132     end if;
8133 
8134     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully billed 0-th installment for loan ' || l_loan_number);
8135 
8136     -- END OF BODY OF API
8137     x_return_status := FND_API.G_RET_STS_SUCCESS;
8138     X_BILLED_YN := 'Y';
8139 
8140     -- Standard call to get message count and if count is 1, get message info
8141     FND_MSG_PUB.Count_And_Get(
8142                 p_encoded => FND_API.G_FALSE,
8143                 p_count => x_msg_count,
8144                 p_data => x_msg_data);
8145 
8146     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
8147 
8148 EXCEPTION
8149     WHEN FND_API.G_EXC_ERROR THEN
8150         ROLLBACK TO PREBILL_SINGLE_LOAN;
8151         x_return_status := FND_API.G_RET_STS_ERROR;
8152         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8153         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8154     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8155         ROLLBACK TO PREBILL_SINGLE_LOAN;
8156         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8157         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8158         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8159     WHEN OTHERS THEN
8160         ROLLBACK TO PREBILL_SINGLE_LOAN;
8161         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8162         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
8163             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
8164         END IF;
8165         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8166         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8167 END;
8168 
8169 
8170 /*========================================================================
8171  | PUBLIC PROCEDURE GET_FORGIVENESS_AMOUNT
8172  |
8173  | DESCRIPTION
8174  |      This procedure returns forgiveness amount based on forgiveness settings and passed amount
8175  |
8176  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
8177  |      None
8178  |
8179  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
8180  |      LogMessage
8181  |
8182  | PARAMETERS
8183  |      P_LOAN_ID               IN          Loan ID
8184  |      P_AMOUNT                IN          Passed amount
8185  |      X_FORGIVENESS_AMOUNT    OUT NOCOPY  Returned forgiveness amount
8186  |      X_REMAINING_AMOUNT      OUT NOCOPY  Returned remianing amount
8187  |
8188  | KNOWN ISSUES
8189  |      None
8190  |
8191  | NOTES
8192  |      Any interesting aspect of the code in the package body which needs
8193  |      to be stated.
8194  |
8195  | MODIFICATION HISTORY
8196  | Date                  Author            Description of Changes
8197  | 04-27-2008            scherkas          Created for bug 8400747
8198  |
8199  *=======================================================================*/
8200 PROCEDURE GET_FORGIVENESS_AMOUNT(
8201     P_LOAN_ID               IN          NUMBER,
8202     P_AMOUNT                IN          NUMBER,
8203     X_FORGIVENESS_AMOUNT    OUT NOCOPY  NUMBER,
8204     X_REMAINING_AMOUNT      OUT NOCOPY  NUMBER)
8205 IS
8206 
8207 /*-----------------------------------------------------------------------+
8208  | Local Variable Declarations and initializations                       |
8209  +-----------------------------------------------------------------------*/
8210 
8211     l_api_name                      CONSTANT VARCHAR2(30) := 'GET_FORGIVENESS_AMOUNT';
8212     l_forgiveness_flag              varchar2(1);
8213     l_forgiveness_percent           number;
8214     l_precision                     number;
8215     l_ext_precision                 number;
8216     l_min_acct_unit                 number;
8217     l_currency                      VARCHAR2(15);
8218 
8219 /*-----------------------------------------------------------------------+
8220  | Cursor Declarations                                                   |
8221  +-----------------------------------------------------------------------*/
8222 
8223     /* querying psa and loan details */
8224     CURSOR details_cur(P_LOAN_ID number) IS
8225         select
8226             nvl(loan.FORGIVENESS_FLAG, 'N'),
8227             nvl(loan.FORGIVENESS_PERCENT, 0),
8228             loan.LOAN_CURRENCY
8229         from LNS_LOAN_HEADERS loan
8230         where
8231             loan.loan_id = P_LOAN_ID;
8232 
8233 BEGIN
8234 
8235     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
8236 
8237     -- START OF BODY OF API
8238     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input:');
8239     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_ID = ' || P_LOAN_ID);
8240     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_AMOUNT = ' || P_AMOUNT);
8241 
8242     /* verify input parameters */
8243     if P_LOAN_ID is null then
8244 
8245 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
8246     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
8247 		FND_MSG_PUB.Add;
8248         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8249         RAISE FND_API.G_EXC_ERROR;
8250 
8251     end if;
8252     if P_AMOUNT is null then
8253 
8254         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'P_AMOUNT is null');
8255         RAISE FND_API.G_EXC_ERROR;
8256 
8257     end if;
8258 
8259     init;
8260 
8261     X_FORGIVENESS_AMOUNT := 0;
8262     X_REMAINING_AMOUNT := P_AMOUNT;
8263 
8264     /* checking for system options values required for adjustment */
8265     if g_forgiveness_rec_trx_id is null then
8266         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan Forgiveness receivables activity name is not set in the system option. Exiting.');
8267         return;
8268     end if;
8269 
8270     /* querying psa, loan details */
8271     open details_cur(P_LOAN_ID);
8272     fetch details_cur into
8273         l_forgiveness_flag,
8274         l_forgiveness_percent,
8275         l_currency;
8276     close details_cur;
8277 
8278     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_forgiveness_flag = ' || l_forgiveness_flag);
8279     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_forgiveness_percent = ' || l_forgiveness_percent);
8280     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_currency = ' || l_currency);
8281 
8282     if l_forgiveness_flag = 'N' then
8283         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not part of loan forgiveness program. Exiting.');
8284         return;
8285     end if;
8286 
8287     if l_forgiveness_percent = 0 then
8288         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness percent = 0. Exiting.');
8289         return;
8290     end if;
8291 
8292     fnd_currency.GET_INFO(CURRENCY_CODE => l_currency,
8293                         PRECISION => l_precision,
8294                         EXT_PRECISION => l_ext_precision,
8295                         MIN_ACCT_UNIT => l_min_acct_unit);
8296     X_FORGIVENESS_AMOUNT := round(P_AMOUNT * (l_forgiveness_percent/100), l_precision);
8297     X_REMAINING_AMOUNT := P_AMOUNT - X_FORGIVENESS_AMOUNT;
8298 
8299     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'X_FORGIVENESS_AMOUNT = ' || X_FORGIVENESS_AMOUNT);
8300     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'X_REMAINING_AMOUNT = ' || X_REMAINING_AMOUNT);
8301 
8302     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
8303 
8304 EXCEPTION
8305     WHEN OTHERS THEN
8306         LogMessage(FND_LOG.LEVEL_UNEXPECTED, l_api_name || ' - In exception');
8307 END;
8308 
8309 
8310 /*========================================================================
8311  | PRIVATE PROCEDURE FORGIVENESS_ADJUSTMENT
8312  |
8313  | DESCRIPTION
8314  |      This procedure make adjustment to just billed principal as loan forgiveness program
8315  |
8316  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
8317  |      None
8318  |
8319  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
8320  |      init
8321  |      LogMessage
8322  |
8323  | PARAMETERS
8324  |      P_API_VERSION		    IN          Standard in parameter
8325  |      P_INIT_MSG_LIST		    IN          Standard in parameter
8326  |      P_COMMIT			    IN          Standard in parameter
8327  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
8328  |      P_LOAN_ID               IN          Loan ID
8329  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
8330  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
8331  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
8332  |
8333  | KNOWN ISSUES
8334  |      None
8335  |
8336  | NOTES
8337  |      Any interesting aspect of the code in the package body which needs
8338  |      to be stated.
8339  |
8340  | MODIFICATION HISTORY
8341  | Date                  Author            Description of Changes
8342  | 09-01-2008            scherkas          Created for bug 7387659
8343  |
8344  *=======================================================================*/
8345 PROCEDURE FORGIVENESS_ADJUSTMENT(
8346     P_API_VERSION		    IN          NUMBER,
8347     P_INIT_MSG_LIST		    IN          VARCHAR2,
8348     P_COMMIT			    IN          VARCHAR2,
8349     P_VALIDATION_LEVEL	    IN          NUMBER,
8350     P_LOAN_ID               IN          NUMBER,
8351     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
8352     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
8353     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
8354 IS
8355 
8356 /*-----------------------------------------------------------------------+
8357  | Local Variable Declarations and initializations                       |
8358  +-----------------------------------------------------------------------*/
8359 
8360     l_api_name                      CONSTANT VARCHAR2(30) := 'FORGIVENESS_ADJUSTMENT';
8361     l_api_version                   CONSTANT NUMBER := 1.0;
8362     l_return_status                 VARCHAR2(1);
8363     l_msg_count                     NUMBER;
8364     l_msg_data                      VARCHAR2(32767);
8365     l_loan_number                   varchar2(60);
8366     l_trx_id                        number;
8367     l_payment_schedule_id           number;
8368     l_original_amount               number;
8369     l_type                          varchar2(15);
8370     l_loan_desc                     varchar2(250);
8371     l_comments                      varchar2(2000);
8372     l_adj_number                    varchar2(20);
8373     l_adj_id                        number;
8374     l_requested_amount              number;
8375     l_apply_date                    date;
8376     l_gl_date                       date;
8377     l_forgiveness_flag              varchar2(1);
8378     l_forgiveness_percent           number;
8379     l_payment_number                number;
8380     l_org_id			    number;
8381     l_phase			    VARCHAR2(30);
8382     l_precision                     number;
8383     l_ext_precision                 number;
8384     l_min_acct_unit                 number;
8385     l_currency                      VARCHAR2(15);
8386     l_remaining_amount              NUMBER;
8387 
8388 /*-----------------------------------------------------------------------+
8389  | Cursor Declarations                                                   |
8390  +-----------------------------------------------------------------------*/
8391 
8392     /* querying psa and loan details */
8393     CURSOR details_cur(P_LOAN_ID number) IS
8394         select
8395             loan.loan_number,
8396             loan.LOAN_DESCRIPTION,
8397             nvl(loan.FORGIVENESS_FLAG, 'N'),
8398             nvl(loan.FORGIVENESS_PERCENT, 0),
8399             am.PAYMENT_NUMBER,
8400             am.PRINCIPAL_TRX_ID,
8401             psa.payment_schedule_id,
8402             nvl(psa.AMOUNT_DUE_ORIGINAL, 0),
8403             psa.TRX_DATE,
8404             psa.GL_DATE,
8405             nvl(loan.CURRENT_PHASE, 'TERM'),
8406 			psa.org_id,
8407             loan.LOAN_CURRENCY
8408         from LNS_LOAN_HEADERS_VL loan,
8409             lns_amortization_scheds am,
8410             ar_payment_schedules psa
8411         where
8412             loan.loan_id = P_LOAN_ID and
8413             loan.LAST_AMORTIZATION_ID = am.AMORTIZATION_SCHEDULE_ID and
8414             loan.loan_id = am.loan_id and
8415             am.PRINCIPAL_TRX_ID = psa.CUSTOMER_TRX_ID(+);
8416 
8417 BEGIN
8418 
8419     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
8420 
8421     -- Standard start of API savepoint
8422     SAVEPOINT FORGIVENESS_ADJUSTMENT;
8423     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
8424 
8425     -- Standard call to check for call compatibility
8426     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
8427       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8428     END IF;
8429 
8430     -- Initialize message list if p_init_msg_list is set to TRUE
8431     IF FND_API.To_Boolean(p_init_msg_list) THEN
8432       FND_MSG_PUB.initialize;
8433     END IF;
8434 
8435     -- Initialize API return status to success
8436     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
8437 
8438     -- START OF BODY OF API
8439     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
8440 
8441     /* verify input parameters */
8442     if P_LOAN_ID is null then
8443 
8444 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
8445     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
8446 		FND_MSG_PUB.Add;
8447         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8448         RAISE FND_API.G_EXC_ERROR;
8449 
8450     end if;
8451 
8452     /* checking for system options values required for adjustment */
8453     if g_forgiveness_rec_trx_id is null then
8454         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan Forgiveness receivables activity name is not set in the system option. Exiting.');
8455         return;
8456     end if;
8457 
8458     /* querying psa, loan details */
8459     open details_cur(P_LOAN_ID);
8460     fetch details_cur into
8461         l_loan_number,
8462         l_loan_desc,
8463         l_forgiveness_flag,
8464         l_forgiveness_percent,
8465         l_payment_number,
8466         l_trx_id,
8467         l_payment_schedule_id,
8468         l_original_amount,
8469         l_apply_date,
8470         l_gl_date,
8471         l_phase,
8472 	l_org_id,
8473         l_currency;
8474     close details_cur;
8475 
8476     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan_number = ' || l_loan_number);
8477     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan_desc = ' || l_loan_desc);
8478     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_forgiveness_flag = ' || l_forgiveness_flag);
8479     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_forgiveness_percent = ' || l_forgiveness_percent);
8480     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_payment_number = ' || l_payment_number);
8481     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_id = ' || l_trx_id);
8482     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_payment_schedule_id = ' || l_payment_schedule_id);
8483     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_original_amount = ' || l_original_amount);
8484     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_apply_date = ' || l_apply_date);
8485     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_gl_date = ' || l_gl_date);
8486     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_phase = ' || l_phase);
8487     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_org_id = ' || l_org_id);
8488     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_currency = ' || l_currency);
8489 
8490     if l_trx_id is null then
8491         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Nothing to adjust - principal invoice does not exist for payment number ' || l_payment_number || '. Exiting.');
8492         return;
8493     end if;
8494 
8495     if l_payment_schedule_id is null then
8496         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot create adjustment - principal invoice is INCOMPLETE!');
8497         RAISE FND_API.G_EXC_ERROR;
8498     end if;
8499 
8500     if l_forgiveness_flag = 'N' then
8501         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not part of loan forgiveness program. Exiting.');
8502         return;
8503     end if;
8504 
8505     if l_forgiveness_percent = 0 then
8506         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness percent = 0. Will not perform forgiveness adjustment. Exiting.');
8507         return;
8508     end if;
8509 
8510     if l_original_amount = 0 then
8511         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Principal amount = 0. Will not perform forgiveness adjustment. Exiting.');
8512         return;
8513     end if;
8514 
8515     l_type := 'LINE';
8516 
8517     GET_FORGIVENESS_AMOUNT(
8518         P_LOAN_ID               => P_LOAN_ID,
8519         P_AMOUNT                => l_original_amount,
8520         X_FORGIVENESS_AMOUNT    => l_requested_amount,
8521         X_REMAINING_AMOUNT      => l_remaining_amount);
8522 /*
8523     -- fix for bug 7712669
8524     fnd_currency.GET_INFO(CURRENCY_CODE => l_currency,
8525                         PRECISION => l_precision,
8526                         EXT_PRECISION => l_ext_precision,
8527                         MIN_ACCT_UNIT => l_min_acct_unit);
8528     l_requested_amount := round(l_original_amount * (l_forgiveness_percent/100), l_precision);
8529 */
8530     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
8531 
8532     if l_requested_amount = 0 then
8533         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness amount = 0. Will not perform forgiveness adjustment. Exiting.');
8534         return;
8535     end if;
8536 
8537     /* buld comments */
8538     l_comments := 'Loan Forgiveness Program for loan ' || l_loan_number;
8539 
8540     /* do adjustment */
8541     CREATE_AR_ADJ(P_TYPE => l_type,
8542         P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id,
8543         P_RECEIVABLES_TRX_ID => g_forgiveness_rec_trx_id,
8544         P_AMOUNT => -l_requested_amount,
8545         P_APPLY_DATE => l_apply_date,
8546         P_GL_DATE => l_gl_date,
8547         P_CUSTOMER_TRX_LINE_ID => null,
8548         P_CODE_COMBINATION_ID => null,
8549         P_USSGL_TRX_CODE => null,
8550         P_REASON_CODE => null,
8551         P_COMMENTS => l_comments,
8552         X_ADJ_ID => l_adj_id,
8553         X_ADJ_NUMBER => l_adj_number,
8554 		P_ORG_ID => l_org_id);
8555 
8556     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_adj_number = ' || l_adj_number || ' (l_adj_id = ' || l_adj_id || ')');
8557 
8558     if l_adj_id is null and l_adj_number is null then
8559         RAISE FND_API.G_EXC_ERROR;
8560     end if;
8561 
8562     if P_COMMIT = FND_API.G_TRUE then
8563         COMMIT WORK;
8564         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
8565     end if;
8566 
8567     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully adjusted payment ' || l_payment_number || ' for loan ' || l_loan_number);
8568 
8569     -- END OF BODY OF API
8570     x_return_status := FND_API.G_RET_STS_SUCCESS;
8571 
8572     -- Standard call to get message count and if count is 1, get message info
8573     FND_MSG_PUB.Count_And_Get(
8574                 p_encoded => FND_API.G_FALSE,
8575                 p_count => x_msg_count,
8576                 p_data => x_msg_data);
8577 
8578     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
8579 
8580 EXCEPTION
8581     WHEN FND_API.G_EXC_ERROR THEN
8582         ROLLBACK TO FORGIVENESS_ADJUSTMENT;
8583         x_return_status := FND_API.G_RET_STS_ERROR;
8584         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8585         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8586     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8587         ROLLBACK TO FORGIVENESS_ADJUSTMENT;
8588         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8589         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8590         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8591     WHEN OTHERS THEN
8592         ROLLBACK TO FORGIVENESS_ADJUSTMENT;
8593         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8594         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
8595             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
8596         END IF;
8597         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8598         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8599 END;
8600 
8601 
8602 
8603 
8604 /*========================================================================
8605  | PUBLIC PROCEDURE GET_NEXT_INSTAL_TO_BILL
8606  |
8607  | DESCRIPTION
8608  |      This procedure returns next installment to be billed in LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL format
8609  |
8610  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
8611  |      None
8612  |
8613  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
8614  |      init
8615  |      LogMessage
8616  |
8617  | PARAMETERS
8618  |      P_API_VERSION		    IN          Standard in parameter
8619  |      P_INIT_MSG_LIST		    IN          Standard in parameter
8620  |      P_COMMIT			    IN          Standard in parameter
8621  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
8622  |      P_LOAN_ID               IN          Loan ID
8623  |      X_INVOICES_TBL          OUT NOCOPY  LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL,
8624  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
8625  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
8626  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
8627  |
8628  | KNOWN ISSUES
8629  |      None
8630  |
8631  | NOTES
8632  |      Any interesting aspect of the code in the package body which needs
8633  |      to be stated.
8634  |
8635  | MODIFICATION HISTORY
8636  | Date                  Author            Description of Changes
8637  | 03-17-2009            scherkas          Created for bug
8638  |
8639  *=======================================================================*/
8640 PROCEDURE GET_NEXT_INSTAL_TO_BILL(
8641     P_API_VERSION		    IN          NUMBER,
8642     P_INIT_MSG_LIST		    IN          VARCHAR2,
8643     P_COMMIT			    IN          VARCHAR2,
8644     P_VALIDATION_LEVEL	    IN          NUMBER,
8645     P_LOAN_ID               IN          NUMBER,
8646     X_INVOICES_TBL          OUT NOCOPY  LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL,
8647     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
8648     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
8649     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
8650 IS
8651 
8652 /*-----------------------------------------------------------------------+
8653  | Local Variable Declarations and initializations                       |
8654  +-----------------------------------------------------------------------*/
8655 
8656     l_api_name                      CONSTANT VARCHAR2(30) := 'GET_NEXT_INSTAL_TO_BILL';
8657     l_api_version                   CONSTANT NUMBER := 1.0;
8658     l_return_status                 VARCHAR2(1);
8659     l_msg_count                     NUMBER;
8660     l_msg_data                      VARCHAR2(32767);
8661     l_NEXT_PAYMENT_NUMBER           NUMBER;
8662     l_create_zero_instal            varchar2(1);
8663     l_invoice_number                varchar2(20);
8664     l_profile_name                  VARCHAR2(240);
8665     i                               number;
8666     l_currency                      varchar2(15);
8667     l_exchange_rate                 number;
8668     l_prin_trx_type_id              number;
8669     l_current_phase                 varchar2(30);
8670     l_trx_date                      date;
8671     l_term_id                       number;
8672 
8673     l_amortization_rec              LNS_FINANCIALS.AMORTIZATION_REC;
8674     l_fee_tbl                       LNS_FINANCIALS.FEES_TBL;
8675     l_invoices_tbl                  LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL;
8676 
8677 /*-----------------------------------------------------------------------+
8678  | Cursor Declarations                                                   |
8679  +-----------------------------------------------------------------------*/
8680 
8681      cursor c_loanInfo(p_loan_id number) is
8682      select loan_number, LOAN_CURRENCY, nvl(EXCHANGE_RATE, 1), nvl(CURRENT_PHASE, 'TERM')
8683        from lns_loan_headers_all
8684       where loan_id = p_loan_id;
8685 
8686     /* query trx_type_id */
8687     CURSOR prin_trx_type_cur(P_LOAN_ID number) IS
8688         select REFERENCE_TYPE_ID
8689         from LNS_LOAN_HEADERS_ALL
8690         where loan_id = P_LOAN_ID;
8691 
8692     CURSOR trx_type_cur(p_trx_type_id number) IS
8693         select NAME
8694         from RA_CUST_TRX_TYPES_ALL
8695         where cust_trx_type_id = p_trx_type_id;
8696 
8697 
8698 BEGIN
8699 
8700     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
8701 
8702     -- Standard start of API savepoint
8703     SAVEPOINT GET_NEXT_INSTAL_TO_BILL;
8704     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
8705 
8706     -- Standard call to check for call compatibility
8707     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
8708       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8709     END IF;
8710 
8711     -- Initialize message list if p_init_msg_list is set to TRUE
8712     IF FND_API.To_Boolean(p_init_msg_list) THEN
8713       FND_MSG_PUB.initialize;
8714     END IF;
8715 
8716     -- Initialize API return status to success
8717     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
8718 
8719     -- START OF BODY OF API
8720     init;
8721 
8722     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
8723 
8724     /* verify input parameters */
8725     if P_LOAN_ID is null then
8726 
8727 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
8728     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
8729 		FND_MSG_PUB.Add;
8730         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8731         RAISE FND_API.G_EXC_ERROR;
8732 
8733     end if;
8734 
8735     if CAN_BILL_NEXT_INSTAL(P_LOAN_ID) = false then
8736         -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not ready to bill next installment. Returning.');
8737     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NOT_READY_BILL_NEXT_INSTAL');
8738 		FND_MSG_PUB.Add;
8739         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8740         RAISE FND_API.G_EXC_ERROR;
8741     end if;
8742 
8743     -- Bug#6830765 - Added new procedure ..EXT_1, which returns '0' if 0th installment is scheduled and it solves
8744     -- the case if there is no '0th installment' and wants '1st 'installment
8745     l_NEXT_PAYMENT_NUMBER := LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER_EXT_1(P_LOAN_ID) + 1;
8746 
8747     open c_loanInfo(P_LOAN_ID);
8748     fetch c_loanInfo into l_invoice_number, l_currency, l_exchange_rate, l_current_phase;
8749     close c_loanInfo;
8750 
8751     if l_current_phase = 'TERM' then
8752 
8753         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
8754         lns_financials.getInstallment(
8755             p_api_version => 1.0,
8756             p_init_msg_list => FND_API.G_TRUE,
8757             p_commit => FND_API.G_FALSE,
8758             p_loan_Id => P_LOAN_ID,
8759             p_installment_number => l_NEXT_PAYMENT_NUMBER,
8760             x_amortization_rec => l_amortization_rec,
8761             x_fees_tbl => l_fee_tbl,
8762             X_RETURN_STATUS => l_return_status,
8763             X_MSG_COUNT => l_msg_count,
8764             X_MSG_DATA => l_msg_data);
8765 
8766     else
8767 
8768         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getOpenInstallment...');
8769         lns_financials.getOpenInstallment(
8770             p_init_msg_list => FND_API.G_TRUE,
8771             p_loan_Id => P_LOAN_ID,
8772             p_installment_number => l_NEXT_PAYMENT_NUMBER,
8773             x_amortization_rec => l_amortization_rec,
8774             x_fees_tbl => l_fee_tbl,
8775             X_RETURN_STATUS => l_return_status,
8776             X_MSG_COUNT => l_msg_count,
8777             X_MSG_DATA => l_msg_data);
8778 
8779     end if;
8780 
8781     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
8782     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
8783 
8784     if l_return_status <> 'S' then
8785         RAISE FND_API.G_EXC_ERROR;
8786     end if;
8787 
8788     -- remove any msg from the stack
8789     FND_MSG_PUB.initialize;
8790 
8791     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Data returned:');
8792     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
8793     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
8794     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_amortization_rec.PRINCIPAL_AMOUNT);
8795     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_amortization_rec.INTEREST_AMOUNT);
8796     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_amortization_rec.FEE_AMOUNT);
8797 
8798     /* checking for returned values */
8799     if l_amortization_rec.INSTALLMENT_NUMBER is null and
8800        l_amortization_rec.due_date is null
8801     then
8802 
8803         -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'lns_financials.getInstallment returns no data. Nothing to bill. Returning.');
8804     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_BILLING_DATA');
8805 		FND_MSG_PUB.Add;
8806         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8807         RAISE FND_API.G_EXC_ERROR;
8808 
8809     end if;
8810 
8811     if l_amortization_rec.PRINCIPAL_AMOUNT = 0 and
8812        l_amortization_rec.INTEREST_AMOUNT = 0 and
8813        l_amortization_rec.FEE_AMOUNT = 0
8814     then
8815 
8816         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All amounts returned from lns_financials.getInstallment = 0.');
8817 
8818         -- fix for bug 7000066: get LNS_CREATE_ZERO_INSTAL profile value to see if we need to create 0 amount installment
8819         l_create_zero_instal := NVL(FND_PROFILE.VALUE('LNS_CREATE_ZERO_INSTAL'), 'N');
8820         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LNS_CREATE_ZERO_INSTAL profile: ' || l_create_zero_instal);
8821 
8822         if l_create_zero_instal = 'N' then
8823 
8824             select USER_PROFILE_OPTION_NAME into l_profile_name
8825             from FND_PROFILE_OPTIONS_VL
8826             where PROFILE_OPTION_NAME = 'LNS_CREATE_ZERO_INSTAL';
8827 
8828             --LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing of zero amount installments is disallowed by profile LNS: Create Zero Amount Installments.');
8829             FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_BILL_ZERO_AMOUNT');
8830     		FND_MESSAGE.SET_TOKEN('PROFILE', l_profile_name);
8831             FND_MSG_PUB.Add;
8832             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8833             RAISE FND_API.G_EXC_ERROR;
8834 --            return;
8835         end if;
8836 
8837     end if;
8838 
8839     -- get trx date
8840     LNS_BILLING_UTIL_PUB.GET_TRX_DATE(P_LOAN_ID => P_LOAN_ID,
8841                                     P_DUE_DATE => l_amortization_rec.due_date,
8842                                     X_TRX_DATE => l_trx_date,
8843                                     X_RA_TERM_ID => l_term_id);
8844 
8845     i := 0;
8846 
8847     if (l_amortization_rec.PRINCIPAL_AMOUNT = 0 and NVL(FND_PROFILE.VALUE('LNS_CREATE_ZERO_PRIN_INV'), 'N') = 'Y') or
8848        l_amortization_rec.PRINCIPAL_AMOUNT > 0
8849     then
8850         i := i + 1;
8851         l_invoices_tbl(i).CUST_TRX_ID        := null;
8852         l_invoices_tbl(i).PAYMENT_SCHEDULE_ID := null;
8853         l_invoices_tbl(i).INSTALLMENT_NUMBER := l_amortization_rec.INSTALLMENT_NUMBER;
8854         l_invoices_tbl(i).INVOICE_NUMBER     := l_invoice_number;
8855         l_invoices_tbl(i).ORIGINAL_AMOUNT    := l_amortization_rec.PRINCIPAL_AMOUNT;
8856         l_invoices_tbl(i).TRX_DATE           := l_trx_date;
8857         l_invoices_tbl(i).DUE_DATE           := l_amortization_rec.due_date;
8858         l_invoices_tbl(i).PURPOSE            := lns_utility_pub.get_lookup_meaning('PAYMENT_APPLICATION_TYPE', 'PRIN');
8859         l_invoices_tbl(i).BILLED_FLAG        := 'N';
8860         l_invoices_tbl(i).INVOICE_CURRENCY   := l_currency;
8861         l_invoices_tbl(i).EXCHANGE_RATE      := l_exchange_rate;
8862 
8863         /* query trx_type_id */
8864         open prin_trx_type_cur(P_LOAN_ID);
8865         fetch prin_trx_type_cur into l_prin_trx_type_id;
8866         close prin_trx_type_cur;
8867 
8868         if l_prin_trx_type_id is null then
8869             l_prin_trx_type_id := g_trx_type_id;
8870         end if;
8871 
8872         open trx_type_cur(l_prin_trx_type_id);
8873         fetch trx_type_cur into l_invoices_tbl(i).TRANSACTION_TYPE;
8874         close trx_type_cur;
8875 
8876         l_invoices_tbl(i).GL_DATE           := l_trx_date + nvl(g_day_togl_after_dd, 0);
8877         --l_invoices_tbl(i).GL_DATE := l_invoices_tbl(i).DUE_DATE + nvl(g_day_togl_after_dd, 0);
8878         LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
8879                 p_gl_date => l_invoices_tbl(i).GL_DATE,
8880                 p_trx_date => l_trx_date, --l_invoices_tbl(i).DUE_DATE,
8881                 p_set_of_books_id => g_set_of_books_id,
8882                 x_default_gl_date => l_invoices_tbl(i).GL_DATE);
8883 
8884         GET_FORGIVENESS_AMOUNT(
8885             P_LOAN_ID               => P_LOAN_ID,
8886             P_AMOUNT                => l_invoices_tbl(i).ORIGINAL_AMOUNT,
8887             X_FORGIVENESS_AMOUNT    => l_invoices_tbl(i).FORGIVENESS_AMOUNT,
8888             X_REMAINING_AMOUNT      => l_invoices_tbl(i).REMAINING_AMOUNT);
8889 
8890         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added principal ' || l_amortization_rec.PRINCIPAL_AMOUNT);
8891     end if;
8892 
8893     if l_amortization_rec.INTEREST_AMOUNT > 0 and l_amortization_rec.CAP_INT_AMOUNT = 0 then
8894         i := i + 1;
8895         l_invoices_tbl(i).CUST_TRX_ID        := null;
8896         l_invoices_tbl(i).PAYMENT_SCHEDULE_ID := null;
8897         l_invoices_tbl(i).INSTALLMENT_NUMBER := l_amortization_rec.INSTALLMENT_NUMBER;
8898         l_invoices_tbl(i).INVOICE_NUMBER     := l_invoice_number;
8899         l_invoices_tbl(i).TRANSACTION_TYPE   := lns_utility_pub.getDocumentName('INT');
8900         l_invoices_tbl(i).ORIGINAL_AMOUNT    := l_amortization_rec.INTEREST_AMOUNT;
8901         l_invoices_tbl(i).REMAINING_AMOUNT   := l_amortization_rec.INTEREST_AMOUNT;
8902         l_invoices_tbl(i).FORGIVENESS_AMOUNT := 0;
8903         l_invoices_tbl(i).TRX_DATE           := l_trx_date;
8904         l_invoices_tbl(i).DUE_DATE           := l_amortization_rec.due_date;
8905         l_invoices_tbl(i).PURPOSE            := lns_utility_pub.get_lookup_meaning('PAYMENT_APPLICATION_TYPE', 'INT');
8906         l_invoices_tbl(i).BILLED_FLAG        := 'N';
8907         l_invoices_tbl(i).INVOICE_CURRENCY   := l_currency;
8908         l_invoices_tbl(i).EXCHANGE_RATE      := l_exchange_rate;
8909         --l_invoices_tbl(i).GL_DATE            := l_invoices_tbl(i).DUE_DATE + nvl(g_day_togl_after_dd, 0);
8910 
8911         l_invoices_tbl(i).GL_DATE            := l_trx_date + nvl(g_day_togl_after_dd, 0);
8912         LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
8913                 p_gl_date => l_invoices_tbl(i).GL_DATE,
8914                 p_trx_date => l_trx_date, --l_invoices_tbl(i).DUE_DATE,
8915                 p_set_of_books_id => g_set_of_books_id,
8916                 x_default_gl_date => l_invoices_tbl(i).GL_DATE);
8917 
8918         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added interest ' || l_amortization_rec.INTEREST_AMOUNT);
8919     end if;
8920 
8921     if l_amortization_rec.FEE_AMOUNT > 0 then
8922         i := i + 1;
8923         l_invoices_tbl(i).CUST_TRX_ID        := null;
8924         l_invoices_tbl(i).PAYMENT_SCHEDULE_ID := null;
8925         l_invoices_tbl(i).INSTALLMENT_NUMBER := l_amortization_rec.INSTALLMENT_NUMBER;
8926         l_invoices_tbl(i).INVOICE_NUMBER     := l_invoice_number;
8927         l_invoices_tbl(i).TRANSACTION_TYPE   := lns_utility_pub.getDocumentName('FEE');
8928         l_invoices_tbl(i).ORIGINAL_AMOUNT    := l_amortization_rec.FEE_AMOUNT;
8929         l_invoices_tbl(i).REMAINING_AMOUNT   := l_amortization_rec.FEE_AMOUNT;
8930         l_invoices_tbl(i).FORGIVENESS_AMOUNT := 0;
8931         l_invoices_tbl(i).TRX_DATE           := l_trx_date;
8932         l_invoices_tbl(i).DUE_DATE           := l_amortization_rec.due_date;
8933         l_invoices_tbl(i).PURPOSE            := lns_utility_pub.get_lookup_meaning('PAYMENT_APPLICATION_TYPE', 'FEE');
8934         l_invoices_tbl(i).BILLED_FLAG        := 'N';
8935         l_invoices_tbl(i).INVOICE_CURRENCY   := l_currency;
8936         l_invoices_tbl(i).EXCHANGE_RATE      := l_exchange_rate;
8937         --l_invoices_tbl(i).GL_DATE            := l_invoices_tbl(i).DUE_DATE + nvl(g_day_togl_after_dd, 0);
8938 
8939         l_invoices_tbl(i).GL_DATE            := l_trx_date + nvl(g_day_togl_after_dd, 0);
8940         LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
8941                 p_gl_date => l_invoices_tbl(i).GL_DATE,
8942                 p_trx_date => l_trx_date, --l_invoices_tbl(i).DUE_DATE,
8943                 p_set_of_books_id => g_set_of_books_id,
8944                 x_default_gl_date => l_invoices_tbl(i).GL_DATE);
8945 
8946         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added fee ' || l_amortization_rec.FEE_AMOUNT);
8947     end if;
8948 
8949     x_invoices_tbl := l_invoices_tbl;
8950 
8951     if P_COMMIT = FND_API.G_TRUE then
8952         COMMIT WORK;
8953         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
8954     end if;
8955 
8956     -- END OF BODY OF API
8957     x_return_status := FND_API.G_RET_STS_SUCCESS;
8958 
8959     -- Standard call to get message count and if count is 1, get message info
8960     FND_MSG_PUB.Count_And_Get(
8961                 p_encoded => FND_API.G_FALSE,
8962                 p_count => x_msg_count,
8963                 p_data => x_msg_data);
8964 
8965     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
8966 
8967 EXCEPTION
8968     WHEN FND_API.G_EXC_ERROR THEN
8969         ROLLBACK TO GET_NEXT_INSTAL_TO_BILL;
8970         x_return_status := FND_API.G_RET_STS_ERROR;
8971         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8972         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8973     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8974         ROLLBACK TO GET_NEXT_INSTAL_TO_BILL;
8975         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8976         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8977         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8978     WHEN OTHERS THEN
8979         ROLLBACK TO GET_NEXT_INSTAL_TO_BILL;
8980         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8981         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
8982             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
8983         END IF;
8984         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8985         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8986 END;
8987 
8988 
8989 
8990 
8991 /*========================================================================
8992  | PUBLIC PROCEDURE BILL_AND_PAY_NEXT_INSTAL
8993  |
8994  | DESCRIPTION
8995  |      This procedure bills and pays next scheduled installment
8996  |
8997  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
8998  |      None
8999  |
9000  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
9001  |      init
9002  |      LogMessage
9003  |
9004  | PARAMETERS
9005  |      P_API_VERSION		    IN          Standard in parameter
9006  |      P_INIT_MSG_LIST		    IN          Standard in parameter
9007  |      P_COMMIT			    IN          Standard in parameter
9008  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
9009  |      P_LOAN_ID               IN          Loan ID
9010  |      P_CASH_RECEIPTS_TBL     IN          LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL
9011  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
9012  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
9013  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
9014  |
9015  | KNOWN ISSUES
9016  |      None
9017  |
9018  | NOTES
9019  |      Any interesting aspect of the code in the package body which needs
9020  |      to be stated.
9021  |
9022  | MODIFICATION HISTORY
9023  | Date                  Author            Description of Changes
9024  | 03-17-2009            scherkas          Created for bug
9025  |
9026  *=======================================================================*/
9027 PROCEDURE BILL_AND_PAY_NEXT_INSTAL(
9028     P_API_VERSION		    IN          NUMBER,
9029     P_INIT_MSG_LIST		    IN          VARCHAR2,
9030     P_COMMIT			    IN          VARCHAR2,
9031     P_VALIDATION_LEVEL	    IN          NUMBER,
9032     P_LOAN_ID               IN          NUMBER,
9033     P_CASH_RECEIPTS_TBL     IN          LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL,
9034     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
9035     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
9036     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
9037 IS
9038 
9039 /*-----------------------------------------------------------------------+
9040  | Local Variable Declarations and initializations                       |
9041  +-----------------------------------------------------------------------*/
9042 
9043     l_api_name                      CONSTANT VARCHAR2(30) := 'BILL_AND_PAY_NEXT_INSTAL';
9044     l_api_version                   CONSTANT NUMBER := 1.0;
9045     l_return_status                 VARCHAR2(1);
9046     l_msg_count                     NUMBER;
9047     l_msg_data                      VARCHAR2(32767);
9048     l_Count1                        NUMBER;
9049 
9050     l_am_sched_tbl                  LNS_BILLING_BATCH_PUB.AMORTIZATION_SCHED_TBL;
9051     l_loans_to_bill_tbl		        LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
9052 
9053 /*-----------------------------------------------------------------------+
9054  | Cursor Declarations                                                   |
9055  +-----------------------------------------------------------------------*/
9056 
9057     CURSOR loan_to_bill_cur(P_LOAN_ID number) IS
9058         select
9059             head.LOAN_ID,
9060             head.LOAN_NUMBER,
9061             head.LOAN_DESCRIPTION,
9062             head.OBJECT_VERSION_NUMBER,
9063             head.FUNDED_AMOUNT,
9064             head.BILL_TO_ACCT_SITE_ID,
9065             term.FIRST_PAYMENT_DATE,
9066             term.NEXT_PAYMENT_DUE_DATE,
9067             nvl(head.BILLED_FLAG, 'N'),
9068             head.LOAN_CURRENCY,
9069             head.CUST_ACCOUNT_ID,
9070             head.CUSTOM_PAYMENTS_FLAG,
9071             term.LOAN_PAYMENT_FREQUENCY,
9072             term.NUMBER_GRACE_DAYS,
9073             term.PAYMENT_APPLICATION_ORDER,
9074             head.EXCHANGE_RATE_TYPE,
9075             head.EXCHANGE_DATE,
9076             head.EXCHANGE_RATE,
9077             nvl(head.FORGIVENESS_FLAG, 'N'),
9078             nvl(head.FORGIVENESS_PERCENT, 0),
9079             nvl(head.CURRENT_PHASE,'TERM')
9080         from LNS_LOAN_HEADERS_ALL_VL head,
9081             LNS_TERMS term
9082         where head.loan_id = term.loan_id
9083             and head.LOAN_ID = P_LOAN_ID;
9084 
9085     CURSOR get_last_am_cur(P_LOAN_ID number) IS
9086         select loan.LAST_AMORTIZATION_ID
9087         from LNS_LOAN_HEADERS_all loan
9088         where loan.loan_id = P_LOAN_ID;
9089 
9090 BEGIN
9091 
9092     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
9093 
9094     -- Standard start of API savepoint
9095     SAVEPOINT BILL_AND_PAY_NEXT_INSTAL;
9096     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
9097 
9098     -- Standard call to check for call compatibility
9099     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
9100       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9101     END IF;
9102 
9103     -- Initialize message list if p_init_msg_list is set to TRUE
9104     IF FND_API.To_Boolean(p_init_msg_list) THEN
9105       FND_MSG_PUB.initialize;
9106     END IF;
9107 
9108     -- Initialize API return status to success
9109     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
9110 
9111     -- START OF BODY OF API
9112     init;
9113 
9114     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
9115 
9116     if CAN_BILL_NEXT_INSTAL(P_LOAN_ID) = false then
9117         -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not ready to bill next installment. Returning.');
9118     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NOT_READY_BILL_NEXT_INSTAL');
9119 		FND_MSG_PUB.Add;
9120         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
9121         RAISE FND_API.G_EXC_ERROR;
9122     end if;
9123 
9124     l_Count1 := 1;
9125     open loan_to_bill_cur(P_LOAN_ID);
9126     fetch loan_to_bill_cur into
9127         l_loans_to_bill_tbl(l_Count1).LOAN_ID,
9128         l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER,
9129         l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION,
9130         l_loans_to_bill_tbl(l_Count1).OBJECT_VERSION_NUMBER,
9131         l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT,
9132         l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID,
9133         l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE,
9134         l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE,
9135         l_loans_to_bill_tbl(l_Count1).BILLED_FLAG,
9136         l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY,
9137         l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID,
9138         l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG,
9139         l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY,
9140         l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS,
9141         l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER,
9142         l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE,
9143         l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE,
9144         l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE,
9145         l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG,
9146         l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT,
9147         l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE;
9148     close loan_to_bill_cur;
9149 
9150     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan Info:');
9151     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
9152     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER: ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
9153     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_DESCRIPTION: ' || l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION);
9154     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT);
9155     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID);
9156     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FIRST_PAYMENT_DATE: ' || l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE);
9157     LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_DUE_DATE: ' || l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE);
9158     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || l_loans_to_bill_tbl(l_Count1).BILLED_FLAG);
9159     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY);
9160     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID);
9161     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG);
9162     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_PAYMENT_FREQUENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY);
9163     LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS);
9164     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER);
9165     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE);
9166     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE);
9167     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE);
9168     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG);
9169     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_PERCENT: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT);
9170     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE);
9171 
9172     /* do all needed inits */
9173     dbms_lob.createtemporary(g_last_all_statements, FALSE, DBMS_LOB.CALL);
9174     dbms_lob.open(g_last_all_statements, dbms_lob.lob_readwrite);
9175 
9176     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Calling BILL_LOANS_EXT...');
9177     BILL_LOANS_EXT(
9178         P_API_VERSION => 1.0,
9179         P_INIT_MSG_LIST	=> FND_API.G_TRUE,
9180         P_COMMIT => FND_API.G_FALSE,
9181         P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
9182         P_LOANS_TO_BILL_TBL => l_loans_to_bill_tbl,
9183         X_RETURN_STATUS	=> l_return_status,
9184         X_MSG_COUNT => l_msg_count,
9185         X_MSG_DATA => l_msg_data);
9186 
9187     IF l_return_status = 'S' THEN
9188         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully billed next due installment.');
9189     ELSE
9190         RAISE FND_API.G_EXC_ERROR;
9191     END IF;
9192 
9193     if P_CASH_RECEIPTS_TBL.count > 0 then
9194 
9195         open get_last_am_cur(P_LOAN_ID);
9196         fetch get_last_am_cur into l_am_sched_tbl(1);
9197         close get_last_am_cur;
9198 
9199         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling PAY_INSTALLMENTS...');
9200         PAY_INSTALLMENTS(
9201             P_API_VERSION => 1.0,
9202             P_INIT_MSG_LIST	=> FND_API.G_TRUE,
9203             P_COMMIT => FND_API.G_FALSE,
9204             P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
9205             P_LOAN_ID => P_LOAN_ID,
9206             P_AM_SCHED_TBL => l_am_sched_tbl,
9207             P_CASH_RECEIPTS_TBL => P_CASH_RECEIPTS_TBL,
9208             X_RETURN_STATUS	=> l_return_status,
9209             X_MSG_COUNT => l_msg_count,
9210             X_MSG_DATA => l_msg_data);
9211 
9212         IF l_return_status = 'S' THEN
9213             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully applied cash receipts.');
9214         ELSE
9215             RAISE FND_API.G_EXC_ERROR;
9216         END IF;
9217 
9218     end if;
9219 
9220     if P_COMMIT = FND_API.G_TRUE then
9221         COMMIT WORK;
9222         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
9223     end if;
9224 
9225     -- END OF BODY OF API
9226     x_return_status := FND_API.G_RET_STS_SUCCESS;
9227 
9228     -- Standard call to get message count and if count is 1, get message info
9229     FND_MSG_PUB.Count_And_Get(
9230                 p_encoded => FND_API.G_FALSE,
9231                 p_count => x_msg_count,
9232                 p_data => x_msg_data);
9233 
9234     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
9235 
9236 EXCEPTION
9237     WHEN FND_API.G_EXC_ERROR THEN
9238         ROLLBACK TO BILL_AND_PAY_NEXT_INSTAL;
9239         x_return_status := FND_API.G_RET_STS_ERROR;
9240         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9241         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9242     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9243         ROLLBACK TO BILL_AND_PAY_NEXT_INSTAL;
9244         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9245         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9246         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9247     WHEN OTHERS THEN
9248         ROLLBACK TO BILL_AND_PAY_NEXT_INSTAL;
9249         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9250         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
9251             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
9252         END IF;
9253         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9254         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9255 END;
9256 
9257 
9258 
9259 
9260 /*========================================================================
9261  | PUBLIC PROCEDURE PAY_INSTALLMENTS
9262  |
9263  | DESCRIPTION
9264  |      This procedure applies cash receipts to given installments
9265  |
9266  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
9267  |      None
9268  |
9269  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
9270  |      init
9271  |      LogMessage
9272  |
9273  | PARAMETERS
9274  |      P_API_VERSION		    IN          Standard in parameter
9275  |      P_INIT_MSG_LIST		    IN          Standard in parameter
9276  |      P_COMMIT			    IN          Standard in parameter
9277  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
9278  |      P_LOAN_ID               IN          Loan ID
9279  |      P_AM_SCHED_TBL          IN          LNS_BILLING_BATCH_PUB.AMORTIZATION_SCHED_TBL,
9280  |      P_CASH_RECEIPTS_TBL     IN          LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL
9281  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
9282  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
9283  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
9284  |
9285  | KNOWN ISSUES
9286  |      None
9287  |
9288  | NOTES
9289  |      Any interesting aspect of the code in the package body which needs
9290  |      to be stated.
9291  |
9292  | MODIFICATION HISTORY
9293  | Date                  Author            Description of Changes
9294  | 03-17-2009            scherkas          Created for bug
9295  |
9296  *=======================================================================*/
9297 PROCEDURE PAY_INSTALLMENTS(
9298     P_API_VERSION		    IN          NUMBER,
9299     P_INIT_MSG_LIST		    IN          VARCHAR2,
9300     P_COMMIT			    IN          VARCHAR2,
9301     P_VALIDATION_LEVEL	    IN          NUMBER,
9302     P_LOAN_ID               IN          NUMBER,
9303     P_AM_SCHED_TBL          IN          LNS_BILLING_BATCH_PUB.AMORTIZATION_SCHED_TBL,
9304     P_CASH_RECEIPTS_TBL     IN          LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL,
9305     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
9306     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
9307     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
9308 IS
9309 
9310 /*-----------------------------------------------------------------------+
9311  | Local Variable Declarations and initializations                       |
9312  +-----------------------------------------------------------------------*/
9313 
9314     l_api_name                      CONSTANT VARCHAR2(30) := 'PAY_INSTALLMENTS';
9315     l_api_version                   CONSTANT NUMBER := 1.0;
9316     l_return_status                 VARCHAR2(1);
9317     l_msg_count                     NUMBER;
9318     l_msg_data                      VARCHAR2(32767);
9319     l_Count                         number;
9320     l_Count1                        number;
9321     l_order                         varchar2(30);
9322     l_search_str                    varchar2(1);
9323 	l_start_pos		                number;
9324 	l_end_pos		                number;
9325     l_receipt                       number;
9326     l_exit_loop                     varchar2(1);
9327     l_quit                          varchar2(1);
9328     l_apply_amount                  number;
9329     l_application                   number;
9330     l_trans_to_receipt_rate         number;
9331     l_receipt_amount_from           number;  -- in receipt currency
9332     l_rc_precision                  number;
9333     l_rc_ext_precision              number;
9334     l_rc_min_acct_unit              number;
9335     l_inv_precision                 number;
9336     l_inv_ext_precision             number;
9337     l_inv_min_acct_unit             number;
9338     l_apply_date                    date;
9339     l_inv_am_in_rec_cur             number;
9340     l_inv_count                     number;
9341     l_rc_count                      number;
9342     l_error                         varchar2(32767);
9343     l_total_applied_amount          number;
9344 
9345     l_INVOICE_REC                   LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_REC;
9346     L_INVOICES_TBL                  LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL;
9347     l_order_tbl                     DBMS_SQL.VARCHAR2_TABLE;
9348     l_CASH_RECEIPTS_TBL             LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL;
9349 
9350 /*-----------------------------------------------------------------------+
9351  | Cursor Declarations                                                   |
9352  +-----------------------------------------------------------------------*/
9353 
9354     -- get payment application order
9355     CURSOR order_cur(P_LOAN_ID number) IS
9356         select PAYMENT_APPLICATION_ORDER
9357         from lns_terms
9358         where loan_id = P_LOAN_ID;
9359 
9360     -- fetching open invoices in payment order
9361     CURSOR invoices_cur(P_LOAN_ID number, P_AMORTIZATION_SCHED_ID number, P_INVOICE_TYPE varchar2) IS
9362         select
9363             decode(P_INVOICE_TYPE, 'INT', am.INTEREST_TRX_ID, 'PRIN', am.principal_trx_id, 'FEE', am.FEE_TRX_ID),
9364             psa.PAYMENT_SCHEDULE_ID,
9365             psa.trx_number,
9366             psa.TRX_DATE,
9367             psa.due_date,
9368             psa.gl_date,
9369             psa.amount_due_remaining,
9370             P_INVOICE_TYPE,
9371             psa.invoice_currency_code,
9372             nvl(loan.EXCHANGE_RATE, 1)
9373         from
9374             lns_amortization_scheds am,
9375             lns_loan_headers loan,
9376             ar_payment_schedules psa,
9377             lns_lookups look
9378         where
9379             am.loan_id = P_LOAN_ID and
9380             am.amortization_schedule_id = P_AMORTIZATION_SCHED_ID and
9381             loan.loan_id = am.loan_id and
9382             am.reversed_flag = 'N' and
9383             psa.customer_trx_id = decode(P_INVOICE_TYPE, 'INT', am.INTEREST_TRX_ID, 'PRIN', am.principal_trx_id, 'FEE', am.FEE_TRX_ID) and
9384             psa.amount_due_remaining > 0 and
9385             psa.status = 'OP' and
9386             (am.INTEREST_TRX_ID is not null or am.principal_trx_id is not null or am.FEE_TRX_ID is not null) and
9387             look.lookup_type = 'PAYMENT_APPLICATION_TYPE' and
9388             look.lookup_code = P_INVOICE_TYPE;
9389 
9390 BEGIN
9391 
9392     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
9393 
9394     -- Standard start of API savepoint
9395     SAVEPOINT PAY_INSTALLMENTS;
9396     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
9397 
9398     -- Standard call to check for call compatibility
9399     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
9400       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9401     END IF;
9402 
9403     -- Initialize message list if p_init_msg_list is set to TRUE
9404     IF FND_API.To_Boolean(p_init_msg_list) THEN
9405       FND_MSG_PUB.initialize;
9406     END IF;
9407 
9408     -- Initialize API return status to success
9409     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
9410 
9411     -- START OF BODY OF API
9412     init;
9413 
9414     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input:');
9415     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_ID = ' || P_LOAN_ID);
9416 
9417     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization schedules:');
9418     for i in 1..P_AM_SCHED_TBL.count loop
9419         LogMessage(FND_LOG.LEVEL_STATEMENT, P_AM_SCHED_TBL(i));
9420     end loop;
9421 
9422     l_CASH_RECEIPTS_TBL := P_CASH_RECEIPTS_TBL;
9423     l_total_applied_amount := 0;
9424     for i in 1..l_CASH_RECEIPTS_TBL.count loop
9425         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Cash receipt #' || i);
9426         LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_NUMBER: ' || l_CASH_RECEIPTS_TBL(i).RECEIPT_NUMBER);
9427         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CASH_RECEIPT_ID: ' || l_CASH_RECEIPTS_TBL(i).CASH_RECEIPT_ID);
9428         LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_AMOUNT: ' || l_CASH_RECEIPTS_TBL(i).RECEIPT_AMOUNT);
9429         LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_CURRENCY: ' || l_CASH_RECEIPTS_TBL(i).RECEIPT_CURRENCY);
9430         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_CASH_RECEIPTS_TBL(i).EXCHANGE_RATE);
9431         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_CASH_RECEIPTS_TBL(i).EXCHANGE_DATE);
9432         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_CASH_RECEIPTS_TBL(i).EXCHANGE_RATE_TYPE);
9433         LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORIGINAL_CURRENCY: ' || l_CASH_RECEIPTS_TBL(i).ORIGINAL_CURRENCY);
9434         LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLY_DATE: ' || l_CASH_RECEIPTS_TBL(i).APPLY_DATE);
9435         LogMessage(FND_LOG.LEVEL_STATEMENT, 'GL_DATE: ' || l_CASH_RECEIPTS_TBL(i).GL_DATE);
9436         l_total_applied_amount := l_total_applied_amount + l_CASH_RECEIPTS_TBL(i).RECEIPT_AMOUNT;
9437     end loop;
9438 
9439     if l_CASH_RECEIPTS_TBL.count = 0 then
9440         LogMessage(FND_LOG.LEVEL_STATEMENT, 'No cash receipts are passed - nothing to apply. Returning.');
9441         return;
9442     end if;
9443 
9444     if l_total_applied_amount = 0 then
9445         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Total applied amount = 0 - nothing to apply. Returning.');
9446         return;
9447     end if;
9448 
9449     -- get payment application order
9450     open order_cur(P_LOAN_ID);
9451     fetch order_cur into l_order;
9452     close order_cur;
9453 
9454     l_count := 0;
9455     l_search_str := '_';
9456 	l_start_pos := 1;
9457     l_end_pos := instr(l_order, l_search_str, l_start_pos, 1);
9458 
9459     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Payment application order:' || l_order);
9460 	LOOP
9461         l_count := l_count + 1;
9462 		if l_end_pos <> 0 then
9463 			l_order_tbl(l_count) := substr(l_order, l_start_pos, l_end_pos-l_start_pos);
9464             --LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_count: ' || l_order_tbl(l_count));
9465 		else
9466 			l_order_tbl(l_count) := substr(l_order, l_start_pos, LENGTH(l_order)-l_start_pos+1);
9467             --LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_count: ' || l_order_tbl(l_count));
9468 			exit;
9469 		end if;
9470         l_start_pos := l_end_pos+1;
9471 		l_end_pos := instr(l_order, l_search_str, l_start_pos, 1);
9472     END LOOP;
9473 
9474     l_Count1 := 0;
9475 
9476     -- looping thru payment application order table and fetch invoices in order to be applied
9477     FOR l_Count IN 1..l_order_tbl.count LOOP
9478         for i in 1..P_AM_SCHED_TBL.count loop
9479 
9480             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization_schedule_id = ' || P_AM_SCHED_TBL(i));
9481 
9482             l_INVOICE_REC := null;
9483             open invoices_cur(P_LOAN_ID, P_AM_SCHED_TBL(i), l_order_tbl(l_Count));
9484             fetch invoices_cur into l_INVOICE_REC.CUST_TRX_ID,
9485                                     l_INVOICE_REC.PAYMENT_SCHEDULE_ID,
9486                                     l_INVOICE_REC.INVOICE_NUMBER,
9487                                     l_INVOICE_REC.TRX_DATE,
9488                                     l_INVOICE_REC.DUE_DATE,
9489                                     l_INVOICE_REC.GL_DATE,
9490                                     l_INVOICE_REC.REMAINING_AMOUNT,
9491                                     l_INVOICE_REC.PURPOSE,
9492                                     l_INVOICE_REC.INVOICE_CURRENCY,
9493                                     l_INVOICE_REC.EXCHANGE_RATE;
9494             close invoices_cur;
9495 
9496             if l_INVOICE_REC.CUST_TRX_ID is not null then
9497 
9498                 l_Count1 := l_Count1 + 1;
9499 
9500                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice #' || l_Count1);
9501                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || l_INVOICE_REC.PAYMENT_SCHEDULE_ID);
9502                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_ID: ' || l_INVOICE_REC.CUST_TRX_ID);
9503                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INVOICE_NUMBER: ' || l_INVOICE_REC.INVOICE_NUMBER);
9504                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_DATE: ' || l_INVOICE_REC.TRX_DATE);
9505                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_INVOICE_REC.DUE_DATE);
9506                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'GL_DATE: ' || l_INVOICE_REC.GL_DATE);
9507                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'REMAINING_AMOUNT: ' || l_INVOICE_REC.REMAINING_AMOUNT);
9508                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PURPOSE: ' || l_INVOICE_REC.PURPOSE);
9509                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INVOICE_CURRENCY: ' || l_INVOICE_REC.INVOICE_CURRENCY);
9510                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_INVOICE_REC.EXCHANGE_RATE);
9511 
9512                 L_INVOICES_TBL(l_Count1) := l_INVOICE_REC;
9513 
9514             end if;
9515 
9516         END LOOP;
9517     END LOOP;
9518 
9519     if L_INVOICES_TBL.count = 0 then
9520         LogMessage(FND_LOG.LEVEL_STATEMENT, 'No open invoices to pay. Returning.');
9521         return;
9522     end if;
9523 
9524     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Applying receipts...');
9525 
9526     l_receipt := 1;
9527     l_quit := 'N';
9528     l_application := 0;
9529     l_inv_count := 0;
9530     l_rc_count := 0;
9531 
9532     -- looping thru invoices and apply receipts
9533     FOR l_Count IN 1..L_INVOICES_TBL.count LOOP
9534 
9535         l_inv_count := l_inv_count + 1;
9536         LogMessage(FND_LOG.LEVEL_STATEMENT, '-------------');
9537         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice #' || l_Count);
9538         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || L_INVOICES_TBL(l_Count).PAYMENT_SCHEDULE_ID);
9539         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_ID: ' || L_INVOICES_TBL(l_Count).CUST_TRX_ID);
9540         LogMessage(FND_LOG.LEVEL_STATEMENT, 'INVOICE_NUMBER: ' || L_INVOICES_TBL(l_Count).INVOICE_NUMBER);
9541         LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_DATE: ' || L_INVOICES_TBL(l_Count).TRX_DATE);
9542         LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || L_INVOICES_TBL(l_Count).DUE_DATE);
9543         LogMessage(FND_LOG.LEVEL_STATEMENT, 'GL_DATE: ' || L_INVOICES_TBL(l_Count).GL_DATE);
9544         LogMessage(FND_LOG.LEVEL_STATEMENT, 'REMAINING_AMOUNT: ' || L_INVOICES_TBL(l_Count).REMAINING_AMOUNT);
9545         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PURPOSE: ' || L_INVOICES_TBL(l_Count).PURPOSE);
9546         LogMessage(FND_LOG.LEVEL_STATEMENT, 'INVOICE_CURRENCY: ' || L_INVOICES_TBL(l_Count).INVOICE_CURRENCY);
9547         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || L_INVOICES_TBL(l_Count).EXCHANGE_RATE);
9548 
9549         FOR l_Count1 IN l_receipt..l_CASH_RECEIPTS_TBL.count LOOP
9550 
9551             l_rc_count := l_receipt;
9552             LogMessage(FND_LOG.LEVEL_STATEMENT, ' ');
9553             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Receipt #' || l_Count1);
9554             LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_NUMBER: ' || l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_NUMBER);
9555             LogMessage(FND_LOG.LEVEL_STATEMENT, 'CASH_RECEIPT_ID: ' || l_CASH_RECEIPTS_TBL(l_Count1).CASH_RECEIPT_ID);
9556             LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_AMOUNT: ' || l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT);
9557             LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_CURRENCY: ' || l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_CURRENCY);
9558             LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE);
9559             LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_DATE);
9560             LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE_TYPE);
9561             LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORIGINAL_CURRENCY: ' || l_CASH_RECEIPTS_TBL(l_Count1).ORIGINAL_CURRENCY);
9562             LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLY_DATE: ' || l_CASH_RECEIPTS_TBL(l_Count1).APPLY_DATE);
9563             LogMessage(FND_LOG.LEVEL_STATEMENT, 'GL_DATE: ' || l_CASH_RECEIPTS_TBL(l_Count1).GL_DATE);
9564 
9565             BEGIN
9566 
9567                 -- calculate amounts using curencies
9568                 if l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_CURRENCY = L_INVOICES_TBL(l_Count).INVOICE_CURRENCY then
9569 
9570                     if L_INVOICES_TBL(l_Count).REMAINING_AMOUNT > l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT then
9571 
9572                         l_apply_amount := l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT;
9573                         l_exit_loop := 'N';
9574 
9575                     elsif L_INVOICES_TBL(l_Count).REMAINING_AMOUNT <= l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT then
9576 
9577                         l_apply_amount := L_INVOICES_TBL(l_Count).REMAINING_AMOUNT;
9578                         l_exit_loop := 'Y';
9579 
9580                     end if;
9581 
9582                     l_receipt_amount_from := null;
9583                     l_trans_to_receipt_rate := null;
9584 
9585                 else    -- if trx currency <> receipt currency
9586 
9587                     -- get rc/functional currency precision
9588                     fnd_currency.GET_INFO(CURRENCY_CODE => l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_CURRENCY,
9589                                         PRECISION => l_rc_precision,
9590                                         EXT_PRECISION => l_rc_ext_precision,
9591                                         MIN_ACCT_UNIT => l_rc_min_acct_unit);
9592 
9593                     -- get invoice currency precision
9594                     fnd_currency.GET_INFO(CURRENCY_CODE => L_INVOICES_TBL(l_Count).INVOICE_CURRENCY,
9595                                         PRECISION => l_inv_precision,
9596                                         EXT_PRECISION => l_inv_ext_precision,
9597                                         MIN_ACCT_UNIT => l_inv_min_acct_unit);
9598 
9599                     if l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE is not null then
9600                         logMessage(FND_LOG.LEVEL_STATEMENT, 'using receipt exchange rate ' || l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE);
9601                         l_trans_to_receipt_rate := l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE;
9602                     else
9603                         logMessage(FND_LOG.LEVEL_PROCEDURE, 'using loan exchange rate ' || L_INVOICES_TBL(l_Count).EXCHANGE_RATE);
9604                         l_trans_to_receipt_rate := L_INVOICES_TBL(l_Count).EXCHANGE_RATE;
9605                     end if;
9606 
9607                     l_inv_am_in_rec_cur := round(L_INVOICES_TBL(l_Count).REMAINING_AMOUNT * l_trans_to_receipt_rate, l_rc_precision);
9608 
9609                     if l_inv_am_in_rec_cur > l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT then
9610 
9611                         l_receipt_amount_from := l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT;
9612                         l_apply_amount := round(l_receipt_amount_from / l_trans_to_receipt_rate, l_inv_precision);
9613                         l_exit_loop := 'N';
9614 
9615                     elsif l_inv_am_in_rec_cur < l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT then
9616 
9617                         l_apply_amount := L_INVOICES_TBL(l_Count).REMAINING_AMOUNT;
9618                         l_receipt_amount_from := round(l_apply_amount * l_trans_to_receipt_rate, l_rc_precision);
9619                         l_exit_loop := 'Y';
9620 
9621                     else
9622 
9623                         l_apply_amount := L_INVOICES_TBL(l_Count).REMAINING_AMOUNT;
9624                         l_receipt_amount_from := l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT;
9625                         l_exit_loop := 'Y';
9626 
9627                     end if;
9628 
9629                 end if;
9630 
9631                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling AR_RECEIPT_API_PUB.APPLY with following parameters:');
9632                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_cash_receipt_id: ' || l_CASH_RECEIPTS_TBL(l_Count1).CASH_RECEIPT_ID);
9633                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_applied_payment_schedule_id: ' || L_INVOICES_TBL(l_Count).PAYMENT_SCHEDULE_ID);
9634                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_apply_date: ' || l_CASH_RECEIPTS_TBL(l_Count1).APPLY_DATE);
9635                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_apply_gl_date: ' || l_CASH_RECEIPTS_TBL(l_Count1).GL_DATE);
9636                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_amount_applied: ' || l_apply_amount); -- in loan currency
9637                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_amount_applied_from: ' || l_receipt_amount_from); -- in receipt currency
9638                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_trans_to_receipt_rate: ' || l_trans_to_receipt_rate);
9639 
9640                 BEGIN
9641 
9642                     l_error := null;
9643                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling AR_RECEIPT_API_PUB.APPLY...');
9644                     AR_RECEIPT_API_PUB.APPLY(P_API_VERSION                 => 1.0
9645                                             ,P_INIT_MSG_LIST               => FND_API.G_TRUE
9646                                             ,P_COMMIT                      => FND_API.G_FALSE
9647                                             ,X_RETURN_STATUS               => l_return_status
9648                                             ,X_MSG_COUNT                   => l_msg_count
9649                                             ,X_MSG_DATA                    => l_msg_data
9650                                             ,p_cash_receipt_id             => l_CASH_RECEIPTS_TBL(l_Count1).CASH_RECEIPT_ID
9651                                             ,p_applied_payment_schedule_id => L_INVOICES_TBL(l_Count).PAYMENT_SCHEDULE_ID
9652                                             ,p_apply_date                  => l_CASH_RECEIPTS_TBL(l_Count1).APPLY_DATE
9653                                             ,p_apply_gl_date               => l_CASH_RECEIPTS_TBL(l_Count1).GL_DATE
9654                                             ,p_amount_applied              => l_apply_amount
9655                                             ,p_amount_applied_from         => l_receipt_amount_from
9656                                             ,p_trans_to_receipt_rate       => l_trans_to_receipt_rate);
9657 
9658                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
9659                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
9660 
9661                     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9662                         l_error := FND_MSG_PUB.Get(p_encoded => 'F');
9663                     END IF;
9664 
9665                 EXCEPTION
9666                     WHEN OTHERS THEN
9667                         l_return_status := FND_API.G_RET_STS_ERROR;
9668                         l_error := SQLERRM;
9669                 END;
9670 
9671                 if l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_CURRENCY = L_INVOICES_TBL(l_Count).INVOICE_CURRENCY then
9672                     l_receipt_amount_from := l_apply_amount;
9673                 end if;
9674 
9675                 l_application := l_application + 1;
9676 
9677                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9678                     FND_MESSAGE.SET_NAME('LNS', 'LNS_APPL_CR_FAIL');
9679                     FND_MSG_PUB.Add;
9680                     LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
9681                     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reported error: ' || l_error);
9682                     RAISE FND_API.G_EXC_ERROR;
9683                 END IF;
9684 
9685                 L_INVOICES_TBL(l_Count).REMAINING_AMOUNT := L_INVOICES_TBL(l_Count).REMAINING_AMOUNT - l_apply_amount;
9686                 l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT := l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT - l_receipt_amount_from;
9687 
9688                 if  l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT = 0 then
9689 
9690                     if l_receipt = l_CASH_RECEIPTS_TBL.count then
9691                         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Last receipt has been exhausted - exiting receipts loop');
9692                         l_quit := 'Y';
9693                         exit;
9694                     else
9695                         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Receipt #' || l_receipt || ' has been exhausted - continue with next receipt');
9696                         l_quit := 'N';
9697                         l_receipt := l_receipt + 1;
9698                     end if;
9699 
9700                 end if;
9701 
9702                 if l_exit_loop = 'Y' then
9703                     exit;
9704                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice #' || l_Count || ' has been fully paid - going to next invoice');
9705                 end if;
9706 
9707             EXCEPTION
9708                 WHEN OTHERS THEN
9709                     RAISE FND_API.G_EXC_ERROR;
9710             END;
9711 
9712         END LOOP;
9713 
9714         if l_quit = 'Y' then
9715             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Exiting invoices loop');
9716             exit;
9717         end if;
9718 
9719     END LOOP;
9720 
9721     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
9722     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully applied ' || l_rc_count || ' receipts to ' || l_inv_count || ' invoices');
9723     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Number of applications: ' || l_application);
9724 
9725     if P_COMMIT = FND_API.G_TRUE then
9726         COMMIT WORK;
9727         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
9728     end if;
9729 
9730     -- END OF BODY OF API
9731     x_return_status := FND_API.G_RET_STS_SUCCESS;
9732 
9733     -- Standard call to get message count and if count is 1, get message info
9734     FND_MSG_PUB.Count_And_Get(
9735                 p_encoded => FND_API.G_FALSE,
9736                 p_count => x_msg_count,
9737                 p_data => x_msg_data);
9738 
9739     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
9740 
9741 EXCEPTION
9742     WHEN FND_API.G_EXC_ERROR THEN
9743         ROLLBACK TO PAY_INSTALLMENTS;
9744         x_return_status := FND_API.G_RET_STS_ERROR;
9745         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9746         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9747     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9748         ROLLBACK TO PAY_INSTALLMENTS;
9749         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9750         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9751         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9752     WHEN OTHERS THEN
9753         ROLLBACK TO PAY_INSTALLMENTS;
9754         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9755         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
9756             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
9757         END IF;
9758         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9759         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9760 END;
9761 
9762 
9763 
9764 
9765 /*========================================================================
9766  | PUBLIC FUNCTION CAN_BILL_NEXT_INSTAL
9767  |
9768  | DESCRIPTION
9769  |      This function returns true/false is loan ready to bill next installment
9770  |
9771  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
9772  |      None
9773  |
9774  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
9775  |      LogMessage
9776  |
9777  | PARAMETERS
9778  |      P_LOAN_ID               IN          Loan ID
9779  |
9780  | KNOWN ISSUES
9781  |      None
9782  |
9783  | NOTES
9784  |      Any interesting aspect of the code in the package body which needs
9785  |      to be stated.
9786  |
9787  | MODIFICATION HISTORY
9788  | Date                  Author            Description of Changes
9789  | 03-17-2009            scherkas          Created for bug
9790  |
9791  *=======================================================================*/
9792 FUNCTION CAN_BILL_NEXT_INSTAL(P_LOAN_ID IN NUMBER) return BOOLEAN
9793 IS
9794 
9795 /*-----------------------------------------------------------------------+
9796  | Local Variable Declarations and initializations                       |
9797  +-----------------------------------------------------------------------*/
9798 
9799     l_api_name                      CONSTANT VARCHAR2(30) := 'CAN_BILL_NEXT_INSTAL';
9800     l_return_status                 VARCHAR2(1);
9801     l_msg_count                     NUMBER;
9802     l_msg_data                      VARCHAR2(32767);
9803     l_return                            BOOLEAN;
9804     l_value                             varchar2(1);
9805     l_is_disable_bill		   VARCHAR2(1);
9806 
9807     l_loans_next_dd_rec             LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
9808 
9809 /*-----------------------------------------------------------------------+
9810  | Cursor Declarations                                                   |
9811  +-----------------------------------------------------------------------*/
9812 
9813     CURSOR loans_cur(P_LOAN_ID NUMBER) IS
9814         select
9815             head.LOAN_ID,
9816             head.LOAN_NUMBER,
9817             head.OBJECT_VERSION_NUMBER,
9818             LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) + 1,
9819             head.CUSTOM_PAYMENTS_FLAG
9820         from LNS_LOAN_HEADERS head,
9821             LNS_TERMS term
9822         where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
9823             and head.loan_id = term.loan_id
9824             and (head.BILLED_FLAG = 'Y' or head.BILLED_FLAG is null)
9825             and nvl(head.LAST_PAYMENT_NUMBER, 0) < (select max(END_INSTALLMENT_NUMBER) from lns_rate_schedules
9826                 where term_id = term.term_id and phase = nvl(head.CURRENT_PHASE, 'TERM'))
9827             and trunc(term.NEXT_PAYMENT_DUE_DATE + nvl(term.NUMBER_GRACE_DAYS, 0)) < trunc(sysdate)
9828             and head.LOAN_ID = P_LOAN_ID;
9829 
9830     CURSOR can_bill_cur(P_LOAN_ID NUMBER) IS
9831         select 'x'
9832         from LNS_LOAN_HEADERS head,
9833             LNS_TERMS term
9834         where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
9835             and head.loan_id = term.loan_id
9836             and (head.BILLED_FLAG is null or head.BILLED_FLAG = 'N')
9837             and nvl(head.LAST_PAYMENT_NUMBER, 0) < (select max(END_INSTALLMENT_NUMBER) from lns_rate_schedules
9838                 where term_id = term.term_id and phase = nvl(head.CURRENT_PHASE, 'TERM'))
9839             and head.LOAN_ID = P_LOAN_ID;
9840 
9841 BEGIN
9842 
9843     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
9844 
9845     -- START OF BODY OF API
9846     init;
9847 
9848     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
9849     l_return := false;
9850 
9851     /* verify input parameters */
9852     if P_LOAN_ID is null then
9853 
9854 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
9855     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
9856 		FND_MSG_PUB.Add;
9857         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
9858         RAISE FND_API.G_EXC_ERROR;
9859 
9860     end if;
9861 
9862     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Checking the Disable_billing_flag in '||l_api_name);
9863 
9864     l_is_disable_bill := IS_BILLING_DISABLED(P_LOAN_ID);
9865     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_is_disable_bill is '||l_is_disable_bill);
9866     IF l_is_disable_bill = 'Y' THEN
9867         LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLING is Disabled for the loan : '||p_loan_id);
9868         return l_return;
9869     END IF;
9870 
9871     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting loan details...');
9872     open loans_cur(P_LOAN_ID);
9873     fetch loans_cur into
9874         l_loans_next_dd_rec.LOAN_ID,
9875         l_loans_next_dd_rec.LOAN_NUMBER,
9876         l_loans_next_dd_rec.OBJECT_VERSION_NUMBER,
9877         l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER,
9878         l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG;
9879     close loans_cur;
9880 
9881     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER = ' || l_loans_next_dd_rec.LOAN_NUMBER);
9882     LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_NUMBER = ' || l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER);
9883     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG = ' || l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG);
9884 
9885     if l_loans_next_dd_rec.LOAN_ID is not null then
9886 
9887         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling CALC_SINGLE_LOAN_NEXT_DD...');
9888         CALC_SINGLE_LOAN_NEXT_DD(
9889             P_API_VERSION => 1.0,
9890             P_INIT_MSG_LIST	=> FND_API.G_TRUE,
9891             P_COMMIT => FND_API.G_FALSE,
9892             P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
9893             P_LOAN_NEXT_DD_REC => l_loans_next_dd_rec,
9894             X_RETURN_STATUS	=> l_return_status,
9895             X_MSG_COUNT => l_msg_count,
9896             X_MSG_DATA => l_msg_data);
9897 
9898         IF l_return_status = 'S' THEN
9899             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully calculated next payment due date.');
9900         ELSE
9901     --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to calculate next payment due date.');
9902             FND_MESSAGE.SET_NAME('LNS', 'LNS_CALC_NEXT_DUE_FAIL');
9903             FND_MSG_PUB.Add;
9904             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
9905             RAISE FND_API.G_EXC_ERROR;
9906         END IF;
9907 
9908     end if;
9909 
9910     open can_bill_cur(P_LOAN_ID);
9911     fetch can_bill_cur into l_value;
9912     close can_bill_cur;
9913 
9914     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_value = ' || l_value);
9915     if l_value is not null then
9916         l_return := true;
9917     end if;
9918 
9919     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
9920 
9921     return l_return;
9922 
9923 EXCEPTION
9924     WHEN OTHERS THEN
9925         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'In exception of ' || l_api_name);
9926         return l_return;
9927 END;
9928 
9929 
9930 
9931 /*========================================================================
9932  | PUBLIC PROCEDURE GET_BILLED_INSTALLMENT
9933  |
9934  | DESCRIPTION
9935  |      This procedure returns already billed installment in LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL format
9936  |
9937  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
9938  |      None
9939  |
9940  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
9941  |      init
9942  |      LogMessage
9943  |
9944  | PARAMETERS
9945  |      P_API_VERSION		    IN          Standard in parameter
9946  |      P_INIT_MSG_LIST		    IN          Standard in parameter
9947  |      P_COMMIT			    IN          Standard in parameter
9948  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
9949  |      P_LOAN_ID               IN          Loan ID
9950  |      P_AM_SCHED_ID           IN          Amortization sched ID
9951  |      X_INVOICES_TBL          OUT NOCOPY  LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL,
9952  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
9953  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
9954  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
9955  |
9956  | KNOWN ISSUES
9957  |      None
9958  |
9959  | NOTES
9960  |      Any interesting aspect of the code in the package body which needs
9961  |      to be stated.
9962  |
9963  | MODIFICATION HISTORY
9964  | Date                  Author            Description of Changes
9965  | 04-27-2009            scherkas          Created for bug
9966  |
9967  *=======================================================================*/
9968 PROCEDURE GET_BILLED_INSTALLMENT(
9969     P_API_VERSION		    IN          NUMBER,
9970     P_INIT_MSG_LIST		    IN          VARCHAR2,
9971     P_COMMIT			    IN          VARCHAR2,
9972     P_VALIDATION_LEVEL	    IN          NUMBER,
9973     P_LOAN_ID               IN          NUMBER,
9974     P_AM_SCHED_ID           IN          NUMBER,
9975     X_INVOICES_TBL          OUT NOCOPY  LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL,
9976     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
9977     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
9978     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
9979 IS
9980 
9981 /*-----------------------------------------------------------------------+
9982  | Local Variable Declarations and initializations                       |
9983  +-----------------------------------------------------------------------*/
9984 
9985     l_api_name                      CONSTANT VARCHAR2(30) := 'GET_BILLED_INSTALLMENT';
9986     l_api_version                   CONSTANT NUMBER := 1.0;
9987     l_return_status                 VARCHAR2(1);
9988     l_msg_count                     NUMBER;
9989     l_msg_data                      VARCHAR2(32767);
9990     i                               number;
9991 
9992     l_invoice_rec                   LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_REC;
9993 
9994 /*-----------------------------------------------------------------------+
9995  | Cursor Declarations                                                   |
9996  +-----------------------------------------------------------------------*/
9997 
9998     -- fetching open invoices in payment order
9999     CURSOR invoices_cur(P_LOAN_ID number, P_AMORTIZATION_SCHED_ID number) IS
10000         select
10001             psa.customer_trx_id,
10002             psa.PAYMENT_SCHEDULE_ID,
10003             psa.trx_number,
10004             am.payment_number,
10005             decode(psa.customer_trx_id, am.principal_trx_id, 'PRIN', am.interest_trx_id, 'INT', am.fee_trx_id, 'FEE'),
10006             decode(psa.customer_trx_id, am.principal_trx_id, am.principal_amount, am.interest_trx_id, am.interest_amount, am.fee_trx_id, am.fee_amount),
10007             psa.amount_due_remaining,
10008             psa.TRX_DATE,
10009             psa.due_date,
10010             psa.GL_DATE,
10011             psa.invoice_currency_code,
10012             nvl(loan.EXCHANGE_RATE, 1),
10013             trx_type.name
10014         from
10015             lns_amortization_scheds am,
10016             lns_loan_headers loan,
10017             ar_payment_schedules psa,
10018             RA_CUST_TRX_TYPES_ALL trx_type
10019         where
10020             am.loan_id = P_LOAN_ID and
10021             am.amortization_schedule_id = P_AMORTIZATION_SCHED_ID and
10022             loan.loan_id = am.loan_id and
10023             psa.customer_trx_id in (am.principal_trx_id, am.interest_trx_id, am.fee_trx_id) and
10024             (am.INTEREST_TRX_ID is not null or am.principal_trx_id is not null or am.FEE_TRX_ID is not null) and
10025             psa.CUST_TRX_TYPE_ID = trx_type.CUST_TRX_TYPE_ID;
10026 
10027 BEGIN
10028 
10029     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10030 
10031     -- Standard start of API savepoint
10032     SAVEPOINT GET_BILLED_INSTALLMENT;
10033     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
10034 
10035     -- Standard call to check for call compatibility
10036     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
10037       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10038     END IF;
10039 
10040     -- Initialize message list if p_init_msg_list is set to TRUE
10041     IF FND_API.To_Boolean(p_init_msg_list) THEN
10042       FND_MSG_PUB.initialize;
10043     END IF;
10044 
10045     -- Initialize API return status to success
10046     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
10047 
10048     -- START OF BODY OF API
10049     init;
10050 
10051     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input:');
10052     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_ID = ' || P_LOAN_ID);
10053     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_AM_SCHED_ID = ' || P_AM_SCHED_ID);
10054 
10055     /* verify input parameters */
10056     if P_LOAN_ID is null or P_AM_SCHED_ID is null then
10057 
10058 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
10059     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
10060 		FND_MSG_PUB.Add;
10061         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10062         RAISE FND_API.G_EXC_ERROR;
10063 
10064     end if;
10065 
10066     i := 0;
10067     open invoices_cur(P_LOAN_ID, P_AM_SCHED_ID);
10068     LOOP
10069 
10070         fetch invoices_cur into
10071             l_invoice_rec.CUST_TRX_ID,
10072             l_invoice_rec.PAYMENT_SCHEDULE_ID,
10073             l_invoice_rec.INVOICE_NUMBER,
10074             l_invoice_rec.INSTALLMENT_NUMBER,
10075             l_invoice_rec.PURPOSE,
10076             l_invoice_rec.ORIGINAL_AMOUNT,
10077             l_invoice_rec.REMAINING_AMOUNT,
10078             l_invoice_rec.TRX_DATE,
10079             l_invoice_rec.DUE_DATE,
10080             l_invoice_rec.GL_DATE,
10081             l_invoice_rec.INVOICE_CURRENCY,
10082             l_invoice_rec.EXCHANGE_RATE,
10083             l_invoice_rec.TRANSACTION_TYPE;
10084         exit when invoices_cur%NOTFOUND;
10085 
10086         i := i + 1;
10087         x_invoices_tbl(i) := l_invoice_rec;
10088 
10089         --x_invoices_tbl(i).TRANSACTION_TYPE := lns_utility_pub.getDocumentName(x_invoices_tbl(i).PURPOSE);
10090         x_invoices_tbl(i).PURPOSE := lns_utility_pub.get_lookup_meaning('PAYMENT_APPLICATION_TYPE', x_invoices_tbl(i).PURPOSE);
10091         x_invoices_tbl(i).FORGIVENESS_AMOUNT := 0;
10092         x_invoices_tbl(i).BILLED_FLAG := 'Y';
10093 
10094     END LOOP;
10095     close invoices_cur;
10096 
10097     if P_COMMIT = FND_API.G_TRUE then
10098         COMMIT WORK;
10099         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
10100     end if;
10101 
10102     -- END OF BODY OF API
10103     x_return_status := FND_API.G_RET_STS_SUCCESS;
10104 
10105     -- Standard call to get message count and if count is 1, get message info
10106     FND_MSG_PUB.Count_And_Get(
10107                 p_encoded => FND_API.G_FALSE,
10108                 p_count => x_msg_count,
10109                 p_data => x_msg_data);
10110 
10111     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10112 
10113 EXCEPTION
10114     WHEN FND_API.G_EXC_ERROR THEN
10115         ROLLBACK TO GET_BILLED_INSTALLMENT;
10116         x_return_status := FND_API.G_RET_STS_ERROR;
10117         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10118         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10119     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10120         ROLLBACK TO GET_BILLED_INSTALLMENT;
10121         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10122         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10123         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10124     WHEN OTHERS THEN
10125         ROLLBACK TO GET_BILLED_INSTALLMENT;
10126         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10127         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
10128             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
10129         END IF;
10130         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10131         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10132 END;
10133 
10134 
10135 
10136 /*========================================================================
10137  | PUBLIC PROCEDURE BILL_AND_PAY_OFFCYCLE_BILLS
10138  |
10139  | DESCRIPTION
10140  |      This procedure bills and pays manual (offcycle) installments
10141  |
10142  | PSEUDO CODE/LOGIC
10143  |
10144  | PARAMETERS
10145  |      P_API_VERSION		    IN          Standard in parameter
10146  |      P_INIT_MSG_LIST		    IN          Standard in parameter
10147  |      P_COMMIT			    IN          Standard in parameter
10148  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
10149  |      P_LOAN_ID               IN          Loan ID
10150  |      P_BILL_HEADERS_TBL      IN          LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL,
10151  |      P_BILL_LINES_TBL        IN          LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
10152  |      P_CASH_RECEIPTS_TBL     IN          LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL
10153  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
10154  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
10155  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
10156  |
10157  | KNOWN ISSUES
10158  |      None
10159  |
10160  | NOTES
10161  |      Any interesting aspect of the code in the package body which needs
10162  |      to be stated.
10163  |
10164  | MODIFICATION HISTORY
10165  | Date                  Author            Description of Changes
10166  | 04-28-2009            scherkas          Created for bug
10167  |
10168  *=======================================================================*/
10169 PROCEDURE BILL_AND_PAY_OFFCYCLE_BILLS(
10170     P_API_VERSION		    IN          NUMBER,
10171     P_INIT_MSG_LIST		    IN          VARCHAR2,
10172     P_COMMIT			    IN          VARCHAR2,
10173     P_VALIDATION_LEVEL	    IN          NUMBER,
10174     P_LOAN_ID               IN          NUMBER,
10175     P_BILL_HEADERS_TBL      IN          LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL,
10176     P_BILL_LINES_TBL        IN          LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
10177     P_CASH_RECEIPTS_TBL     IN          LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL,
10178     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
10179     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
10180     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
10181 IS
10182 
10183 /*-----------------------------------------------------------------------+
10184  | Local Variable Declarations and initializations                       |
10185  +-----------------------------------------------------------------------*/
10186 
10187     l_api_name                      CONSTANT VARCHAR2(30) := 'BILL_AND_PAY_OFFCYCLE_BILLS';
10188     l_api_version                   CONSTANT NUMBER := 1.0;
10189     l_return_status                 VARCHAR2(1);
10190     l_msg_count                     NUMBER;
10191     l_msg_data                      VARCHAR2(32767);
10192     l_last_am_id                    NUMBER;
10193     l_new_am_id                     NUMBER;
10194     i                               NUMBER;
10195 
10196     l_am_scheds_tbl                 LNS_BILLING_BATCH_PUB.AMORTIZATION_SCHED_TBL;
10197     l_loans_to_bill_tbl		    LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
10198 
10199 /*-----------------------------------------------------------------------+
10200  | Cursor Declarations                                                   |
10201  +-----------------------------------------------------------------------*/
10202 
10203     CURSOR get_last_am_cur(P_LOAN_ID number) IS
10204         select loan.LAST_AMORTIZATION_ID
10205         from LNS_LOAN_HEADERS_all loan
10206         where loan.loan_id = P_LOAN_ID;
10207 
10208     CURSOR get_new_am_cur(P_LOAN_ID number, P_LAST_AM_SCHED number) IS
10209         select AMORTIZATION_SCHEDULE_ID
10210         from LNS_AMORTIZATION_SCHEDS
10211         where loan_id = P_LOAN_ID and
10212         AMORTIZATION_SCHEDULE_ID > P_LAST_AM_SCHED and
10213         (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
10214         order by AMORTIZATION_SCHEDULE_ID;
10215 
10216 BEGIN
10217 
10218     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10219 
10220     -- Standard start of API savepoint
10221     SAVEPOINT BILL_AND_PAY_OFFCYCLE_BILLS;
10222     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
10223 
10224     -- Standard call to check for call compatibility
10225     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
10226       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10227     END IF;
10228 
10229     -- Initialize message list if p_init_msg_list is set to TRUE
10230     IF FND_API.To_Boolean(p_init_msg_list) THEN
10231       FND_MSG_PUB.initialize;
10232     END IF;
10233 
10234     -- Initialize API return status to success
10235     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
10236 
10237     -- START OF BODY OF API
10238     init;
10239 
10240     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input:');
10241     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_ID = ' || P_LOAN_ID);
10242 
10243     /* verify input parameters */
10244     if P_LOAN_ID is null or P_BILL_HEADERS_TBL.count = 0 then
10245 
10246 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
10247     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
10248 		FND_MSG_PUB.Add;
10249         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10250         RAISE FND_API.G_EXC_ERROR;
10251 
10252     end if;
10253 
10254     -- get last billed amortization_schedule_id
10255     open get_last_am_cur(P_LOAN_ID);
10256     fetch get_last_am_cur into l_last_am_id;
10257     close get_last_am_cur;
10258 
10259     if l_last_am_id is null then
10260         l_last_am_id := 0;
10261     end if;
10262 
10263     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Calling CREATE_OFFCYCLE_BILLS...');
10264     LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS(
10265         P_API_VERSION		    => 1.0,
10266         P_INIT_MSG_LIST		    => FND_API.G_TRUE,
10267         P_COMMIT			    => FND_API.G_FALSE,
10268         P_VALIDATION_LEVEL		=> FND_API.G_VALID_LEVEL_FULL,
10269         P_BILL_HEADERS_TBL      => P_BILL_HEADERS_TBL,
10270         P_BILL_LINES_TBL        => P_BILL_LINES_TBL,
10271         X_RETURN_STATUS	        => l_return_status,
10272         X_MSG_COUNT             => l_msg_count,
10273         X_MSG_DATA              => l_msg_data);
10274 
10275     IF l_return_status = 'S' THEN
10276         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully billed offcycle bills.');
10277     ELSE
10278         RAISE FND_API.G_EXC_ERROR;
10279     END IF;
10280 
10281     if P_CASH_RECEIPTS_TBL.count > 0 then
10282 
10283         -- fetch all created manual bills
10284         i := 0;
10285         open get_new_am_cur(P_LOAN_ID, l_last_am_id);
10286         LOOP
10287 
10288             fetch get_new_am_cur into l_new_am_id;
10289             exit when get_new_am_cur%NOTFOUND;
10290 
10291             i := i + 1;
10292             l_am_scheds_tbl(i) := l_new_am_id;
10293 
10294         END LOOP;
10295         close get_new_am_cur;
10296 
10297         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling PAY_INSTALLMENTS...');
10298         PAY_INSTALLMENTS(
10299             P_API_VERSION => 1.0,
10300             P_INIT_MSG_LIST	=> FND_API.G_TRUE,
10301             P_COMMIT => FND_API.G_FALSE,
10302             P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
10303             P_LOAN_ID => P_LOAN_ID,
10304             P_AM_SCHED_TBL => l_am_scheds_tbl,
10305             P_CASH_RECEIPTS_TBL => P_CASH_RECEIPTS_TBL,
10306             X_RETURN_STATUS	=> l_return_status,
10307             X_MSG_COUNT => l_msg_count,
10308             X_MSG_DATA => l_msg_data);
10309 
10310         IF l_return_status = 'S' THEN
10311             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully applied cash receipts.');
10312         ELSE
10313             RAISE FND_API.G_EXC_ERROR;
10314         END IF;
10315 
10316     end if;
10317 
10318     if P_COMMIT = FND_API.G_TRUE then
10319         COMMIT WORK;
10320         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
10321     end if;
10322 
10323     -- END OF BODY OF API
10324     x_return_status := FND_API.G_RET_STS_SUCCESS;
10325 
10326     -- Standard call to get message count and if count is 1, get message info
10327     FND_MSG_PUB.Count_And_Get(
10328                 p_encoded => FND_API.G_FALSE,
10329                 p_count => x_msg_count,
10330                 p_data => x_msg_data);
10331 
10332     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10333 
10334 EXCEPTION
10335     WHEN FND_API.G_EXC_ERROR THEN
10336         ROLLBACK TO BILL_AND_PAY_OFFCYCLE_BILLS;
10337         x_return_status := FND_API.G_RET_STS_ERROR;
10338         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10339         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10340     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10341         ROLLBACK TO BILL_AND_PAY_OFFCYCLE_BILLS;
10342         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10343         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10344         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10345     WHEN OTHERS THEN
10346         ROLLBACK TO BILL_AND_PAY_OFFCYCLE_BILLS;
10347         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10348         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
10349             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
10350         END IF;
10351         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10352         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10353 END;
10354 
10355 
10356 /*========================================================================
10357  | PUBLIC PROCEDURE BILL_SING_LOAN_SUBMIT_APPR_FEE
10358  |
10359  | DESCRIPTION
10360  |      This procedure bills all the 'At Submit for Approval' fees for single loan
10361  |
10362  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
10363  |      None
10364  |
10365  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
10366  |      init
10367  |      LogMessage
10368  |      CREATE_OFFCYCLE_BILLS
10369  |
10370  | PARAMETERS
10371  |      P_API_VERSION		    IN          Standard in parameter
10372  |      P_INIT_MSG_LIST		    IN          Standard in parameter
10373  |      P_COMMIT		    IN          Standard in parameter
10374  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
10375  |      P_LOAN_ID		    IN          Loan ID
10376  |	X_BILLED_YN		    OUT NOCOPY  Signifies whether loan billed
10377  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
10378  |      X_MSG_COUNT		    OUT NOCOPY  Standard out parameter
10379  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
10380  |
10381  | KNOWN ISSUES
10382  |      None
10383  |
10384  | NOTES
10385  |      Any interesting aspect of the code in the package body which needs
10386  |      to be stated.
10387  |
10388  | MODIFICATION HISTORY
10389  | Date                  Author            Description of Changes
10390  | 07-JUL-2009           mbolli		Bug#6830765 -   Created
10391  |
10392  *=======================================================================*/
10393 PROCEDURE BILL_SING_LOAN_SUBMIT_APPR_FEE(
10394     P_API_VERSION		    IN          NUMBER,
10395     P_INIT_MSG_LIST		    IN          VARCHAR2,
10396     P_COMMIT			    IN          VARCHAR2,
10397     P_VALIDATION_LEVEL		    IN          NUMBER,
10398     P_LOAN_ID			    IN          NUMBER,
10399     X_BILLED_YN			    OUT NOCOPY  VARCHAR2,
10400     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
10401     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
10402     X_MSG_DATA	    		    OUT NOCOPY  VARCHAR2)
10403 IS
10404 
10405 /*-----------------------------------------------------------------------+
10406  | Local Variable Declarations and initializations                       |
10407  +-----------------------------------------------------------------------*/
10408 
10409     l_api_name                      CONSTANT VARCHAR2(30) := 'BILL_SING_LOAN_SUBMIT_APPR_FEE';
10410     l_api_version                   CONSTANT NUMBER := 1.0;
10411     l_return_status                 VARCHAR2(1);
10412     l_msg_count                     NUMBER;
10413     l_msg_data                      VARCHAR2(32767);
10414 
10415     l_installment_num               number;
10416     l_Count                         number;
10417     l_Count1                        number;
10418     l_header_count                  number;
10419     l_loan_number                   varchar2(60);
10420     l_tot_fee_amt		            NUMBER;
10421     l_loan_start_date		        DATE;
10422     l_current_phase                 varchar2(30);
10423 
10424     l_BILL_HEADERS_TBL              LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL;
10425     l_BILL_LINES_TBL                LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
10426  	l_fee_basis_tbl                 LNS_FEE_ENGINE.FEE_BASIS_TBL;
10427     l_fee_structures                LNS_FEE_ENGINE.FEE_STRUCTURE_TBL;
10428     l_fee_tbl                       LNS_FEE_ENGINE.FEE_CALC_TBL;
10429     l_loan_details                  LNS_FINANCIALS.LOAN_DETAILS_REC;
10430 
10431 
10432 /*-----------------------------------------------------------------------+
10433  | Cursor Declarations                                                   |
10434  +-----------------------------------------------------------------------*/
10435 
10436     /* querying loan number */
10437     CURSOR loan_cur(P_LOAN_ID number) IS
10438         select LOAN_NUMBER,
10439                nvl(current_phase, 'TERM'),
10440                decode(current_phase, 'OPEN', OPEN_LOAN_START_DATE, LOAN_START_DATE)
10441         from LNS_LOAN_HEADERS
10442         where LOAN_ID = P_LOAN_ID;
10443 
10444 BEGIN
10445 
10446 
10447 
10448     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10449 
10450     -- Standard start of API savepoint
10451     SAVEPOINT BILL_SING_LOAN_SUBMIT_APPR_FEE;
10452     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
10453 
10454     -- Standard call to check for call compatibility
10455     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
10456       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10457     END IF;
10458 
10459     -- Initialize message list if p_init_msg_list is set to TRUE
10460     IF FND_API.To_Boolean(p_init_msg_list) THEN
10461       FND_MSG_PUB.initialize;
10462     END IF;
10463 
10464     -- Initialize API return status to success
10465     l_return_status := FND_API.G_RET_STS_SUCCESS;
10466 
10467     -- START OF BODY OF API
10468     l_installment_num := 0;
10469 
10470     X_BILLED_YN := 'N';
10471 
10472     /* verify input parameters */
10473     if P_LOAN_ID is null then
10474         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
10475         FND_MSG_PUB.Add;
10476         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10477         RAISE FND_API.G_EXC_ERROR;
10478     end if;
10479 
10480     /* getting loan_number */
10481     open loan_cur(P_LOAN_ID);
10482     fetch loan_cur into l_loan_number, l_current_phase, l_loan_start_date;
10483     close loan_cur;
10484 
10485     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing At Submit for Approval fee at 0-th installment for loan ' || l_loan_number || '...');
10486 
10487 /*
10488     -- get UnBilled 'Submit For Approval' Fees  using getSubmitForApprFeeSchedule
10489     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_FEES_ENGINE.getSubmitForApprFeeSchedule for Unbilled fees...');
10490 
10491     LNS_FEE_ENGINE.getSubmitForApprFeeSchedule(p_init_msg_list => FND_API.G_TRUE,
10492 		    p_loan_Id => P_LOAN_ID,
10493 		    p_billed_flag => 'N',
10494 		    x_fees_tbl => l_fee_tbl,
10495 		    X_RETURN_STATUS => l_return_status,
10496 		    X_MSG_COUNT => l_msg_count,
10497 		    X_MSG_DATA => l_msg_data);
10498 
10499     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
10500     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
10501 
10502     if l_return_status <> 'S' then
10503 	    LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed in API LNS_FEES_ENGINE.getSubmitForApprFeeSchedule');
10504         RAISE FND_API.G_EXC_ERROR;
10505     end if;
10506 */
10507 
10508     logMessage(FND_LOG.LEVEL_PROCEDURE, 'Processing origination submit for approval fees...');
10509 
10510     l_loan_details  := lns_financials.getLoanDetails(p_loan_id        => P_LOAN_ID
10511                                                     ,p_based_on_terms => 'ORIGINAL'
10512                                                     ,p_phase          => l_current_phase);
10513 
10514     l_fee_structures(1).fee_category := 'EVENT';
10515     l_fee_structures(1).fee_type     := 'EVENT_ORIGINATION';
10516     l_fee_structures(1).phase        := l_loan_details.LOAN_PHASE;
10517     l_fee_structures(1).FEE_BILLING_OPTION := 'SUBMIT_FOR_APPROVAL';
10518 
10519     l_fee_basis_tbl(1).fee_basis_name   := 'TOTAL_BAL';
10520     l_fee_basis_tbl(1).fee_basis_amount := 0;
10521     l_fee_basis_tbl(2).fee_basis_name   := 'ORIG_LOAN';
10522     l_fee_basis_tbl(2).fee_basis_amount := l_loan_details.requested_amount;
10523     l_fee_basis_tbl(3).fee_basis_name   := 'TOTAL_DISB_AMT';
10524     l_fee_basis_tbl(3).fee_basis_amount := 0;
10525     l_fee_basis_tbl(4).fee_basis_name   := 'OVERDUE_PRIN';
10526     l_fee_basis_tbl(4).fee_basis_amount := 0;
10527     l_fee_basis_tbl(5).fee_basis_name   := 'OVERDUE_PRIN_INT';
10528     l_fee_basis_tbl(5).fee_basis_amount := 0;
10529     l_fee_basis_tbl(6).fee_basis_name   := 'IND_DISB_AMT';
10530     l_fee_basis_tbl(6).fee_basis_amount := 0;
10531     l_fee_basis_tbl(7).fee_basis_name   := 'TOTAL_UNDISB_AMT';
10532     l_fee_basis_tbl(7).fee_basis_amount := l_loan_details.requested_amount;
10533     l_fee_basis_tbl(8).fee_basis_name   := 'OVERDUE_INT';
10534     l_fee_basis_tbl(8).fee_basis_amount := 0;
10535     l_fee_basis_tbl(9).fee_basis_name   := 'CURR_LOAN';
10536     l_fee_basis_tbl(9).fee_basis_amount := 0;
10537 
10538     lns_fee_engine.processFees(p_init_msg_list      => FND_API.G_TRUE
10539                             ,p_commit             => FND_API.G_FALSE
10540                             ,p_loan_id            => P_LOAN_ID
10541                             ,p_installment_number => 0
10542                             ,p_fee_basis_tbl      => l_fee_basis_tbl
10543                             ,p_fee_structures     => l_fee_structures
10544                             ,x_fees_tbl           => l_fee_tbl
10545                             ,x_return_status      => l_return_Status
10546                             ,x_msg_count          => l_msg_count
10547                             ,x_msg_data           => l_msg_data);
10548 
10549     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
10550     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
10551     if l_return_status <> FND_API.G_RET_STS_SUCCESS then
10552         FND_MESSAGE.SET_NAME('LNS', 'LNS_PROCESS_FEE_ERROR');
10553         FND_MSG_PUB.ADD;
10554         RAISE FND_API.G_EXC_ERROR;
10555     end if;
10556 
10557     logMessage(FND_LOG.LEVEL_PROCEDURE, 'Calling lns_fee_engine.getFeeSchedule...');
10558     l_fee_tbl.delete;
10559     lns_fee_engine.getFeeSchedule(p_init_msg_list      => FND_API.G_TRUE
10560                                  ,p_loan_id            => P_LOAN_ID
10561                                  ,p_installment_number => 0
10562 								 ,p_disb_header_id     => null
10563                                  ,p_phase              => l_current_phase
10564                                  ,x_fees_tbl           => l_fee_tbl
10565                                  ,x_return_status      => l_return_status
10566                                  ,x_msg_count          => l_msg_count
10567                                  ,x_msg_data           => l_msg_data);
10568 
10569     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
10570     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
10571     if l_return_status <> FND_API.G_RET_STS_SUCCESS then
10572         FND_MESSAGE.SET_NAME('LNS', 'LNS_READ_FEE_ERROR');
10573         FND_MSG_PUB.ADD;
10574         RAISE FND_API.G_EXC_ERROR;
10575     end if;
10576 
10577     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Toal No. of UnBilled SubmitApproval Fees are: ' || l_fee_tbl.count);
10578 
10579     l_header_count := 101;
10580     l_BILL_HEADERS_TBL(1).HEADER_ID := l_header_count;
10581     l_BILL_HEADERS_TBL(1).LOAN_ID := P_LOAN_ID;
10582     l_BILL_HEADERS_TBL(1).ASSOC_PAYMENT_NUM := l_installment_num;
10583 
10584     -- Bug#8898777
10585     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan Start Date is: ' ||l_loan_start_date);
10586     if ( l_loan_start_date  < sysdate) then
10587     	l_BILL_HEADERS_TBL(1).DUE_DATE := l_loan_start_date;
10588     else
10589 	    l_BILL_HEADERS_TBL(1).DUE_DATE := sysdate;
10590     end if;
10591 
10592     l_Count1 := 0;
10593     l_tot_fee_amt := 0;
10594 
10595     /* adding fee amounts into lines table */
10596     FOR l_Count IN 1..l_fee_tbl.count LOOP
10597 
10598         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fee #' || l_Count || ' Name: ' || l_fee_tbl(l_Count).FEE_NAME || ' Amount: ' || l_fee_tbl(l_Count).FEE_AMOUNT);
10599 
10600         l_Count1 := l_Count1 + 1;
10601         l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
10602         l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
10603         l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_fee_tbl(l_Count).FEE_AMOUNT;
10604         l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'FEE';
10605         l_BILL_LINES_TBL(l_Count1).LINE_REF_ID := l_fee_tbl(l_Count).FEE_ID;
10606         l_BILL_LINES_TBL(l_Count1).LINE_DESC := l_fee_tbl(l_Count).FEE_NAME;
10607         l_BILL_LINES_TBL(l_Count1).FEE_SCHEDULE_ID := l_fee_tbl(l_Count).FEE_SCHEDULE_ID;
10608 	    l_tot_fee_amt := l_tot_fee_amt + l_fee_tbl(l_Count).FEE_AMOUNT;
10609 
10610         /* updating LNS_FEE_SCHEDULES with billed_flag = Y */
10611         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_FEE_SCHEDULES with billed_flag = Y ...');
10612         UPDATE LNS_FEE_SCHEDULES
10613         SET
10614             BILLED_FLAG                     =     'Y',
10615             last_update_date                =     LNS_UTILITY_PUB.LAST_UPDATE_DATE,
10616             last_updated_by                 =     LNS_UTILITY_PUB.LAST_UPDATED_BY,
10617             last_update_login               =     LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
10618         WHERE
10619             FEE_SCHEDULE_ID = l_fee_tbl(l_Count).fee_schedule_id;
10620         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_FEE_SCHEDULES');
10621 
10622     END LOOP;
10623 
10624     IF (l_tot_fee_amt = 0) THEN
10625         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'SubmitForApproval Fee Amount = 0. Nothing to bill.');
10626         return;
10627     END IF;
10628 
10629     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS...');
10630 
10631     LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS(
10632         P_API_VERSION		    => 1.0,
10633         P_INIT_MSG_LIST		    => FND_API.G_TRUE,
10634         P_COMMIT			    => FND_API.G_FALSE,
10635         P_VALIDATION_LEVEL		=> FND_API.G_VALID_LEVEL_FULL,
10636         P_BILL_HEADERS_TBL      => l_BILL_HEADERS_TBL,
10637         P_BILL_LINES_TBL        => l_BILL_LINES_TBL,
10638         x_return_status         => l_return_status,
10639         x_msg_count             => l_msg_count,
10640         x_msg_data              => l_msg_data);
10641 
10642     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
10643 
10644     if l_return_status <> 'S' then
10645         RAISE FND_API.G_EXC_ERROR;
10646     end if;
10647 
10648     if P_COMMIT = FND_API.G_TRUE then
10649         COMMIT WORK;
10650         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
10651     end if;
10652 
10653     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully billed At Submit For Approval Fee at 0-th installment for loan ' || l_loan_number);
10654 
10655     -- END OF BODY OF API
10656     x_return_status := FND_API.G_RET_STS_SUCCESS;
10657     X_BILLED_YN := 'Y';
10658 
10659     -- Standard call to get message count and if count is 1, get message info
10660     FND_MSG_PUB.Count_And_Get(
10661                 p_encoded => FND_API.G_FALSE,
10662                 p_count => x_msg_count,
10663                 p_data => x_msg_data);
10664 
10665     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10666 
10667 EXCEPTION
10668     WHEN FND_API.G_EXC_ERROR THEN
10669         ROLLBACK TO BILL_SING_LOAN_SUBMIT_APPR_FEE;
10670         x_return_status := FND_API.G_RET_STS_ERROR;
10671         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10672         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10673     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10674         ROLLBACK TO BILL_SING_LOAN_SUBMIT_APPR_FEE;
10675         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10676         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10677         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10678     WHEN OTHERS THEN
10679         ROLLBACK TO BILL_SING_LOAN_SUBMIT_APPR_FEE;
10680         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10681         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
10682             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
10683         END IF;
10684         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10685         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10686 END;
10687 
10688 PROCEDURE REVERSE_BILLED_FEES(p_amortization_id IN NUMBER)
10689 IS
10690 	l_api_name                CONSTANT VARCHAR2(30) := 'REVERSE_BILLED_FEES';
10691 	l_fee_schedule_id	LNS_FEE_SCHEDULES.fee_schedule_id%TYPE;
10692 	l_obj_ver_num		NUMBER;
10693 	l_count			NUMBER;
10694 
10695 	-- At present Reversing only SubmitForApproval Fees
10696 	CURSOR c_billed_submitAppFee(c_amortization_id  NUMBER)     IS
10697 	SELECT lines.fee_schedule_id, feeSchd.object_version_number
10698 	FROM   LNS_AMORTIZATION_SCHEDS  scheds,lns_amortization_lines lines, lns_fees_all fee, lns_fee_schedules feeSchd
10699 	WHERE  scheds.amortization_schedule_id = lines.amortization_schedule_id
10700 	AND    scheds.amortization_schedule_id = C_AMORTIZATION_ID
10701 	AND    lines.line_type = 'FEE'
10702 	AND    fee.fee_id = lines.fee_id
10703 	AND    fee.billing_option = 'SUBMIT_FOR_APPROVAL'
10704 	AND    feeSchd.fee_schedule_id = lines.fee_schedule_id
10705 	AND    feeSchd.billed_flag = 'Y'
10706 	AND    feeSchd.active_flag = 'Y';
10707 
10708 BEGIN
10709     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10710 
10711     /* verify input parameters */
10712     if P_AMORTIZATION_ID is null then
10713     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NO_AMORT');
10714 	FND_MSG_PUB.Add;
10715         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10716         RAISE FND_API.G_EXC_ERROR;
10717     end if;
10718 
10719 
10720     l_count := 0;
10721     OPEN c_billed_submitAppFee(P_AMORTIZATION_ID);
10722     LOOP
10723     FETCH c_billed_submitAppFee into l_fee_schedule_id, l_obj_ver_num;
10724     EXIT WHEN c_billed_submitAppFee%NOTFOUND;
10725 	LogMessage(FND_LOG.LEVEL_PROCEDURE, 'The fee_schedule_id is '||l_fee_schedule_id);
10726 
10727 	LNS_FEE_SCHEDULES_PKG.UPDATE_ROW(P_FEE_SCHEDULE_ID              => l_fee_schedule_id
10728                                   		,P_FEE_ID               => null
10729 						,P_LOAN_ID              => null
10730 						,P_FEE_AMOUNT           => null
10731 						,P_FEE_INSTALLMENT      => null
10732 						,P_FEE_DESCRIPTION      => null
10733 						,P_ACTIVE_FLAG          => null
10734 						,P_BILLED_FLAG          => 'N'  -- Make BilledFlag to 'N'
10735 						,P_FEE_WAIVABLE_FLAG    => null
10736 						,P_WAIVED_AMOUNT        => null
10737 						,P_LAST_UPDATED_BY      => LNS_UTILITY_PUB.LAST_UPDATED_BY
10738 						,P_LAST_UPDATE_DATE     => LNS_UTILITY_PUB.LAST_UPDATE_DATE
10739 						,P_LAST_UPDATE_LOGIN    => LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
10740 						,P_PROGRAM_ID           => null
10741 						,P_REQUEST_ID           => null
10742 						,P_OBJECT_VERSION_NUMBER => l_obj_ver_num + 1);
10743 	l_count := l_count + 1;
10744 	LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Updated fee_schedule_id '||l_fee_schedule_id||' successfully');
10745 
10746       END LOOP;
10747 
10748       LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total No. of submitForApprFee fee_schedule records updated are '||l_count);
10749     CLOSE c_billed_submitAppFee;
10750 
10751     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10752 
10753 END REVERSE_BILLED_FEES;
10754 
10755 
10756 /*========================================================================
10757  | PUBLIC FUNCTION IS_BILLING_DISABLED
10758  |
10759  | DESCRIPTION
10760  |      This function returns Y/N is loan is ready to bill or not
10761  |
10762  | PSEUDO CODE/LOGIC
10763  |
10764  | PARAMETERS
10765  |      P_LOAN_ID               IN          Loan ID
10766  |
10767  | KNOWN ISSUES
10768  |      None
10769  |
10770  | NOTES
10771  |      Any interesting aspect of the code in the package body which needs
10772  |      to be stated.
10773  |
10774  | MODIFICATION HISTORY
10775  | Date                  Author            Description of Changes
10776  | 16-Nov-2009           MBOLLI            Created for bug#9090782
10777  |
10778  *=======================================================================*/
10779 FUNCTION IS_BILLING_DISABLED(P_LOAN_ID IN NUMBER) return VARCHAR2 IS
10780 
10781 /*-----------------------------------------------------------------------+
10782  | Local Variable Declarations and initializations                       |
10783  +-----------------------------------------------------------------------*/
10784 
10785     l_api_name                      CONSTANT VARCHAR2(30) := 'IS_BILLING_DISABLED';
10786     l_return_status                 VARCHAR2(1);
10787     l_msg_count                     NUMBER;
10788     l_msg_data                      VARCHAR2(32767);
10789     l_return                            BOOLEAN;
10790     l_disable_bill_flag              VARCHAR2(1);
10791 
10792 /*-----------------------------------------------------------------------+
10793  | Cursor Declarations                                                   								 |
10794  +-----------------------------------------------------------------------*/
10795 
10796     CURSOR cur_disable_bill(C_LOAN_ID NUMBER) IS
10797         SELECT head.DISABLE_BILLING_FLAG
10798         FROM   LNS_LOAN_HEADERS_ALL head
10799 	where head.loan_id = C_LOAN_ID;
10800 BEGIN
10801 
10802     --LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10803 
10804     -- START OF BODY OF API
10805     --init;
10806 
10807     --LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
10808     --l_disable_bill_flag := 'N';
10809 
10810     /* verify input parameters */
10811     if P_LOAN_ID is null then
10812 
10813     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
10814 		FND_MSG_PUB.Add;
10815        -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10816         RAISE FND_API.G_EXC_ERROR;
10817 
10818     end if;
10819 
10820    -- LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting loan details...');
10821     open cur_disable_bill(P_LOAN_ID);
10822     fetch cur_disable_bill into  l_disable_bill_flag;
10823     if l_disable_bill_flag IS NULL then
10824         l_disable_bill_flag := 'N';
10825     end if;
10826     close cur_disable_bill;
10827 
10828     --LogMessage(FND_LOG.LEVEL_STATEMENT, 'DISABLE_FLAG = ' || l_disable_bill_flag);
10829 
10830    -- LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10831 
10832     return l_disable_bill_flag;
10833 
10834 EXCEPTION
10835     WHEN OTHERS THEN
10836        -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'In exception of ' || l_api_name);
10837        l_disable_bill_flag := NULL;
10838         return l_disable_bill_flag;
10839 END;
10840 
10841 
10842 
10843 /*========================================================================
10844  | PUBLIC PROCEDURE ADJUST_ADD_RECEIVABLE
10845  |
10846  | DESCRIPTION
10847  |      This procedure adjusts loans additional receivable in AR
10848  |
10849  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
10850  |      None
10851  |
10852  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
10853  |      init
10854  |      LogMessage
10855  |
10856  | PARAMETERS
10857  |      P_API_VERSION		    IN          Standard in parameter
10858  |      P_INIT_MSG_LIST		    IN          Standard in parameter
10859  |      P_COMMIT			    IN          Standard in parameter
10860  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
10861  |      P_LOAN_LINE_ID          IN          Loan Line ID
10862  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
10863  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
10864  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
10865  |
10866  | KNOWN ISSUES
10867  |      None
10868  |
10869  | NOTES
10870  |      Any interesting aspect of the code in the package body which needs
10871  |      to be stated.
10872  |
10873  | MODIFICATION HISTORY
10874  | Date                  Author            Description of Changes
10875  | 03-05-2010            scherkas          Created
10876  |
10877  *=======================================================================*/
10878 PROCEDURE ADJUST_ADD_RECEIVABLE(
10879     P_API_VERSION		    IN          NUMBER,
10880     P_INIT_MSG_LIST		    IN          VARCHAR2,
10881     P_COMMIT			    IN          VARCHAR2,
10882     P_VALIDATION_LEVEL	    IN          NUMBER,
10883     P_LOAN_LINE_ID          IN          NUMBER,
10884     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
10885     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
10886     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
10887 IS
10888 
10889 /*-----------------------------------------------------------------------+
10890  | Local Variable Declarations and initializations                       |
10891  +-----------------------------------------------------------------------*/
10892 
10893     l_api_name                      CONSTANT VARCHAR2(30) := 'ADJUST_ADD_RECEIVABLE';
10894     l_api_version                   CONSTANT NUMBER := 1.0;
10895     l_return_status                 VARCHAR2(1);
10896     l_msg_count                     NUMBER;
10897     l_msg_data                      VARCHAR2(32767);
10898     l_loan_number                   varchar2(60);
10899     l_trx_number                    varchar2(20);
10900     l_payment_schedule_id           number;
10901     l_amount_due_remaining          number;
10902     l_type                          varchar2(15);
10903     l_loan_desc                     varchar2(250);
10904     l_comments                      varchar2(2000);
10905     l_adj_number                    varchar2(20);
10906     l_adj_id                        number;
10907     l_ussgl_flag                    varchar2(3);
10908     l_requested_amount              number;
10909     l_line_id                       number;
10910     l_apply_date                    date;
10911     l_gl_date                       date;
10912     l_org_id                        number;
10913 	l_legal_entity_id               number;
10914     l_installment_number            number;
10915     l_loan_id                       number;
10916 
10917 /*-----------------------------------------------------------------------+
10918  | Cursor Declarations                                                   |
10919  +-----------------------------------------------------------------------*/
10920 
10921     /* querying trx, psa and loan details */
10922     CURSOR add_rec_cur(P_LOAN_LINE_ID number) IS
10923         select
10924             loan.loan_id,
10925 	        loan.loan_number,
10926             loan.LOAN_DESCRIPTION,
10927             lines.REQUESTED_AMOUNT,
10928             lines.reference_number,
10929             lines.REC_ADJUSTMENT_NUMBER,
10930             nvl(lines.payment_schedule_id, psa.payment_schedule_id),
10931             psa.AMOUNT_DUE_REMAINING,
10932             lines.LOAN_LINE_ID,
10933             lines.ADJUSTMENT_DATE,
10934             psa.GL_DATE,
10935             trx.org_id,
10936     		trx.legal_entity_id,
10937             lines.REC_ADJUSTMENT_ID,
10938             nvl(lines.installment_number, 1)
10939         from LNS_LOAN_HEADERS_VL loan,
10940             RA_CUSTOMER_TRX trx,
10941             ar_payment_schedules psa,
10942             lns_loan_lines lines
10943         where lines.LOAN_LINE_ID = P_LOAN_LINE_ID and
10944         	loan.loan_id = lines.loan_id and
10945             lines.reference_type = 'RECEIVABLE' and
10946             lines.REFERENCE_ID = trx.CUSTOMER_TRX_ID and
10947             lines.REFERENCE_NUMBER = trx.trx_number and
10948             lines.end_date is null and
10949             trx.CUSTOMER_TRX_ID = psa.CUSTOMER_TRX_ID and
10950             nvl(lines.installment_number, 1) = psa.terms_sequence_number;
10951 
10952 BEGIN
10953 
10954     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10955 
10956     -- Standard start of API savepoint
10957     SAVEPOINT ADJUST_ADD_RECEIVABLE;
10958     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
10959 
10960     -- Standard call to check for call compatibility
10961     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
10962       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10963     END IF;
10964 
10965     -- Initialize message list if p_init_msg_list is set to TRUE
10966     IF FND_API.To_Boolean(p_init_msg_list) THEN
10967       FND_MSG_PUB.initialize;
10968     END IF;
10969 
10970     -- Initialize API return status to success
10971     l_return_status := FND_API.G_RET_STS_SUCCESS;
10972 
10973     -- START OF BODY OF API
10974 
10975     init;
10976 
10977     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input P_LOAN_LINE_ID = ' || P_LOAN_LINE_ID);
10978 
10979     /* verify input parameters */
10980     if P_LOAN_LINE_ID is null then
10981 
10982         FND_MESSAGE.SET_NAME( 'LNS', 'LNS_API_MISSING_COLUMN' );
10983         FND_MESSAGE.SET_TOKEN( 'COLUMN', 'P_LOAN_LINE_ID' );
10984         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10985         RAISE FND_API.G_EXC_ERROR;
10986 
10987     end if;
10988 
10989     /* checking for system options values required for adjustment */
10990     if g_receivables_trx_id is null then
10991 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Receivables activity name is not set in the system option.');
10992     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_REC_TRX_IN_SYS_OPT');
10993 		FND_MSG_PUB.Add;
10994         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10995         RAISE FND_API.G_EXC_ERROR;
10996 
10997     end if;
10998 
10999     /* querying trx, psa, loan and loan lines details */
11000     open add_rec_cur(P_LOAN_LINE_ID);
11001     fetch add_rec_cur into
11002         l_loan_id,
11003         l_loan_number,
11004         l_loan_desc,
11005         l_requested_amount,
11006         l_trx_number,
11007         l_adj_number,
11008         l_payment_schedule_id,
11009         l_amount_due_remaining,
11010         l_line_id,
11011         l_apply_date,
11012         l_gl_date,
11013         l_org_id,
11014         l_legal_entity_id,
11015         l_adj_id,
11016         l_installment_number;
11017     close add_rec_cur;
11018 
11019     if l_payment_schedule_id is null then
11020     	FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_FIND_ORIG_REC');
11021 		FND_MSG_PUB.Add;
11022         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
11023         RAISE FND_API.G_EXC_ERROR;
11024     end if;
11025 
11026     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjusting additional receivable ' || l_trx_number || 'for loan ' ||  l_loan_number || '...');
11027 
11028     /* verify adjust amount and set adjustment type */
11029     if l_requested_amount > l_amount_due_remaining then
11030 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Adjust amount cannot be greater than receivable remaining amount.');
11031         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
11032         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount: ' || l_amount_due_remaining);
11033         FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_ADJ_AMT');
11034         FND_MSG_PUB.Add;
11035         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
11036         RAISE FND_API.G_EXC_ERROR;
11037     else
11038         l_type := 'LINE';
11039     end if;
11040 
11041     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount = -' || l_requested_amount);
11042     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount = ' || l_amount_due_remaining);
11043 
11044     /* checking if adjustment for this loan already was made */
11045     if l_adj_number is not null or l_adj_id is not null then
11046 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Attempt to duplicate adjustment. Receivable has been already adjusted for this loan by adjustment xxx' );
11047         FND_MESSAGE.SET_NAME('LNS', 'LNS_DUPL_ADJ_ORIG_REC');
11048         FND_MESSAGE.SET_TOKEN('ADJ', l_adj_number);
11049         FND_MSG_PUB.Add;
11050         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
11051         RAISE FND_API.G_EXC_ERROR;
11052     end if;
11053 
11054     /* buld comments */
11055     l_comments := 'Loan ' || l_loan_number;
11056 
11057     /* do adjustment */
11058     CREATE_AR_ADJ(P_TYPE => l_type,
11059         P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id,
11060         P_RECEIVABLES_TRX_ID => g_receivables_trx_id,
11061         P_AMOUNT => -l_requested_amount,
11062         P_APPLY_DATE => l_apply_date,
11063         P_GL_DATE => l_apply_date,
11064         P_CUSTOMER_TRX_LINE_ID => null,
11065         P_CODE_COMBINATION_ID => null,
11066         P_USSGL_TRX_CODE => g_USSGL_TRANSACTION_CODE,
11067         P_REASON_CODE => 'LOAN_CONV',
11068         P_COMMENTS => l_comments,
11069         X_ADJ_ID => l_adj_id,
11070         X_ADJ_NUMBER => l_adj_number,
11071         P_ORG_ID => l_org_id);
11072 
11073     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_LOAN_LINES...');
11074     LNS_LOAN_LINE_PUB.UPDATE_LINE_ADJUSTMENT_NUMBER(
11075         p_init_msg_list             => FND_API.G_FALSE
11076         ,p_loan_id                  => l_loan_id
11077         ,p_loan_line_id             => l_line_id
11078         ,p_rec_adjustment_number    => l_adj_number
11079         ,p_rec_adjustment_id        => l_adj_id
11080         ,P_PAYMENT_SCHEDULE_ID      => l_payment_schedule_id
11081         ,P_INSTALLMENT_NUMBER       => l_installment_number
11082         ,p_adjustment_date          => l_apply_date
11083         ,p_original_flag            => 'N'
11084         ,x_return_status            => l_return_status
11085         ,x_msg_count                => l_msg_count
11086         ,x_msg_data                 => l_msg_data);
11087 
11088     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
11089     IF l_return_status = 'S' THEN
11090         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully updated LNS_LOAN_LINES');
11091     ELSE
11092         RAISE FND_API.G_EXC_ERROR;
11093     END IF;
11094     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created adjustment ' || l_adj_number || ' for additional receivable ' || l_trx_number);
11095 
11096     if P_COMMIT = FND_API.G_TRUE then
11097         COMMIT WORK;
11098         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
11099     end if;
11100 
11101     -- END OF BODY OF API
11102     x_return_status := FND_API.G_RET_STS_SUCCESS;
11103 
11104     -- Standard call to get message count and if count is 1, get message info
11105     FND_MSG_PUB.Count_And_Get(
11106                 p_encoded => FND_API.G_FALSE,
11107                 p_count => x_msg_count,
11108                 p_data => x_msg_data);
11109 
11110     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
11111 
11112 EXCEPTION
11113     WHEN FND_API.G_EXC_ERROR THEN
11114         ROLLBACK TO ADJUST_ADD_RECEIVABLE;
11115         x_return_status := FND_API.G_RET_STS_ERROR;
11116         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
11117         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
11118     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
11119         ROLLBACK TO ADJUST_ADD_RECEIVABLE;
11120         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11121         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
11122         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
11123     WHEN OTHERS THEN
11124         ROLLBACK TO ADJUST_ADD_RECEIVABLE;
11125         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11126         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
11127             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
11128         END IF;
11129         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
11130         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
11131 END;
11132 
11133 
11134 
11135 BEGIN
11136     G_LOG_ENABLED := 'N';
11137     G_MSG_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
11138 
11139     /* getting msg logging info */
11140     G_LOG_ENABLED := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'), 'N');
11141     /*
11142     if (G_LOG_ENABLED = 'N') then
11143        G_MSG_LEVEL := FND_LOG.LEVEL_UNEXPECTED;
11144     else
11145        G_MSG_LEVEL := NVL(to_number(FND_PROFILE.VALUE('AFLOG_LEVEL')), FND_LOG.LEVEL_UNEXPECTED);
11146     end if;
11147     */
11148     LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_LOG_ENABLED: ' || G_LOG_ENABLED);
11149     LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_MSG_LEVEL: ' || G_MSG_LEVEL);
11150 
11151 END;
11152