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.33.12010000.7 2009/01/21 20:26:00 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 
27 
28 PROCEDURE FORGIVENESS_ADJUSTMENT(
29     P_API_VERSION		    IN          NUMBER,
30     P_INIT_MSG_LIST		    IN          VARCHAR2,
31     P_COMMIT			    IN          VARCHAR2,
32     P_VALIDATION_LEVEL	    IN          NUMBER,
33     P_LOAN_ID               IN          NUMBER,
34     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
35     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
36     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2);
37 
38 
39 /*========================================================================
40  | PRIVATE PROCEDURE LogMessage
41  |
42  | DESCRIPTION
43  |      This procedure logs debug messages to db and to CM log
44  |
45  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
46  |      init
47  |      CREATE_AR_INVOICES
48  |      CREATE_AR_CM
49  |      APPLY_RECEIPT
50  |      BILL_SINGLE_LOAN
51  |      CALC_SINGLE_LOAN_NEXT_DD
52  |      LNS_BILLING_CONCUR
53  |      LNS_RVRS_PMT_CONCUR
54  |      BILL_LOANS
55  |      CALC_PAST_DUE_LOANS_NEXT_DD
56  |      REVERSE_LAST_AMORTIZATION
57  |      CREATE_SINGLE_OFFCYCLE_BILL
58  |      CREATE_OFFCYCLE_BILLS
59  |      REVERSE_OFFCYCLE_BILL
60  |
61  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
62  |      None
63  |
64  | PARAMETERS
65  |      p_msg_level     IN      Debug msg level
66  |      p_msg           IN      Debug msg itself
67  |
68  | KNOWN ISSUES
69  |      None
70  |
71  | NOTES
72  |      Any interesting aspect of the code in the package body which needs
73  |      to be stated.
74  |
75  | MODIFICATION HISTORY
76  | Date                  Author            Description of Changes
77  | 01-01-2004            scherkas          Created
78  |
79  *=======================================================================*/
80 Procedure LogMessage(p_msg_level IN NUMBER, p_msg in varchar2)
81 IS
82 BEGIN
83     if (p_msg_level >= G_MSG_LEVEL) then
84         FND_LOG.STRING(p_msg_level, G_PKG_NAME, p_msg);
85     end if;
86 
87     if FND_GLOBAL.Conc_Request_Id is not null then
88         fnd_file.put_line(FND_FILE.LOG, p_msg);
89     end if;
90 
91 EXCEPTION
92     WHEN OTHERS THEN
93         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: ' || sqlerrm);
94 END;
95 
96 
97 
98 /*========================================================================
99  | PRIVATE PROCEDURE init
100  |
101  | DESCRIPTION
102  |      This procedure inits data needed for processing
103  |
104  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
105  |      LNS_BILLING_CONCUR
106  |      LNS_RVRS_PMT_CONCUR
107  |      BILL_LOANS
108  |      CALC_PAST_DUE_LOANS_NEXT_DD
109  |      REVERSE_LAST_AMORTIZATION
110  |      CREATE_SINGLE_OFFCYCLE_BILL
111  |      REVERSE_OFFCYCLE_BILL
112  |
113  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
114  |      LogMessage
115  |
116  | PARAMETERS
117  |      None
118  |
119  | KNOWN ISSUES
120  |      None
121  |
122  | NOTES
123  |      Any interesting aspect of the code in the package body which needs
124  |      to be stated.
125  |
126  | MODIFICATION HISTORY
127  | Date                  Author            Description of Changes
128  | 01-01-2004            scherkas          Created
129  |
130  *=======================================================================*/
131 Procedure init
132 IS
133     l_api_name                      CONSTANT VARCHAR2(30) := 'INIT';
134     l_org_status                    varchar2(1);
135 BEGIN
136 
137     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
138     --fnd_global.apps_initialize(FND_GLOBAL.USER_ID, FND_GLOBAL.RESP_ID, FND_GLOBAL.RESP_APPL_ID, FND_GLOBAL.SECURITY_GROUP_ID);
139 
140     /* getting msg logging info */
141     G_LOG_ENABLED := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'), 'N');
142     G_MSG_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
143     /*
144     if (G_LOG_ENABLED = 'N') then
145        G_MSG_LEVEL := FND_LOG.LEVEL_UNEXPECTED;
146     else
147        G_MSG_LEVEL := NVL(to_number(FND_PROFILE.VALUE('AFLOG_LEVEL')), FND_LOG.LEVEL_UNEXPECTED);
148     end if;
149     */
150 
151     LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_LOG_ENABLED: ' || G_LOG_ENABLED);
152     LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_MSG_LEVEL: ' || G_MSG_LEVEL);
153 
154     /* getting org_id */
155 --    g_org_id := to_number(fnd_profile.value('ORG_ID'));
156     g_org_id := MO_GLOBAL.GET_CURRENT_ORG_ID();
157     LogMessage(FND_LOG.LEVEL_STATEMENT, 'g_org_id: ' || g_org_id);
158     l_org_status := MO_GLOBAL.check_valid_org(g_org_id);
159     LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.check_valid_org(' || g_org_id || '): ' || l_org_status);
160 
161     /* checking for number of system options record for giving org_id */
162     select count(1) into g_sys_opt_num from LNS_SYSTEM_OPTIONS where ORG_ID = g_org_id;
163 
164     if g_sys_opt_num = 0 then
165 
166 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No system options found for the org ' || g_org_id);
167         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_SYSTEM_OPTIONS');
168 		FND_MESSAGE.SET_TOKEN('ORG', g_org_id);
169 		FND_MSG_PUB.Add;
170         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
171         RAISE FND_API.G_EXC_ERROR;
172 
173     elsif g_sys_opt_num > 1 then
174 
175 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Found more then 1 system options records for the org ' || g_org_id);
176     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MANY_SYSTEM_OPTIONS');
177 		FND_MESSAGE.SET_TOKEN('ORG', g_org_id);
178 		FND_MSG_PUB.Add;
179         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
180         RAISE FND_API.G_EXC_ERROR;
181 
182     end if;
183 
184     /* getting system options */
185     select BATCH_SOURCE_ID,
186         DAYS_TOBILL_BEFORE_DUE_DATE,
187         TRX_TYPE_ID,
188         DAYS_TOGL_AFTER_DUE_DATE,
189         COMBINE_INT_PRIN_FLAG,
190         INTEREST_TRX_TYPE_ID,
191         FEE_TRX_TYPE_ID,
192         RECEIVABLES_TRX_ID,
193         ADJUST_USSGL_TRX_CODE,
194         FORGIVENESS_REC_TRX_ID
195      into g_batch_source_id,
196         g_days_to_bill_before_dd,
197         g_trx_type_id,
198         g_day_togl_after_dd,
199         g_multiple_lines,
200         g_int_trx_type_id,
201         g_fee_trx_type_id,
202         g_receivables_trx_id,
203         g_USSGL_TRANSACTION_CODE,
204         g_forgiveness_rec_trx_id
205      FROM LNS_SYSTEM_OPTIONS
206     WHERE ORG_ID = g_org_id;
207 
208     LogMessage(FND_LOG.LEVEL_STATEMENT, 'System options:');
209     LogMessage(FND_LOG.LEVEL_STATEMENT, 'batch_source_id: ' || g_batch_source_id);
210     LogMessage(FND_LOG.LEVEL_STATEMENT, 'days_to_bill_before_dd: ' || g_days_to_bill_before_dd);
211     LogMessage(FND_LOG.LEVEL_STATEMENT, 'trx_type_id: ' || g_trx_type_id);
212     LogMessage(FND_LOG.LEVEL_STATEMENT, 'day_togl_after_dd: ' || g_day_togl_after_dd);
213     LogMessage(FND_LOG.LEVEL_STATEMENT, 'multiple_lines: ' || g_multiple_lines);
214     LogMessage(FND_LOG.LEVEL_STATEMENT, 'int_trx_type_id: ' || g_int_trx_type_id);
215     LogMessage(FND_LOG.LEVEL_STATEMENT, 'fee_trx_type_id: ' || g_fee_trx_type_id);
216     LogMessage(FND_LOG.LEVEL_STATEMENT, 'receivables_trx_id: ' || g_receivables_trx_id);
217     LogMessage(FND_LOG.LEVEL_STATEMENT, 'USSGL_TRANSACTION_CODE: ' || g_USSGL_TRANSACTION_CODE);
218     LogMessage(FND_LOG.LEVEL_STATEMENT, 'g_forgiveness_rec_trx_id: ' || g_forgiveness_rec_trx_id);
219 
220     if g_batch_source_id is null then
221 
222 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Batch Source is not set in the system option.');
223     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_BATCH_IN_SYS_OPT');
224 		FND_MSG_PUB.Add;
225         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
226         RAISE FND_API.G_EXC_ERROR;
227 
228     end if;
229 
230     if g_trx_type_id is null then
231 
232 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Default Transaction Type is not set in the system option.');
233     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_TYPE_IN_SYS_OPT');
234 		FND_MSG_PUB.Add;
235         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
236         RAISE FND_API.G_EXC_ERROR;
237 
238     end if;
239 
240     if g_multiple_lines is null then
241 
242 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Combination Invoice is not set in the system option.');
243     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INV_COMB_IN_SYS_OPT');
244 		FND_MSG_PUB.Add;
245         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
246         RAISE FND_API.G_EXC_ERROR;
247 
248     end if;
249 
250     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
251 
252 END;
253 
254 
255 
256 FUNCTION GET_BILLING_DATE(P_DAYS IN NUMBER) RETURN VARCHAR2 IS
257     l_return    varchar2(20);
258 BEGIN
259 
260     if P_DAYS is not null then
261         l_return := ' ( ' || (sysdate + P_DAYS) || ' )';
262     end if;
263 
264     return l_return;
265 END;
266 
267 
268 
269 /*========================================================================
270  | PRIVATE PROCEDURE STORE_LAST_PAYMENT_NUMBER
271  |
272  | DESCRIPTION
273  |      This procedure stores last payment number and last amortization id in lns_loan_headers_all
274  |
275  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
276  |
277  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
278  |      LogMessage
279  |
280  | PARAMETERS
281  |      P_LOAN_ID       IN      Loan ID
282  |
283  | KNOWN ISSUES
284  |      None
285  |
286  | NOTES
287  |      Any interesting aspect of the code in the package body which needs
288  |      to be stated.
289  |
290  | MODIFICATION HISTORY
291  | Date                  Author            Description of Changes
292  | 02-11-2005            scherkas          Created
293  |
294  *=======================================================================*/
295 Procedure STORE_LAST_PAYMENT_NUMBER(P_LOAN_ID IN NUMBER)
296 IS
297 
298 /*-----------------------------------------------------------------------+
299  | Local Variable Declarations and initializations                       |
300  +-----------------------------------------------------------------------*/
301 
302     l_api_name                      CONSTANT VARCHAR2(30) := 'STORE_LAST_PAYMENT_NUMBER';
303     l_api_version                   CONSTANT NUMBER := 1.0;
304     l_return_status                 VARCHAR2(1);
305     l_msg_count                     NUMBER;
306     l_msg_data                      VARCHAR2(32767);
307     l_version_number                number;
308     l_loan_id                       number;
309     l_Count                         number;
310     l_loan_number                   varchar2(60);
311     l_last_payment_number           number;
312     l_amortization_id               number;
313     l_old_last_payment_number       number;
314     l_old_amortization_id           number;
315     l_current_phase                 varchar2(30);
316 
317     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
318 
319 /*-----------------------------------------------------------------------+
320  | Cursor Declarations                                                   |
321  +-----------------------------------------------------------------------*/
322     CURSOR loan_ver_cur(P_LOAN_ID NUMBER) IS
323         select
324         head.OBJECT_VERSION_NUMBER,
325         head.loan_id,
326         head.loan_number,
327         head.LAST_PAYMENT_NUMBER,
328         head.LAST_AMORTIZATION_ID,
329         nvl(head.CURRENT_PHASE, 'TERM')
330         from
331         LNS_LOAN_HEADERS head
332         where
333         head.loan_id = P_LOAN_ID;
334 
335     CURSOR pay_number_cur(P_LOAN_ID NUMBER, P_PHASE VARCHAR2) IS
336         select max(PAYMENT_NUMBER)
337         from LNS_AMORTIZATION_SCHEDS
338         where LOAN_ID = P_LOAN_ID
339         and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
340         and REAMORTIZATION_AMOUNT is null
341         and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM');
342 
343     CURSOR amortization_cur(P_LOAN_ID NUMBER, P_PHASE VARCHAR2) IS
344         select max(AMORTIZATION_SCHEDULE_ID)
345         from LNS_AMORTIZATION_SCHEDS
346         where LOAN_ID = P_LOAN_ID
347         and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
348         and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM')
349         and PAYMENT_NUMBER =
350             nvl((select max(PAYMENT_NUMBER)
351             from LNS_AMORTIZATION_SCHEDS
352             where LOAN_ID = P_LOAN_ID
353             and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
354             and REAMORTIZATION_AMOUNT is null
355             and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM')), 0);
356 BEGIN
357 
358     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
359 
360     open loan_ver_cur(P_LOAN_ID);
361     fetch loan_ver_cur into
362         l_version_number,
363         l_loan_id,
364         l_loan_number,
365         l_old_last_payment_number,
366         l_old_amortization_id,
367         l_current_phase;
368     close loan_ver_cur;
369 
370     open pay_number_cur(P_LOAN_ID, l_current_phase);
371     fetch pay_number_cur into l_last_payment_number;
372     close pay_number_cur;
373 
374     open amortization_cur(P_LOAN_ID, l_current_phase);
375     fetch amortization_cur into l_amortization_id;
376     close amortization_cur;
377 
378     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Old LAST_PAYMENT_NUMBER: ' || l_old_last_payment_number);
379     LogMessage(FND_LOG.LEVEL_STATEMENT, 'New LAST_PAYMENT_NUMBER: ' || l_last_payment_number);
380     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Old LAST_AMORTIZATION_ID: ' || l_old_amortization_id);
381     LogMessage(FND_LOG.LEVEL_STATEMENT, 'New LAST_AMORTIZATION_ID: ' || l_amortization_id);
382 
383     /* updating loan header table */
384     l_loan_header_rec.loan_id := l_loan_id;
385 
386     if l_last_payment_number is null then
387         l_loan_header_rec.LAST_PAYMENT_NUMBER := FND_API.G_MISS_NUM;
388     else
389         l_loan_header_rec.LAST_PAYMENT_NUMBER := l_last_payment_number;
390     end if;
391 
392     if l_amortization_id is null then
393         l_loan_header_rec.LAST_AMORTIZATION_ID := FND_API.G_MISS_NUM;
394     else
395         l_loan_header_rec.LAST_AMORTIZATION_ID := l_amortization_id;
396     end if;
397 
398     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header...');
399 
400     LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
401                                     P_LOAN_HEADER_REC => l_loan_header_rec,
402                                     P_INIT_MSG_LIST => FND_API.G_FALSE,
403                                     X_RETURN_STATUS => l_return_status,
404                                     X_MSG_COUNT => l_msg_count,
405                                     X_MSG_DATA => l_msg_data);
406 
407     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
408 
409     IF l_return_status = 'S' THEN
410         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
411     ELSE
412         FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
413         FND_MSG_PUB.Add;
414         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
415         RAISE FND_API.G_EXC_ERROR;
416     END IF;
417 
418     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
419 
420 END;
421 
422 
423 
424 /*========================================================================
425  | PUBLIC PROCEDURE PROCESS_PAID_LOANS
426  |
427  | DESCRIPTION
428  |      This procedure sets still active paid off loans to status PAIDOFF
429  |
430  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
431  |      None
432  |
433  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
434  |      LogMessage
435  |
436  | PARAMETERS
437  |      P_API_VERSION		IN          Standard in parameter
438  |      P_INIT_MSG_LIST		IN          Standard in parameter
439  |      P_COMMIT			IN          Standard in parameter
440  |      P_VALIDATION_LEVEL	IN          Standard in parameter
441  |      P_LOAN_ID           IN          Loan
442  |      P_PAYOFF_DATE       IN          Pay off date
443  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
444  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
445  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
446 
447  | KNOWN ISSUES
448  |      None
449  |
450  | NOTES
451  |      Any interesting aspect of the code in the package body which needs
452  |      to be stated.
453  |
454  | MODIFICATION HISTORY
455  | Date                  Author            Description of Changes
456  | 01-01-2004            scherkas          Created
457  |
458  *=======================================================================*/
459 PROCEDURE PROCESS_PAID_LOANS(
460     P_API_VERSION            IN          NUMBER,
461     P_INIT_MSG_LIST          IN          VARCHAR2,
462     P_COMMIT                 IN          VARCHAR2,
463     P_VALIDATION_LEVEL       IN          NUMBER,
464     P_LOAN_ID                IN          NUMBER,
465     P_PAYOFF_DATE            IN          DATE,
466     X_RETURN_STATUS          OUT NOCOPY  VARCHAR2,
467     X_MSG_COUNT              OUT NOCOPY  NUMBER,
468     X_MSG_DATA               OUT NOCOPY  VARCHAR2)
469 IS
470 
471 /*-----------------------------------------------------------------------+
472  | Local Variable Declarations and initializations                       |
473  +-----------------------------------------------------------------------*/
474 
475     l_api_name                      CONSTANT VARCHAR2(30) := 'PROCESS_PAID_LOANS';
476     l_api_version                   CONSTANT NUMBER := 1.0;
477     l_return_status                 VARCHAR2(1);
478     l_msg_count                     NUMBER;
479     l_msg_data                      VARCHAR2(32767);
480     l_version_number                number;
481     l_loan_id                       number;
482     l_Count                         number;
483     l_loan_number                   varchar2(60);
484     l_remaining_amount              number;
485     l_end                           date;
486     l_start                         date;
487 
488     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
489 
490 /*-----------------------------------------------------------------------+
491  | Cursor Declarations                                                   |
492  +-----------------------------------------------------------------------*/
493 
494     /* query paid off loans that are still active */
495     CURSOR paidoff_loans_cur(P_LOAN_ID number) IS
496         select
497         head.OBJECT_VERSION_NUMBER,
498         head.loan_id,
499         head.loan_number
500         from
501         LNS_PAY_SUM_V sum,
502         LNS_LOAN_HEADERS head
503         where
504         head.loan_id = nvl(P_LOAN_ID, head.loan_id) and
505         head.loan_id = sum.loan_id and
506 	--karamach --Bug5295446
507         --head.loan_status = 'ACTIVE' and
508         head.loan_status NOT IN ('INCOMPLETE','DELETED','REJECTED','PENDING','APPROVED','PAIDOFF') and
509         head.last_payment_number is not null and
510         head.last_amortization_id is not null and
511         sum.total_principal_balance <= 0;
512 
513     CURSOR validate_loan_cur(P_LOAN_ID number) IS
514         select nvl(sum(total_remaining_amount),0)
515         from LNS_AM_SCHEDS_V
516         where loan_id = P_LOAN_ID and
517               reversed_code = 'N';
518 
519 BEGIN
520 
521     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
522     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing paid off loans...');
523     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input parameters:');
524     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ID: ' || P_LOAN_ID);
525     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Payoff date: ' || P_PAYOFF_DATE);
526     -- Standard Start of API savepoint
527     SAVEPOINT PROCESS_PAID_LOANS;
528 
529     -- Initialize message list IF p_init_msg_list is set to TRUE.
530     IF FND_API.to_Boolean(p_init_msg_list) THEN
531         FND_MSG_PUB.initialize;
532     END IF;
533 
534     -- Initialize API return status to SUCCESS
535     x_return_status := FND_API.G_RET_STS_SUCCESS;
536 
537     --
538     -- Api body
539     -- ----------------------------------------------------------------
540 
541     /* init variables */
542     l_Count := 0;
543 
544     l_start := sysdate;
545     open paidoff_loans_cur(P_LOAN_ID);
546 
547     LOOP
548 
549         fetch paidoff_loans_cur into
550             l_version_number,
551             l_loan_id,
552             l_loan_number;
553         exit when paidoff_loans_cur%NOTFOUND;
554 
555         l_Count := l_Count + 1;
556         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Processing loan ' || l_loan_number || ' id ' || l_loan_id);
557 
558         BEGIN
559 
560             open validate_loan_cur(l_loan_id);
561             fetch validate_loan_cur into l_remaining_amount;
562             close validate_loan_cur;
563 
564             if l_remaining_amount = 0  then
565 
566                 LNS_FUNDING_PUB.VALIDATE_DISB_FOR_PAYOFF(
567                     P_API_VERSION		    => 1.0,
568                     P_INIT_MSG_LIST		    => FND_API.G_TRUE,
569                     P_COMMIT			    => FND_API.G_FALSE,
570                     P_VALIDATION_LEVEL	    => FND_API.G_VALID_LEVEL_FULL,
571                     P_LOAN_ID               => l_loan_id,
572                     X_RETURN_STATUS		    => l_return_status,
573                     X_MSG_COUNT			    => l_msg_count,
574                     X_MSG_DATA	    	    => l_msg_data);
575 
576                 IF l_return_status <> 'S' THEN
577                     RAISE FND_API.G_EXC_ERROR;
578                 END IF;
579 
580                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_fee_assignments...');
581                 update lns_fee_assignments
582                 set end_date_active = P_PAYOFF_DATE
583                 where loan_id = l_loan_id
584                 and (end_date_active is null OR end_date_active > P_PAYOFF_DATE);
585                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'lns_fee_assignments is updated');
586 
587                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_fee_schedules...');
588                 update lns_fee_schedules
589                 set billed_flag = 'Y'
590                 where loan_id = l_loan_id
591                 and active_flag = 'Y'
592                 and billed_flag = 'N'
593                 and object_version_number = object_version_number + 1;
594                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'lns_fee_schedules is updated');
595 
596                 /* updating loan header table */
597                 l_loan_header_rec.loan_id := l_loan_id;
598                 l_loan_header_rec.LOAN_STATUS := 'PAIDOFF';
599                 l_loan_header_rec.SECONDARY_STATUS := FND_API.G_MISS_CHAR;
600 
601                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
602                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_STATUS: ' || l_loan_header_rec.LOAN_STATUS);
603                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Secondary status: ' || l_loan_header_rec.SECONDARY_STATUS);
604 
605                 LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
606                                                 P_LOAN_HEADER_REC => l_loan_header_rec,
607                                                 P_INIT_MSG_LIST => FND_API.G_FALSE,
608                                                 X_RETURN_STATUS => l_return_status,
609                                                 X_MSG_COUNT => l_msg_count,
610                                                 X_MSG_DATA => l_msg_data);
611 
612                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
613 
614                 IF l_return_status = 'S' THEN
615                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
616                 ELSE
617                     FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
618                     FND_MSG_PUB.Add;
619                     LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
620                     RAISE FND_API.G_EXC_ERROR;
621                 END IF;
622 
623                 if P_COMMIT = FND_API.G_TRUE then
624                     COMMIT WORK;
625                     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
626                 end if;
627 
628                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully paid off loan ' || l_loan_number || ' id ' || l_loan_id);
629 
630             else
631 
632                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Cannot pay off loan ' || l_loan_number || '. Outstanding interest and fees amount = ' || l_remaining_amount);
633 
634             end if;
635 
636         EXCEPTION
637             WHEN OTHERS THEN
638                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to process loan ' || l_loan_number);
639         END;
640 
641     END LOOP;
642 
643     close paidoff_loans_cur;
644 
645     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
646     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || l_Count || ' loan(s)');
647     l_end := sysdate;
648     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Process Paid Loans Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
649 
650     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
651 
652 EXCEPTION
653 
654         WHEN FND_API.G_EXC_ERROR THEN
655              ROLLBACK TO PROCESS_PAID_LOANS;
656              x_return_status := FND_API.G_RET_STS_ERROR;
657              logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
658 
659         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
660              ROLLBACK TO PROCESS_PAID_LOANS;
661              x_return_status := FND_API.G_RET_STS_ERROR;
662              logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
663 
664         WHEN OTHERS THEN
665              ROLLBACK TO PROCESS_PAID_LOANS;
666              x_return_status := FND_API.G_RET_STS_ERROR;
667              logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
668 
669 END;
670 
671 
672 
673 
674 /*========================================================================
675  | PRIVATE PROCEDURE REACTIVATE_PAID_LOANS
676  |
677  | DESCRIPTION
678  |      This procedure sets still active paid off loans to status PAIDOFF
679  |
680  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
681  |      None
682  |
683  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
684  |      LogMessage
685  |
686  | PARAMETERS
687  |      None
688  |
689  | KNOWN ISSUES
690  |      None
691  |
692  | NOTES
693  |      Any interesting aspect of the code in the package body which needs
694  |      to be stated.
695  |
696  | MODIFICATION HISTORY
697  | Date                  Author            Description of Changes
698  | 01-01-2004            scherkas          Created
699  |
700  *=======================================================================*/
701 PROCEDURE REACTIVATE_PAID_LOANS(
702     P_API_VERSION		IN          NUMBER,
703     P_INIT_MSG_LIST		IN          VARCHAR2,
704     P_COMMIT			IN          VARCHAR2,
705     P_VALIDATION_LEVEL	IN          NUMBER,
706     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
707     X_MSG_COUNT			OUT NOCOPY  NUMBER,
708     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
709 IS
710 
711 /*-----------------------------------------------------------------------+
712  | Local Variable Declarations and initializations                       |
713  +-----------------------------------------------------------------------*/
714 
715     l_api_name                      CONSTANT VARCHAR2(30) := 'REACTIVATE_PAID_LOANS';
716     l_api_version                   CONSTANT NUMBER := 1.0;
717     l_return_status                 VARCHAR2(1);
718     l_msg_count                     NUMBER;
719     l_msg_data                      VARCHAR2(32767);
720     l_version_number                number;
721     l_loan_id                       number;
722     l_Count                         number;
723     l_loan_number                   varchar2(60);
724     l_end                           date;
725     l_start                         date;
726 
727     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
728 
729 /*-----------------------------------------------------------------------+
730  | Cursor Declarations                                                   |
731  +-----------------------------------------------------------------------*/
732 
733     /* query paid off loans that must be reactivated */
734     CURSOR paidoff_loans_cur IS
735         select
736         head.OBJECT_VERSION_NUMBER,
737         head.loan_id,
738         head.loan_number
739         from
740         LNS_LOAN_HEADERS head
741         where
742         head.loan_status = 'PAIDOFF' and
743             ((select nvl(sum(total_remaining_amount),0)
744             from LNS_AM_SCHEDS_V
745             where loan_id = head.loan_id and
746                 reversed_code = 'N') > 0);
747 
748 BEGIN
749 
750     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
751     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reactivating paid off loans...');
752 
753     /* init variables */
754     l_Count := 0;
755 
756     l_start := sysdate;
757     open paidoff_loans_cur;
758 
759     LOOP
760 
761         fetch paidoff_loans_cur into
762             l_version_number,
763             l_loan_id,
764             l_loan_number;
765         exit when paidoff_loans_cur%NOTFOUND;
766 
767         l_Count := l_Count + 1;
768         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ' || l_loan_number || ' id ' || l_loan_id);
769 
770         BEGIN
771             /* updating loan header table */
772             l_loan_header_rec.loan_id := l_loan_id;
773             l_loan_header_rec.LOAN_STATUS := 'ACTIVE';
774 
775             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
776             LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_STATUS: ' || l_loan_header_rec.LOAN_STATUS);
777 
778             LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
779                                             P_LOAN_HEADER_REC => l_loan_header_rec,
780                                             P_INIT_MSG_LIST => FND_API.G_FALSE,
781                                             X_RETURN_STATUS => l_return_status,
782                                             X_MSG_COUNT => l_msg_count,
783                                             X_MSG_DATA => l_msg_data);
784 
785             LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
786 
787             IF l_return_status = 'S' THEN
788                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully updated LNS_LOAN_HEADERS_ALL');
789             ELSE
790                 FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
791                 FND_MSG_PUB.Add;
792                 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
793                 RAISE FND_API.G_EXC_ERROR;
794             END IF;
795 
796             if P_COMMIT = FND_API.G_TRUE then
797                 COMMIT WORK;
798                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
799             end if;
800 
801             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reactivated loan ' || l_loan_number || ' id ' || l_loan_id);
802 
803         EXCEPTION
804             WHEN OTHERS THEN
805                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to process loan ' || l_loan_number);
806         END;
807 
808     END LOOP;
809 
810     close paidoff_loans_cur;
811 
812     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
813     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || l_Count || ' loan(s)');
814     l_end := sysdate;
815     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reactivate Loans Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
816 
817     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
818 
819 EXCEPTION
820     WHEN OTHERS THEN
821         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to reactivate paid off loans');
822 
823 END;
824 
825 
826 
827 
828 /*========================================================================
829  | PRIVATE PROCEDURE GET_RECEIVABLES_FUND_DESC
830  |
831  | DESCRIPTION
832  |      This procedure gets receivable fund description for appending to AR line description
833  |
834  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
835  |      None
836  |
837  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
838  |      LogMessage
839  |
840  | PARAMETERS
841  |      None
842  |
843  | KNOWN ISSUES
844  |      None
845  |
846  | NOTES
847  |      Any interesting aspect of the code in the package body which needs
848  |      to be stated.
849  |
850  | MODIFICATION HISTORY
851  | Date                  Author            Description of Changes
852  | 01-01-2004            scherkas          Created
853  |
854  *=======================================================================*/
855 FUNCTION GET_RECEIVABLES_FUND_DESC(P_CC_ID number) RETURN VARCHAR2
856 IS
857 
858 /*-----------------------------------------------------------------------+
859  | Local Variable Declarations and initializations                       |
860  +-----------------------------------------------------------------------*/
861 
862     l_api_name                      CONSTANT VARCHAR2(30) := 'GET_RECEIVABLES_FUND_DESC';
863     l_description                   varchar2(240);
864 
865 /*-----------------------------------------------------------------------+
866  | Cursor Declarations                                                   |
867  +-----------------------------------------------------------------------*/
868 
869     /* query receivable fund description */
870     CURSOR rec_fund_desc_cur(P_ORG_ID number, P_CC_ID number) IS
871         SELECT
872             FVL.DESCRIPTION
873         FROM LNS_SYSTEM_OPTIONS LSO
874             ,gl_sets_of_books SB
875             ,FND_ID_FLEX_STRUCTURES_VL STR
876             ,FND_ID_FLEX_SEGMENTS_VL SEG
877             ,fnd_flex_value_sets FVS
878             ,FND_FLEX_VALUES_VL FVL
879             ,FND_SEGMENT_ATTRIBUTE_VALUES SAV
880             ,GL_CODE_COMBINATIONS GL
881         WHERE STR.APPLICATION_ID = 101  -- GENERAL LEDGER
882         and lso.set_of_books_id = sb.set_of_books_id
883         and sb.chart_of_accounts_id = STR.id_flex_num
884         and gl.chart_of_accounts_id = sb.chart_of_accounts_id
885         and SEG.FLEX_VALUE_SET_ID = FVS.FLEX_VALUE_SET_ID
886         and FVS.FLEX_VALUE_SET_ID = FVL.FLEX_VALUE_SET_ID
887         and str.id_flex_num = SEG.ID_FLEX_NUM
888         and STR.id_flex_num = sav.id_flex_num
889         and STR.ID_FLEX_CODE='GL#'
890         and seg.id_flex_code ='GL#'
891         and STR.enabled_flag = 'Y'
892         and LSO.org_id = P_ORG_ID
893         and gl.code_combination_id = P_CC_ID
894         and fvl.flex_value = (decode(sav.application_column_name,
895             'SEGMENT1', GL.segment1,
896             'SEGMENT2', GL.segment2,
897             'SEGMENT3', GL.segment3,
898             'SEGMENT4', GL.segment4,
899             'SEGMENT5', GL.segment5))
900         and (('' IS NULL) OR (structured_hierarchy_level IN
901                                             (SELECT h.hierarchy_id
902                                                 FROM fnd_flex_hierarchies_vl h
903                                             WHERE h.flex_value_set_id = FVL.flex_value_set_id
904                                                 AND h.hierarchy_name like '')))
905         and exists
906         ( SELECT 1
907         FROM FND_SEGMENT_ATTRIBUTE_TYPES T
908         WHERE T.APPLICATION_ID = SAV.APPLICATION_ID
909             AND T.ID_FLEX_CODE = SAV.ID_FLEX_CODE
910             AND T.SEGMENT_ATTRIBUTE_TYPE = SAV.SEGMENT_ATTRIBUTE_TYPE
911             AND GLOBAL_FLAG = 'N'
912             and SAV.ID_FLEX_CODE='GL#'
913             and SAV.APPLICATION_ID=101
914             and sav.segment_attribute_type = 'GL_BALANCING'
915             and attribute_value = 'Y'
916         );
917 
918 
919 BEGIN
920 
921     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
922 
923     l_description := null;
924 
925     open rec_fund_desc_cur(g_org_id, P_CC_ID);
926     fetch rec_fund_desc_cur into l_description;
927     close rec_fund_desc_cur;
928 
929     if l_description is not null then
930         l_description := ' - ' || l_description;
931     end if;
932 
933     return l_description;
934 
935     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
936 
937 EXCEPTION
938     WHEN OTHERS THEN
939         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to get receivable fund description');
940         return l_description;
941 
942 END;
943 
944 
945 
946 
947 /*========================================================================
948  | PRIVATE PROCEDURE CREATE_AR_INVOICES
949  |
950  | DESCRIPTION
951  |      This procedure creates AR invoices.
952  |
953  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
954  |      BILL_SINGLE_LOAN
955  |      CREATE_SINGLE_OFFCYCLE_BILL
956  |
957  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
958  |      LogMessage
959  |
960  | PARAMETERS
961  |      P_LOAN_REC  IN OUT NOCOPY   Loan record
962  |      P_LINES_TBL  IN OUT NOCOPY  Lines table
963  |
964  | KNOWN ISSUES
965  |      None
966  |
967  | NOTES
968  |      Any interesting aspect of the code in the package body which needs
969  |      to be stated.
970  |
971  | MODIFICATION HISTORY
972  | Date                  Author            Description of Changes
973  | 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
974  | 03-28-2006            karamach          Pass the taxable_flag 'N' in trx line and billing_date = due_date in trx header for bug5124908
975  | 01-01-2004            scherkas          Created
976  |
977  *=======================================================================*/
978 PROCEDURE CREATE_AR_INVOICES(P_LOAN_REC  IN OUT NOCOPY  LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC,
979                              P_LINES_TBL  IN OUT NOCOPY  LNS_BILLING_BATCH_PUB.BILL_LINES_TBL)
980 IS
981 
982 /*-----------------------------------------------------------------------+
983  | Local Variable Declarations and initializations                       |
984  +-----------------------------------------------------------------------*/
985 
986     l_api_name                      CONSTANT VARCHAR2(30) := 'CREATE_AR_INVOICES';
987     l_return_status                 VARCHAR2(1);
988     l_msg_count                     NUMBER;
989     l_msg_data                      VARCHAR2(32767);
990     l_Count1                        number;
991     l_Count2                        number;
992     l_Count3                        number;
993     l_Count4                        number;
994     l_Count5                        number;
995     l_Count6                        number;
996     l_customer_trx_id               number;
997     l_trx_number                    VARCHAR2(20);
998     l_customer_trx_line_id          number;
999     l_payment_schedule_id           number;
1000     l_due_date                      date;
1001     l_batch_id                      number;
1002     l_line_type                     varchar2(30);
1003     l_amount                        number;
1004     l_id                            number;
1005     l_next_line                     varchar2(5);
1006     l_generate_trx_number           varchar2(1);
1007     l_COPY_DOC_NUMBER_FLAG          varchar2(1);
1008     l_AUTO_TRX_NUMBERING_FLAG       varchar2(1);
1009     l_search_str                    varchar2(1);
1010     l_exit_loop                     varchar2(1);
1011 	l_start_pos		                number;
1012 	l_end_pos		                number;
1013     l_populate_dist                 varchar2(1);
1014     l_cc_id                         number;
1015     l_percent                       number;
1016     l_payment_order                 number;
1017     l_trx_header_id                 number;
1018     l_trx_line_id                   number;
1019     l_error_message                 varchar2(2000);
1020     l_invalid_value                 varchar2(2000);
1021     l_principal_trx_id              number;
1022     l_interest_trx_id               number;
1023     l_fee_trx_id                    number;
1024     l_prin_trx_type                 number;
1025     l_USSGL_TRANSACTION_CODE        VARCHAR2(30);
1026     l_line_desc                     VARCHAR2(240);
1027     l_orig_line_amount              number;
1028     l_split_flag                    varchar2(1);
1029     l_running_sum                   number;
1030     l_ar_error_counter              number;
1031     l_fee_header                    number;
1032     l_fee_line_num                  number;
1033     l_site_use_id                   number;
1034     l_amortization_line_id          number;
1035     l_precision                     number;
1036     l_ext_precision                 number;
1037     l_min_acct_unit                 number;
1038     l_org_status                    varchar2(1);
1039     l_org_id                        number;
1040     l_start                         date;
1041     l_end                           date;
1042     l_phase                         varchar2(10);
1043     l_int_header                    number;
1044     l_int_line_num                  number;
1045 
1046     l_batch_source_rec              ar_invoice_api_pub.batch_source_rec_type;
1047     l_trx_header_tbl                ar_invoice_api_pub.trx_header_tbl_type;
1048     l_trx_lines_tbl                 ar_invoice_api_pub.trx_line_tbl_type;
1049     l_trx_dist_tbl                  ar_invoice_api_pub.trx_dist_tbl_type;
1050     l_trx_salescredits_tbl          ar_invoice_api_pub.trx_salescredits_tbl_type;
1051     l_new_lines_tbl                 LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
1052 
1053 /*-----------------------------------------------------------------------+
1054  | Cursor Declarations                                                   |
1055  +-----------------------------------------------------------------------*/
1056 
1057     /* query of batch source attributes */
1058     CURSOR gen_trx_num_cur(P_SOURCE_ID number) IS
1059         select COPY_DOC_NUMBER_FLAG,
1060                AUTO_TRX_NUMBERING_FLAG
1061         FROM RA_BATCH_SOURCES
1062         where BATCH_SOURCE_ID = P_SOURCE_ID;
1063 
1064     /* generate new trx number */
1065     CURSOR new_trx_num_cur IS
1066         select LNS_TRX_NUMBER_S.NEXTVAL
1067         from dual;
1068 
1069     /* query of meaning of PAYMENT_APPLICATION_TYPE */
1070     CURSOR meaning_cur(P_LOOKUP_CODE varchar2) IS
1071         select meaning
1072         from LNS_LOOKUPS
1073         where lookup_type = 'PAYMENT_APPLICATION_TYPE' and
1074               lookup_code = P_LOOKUP_CODE;
1075 
1076     /* query of distributions for principal dr */
1077     CURSOR prin_dr_dist_cur(P_LOAN_ID number) IS
1078         select CODE_COMBINATION_ID,
1079                 DISTRIBUTION_PERCENT,
1080                 USSGL_TRANSACTION_CODE
1081         from lns_distributions
1082         where LOAN_ID = P_LOAN_ID and
1083             account_type = 'DR' and
1084             account_name = 'PRINCIPAL_RECEIVABLE' and
1085             line_type = 'PRIN';
1086 
1087     /* query of distributions for interest dr */
1088     CURSOR int_dr_dist_cur(P_LOAN_ID number) IS
1089         select CODE_COMBINATION_ID,
1090                 DISTRIBUTION_PERCENT,
1091                 USSGL_TRANSACTION_CODE
1092         from lns_distributions
1093         where LOAN_ID = P_LOAN_ID and
1094             account_type = 'DR' and
1095             account_name = 'INTEREST_RECEIVABLE' and
1096             line_type = 'INT';
1097 
1098     /* query of distributions for fee dr */
1099     CURSOR fee_dr_dist_cur(P_LOAN_ID number) IS
1100         select CODE_COMBINATION_ID,
1101                 DISTRIBUTION_PERCENT,
1102                 USSGL_TRANSACTION_CODE
1103         from lns_distributions
1104         where LOAN_ID = P_LOAN_ID and
1105             account_type = 'DR' and
1106             account_name = 'FEE_RECEIVABLE' and
1107             line_type = 'FEE';
1108 
1109     /* query of distributions for principal cr */
1110     CURSOR prin_cr_dist_cur(P_LOAN_ID number) IS
1111         select CODE_COMBINATION_ID,
1112                 DISTRIBUTION_PERCENT,
1113                 USSGL_TRANSACTION_CODE
1114         from lns_distributions
1115         where LOAN_ID = P_LOAN_ID and
1116             account_type = 'CR' and
1117             account_name = 'LOAN_RECEIVABLE' and
1118             line_type = 'PRIN';
1119 
1120     /* query of distributions for interest cr */
1121     CURSOR int_cr_dist_cur(P_LOAN_ID number) IS
1122         select CODE_COMBINATION_ID,
1123                 DISTRIBUTION_PERCENT,
1124                 USSGL_TRANSACTION_CODE
1125         from lns_distributions
1126         where LOAN_ID = P_LOAN_ID and
1127             account_type = 'CR' and
1128             account_name = 'INTEREST_INCOME' and
1129             line_type = 'INT';
1130 
1131     /* query of distributions for fee cr */
1132     CURSOR fee_cr_dist_cur(P_LOAN_ID number, P_FEE_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 = 'CR' and
1139             account_name = 'FEE_INCOME' and
1140             line_type = 'FEE' and
1141             fee_id = P_FEE_ID;
1142 
1143     /* query of AR errors */
1144     CURSOR ar_invoice_err_cur IS
1145         SELECT trx_header_id, trx_line_id, error_message, invalid_value
1146         from ar_trx_errors_gt;
1147 
1148     /* query invoice details */
1149     CURSOR ar_invoices_cur(P_BATCH_ID number) IS
1150         select
1151             trx.customer_trx_id,
1152             trx.trx_number,
1153             lines.customer_trx_line_id,
1154             psa.payment_schedule_id,
1155             psa.due_date,
1156             lines.extended_amount,
1157             lines.INTERFACE_LINE_ATTRIBUTE5,
1158             lines.INTERFACE_LINE_ATTRIBUTE6
1159         from RA_CUSTOMER_TRX trx,
1160             RA_CUSTOMER_TRX_LINES lines,
1161             ar_payment_schedules_all psa
1162         where
1163             trx.batch_id = P_BATCH_ID
1164             and trx.customer_trx_id = lines.customer_trx_id
1165             and trx.customer_trx_id = psa.customer_trx_id(+)    -- outer join is for case when invoice is created incomplete
1166             and lines.line_type = 'LINE'
1167         ORDER BY lines.customer_trx_line_id;
1168 
1169     /* query trx_type_id */
1170     CURSOR trx_type_cur(P_LOAN_ID number) IS
1171         select REFERENCE_TYPE_ID
1172         from LNS_LOAN_HEADERS
1173         where loan_id = P_LOAN_ID;
1174 
1175     /* query for site_use_id */
1176     CURSOR site_use_id_cur(P_SITE_ID number) IS
1177         select site_use_id
1178         from hz_cust_site_uses
1179         where cust_acct_site_id = P_SITE_ID
1180         and site_use_code = 'BILL_TO'
1181         and status = 'A';
1182 
1183 BEGIN
1184     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
1185     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Preparing to call AR invoice api...');
1186 
1187     /* init variables */
1188     l_generate_trx_number  := 'Y';
1189     l_COPY_DOC_NUMBER_FLAG := 'N';
1190     l_AUTO_TRX_NUMBERING_FLAG := 'N';
1191     l_search_str := '_';
1192 	l_start_pos := 1;
1193 	l_end_pos := 1;
1194 
1195     l_batch_source_rec.batch_source_id := g_batch_source_id;
1196 
1197     /* check if we need to generate trx_number */
1198     open gen_trx_num_cur(l_batch_source_rec.batch_source_id);
1199     fetch gen_trx_num_cur into l_COPY_DOC_NUMBER_FLAG, l_AUTO_TRX_NUMBERING_FLAG;
1200     close gen_trx_num_cur;
1201 
1202     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_COPY_DOC_NUMBER_FLAG: ' || l_COPY_DOC_NUMBER_FLAG);
1203     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_AUTO_TRX_NUMBERING_FLAG: ' || l_AUTO_TRX_NUMBERING_FLAG);
1204 
1205     if l_COPY_DOC_NUMBER_FLAG = 'Y' or l_AUTO_TRX_NUMBERING_FLAG = 'Y' then
1206         l_generate_trx_number := 'N';
1207     end if;
1208 
1209     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_generate_trx_number: ' || l_generate_trx_number);
1210 
1211     /* query trx_type_id */
1212     open trx_type_cur(P_LOAN_REC.LOAN_ID);
1213     fetch trx_type_cur into l_prin_trx_type;
1214     close trx_type_cur;
1215 
1216     LogMessage(FND_LOG.LEVEL_STATEMENT, 'prin_trx_type: ' || l_prin_trx_type);
1217 
1218     /* query for site_use_id */
1219     open site_use_id_cur(P_LOAN_REC.BILL_TO_ADDRESS_ID);
1220     fetch site_use_id_cur into l_site_use_id;
1221     close site_use_id_cur;
1222 
1223     /* check exchange rate: if its User - pass exchange rate; otherwise - pass null */
1224     if P_LOAN_REC.EXCHANGE_RATE_TYPE is null or
1225        (P_LOAN_REC.EXCHANGE_RATE_TYPE is not null and P_LOAN_REC.EXCHANGE_RATE_TYPE <> 'User') then
1226 
1227         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Setting exchange rate = null');
1228         P_LOAN_REC.EXCHANGE_RATE := null;
1229 
1230     end if;
1231 
1232     -- setting phase for invoice reference
1233     if P_LOAN_REC.CURRENT_PHASE = 'OPEN' then
1234         l_phase := 'Disb';
1235     else
1236         l_phase := 'Term';
1237     end if;
1238 
1239     l_Count1 := 0;  -- lines counter
1240     l_Count2 := 0;  -- distributions counter
1241     l_Count3 := 0;  -- header counter
1242     l_Count6 := 0;  -- returned lines table
1243     l_fee_header := -1;
1244     l_int_header := -1;
1245     l_exit_loop := 'N';
1246     l_end_pos := instr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_search_str, l_start_pos, 1);
1247 
1248 	while true loop
1249 
1250 		if l_end_pos <> 0 then
1251 			l_next_line := substr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_start_pos, l_end_pos-l_start_pos);
1252 		else
1253 			l_next_line := substr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_start_pos,
1254                                   LENGTH(P_LOAN_REC.PAYMENT_APPLICATION_ORDER)-l_start_pos+1);
1255 			l_exit_loop := 'Y';
1256 		end if;
1257 
1258         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_next_line: ' || l_next_line);
1259 
1260         FOR l_Count4 IN 1..P_LINES_TBL.COUNT LOOP
1261 
1262             if P_LINES_TBL(l_Count4).LINE_TYPE = l_next_line and
1263                P_LINES_TBL(l_Count4).LINE_AMOUNT is not null and
1264                P_LINES_TBL(l_Count4).LINE_AMOUNT > 0  and
1265                P_LINES_TBL(l_Count4).PAYMENT_ORDER is null
1266             then
1267 
1268                 l_Count1 := l_Count1 + 1;   -- lines
1269 
1270                 if ((g_multiple_lines = 'Y' and l_Count3 = 0) or
1271 --                   (g_multiple_lines = 'N' and (l_next_line = 'PRIN' or l_next_line = 'INT')) or
1272                    (g_multiple_lines = 'N' and l_next_line = 'PRIN') or
1273                    (g_multiple_lines = 'N' and l_next_line = 'INT' and l_int_header = -1) or
1274                    (g_multiple_lines = 'N' and l_next_line = 'FEE' and l_fee_header = -1))
1275                 then
1276                     l_Count3 := l_Count3 + 1;   -- header
1277                 end if;
1278 
1279                 /* populate line description */
1280                 open meaning_cur(l_next_line);
1281                 fetch meaning_cur into l_line_desc;
1282                 close meaning_cur;
1283 
1284                 if P_LINES_TBL(l_Count4).LINE_DESC is not null then
1285                     l_trx_lines_tbl(l_Count1).description := l_line_desc || ' - ' || P_LINES_TBL(l_Count4).LINE_DESC;
1286                 else
1287                     l_trx_lines_tbl(l_Count1).description := l_line_desc;
1288                 end if;
1289 
1290                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Line ' || l_Count1 || ' - ' || l_trx_lines_tbl(l_Count1).description);
1291 
1292                 if g_multiple_lines = 'Y' then
1293 
1294                     if l_Count3 = 1 then
1295 
1296                         if l_generate_trx_number = 'Y' then
1297 /*
1298                             -- generate new id for new AR invoice_number
1299                             open new_trx_num_cur;
1300                             fetch new_trx_num_cur into l_id;
1301                             close new_trx_num_cur;
1302 
1303                             l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1304 */
1305                             l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1306 
1307                         end if;
1308 
1309                         /* populate header info */
1310                         l_trx_header_tbl(l_Count3).comments := P_LOAN_REC.LOAN_DESCRIPTION;
1311                         l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1312                         l_trx_header_tbl(l_Count3).trx_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE;
1313                         --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1314                         l_trx_header_tbl(l_Count3).gl_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE + g_day_togl_after_dd;
1315                         l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1316                         l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1317                         l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1318                         l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1319                         l_trx_header_tbl(l_Count3).cust_trx_type_id := nvl(l_prin_trx_type, g_trx_type_id);
1320                         l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1321                         l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1322                         l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1323                         l_trx_header_tbl(l_Count3).term_id := 5; --always IMMEDIATE
1324                         l_trx_header_tbl(l_Count3).finance_charges := 'N';
1325                         l_trx_header_tbl(l_Count3).status_trx := 'OP';
1326                         l_trx_header_tbl(l_Count3).printing_option := 'NOT';
1327                         l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1328                             l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1329                         l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1330                         l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1331 
1332                         if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1333                             l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1334                         end if;
1335 
1336                     end if;
1337 
1338                     l_trx_lines_tbl(l_Count1).line_number := l_Count1;
1339                     l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1340 
1341                 else
1342 
1343 --                    if l_next_line = 'PRIN' or l_next_line = 'INT' then
1344                     if l_next_line = 'PRIN' then
1345 
1346                         if l_generate_trx_number = 'Y' then
1347     /*
1348                             -- generate new id for new AR invoice_number
1349                             open new_trx_num_cur;
1350                             fetch new_trx_num_cur into l_id;
1351                             close new_trx_num_cur;
1352 
1353                             l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1354     */
1355                             l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1356 
1357                         end if;
1358 
1359                         /* populate rest of header info */
1360                         l_trx_header_tbl(l_Count3).comments := P_LOAN_REC.LOAN_DESCRIPTION;
1361                         l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1362                         l_trx_header_tbl(l_Count3).trx_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE;
1363                         --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1364                         l_trx_header_tbl(l_Count3).gl_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE + g_day_togl_after_dd;
1365                         l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1366                         l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1367                         l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1368                         l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1369                         l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1370                         l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1371                         l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1372                         l_trx_header_tbl(l_Count3).term_id := 5; --always IMMEDIATE
1373                         l_trx_header_tbl(l_Count3).finance_charges := 'N';
1374                         l_trx_header_tbl(l_Count3).status_trx := 'OP';
1375                         l_trx_header_tbl(l_Count3).printing_option := 'NOT';
1376                         l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1377                             l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1378                         l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1379                         l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1380 
1381                         if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1382                             l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1383                         end if;
1384 
1385                         -- set trx_type_id
1386                         l_trx_header_tbl(l_Count3).cust_trx_type_id := nvl(l_prin_trx_type, g_trx_type_id);
1387                         l_trx_lines_tbl(l_Count1).line_number := 1;
1388                         l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1389 
1390                     elsif l_next_line = 'INT' then
1391 
1392                         if l_int_header = -1 then
1393 
1394                             if l_generate_trx_number = 'Y' then
1395         /*
1396                                 -- generate new id for new AR invoice_number
1397                                 open new_trx_num_cur;
1398                                 fetch new_trx_num_cur into l_id;
1399                                 close new_trx_num_cur;
1400 
1401                                 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1402         */
1403                                 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1404 
1405                             end if;
1406 
1407                             /* populate rest of header info */
1408                             l_trx_header_tbl(l_Count3).comments := P_LOAN_REC.LOAN_DESCRIPTION;
1409                             l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1410                             l_trx_header_tbl(l_Count3).trx_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE;
1411                             l_trx_header_tbl(l_Count3).gl_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE + g_day_togl_after_dd;
1412                             l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1413                             l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1414                             l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1415                             l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1416                             l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1417                             l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1418                             l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1419                             l_trx_header_tbl(l_Count3).term_id := 5; --always IMMEDIATE
1420                             l_trx_header_tbl(l_Count3).finance_charges := 'N';
1421                             l_trx_header_tbl(l_Count3).status_trx := 'OP';
1422                             l_trx_header_tbl(l_Count3).printing_option := 'NOT';
1423                             l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1424                                 l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1425                             l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1426                             l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1427 
1428                             if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1429                                 l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1430                             end if;
1431 
1432                             /* set trx_type_id */
1433 
1434                             if g_int_trx_type_id is null then
1435 
1436     --                            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Interest transaction type is not set.');
1437                                 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INT_TRX_TYPE_IN_SYS_OPT');
1438                                 FND_MSG_PUB.Add;
1439                                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1440                                 RAISE FND_API.G_EXC_ERROR;
1441 
1442                             end if;
1443 
1444                             l_trx_header_tbl(l_Count3).cust_trx_type_id := g_int_trx_type_id;
1445                             l_int_line_num := 1;
1446                             l_trx_lines_tbl(l_Count1).line_number := l_int_line_num;
1447                             l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1448 
1449                         else
1450 
1451                             l_int_line_num := l_int_line_num + 1;
1452                             l_trx_lines_tbl(l_Count1).line_number := l_int_line_num;
1453                             l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_int_header).trx_header_id;
1454 
1455                         end if;
1456 
1457                     elsif l_next_line = 'FEE' then
1458 
1459                         if l_fee_header = -1 then
1460 
1461                             if l_generate_trx_number = 'Y' then
1462         /*
1463                                 -- generate new id for new AR invoice_number
1464                                 open new_trx_num_cur;
1465                                 fetch new_trx_num_cur into l_id;
1466                                 close new_trx_num_cur;
1467 
1468                                 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1469         */
1470                                 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1471 
1472                             end if;
1473 
1474                             /* populate rest of header info */
1475                             l_trx_header_tbl(l_Count3).comments := P_LOAN_REC.LOAN_DESCRIPTION;
1476                             l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1477                             l_trx_header_tbl(l_Count3).trx_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE;
1478                             --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1479                             l_trx_header_tbl(l_Count3).gl_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE + g_day_togl_after_dd;
1480                             l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1481                             l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1482                             l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1483                             l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1484                             l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1485                             l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1486                             l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1487                             l_trx_header_tbl(l_Count3).term_id := 5; --always IMMEDIATE
1488                             l_trx_header_tbl(l_Count3).finance_charges := 'N';
1489                             l_trx_header_tbl(l_Count3).status_trx := 'OP';
1490                             l_trx_header_tbl(l_Count3).printing_option := 'NOT';
1491                             l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1492                                 l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1493                             l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1494                             l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1495 
1496                             if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1497                                 l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1498                             end if;
1499 
1500                             /* set trx_type_id */
1501                             if g_fee_trx_type_id is null then
1502 
1503     --                            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Fee transaction type is not set.');
1504                                 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_FEE_TRX_TYPE_IN_SYS_OPT');
1505                                 FND_MSG_PUB.Add;
1506                                 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1507                                 RAISE FND_API.G_EXC_ERROR;
1508 
1509                             end if;
1510 
1511                             l_trx_header_tbl(l_Count3).cust_trx_type_id := g_fee_trx_type_id;
1512                             l_fee_line_num := 1;
1513                             l_trx_lines_tbl(l_Count1).line_number := l_fee_line_num;
1514                             l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1515 
1516                         else
1517 
1518                             l_fee_line_num := l_fee_line_num + 1;
1519                             l_trx_lines_tbl(l_Count1).line_number := l_fee_line_num;
1520                             l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_fee_header).trx_header_id;
1521 
1522                         end if;
1523 
1524                     end if;
1525 
1526                 end if;
1527 
1528                 /* populate rest of line info */
1529 
1530                 l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1531                 l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1532                 l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1533                 l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1534                 l_trx_lines_tbl(l_Count1).unit_selling_price := P_LINES_TBL(l_Count4).LINE_AMOUNT;
1535                 l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1536                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1537                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1538                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1539                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1540                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1541                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1542                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1543 
1544                 /* populate new return lines table */
1545                 l_Count6 := l_Count6 +1;
1546                 l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1547                 l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1548                 l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1549                 l_new_lines_tbl(l_Count6).LINE_AMOUNT := P_LINES_TBL(l_Count4).LINE_AMOUNT;
1550                 l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1551                 l_new_lines_tbl(l_Count6).LINE_DESC := P_LINES_TBL(l_Count4).LINE_DESC;
1552                 l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1553                 l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1554                 l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1555                 l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1556 
1557                 P_LINES_TBL(l_Count4).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1558 
1559                 if l_next_line = 'PRIN' then
1560 
1561                     /* query and populate distribution lines for principal dr */
1562                     open prin_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1563 
1564                     fetch prin_dr_dist_cur into
1565                         l_cc_id,
1566                         l_percent,
1567                         l_USSGL_TRANSACTION_CODE;
1568 
1569                     if prin_dr_dist_cur%FOUND then
1570 
1571                         l_Count2 := l_Count2 + 1;
1572                         l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1573                         l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1574                         l_trx_dist_tbl(l_Count2).percent := l_percent;
1575                         l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1576 
1577                         if g_multiple_lines = 'Y' then
1578                             l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1579                             l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1580                         else
1581                             l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1582                             l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1583                         end if;
1584 
1585                     end if;
1586                     close prin_dr_dist_cur;
1587 
1588                     /* query and populate distribution lines for principal cr */
1589                     open prin_cr_dist_cur(P_LOAN_REC.LOAN_ID);
1590 
1591                     l_Count5 := 0;
1592                     l_split_flag := 'N';
1593                     l_running_sum := 0;
1594                     LOOP
1595 
1596                         fetch prin_cr_dist_cur into
1597                             l_cc_id,
1598                             l_percent,
1599                             l_USSGL_TRANSACTION_CODE;
1600                         exit when prin_cr_dist_cur%NOTFOUND;
1601 
1602                         l_Count5 := l_Count5 + 1;
1603                         l_Count2 := l_Count2 + 1;
1604                         l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1605                         l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1606                         l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1607                         l_trx_dist_tbl(l_Count2).percent := l_percent;
1608                         l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1609 
1610                         /* for each distribution create seperate trx line for current trx header */
1611                         if l_trx_dist_tbl(l_Count2).percent < 100 then
1612 
1613                             if l_Count5 = 1 then
1614                                 l_orig_line_amount := l_trx_lines_tbl(l_Count1).unit_selling_price;
1615                                 l_split_flag := 'Y';
1616 
1617                                 fnd_currency.GET_INFO(CURRENCY_CODE => P_LOAN_REC.LOAN_CURRENCY,
1618                                                       PRECISION => l_precision,
1619                                                       EXT_PRECISION => l_ext_precision,
1620                                                       MIN_ACCT_UNIT => l_min_acct_unit);
1621 
1622                             else
1623 
1624                                 l_Count1 := l_Count1 + 1;
1625                                 l_trx_lines_tbl(l_Count1).line_number := l_Count5;
1626                                 l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1627                 		l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1628                                 l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1629                                 l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1630                                 l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1631                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1632                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1633                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1634                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1635                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1636                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1637                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1638 
1639                                 l_Count6 := l_Count6 +1;
1640                                 l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1641                                 l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1642                                 l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1643                                 l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1644                                 l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1645                                 l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1646                                 l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1647                                 l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1648 
1649                                 if g_multiple_lines = 'Y' then
1650                                     l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1651                                 else
1652                                     l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1653                                 end if;
1654 
1655                                 l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1656 
1657                             end if;
1658 
1659                             l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1660                             l_trx_lines_tbl(l_Count1).description := l_line_desc || GET_RECEIVABLES_FUND_DESC(l_cc_id);
1661                             l_trx_lines_tbl(l_Count1).unit_selling_price := round(l_orig_line_amount * l_trx_dist_tbl(l_Count2).percent / 100, l_precision);
1662                             l_trx_dist_tbl(l_Count2).percent := 100;
1663                             l_running_sum := l_running_sum + l_trx_lines_tbl(l_Count1).unit_selling_price;
1664 
1665                             l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1666                             l_new_lines_tbl(l_Count6).LINE_DESC := l_trx_lines_tbl(l_Count1).description;
1667 
1668                         else
1669                             l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1670                         end if;
1671 
1672                     END LOOP;
1673 
1674                     if l_split_flag = 'Y' then
1675                         l_trx_lines_tbl(l_Count1).unit_selling_price := l_orig_line_amount -
1676                             (l_running_sum - l_trx_lines_tbl(l_Count1).unit_selling_price);
1677                         l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1678                     end if;
1679 
1680                     close prin_cr_dist_cur;
1681 
1682                 elsif l_next_line = 'INT' then
1683 
1684                     if l_int_header = -1 then
1685                         /* query and populate distribution lines for interest dr */
1686                         open int_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1687 
1688                         fetch int_dr_dist_cur into
1689                             l_cc_id,
1690                             l_percent,
1691                             l_USSGL_TRANSACTION_CODE;
1692 
1693                         if int_dr_dist_cur%FOUND then
1694 
1695                             l_Count2 := l_Count2 + 1;
1696                             l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1697                             l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1698                             l_trx_dist_tbl(l_Count2).percent := l_percent;
1699                             l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1700 
1701                             if g_multiple_lines = 'Y' then
1702                                 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1703                                 l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1704                             else
1705                                 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1706                                 l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1707                             end if;
1708 
1709                         end if;
1710                         close int_dr_dist_cur;
1711                     end if;
1712 
1713                     /* query and populate distribution lines for interest cr */
1714                     open int_cr_dist_cur(P_LOAN_REC.LOAN_ID);
1715 
1716                     l_Count5 := 0;
1717                     l_split_flag := 'N';
1718                     l_running_sum := 0;
1719                     LOOP
1720 
1721                         fetch int_cr_dist_cur into
1722                             l_cc_id,
1723                             l_percent,
1724                             l_USSGL_TRANSACTION_CODE;
1725                         exit when int_cr_dist_cur%NOTFOUND;
1726 
1727                         l_Count5 := l_Count5 + 1;
1728                         l_Count2 := l_Count2 + 1;
1729                         l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1730                         l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1731                         l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1732                         l_trx_dist_tbl(l_Count2).percent := l_percent;
1733                         l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1734 
1735                         /* for each distribution create seperate trx line for current trx header */
1736                         if l_trx_dist_tbl(l_Count2).percent < 100 then
1737 
1738                             if l_Count5 = 1 then
1739                                 l_orig_line_amount := l_trx_lines_tbl(l_Count1).unit_selling_price;
1740                                 l_split_flag := 'Y';
1741 
1742                                 fnd_currency.GET_INFO(CURRENCY_CODE => P_LOAN_REC.LOAN_CURRENCY,
1743                                                       PRECISION => l_precision,
1744                                                       EXT_PRECISION => l_ext_precision,
1745                                                       MIN_ACCT_UNIT => l_min_acct_unit);
1746 
1747                             else
1748 
1749                                 l_Count1 := l_Count1 + 1;
1750                                 l_trx_lines_tbl(l_Count1).line_number := l_Count5;
1751                                 l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1752                 		l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1753                                 l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1754                                 l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1755                                 l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1756                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1757                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1758                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1759                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1760                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1761                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1762                                 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1763 
1764                                 l_Count6 := l_Count6 +1;
1765                                 l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1766                                 l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1767                                 l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1768                                 l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1769                                 l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1770                                 l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1771                                 l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1772                                 l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1773 
1774                                 if g_multiple_lines = 'Y' then
1775                                     l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1776                                 else
1777                                     l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1778                                 end if;
1779 
1780                                 l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1781 
1782                             end if;
1783 
1784                             l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1785                             l_trx_lines_tbl(l_Count1).description := l_line_desc || GET_RECEIVABLES_FUND_DESC(l_cc_id);
1786                             l_trx_lines_tbl(l_Count1).unit_selling_price := round(l_orig_line_amount * l_trx_dist_tbl(l_Count2).percent / 100, l_precision);
1787                             l_trx_dist_tbl(l_Count2).percent := 100;
1788                             l_running_sum := l_running_sum + l_trx_lines_tbl(l_Count1).unit_selling_price;
1789 
1790                             l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1791                             l_new_lines_tbl(l_Count6).LINE_DESC := l_trx_lines_tbl(l_Count1).description;
1792 
1793                         else
1794                             l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1795                         end if;
1796 
1797 --                        l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1798 
1799                     END LOOP;
1800 
1801                     if l_split_flag = 'Y' then
1802                         l_trx_lines_tbl(l_Count1).unit_selling_price := l_orig_line_amount -
1803                             (l_running_sum - l_trx_lines_tbl(l_Count1).unit_selling_price);
1804                         l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1805                     end if;
1806 
1807                     close int_cr_dist_cur;
1808 
1809                     if l_int_header = -1 then
1810                         l_int_header := l_Count3;
1811                     end if;
1812 
1813                 elsif l_next_line = 'FEE' then
1814 
1815                     if P_LINES_TBL(l_Count4).LINE_REF_ID is not null then
1816 
1817                         if l_fee_header = -1 then
1818                             /* query and populate distribution lines for fee dr */
1819                             open fee_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1820 
1821                             fetch fee_dr_dist_cur into
1822                                 l_cc_id,
1823                                 l_percent,
1824                                 l_USSGL_TRANSACTION_CODE;
1825 
1826                             if fee_dr_dist_cur%FOUND then
1827 
1828                                 l_Count2 := l_Count2 + 1;
1829                                 l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1830                                 l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1831                                 l_trx_dist_tbl(l_Count2).percent := l_percent;
1832                                 l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1833 
1834                                 if g_multiple_lines = 'Y' then
1835                                     l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1836                                     l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1837                                 else
1838                                     l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1839                                     l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1840                                 end if;
1841 
1842                             end if;
1843                             close fee_dr_dist_cur;
1844                         end if;
1845 
1846                         /* query and populate distribution lines for fee cr */
1847                         open fee_cr_dist_cur(P_LOAN_REC.LOAN_ID, P_LINES_TBL(l_Count4).LINE_REF_ID);
1848 
1849                         LOOP
1850 
1851                             fetch fee_cr_dist_cur into
1852                                 l_cc_id,
1853                                 l_percent,
1854                                 l_USSGL_TRANSACTION_CODE;
1855                             exit when fee_cr_dist_cur%NOTFOUND;
1856 
1857                             l_Count2 := l_Count2 + 1;
1858                             l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1859                             l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1860                             l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1861                             l_trx_dist_tbl(l_Count2).percent := l_percent;
1862                             l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1863 
1864                             l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1865 
1866                         END LOOP;
1867 
1868                         close fee_cr_dist_cur;
1869 
1870                     end if;
1871 
1872                     if l_fee_header = -1 then
1873                         l_fee_header := l_Count3;
1874                     end if;
1875 
1876                 end if;
1877 
1878                 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);
1879 
1880             end if;
1881 
1882         END LOOP;
1883 
1884         /* exit looping */
1885         if l_exit_loop = 'Y' then
1886             exit;
1887         end if;
1888 
1889         l_start_pos := l_end_pos+1;
1890 		l_end_pos := instr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_search_str, l_start_pos, 1);
1891 
1892 	end loop;
1893 
1894     if l_trx_header_tbl.COUNT = 0 then
1895 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No data to create invoices.');
1896     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_DATA_CR_INV');
1897 		FND_MSG_PUB.Add;
1898         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1899         RAISE FND_API.G_EXC_ERROR;
1900     end if;
1901 
1902     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Creating AR invoices with following values:');
1903     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_batch_source_rec.batch_source_id: ' || l_batch_source_rec.batch_source_id);
1904 
1905     FOR l_Count3 IN 1..l_trx_header_tbl.COUNT LOOP
1906 
1907         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice header ' || l_Count3);
1908         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_header_tbl(l_Count3).trx_header_id);
1909         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_number: ' || l_trx_header_tbl(l_Count3).trx_number);
1910         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_date: ' || l_trx_header_tbl(l_Count3).trx_date);
1911         --LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').billing_date: ' || l_trx_header_tbl(l_Count3).billing_date);
1912         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').gl_date: ' || l_trx_header_tbl(l_Count3).gl_date);
1913         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_currency: ' || l_trx_header_tbl(l_Count3).trx_currency);
1914         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_rate_type: ' || l_trx_header_tbl(l_Count3).exchange_rate_type);
1915         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_date: ' || l_trx_header_tbl(l_Count3).exchange_date);
1916         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_rate: ' || l_trx_header_tbl(l_Count3).exchange_rate);
1917         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);
1918         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);
1919         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);
1920         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);
1921         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').term_id: ' || l_trx_header_tbl(l_Count3).term_id);
1922         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').finance_charges: ' || l_trx_header_tbl(l_Count3).finance_charges);
1923         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').status_trx: ' || l_trx_header_tbl(l_Count3).status_trx);
1924         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').printing_option: ' || l_trx_header_tbl(l_Count3).printing_option);
1925         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').interface_header_attribute1: ' || l_trx_header_tbl(l_Count3).interface_header_attribute1);
1926         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);
1927         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').org_id: ' || l_trx_header_tbl(l_Count3).org_id);
1928         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').legal_entity_id: ' || l_trx_header_tbl(l_Count3).legal_entity_id);
1929 
1930     END LOOP;
1931 
1932     FOR l_Count3 IN 1..l_trx_lines_tbl.COUNT LOOP
1933 
1934         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice line ' || l_Count3);
1935         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').trx_line_id: ' || l_trx_lines_tbl(l_Count3).trx_line_id);
1936         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_lines_tbl(l_Count3).trx_header_id);
1937         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').line_number: ' || l_trx_lines_tbl(l_Count3).line_number);
1938         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').description: ' || l_trx_lines_tbl(l_Count3).description);
1939         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').quantity_invoiced: ' || l_trx_lines_tbl(l_Count3).quantity_invoiced);
1940         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').unit_selling_price: ' || l_trx_lines_tbl(l_Count3).unit_selling_price);
1941         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').line_type: ' || l_trx_lines_tbl(l_Count3).line_type);
1942         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').interface_line_context: ' || l_trx_lines_tbl(l_Count3).interface_line_context);
1943         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE1: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE1);
1944         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE2: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE2);
1945         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE3: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE3);
1946         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE4: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE4);
1947         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE5: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE5);
1948         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE6: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE6);
1949         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE7: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE7);
1950         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);
1951 
1952     END LOOP;
1953 
1954     FOR l_Count3 IN 1..l_trx_dist_tbl.COUNT LOOP
1955 
1956         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Distribution ' || l_Count3);
1957         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_dist_id: ' || l_trx_dist_tbl(l_Count3).trx_dist_id);
1958         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_dist_tbl(l_Count3).trx_header_id);
1959         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_line_id: ' || l_trx_dist_tbl(l_Count3).trx_line_id);
1960         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').ACCOUNT_CLASS: ' || l_trx_dist_tbl(l_Count3).ACCOUNT_CLASS);
1961         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').percent: ' || l_trx_dist_tbl(l_Count3).percent);
1962         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').CODE_COMBINATION_ID: ' || l_trx_dist_tbl(l_Count3).CODE_COMBINATION_ID);
1963 
1964     END LOOP;
1965 
1966 --    fnd_global.apps_initialize(FND_GLOBAL.USER_ID, FND_GLOBAL.RESP_ID, FND_GLOBAL.RESP_APPL_ID, FND_GLOBAL.SECURITY_GROUP_ID);
1967 
1968     l_batch_id := null;
1969     ar_invoice_api_pub.g_api_outputs.batch_id := null;
1970 
1971     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Org info just before call to invoice api');
1972     l_org_id := MO_GLOBAL.GET_CURRENT_ORG_ID();
1973     LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.GET_CURRENT_ORG_ID(): ' || l_org_id);
1974     l_org_status := MO_GLOBAL.check_valid_org(g_org_id);
1975     LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.check_valid_org(' || g_org_id || '): ' || l_org_status);
1976 
1977     BEGIN
1978 
1979         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Calling AR_INVOICE_API_PUB.CREATE_INVOICE...');
1980         l_start := sysdate;
1981         AR_INVOICE_API_PUB.CREATE_INVOICE(
1982             p_api_version           => 1.0,
1983             p_init_msg_list         => FND_API.G_TRUE,
1984             p_commit                => FND_API.G_FALSE,
1985             p_batch_source_rec	    => l_batch_source_rec,
1986             p_trx_header_tbl        => l_trx_header_tbl,
1987             p_trx_lines_tbl         => l_trx_lines_tbl,
1988             p_trx_dist_tbl          => l_trx_dist_tbl,
1989             p_trx_salescredits_tbl  => l_trx_salescredits_tbl,
1990             x_return_status         => l_return_status,
1991             x_msg_count             => l_msg_count,
1992             x_msg_data              => l_msg_data);
1993 
1994     EXCEPTION
1995         WHEN OTHERS THEN
1996 
1997             l_end := sysdate;
1998             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Invoice API timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
1999             LogMessage(FND_LOG.LEVEL_ERROR, 'Invoice API throws exception!');
2000 
2001             /* query AR errors */
2002             l_ar_error_counter := 0;
2003             open ar_invoice_err_cur;
2004 
2005             LOOP
2006 
2007                 fetch ar_invoice_err_cur into
2008                     l_trx_header_id,
2009                     l_trx_line_id,
2010                     l_error_message,
2011                     l_invalid_value;
2012                 exit when ar_invoice_err_cur%NOTFOUND;
2013 
2014                 l_ar_error_counter := l_ar_error_counter + 1;
2015 
2016                 if l_ar_error_counter = 1 then
2017                     FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_FAIL');
2018                     FND_MESSAGE.SET_TOKEN('MSG', l_msg_data);
2019                     FND_MSG_PUB.Add;
2020                     LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2021                 end if;
2022 
2023                 FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_ERROR');
2024                 FND_MESSAGE.SET_TOKEN('ERR', l_error_message);
2025                 FND_MESSAGE.SET_TOKEN('VALUE', l_invalid_value);
2026                 FND_MESSAGE.SET_TOKEN('HEADER', l_trx_header_id);
2027                 FND_MESSAGE.SET_TOKEN('LINE', l_trx_line_id);
2028                 FND_MSG_PUB.Add;
2029                 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2030 
2031             END LOOP;
2032 
2033             close ar_invoice_err_cur;
2034 
2035             if l_ar_error_counter = 0 then
2036                 LogMessage(FND_LOG.LEVEL_ERROR, 'No AR errors found.');
2037             end if;
2038 
2039             RAISE FND_API.G_EXC_ERROR;
2040     END;
2041 
2042     l_end := sysdate;
2043     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Invoice API timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
2044 
2045     l_batch_id := ar_invoice_api_pub.g_api_outputs.batch_id;
2046 
2047     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2048     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2049     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_batch_id: ' || l_batch_id);
2050 
2051     l_ar_error_counter := 0;
2052     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
2053 
2054         l_ar_error_counter := 1;
2055     	FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_FAIL');
2056     	FND_MESSAGE.SET_TOKEN('MSG', l_msg_data);
2057 		FND_MSG_PUB.Add;
2058         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2059 
2060     END IF;
2061 
2062     /* query AR errors */
2063     open ar_invoice_err_cur;
2064 
2065     LOOP
2066 
2067         fetch ar_invoice_err_cur into
2068             l_trx_header_id,
2069             l_trx_line_id,
2070             l_error_message,
2071             l_invalid_value;
2072         exit when ar_invoice_err_cur%NOTFOUND;
2073 
2074         l_ar_error_counter := l_ar_error_counter + 1;
2075         FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_ERROR');
2076         FND_MESSAGE.SET_TOKEN('ERR', l_error_message);
2077         FND_MESSAGE.SET_TOKEN('VALUE', l_invalid_value);
2078         FND_MESSAGE.SET_TOKEN('HEADER', l_trx_header_id);
2079         FND_MESSAGE.SET_TOKEN('LINE', l_trx_line_id);
2080         FND_MSG_PUB.Add;
2081         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2082 
2083     END LOOP;
2084 
2085     close ar_invoice_err_cur;
2086 
2087     if l_ar_error_counter > 0  then
2088 	    RAISE FND_API.G_EXC_ERROR;
2089     else
2090         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoices successfully created!') ;
2091     end if;
2092 
2093     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fetching inserted ar invoice details...');
2094 
2095     /* query for cust_trx_id(s) and payment_schedule_id(s) */
2096     open ar_invoices_cur(l_batch_id);
2097 
2098     l_Count2 := 0; -- counter
2099 
2100     LOOP
2101 
2102         fetch ar_invoices_cur into
2103             l_customer_trx_id,
2104             l_trx_number,
2105             l_customer_trx_line_id,
2106             l_payment_schedule_id,
2107             l_due_date,
2108             l_amount,
2109             l_line_type,
2110             l_payment_order;
2111         exit when ar_invoices_cur%NOTFOUND;
2112 
2113         l_Count2 := l_Count2+1;
2114         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Trx ' || l_Count2 ||'; trx_number: ' || l_trx_number);
2115         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_ID: ' || l_customer_trx_id);
2116         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_LINE_ID: ' || l_customer_trx_line_id);
2117         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || l_payment_schedule_id);
2118         LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_due_date);
2119         LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMOUNT: ' || l_amount);
2120         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_line_type);
2121         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_ORDER: ' || l_payment_order);
2122 
2123         if l_payment_schedule_id is null then
2124             LogMessage(FND_LOG.LEVEL_ERROR, 'WARNING: Invoice ' || l_trx_number || '(id ' || l_customer_trx_id || ') ' ||  l_line_type || ' is incomplete!');
2125         end if;
2126 
2127         if l_line_type = 'PRIN' then
2128             l_principal_trx_id := l_customer_trx_id;
2129         elsif l_line_type = 'INT' then
2130             l_interest_trx_id := l_customer_trx_id;
2131         elsif l_line_type = 'FEE' then
2132             l_fee_trx_id := l_customer_trx_id;
2133         end if;
2134 
2135         /* search right record in l_new_lines_tbl table and set AR info */
2136         FOR l_Count3 IN 1..l_new_lines_tbl.COUNT LOOP
2137 
2138             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
2139 
2140                 l_new_lines_tbl(l_Count3).CUSTOMER_TRX_ID := l_customer_trx_id;
2141                 l_new_lines_tbl(l_Count3).PAYMENT_SCHEDULE_ID := l_payment_schedule_id;
2142                 l_new_lines_tbl(l_Count3).CUSTOMER_TRX_LINE_ID := l_customer_trx_line_id;
2143 
2144                 /* inserting new record into LNS_AMORTIZATION_LINES */
2145                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Inserting new record into LNS_AMORTIZATION_LINES w following values:');
2146                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_SCHEDULE_ID: ' || P_LOAN_REC.NEXT_AMORTIZATION_ID);
2147                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_LOAN_REC.LOAN_ID);
2148                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_line_type);
2149                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMOUNT: ' || l_amount);
2150                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_ID: ' || l_customer_trx_id);
2151                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_LINE_ID: ' || l_customer_trx_line_id);
2152                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_ID: ' || l_new_lines_tbl(l_Count3).LINE_REF_ID);
2153                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_SCHEDULE_ID: ' || l_new_lines_tbl(l_Count3).FEE_SCHEDULE_ID);
2154 
2155                 l_amortization_line_id := null;
2156                 LNS_AMORTIZATION_LINES_PKG.Insert_Row(
2157                     X_AMORTIZATION_LINE_ID => l_amortization_line_id
2158                     ,P_AMORTIZATION_SCHEDULE_ID => P_LOAN_REC.NEXT_AMORTIZATION_ID
2159                     ,P_LOAN_ID	=> P_LOAN_REC.LOAN_ID
2160                     ,P_LINE_TYPE => l_line_type
2161                     ,P_AMOUNT => l_amount
2162                     ,P_CUST_TRX_ID => l_customer_trx_id
2163                     ,P_CUST_TRX_LINE_ID => l_customer_trx_line_id
2164                     ,P_FEE_ID => l_new_lines_tbl(l_Count3).LINE_REF_ID
2165                     ,P_OBJECT_VERSION_NUMBER => 1
2166                     ,P_FEE_SCHEDULE_ID => l_new_lines_tbl(l_Count3).FEE_SCHEDULE_ID);
2167 
2168                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_LINE_ID: ' || l_amortization_line_id);
2169                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully inserted record into LNS_AMORTIZATION_LINES');
2170 
2171                 exit;
2172 
2173             end if;
2174 
2175         END LOOP;
2176 
2177     END LOOP;
2178 
2179     close ar_invoices_cur;
2180 
2181     if l_Count2 = 0 then
2182 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No AR invoices fetched');
2183     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INV_FETCHED');
2184 		FND_MSG_PUB.Add;
2185         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2186         RAISE FND_API.G_EXC_ERROR;
2187     end if;
2188 
2189     /* Update interest and fee trxs with principal_trx_id as RELATED_CUSTOMER_TRX_ID */
2190     if g_multiple_lines = 'N' and l_principal_trx_id is not null then
2191 
2192         if l_interest_trx_id is not null then
2193 
2194             update RA_CUSTOMER_TRX_ALL set RELATED_CUSTOMER_TRX_ID = l_principal_trx_id where CUSTOMER_TRX_ID = l_interest_trx_id;
2195 
2196             if (sql%notfound) then
2197 --                LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Update RA_CUSTOMER_TRX_ALL with RELATED_CUSTOMER_TRX_ID failed');
2198             	FND_MESSAGE.SET_NAME('LNS', 'LNS_RELATE_INV_FAIL');
2199         		FND_MSG_PUB.Add;
2200                 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2201                 RAISE FND_API.G_EXC_ERROR;
2202             end if;
2203 
2204         end if;
2205 
2206         if l_fee_trx_id is not null then
2207 
2208             update RA_CUSTOMER_TRX_ALL set RELATED_CUSTOMER_TRX_ID = l_principal_trx_id where CUSTOMER_TRX_ID = l_fee_trx_id;
2209 
2210             if (sql%notfound) then
2211 --                LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Update RA_CUSTOMER_TRX_ALL with RELATED_CUSTOMER_TRX_ID failed');
2212             	FND_MESSAGE.SET_NAME('LNS', 'LNS_RELATE_INV_FAIL');
2213         		FND_MSG_PUB.Add;
2214                 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2215                 RAISE FND_API.G_EXC_ERROR;
2216             end if;
2217 
2218         end if;
2219 
2220     end if;
2221 
2222     /* Update amortization table with new principal, interest and fee ids */
2223 
2224     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_AMORTIZATION_SCHEDS with new trx ids:');
2225     LogMessage(FND_LOG.LEVEL_STATEMENT, 'principal_trx_id: ' || l_principal_trx_id);
2226     LogMessage(FND_LOG.LEVEL_STATEMENT, 'interest_trx_id: ' || l_interest_trx_id);
2227     LogMessage(FND_LOG.LEVEL_STATEMENT, 'fee_trx_id: ' || l_fee_trx_id);
2228 
2229     LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
2230         P_AMORTIZATION_SCHEDULE_ID  => P_LOAN_REC.NEXT_AMORTIZATION_ID
2231 	    ,P_PRINCIPAL_TRX_ID	        => l_principal_trx_id
2232 	    ,P_INTEREST_TRX_ID	        => l_interest_trx_id
2233 	    ,P_FEE_TRX_ID	            => l_fee_trx_id);
2234 
2235     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
2236 
2237     P_LINES_TBL := l_new_lines_tbl;
2238     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2239 END;
2240 
2241 
2242 
2243 /*========================================================================
2244  | PRIVATE PROCEDURE CREATE_AR_CM
2245  |
2246  | DESCRIPTION
2247  |      This procedure creates AR credit memos.
2248  |
2249  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2250  |      REVERSE_LAST_AMORTIZATION
2251  |      REVERSE_OFFCYCLE_BILL
2252  |
2253  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2254  |      LogMessage
2255  |
2256  | PARAMETERS
2257  |      P_REVERSE_TBL  IN OUT       Table of records needs to be reversed
2258  |
2259  | KNOWN ISSUES
2260  |      None
2261  |
2262  | NOTES
2263  |      Any interesting aspect of the code in the package body which needs
2264  |      to be stated.
2265  |
2266  | MODIFICATION HISTORY
2267  | Date                  Author            Description of Changes
2268  | 01-01-2004            scherkas          Created
2269  |
2270  *=======================================================================*/
2271 PROCEDURE CREATE_AR_CM(P_REVERSE_TBL  IN OUT NOCOPY  LNS_BILLING_BATCH_PUB.REVERSE_TBL)
2272 IS
2273 
2274 /*-----------------------------------------------------------------------+
2275  | Local Variable Declarations and initializations                       |
2276  +-----------------------------------------------------------------------*/
2277 
2278     l_api_name                      CONSTANT VARCHAR2(30) := 'CREATE_AR_CM';
2279     l_return_status                 VARCHAR2(1);
2280     l_msg_count                     NUMBER;
2281     l_msg_data                      VARCHAR2(32767);
2282     l_Count                         number;
2283     l_Count1                        number;
2284     l_Count2                        number;
2285     l_trx_found                     varchar2(1);
2286     l_request_id                    number;
2287     l_batch_source_name             VARCHAR2(50);
2288     l_cm_batch_source_name          VARCHAR2(50);
2289     l_cm_batch_source_id            number;
2290     l_Count4                        number;
2291 
2292     l_trx_tbl                       DBMS_SQL.NUMBER_TABLE;
2293     l_cm_line_tbl                   AR_CREDIT_MEMO_API_PUB.Cm_Line_Tbl_Type_Cover%type;
2294 
2295 /*-----------------------------------------------------------------------+
2296  | Cursor Declarations                                                   |
2297  +-----------------------------------------------------------------------*/
2298 
2299     /* query for batch_source_name and cm_batch_source_id */
2300     CURSOR batch_source_cur(P_BATCH_SOURCE_ID number) IS
2301         select name, CREDIT_MEMO_BATCH_SOURCE_ID
2302         from RA_BATCH_SOURCES
2303         where batch_source_id = P_BATCH_SOURCE_ID;
2304 
2305     /* query for cm_batch_source_name */
2306     CURSOR cm_batch_source_cur(P_BATCH_SOURCE_ID number) IS
2307         select name
2308         from RA_BATCH_SOURCES
2309         where batch_source_id = P_BATCH_SOURCE_ID;
2310 
2311 BEGIN
2312     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2313 
2314     l_Count1 := 0;
2315     FOR l_Count IN 1..P_REVERSE_TBL.count LOOP
2316 
2317         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Trx Line #' || l_Count);
2318         LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_NUMBER: ' || P_REVERSE_TBL(l_Count).TRX_NUMBER);
2319         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_ID: ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID);
2320         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || P_REVERSE_TBL(l_Count).PAYMENT_SCHEDULE_ID);
2321         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_LINE_ID: ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_LINE_ID);
2322         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || P_REVERSE_TBL(l_Count).LINE_TYPE);
2323         LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_AMOUNT: ' || P_REVERSE_TBL(l_Count).TRX_AMOUNT);
2324         LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLIED_AMOUNT: ' || P_REVERSE_TBL(l_Count).APPLIED_AMOUNT);
2325         LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || P_REVERSE_TBL(l_Count).ORG_ID);
2326 
2327         if P_REVERSE_TBL(l_Count).APPLIED_AMOUNT <> 0 then
2328 
2329 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot reverse because there are some valid activities on trx.');
2330         	FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_REV_BILL');
2331     		FND_MSG_PUB.Add;
2332             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2333             RAISE FND_API.G_EXC_ERROR;
2334 
2335         end if;
2336 
2337         /* searching/adding trx(s) into unique trx table */
2338         l_trx_found := 'N';
2339 
2340         FOR l_Count1 IN 1..l_trx_tbl.count LOOP
2341 
2342             if l_trx_tbl(l_Count1) = P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID then
2343                 l_trx_found := 'Y';
2344                 exit;
2345             end if;
2346 
2347         END LOOP;
2348 
2349         if l_trx_found = 'N' then
2350 
2351             l_Count1 := l_Count1 + 1;
2352             l_trx_tbl(l_Count1) := P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID;
2353             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added trx ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID || ' into unique trx table');
2354 
2355         end if;
2356 
2357     END LOOP;
2358 
2359     LogMessage(FND_LOG.LEVEL_STATEMENT, '______________');
2360     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Total found ' || l_trx_tbl.count || ' unique trx(s)');
2361     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Total found ' || P_REVERSE_TBL.count || ' trx line(s)');
2362 
2363     if P_REVERSE_TBL.count = 0 or l_trx_tbl.count = 0 then
2364 
2365 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No AR transactions found to reverse.');
2366     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_REVERSE');
2367 		FND_MSG_PUB.Add;
2368         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2369         RAISE FND_API.G_EXC_ERROR;
2370 
2371     end if;
2372 
2373     /* query for batch_source_name and cm_batch_source_id */
2374     open batch_source_cur(g_batch_source_id);
2375     fetch batch_source_cur into l_batch_source_name, l_cm_batch_source_id;
2376     close batch_source_cur;
2377 
2378     if l_cm_batch_source_id is null then
2379 
2380     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CM_BATCH');
2381       	FND_MESSAGE.SET_TOKEN('BATCH', l_batch_source_name);
2382 		FND_MSG_PUB.Add;
2383         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2384         RAISE FND_API.G_EXC_ERROR;
2385 
2386     end if;
2387 
2388     /* query for cm_batch_source_name */
2389     open cm_batch_source_cur(l_cm_batch_source_id);
2390     fetch cm_batch_source_cur into l_cm_batch_source_name;
2391     close cm_batch_source_cur;
2392 
2393     --l_batch_source_name := 'Credit Memo';
2394     LogMessage(FND_LOG.LEVEL_STATEMENT, 'batch_source_name: ' || l_batch_source_name);
2395     LogMessage(FND_LOG.LEVEL_STATEMENT, 'cm_batch_source_name: ' || l_cm_batch_source_name);
2396 
2397     /* looping thru table of unique trx(s) */
2398     FOR l_Count1 IN 1..l_trx_tbl.count LOOP
2399 
2400         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Processing trx ' || l_trx_tbl(l_Count1));
2401 
2402         l_cm_line_tbl.delete;
2403         l_Count2 := 0;
2404         l_Count4 := 0;
2405 
2406         FOR l_Count IN 1..P_REVERSE_TBL.count LOOP
2407 
2408             if l_trx_tbl(l_Count1) = P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID then
2409 
2410                 l_Count2 := l_Count2 + 1;
2411                 l_Count4 := l_Count;
2412                 l_cm_line_tbl(l_Count2).customer_trx_line_id := P_REVERSE_TBL(l_Count).CUSTOMER_TRX_LINE_ID;
2413                 l_cm_line_tbl(l_Count2).extended_amount := -P_REVERSE_TBL(l_Count).TRX_AMOUNT;
2414                 l_cm_line_tbl(l_Count2).quantity_credited := 1;
2415                 l_cm_line_tbl(l_Count2).price := -P_REVERSE_TBL(l_Count).TRX_AMOUNT;
2416 
2417                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding a line to cm_line_tbl:');
2418                 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);
2419                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').extended_amount: ' || l_cm_line_tbl(l_Count2).extended_amount);
2420                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').quantity_credited: ' || l_cm_line_tbl(l_Count2).quantity_credited);
2421                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').price: ' || l_cm_line_tbl(l_Count2).price);
2422 
2423             end if;
2424 
2425         END LOOP;
2426 
2427         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST for trx ' || l_trx_tbl(l_Count1));
2428 
2429         AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST(
2430                 P_API_VERSION => 1.0,
2431                 P_INIT_MSG_LIST	=> FND_API.G_TRUE,
2432                 P_COMMIT => FND_API.G_FALSE,
2433                 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
2434                 P_CUSTOMER_TRX_ID => l_trx_tbl(l_Count1),
2435                 P_LINE_CREDIT_FLAG => 'Y',
2436                 P_CM_REASON_CODE => 'CANCELLATION',
2437                 p_cm_line_tbl => l_cm_line_tbl,
2438                 P_SKIP_WORKFLOW_FLAG => 'Y',
2439                 P_CREDIT_METHOD_INSTALLMENTS => null,
2440                 P_CREDIT_METHOD_RULES => null,
2441                 P_BATCH_SOURCE_NAME => l_cm_batch_source_name,
2442                 P_ORG_ID => P_REVERSE_TBL(l_Count4).ORG_ID,
2443                 X_REQUEST_ID => l_request_id,
2444                 X_RETURN_STATUS	=> l_return_status,
2445                 X_MSG_COUNT => l_msg_count,
2446                 X_MSG_DATA => l_msg_data);
2447 
2448         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2449         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2450         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_request_id: ' || l_request_id);
2451 
2452         IF l_return_status = fnd_api.g_ret_sts_error OR l_return_status = fnd_api.g_ret_sts_unexp_error OR
2453            l_request_id is null OR l_request_id = -1
2454 
2455         THEN
2456 
2457 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST raised unexpected error: ' || substr(l_msg_data,1,225));
2458         	FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_CM_FAIL');
2459         	FND_MESSAGE.SET_TOKEN('BATCH', l_cm_batch_source_name);
2460     		FND_MSG_PUB.Add;
2461             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2462             RAISE FND_API.G_EXC_ERROR;
2463 
2464         ELSE
2465 
2466             if l_msg_data is not null then
2467                 g_cr_return_status := 'WARNING';
2468             end if;
2469 
2470             LogMessage(FND_LOG.LEVEL_STATEMENT, 'CM successfully created!') ;
2471 
2472 
2473         END IF;
2474 
2475     END LOOP;
2476 
2477     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2478 END;
2479 
2480 
2481 
2482 /*========================================================================
2483  | PRIVATE PROCEDURE APPLY_RECEIPT
2484  |
2485  | DESCRIPTION
2486  |      This procedure applies cash receipt to invoice.
2487  |
2488  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2489  |      CREATE_SINGLE_OFFCYCLE_BILL
2490  |
2491  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2492  |      LogMessage
2493  |
2494  | PARAMETERS
2495  |      P_CASH_RECEIPT_ID   IN      Cash receipt to apply
2496  |      P_TRX_ID            IN      Apply receipt to this trx
2497  |      P_TRX_LINE_ID       IN      Apply receipt to this trx line
2498  |      P_APPLY_AMOUNT      IN      Apply amount
2499  |
2500  | KNOWN ISSUES
2501  |      None
2502  |
2503  | NOTES
2504  |      Any interesting aspect of the code in the package body which needs
2505  |      to be stated.
2506  |
2507  | MODIFICATION HISTORY
2508  | Date                  Author            Description of Changes
2509  | 01-01-2004            scherkas          Created
2510  |
2511  *=======================================================================*/
2512 PROCEDURE APPLY_RECEIPT(P_CASH_RECEIPT_ID   IN      NUMBER,
2513                         P_TRX_ID            IN      NUMBER,
2514                         P_TRX_LINE_ID       IN      NUMBER,
2515                         P_APPLY_AMOUNT      IN      NUMBER)
2516 IS
2517 
2518 /*-----------------------------------------------------------------------+
2519  | Local Variable Declarations and initializations                       |
2520  +-----------------------------------------------------------------------*/
2521 
2522     l_api_name                      CONSTANT VARCHAR2(30) := 'APPLY_RECEIPT';
2523     l_return_status                 VARCHAR2(1);
2524     l_msg_count                     NUMBER;
2525     l_msg_data                      VARCHAR2(32767);
2526     l_receipt_rem_amount            number;
2527 
2528 /*-----------------------------------------------------------------------+
2529  | Cursor Declarations                                                   |
2530  +-----------------------------------------------------------------------*/
2531 
2532     CURSOR receipt_cur(P_RECEIPT_ID number) IS
2533         select ABS(AMOUNT_DUE_REMAINING)
2534         from ar_payment_schedules
2535         where CASH_RECEIPT_ID = P_RECEIPT_ID
2536         and status = 'OP'
2537         and class = 'PMT';
2538 
2539 BEGIN
2540 
2541     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2542     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Applying cash receipt ' || P_CASH_RECEIPT_ID);
2543 
2544     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input data:');
2545     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_CASH_RECEIPT_ID: ' || P_CASH_RECEIPT_ID);
2546     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_TRX_ID: ' || P_TRX_ID);
2547     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_TRX_LINE_ID: ' || P_TRX_LINE_ID);
2548     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_APPLY_AMOUNT: ' || P_APPLY_AMOUNT);
2549 
2550     /* verify input data */
2551 
2552     if P_CASH_RECEIPT_ID is null then
2553 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cash Receipt ID is not set.');
2554     	FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_NOT_SET');
2555 		FND_MSG_PUB.Add;
2556         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2557         RAISE FND_API.G_EXC_ERROR;
2558     end if;
2559 
2560     if P_TRX_ID is null then
2561 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Trx ID is not set.');
2562     	FND_MESSAGE.SET_NAME('LNS', 'LNS_TRX_NOT_SET');
2563 		FND_MSG_PUB.Add;
2564         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2565         RAISE FND_API.G_EXC_ERROR;
2566     end if;
2567 
2568     if P_TRX_LINE_ID is null then
2569 --        LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Trx Line ID is not set.');
2570     	FND_MESSAGE.SET_NAME('LNS', 'LNS_TRX_LINE_NOT_SET');
2571 		FND_MSG_PUB.Add;
2572         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2573         RAISE FND_API.G_EXC_ERROR;
2574     end if;
2575 
2576     if P_APPLY_AMOUNT is null or P_APPLY_AMOUNT <= 0 then
2577 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Apply Amount is not set.');
2578     	FND_MESSAGE.SET_NAME('LNS', 'LNS_AMOUNT_NOT_SET');
2579 		FND_MSG_PUB.Add;
2580         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2581         RAISE FND_API.G_EXC_ERROR;
2582     end if;
2583 
2584     /* verifying requested qpply amount */
2585 
2586     open receipt_cur(P_CASH_RECEIPT_ID);
2587     fetch receipt_cur into l_receipt_rem_amount;
2588 
2589     if receipt_cur%NOTFOUND then
2590 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No receipt found to apply.');
2591     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CR_FOUND');
2592 		FND_MSG_PUB.Add;
2593         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2594         RAISE FND_API.G_EXC_ERROR;
2595     end if;
2596 
2597     close receipt_cur;
2598 
2599     if l_receipt_rem_amount < P_APPLY_AMOUNT then
2600 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The receipt does not have enough funds to apply requested amount.');
2601     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CR_FUNDS');
2602 		FND_MSG_PUB.Add;
2603         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2604         RAISE FND_API.G_EXC_ERROR;
2605     end if;
2606 
2607     /* Applying cash receipt to invoice */
2608 /*
2609     AR_RECEIPT_API_PUB.APPLY(
2610         P_API_VERSION => 1.0,
2611         P_INIT_MSG_LIST => FND_API.G_FALSE,
2612         P_COMMIT => FND_API.G_TRUE,
2613         X_RETURN_STATUS => L_RETURN_STATUS,
2614         X_MSG_COUNT => L_MSG_COUNT,
2615         X_MSG_DATA => L_MSG_DATA,
2616         p_cash_receipt_id => P_CASH_RECEIPT_ID,
2617         p_customer_trx_id => P_TRX_ID,
2618         p_amount_applied => P_APPLY_AMOUNT,
2619         p_customer_trx_line_id => P_TRX_LINE_ID);
2620 */
2621     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2622     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2623 
2624     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2625 
2626 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: AR_RECEIPT_API_PUB.APPLY raised error: ' || substr(l_msg_data,1,225));
2627     	FND_MESSAGE.SET_NAME('LNS', 'LNS_APPL_CR_FAIL');
2628 		FND_MSG_PUB.Add;
2629         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2630         RAISE FND_API.G_EXC_ERROR;
2631 
2632     ELSE
2633         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully applied cash receipt to trx ' || P_TRX_ID || ' line ' || P_TRX_LINE_ID);
2634     END IF;
2635 
2636     -- END OF BODY OF API
2637 
2638     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2639 
2640 EXCEPTION
2641     WHEN OTHERS THEN
2642         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to apply cash receipt to trx ' || P_TRX_ID || ' line ' || P_TRX_LINE_ID);
2643 
2644 END;
2645 
2646 
2647 
2648 
2649 /*========================================================================
2650  | PRIVATE PROCEDURE CREATE_AR_ADJ
2651  |
2652  | DESCRIPTION
2653  |      This procedure creates AR adjustment.
2654  |
2655  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2656  |      CREATE_SINGLE_OFFCYCLE_BILL
2657  |
2658  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2659  |      LogMessage
2660  |
2661  | PARAMETERS
2662  |      P_TYPE                  IN      Adjustment type
2663  |      P_PAYMENT_SCHEDULE_ID   IN      Payment schedule ID
2664  |      P_RECEIVABLES_TRX_ID    IN      Receivables trx ID
2665  |      P_AMOUNT                IN      Adjust amount
2666  |      P_CUSTOMER_TRX_LINE_ID  IN      Trx line ID
2667  |      P_CODE_COMBINATION_ID   IN      Code combination ID
2668  |      P_USSGL_TRX_CODE        IN      USSGL Trx code
2669  |      P_REASON_CODE           IN      Adjust reason
2670  |      P_COMMENTS              IN      Adjust comments
2671  |      X_ADJ_ID                OUT     Adjust comments
2672  |      X_ADJ_NUMBER            OUT     Adjust comments
2673  |
2674  | KNOWN ISSUES
2675  |      None
2676  |
2677  | NOTES
2678  |      Any interesting aspect of the code in the package body which needs
2679  |      to be stated.
2680  |
2681  | MODIFICATION HISTORY
2682  | Date                  Author            Description of Changes
2683  | 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
2684  | 01-01-2004            scherkas          Created
2685  |
2686  *=======================================================================*/
2687 PROCEDURE CREATE_AR_ADJ(P_TYPE                  IN  VARCHAR2,
2688                         P_PAYMENT_SCHEDULE_ID   IN  NUMBER,
2689                         P_RECEIVABLES_TRX_ID    IN  NUMBER,
2690                         P_AMOUNT                IN  NUMBER,
2691                         P_APPLY_DATE            IN  DATE,
2692                         P_GL_DATE               IN  DATE,
2693                         P_CUSTOMER_TRX_LINE_ID  IN  NUMBER,
2694                         P_CODE_COMBINATION_ID   IN  NUMBER,
2695                         P_USSGL_TRX_CODE        IN  VARCHAR2,
2696                         P_REASON_CODE           IN  VARCHAR2,
2697                         P_COMMENTS              IN  VARCHAR2,
2698                         X_ADJ_ID                OUT NOCOPY NUMBER,
2699                         X_ADJ_NUMBER            OUT NOCOPY VARCHAR2,
2700                         P_ORG_ID                IN  NUMBER)
2701 IS
2702 
2703 /*-----------------------------------------------------------------------+
2704  | Local Variable Declarations and initializations                       |
2705  +-----------------------------------------------------------------------*/
2706 
2707     l_api_name                      CONSTANT VARCHAR2(30) := 'CREATE_AR_ADJ';
2708     l_return_status                 VARCHAR2(1);
2709     l_msg_count                     NUMBER;
2710     l_msg_data                      VARCHAR2(32767);
2711     l_adj_rec                       ar_adjustments%rowtype;
2712     l_adj_num                       varchar2(20);
2713     l_adj_id                        number;
2714     l_index                         number := 0;
2715     l_indexNo                       number := 1;
2716     l_msg                           varchar2(4000) := null;
2717 
2718 /*-----------------------------------------------------------------------+
2719  | Cursor Declarations                                                   |
2720  +-----------------------------------------------------------------------*/
2721 
2722 
2723 BEGIN
2724 
2725     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2726     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adjusting invoice...');
2727 
2728     l_adj_rec.type := 'INVOICE'; --P_TYPE; --karamach Bug5092620
2729     l_adj_rec.payment_schedule_id := P_PAYMENT_SCHEDULE_ID;
2730     l_adj_rec.RECEIVABLES_TRX_ID := P_RECEIVABLES_TRX_ID;
2731     l_adj_rec.apply_date := P_APPLY_DATE;
2732     l_adj_rec.gl_date := P_GL_DATE;
2733     l_adj_rec.created_from := G_PKG_NAME;
2734     l_adj_rec.amount := P_AMOUNT;
2735     l_adj_rec.customer_trx_line_id := P_CUSTOMER_TRX_LINE_ID;
2736     l_adj_rec.code_combination_id := P_CODE_COMBINATION_ID;
2737     l_adj_rec.ussgl_transaction_code := P_USSGL_TRX_CODE;
2738     l_adj_rec.reason_code := P_REASON_CODE;
2739     l_adj_rec.comments := P_COMMENTS;
2740     l_adj_rec.org_id := P_ORG_ID;
2741 
2742     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Sending following data to adjustment api:');
2743     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.type: ' || l_adj_rec.type);
2744     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.payment_schedule_id: ' || l_adj_rec.payment_schedule_id);
2745     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.RECEIVABLES_TRX_ID: ' || l_adj_rec.RECEIVABLES_TRX_ID);
2746     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.apply_date: ' || l_adj_rec.apply_date);
2747     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.gl_date: ' || l_adj_rec.gl_date);
2748     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.created_from: ' || l_adj_rec.created_from);
2749     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.amount: ' || l_adj_rec.amount);
2750     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.customer_trx_line_id: ' || l_adj_rec.customer_trx_line_id);
2751     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.code_combination_id: ' || l_adj_rec.code_combination_id);
2752     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.ussgl_transaction_code: ' || l_adj_rec.ussgl_transaction_code);
2753     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.reason_code: ' || l_adj_rec.reason_code);
2754     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.comments: ' || l_adj_rec.comments);
2755     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.org_id: ' || l_adj_rec.org_id);
2756 
2757     /* Adjusting invoice */
2758 
2759     AR_ADJUST_PUB.Create_Adjustment(
2760         p_api_name => 'AR_ADJUST_PUB',
2761         p_api_version => 1.0,
2762         p_init_msg_list => FND_API.G_TRUE,
2763         p_commit_flag => FND_API.G_FALSE,
2764         p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2765         p_msg_count => l_msg_count,
2766         p_msg_data => l_msg_data,
2767         p_return_status => l_return_status,
2768         p_adj_rec => l_adj_rec,
2769         p_chk_approval_limits => 'F',
2770         p_check_amount => 'F', --karamach Bug5092620
2771         p_new_adjust_number => l_adj_num,
2772         p_new_adjust_id => l_adj_id,
2773         p_org_id => P_ORG_ID);
2774 
2775     X_ADJ_ID := l_adj_id;
2776     X_ADJ_NUMBER := l_adj_num;
2777 
2778     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2779 
2780     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2781 
2782         while (l_indexNo <= l_msg_Count ) loop
2783             fnd_msg_pub.get(l_indexNo, 'F', l_msg, l_index);
2784             LogMessage(FND_LOG.LEVEL_ERROR, 'Error: ' || l_msg);
2785             l_indexNo := l_indexNo + 1;
2786         End Loop;
2787 
2788         RAISE FND_API.G_EXC_ERROR;
2789 
2790     END IF;
2791 
2792     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2793 
2794 END;
2795 
2796 
2797 
2798 
2799 /*========================================================================
2800  | PRIVATE PROCEDURE BUILD_ERROR_STATEMENT
2801  |
2802  | DESCRIPTION
2803  |      This procedure builds error statement.
2804  |
2805  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2806  |
2807  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2808  |      LogMessage
2809  |
2810  | PARAMETERS
2811  |       P_BORROWER_ID         IN             Bborrower ID
2812  |       P_LOAN_ID             IN             Loans ID
2813  |       P_FROM_DAYS_TO_DD     IN             From days
2814  |       P_TO_DAYS_TO_DD       IN             To days
2815  |       X_REPORT_XML          OUT NOCOPY     Return full report xml
2816  |
2817  | KNOWN ISSUES
2818  |      None
2819  |
2820  | NOTES
2821  |      Any interesting aspect of the code in the package body which needs
2822  |      to be stated.
2823  |
2824  | MODIFICATION HISTORY
2825  | Date                  Author            Description of Changes
2826  | 04-21-2005            scherkas          Created
2827  |
2828  *=======================================================================*/
2829 PROCEDURE BUILD_ERROR_STATEMENT(
2830         P_LOAN_ID           IN              NUMBER,
2831         P_PAYMENT_NUMBER    IN              NUMBER,
2832         P_PRIN_AMOUNT_DUE   IN              NUMBER,
2833         P_INT_AMOUNT_DUE    IN              NUMBER,
2834         P_FEE_AMOUNT_DUE    IN              NUMBER,
2835         P_DUE_DATE          IN              DATE,
2836         P_ERR_COUNT			IN              NUMBER,
2837         X_STATEMENT_XML     OUT NOCOPY      CLOB)
2838 IS
2839 
2840 /*-----------------------------------------------------------------------+
2841  | Local Variable Declarations and initializations                       |
2842  +-----------------------------------------------------------------------*/
2843 
2844     l_api_name          CONSTANT VARCHAR2(30) := 'BUILD_ERROR_STATEMENT';
2845     l_new_line          varchar2(1);
2846     l_statement         varchar2(2000);
2847     l_borrower          VARCHAR2(360);
2848     l_loan              VARCHAR2(60);
2849     l_currency          VARCHAR2(15);
2850     l_f_prin_amount     varchar2(50);
2851     l_f_int_amount      varchar2(50);
2852     l_f_fee_amount      varchar2(50);
2853     l_f_sum_amount      varchar2(50);
2854     l_index             number;
2855     l_indexNo           number;
2856     l_error             varchar2(500);
2857 /*-----------------------------------------------------------------------+
2858  | Cursor Declarations                                                   |
2859  +-----------------------------------------------------------------------*/
2860 
2861     /* query for loan number and borrower name */
2862     CURSOR loan_cur(P_LOAN_ID number, P_PRIN_AMOUNT_DUE number, P_INT_AMOUNT_DUE number, P_FEE_AMOUNT_DUE number) IS
2863         select party.party_name,
2864         loan.loan_number,
2865         loan.LOAN_CURRENCY,
2866         to_char(P_PRIN_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
2867         to_char(P_INT_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
2868         to_char(P_FEE_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
2869         to_char((P_PRIN_AMOUNT_DUE + P_INT_AMOUNT_DUE + P_FEE_AMOUNT_DUE), FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50))
2870         from lns_loan_headers loan,
2871         hz_parties party
2872         where party.party_id = loan.PRIMARY_BORROWER_ID and
2873         loan.loan_id = P_LOAN_ID;
2874 
2875 BEGIN
2876 
2877     l_index := 0;
2878     l_indexNo := 1;
2879     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
2880     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2881 
2882     l_new_line := '
2883 ';
2884 
2885     /* query for loan number and borrower name */
2886     open loan_cur(P_LOAN_ID, P_PRIN_AMOUNT_DUE, P_INT_AMOUNT_DUE, P_FEE_AMOUNT_DUE);
2887     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;
2888     close loan_cur;
2889     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_borrower: ' || l_borrower);
2890     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan: ' || l_loan);
2891 
2892     /* build error */
2893     l_statement := '<LOAN>';
2894     l_statement := l_statement || l_new_line || '<LOAN_ID>' || P_LOAN_ID || '</LOAN_ID>';
2895     l_statement := l_statement || l_new_line || '<BILL_DATE>' || sysdate || '</BILL_DATE>';
2896     l_statement := l_statement || l_new_line || '<LOAN_NUMBER>' || l_loan || '</LOAN_NUMBER>';
2897     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_NUMBER>' || P_PAYMENT_NUMBER || '</NEXT_PAYMENT_NUMBER>';
2898     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_DUE_DATE>' || P_DUE_DATE || '</NEXT_PAYMENT_DUE_DATE>';
2899     l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_PRINCIPAL_DUE>' || l_f_prin_amount || '</F_NEXT_PAYMENT_PRINCIPAL_DUE>';
2900     l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_INTEREST_DUE>' || l_f_int_amount || '</F_NEXT_PAYMENT_INTEREST_DUE>';
2901     l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_FEE_DUE>' || l_f_fee_amount || '</F_NEXT_PAYMENT_FEE_DUE>';
2902     l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_TOTAL_DUE>' || l_f_sum_amount || '</F_NEXT_PAYMENT_TOTAL_DUE>';
2903     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_PRINCIPAL_DUE>' || P_PRIN_AMOUNT_DUE || '</NEXT_PAYMENT_PRINCIPAL_DUE>';
2904     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_INTEREST_DUE>' || P_INT_AMOUNT_DUE || '</NEXT_PAYMENT_INTEREST_DUE>';
2905     l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_FEE_DUE>' || P_FEE_AMOUNT_DUE || '</NEXT_PAYMENT_FEE_DUE>';
2906     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>';
2907     l_statement := l_statement || l_new_line || '<BORROWER_NAME>' || l_borrower || '</BORROWER_NAME>';
2908     l_statement := l_statement || l_new_line || '<LOAN_CURRENCY_CODE>' || l_currency || '</LOAN_CURRENCY_CODE>';
2909 
2910     l_statement := l_statement || l_new_line || '<ERROR>' || l_new_line;
2911     while (l_indexNo <= P_ERR_COUNT ) loop
2912         fnd_msg_pub.get(l_indexNo, 'F', l_error, l_index);
2913         l_error := REPLACE(l_error, '&', '');
2914         l_statement := l_statement || l_error;
2915         l_indexNo := l_indexNo + 1;
2916     End Loop;
2917     l_statement := l_statement || '</ERROR>';
2918 
2919     l_statement := l_statement || l_new_line || '</LOAN>';
2920     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_statement: ' || l_statement);
2921 
2922     /* init statement xml */
2923     DBMS_LOB.createtemporary(X_STATEMENT_XML, FALSE, DBMS_LOB.CALL);
2924     DBMS_LOB.open(X_STATEMENT_XML, DBMS_LOB.lob_readwrite);
2925 
2926     /* building clob */
2927     DBMS_LOB.write(X_STATEMENT_XML, length(l_statement), 1, l_statement);
2928 
2929     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2930 
2931 EXCEPTION
2932     WHEN OTHERS THEN
2933         LogMessage(FND_LOG.LEVEL_ERROR, 'Failed to generate error statement for loan ' || l_loan);
2934 END;
2935 
2936 
2937 
2938 
2939 /*========================================================================
2940  | PRIVATE PROCEDURE BUILD_BILLING_REPORT
2941  |
2942  | DESCRIPTION
2943  |      This procedure builds billing report.
2944  |
2945  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2946  |
2947  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2948  |      LogMessage
2949  |
2950  | PARAMETERS
2951  |       P_BORROWER_ID         IN             Bborrower ID
2952  |       P_LOAN_ID             IN             Loans ID
2953  |       P_FROM_DAYS_TO_DD     IN             From days
2954  |       P_TO_DAYS_TO_DD       IN             To days
2955  |       X_REPORT_XML          OUT NOCOPY     Return full report xml
2956  |
2957  | KNOWN ISSUES
2958  |      None
2959  |
2960  | NOTES
2961  |      Any interesting aspect of the code in the package body which needs
2962  |      to be stated.
2963  |
2964  | MODIFICATION HISTORY
2965  | Date                  Author            Description of Changes
2966  | 04-21-2005            scherkas          Created
2967  |
2968  *=======================================================================*/
2969 PROCEDURE BUILD_BILLING_REPORT(
2970         P_BORROWER_ID         IN             NUMBER,
2971         P_LOAN_ID             IN             NUMBER,
2972         P_FROM_DAYS_TO_DD     IN             NUMBER,
2973         P_TO_DAYS_TO_DD       IN             NUMBER,
2974         P_STATEMENTS_XML      IN             CLOB)
2975 IS
2976 
2977 /*-----------------------------------------------------------------------+
2978  | Local Variable Declarations and initializations                       |
2979  +-----------------------------------------------------------------------*/
2980 
2981     l_api_name      CONSTANT VARCHAR2(30) := 'BUILD_BILLING_REPORT';
2982     l_new_line      varchar2(1);
2983     l_header        varchar2(1000);
2984     l_footer        varchar2(100);
2985     l_parameters    varchar2(1000);
2986     l_borrower      VARCHAR2(360);
2987     l_loan          VARCHAR2(60);
2988     l_from_days     varchar2(50);
2989     l_to_days       varchar2(50);
2990     l_org_name      VARCHAR2(240);
2991 /*-----------------------------------------------------------------------+
2992  | Cursor Declarations                                                   |
2993  +-----------------------------------------------------------------------*/
2994 
2995     /* query for borrower name */
2996     CURSOR borrower_cur(P_BORROWER_ID number) IS
2997     select party_name from hz_parties party where party_id = P_BORROWER_ID;
2998 
2999     /* query for loan number */
3000     CURSOR loan_cur(P_LOAN_ID number) IS
3001     select loan_number from lns_loan_headers where loan_id = P_LOAN_ID;
3002 
3003     /* query for org name */
3004     CURSOR org_cur(P_ORG_ID number) IS
3005     select name
3006     from hr_all_organization_units_tl
3007     where ORGANIZATION_ID = P_ORG_ID and
3008     language(+) = userenv('LANG');
3009 
3010 BEGIN
3011 
3012     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
3013     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3014 
3015     /* init report clob */
3016     dbms_lob.createtemporary(g_last_billing_report, FALSE, DBMS_LOB.CALL);
3017     dbms_lob.open(g_last_billing_report, dbms_lob.lob_readwrite);
3018 
3019     l_new_line := '
3020 ';
3021     l_header := '<?xml version="1.0" encoding="UTF-8"?>' || l_new_line || '<BILLBATCH>';
3022     l_footer := l_new_line || '</BILLBATCH>' || l_new_line;
3023     l_parameters := l_new_line || '<PARAMETERS>';
3024 
3025     /* adding org name to parameter list */
3026     open org_cur(g_org_id);
3027     fetch org_cur into l_org_name;
3028     close org_cur;
3029     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_org_name: ' || l_org_name);
3030     l_parameters := l_parameters || l_new_line || '<ORG_NAME>' || l_org_name || '</ORG_NAME>';
3031 
3032     /* adding borrower to parameter list */
3033     if P_BORROWER_ID is not null then
3034         open borrower_cur(P_BORROWER_ID);
3035         fetch borrower_cur into l_borrower;
3036         close borrower_cur;
3037     end if;
3038     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_borrower: ' || l_borrower);
3039     l_parameters := l_parameters || l_new_line || '<BORROWER_NAME>' || l_borrower || '</BORROWER_NAME>';
3040 
3041     /* adding loan to parameter list */
3042     if P_LOAN_ID is not null then
3043         open loan_cur(P_LOAN_ID);
3044         fetch loan_cur into l_loan;
3045         close loan_cur;
3046     end if;
3047     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan: ' || l_loan);
3048     l_parameters := l_parameters || l_new_line || '<LOAN_NUMBER>' || l_loan || '</LOAN_NUMBER>';
3049 
3050     /* adding from days to parameter list */
3051     if P_FROM_DAYS_TO_DD is not null then
3052         l_from_days := P_FROM_DAYS_TO_DD || GET_BILLING_DATE(P_FROM_DAYS_TO_DD);
3053     end if;
3054     l_parameters := l_parameters || l_new_line || '<FROM_DAYS_TO_DD>' || l_from_days || '</FROM_DAYS_TO_DD>';
3055 
3056     /* adding to days to parameter list */
3057     if P_TO_DAYS_TO_DD is not null then
3058         l_to_days := P_TO_DAYS_TO_DD || GET_BILLING_DATE(P_TO_DAYS_TO_DD);
3059     end if;
3060     l_parameters := l_parameters || l_new_line || '<TO_DAYS_TO_DD>' || l_to_days || '</TO_DAYS_TO_DD>';
3061     l_parameters := l_parameters || l_new_line || '</PARAMETERS>' || l_new_line;
3062     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_parameters: ' || l_parameters);
3063 
3064 
3065     /* add header to billing report */
3066     DBMS_LOB.write(g_last_billing_report, length(l_header), 1, l_header);
3067     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added header to report');
3068 
3069     /* add parameters to billing report */
3070     dbms_lob.writeAppend(g_last_billing_report, length(l_parameters), l_parameters);
3071     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added parameters to report');
3072 
3073     /* add all statements to billing report */
3074     if dbms_lob.getlength(P_STATEMENTS_XML) > 0 then
3075         DBMS_LOB.Append(g_last_billing_report, P_STATEMENTS_XML);
3076         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added statements to report');
3077     end if;
3078 
3079     /* add footer to billing report */
3080     dbms_lob.writeAppend(g_last_billing_report, length(l_footer), l_footer);
3081     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added footer to report');
3082 
3083     /* print report to output file */
3084     LNS_REP_UTILS.PRINT_CLOB(g_last_billing_report);  -- fix for bug 6938098
3085     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Printed report into output file.');
3086 
3087     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3088 
3089 EXCEPTION
3090     WHEN OTHERS THEN
3091         LogMessage(FND_LOG.LEVEL_ERROR, 'Failed to generate billing report');
3092         g_cr_return_status := 'WARNING';
3093 END;
3094 
3095 
3096 
3097 /*========================================================================
3098  | PUBLIC PROCEDURE GENERATE_BILLING_STATEMENT_XML
3099  |
3100  | DESCRIPTION
3101  |      This procedure creates the billing statement xml for single loan
3102  |
3103  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3104  |      BILL_SINGLE_LOAN
3105  |
3106  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3107  |      LogMessage
3108  |
3109  | PARAMETERS
3110  |      P_LOAN_ID IN NUMBER
3111  |      P_AMORTIZATION_SCHEDULE_ID IN NUMBER
3112  | KNOWN ISSUES
3113  |      None
3114  |
3115  | NOTES
3116  |      Any interesting aspect of the code in the package body which needs
3117  |      to be stated.
3118  |
3119  | MODIFICATION HISTORY
3120  | Date                  Author            Description of Changes
3121  | 04-24-2004            karamach          Created
3122  | 05-04-2004            scherkas          Modified
3123  | 06-19-2004            karamach          Changed to use DBMS_XMLQUERY (8i pkg) instead of DBMS_XMLGEN (9i pkg)
3124  |					   to be compatible with the supported Oracle database version 8.1.7.4
3125  |					   and avoid 9i dependency
3126  | 06-21-2006            karamach          Added cursor c_get_currency_format_mask and changed query to improve performance to fix bug5264818
3127  |
3128  *=======================================================================*/
3129 PROCEDURE GENERATE_BILLING_STATEMENT_XML(p_loan_id IN NUMBER,
3130                                          p_amortization_schedule_id IN NUMBER) IS
3131 
3132 /*-----------------------------------------------------------------------+
3133  | Local Variable Declarations and initializations                       |
3134  +-----------------------------------------------------------------------*/
3135 
3136     l_api_name                      CONSTANT VARCHAR2(30) := 'GENERATE_BILLING_STATEMENT_XML';
3137     qry_string                      Varchar2(12000);
3138 --    qryCtx                          DBMS_XMLGEN.ctxHandle;
3139     qryCtx                          DBMS_XMLQuery.ctxType;
3140     result                          CLOB;
3141     l_current_phase                 varchar2(30);
3142     l_currency_format_mask          varchar2(4000);
3143 /*-----------------------------------------------------------------------+
3144  | Cursor Declarations                                                   |
3145  +-----------------------------------------------------------------------*/
3146 
3147  CURSOR c_get_currency_format_mask(pLoanId Number) is
3148  select FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50) mask
3149  from lns_loan_headers_all loan
3150  where loan.loan_id = pLoanId;
3151 
3152 BEGIN
3153 
3154     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3155 
3156     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting Currency Format Mask for loan');
3157     OPEN c_get_currency_format_mask(p_loan_id);
3158     FETCH c_get_currency_format_mask INTO l_currency_format_mask;
3159     CLOSE c_get_currency_format_mask;
3160 
3161     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Generating billing statement...');
3162 
3163 
3164     qry_string := 'SELECT loan.loan_id, ' ||
3165         'payment_summary.next_payment_amortization_id, ' ||
3166         'fnd_date.date_to_chardate(sysdate) bill_date, ' ||
3167         'loan.loan_number, ' ||
3168         'loan.LOAN_DESCRIPTION, ' ||
3169         '(am.PAYMENT_NUMBER || decode(am.PARENT_AMORTIZATION_ID, null, '''', ''M'')) next_payment_number, ' ||
3170         'fnd_date.date_to_chardate(am.DUE_DATE) next_payment_due_date, ' ||
3171         'to_char(am.PRINCIPAL_AMOUNT, :CURRENCY_FORMAT1) f_next_payment_principal_due, ' ||
3172         'to_char(am.INTEREST_AMOUNT, :CURRENCY_FORMAT2) f_next_payment_interest_due, ' ||
3173         'to_char(am.FEE_AMOUNT, :CURRENCY_FORMAT3) f_next_payment_fee_due, ' ||
3174         'to_char((am.PRINCIPAL_AMOUNT+am.INTEREST_AMOUNT+am.FEE_AMOUNT), :CURRENCY_FORMAT4) f_next_payment_total_due, ' ||
3175         'am.PRINCIPAL_AMOUNT next_payment_principal_due, ' ||
3176         'am.INTEREST_AMOUNT next_payment_interest_due, ' ||
3177         'am.FEE_AMOUNT next_payment_fee_due, ' ||
3178         '(am.PRINCIPAL_AMOUNT+am.INTEREST_AMOUNT+am.FEE_AMOUNT) next_payment_total_due, ' ||
3179         'party.party_name Borrower_Name, ' ||
3180         'loc.address1 || '' '' || loc.city || '' '' || loc.state || '' '' || loc.postal_code || '' '' || terr.TERRITORY_SHORT_NAME Primary_Address, ' ||
3181         'party.jgzz_fiscal_code tax_id, ' ||
3182         'org.name operating_unit, ' ||
3183         'loan_type.loan_type_name loan_type, ' ||
3184         'loan_class.meaning loan_class, ' ||
3185         'loan.loan_term || '' '' || periodlkup.meaning loan_term, ' ||
3186         'to_char(LNS_FIN_UTILS.getActiveRate(loan.loan_id))  current_interest_rate, ' ||
3187         'fnd_date.date_to_chardate(loan.loan_maturity_date) loan_maturity_date, ' ||
3188         'to_char(payment_summary.total_principal_balance, :CURRENCY_FORMAT5) f_remaining_balance_amount, ' ||
3189         'to_char(payment_summary.principal_paid_todate, :CURRENCY_FORMAT6) f_principal_paid_todate, ' ||
3190         'to_char(payment_summary.interest_paid_todate, :CURRENCY_FORMAT7) f_interest_paid_todate, ' ||
3191         'to_char(payment_summary.fee_paid_todate, :CURRENCY_FORMAT8) f_fee_paid_todate, ' ||
3192         'to_char(payment_summary.total_prin_paid_todate, :CURRENCY_FORMAT9) f_total_prin_paid_todate, ' ||
3193         'to_char(payment_summary.principal_paid_ytd, :CURRENCY_FORMAT10) f_principal_paid_ytd, ' ||
3194         'to_char(payment_summary.interest_paid_ytd, :CURRENCY_FORMAT11) f_interest_paid_ytd, ' ||
3195         'to_char(payment_summary.fee_paid_ytd, :CURRENCY_FORMAT12) f_fee_paid_ytd, ' ||
3196         'to_char(payment_summary.principal_overdue, :CURRENCY_FORMAT13) f_principal_overdue, ' ||
3197         'to_char(payment_summary.interest_overdue, :CURRENCY_FORMAT14) f_interest_overdue, ' ||
3198         'to_char(payment_summary.fee_overdue, :CURRENCY_FORMAT15) f_fee_overdue, ' ||
3199         'to_char(payment_summary.total_overdue, :CURRENCY_FORMAT16) f_total_overdue, ' ||
3200         'payment_summary.total_principal_balance remaining_balance_amount, ' ||
3201         'payment_summary.principal_paid_todate principal_paid_todate, ' ||
3202         'payment_summary.interest_paid_todate interest_paid_todate, ' ||
3203         'payment_summary.fee_paid_todate fee_paid_todate, ' ||
3204         'payment_summary.total_prin_paid_todate total_prin_paid_todate, ' ||
3205         'payment_summary.principal_paid_ytd principal_paid_ytd, ' ||
3206         'payment_summary.interest_paid_ytd interest_paid_ytd, ' ||
3207         'payment_summary.fee_paid_ytd fee_paid_ytd, ' ||
3208         'payment_summary.principal_overdue principal_overdue, ' ||
3209         'payment_summary.interest_overdue interest_overdue, ' ||
3210         'payment_summary.fee_overdue fee_overdue, ' ||
3211         'payment_summary.total_overdue total_overdue, ' ||
3212         'payment_summary.number_overdue_bills number_of_overdue_payments, ' ||
3213         'fnd_date.date_to_chardate(payment_summary.last_overdue_date) last_overdue_date, ' ||
3214         'to_char(payment_summary.last_payment_amount, :CURRENCY_FORMAT17) f_last_payment_amount, ' ||
3215         'payment_summary.last_payment_amount last_payment_amount, ' ||
3216         'fnd_date.date_to_chardate(payment_summary.last_payment_date) last_payment_date, ' ||
3217         '(LNS_FIN_UTILS.getNumberInstallments(loan.loan_id, nvl(loan.current_phase, ''TERM'')) - payment_summary.next_payment_number) remaining_number_of_payments, ' ||
3218         'contact_person.party_name PRIMARY_LOAN_CONTACT, ' ||
3219         'loan.LOAN_CURRENCY LOAN_CURRENCY_CODE, ' ||
3220         'curr.name LOAN_CURRENCY_MEANING, ' ||
3221         'loan_subtype.meaning loan_subtype, ' ||
3222         'nvl(loan.current_phase, ''TERM'') phase, ' ||
3223         'rate_type.meaning rate_type, ' ||
3224         'int_rate_hdr.INTEREST_RATE_NAME index_rate, ' ||
3225         'rate_freq.meaning floating_frequency, ' ||
3226         'pay_freq.meaning payment_frequency, ' ||
3227         'fnd_date.date_to_chardate(terms.LOCK_IN_DATE) lock_date, ' ||
3228         'fnd_date.date_to_chardate(terms.LOCK_TO_DATE) lock_exp_date, ' ||
3229         'terms.CEILING_RATE Ceiling_Rate, ' ||
3230         'terms.FLOOR_RATE floor_rate, ' ||
3231         'loan.open_to_term_flag open_to_term, ' ||
3232         'open_to_term.meaning open_to_term_flag, ' ||
3233         'product.loan_product_name loan_product, ' ||
3234         'fnd_date.date_to_chardate(rate_sched1.INDEX_DATE) open_index_date, ' ||
3235         'rate_sched1.CURRENT_INTEREST_RATE open_interest_rate, ' ||
3236         'fnd_date.date_to_chardate(rate_sched2.INDEX_DATE) term_index_date, ' ||
3237         'rate_sched2.CURRENT_INTEREST_RATE term_interest_rate, ' ||
3238         'loan.MULTIPLE_FUNDING_FLAG, ' ||
3239 
3240         -- adding disbursement schedule
3241         'CURSOR ' ||
3242         '(select head.DISB_HEADER_ID, ' ||
3243         'head.DISBURSEMENT_NUMBER, ' ||
3244         'fnd_date.date_to_chardate(head.TARGET_DATE) TARGET_DATE, ' ||
3245         'fnd_date.date_to_chardate(head.PAYMENT_REQUEST_DATE) PAYMENT_REQUEST_DATE, ' ||
3246         'head.HEADER_PERCENT, ' ||
3247         'to_char(head.HEADER_AMOUNT, :CURRENCY_FORMAT18) f_header_amount, ' ||
3248         'fnd_date.date_to_chardate((select max(DISBURSEMENT_DATE) from lns_disb_lines where DISB_HEADER_ID = head.DISB_HEADER_ID)) DISBURSEMENT_DATE, ' ||
3249         'fund_status.meaning status, ' ||
3250         'fund_act.meaning activity_name ' ||
3251         'from lns_disb_headers head, ' ||
3252         'lns_lookups fund_status, ' ||
3253         'lns_lookups fund_act ' ||
3254         'where head.loan_id = loan.loan_id and ' ||
3255         'fund_status.lookup_type(+) = ''FUNDING_STATUS'' and ' ||
3256         'fund_status.lookup_code(+) = head.STATUS and ' ||
3257         'fund_act.lookup_type(+) = ''DISB_ACTIVITY'' and ' ||
3258         'fund_act.lookup_code(+) = head.ACTIVITY_CODE) ' ||
3259         'AS Disbursement_Schedule, ' ||
3260 
3261         -- adding payment history
3262         'CURSOR ' ||
3263         '(select amortization_schedule_id, ' ||
3264         'loan_id, ' ||
3265         'payment_number, ' ||
3266         'fnd_date.date_to_chardate(creation_date) bill_date, ' ||
3267         'fnd_date.date_to_chardate(last_applied_date) paid_date, ' ||
3268         'fnd_date.date_to_chardate(due_date) due_date, ' ||
3269         'to_char(principal_amount, :CURRENCY_FORMAT19) f_principal_amount, ' ||
3270         'to_char(interest_amount, :CURRENCY_FORMAT20) f_interest_amount, ' ||
3271         'to_char(fee_amount, :CURRENCY_FORMAT21) f_fee_amount, ' ||
3272         'to_char(total_billed_amount, :CURRENCY_FORMAT22) f_total_billed_amount, ' ||
3273         'to_char((PRINCIPAL_PAID + INTEREST_PAID + FEE_PAID), :CURRENCY_FORMAT23) f_total_payment_amount, '  ||
3274         'principal_amount principal_amount, ' ||
3275         'interest_amount interest_amount, ' ||
3276         'fee_amount fee_amount, ' ||
3277         'total_billed_amount total_billed_amount, ' ||
3278         '(PRINCIPAL_PAID + INTEREST_PAID + FEE_PAID) total_payment_amount '  ||
3279         'from lns_am_scheds_v payment_history ' ||
3280         'where payment_history.loan_id = loan.loan_id and ' ||
3281         'nvl(payment_history.PHASE, ''TERM'') = nvl(loan.CURRENT_PHASE, ''TERM'') and ' ||
3282         'payment_history.reversed_code = ''N'' and ' ||
3283         '(payment_history.payment_number between (payment_summary.next_payment_number - 2) and payment_summary.next_payment_number) and ' ||
3284         'payment_history.AMORTIZATION_SCHEDULE_ID < payment_summary.next_payment_amortization_id ' ||
3285         'order by payment_history.AMORTIZATION_SCHEDULE_ID) ' ||
3286         'AS Recent_Payment_History ' ||
3287 
3288         'FROM lns_loan_headers_all loan, ' ||
3289         'hz_parties party, ' ||
3290         'fnd_territories_tl terr, ' ||
3291         'hr_all_organization_units_tl org, ' ||
3292         'LNS_PAYMENTS_SUMMARY_V payment_summary, ' ||
3293         'lns_amortization_scheds am, ' ||
3294         'hz_locations loc, ' ||
3295         'hz_cust_acct_sites_all acct_site, ' ||
3296         'hz_party_sites site, ' ||
3297         'fnd_currencies_tl curr, ' ||
3298         'hz_parties contact_person, ' ||
3299         'lns_loan_types_vl loan_type, ' ||
3300         'lns_lookups loan_class, ' ||
3301         'lns_lookups periodlkup, ' ||
3302         'lns_lookups loan_subtype, ' ||
3303         'lns_terms terms, ' ||
3304         'lns_int_rate_headers int_rate_hdr, ' ||
3305         'lns_lookups rate_type, ' ||
3306         'lns_lookups rate_freq, ' ||
3307         'lns_lookups pay_freq, ' ||
3308         'fnd_lookups open_to_term, ' ||
3309         'lns_loan_products_vl product, ' ||
3310         'lns_rate_schedules rate_sched1, ' ||
3311         'lns_rate_schedules rate_sched2 ' ||
3312 
3313         'WHERE party.party_id = loan.primary_borrower_id and ' ||
3314         'org.organization_id = loan.org_id and ' ||
3315         'org.language = userenv(''LANG'') and ' ||
3316         'acct_site.cust_acct_site_id = loan.bill_to_acct_site_id and ' ||
3317         'acct_site.org_id = loan.org_id and ' ||
3318         'site.party_site_id = acct_site.party_site_id and ' ||
3319         'site.location_id = loc.location_id and ' ||
3320         'loc.country = terr.TERRITORY_CODE and ' ||
3321         'terr.language = userenv(''LANG'') and ' ||
3322         'loan.LOAN_CURRENCY = curr.currency_code and ' ||
3323         'curr.language = userenv(''LANG'') and ' ||
3324         'loan.contact_pers_party_id = contact_person.party_id(+) and ' ||
3325         'loan_type.loan_type_id = loan.loan_type_id AND ' ||
3326         'loan_class.lookup_type = ''LOAN_CLASS'' AND ' ||
3327         'loan_class.lookup_code = loan.loan_class_code AND ' ||
3328         'periodlkup.lookup_type = ''PERIOD'' and ' ||
3329         'periodlkup.lookup_code = loan.loan_term_period and ' ||
3330         'loan_subtype.lookup_type = ''LOAN_SUBTYPE'' and ' ||
3331         'loan_subtype.lookup_code = loan.loan_subtype and ' ||
3332         'loan.loan_id = payment_summary.loan_id and ' ||
3333         'loan.loan_id = terms.loan_id and ' ||
3334         'rate_type.lookup_type = ''RATE_TYPE'' and ' ||
3335         'rate_type.lookup_code = terms.RATE_TYPE and ' ||
3336         'terms.INDEX_RATE_ID = int_rate_hdr.INTEREST_RATE_ID(+) and ' ||
3337         'rate_freq.lookup_type(+) = ''FREQUENCY'' and ' ||
3338         'rate_freq.lookup_code(+) = terms.RATE_CHANGE_FREQUENCY and ' ||
3339         'pay_freq.lookup_type = ''FREQUENCY'' and ' ||
3340         'pay_freq.lookup_code = terms.LOAN_PAYMENT_FREQUENCY and ' ||
3341         'open_to_term.lookup_type = ''YES_NO'' and ' ||
3342         'open_to_term.lookup_code = nvl(loan.open_to_term_flag, ''N'') and ' ||
3343         'loan.product_id = product.LOAN_PRODUCT_ID(+) and ' ||
3344         'rate_sched1.term_id(+) = terms.term_id and ' ||
3345         'rate_sched1.PHASE(+) = ''OPEN'' and ' ||
3346         'rate_sched2.term_id(+) = terms.term_id and ' ||
3347         'rate_sched2.PHASE(+) = ''TERM'' and ' ||
3348         'loan.loan_id = am.loan_id and ' ||
3349         'am.AMORTIZATION_SCHEDULE_ID = payment_summary.next_payment_amortization_id and ' ||
3350         'loan.loan_id = :LOAN_ID';
3351 
3352     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Before set new context');
3353     qryCtx := DBMS_XMLQuery.newContext(qry_string);
3354 --    qryCtx := DBMS_XMLGEN.newContext(qry_string);
3355     LogMessage(FND_LOG.LEVEL_STATEMENT, 'After set new context');
3356 
3357     -- set the rowset header to null
3358     DBMS_XMLQuery.setRowSetTag(qryCtx, 'LOANSET');
3359 --    DBMS_XMLGEN.setRowSetTag(qryCtx, 'LOANSET');
3360 
3361     -- set the row tag name to be LOAN
3362      DBMS_XMLQuery.setRowTag(qryCtx, 'LOAN');
3363 --    DBMS_XMLGEN.setRowTag(qryCtx, 'LOAN');
3364 
3365     --Set bind values
3366     DBMS_XMLQuery.setBindValue(qryCtx, 'LOAN_ID', p_loan_id);
3367 --    DBMS_XMLGEN.setBindValue(qryCtx, 'LOAN_ID', p_loan_id);
3368 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT1', l_currency_format_mask);
3369 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT2', l_currency_format_mask);
3370 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT3', l_currency_format_mask);
3371 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT4', l_currency_format_mask);
3372 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT5', l_currency_format_mask);
3373 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT6', l_currency_format_mask);
3374 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT7', l_currency_format_mask);
3375 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT8', l_currency_format_mask);
3376 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT9', l_currency_format_mask);
3377 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT10', l_currency_format_mask);
3378 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT11', l_currency_format_mask);
3379 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT12', l_currency_format_mask);
3380 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT13', l_currency_format_mask);
3381 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT14', l_currency_format_mask);
3382 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT15', l_currency_format_mask);
3383 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT16', l_currency_format_mask);
3384 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT17', l_currency_format_mask);
3385 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT18', l_currency_format_mask);
3386 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT19', l_currency_format_mask);
3387 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT20', l_currency_format_mask);
3388 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT21', l_currency_format_mask);
3389 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT22', l_currency_format_mask);
3390 	DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT23', l_currency_format_mask);
3391 
3392     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Bind value: LOAN_ID = ' || p_loan_id);
3393     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Bind value: CURRENCY_FORMAT = ' || l_currency_format_mask);
3394 
3395     -- now get the result
3396     result := DBMS_XMLQuery.getXml(qryCtx);
3397 --    result := DBMS_XMLGEN.getXml(qryCtx);
3398 --    LogMessage(FND_LOG.LEVEL_STATEMENT, 'Result xml: ' || result);
3399 
3400     if (result is not null) then
3401 
3402         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Generated billing statement');
3403 
3404         /* Update amortization table */
3405         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
3406 
3407         LNS_AMORTIZATION_SCHEDS_PKG.Update_Statement(
3408             P_AMORTIZATION_SCHEDULE_ID => p_amortization_schedule_id
3409             ,P_STATEMENT_XML => result);
3410 
3411         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
3412 
3413     else
3414         RAISE FND_API.G_EXC_ERROR;
3415     end if;
3416 
3417     --close context
3418     DBMS_XMLQuery.closeContext(qryCtx);
3419 --    DBMS_XMLGEN.closeContext(qryCtx);
3420 
3421     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3422 
3423 EXCEPTION
3424     WHEN OTHERS THEN
3425         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to generate billing statement');
3426         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: ' || sqlerrm);
3427         RAISE FND_API.G_EXC_ERROR;
3428 
3429 END GENERATE_BILLING_STATEMENT_XML;
3430 
3431 
3432 
3433 
3434 PROCEDURE VALIDATE_PRIN_AMOUNT(P_LOAN_ID NUMBER, P_PRIN_AMOUNT NUMBER)
3435 IS
3436 
3437 /*-----------------------------------------------------------------------+
3438  | Local Variable Declarations and initializations                       |
3439  +-----------------------------------------------------------------------*/
3440     l_valid_amount      number;
3441 
3442 /*-----------------------------------------------------------------------+
3443  | Cursor Declarations                                                   |
3444  +-----------------------------------------------------------------------*/
3445 
3446     CURSOR verify_amount_cur(P_LOAN_ID number) IS
3447         select max(head.funded_amount) - nvl(sum(am.PRINCIPAL_AMOUNT), 0)
3448         from
3449             LNS_AMORTIZATION_SCHEDS am,
3450             lns_loan_headers head
3451         where
3452             head.loan_id = P_LOAN_ID
3453             and head.loan_id = am.LOAN_ID
3454             and (am.REVERSED_FLAG is null or am.REVERSED_FLAG = 'N')
3455             and nvl(am.PHASE, 'TERM') = nvl(head.CURRENT_PHASE, 'TERM');
3456 BEGIN
3457 
3458     /* verify amount that we will bill */
3459     open verify_amount_cur(P_LOAN_ID);
3460     fetch verify_amount_cur into l_valid_amount;
3461     close verify_amount_cur;
3462 
3463     if P_PRIN_AMOUNT > l_valid_amount then
3464 --        FND_MESSAGE.SET_ENCODED('Principal bill amount cannot be greater than ' || l_valid_amount);
3465         FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_PRIN_BILL_AMOUNT');
3466         FND_MSG_PUB.Add;
3467         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3468         RAISE FND_API.G_EXC_ERROR;
3469     end if;
3470 
3471 END;
3472 
3473 
3474 
3475 /*========================================================================
3476  | PRIVATE PROCEDURE BILL_SINGLE_LOAN
3477  |
3478  | DESCRIPTION
3479  |      This procedure process a single loan.
3480  |
3481  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3482  |      BILL_LOANS
3483  |
3484  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3485  |      LogMessage
3486  |      CREATE_AR_INVOICES
3487  |
3488  | PARAMETERS
3489  |      P_LOAN_REC          IN OUT NOCOPY       Loan record to bill
3490  |
3491  | KNOWN ISSUES
3492  |      None
3493  |
3494  | NOTES
3495  |      Any interesting aspect of the code in the package body which needs
3496  |      to be stated.
3497  |
3498  | MODIFICATION HISTORY
3499  | Date                  Author            Description of Changes
3500  | 01-01-2004            scherkas          Created
3501  |
3502  *=======================================================================*/
3503 PROCEDURE BILL_SINGLE_LOAN(
3504     P_API_VERSION		IN          NUMBER,
3505     P_INIT_MSG_LIST		IN          VARCHAR2,
3506     P_COMMIT			IN          VARCHAR2,
3507     P_VALIDATION_LEVEL	IN          NUMBER,
3508     P_LOAN_REC          IN OUT NOCOPY     LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC,
3509     X_STATEMENT_XML     OUT NOCOPY  CLOB,
3510     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
3511     X_MSG_COUNT			OUT NOCOPY  NUMBER,
3512     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
3513 IS
3514 
3515 /*-----------------------------------------------------------------------+
3516  | Local Variable Declarations and initializations                       |
3517  +-----------------------------------------------------------------------*/
3518 
3519     l_api_name                      CONSTANT VARCHAR2(30) := 'BILL_SINGLE_LOAN';
3520     l_api_version                   CONSTANT NUMBER := 1.0;
3521     l_return_status                 VARCHAR2(1);
3522     l_msg_count                     NUMBER;
3523     l_msg_data                      VARCHAR2(32767);
3524     l_org_id                        number;
3525     l_Count                         number;
3526     l_header_id                     number;
3527     l_Count1                        number;
3528     l_prin_bal                      number;
3529     l_billed_0th_yn                 varchar2(1);
3530     l_do_billing                    number;
3531     l_offset                        number(38);
3532     l_statement_xml                 clob;
3533     l_prin_balance                  number;
3534     l_start                         date;
3535     l_end                           date;
3536     l_floating_flag                 varchar2(1);
3537 
3538     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
3539     l_amortization_rec              LNS_FINANCIALS.AMORTIZATION_REC;
3540     l_lines_tbl                     LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
3541     l_fee_tbl                       LNS_FINANCIALS.FEES_TBL;
3542 
3543 /*-----------------------------------------------------------------------+
3544  | Cursor Declarations                                                   |
3545  +-----------------------------------------------------------------------*/
3546 
3547     /* check to start billing for 0-th installment */
3548     CURSOR do_billing_cur(P_LOAN_ID number) IS
3549         select nvl(count(1),0)
3550         from lns_fee_assignments
3551         where begin_installment_number = 0
3552         and end_installment_number = 0
3553         and end_date_active is null
3554         and billing_option = 'ORIGINATION'
3555         and (loan_id = P_LOAN_ID
3556 	-- Bug#6961250, The loanId is NULL if for the disbFees in lns_fee_assignments.
3557 	-- So to check any existed 0th installment fees for a loan, also check existed fees for disb_header_id.
3558 	    OR disb_header_id in (select disb_header_id from lns_disb_headers where loan_id = P_LOAN_ID)
3559 	);
3560     /* get statement after its billed */
3561     CURSOR get_statement_cur(P_LOAN_ID number) IS
3562         select STATEMENT_XML
3563         from LNS_LOAN_HEADERS loan,
3564         lns_amortization_scheds am
3565         where loan.loan_id = am.loan_id	and
3566         am.AMORTIZATION_SCHEDULE_ID = loan.LAST_AMORTIZATION_ID	and
3567         am.PAYMENT_NUMBER = loan.LAST_PAYMENT_NUMBER and
3568         loan.loan_id = P_LOAN_ID;
3569 
3570     -- getting loan version
3571     CURSOR loan_version_cur(P_LOAN_ID number) IS
3572         select OBJECT_VERSION_NUMBER
3573         from LNS_LOAN_HEADERS
3574         where LOAN_ID = P_LOAN_ID;
3575 
3576     cursor cur_floating(p_loan_id number, p_phase varchar2, p_installment number) is
3577     select nvl(floating_flag, 'N')
3578       from lns_rate_schedules rs
3579           ,lns_terms t
3580       where t.loan_id = p_loan_id
3581         and t.term_id = rs.term_id
3582         and rs.end_date_active is null
3583         and rs.phase = p_phase
3584         and p_installment between rs.begin_installment_number and rs.end_installment_number;
3585 
3586 BEGIN
3587 
3588     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3589 
3590     -- Standard start of API savepoint
3591     SAVEPOINT PROCESS_SINGLE_LOAN_PVT;
3592     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
3593 
3594     -- Standard call to check for call compatibility
3595     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3596       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3597     END IF;
3598 
3599     -- Initialize message list if p_init_msg_list is set to TRUE
3600     IF FND_API.To_Boolean(p_init_msg_list) THEN
3601       FND_MSG_PUB.initialize;
3602     END IF;
3603 
3604     -- Initialize API return status to success
3605     l_return_status := FND_API.G_RET_STS_SUCCESS;
3606 
3607     -- START OF BODY OF API
3608 
3609     dbms_lob.createtemporary(X_STATEMENT_XML, FALSE, DBMS_LOB.CALL);
3610     dbms_lob.open(X_STATEMENT_XML, dbms_lob.lob_readwrite);
3611 
3612     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing loan ' || P_LOAN_REC.LOAN_NUMBER);
3613     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'LOAN ID: ' || P_LOAN_REC.LOAN_ID);
3614     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'LOAN DESCRIPTION: ' || P_LOAN_REC.LOAN_DESCRIPTION);
3615     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || P_LOAN_REC.FUNDED_AMOUNT);
3616     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FIRST_PAYMENT_DATE: ' || P_LOAN_REC.FIRST_PAYMENT_DATE);
3617     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
3618     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || P_LOAN_REC.BILLED_FLAG);
3619     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || P_LOAN_REC.LOAN_CURRENCY);
3620     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || P_LOAN_REC.CUST_ACCOUNT_ID);
3621     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || P_LOAN_REC.BILL_TO_ADDRESS_ID);
3622     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || P_LOAN_REC.CUSTOM_PAYMENTS_FLAG);
3623     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_PAYMENT_FREQUENCY: ' || P_LOAN_REC.LOAN_PAYMENT_FREQUENCY);
3624     LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || P_LOAN_REC.NUMBER_GRACE_DAYS);
3625     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || P_LOAN_REC.PAYMENT_APPLICATION_ORDER);
3626     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || P_LOAN_REC.EXCHANGE_RATE_TYPE);
3627     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || P_LOAN_REC.EXCHANGE_DATE);
3628     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || P_LOAN_REC.EXCHANGE_RATE);
3629     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'ORG ID: ' || P_LOAN_REC.ORG_ID);
3630     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'LE ID: ' || P_LOAN_REC.LEGAL_ENTITY_ID);
3631     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'CURRENT_PHASE: ' || P_LOAN_REC.CURRENT_PHASE);
3632 
3633     /* Check for loan data */
3634     if P_LOAN_REC.PAYMENT_APPLICATION_ORDER is null or
3635        P_LOAN_REC.FIRST_PAYMENT_DATE is null or
3636        P_LOAN_REC.NEXT_PAYMENT_DUE_DATE is null or
3637        P_LOAN_REC.LOAN_PAYMENT_FREQUENCY is null then
3638 
3639 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan misses some important data. Cannot proceed with billing of this loan.');
3640     	FND_MESSAGE.SET_NAME('LNS', 'LNS_LOAN_MISS_DATA');
3641     	FND_MESSAGE.SET_TOKEN('LOAN', P_LOAN_REC.LOAN_NUMBER);
3642 		FND_MSG_PUB.Add;
3643         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3644         RAISE FND_API.G_EXC_ERROR;
3645 
3646     end if;
3647 
3648     /* getting current payment number */
3649     P_LOAN_REC.NEXT_PAYMENT_NUMBER := LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER_EXT(P_LOAN_REC.LOAN_ID);
3650 
3651     if P_LOAN_REC.NEXT_PAYMENT_NUMBER = -1 then
3652 
3653         P_LOAN_REC.NEXT_PAYMENT_NUMBER := 0;
3654 
3655         /* check to start billing for 0-th installment */
3656         open do_billing_cur(P_LOAN_REC.LOAN_ID);
3657         fetch do_billing_cur into l_do_billing;
3658         close do_billing_cur;
3659 
3660         if l_do_billing > 0 then
3661 
3662             LNS_BILLING_BATCH_PUB.PREBILL_SINGLE_LOAN(
3663                 P_API_VERSION		    => 1.0,
3664                 P_INIT_MSG_LIST		    => FND_API.G_TRUE,
3665                 P_COMMIT			    => FND_API.G_FALSE,
3666                 P_VALIDATION_LEVEL		=> FND_API.G_VALID_LEVEL_FULL,
3667                 P_LOAN_ID               => P_LOAN_REC.LOAN_ID,
3668                 X_BILLED_YN             => l_billed_0th_yn,
3669                 x_return_status         => l_return_status,
3670                 x_msg_count             => l_msg_count,
3671                 x_msg_data              => l_msg_data);
3672 
3673             if l_return_status <> 'S' then
3674                 RAISE FND_API.G_EXC_ERROR;
3675             end if;
3676 
3677             if l_billed_0th_yn = 'Y' then
3678 
3679                 /* get statement after its billed */
3680                 open get_statement_cur(P_LOAN_REC.LOAN_ID);
3681                 fetch get_statement_cur into l_statement_xml;
3682                 close get_statement_cur;
3683 
3684                 /* remove xml header */
3685                 l_offset := DBMS_LOB.INSTR(lob_loc => l_statement_xml,
3686                                         pattern => '>',
3687                                         offset => 1,
3688                                         nth => 1);
3689                 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have removed header from the statement');
3690 
3691                 /* copy generated statement to output */
3692                 dbms_lob.copy(dest_lob => X_STATEMENT_XML,
3693                             src_lob => l_statement_xml,
3694                             amount => dbms_lob.getlength(l_statement_xml)-l_offset,
3695                             src_offset => l_offset+1);
3696 
3697                 return;
3698             end if;
3699 
3700         end if;
3701 
3702     end if;
3703 
3704     /* setting next payment number */
3705     P_LOAN_REC.NEXT_PAYMENT_NUMBER := P_LOAN_REC.NEXT_PAYMENT_NUMBER + 1;
3706     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || P_LOAN_REC.NEXT_PAYMENT_NUMBER);
3707 
3708     /* new principal and interest amounts from getInstallment api */
3709 
3710     if P_LOAN_REC.CURRENT_PHASE = 'TERM' then
3711 
3712         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
3713         l_start := sysdate;
3714         lns_financials.getInstallment(
3715             p_api_version => 1.0,
3716             p_init_msg_list => FND_API.G_TRUE,
3717             p_commit => FND_API.G_FALSE,
3718             p_loan_Id => P_LOAN_REC.LOAN_ID,
3719             p_installment_number => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
3720             x_amortization_rec => l_amortization_rec,
3721             x_fees_tbl => l_fee_tbl,
3722             X_RETURN_STATUS => l_return_status,
3723             X_MSG_COUNT => l_msg_count,
3724             X_MSG_DATA => l_msg_data);
3725 
3726         l_end := sysdate;
3727         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'getInstallment Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
3728 
3729     else
3730 
3731         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getOpenInstallment...');
3732         l_start := sysdate;
3733         lns_financials.getOpenInstallment(
3734             p_init_msg_list => FND_API.G_TRUE,
3735             p_loan_Id => P_LOAN_REC.LOAN_ID,
3736             p_installment_number => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
3737             x_amortization_rec => l_amortization_rec,
3738             x_fees_tbl => l_fee_tbl,
3739             X_RETURN_STATUS => l_return_status,
3740             X_MSG_COUNT => l_msg_count,
3741             X_MSG_DATA => l_msg_data);
3742 
3743         l_end := sysdate;
3744         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'getOpenInstallment Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
3745 
3746     end if;
3747 
3748     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
3749     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
3750 
3751     if l_return_status <> 'S' then
3752         RAISE FND_API.G_EXC_ERROR;
3753     end if;
3754 
3755     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Data returned from lns_financials.getInstallment:');
3756     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
3757     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
3758     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_amortization_rec.PRINCIPAL_AMOUNT);
3759     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_amortization_rec.INTEREST_AMOUNT);
3760     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_amortization_rec.FEE_AMOUNT);
3761 
3762     P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT := l_amortization_rec.PRINCIPAL_AMOUNT;
3763     P_LOAN_REC.NEXT_INTEREST_AMOUNT  := l_amortization_rec.INTEREST_AMOUNT;
3764     P_LOAN_REC.NEXT_FEE_AMOUNT       := l_amortization_rec.FEE_AMOUNT;
3765     P_LOAN_REC.RATE_ID               := l_amortization_rec.RATE_ID;
3766     P_LOAN_REC.NEXT_PAYMENT_DUE_DATE := l_amortization_rec.due_date;
3767 
3768     /* checking for returned values */
3769     if (P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT is null or P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT = 0) and
3770        (P_LOAN_REC.NEXT_INTEREST_AMOUNT is null or P_LOAN_REC.NEXT_INTEREST_AMOUNT = 0) and
3771        (P_LOAN_REC.NEXT_FEE_AMOUNT is null or P_LOAN_REC.NEXT_FEE_AMOUNT = 0)
3772     then
3773 
3774         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All amounts returned from lns_financials.getInstallment = 0. Nothing to bill.');
3775         return;
3776 
3777 /*
3778             FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_AMOUNT_INST');
3779             FND_MSG_PUB.Add;
3780             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
3781             RAISE FND_API.G_EXC_ERROR;
3782 */
3783     end if;
3784 
3785     /* begin raverma 12-5-2005 added support for floating loans */
3786     LogMessage(FND_LOG.LEVEL_STATEMENT, 'check if float postprocessing needed');
3787     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_REC.CURRENT_PHASE' || P_LOAN_REC.CURRENT_PHASE);
3788     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_REC.LOAN_ID' || P_LOAN_REC.LOAN_ID);
3789     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_REC.NEXT_PAYMENT_NUMBER' || P_LOAN_REC.NEXT_PAYMENT_NUMBER);
3790 
3791     open cur_floating(P_LOAN_REC.LOAN_ID, P_LOAN_REC.CURRENT_PHASE, P_LOAN_REC.NEXT_PAYMENT_NUMBER);
3792     fetch cur_floating into l_floating_flag;
3793     close cur_floating;
3794 
3795     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_floating_flag ' || l_floating_flag);
3796     LogMessage(FND_LOG.LEVEL_STATEMENT, 'interest amount ' || P_LOAN_REC.NEXT_INTEREST_AMOUNT);
3797     LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_REC.NEXT_PAYMENT_DUE_DATE ' || P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
3798     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_amortization_rec.RATE_CHANGE_FREQ ' || l_amortization_rec.RATE_CHANGE_FREQ);
3799     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_amortization_rec.rate_id ' || l_amortization_rec.rate_id);
3800     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_amortization_rec.rate_unadj ' || l_amortization_rec.rate_unadj);
3801 
3802     if P_LOAN_REC.NEXT_INTEREST_AMOUNT > 0 and l_floating_flag = 'Y' then
3803 
3804         LogMessage(FND_LOG.LEVEL_STATEMENT, 'BEFORE floating postProcessing');
3805          lns_financials.floatingRatePostProcessing(p_loan_id                  => P_LOAN_REC.LOAN_ID
3806                                                   ,p_init_msg_list            => FND_API.G_FALSE
3807                                                   ,p_commit                   => FND_API.G_FALSE
3808                                                   ,p_installment_number       => P_LOAN_REC.NEXT_PAYMENT_NUMBER
3809                                                   ,p_period_begin_date        => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE
3810                                                   ,p_interest_adjustment_freq => l_amortization_rec.RATE_CHANGE_FREQ
3811                                                   ,p_annualized_interest_rate => l_amortization_rec.rate_unadj
3812                                                   ,p_rate_id                  => l_amortization_rec.rate_id
3813                                                   ,p_phase                    => P_LOAN_REC.CURRENT_PHASE
3814                                                   ,X_RETURN_STATUS            => l_return_status
3815                                                   ,X_MSG_COUNT                => l_msg_count
3816                                                   ,X_MSG_DATA                 => l_msg_data);
3817         LogMessage(FND_LOG.LEVEL_STATEMENT, 'after floating postProcessing');
3818         LogMessage(FND_LOG.LEVEL_STATEMENT, 'copying new rate ID for insert into Amortization Schedueles' || l_amortization_rec.RATE_ID);
3819         P_LOAN_REC.RATE_ID               := l_amortization_rec.RATE_ID;
3820 
3821         if l_return_status <> 'S' then
3822             RAISE FND_API.G_EXC_ERROR;
3823             LogMessage(FND_LOG.LEVEL_STATEMENT, 'error in floating postProcessing ' || Sqlerrm);
3824 
3825         end if;
3826 
3827     end if;
3828 
3829     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
3830     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
3831 
3832 
3833     /* adding principal and interest amounts into lines table */
3834     l_Count1 := 1;
3835     l_lines_tbl(l_Count1).LINE_TYPE := 'PRIN';
3836     l_lines_tbl(l_Count1).LINE_AMOUNT := P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT;
3837 /*
3838     l_Count1 := l_Count1 + 1;
3839     l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
3840     l_lines_tbl(l_Count1).LINE_AMOUNT := P_LOAN_REC.NEXT_INTEREST_AMOUNT;
3841 */
3842 
3843     if l_amortization_rec.NORMAL_INT_AMOUNT > 0 or l_amortization_rec.ADD_PRIN_INT_AMOUNT > 0 or
3844        l_amortization_rec.ADD_INT_INT_AMOUNT > 0 or l_amortization_rec.PENAL_INT_AMOUNT > 0
3845     then
3846 
3847         if l_amortization_rec.NORMAL_INT_AMOUNT > 0 then
3848             l_Count1 := l_Count1 + 1;
3849             l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
3850             l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.NORMAL_INT_AMOUNT;
3851             l_lines_tbl(l_Count1).LINE_DESC := 'Normal Interest';
3852             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
3853         end if;
3854         if l_amortization_rec.ADD_PRIN_INT_AMOUNT > 0 then
3855             l_Count1 := l_Count1 + 1;
3856             l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
3857             l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.ADD_PRIN_INT_AMOUNT;
3858             l_lines_tbl(l_Count1).LINE_DESC := 'Additional Interest on Unpaid Principal';
3859             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
3860         end if;
3861         if l_amortization_rec.ADD_INT_INT_AMOUNT > 0 then
3862             l_Count1 := l_Count1 + 1;
3863             l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
3864             l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.ADD_INT_INT_AMOUNT;
3865             l_lines_tbl(l_Count1).LINE_DESC := 'Additional Interest on Unpaid Interest';
3866             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
3867         end if;
3868         if l_amortization_rec.PENAL_INT_AMOUNT > 0 then
3869             l_Count1 := l_Count1 + 1;
3870             l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
3871             l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.PENAL_INT_AMOUNT;
3872             l_lines_tbl(l_Count1).LINE_DESC := 'Penal Interest';
3873             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
3874         end if;
3875 
3876     else
3877 
3878         l_Count1 := l_Count1 + 1;
3879         l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
3880         l_lines_tbl(l_Count1).LINE_AMOUNT := P_LOAN_REC.NEXT_INTEREST_AMOUNT;
3881 
3882     end if;
3883 
3884     /* adding fee amounts into lines table */
3885     FOR l_Count IN 1..l_fee_tbl.count LOOP
3886 
3887         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fee #' || l_Count || ' Name: ' || l_fee_tbl(l_Count).FEE_NAME || ' Amount: ' || l_fee_tbl(l_Count).FEE_AMOUNT);
3888 
3889         l_Count1 := l_Count1 + 1;
3890         l_lines_tbl(l_Count1).LINE_REF_ID := l_fee_tbl(l_Count).FEE_ID;
3891         l_lines_tbl(l_Count1).LINE_TYPE := 'FEE';
3892         l_lines_tbl(l_Count1).LINE_DESC := l_fee_tbl(l_Count).FEE_NAME;
3893         l_lines_tbl(l_Count1).LINE_AMOUNT := l_fee_tbl(l_Count).FEE_AMOUNT;
3894         l_lines_tbl(l_Count1).FEE_SCHEDULE_ID := l_fee_tbl(l_Count).FEE_SCHEDULE_ID;
3895 
3896         /* added fee installment validation by raverma request */
3897         if l_amortization_rec.INSTALLMENT_NUMBER <> l_fee_tbl(l_Count).FEE_INSTALLMENT then
3898 
3899             FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_FEE_INSTAL');
3900             FND_MSG_PUB.Add;
3901             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3902             RAISE FND_API.G_EXC_ERROR;
3903 
3904         end if;
3905 
3906         /* updating LNS_FEE_SCHEDULES with billed_flag = Y */
3907         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_FEE_SCHEDULES with billed_flag = Y ...');
3908         UPDATE LNS_FEE_SCHEDULES
3909         SET
3910             BILLED_FLAG                     =     'Y',
3911             last_update_date                =     LNS_UTILITY_PUB.LAST_UPDATE_DATE,
3912             last_updated_by                 =     LNS_UTILITY_PUB.LAST_UPDATED_BY,
3913             last_update_login               =     LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
3914         WHERE
3915             FEE_SCHEDULE_ID = l_fee_tbl(l_Count).fee_schedule_id;
3916         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_FEE_SCHEDULES');
3917 
3918     END LOOP;
3919 
3920     /* validate principal amount */
3921     VALIDATE_PRIN_AMOUNT(P_LOAN_REC.LOAN_ID, P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT);
3922 
3923     /* late date */
3924     P_LOAN_REC.NEXT_PAYMENT_LATE_DATE := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE + nvl(P_LOAN_REC.NUMBER_GRACE_DAYS, 0);
3925 
3926     /* inserting new record into LNS_AMORTIZATION_SCHEDS */
3927     l_prin_balance := null;
3928     if P_LOAN_REC.CURRENT_PHASE is not null and P_LOAN_REC.CURRENT_PHASE = 'OPEN' then
3929         l_prin_balance := P_LOAN_REC.FUNDED_AMOUNT;
3930     end if;
3931 
3932     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Inserting new record into LNS_AMORTIZATION_SCHEDS w following values:');
3933     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_LOAN_REC.LOAN_ID);
3934     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || P_LOAN_REC.NEXT_PAYMENT_NUMBER);
3935     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
3936     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LATE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_LATE_DATE);
3937     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT);
3938     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || P_LOAN_REC.NEXT_INTEREST_AMOUNT);
3939     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || P_LOAN_REC.NEXT_FEE_AMOUNT);
3940     LogMessage(FND_LOG.LEVEL_STATEMENT, 'RATE_ID: ' || P_LOAN_REC.RATE_ID);
3941     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_BALANCE: ' || l_prin_balance);
3942     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PHASE: ' || P_LOAN_REC.CURRENT_PHASE);
3943 
3944     LNS_AMORTIZATION_SCHEDS_PKG.Insert_Row(
3945         X_AMORTIZATION_SCHEDULE_ID => P_LOAN_REC.NEXT_AMORTIZATION_ID
3946         ,P_LOAN_ID => P_LOAN_REC.LOAN_ID
3947         ,P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER
3948         ,P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE
3949         ,P_LATE_DATE => P_LOAN_REC.NEXT_PAYMENT_LATE_DATE
3950         ,P_PRINCIPAL_AMOUNT => P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT
3951         ,P_INTEREST_AMOUNT => P_LOAN_REC.NEXT_INTEREST_AMOUNT
3952         ,P_FEE_AMOUNT => P_LOAN_REC.NEXT_FEE_AMOUNT
3953         ,P_REVERSED_FLAG => 'N'
3954         ,P_RATE_ID => P_LOAN_REC.RATE_ID
3955         ,P_OBJECT_VERSION_NUMBER => 1
3956 	    ,P_PRINCIPAL_BALANCE => l_prin_balance
3957 	    ,P_PHASE => P_LOAN_REC.CURRENT_PHASE);
3958 
3959     LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_SCHEDULE_ID: ' || P_LOAN_REC.NEXT_AMORTIZATION_ID);
3960     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully inserted record into LNS_AMORTIZATION_SCHEDS');
3961 
3962     /* creating AR invoices */
3963     CREATE_AR_INVOICES(P_LOAN_REC, l_lines_tbl);
3964 
3965     /* updating loan header table */
3966 
3967     -- getting loan version
3968     open loan_version_cur(P_LOAN_REC.LOAN_ID);
3969     fetch loan_version_cur into P_LOAN_REC.OBJECT_VERSION_NUMBER;
3970     close loan_version_cur;
3971 
3972     l_loan_header_rec.loan_id := P_LOAN_REC.LOAN_ID;
3973     l_loan_header_rec.BILLED_FLAG := 'Y';
3974     l_loan_header_rec.LAST_BILLED_DATE := sysdate;
3975 
3976     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
3977     LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || l_loan_header_rec.BILLED_FLAG);
3978     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LAST_BILLED_DATE: ' || l_loan_header_rec.LAST_BILLED_DATE);
3979 
3980     LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => P_LOAN_REC.OBJECT_VERSION_NUMBER,
3981                                     P_LOAN_HEADER_REC => l_loan_header_rec,
3982                                     P_INIT_MSG_LIST => FND_API.G_FALSE,
3983                                     X_RETURN_STATUS => l_return_status,
3984                                     X_MSG_COUNT => l_msg_count,
3985                                     X_MSG_DATA => l_msg_data);
3986 
3987     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
3988 
3989     IF l_return_status = 'S' THEN
3990         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
3991     ELSE
3992 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_LOAN_HEADER_PUB.UPDATE_LOAN returned error: ' || substr(l_msg_data,1,225));
3993     	FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
3994 		FND_MSG_PUB.Add;
3995         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3996 	    RAISE FND_API.G_EXC_ERROR;
3997     END IF;
3998 
3999     STORE_LAST_PAYMENT_NUMBER(P_LOAN_REC.LOAN_ID);
4000 
4001     /* Generate xml for printable billing statement */
4002     l_start := sysdate;
4003 
4004     GENERATE_BILLING_STATEMENT_XML(
4005 					p_loan_id => P_LOAN_REC.LOAN_ID,
4006 					p_amortization_schedule_id => P_LOAN_REC.NEXT_AMORTIZATION_ID);
4007 
4008     l_end := sysdate;
4009     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Statement generation timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4010 
4011     /* get statement after it stored in db */
4012     open get_statement_cur(P_LOAN_REC.LOAN_ID);
4013     fetch get_statement_cur into l_statement_xml;
4014     close get_statement_cur;
4015 
4016     /* remove xml header */
4017     l_offset := DBMS_LOB.INSTR(lob_loc => l_statement_xml,
4018                               pattern => '>',
4019 			                  offset => 1,
4020 			                  nth => 1);
4021     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have removed header from the statement');
4022     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_offset: ' || l_offset);
4023 
4024     /* copy generated statement to output */
4025     dbms_lob.copy(dest_lob => X_STATEMENT_XML,
4026                  src_lob => l_statement_xml,
4027                  amount => dbms_lob.getlength(l_statement_xml)-l_offset,
4028                  src_offset => l_offset+1);
4029     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have copied generated statement to output');
4030 
4031     if P_COMMIT = FND_API.G_TRUE then
4032         COMMIT WORK;
4033         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan ' || P_LOAN_REC.LOAN_NUMBER);
4034     end if;
4035 
4036     -- END OF BODY OF API
4037     x_return_status := FND_API.G_RET_STS_SUCCESS;
4038 
4039     -- Standard call to get message count and if count is 1, get message info
4040     FND_MSG_PUB.Count_And_Get(
4041                 p_encoded => FND_API.G_FALSE,
4042                 p_count => x_msg_count,
4043                 p_data => x_msg_data);
4044 
4045     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully processed loan ' || P_LOAN_REC.LOAN_NUMBER);
4046     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
4047 
4048 EXCEPTION
4049     WHEN FND_API.G_EXC_ERROR THEN
4050         ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4051         x_return_status := FND_API.G_RET_STS_ERROR;
4052         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4053         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4054         g_cr_return_status := 'WARNING';
4055 
4056         /* building error statement */
4057         BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4058                          P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4059                          P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4060                          P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4061                          P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4062                          P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4063                          P_ERR_COUNT => x_msg_count,
4064                          X_STATEMENT_XML => X_STATEMENT_XML);
4065 
4066     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4067         ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4068         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4069         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4070         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4071         g_cr_return_status := 'WARNING';
4072 
4073         /* building error statement */
4074         BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4075                          P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4076                          P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4077                          P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4078                          P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4079                          P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4080                          P_ERR_COUNT => x_msg_count,
4081                          X_STATEMENT_XML => X_STATEMENT_XML);
4082 
4083     WHEN OTHERS THEN
4084         ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4085         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4086         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
4087             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
4088         END IF;
4089         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4090         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4091         g_cr_return_status := 'WARNING';
4092 
4093         /* building error statement */
4094         BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4095                          P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4096                          P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4097                          P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4098                          P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4099                          P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4100                          P_ERR_COUNT => x_msg_count,
4101                          X_STATEMENT_XML => X_STATEMENT_XML);
4102 
4103 END;
4104 
4105 /*========================================================================
4106  | PRIVATE PROCEDURE CALC_SINGLE_LOAN_NEXT_DD
4107  |
4108  | DESCRIPTION
4109  |      This procedure recalculates next payment due date for single loan
4110  |
4111  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4112  |      CALC_PAST_DUE_LOANS_NEXT_DD
4113  |
4114  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4115  |      LogMessage
4116  |
4117  | PARAMETERS
4118  |      P_LOAN_NEXT_DD_REC  IN      Loan record that needs new due date
4119  |
4120  | KNOWN ISSUES
4121  |      None
4122  |
4123  | NOTES
4124  |      Any interesting aspect of the code in the package body which needs
4125  |      to be stated.
4126  |
4127  | MODIFICATION HISTORY
4128  | Date                  Author            Description of Changes
4129  | 01-01-2004            scherkas          Created
4130  |
4131  *=======================================================================*/
4132 PROCEDURE CALC_SINGLE_LOAN_NEXT_DD(
4133     P_API_VERSION		IN          NUMBER,
4134     P_INIT_MSG_LIST		IN          VARCHAR2,
4135     P_COMMIT			IN          VARCHAR2,
4136     P_VALIDATION_LEVEL	IN          NUMBER,
4137     P_LOAN_NEXT_DD_REC  IN          LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC,
4138     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
4139     X_MSG_COUNT			OUT NOCOPY  NUMBER,
4140     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
4141 IS
4142 
4143 /*-----------------------------------------------------------------------+
4144  | Local Variable Declarations and initializations                       |
4145  +-----------------------------------------------------------------------*/
4146 
4147     l_api_name                      CONSTANT VARCHAR2(30) := 'CALC_SINGLE_LOAN_NEXT_DD';
4148     l_api_version                   CONSTANT NUMBER := 1.0;
4149     l_return_status                 VARCHAR2(1);
4150     l_msg_count                     NUMBER;
4151     l_msg_data                      VARCHAR2(32767);
4152     l_next_payment_due_date         date;
4153     l_object_version_number         number;
4154     l_term_id                       number;
4155     l_version_number                number;
4156     l_prin_bal                      number;
4157     l_cur_phase                     varchar2(30);
4158     l_end                           date;
4159     l_start                         date;
4160 
4161     l_loan_header_rec               LNS_LOAN_HEADER_PUB.loan_header_rec_type;
4162     l_amortization_rec              lns_financials.AMORTIZATION_REC;
4163     l_term_rec                      LNS_TERMS_PUB.loan_term_rec_type;
4164 
4165 /*-----------------------------------------------------------------------+
4166  | Cursor Declarations                                                   |
4167  +-----------------------------------------------------------------------*/
4168 
4169     CURSOR term_version_cur(P_LOAN_ID number) IS
4170         select TERM_ID,
4171         OBJECT_VERSION_NUMBER
4172         from LNS_TERMS
4173         where LOAN_ID = P_LOAN_ID;
4174 
4175     /* get loan current phase */
4176     CURSOR loan_cur_phase_cur(P_LOAN_ID number) IS
4177         select nvl(CURRENT_PHASE, 'TERM')
4178         from LNS_LOAN_HEADERS
4179         where LOAN_ID = P_LOAN_ID;
4180 
4181 BEGIN
4182 
4183     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4184     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
4185 
4186     -- Standard start of API savepoint
4187     SAVEPOINT SINGLE_LOAN_NEXT_DD_PVT;
4188     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
4189 
4190     -- Standard call to check for call compatibility
4191     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4192       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4193     END IF;
4194 
4195     -- Initialize message list if p_init_msg_list is set to TRUE
4196     IF FND_API.To_Boolean(p_init_msg_list) THEN
4197       FND_MSG_PUB.initialize;
4198     END IF;
4199 
4200     -- Initialize API return status to success
4201     l_return_status := FND_API.G_RET_STS_SUCCESS;
4202 
4203     -- START OF BODY OF API
4204     l_start := sysdate;
4205 
4206     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4207     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id: ' || P_LOAN_NEXT_DD_REC.LOAN_ID);
4208     LogMessage(FND_LOG.LEVEL_STATEMENT, 'object_version: ' || P_LOAN_NEXT_DD_REC.OBJECT_VERSION_NUMBER);
4209     LogMessage(FND_LOG.LEVEL_STATEMENT, 'next_payment_number: ' || P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER);
4210     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || P_LOAN_NEXT_DD_REC.CUSTOM_PAYMENTS_FLAG);
4211 
4212     /* get loan current phase */
4213     open loan_cur_phase_cur(P_LOAN_NEXT_DD_REC.LOAN_ID);
4214     fetch loan_cur_phase_cur into l_cur_phase;
4215     close loan_cur_phase_cur;
4216 
4217     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_cur_phase);
4218     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting next payment due date from lns_financials.preProcessInstallment...');
4219 
4220     if l_cur_phase = 'TERM' then
4221         lns_financials.preProcessInstallment(
4222                 P_API_VERSION => 1.0,
4223                 P_INIT_MSG_LIST	=> FND_API.G_FALSE,
4224                 P_COMMIT => FND_API.G_FALSE,
4225                 p_loan_Id => P_LOAN_NEXT_DD_REC.LOAN_ID,
4226                 p_installment_number => P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER,
4227                 X_AMORTIZATION_REC => l_amortization_rec,
4228                 X_RETURN_STATUS => l_return_status,
4229                 X_MSG_COUNT => l_msg_count,
4230                 X_MSG_DATA => l_msg_data);
4231     else
4232         lns_financials.preProcessOpenInstallment(
4233 --                P_API_VERSION => 1.0,
4234                 P_INIT_MSG_LIST	=> FND_API.G_FALSE,
4235                 P_COMMIT => FND_API.G_FALSE,
4236                 p_loan_Id => P_LOAN_NEXT_DD_REC.LOAN_ID,
4237                 p_installment_number => P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER,
4238                 X_AMORTIZATION_REC => l_amortization_rec,
4239                 X_RETURN_STATUS => l_return_status,
4240                 X_MSG_COUNT => l_msg_count,
4241                 X_MSG_DATA => l_msg_data);
4242     end if;
4243 
4244     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Returns from lns_financials.preProcessInstallment:');
4245     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
4246     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
4247 
4248     l_next_payment_due_date := l_amortization_rec.due_date;
4249 
4250     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'next_payment_due_date: ' || l_next_payment_due_date);
4251 
4252     if l_next_payment_due_date is null then
4253 
4254 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Next installment date is unknown.');
4255     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INST_DUE_DATE');
4256 		FND_MSG_PUB.Add;
4257         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4258 	    RAISE FND_API.G_EXC_ERROR;
4259 
4260     end if;
4261 
4262     /* Updating loan header */
4263     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_LOAN_HEADER_ALL table...');
4264 
4265     l_loan_header_rec.loan_id := P_LOAN_NEXT_DD_REC.LOAN_ID;
4266     l_loan_header_rec.BILLED_FLAG := 'N';
4267     l_object_version_number := P_LOAN_NEXT_DD_REC.OBJECT_VERSION_NUMBER;
4268 
4269     LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_object_version_number,
4270                                     P_LOAN_HEADER_REC => l_loan_header_rec,
4271                                     P_INIT_MSG_LIST => FND_API.G_FALSE,
4272                                     X_RETURN_STATUS => l_return_status,
4273                                     X_MSG_COUNT => l_msg_count,
4274                                     X_MSG_DATA => l_msg_data);
4275 
4276     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4277 
4278     IF l_return_status = 'S' THEN
4279         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
4280     ELSE
4281 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_LOAN_HEADER_PUB.UPDATE_LOAN returned error: ' || substr(l_msg_data,1,225));
4282     	FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
4283 		FND_MSG_PUB.Add;
4284         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4285         RAISE FND_API.G_EXC_ERROR;
4286     END IF;
4287 
4288     /* getting terms version for future update */
4289     open term_version_cur(P_LOAN_NEXT_DD_REC.LOAN_ID);
4290     fetch term_version_cur into l_term_id, l_version_number;
4291     close term_version_cur;
4292 
4293     /* Updating terms */
4294     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_terms w following values:');
4295 
4296     l_term_rec.TERM_ID := l_term_id;
4297     l_term_rec.LOAN_ID := P_LOAN_NEXT_DD_REC.LOAN_ID;
4298 
4299     if l_cur_phase is null or l_cur_phase = 'TERM' then
4300         l_term_rec.NEXT_PAYMENT_DUE_DATE := l_next_payment_due_date;
4301         LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_DUE_DATE: ' || l_term_rec.NEXT_PAYMENT_DUE_DATE);
4302     elsif l_cur_phase = 'OPEN' then
4303         l_term_rec.OPEN_NEXT_PAYMENT_DATE := l_next_payment_due_date;
4304         LogMessage(FND_LOG.LEVEL_STATEMENT, 'OPEN_NEXT_PAYMENT_DATE: ' || l_term_rec.OPEN_NEXT_PAYMENT_DATE);
4305     end if;
4306 
4307     LNS_TERMS_PUB.update_term(P_OBJECT_VERSION_NUMBER => l_version_number,
4308                               p_init_msg_list => FND_API.G_FALSE,
4309                               p_loan_term_rec => l_term_rec,
4310                               X_RETURN_STATUS => l_return_status,
4311                               X_MSG_COUNT => l_msg_count,
4312                               X_MSG_DATA => l_msg_data);
4313 
4314     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4315 
4316     IF l_return_status = 'S' THEN
4317         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_TERMS');
4318     ELSE
4319 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_TERMS_PUB.update_term returned error: ' || substr(l_msg_data,1,225));
4320     	FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_TERM_FAIL');
4321 		FND_MSG_PUB.Add;
4322         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4323 	    RAISE FND_API.G_EXC_ERROR;
4324     END IF;
4325 
4326     l_end := sysdate;
4327     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4328 
4329     if P_COMMIT = FND_API.G_TRUE then
4330         COMMIT WORK;
4331         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4332     end if;
4333 
4334     -- END OF BODY OF API
4335     x_return_status := FND_API.G_RET_STS_SUCCESS;
4336 
4337     -- Standard call to get message count and if count is 1, get message info
4338     FND_MSG_PUB.Count_And_Get(
4339                 p_encoded => FND_API.G_FALSE,
4340                 p_count => x_msg_count,
4341                 p_data => x_msg_data);
4342 
4343     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully processed loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4344     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
4345 
4346 EXCEPTION
4347     WHEN FND_API.G_EXC_ERROR THEN
4348       ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4349       x_return_status := FND_API.G_RET_STS_ERROR;
4350       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4351       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4352     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4353       ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4354       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4355       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4356       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4357     WHEN OTHERS THEN
4358       ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4359       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4360       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
4361             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
4362       END IF;
4363       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4364       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4365 END;
4366 
4367 
4368 
4369 /*========================================================================
4370  | PUBLIC PROCEDURE LNS_BILLING_CONCUR
4371  |
4372  | DESCRIPTION
4373  |      This procedure got called from concurent manager to bill loans
4374  |
4375  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4376  |      None
4377  |
4378  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4379  |      init
4380  |      CALC_PAST_DUE_LOANS_NEXT_DD
4381  |      BILL_LOANS
4382  |      LogMessage
4383  |
4384  | PARAMETERS
4385  |      ERRBUF              OUT     Returns errors to CM
4386  |      RETCODE             OUT     Returns error code to CM
4387  |      BORROWER_ID         IN      Inputs borrower id
4388  |      LOAN_ID             IN      Inputs loan
4389  |      FROM_DAYS_TO_DD     IN      Inputs from days
4390  |      TO_DAYS_TO_DD       IN      Inputs to days
4391  |
4392  | KNOWN ISSUES
4393  |      None
4394  |
4395  | NOTES
4396  |      Any interesting aspect of the code in the package body which needs
4397  |      to be stated.
4398  |
4399  | MODIFICATION HISTORY
4400  | Date                  Author            Description of Changes
4401  | 01-01-2004            scherkas          Created
4402  |
4403  *=======================================================================*/
4404 PROCEDURE LNS_BILLING_CONCUR(
4405 	    ERRBUF              OUT NOCOPY     VARCHAR2,
4406 	    RETCODE             OUT NOCOPY     VARCHAR2,
4407         BORROWER_ID         IN             NUMBER,
4408         LOAN_ID             IN             NUMBER,
4409         FROM_DAYS_TO_DD     IN             NUMBER,
4410         TO_DAYS_TO_DD       IN             NUMBER)
4411 IS
4412 
4413 /*-----------------------------------------------------------------------+
4414  | Local Variable Declarations and initializations                       |
4415  +-----------------------------------------------------------------------*/
4416 	l_msg_count	        number;
4417     l_return            boolean;
4418 BEGIN
4419 
4420     g_cr_return_status := 'NORMAL';
4421 
4422     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4423     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Processing paid off loans...-------->>');
4424 
4425     PROCESS_PAID_LOANS(
4426     	P_API_VERSION => 1.0,
4427     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4428     	P_COMMIT => FND_API.G_TRUE,
4429     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4430         P_LOAN_ID => null,
4431         P_PAYOFF_DATE => sysdate,
4432     	X_RETURN_STATUS	=> RETCODE,
4433     	X_MSG_COUNT => l_msg_count,
4434     	X_MSG_DATA => ERRBUF);
4435 
4436     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4437 
4438     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4439     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Processing paid off loans that must be reactivated...-------->>');
4440 
4441     REACTIVATE_PAID_LOANS(
4442     	P_API_VERSION => 1.0,
4443     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4444     	P_COMMIT => FND_API.G_TRUE,
4445     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4446     	X_RETURN_STATUS	=> RETCODE,
4447     	X_MSG_COUNT => l_msg_count,
4448     	X_MSG_DATA => ERRBUF);
4449 
4450     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4451     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Recalculating due date for past due loans...-------->>');
4452 
4453     CALC_PAST_DUE_LOANS_NEXT_DD(
4454     	P_API_VERSION => 1.0,
4455     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4456     	P_COMMIT => FND_API.G_TRUE,
4457     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4458     	X_RETURN_STATUS	=> RETCODE,
4459     	X_MSG_COUNT => l_msg_count,
4460     	X_MSG_DATA => ERRBUF);
4461 
4462     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4463     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Billing loans...-------->>');
4464 
4465     /* bill loans and stores all last billed statements in g_last_all_statements */
4466     BILL_LOANS(
4467         P_API_VERSION => 1.0,
4468     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4469     	P_COMMIT => FND_API.G_TRUE,
4470     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4471         P_BORROWER_ID => BORROWER_ID,
4472         P_LOAN_ID => LOAN_ID,
4473         P_FROM_DAYS_TO_DD => FROM_DAYS_TO_DD,
4474         P_TO_DAYS_TO_DD => TO_DAYS_TO_DD,
4475     	X_RETURN_STATUS	=> RETCODE,
4476     	X_MSG_COUNT => l_msg_count,
4477     	X_MSG_DATA => ERRBUF);
4478 
4479     /* build billing report and stores it in g_last_billing_report */
4480     BUILD_BILLING_REPORT(P_BORROWER_ID => BORROWER_ID,
4481                          P_LOAN_ID => LOAN_ID,
4482                          P_FROM_DAYS_TO_DD => FROM_DAYS_TO_DD,
4483                          P_TO_DAYS_TO_DD => TO_DAYS_TO_DD,
4484                          P_STATEMENTS_XML => g_last_all_statements);
4485 
4486     if g_cr_return_status = 'WARNING' then
4487         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4488                         status => g_cr_return_status,
4489 			            message => 'Not all loans were billed successfully. Please review log file.');
4490     elsif g_cr_return_status = 'ERROR' then
4491         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4492                         status => g_cr_return_status,
4493 			            message => 'Billing process has failed. Please review log file.');
4494     end if;
4495 
4496 END;
4497 
4498 
4499 
4500 /*========================================================================
4501  | PUBLIC PROCEDURE LNS_RVRS_PMT_CONCUR
4502  |
4503  | DESCRIPTION
4504  |      This procedure got called from concurent manager to bill loans
4505  |
4506  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4507  |      None
4508  |
4509  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4510  |      init
4511  |      REVERSE_LAST_AMORTIZATION
4512  |      LogMessage
4513  |
4514  | PARAMETERS
4515  |      ERRBUF              OUT     Returns errors to CM
4516  |      RETCODE             OUT     Returns error code to CM
4517  |      LOAN_ID             IN      Inputs loan
4518  |      REBILL_FLAG         IN      Inputs rebill flag
4519  |
4520  | KNOWN ISSUES
4521  |      None
4522  |
4523  | NOTES
4524  |      Any interesting aspect of the code in the package body which needs
4525  |      to be stated.
4526  |
4527  | MODIFICATION HISTORY
4528  | Date                  Author            Description of Changes
4529  | 01-01-2004            scherkas          Created
4530  |
4531  *=======================================================================*/
4532 PROCEDURE LNS_RVRS_PMT_CONCUR(
4533         ERRBUF              OUT NOCOPY     VARCHAR2,
4534         RETCODE             OUT NOCOPY     VARCHAR2,
4535         LOAN_ID             IN             NUMBER,
4536         REBILL_FLAG         IN             VARCHAR2)
4537 IS
4538 
4539 /*-----------------------------------------------------------------------+
4540  | Local Variable Declarations and initializations                       |
4541  +-----------------------------------------------------------------------*/
4542 	l_msg_count	number;
4543     l_return    boolean;
4544 
4545 BEGIN
4546 
4547     g_cr_return_status := 'NORMAL';
4548 
4549     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4550     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Reversing a loans last payment...-------->>');
4551 
4552     REVERSE_LAST_AMORTIZATION(
4553         P_API_VERSION => 1.0,
4554     	P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4555     	P_COMMIT => FND_API.G_TRUE,
4556     	P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4557         P_LOAN_ID => LOAN_ID,
4558         P_REBILL_FLAG => REBILL_FLAG,
4559     	X_RETURN_STATUS	=> RETCODE,
4560     	X_MSG_COUNT => l_msg_count,
4561     	X_MSG_DATA => ERRBUF);
4562 
4563     if g_cr_return_status = 'WARNING' then
4564         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4565                         status => g_cr_return_status,
4566 			            message => 'Reversing process has succeeded with warnings. Please review log file.');
4567     elsif g_cr_return_status = 'ERROR' then
4568         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4569                         status => g_cr_return_status,
4570 			            message => 'Reversing process has failed. Please review log file.');
4571     end if;
4572 
4573 END;
4574 
4575 
4576 
4577 /*========================================================================
4578  | PUBLIC PROCEDURE LNS_ADJUST_RECEIV_CONCUR
4579  |
4580  | DESCRIPTION
4581  |      This procedure got called from concurent manager to adjust original receivables for a loan
4582  |
4583  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4584  |      None
4585  |
4586  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4587  |      init
4588  |      ADJUST_ORIGINAL_RECEIVABLE
4589  |      LogMessage
4590  |
4591  | PARAMETERS
4592  |      ERRBUF              OUT     Returns errors to CM
4593  |      RETCODE             OUT     Returns error code to CM
4594  |      LOAN_ID             IN      Inputs loan
4595  |
4596  | KNOWN ISSUES
4597  |      None
4598  |
4599  | NOTES
4600  |      Any interesting aspect of the code in the package body which needs
4601  |      to be stated.
4602  |
4603  | MODIFICATION HISTORY
4604  | Date                  Author            Description of Changes
4605  | 01-01-2004            scherkas          Created
4606  |
4607  *=======================================================================*/
4608 PROCEDURE LNS_ADJUST_RECEIV_CONCUR(
4609 	    ERRBUF              OUT NOCOPY     VARCHAR2,
4610 	    RETCODE             OUT NOCOPY     VARCHAR2,
4611         LOAN_ID             IN             NUMBER)
4612 IS
4613 
4614 /*-----------------------------------------------------------------------+
4615  | Local Variable Declarations and initializations                       |
4616  +-----------------------------------------------------------------------*/
4617 	l_msg_count	number;
4618     l_return    boolean;
4619 
4620 BEGIN
4621 
4622     LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4623 
4624     ADJUST_ORIGINAL_RECEIVABLE(
4625         P_API_VERSION => 1.0,
4626         P_INIT_MSG_LIST	=> FND_API.G_TRUE,
4627         P_COMMIT => FND_API.G_TRUE,
4628         P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4629         P_LOAN_ID => LOAN_ID,
4630         X_RETURN_STATUS	=> RETCODE,
4631         X_MSG_COUNT	=> l_msg_count,
4632         X_MSG_DATA => ERRBUF);
4633 
4634     if RETCODE <> 'S' then
4635         l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4636                         status => 'ERROR',
4637 			            message => 'Adjustment of original receivable has failed. Please review log file.');
4638     end if;
4639 
4640 END;
4641 
4642 
4643 
4644 /*========================================================================
4645  | PUBLIC PROCEDURE BILL_LOANS
4646  |
4647  | DESCRIPTION
4648  |      This procedure process all available loans
4649  |
4650  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4651  |      LNS_BILLING_CONCUR
4652  |
4653  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4654  |      init
4655  |      BILL_SINGLE_LOAN
4656  |      LogMessage
4657  |
4658  | PARAMETERS
4659  |      P_API_VERSION		IN          Standard in parameter
4660  |      P_INIT_MSG_LIST		IN          Standard in parameter
4661  |      P_COMMIT			IN          Standard in parameter
4662  |      P_VALIDATION_LEVEL	IN          Standard in parameter
4663  |      P_BORROWER_ID       IN          Inputs borrower id
4664  |      P_LOAN_ID           IN          Inputs loan id
4665  |      P_FROM_DAYS_TO_DD   IN          Inputs from days
4666  |      P_TO_DAYS_TO_DD     IN          Inputs to days
4667  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
4668  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
4669  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
4670  |
4671  | KNOWN ISSUES
4672  |      None
4673  |
4674  | NOTES
4675  |      Any interesting aspect of the code in the package body which needs
4676  |      to be stated.
4677  |
4678  | MODIFICATION HISTORY
4679  | Date                  Author            Description of Changes
4680  | 01-01-2004            scherkas          Created
4681  |
4682  *=======================================================================*/
4683 PROCEDURE BILL_LOANS(
4684     P_API_VERSION		IN          NUMBER,
4685     P_INIT_MSG_LIST		IN          VARCHAR2,
4686     P_COMMIT			IN          VARCHAR2,
4687     P_VALIDATION_LEVEL	IN          NUMBER,
4688     P_BORROWER_ID       IN          NUMBER,
4689     P_LOAN_ID           IN          NUMBER,
4690     P_FROM_DAYS_TO_DD   IN          NUMBER,
4691     P_TO_DAYS_TO_DD     IN          NUMBER,
4692     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
4693     X_MSG_COUNT			OUT NOCOPY  NUMBER,
4694     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
4695 IS
4696 
4697 /*-----------------------------------------------------------------------+
4698  | Local Variable Declarations and initializations                       |
4699  +-----------------------------------------------------------------------*/
4700 
4701     l_api_name                      CONSTANT VARCHAR2(30) := 'BILL_LOANS';
4702     l_api_version                   CONSTANT NUMBER := 1.0;
4703     l_return_status                 VARCHAR2(1);
4704     l_msg_count                     NUMBER;
4705     l_msg_data                      VARCHAR2(32767);
4706     l_Count                         number;
4707     l_Count1                        number;
4708     l_borrower_id                   number;
4709     l_loan_id                       number;
4710     l_from_date                     number;
4711     l_to_date                       number;
4712     l_new_line                      varchar2(1);
4713     l_error_statements_xml          clob;
4714     l_error_header                  varchar2(20);
4715     l_error_footer                  varchar2(20);
4716     l_single_statement_xml          clob;
4717     l_start                         date;
4718     l_end                           date;
4719     l_start1                        date;
4720     l_end1                          date;
4721 
4722     l_loans_to_bill_tbl		        LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
4723 
4724 /*-----------------------------------------------------------------------+
4725  | Cursor Declarations                                                   |
4726  +-----------------------------------------------------------------------*/
4727 
4728     /* get all loans to bill in all stages */
4729     CURSOR loans_to_bill_cur(P_BORROWER_ID number, P_LOAN_ID number, P_FROM_DAYS_TO_DD number, P_TO_DAYS_TO_DD number) IS
4730         select
4731             head.LOAN_ID,
4732             head.LOAN_NUMBER,
4733             head.LOAN_DESCRIPTION,
4734             head.OBJECT_VERSION_NUMBER,
4735             head.FUNDED_AMOUNT,
4736             head.BILL_TO_ACCT_SITE_ID,
4737             decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_FIRST_PAYMENT_DATE, term.FIRST_PAYMENT_DATE),
4738             decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE),
4739             nvl(head.BILLED_FLAG, 'N'),
4740             head.LOAN_CURRENCY,
4741             head.CUST_ACCOUNT_ID,
4742             decode(head.CURRENT_PHASE, 'OPEN', 'N', head.CUSTOM_PAYMENTS_FLAG),
4743             decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_PAYMENT_FREQUENCY, term.LOAN_PAYMENT_FREQUENCY),
4744             term.NUMBER_GRACE_DAYS,
4745             term.PAYMENT_APPLICATION_ORDER,
4746             head.EXCHANGE_RATE_TYPE,
4747             head.EXCHANGE_DATE,
4748             head.EXCHANGE_RATE,
4749             head.ORG_ID,
4750             head.LEGAL_ENTITY_ID,
4751             nvl(head.CURRENT_PHASE, 'TERM'),
4752             nvl(head.FORGIVENESS_FLAG, 'N'),
4753             nvl(head.FORGIVENESS_PERCENT, 0)
4754         from LNS_LOAN_HEADERS head,
4755             LNS_TERMS term
4756         where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
4757             and head.loan_id = term.loan_id
4758             and LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) < LNS_FIN_UTILS.getNumberInstallments(head.LOAN_ID, nvl(head.current_phase, 'TERM'))
4759             and (head.BILLED_FLAG is null or head.BILLED_FLAG = 'N')
4760             and head.PRIMARY_BORROWER_ID = nvl(P_BORROWER_ID, head.PRIMARY_BORROWER_ID)
4761             and head.LOAN_ID = nvl(P_LOAN_ID, head.LOAN_ID)
4762             and (trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
4763 				>= nvl(P_FROM_DAYS_TO_DD, trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
4764             and (trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
4765 				<= nvl(P_TO_DAYS_TO_DD, trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
4766         ORDER BY head.LOAN_ID;
4767 
4768 BEGIN
4769 
4770     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
4771 
4772     -- Standard start of API savepoint
4773     SAVEPOINT BILL_LOANS_PVT;
4774     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
4775 
4776     -- Standard call to check for call compatibility
4777     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4778         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4779     END IF;
4780 
4781     -- Initialize message list if p_init_msg_list is set to TRUE
4782     IF FND_API.To_Boolean(p_init_msg_list) THEN
4783       FND_MSG_PUB.initialize;
4784     END IF;
4785 
4786     -- Initialize API return status to success
4787     l_return_status := FND_API.G_RET_STS_SUCCESS;
4788 
4789     -- START OF BODY OF API
4790 
4791     /* init all_statements clob */
4792     dbms_lob.createtemporary(g_last_all_statements, FALSE, DBMS_LOB.CALL);
4793     dbms_lob.open(g_last_all_statements, dbms_lob.lob_readwrite);
4794 
4795     init;
4796 
4797     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Passed input parameters:');
4798     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Borrower ID: ' || P_BORROWER_ID);
4799     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ID: ' || P_LOAN_ID);
4800     LogMessage(FND_LOG.LEVEL_STATEMENT, 'From Days/Date: ' || P_FROM_DAYS_TO_DD || GET_BILLING_DATE(P_FROM_DAYS_TO_DD));
4801     LogMessage(FND_LOG.LEVEL_STATEMENT, 'To Days/Date: ' || P_TO_DAYS_TO_DD || GET_BILLING_DATE(P_TO_DAYS_TO_DD));
4802 
4803     /* making decision what to do */
4804     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Using following parameters:');
4805 
4806     if P_LOAN_ID is not null then   -- if loan_id is passed - ignore all other input parameters
4807 
4808         l_loan_id := P_LOAN_ID;
4809         l_borrower_id := null;
4810         l_from_date := null;
4811         l_to_date := null;
4812 
4813         LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Loan ID: ' || l_loan_id);
4814 
4815     elsif P_BORROWER_ID is null and P_FROM_DAYS_TO_DD is null and P_TO_DAYS_TO_DD is null then
4816 
4817         if g_days_to_bill_before_dd is null then
4818 --          LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: At least one of the days must be set.');
4819             FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_BILLING_INP_PAR');
4820             FND_MSG_PUB.Add;
4821             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4822             RAISE FND_API.G_EXC_ERROR;
4823         else
4824             l_to_date := g_days_to_bill_before_dd;
4825             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'To Days/Date: ' || l_to_date || GET_BILLING_DATE(l_to_date));
4826         end if;
4827 
4828 
4829     else
4830 
4831         l_loan_id := null;
4832         l_borrower_id := P_BORROWER_ID;
4833         l_from_date := P_FROM_DAYS_TO_DD;
4834         l_to_date := P_TO_DAYS_TO_DD;
4835 
4836         if l_borrower_id is not null then
4837             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Borrower ID: ' || l_borrower_id);
4838         end if;
4839 
4840         if l_from_date is not null then
4841             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'From Days/Date: ' || l_from_date || GET_BILLING_DATE(l_from_date));
4842         end if;
4843 
4844         if l_to_date is not null then
4845             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'To Days/Date: ' || l_to_date || GET_BILLING_DATE(l_to_date));
4846         end if;
4847 
4848     end if;
4849 
4850     /* quering for loans */
4851     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Searching for not billed yet loans to process...');
4852 
4853     open loans_to_bill_cur(l_borrower_id, l_loan_id, l_from_date, l_to_date);
4854 
4855     l_Count1 := 0;
4856 
4857     LOOP
4858 
4859         l_Count1 := l_Count1+1;
4860 
4861         fetch loans_to_bill_cur into
4862             l_loans_to_bill_tbl(l_Count1).LOAN_ID,
4863             l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER,
4864             l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION,
4865             l_loans_to_bill_tbl(l_Count1).OBJECT_VERSION_NUMBER,
4866             l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT,
4867             l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID,
4868             l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE,
4869             l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE,
4870             l_loans_to_bill_tbl(l_Count1).BILLED_FLAG,
4871             l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY,
4872             l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID,
4873             l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG,
4874             l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY,
4875             l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS,
4876             l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER,
4877             l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE,
4878             l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE,
4879             l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE,
4880             l_loans_to_bill_tbl(l_Count1).ORG_ID,
4881             l_loans_to_bill_tbl(l_Count1).LEGAL_ENTITY_ID,
4882             l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE,
4883             l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG,
4884             l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT;
4885 
4886         exit when loans_to_bill_cur%NOTFOUND;
4887 
4888         LogMessage(FND_LOG.LEVEL_STATEMENT, ' ');
4889         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan #' || l_Count1);
4890         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
4891         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER: ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
4892         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_DESCRIPTION: ' || l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION);
4893         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT);
4894         LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID);
4895         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FIRST_PAYMENT_DATE: ' || l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE);
4896         LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_DUE_DATE: ' || l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE);
4897         LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || l_loans_to_bill_tbl(l_Count1).BILLED_FLAG);
4898         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY);
4899         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID);
4900         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG);
4901         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_PAYMENT_FREQUENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY);
4902         LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS);
4903         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER);
4904         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE);
4905         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE);
4906         LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE);
4907         LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || l_loans_to_bill_tbl(l_Count1).ORG_ID);
4908         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LEGAL_ENTITY_ID: ' || l_loans_to_bill_tbl(l_Count1).LEGAL_ENTITY_ID);
4909         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE);
4910         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG);
4911         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_PERCENT: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT);
4912 
4913     END LOOP;
4914 
4915     close loans_to_bill_cur;
4916 
4917     l_Count := l_loans_to_bill_tbl.count;
4918     LogMessage(FND_LOG.LEVEL_STATEMENT, '______________');
4919     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total found ' || l_Count || ' loan(s) to process');
4920 
4921     if l_Count > 0 then
4922 
4923         dbms_lob.createtemporary(l_error_statements_xml, FALSE, DBMS_LOB.CALL);
4924         dbms_lob.open(l_error_statements_xml, dbms_lob.lob_readwrite);
4925 
4926         /* bill all selected loans */
4927         FOR l_Count1 IN 1..l_loans_to_bill_tbl.COUNT LOOP
4928 
4929             LogMessage(FND_LOG.LEVEL_PROCEDURE, ' ');
4930             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Processing loan #' || l_Count1);
4931 
4932             l_start := sysdate;
4933             BILL_SINGLE_LOAN(
4934             		P_API_VERSION => 1.0,
4935             		P_INIT_MSG_LIST	=> FND_API.G_FALSE,
4936             		P_COMMIT => P_COMMIT,
4937             		P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4938                     P_LOAN_REC => l_loans_to_bill_tbl(l_Count1),
4939                     X_STATEMENT_XML => l_single_statement_xml,
4940             		X_RETURN_STATUS	=> l_return_status,
4941             		X_MSG_COUNT => l_msg_count,
4942             		X_MSG_DATA => l_msg_data);
4943 
4944             l_end := sysdate;
4945             LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total billing timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4946 
4947             IF l_return_status = 'S' THEN   /* append to all statements clob */
4948 
4949                 dbms_lob.Append(g_last_all_statements, l_single_statement_xml);
4950 
4951 	            -- loan forgiveness adjustment: fix for bug 7387659
4952 	            if l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG = 'Y' and
4953 	               l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT > 0 and
4954 	               g_forgiveness_rec_trx_id is not null then
4955 
4956 	                LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Performing loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID || '...');
4957 	                l_start1 := sysdate;
4958 	                FORGIVENESS_ADJUSTMENT(
4959 	                        P_API_VERSION => 1.0,
4960 	                        P_INIT_MSG_LIST	=> FND_API.G_FALSE,
4961 	                        P_COMMIT => P_COMMIT,
4962 	                        P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4963 	                        P_LOAN_ID => l_loans_to_bill_tbl(l_Count1).LOAN_ID,
4964 	                        X_RETURN_STATUS	=> l_return_status,
4965 	                        X_MSG_COUNT => l_msg_count,
4966 	                        X_MSG_DATA => l_msg_data);
4967 
4968 	                IF l_return_status = 'S' THEN
4969 	                    LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully performed forgiveness adjustment.');
4970 	                ELSE
4971 	                    g_cr_return_status := 'WARNING';
4972 	                    LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to perform forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
4973 	                END IF;
4974 
4975 	                l_end1 := sysdate;
4976 	                LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness adjustment timing: ' || round((l_end1 - l_start1)*86400, 2) || ' sec');
4977 
4978 	            else
4979 	                LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will not perform loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
4980 	            end if;
4981 
4982             ELSE    /* otherwise append to errors clob */
4983 
4984                 dbms_lob.Append(l_error_statements_xml, l_single_statement_xml);
4985 
4986             END IF;
4987 
4988         END LOOP;
4989 
4990         /* if there are errors, add errors section */
4991         if dbms_lob.getlength(l_error_statements_xml) > 0 then
4992 
4993             l_new_line := '
4994 ';
4995             l_error_header := l_new_line || '<ERRORS>' || l_new_line;
4996             l_error_footer := l_new_line || '</ERRORS>' || l_new_line;
4997             dbms_lob.writeAppend(g_last_all_statements, length(l_error_header), l_error_header);
4998             dbms_lob.Append(g_last_all_statements, l_error_statements_xml);
4999             dbms_lob.writeAppend(g_last_all_statements, length(l_error_footer), l_error_footer);
5000 
5001         end if;
5002 
5003 
5004     END IF;
5005 
5006     LogMessage(FND_LOG.LEVEL_PROCEDURE, '______________');
5007     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total processed ' || (l_Count1-1) || ' loan(s)');
5008 
5009     if P_COMMIT = FND_API.G_TRUE then
5010         COMMIT WORK;
5011         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loans');
5012     end if;
5013 
5014     -- END OF BODY OF API
5015     x_return_status := FND_API.G_RET_STS_SUCCESS;
5016 
5017     -- Standard call to get message count and if count is 1, get message info
5018     FND_MSG_PUB.Count_And_Get(
5019                 p_encoded => FND_API.G_FALSE,
5020                 p_count => x_msg_count,
5021                 p_data => x_msg_data);
5022 
5023     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5024 
5025 EXCEPTION
5026     WHEN FND_API.G_EXC_ERROR THEN
5027         ROLLBACK TO BILL_LOANS_PVT;
5028         x_return_status := FND_API.G_RET_STS_ERROR;
5029         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5030         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5031         g_cr_return_status := 'ERROR';
5032     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5033         ROLLBACK TO BILL_LOANS_PVT;
5034         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5035         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5036         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5037         g_cr_return_status := 'ERROR';
5038     WHEN OTHERS THEN
5039         ROLLBACK TO BILL_LOANS_PVT;
5040         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5041         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5042             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5043         END IF;
5044         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5045         LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5046         g_cr_return_status := 'ERROR';
5047 END;
5048 
5049 
5050 
5051 /*========================================================================
5052  | PUBLIC PROCEDURE CALC_PAST_DUE_LOANS_NEXT_DD
5053  |
5054  | DESCRIPTION
5055  |      This procedure recalculates next payment due date for all past due loans
5056  |
5057  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5058  |      LNS_BILLING_CONCUR
5059  |
5060  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5061  |      init
5062  |      CALC_SINGLE_LOAN_NEXT_DD
5063  |      LogMessage
5064  |
5065  | PARAMETERS
5066  |      P_API_VERSION		IN          Standard in parameter
5067  |      P_INIT_MSG_LIST		IN          Standard in parameter
5068  |      P_COMMIT			IN          Standard in parameter
5069  |      P_VALIDATION_LEVEL	IN          Standard in parameter
5070  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
5071  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
5072  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
5073  |
5074  | KNOWN ISSUES
5075  |      None
5076  |
5077  | NOTES
5078  |      Any interesting aspect of the code in the package body which needs
5079  |      to be stated.
5080  |
5081  | MODIFICATION HISTORY
5082  | Date                  Author            Description of Changes
5083  | 01-01-2004            scherkas          Created
5084  |
5085  *=======================================================================*/
5086 PROCEDURE CALC_PAST_DUE_LOANS_NEXT_DD(
5087     P_API_VERSION		IN          NUMBER,
5088     P_INIT_MSG_LIST		IN          VARCHAR2,
5089     P_COMMIT			IN          VARCHAR2,
5090     P_VALIDATION_LEVEL	IN          NUMBER,
5091     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
5092     X_MSG_COUNT			OUT NOCOPY  NUMBER,
5093     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
5094 IS
5095 
5096 /*-----------------------------------------------------------------------+
5097  | Local Variable Declarations and initializations                       |
5098  +-----------------------------------------------------------------------*/
5099 
5100     l_api_name                      CONSTANT VARCHAR2(30) := 'CALC_PAST_DUE_LOANS_NEXT_DD';
5101     l_api_version                   CONSTANT NUMBER := 1.0;
5102     l_return_status                 VARCHAR2(1);
5103     l_msg_count                     NUMBER;
5104     l_msg_data                      VARCHAR2(32767);
5105     l_org_id                        number;
5106     l_Count1                        number;
5107     l_next_payment_due_date         date;
5108     l_end                           date;
5109     l_start                         date;
5110 
5111     l_loans_next_dd_rec             LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
5112 
5113 /*-----------------------------------------------------------------------+
5114  | Cursor Declarations                                                   |
5115  +-----------------------------------------------------------------------*/
5116 
5117     CURSOR past_due_loans_cur IS
5118         select
5119             head.LOAN_ID,
5120             head.LOAN_NUMBER,
5121             head.OBJECT_VERSION_NUMBER,
5122             LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) + 1,
5123             head.CUSTOM_PAYMENTS_FLAG
5124         from LNS_LOAN_HEADERS head,
5125             LNS_TERMS term
5126         where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
5127             and head.loan_id = term.loan_id
5128             and (head.BILLED_FLAG = 'Y' or head.BILLED_FLAG is null)  -- scherkas; fix for bug 5687852
5129             and LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) < LNS_FIN_UTILS.getNumberInstallments(head.LOAN_ID, nvl(head.current_phase, 'TERM'))
5130             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)
5131         ORDER BY head.LOAN_ID;
5132 
5133 BEGIN
5134 
5135     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5136 
5137     -- Standard start of API savepoint
5138     SAVEPOINT LOANS_NEXT_DD_PVT;
5139     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
5140 
5141     -- Standard call to check for call compatibility
5142     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5143       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5144     END IF;
5145 
5146     -- Initialize message list if p_init_msg_list is set to TRUE
5147     IF FND_API.To_Boolean(p_init_msg_list) THEN
5148       FND_MSG_PUB.initialize;
5149     END IF;
5150 
5151     -- Initialize API return status to success
5152     l_return_status := FND_API.G_RET_STS_SUCCESS;
5153 
5154     -- START OF BODY OF API
5155 
5156     init;
5157 
5158     /* quering for loans past due */
5159     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Searching for loans to process...');
5160 
5161     l_start := sysdate;
5162     open past_due_loans_cur;
5163 
5164     l_Count1 := 1;
5165 
5166     LOOP
5167 
5168             fetch past_due_loans_cur into
5169                 l_loans_next_dd_rec.LOAN_ID,
5170                 l_loans_next_dd_rec.LOAN_NUMBER,
5171                 l_loans_next_dd_rec.OBJECT_VERSION_NUMBER,
5172                 l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER,
5173                 l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG;
5174 
5175             exit when past_due_loans_cur%NOTFOUND;
5176 
5177             l_Count1 := l_Count1+1;
5178 
5179             CALC_SINGLE_LOAN_NEXT_DD(
5180         		P_API_VERSION => 1.0,
5181         		P_INIT_MSG_LIST	=> FND_API.G_FALSE,
5182         		P_COMMIT => P_COMMIT,
5183         		P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5184                 P_LOAN_NEXT_DD_REC => l_loans_next_dd_rec,
5185         		X_RETURN_STATUS	=> l_return_status,
5186         		X_MSG_COUNT => l_msg_count,
5187         		X_MSG_DATA => l_msg_data);
5188 
5189     END LOOP;
5190 
5191     close past_due_loans_cur;
5192 
5193     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
5194     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || (l_Count1-1) || ' loan(s)');
5195     l_end := sysdate;
5196     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All Recalc Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
5197 
5198     if P_COMMIT = FND_API.G_TRUE then
5199         COMMIT WORK;
5200         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loans');
5201     end if;
5202 
5203     -- END OF BODY OF API
5204     x_return_status := FND_API.G_RET_STS_SUCCESS;
5205 
5206     -- Standard call to get message count and if count is 1, get message info
5207     FND_MSG_PUB.Count_And_Get(
5208                 p_encoded => FND_API.G_FALSE,
5209                 p_count => x_msg_count,
5210                 p_data => x_msg_data);
5211 
5212     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5213 
5214 EXCEPTION
5215     WHEN FND_API.G_EXC_ERROR THEN
5216       ROLLBACK TO LOANS_NEXT_DD_PVT;
5217       x_return_status := FND_API.G_RET_STS_ERROR;
5218       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5219       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5220     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5221       ROLLBACK TO LOANS_NEXT_DD_PVT;
5222       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5223       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5224       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5225     WHEN OTHERS THEN
5226       ROLLBACK TO LOANS_NEXT_DD_PVT;
5227       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5228       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5229             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5230       END IF;
5231       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5232       LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5233 END;
5234 
5235 
5236 
5237 /*========================================================================
5238  | PUBLIC PROCEDURE REVERSE_LAST_AMORTIZATION
5239  |
5240  | DESCRIPTION
5241  |      This procedure reverses a loans last bill
5242  |
5243  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5244  |      LNS_RVRS_PMT_CONCUR
5245  |
5246  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5247  |      init
5248  |      CREATE_AR_CM
5249  |      LogMessage
5250  |
5251  | PARAMETERS
5252  |      P_API_VERSION		IN          Standard in parameter
5253  |      P_INIT_MSG_LIST		IN          Standard in parameter
5254  |      P_COMMIT			IN          Standard in parameter
5255  |      P_VALIDATION_LEVEL	IN          Standard in parameter
5256  |      P_LOAN_ID           IN          Inputs loan id
5257  |      P_REBILL_FLAG       IN          Inputs rebill flag
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  | 01-20-2006            raverma           delete row from rate_scheds for variable rate loan
5273  | 06-16-2006            karamach          Removed code that deleted the rate sch row from lns_rate_schedules
5274  | and added fix in LNS_FINANCIAL_B.pls floatingRatePostProcessing procedure to update existing row to fix bug5331888
5275  | 07-31-2006            karamach          Added code to update active_flag to N in lns_fee_schedules for unbilled manual fees to fix bug5397345
5276  *=======================================================================*/
5277 PROCEDURE REVERSE_LAST_AMORTIZATION(
5278     P_API_VERSION		IN          NUMBER,
5279     P_INIT_MSG_LIST		IN          VARCHAR2,
5280     P_COMMIT			IN          VARCHAR2,
5281     P_VALIDATION_LEVEL	IN          NUMBER,
5282     P_LOAN_ID           IN          NUMBER,
5283     P_REBILL_FLAG       IN          VARCHAR2,
5284     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
5285     X_MSG_COUNT			OUT NOCOPY  NUMBER,
5286     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
5287 IS
5288 
5289 /*-----------------------------------------------------------------------+
5290  | Local Variable Declarations and initializations                       |
5291  +-----------------------------------------------------------------------*/
5292     l_api_name                      CONSTANT VARCHAR2(30) := 'REVERSE_LAST_AMORTIZATION';
5293     l_api_version                   CONSTANT NUMBER := 1.0;
5294     l_return_status                 VARCHAR2(1);
5295     l_msg_count                     NUMBER;
5296     l_msg_data                      VARCHAR2(32767);
5297     l_Count                         number;
5298     l_LAST_PAYMENT_NUMBER           number;
5299     l_amortization_schedule_id      number;
5300     l_batch_source_name             varchar2(50);
5301     l_custom_payment_flag           varchar2(1);
5302     l_next_payment_due_date         date;
5303     l_term_id                       number;
5304     l_version_number                number;
5305     l_BILL_PAY_ID                   number;
5306     l_CUSTOMER_TRX_ID               number;
5307     l_PAYMENT_SCHEDULE_ID           number;
5308     l_CUSTOMER_TRX_LINE_ID          number;
5309     l_LINE_TYPE                     varchar2(30);
5310     l_TRX_AMOUNT                    number;
5311     l_APPLIED_AMOUNT                number;
5312     l_request_id                    number;
5313     l_TRX_NUMBER                    varchar2(20);
5314     l_loan_number                   varchar2(60);
5315     l_due_date                      date;
5316     l_ORG_ID                        number;
5317     l_last_rate_id                  number;
5318     l_rate_type                     varchar2(30);
5319 
5320     l_reverse_tbl                   LNS_BILLING_BATCH_PUB.REVERSE_TBL;
5321     l_loans_next_dd_rec             LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
5322     l_INSTALLMENT_REC               LNS_CUSTOM_PUB.custom_sched_type;
5323     l_principal                     NUMBER;
5324     l_interest                      NUMBER;
5325 
5326 /*-----------------------------------------------------------------------+
5327  | Cursor Declarations                                                   |
5328  +-----------------------------------------------------------------------*/
5329 
5330     CURSOR last_loan_amort_cur(P_LOAN_ID number) IS
5331         select PAYMENT_NUMBER,
5332             DUE_DATE,
5333             AMORTIZATION_SCHEDULE_ID,
5334             RATE_ID
5335         from LNS_AMORTIZATION_SCHEDS
5336         where LOAN_ID = P_LOAN_ID
5337             and AMORTIZATION_SCHEDULE_ID = LNS_BILLING_UTIL_PUB.LAST_AMORTIZATION_SCHED(LOAN_ID);
5338 
5339     CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number) IS
5340         select
5341             trx.trx_number,
5342             trx.customer_trx_id,
5343             psa.payment_schedule_id,
5344             lines.CUST_TRX_LINE_ID,
5345             lines.LINE_TYPE,
5346             lines.AMOUNT,
5347             (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
5348             trx.org_id
5349         from
5350             RA_CUSTOMER_TRX_ALL trx,
5351             lns_amortization_lines lines,
5352             ar_payment_schedules psa
5353         where
5354             trx.customer_trx_id = lines.CUST_TRX_ID and
5355             trx.customer_trx_id = psa.customer_trx_id and
5356             lines.LOAN_ID = P_LOAN_ID and
5357             lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
5358 
5359     CURSOR loan_version_cur(P_LOAN_ID number) IS
5360         select
5361             LOAN_NUMBER,
5362             OBJECT_VERSION_NUMBER,
5363             CUSTOM_PAYMENTS_FLAG
5364         from LNS_LOAN_HEADERS
5365         where LOAN_ID = P_LOAN_ID;
5366 
5367     CURSOR terms_cur(P_LOAN_ID number) IS
5368         select rate_type
5369         from LNS_TERMS
5370         where LOAN_ID = P_LOAN_ID;
5371 
5372 BEGIN
5373 
5374     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5375 
5376     -- Standard start of API savepoint
5377     SAVEPOINT REVERSE_LAST_AMORTIZATION;
5378     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
5379 
5380     -- Standard call to check for call compatibility
5381     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5382       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5383     END IF;
5384 
5385     -- Initialize message list if p_init_msg_list is set to TRUE
5386     IF FND_API.To_Boolean(p_init_msg_list) THEN
5387       FND_MSG_PUB.initialize;
5388     END IF;
5389 
5390     -- Initialize API return status to success
5391     l_return_status := FND_API.G_RET_STS_SUCCESS;
5392 
5393     -- START OF BODY OF API
5394 
5395     init;
5396 
5397     /* getting object version and custom flag for further loan update */
5398 
5399     open loan_version_cur(P_LOAN_ID);
5400     fetch loan_version_cur into l_loan_number, l_version_number, l_custom_payment_flag;
5401     close loan_version_cur;
5402 
5403     open terms_cur(p_loan_id);
5404       fetch terms_cur into l_rate_type;
5405     close terms_cur;
5406 
5407     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reversing loan ' || l_loan_number);
5408     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id ' || P_LOAN_ID);
5409     LogMessage(FND_LOG.LEVEL_PROCEDURE, 'rate type ' || l_rate_type);
5410 
5411     /* verify input parameters */
5412     if P_LOAN_ID is null then
5413 
5414 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
5415     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
5416 		FND_MSG_PUB.Add;
5417         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
5418         RAISE FND_API.G_EXC_ERROR;
5419 
5420     end if;
5421 
5422     /* quering for last loan amortization record */
5423     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for last amortization record in LNS_AMORTIZATION_SCHEDS:');
5424 
5425     open last_loan_amort_cur(P_LOAN_ID);
5426 
5427     fetch last_loan_amort_cur into
5428         l_LAST_PAYMENT_NUMBER,
5429         l_due_date,
5430         l_amortization_schedule_id,
5431         l_last_rate_id;
5432 
5433     if last_loan_amort_cur%NOTFOUND then
5434 
5435 		LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'No amortization record found. Exiting');
5436         return;
5437 
5438 	else
5439 
5440 	    LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
5441         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || l_LAST_PAYMENT_NUMBER);
5442         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || l_due_date);
5443         LogMessage(FND_LOG.LEVEL_STATEMENT, 'amortization_schedule_id: ' || l_amortization_schedule_id);
5444 
5445 	end if;
5446 
5447     close last_loan_amort_cur;
5448 
5449     /* Quering for invoices with lines to reverse */
5450     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to reverse...');
5451 
5452     l_Count := 0;
5453     l_principal := 0;
5454     l_interest := 0;
5455     open trx_to_reverse_cur(P_LOAN_ID, l_amortization_schedule_id);
5456 
5457     LOOP
5458 
5459         fetch trx_to_reverse_cur into
5460             l_TRX_NUMBER,
5461             l_CUSTOMER_TRX_ID,
5462             l_PAYMENT_SCHEDULE_ID,
5463             l_CUSTOMER_TRX_LINE_ID,
5464             l_LINE_TYPE,
5465             l_TRX_AMOUNT,
5466             l_APPLIED_AMOUNT,
5467             l_ORG_ID;
5468 
5469         exit when trx_to_reverse_cur%NOTFOUND;
5470 
5471         l_Count := l_Count+1;
5472 
5473         l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
5474         l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
5475         l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
5476         l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
5477         l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
5478         l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
5479         l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
5480         l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
5481 
5482         if l_LINE_TYPE = 'PRIN' then
5483             l_principal := l_principal + l_TRX_AMOUNT;
5484         elsif l_LINE_TYPE = 'INT' then
5485             l_interest := l_interest + l_TRX_AMOUNT;
5486         end if;
5487 
5488     END LOOP;
5489 
5490     close trx_to_reverse_cur;
5491 
5492     /* Verify count */
5493     if l_reverse_tbl.count = 0 then
5494 
5495 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No trx lines found to reverse.');
5496     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
5497 		FND_MSG_PUB.Add;
5498         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
5499 	    RAISE FND_API.G_EXC_ERROR;
5500 
5501     end if;
5502 
5503     /* Create credit memos */
5504     CREATE_AR_CM(l_reverse_tbl);
5505 
5506     /* Deleting reamortize record */
5507     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Deleting reamortize record...');
5508 
5509     delete from LNS_AMORTIZATION_SCHEDS
5510     where loan_id = P_LOAN_ID and
5511     REAMORTIZE_FROM_INSTALLMENT = l_last_payment_number;
5512 
5513     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Deleted!');
5514 
5515     /* Update amortization table */
5516     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
5517 
5518     LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
5519         P_AMORTIZATION_SCHEDULE_ID => l_amortization_schedule_id
5520         ,P_REVERSED_FLAG => 'Y'
5521         ,P_REVERSED_DATE => sysdate);
5522 
5523     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
5524 
5525     -- fix for bug 7716548: if its custom schedule call LNS_CUSTOM_PUB.addMissingInstallment to add custom row if needed
5526     if l_custom_payment_flag = 'Y' then
5527 
5528         l_INSTALLMENT_REC.LOAN_ID := P_LOAN_ID;
5529         l_INSTALLMENT_REC.PAYMENT_NUMBER := l_LAST_PAYMENT_NUMBER;
5530         l_INSTALLMENT_REC.DUE_DATE := l_due_date;
5531         l_INSTALLMENT_REC.PRINCIPAL_AMOUNT := l_principal;
5532         l_INSTALLMENT_REC.INTEREST_AMOUNT := l_interest;
5533         l_INSTALLMENT_REC.LOCK_PRIN := 'Y';
5534         l_INSTALLMENT_REC.LOCK_INT := 'Y';
5535 
5536         LNS_CUSTOM_PUB.addMissingInstallment(
5537             P_API_VERSION		=> 1.0,
5538             P_INIT_MSG_LIST		=> FND_API.G_FALSE,
5539             P_COMMIT			=> FND_API.G_FALSE,
5540             P_VALIDATION_LEVEL	=> FND_API.G_VALID_LEVEL_FULL,
5541             P_INSTALLMENT_REC   => l_INSTALLMENT_REC,
5542             X_RETURN_STATUS		=> l_return_status,
5543             X_MSG_COUNT			=> l_msg_count,
5544             X_MSG_DATA	    	=> l_msg_data);
5545 
5546         IF l_return_status <> 'S' THEN
5547             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to insert missing custom schedule row.');
5548         END IF;
5549 
5550     end if;
5551 
5552 
5553     /* recalculating next due date */
5554     l_loans_next_dd_rec.LOAN_ID := P_LOAN_ID;
5555     l_loans_next_dd_rec.LOAN_NUMBER := l_loan_number;
5556     l_loans_next_dd_rec.OBJECT_VERSION_NUMBER := l_version_number;
5557     l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER := l_LAST_PAYMENT_NUMBER;
5558     l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG := l_custom_payment_flag;
5559 
5560     CALC_SINGLE_LOAN_NEXT_DD(
5561         P_API_VERSION => 1.0,
5562         P_INIT_MSG_LIST	=> FND_API.G_FALSE,
5563         P_COMMIT => P_COMMIT,
5564         P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5565         P_LOAN_NEXT_DD_REC => l_loans_next_dd_rec,
5566         X_RETURN_STATUS	=> l_return_status,
5567         X_MSG_COUNT => l_msg_count,
5568         X_MSG_DATA => l_msg_data);
5569 
5570 
5571     IF l_return_status = 'S' THEN
5572         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully calculated next payment due date.');
5573     ELSE
5574 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to calculate next payment due date.');
5575     	FND_MESSAGE.SET_NAME('LNS', 'LNS_CALC_NEXT_DUE_FAIL');
5576 		FND_MSG_PUB.Add;
5577         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
5578         RAISE FND_API.G_EXC_ERROR;
5579     END IF;
5580 
5581     STORE_LAST_PAYMENT_NUMBER(P_LOAN_ID);
5582 
5583     if P_COMMIT = FND_API.G_TRUE then
5584         COMMIT WORK;
5585         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
5586     end if;
5587 
5588     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reversed loan ' || l_loan_number);
5589 
5590     /* start billing process if P_REBILL_FLAG = 'Y' */
5591     if P_REBILL_FLAG = 'Y' then
5592 
5593         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Reprocessing Fees for loan ' || l_loan_number || ' payment number ' || l_LAST_PAYMENT_NUMBER);
5594         LNS_FEE_ENGINE.reprocessFees(
5595             p_loan_id            => P_LOAN_ID,
5596             p_installment_number => l_LAST_PAYMENT_NUMBER,
5597             p_init_msg_list      => FND_API.G_TRUE,
5598             p_commit             => FND_API.G_TRUE,
5599             x_return_status      => l_return_status,
5600             x_msg_count          => l_msg_count,
5601             x_msg_data           => l_msg_data);
5602 
5603         IF l_return_status = 'S' THEN
5604             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully reprocessed fees.');
5605         ELSE
5606             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to reprocess fees.');
5607             RAISE FND_API.G_EXC_ERROR;
5608         END IF;
5609 
5610         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Starting billing for loan ' || l_loan_number);
5611 
5612         BILL_LOANS(
5613             P_API_VERSION => 1.0,
5614             P_INIT_MSG_LIST	=> FND_API.G_TRUE,
5615             P_COMMIT => FND_API.G_TRUE,
5616             P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5617             P_BORROWER_ID => null,
5618             P_LOAN_ID => P_LOAN_ID,
5619             P_FROM_DAYS_TO_DD => null,
5620             P_TO_DAYS_TO_DD => null,
5621             X_RETURN_STATUS	=> l_return_status,
5622             X_MSG_COUNT => l_msg_count,
5623             X_MSG_DATA => l_msg_data);
5624 
5625         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Done billing for loan ' || l_loan_number);
5626 
5627     else
5628         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Before inactivating unbilled manual fees for this installment: ' || l_LAST_PAYMENT_NUMBER);
5629 	--Bug5397345
5630 	--Make sure unbilled manual fees for this reversed installment are inactivated
5631 	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
5632 	WHERE LOAN_ID = P_LOAN_ID AND BILLED_FLAG = 'N' AND FEE_INSTALLMENT = l_LAST_PAYMENT_NUMBER;
5633         LogMessage(FND_LOG.LEVEL_STATEMENT, 'After inactivating unbilled manual fees by updating the active_flag in lns_fee_schedules for this loan and installment');
5634 
5635     end if;
5636 
5637     -- END OF BODY OF API
5638     x_return_status := FND_API.G_RET_STS_SUCCESS;
5639 
5640     -- Standard call to get message count and if count is 1, get message info
5641     FND_MSG_PUB.Count_And_Get(
5642                 p_encoded => FND_API.G_FALSE,
5643                 p_count => x_msg_count,
5644                 p_data => x_msg_data);
5645 
5646     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5647 
5648 EXCEPTION
5649     WHEN FND_API.G_EXC_ERROR THEN
5650         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
5651         x_return_status := FND_API.G_RET_STS_ERROR;
5652         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5653         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
5654         g_cr_return_status := 'ERROR';
5655     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5656         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
5657         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5658         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5659         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
5660         g_cr_return_status := 'ERROR';
5661     WHEN OTHERS THEN
5662         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
5663         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5664         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5665             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5666         END IF;
5667         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5668         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
5669         g_cr_return_status := 'ERROR';
5670 END;
5671 
5672 
5673 /*========================================================================
5674  | PUBLIC PROCEDURE CREDIT_AMORTIZATION_PARTIAL
5675  |
5676  | DESCRIPTION
5677  |      This procedure will credit a portion of the last amortization.
5678  |       The portion can be principal interest or fees
5679  |
5680  | PSEUDO CODE/LOGIC
5681  |
5682  | PARAMETERS
5683  |      P_API_VERSION       IN          Standard in parameter
5684  |      P_INIT_MSG_LIST     IN          Standard in parameter
5685  |      P_COMMIT            IN          Standard in parameter
5686  |      P_VALIDATION_LEVEL  IN          Standard in parameter
5687  |      P_LOAN_ID           IN          Inputs loan id
5688  |      P_LINE_TYPE         IN          PRIN or INT or FEE
5689  |      X_RETURN_STATUS     OUT NOCOPY  Standard out parameter
5690  |      X_MSG_COUNT         OUT NOCOPY  Standard out parameter
5691  |      X_MSG_DATA          OUT NOCOPY  Standard out parameter
5692  |
5693  | KNOWN ISSUES
5694  |      None
5695  |
5696  | NOTES
5697  |
5698  | MODIFICATION HISTORY
5699  | Date                  Author            Description of Changes
5700  | 10-12-2004            raverma          Created
5701  |
5702  *=======================================================================*/
5703 PROCEDURE CREDIT_AMORTIZATION_PARTIAL(P_API_VERSION       IN          NUMBER
5704                                      ,P_INIT_MSG_LIST     IN          VARCHAR2
5705                                      ,P_COMMIT            IN          VARCHAR2
5706                                      ,P_VALIDATION_LEVEL  IN          NUMBER
5707                                      ,P_LOAN_ID           IN          NUMBER
5708                                      ,P_LINE_TYPE         IN          VARCHAR2
5709                                      ,X_RETURN_STATUS     OUT NOCOPY  VARCHAR
5710                                      ,X_MSG_COUNT         OUT NOCOPY  NUMBER
5711                                      ,X_MSG_DATA          OUT NOCOPY  VARCHAR2)
5712 
5713 is
5714 /*-----------------------------------------------------------------------+
5715  | Local Variable Declarations and initializations                       |
5716  +-----------------------------------------------------------------------*/
5717     l_api_name                      CONSTANT VARCHAR2(30) := 'CREDIT_AMORTIZATION_PARTIAL';
5718     l_api_version                   CONSTANT NUMBER := 1.0;
5719     l_return_status                 VARCHAR2(1);
5720     l_msg_count                     NUMBER;
5721     l_msg_data                      VARCHAR2(32767);
5722     l_Count                         number;
5723     l_LAST_PAYMENT_NUMBER           number;
5724     l_amortization_schedule_id      number;
5725     l_batch_source_name             varchar2(50);
5726     l_custom_payment_flag           varchar2(1);
5727     l_next_payment_due_date         date;
5728     l_term_id                       number;
5729     l_version_number                number;
5730     l_BILL_PAY_ID                   number;
5731     l_CUSTOMER_TRX_ID               number;
5732     l_PAYMENT_SCHEDULE_ID           number;
5733     l_CUSTOMER_TRX_LINE_ID          number;
5734     l_LINE_TYPE                     varchar2(30);
5735     l_TRX_AMOUNT                    number;
5736     l_APPLIED_AMOUNT                number;
5737     l_request_id                    number;
5738     l_TRX_NUMBER                    varchar2(20);
5739     l_loan_number                   varchar2(60);
5740     l_due_date                      date;
5741     l_ORG_ID                        number;
5742 
5743     l_reverse_tbl                   LNS_BILLING_BATCH_PUB.REVERSE_TBL;
5744     l_loans_next_dd_rec             LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
5745 
5746 
5747 /*-----------------------------------------------------------------------+
5748  | Cursor Declarations                                                   |
5749  +-----------------------------------------------------------------------*/
5750 
5751     CURSOR last_loan_amort_cur(P_LOAN_ID number) IS
5752         select PAYMENT_NUMBER,
5753             DUE_DATE,
5754             AMORTIZATION_SCHEDULE_ID
5755         from LNS_AMORTIZATION_SCHEDS
5756         where LOAN_ID = P_LOAN_ID
5757             and AMORTIZATION_SCHEDULE_ID = LNS_BILLING_UTIL_PUB.LAST_AMORTIZATION_SCHED(LOAN_ID);
5758 
5759     CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number, p_line_type varchar2) IS
5760         select
5761             trx.trx_number,
5762             trx.customer_trx_id,
5763             psa.payment_schedule_id,
5764             lines.CUST_TRX_LINE_ID,
5765             lines.LINE_TYPE,
5766             lines.AMOUNT,
5767             (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
5768             trx.org_id
5769         from
5770             RA_CUSTOMER_TRX_ALL trx,
5771             lns_amortization_lines lines,
5772             ar_payment_schedules psa
5773         where
5774             trx.customer_trx_id = lines.CUST_TRX_ID and
5775             trx.customer_trx_id = psa.customer_trx_id and
5776             lines.LOAN_ID = P_LOAN_ID and
5777             lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID and
5778             lines.LINE_TYPE = p_line_type;
5779 
5780     CURSOR loan_version_cur(P_LOAN_ID number) IS
5781         select
5782             LOAN_NUMBER,
5783             OBJECT_VERSION_NUMBER,
5784             CUSTOM_PAYMENTS_FLAG
5785         from LNS_LOAN_HEADERS
5786         where LOAN_ID = P_LOAN_ID;
5787 
5788 BEGIN
5789 
5790     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5791 
5792     -- Standard start of API savepoint
5793     SAVEPOINT REVERSE_LAST_AMORTIZATION;
5794     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
5795 
5796     -- Standard call to check for call compatibility
5797     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5798       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5799     END IF;
5800 
5801     -- Initialize message list if p_init_msg_list is set to TRUE
5802     IF FND_API.To_Boolean(p_init_msg_list) THEN
5803       FND_MSG_PUB.initialize;
5804     END IF;
5805 
5806     -- Initialize API return status to success
5807     l_return_status := FND_API.G_RET_STS_SUCCESS;
5808 
5809     -- START OF BODY OF API
5810 
5811     init;
5812 
5813     /* getting object version and custom flag for further loan update */
5814 
5815     open loan_version_cur(P_LOAN_ID);
5816     fetch loan_version_cur into l_loan_number, l_version_number, l_custom_payment_flag;
5817     close loan_version_cur;
5818 
5819     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Crediting loan ' || l_loan_number);
5820     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id ' || P_LOAN_ID);
5821 
5822     /* verify input parameters */
5823     if P_LOAN_ID is null then
5824 
5825 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
5826         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
5827         FND_MSG_PUB.Add;
5828         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
5829         RAISE FND_API.G_EXC_ERROR;
5830 
5831     end if;
5832 
5833     if P_LINE_TYPE is null then
5834         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LINE_TYPE');
5835         FND_MSG_PUB.Add;
5836         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
5837         RAISE FND_API.G_EXC_ERROR;
5838     end if;
5839 
5840     /* quering for last loan amortization record */
5841     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for last amortization record in LNS_AMORTIZATION_SCHEDS:');
5842 
5843     open last_loan_amort_cur(P_LOAN_ID);
5844 
5845     fetch last_loan_amort_cur into
5846         l_LAST_PAYMENT_NUMBER,
5847         l_due_date,
5848         l_amortization_schedule_id;
5849 
5850     if last_loan_amort_cur%NOTFOUND then
5851 
5852         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'No amortization record found. Exiting');
5853         return;
5854 
5855     else
5856 
5857         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
5858         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || l_LAST_PAYMENT_NUMBER);
5859         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || l_due_date);
5860         LogMessage(FND_LOG.LEVEL_STATEMENT, 'amortization_schedule_id: ' || l_amortization_schedule_id);
5861 
5862     end if;
5863 
5864     close last_loan_amort_cur;
5865 
5866     /* Quering for invoices with lines to reverse */
5867     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to Credit...');
5868 
5869     l_Count := 0;
5870     open trx_to_reverse_cur(P_LOAN_ID, l_amortization_schedule_id, p_line_type);
5871 
5872     LOOP
5873 
5874         fetch trx_to_reverse_cur into
5875             l_TRX_NUMBER,
5876             l_CUSTOMER_TRX_ID,
5877             l_PAYMENT_SCHEDULE_ID,
5878             l_CUSTOMER_TRX_LINE_ID,
5879             l_LINE_TYPE,
5880             l_TRX_AMOUNT,
5881             l_APPLIED_AMOUNT,
5882             l_ORG_ID;
5883 
5884         exit when trx_to_reverse_cur%NOTFOUND;
5885 
5886         l_Count := l_Count+1;
5887         l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
5888         l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
5889         l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
5890         l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
5891         l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
5892         l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
5893         l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
5894         l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
5895 
5896     END LOOP;
5897 
5898     close trx_to_reverse_cur;
5899 
5900     /* Verify count */
5901     if l_reverse_tbl.count = 0 then
5902 
5903         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
5904         FND_MSG_PUB.Add;
5905         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
5906         RAISE FND_API.G_EXC_ERROR;
5907 
5908     end if;
5909 
5910     /* Create credit memos */
5911     CREATE_AR_CM(l_reverse_tbl);
5912 
5913     if P_COMMIT = FND_API.G_TRUE then
5914         COMMIT WORK;
5915         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
5916     end if;
5917 
5918     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully credit loan ' || l_loan_number);
5919 
5920     -- END OF BODY OF API
5921     x_return_status := FND_API.G_RET_STS_SUCCESS;
5922 
5923     -- Standard call to get message count and if count is 1, get message info
5924     FND_MSG_PUB.Count_And_Get(
5925                 p_encoded => FND_API.G_FALSE,
5926                 p_count => x_msg_count,
5927                 p_data => x_msg_data);
5928 
5929     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5930 
5931 EXCEPTION
5932     WHEN FND_API.G_EXC_ERROR THEN
5933         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
5934         x_return_status := FND_API.G_RET_STS_ERROR;
5935         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5936         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
5937         g_cr_return_status := 'ERROR';
5938     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5939         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
5940         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5941         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5942         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
5943         g_cr_return_status := 'ERROR';
5944     WHEN OTHERS THEN
5945         ROLLBACK TO REVERSE_LAST_AMORTIZATION;
5946         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5947         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5948             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5949         END IF;
5950         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5951         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
5952         g_cr_return_status := 'ERROR';
5953 
5954 END CREDIT_AMORTIZATION_PARTIAL;
5955 
5956 /*========================================================================
5957  | PUBLIC PROCEDURE CREATE_SINGLE_OFFCYCLE_BILL
5958  |
5959  | DESCRIPTION
5960  |      This procedure creates a single OFFCYCLE bill
5961  |
5962  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5963  |      CREATE_OFFCYCLE_BILLS
5964  |
5965  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5966  |      init
5967  |      CREATE_AR_INVOICES
5968  |      LogMessage
5969  |
5970  | PARAMETERS
5971  |      P_API_VERSION		IN          Standard in parameter
5972  |      P_INIT_MSG_LIST		IN          Standard in parameter
5973  |      P_COMMIT			IN          Standard in parameter
5974  |      P_VALIDATION_LEVEL	IN          Standard in parameter
5975  |      P_BILL_HEADER_REC   IN          Manual bill header record
5976  |      P_BILL_LINES_TBL    IN          Manual bill lines
5977  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
5978  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
5979  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
5980  |
5981  | KNOWN ISSUES
5982  |      None
5983  |
5984  | NOTES
5985  |      Any interesting aspect of the code in the package body which needs
5986  |      to be stated.
5987  |
5988  | MODIFICATION HISTORY
5989  | Date                  Author            Description of Changes
5990  | 01-01-2004            scherkas          Created
5991  |
5992  *=======================================================================*/
5993 PROCEDURE CREATE_SINGLE_OFFCYCLE_BILL(
5994     P_API_VERSION		    IN              NUMBER,
5995     P_INIT_MSG_LIST		    IN              VARCHAR2,
5996     P_COMMIT			    IN              VARCHAR2,
5997     P_VALIDATION_LEVEL	    IN              NUMBER,
5998     P_BILL_HEADER_REC       IN              LNS_BILLING_BATCH_PUB.BILL_HEADER_REC,
5999     P_BILL_LINES_TBL        IN              LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
6000     X_RETURN_STATUS		    OUT     NOCOPY  VARCHAR2,
6001     X_MSG_COUNT			    OUT     NOCOPY  NUMBER,
6002     X_MSG_DATA	    	    OUT     NOCOPY  VARCHAR2)
6003 IS
6004 
6005 /*-----------------------------------------------------------------------+
6006  | Local Variable Declarations and initializations                       |
6007  +-----------------------------------------------------------------------*/
6008     l_api_name              CONSTANT VARCHAR2(30) := 'CREATE_SINGLE_OFFCYCLE_BILL';
6009     l_api_version           CONSTANT NUMBER := 1.0;
6010     l_return_status         VARCHAR2(1);
6011     l_msg_count             NUMBER;
6012     l_msg_data              VARCHAR2(32767);
6013     l_Count                 NUMBER;
6014     l_prin_balance          number;
6015 
6016     l_loan_rec              LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC;
6017     l_lines_tbl             LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
6018 
6019 /*-----------------------------------------------------------------------+
6020  | Cursor Declarations                                                   |
6021  +-----------------------------------------------------------------------*/
6022 
6023     CURSOR loan_cur(P_LOAN_ID number, P_PAYMENT_NUMBER number) IS
6024         select
6025             head.LOAN_ID,
6026             head.LOAN_NUMBER,
6027             head.LOAN_DESCRIPTION,
6028             head.LOAN_CURRENCY,
6029             head.CUST_ACCOUNT_ID,
6030             head.BILL_TO_ACCT_SITE_ID,
6031             term.NUMBER_GRACE_DAYS,
6032             term.PAYMENT_APPLICATION_ORDER,
6033             decode(am.AMORTIZATION_SCHEDULE_ID, null, -1, am.AMORTIZATION_SCHEDULE_ID) AMORTIZATION_SCHEDULE_ID,
6034             head.EXCHANGE_RATE_TYPE,
6035             head.EXCHANGE_DATE,
6036             head.EXCHANGE_RATE,
6037             head.ORG_ID,
6038             head.LEGAL_ENTITY_ID,
6039             head.FUNDED_AMOUNT,
6040             nvl(head.CURRENT_PHASE, 'TERM'),
6041             nvl(head.FORGIVENESS_FLAG, 'N'),
6042             nvl(head.FORGIVENESS_PERCENT, 0)
6043         from LNS_LOAN_HEADERS head,
6044             LNS_TERMS term,
6045             LNS_AMORTIZATION_SCHEDS am
6046         where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
6047             and head.LOAN_ID = P_LOAN_ID
6048             and head.loan_id = term.loan_id
6049             and head.loan_id = am.loan_id(+)
6050             and am.PARENT_AMORTIZATION_ID(+) is null
6051             and am.PAYMENT_NUMBER(+) = P_PAYMENT_NUMBER
6052             and (am.REVERSED_FLAG is null or am.REVERSED_FLAG = 'N')
6053             and nvl(am.PHASE(+), 'TERM') = nvl(head.CURRENT_PHASE, 'TERM');
6054 
6055 BEGIN
6056 
6057     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
6058 
6059     l_lines_tbl := P_BILL_LINES_TBL;
6060 
6061     -- Standard start of API savepoint
6062     SAVEPOINT CREATE_SINGLE_OFFCYCLE_BILL;
6063     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
6064 
6065     -- Standard call to check for call compatibility
6066     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6067       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6068     END IF;
6069 
6070     -- Initialize message list if p_init_msg_list is set to TRUE
6071     IF FND_API.To_Boolean(p_init_msg_list) THEN
6072       FND_MSG_PUB.initialize;
6073     END IF;
6074 
6075     -- Initialize API return status to success
6076     l_return_status := FND_API.G_RET_STS_SUCCESS;
6077 
6078     -- START OF BODY OF API
6079 
6080     init;
6081 
6082     /* verify input parameters */
6083 
6084     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Header data:');
6085     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_BILL_HEADER_REC.LOAN_ID);
6086     LogMessage(FND_LOG.LEVEL_STATEMENT, 'ASSOC_PAYMENT_NUM: ' || P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6087     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || P_BILL_HEADER_REC.DUE_DATE);
6088 
6089     if P_BILL_HEADER_REC.LOAN_ID is null then
6090 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan ID is not set.');
6091     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LOAN');
6092 		FND_MSG_PUB.Add;
6093         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6094         RAISE FND_API.G_EXC_ERROR;
6095     end if;
6096 
6097     if P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM is null then
6098 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Associated Payment Number is not set.');
6099     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_NUM');
6100 		FND_MSG_PUB.Add;
6101         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6102         RAISE FND_API.G_EXC_ERROR;
6103     end if;
6104 
6105     if P_BILL_HEADER_REC.DUE_DATE is null then
6106 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Bill Due Date is not set.');
6107     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_DUE');
6108 		FND_MSG_PUB.Add;
6109         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6110         RAISE FND_API.G_EXC_ERROR;
6111     end if;
6112 
6113     if l_lines_tbl.count = 0 then
6114 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No lines found for header ' || P_BILL_HEADER_REC.HEADER_ID);
6115     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINES');
6116     	FND_MESSAGE.SET_TOKEN('HEADER', P_BILL_HEADER_REC.HEADER_ID);
6117 		FND_MSG_PUB.Add;
6118         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6119         RAISE FND_API.G_EXC_ERROR;
6120     end if;
6121 
6122     /* init amounts */
6123     l_loan_rec.NEXT_PRINCIPAL_AMOUNT := 0;
6124     l_loan_rec.NEXT_INTEREST_AMOUNT := 0;
6125     l_loan_rec.NEXT_FEE_AMOUNT := 0;
6126 
6127     /* looping and suming amounts */
6128     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Lines data:');
6129 
6130     FOR l_Count IN 1..l_lines_tbl.count LOOP
6131 
6132         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Line # ' || l_Count);
6133         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_ID: ' || l_lines_tbl(l_Count).LINE_ID);
6134         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_AMOUNT: ' || l_lines_tbl(l_Count).LINE_AMOUNT);
6135         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_lines_tbl(l_Count).LINE_TYPE);
6136         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_DESC: ' || l_lines_tbl(l_Count).LINE_DESC);
6137         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_REF_ID: ' || l_lines_tbl(l_Count).LINE_REF_ID);
6138         LogMessage(FND_LOG.LEVEL_STATEMENT, 'CASH_RECEIPT_ID: ' || l_lines_tbl(l_Count).CASH_RECEIPT_ID);
6139         LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLY_AMOUNT: ' || l_lines_tbl(l_Count).APPLY_AMOUNT);
6140         LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_SCHEDULE_ID: ' || l_lines_tbl(l_Count).FEE_SCHEDULE_ID);
6141 
6142         /* Verifying lines data */
6143         if l_lines_tbl(l_Count).LINE_AMOUNT is null or l_lines_tbl(l_Count).LINE_AMOUNT <= 0 then
6144 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Amount for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6145         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_AMOUNT');
6146         	FND_MESSAGE.SET_TOKEN('LINE', l_lines_tbl(l_Count).LINE_ID);
6147     		FND_MSG_PUB.Add;
6148             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6149             RAISE FND_API.G_EXC_ERROR;
6150         end if;
6151 
6152         if l_lines_tbl(l_Count).LINE_TYPE is null then
6153 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Line type for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6154         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_TYPE');
6155         	FND_MESSAGE.SET_TOKEN('LINE', l_lines_tbl(l_Count).LINE_ID);
6156     		FND_MSG_PUB.Add;
6157             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6158             RAISE FND_API.G_EXC_ERROR;
6159         end if;
6160 /*
6161         if l_lines_tbl(l_Count).LINE_DESC is null then
6162             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Line description for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6163             RAISE FND_API.G_EXC_ERROR;
6164         end if;
6165 */
6166         /* Suming amounts */
6167         if l_lines_tbl(l_Count).LINE_TYPE = 'PRIN' then
6168             l_loan_rec.NEXT_PRINCIPAL_AMOUNT := l_loan_rec.NEXT_PRINCIPAL_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6169         elsif l_lines_tbl(l_Count).LINE_TYPE = 'INT' then
6170             l_loan_rec.NEXT_INTEREST_AMOUNT := l_loan_rec.NEXT_INTEREST_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6171         elsif l_lines_tbl(l_Count).LINE_TYPE = 'FEE' then
6172             l_loan_rec.NEXT_FEE_AMOUNT := l_loan_rec.NEXT_FEE_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6173         end if;
6174 
6175     END LOOP;
6176 
6177     /* validate principal amount */
6178     VALIDATE_PRIN_AMOUNT(P_BILL_HEADER_REC.LOAN_ID, l_loan_rec.NEXT_PRINCIPAL_AMOUNT);
6179 
6180     /* quering for data needed for billing */
6181     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Creating OFFCYCLE bill for loan ' || P_BILL_HEADER_REC.LOAN_ID);
6182 
6183     open loan_cur(P_BILL_HEADER_REC.LOAN_ID, P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6184 
6185     fetch loan_cur into
6186         l_loan_rec.LOAN_ID,
6187         l_loan_rec.LOAN_NUMBER,
6188         l_loan_rec.LOAN_DESCRIPTION,
6189         l_loan_rec.LOAN_CURRENCY,
6190         l_loan_rec.CUST_ACCOUNT_ID,
6191         l_loan_rec.BILL_TO_ADDRESS_ID,
6192         l_loan_rec.NUMBER_GRACE_DAYS,
6193         l_loan_rec.PAYMENT_APPLICATION_ORDER,
6194         l_loan_rec.PARENT_AMORTIZATION_ID,
6195         l_loan_rec.EXCHANGE_RATE_TYPE,
6196         l_loan_rec.EXCHANGE_DATE,
6197         l_loan_rec.EXCHANGE_RATE,
6198         l_loan_rec.ORG_ID,
6199         l_loan_rec.LEGAL_ENTITY_ID,
6200         l_loan_rec.FUNDED_AMOUNT,
6201         l_loan_rec.CURRENT_PHASE,
6202         l_loan_rec.FORGIVENESS_FLAG,
6203         l_loan_rec.FORGIVENESS_PERCENT;
6204 
6205 
6206         if loan_cur%NOTFOUND then
6207 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No amortization record found.');
6208         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_INSTALLMENT');
6209         	FND_MESSAGE.SET_TOKEN('LOAN',P_BILL_HEADER_REC.LOAN_ID);
6210         	FND_MESSAGE.SET_TOKEN('INST', P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6211     		FND_MSG_PUB.Add;
6212             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6213             RAISE FND_API.G_EXC_ERROR;
6214         end if;
6215 
6216     close loan_cur;
6217 
6218     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
6219     LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_ID: ' || l_loan_rec.PARENT_AMORTIZATION_ID);
6220     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER: ' || l_loan_rec.LOAN_NUMBER);
6221     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_DESCRIPTION: ' || l_loan_rec.LOAN_DESCRIPTION);
6222     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || l_loan_rec.LOAN_CURRENCY);
6223     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || l_loan_rec.CUST_ACCOUNT_ID);
6224     LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || l_loan_rec.NUMBER_GRACE_DAYS);
6225     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || l_loan_rec.PAYMENT_APPLICATION_ORDER);
6226     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_loan_rec.EXCHANGE_RATE_TYPE);
6227     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_loan_rec.EXCHANGE_DATE);
6228     LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_loan_rec.EXCHANGE_RATE);
6229     LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || l_loan_rec.ORG_ID);
6230     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LEGAL_ENTITY_ID: ' || l_loan_rec.LEGAL_ENTITY_ID);
6231     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || l_loan_rec.FUNDED_AMOUNT);
6232     LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_loan_rec.CURRENT_PHASE);
6233     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_FLAG: ' || l_loan_rec.FORGIVENESS_FLAG);
6234     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_PERCENT: ' || l_loan_rec.FORGIVENESS_PERCENT);
6235 
6236     /* setting new values */
6237     l_loan_rec.NEXT_PAYMENT_NUMBER := P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM;
6238     l_loan_rec.NEXT_PAYMENT_DUE_DATE := P_BILL_HEADER_REC.DUE_DATE;
6239     l_loan_rec.NEXT_PAYMENT_LATE_DATE := P_BILL_HEADER_REC.DUE_DATE + nvl(l_loan_rec.NUMBER_GRACE_DAYS, 0);
6240 
6241     /* Inserting new record into LNS_AMORTIZATION_SCHEDS */
6242     l_prin_balance := null;
6243     if l_loan_rec.CURRENT_PHASE is not null and l_loan_rec.CURRENT_PHASE = 'OPEN' then
6244         l_prin_balance := l_loan_rec.FUNDED_AMOUNT;
6245     end if;
6246 
6247     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Inserting new record into LNS_AMORTIZATION_SCHEDS w following values:');
6248     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_loan_rec.LOAN_ID);
6249     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_NUMBER: ' || l_loan_rec.NEXT_PAYMENT_NUMBER);
6250     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_loan_rec.NEXT_PAYMENT_DUE_DATE);
6251     LogMessage(FND_LOG.LEVEL_STATEMENT, 'LATE_DATE: ' || l_loan_rec.NEXT_PAYMENT_LATE_DATE);
6252     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_loan_rec.NEXT_PRINCIPAL_AMOUNT);
6253     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_loan_rec.NEXT_INTEREST_AMOUNT);
6254     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_loan_rec.NEXT_FEE_AMOUNT);
6255     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PARENT_AMORTIZATION_ID: ' || l_loan_rec.PARENT_AMORTIZATION_ID);
6256     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_BALANCE: ' || l_prin_balance);
6257     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PHASE: ' || l_loan_rec.CURRENT_PHASE);
6258 
6259     LNS_AMORTIZATION_SCHEDS_PKG.Insert_Row(
6260         X_AMORTIZATION_SCHEDULE_ID => l_loan_rec.NEXT_AMORTIZATION_ID
6261         ,P_LOAN_ID => l_loan_rec.LOAN_ID
6262         ,P_PAYMENT_NUMBER => l_loan_rec.NEXT_PAYMENT_NUMBER
6263         ,P_DUE_DATE => l_loan_rec.NEXT_PAYMENT_DUE_DATE
6264         ,P_LATE_DATE => l_loan_rec.NEXT_PAYMENT_LATE_DATE
6265         ,P_PRINCIPAL_AMOUNT => l_loan_rec.NEXT_PRINCIPAL_AMOUNT
6266         ,P_INTEREST_AMOUNT => l_loan_rec.NEXT_INTEREST_AMOUNT
6267         ,P_FEE_AMOUNT => l_loan_rec.NEXT_FEE_AMOUNT
6268         ,P_REVERSED_FLAG => 'N'
6269         ,P_OBJECT_VERSION_NUMBER => 1
6270         ,P_PARENT_AMORTIZATION_ID => l_loan_rec.PARENT_AMORTIZATION_ID
6271 	    ,P_PRINCIPAL_BALANCE => l_prin_balance
6272 	    ,P_PHASE => l_loan_rec.CURRENT_PHASE);
6273 
6274     LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_SCHEDULE_ID: ' || l_loan_rec.NEXT_AMORTIZATION_ID);
6275     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully inserted record into LNS_AMORTIZATION_SCHEDS');
6276 
6277     /* Creating AR invoices */
6278     CREATE_AR_INVOICES(l_loan_rec, l_lines_tbl);
6279 
6280     STORE_LAST_PAYMENT_NUMBER(l_loan_rec.LOAN_ID);
6281 
6282     GENERATE_BILLING_STATEMENT_XML(
6283 					p_loan_id => l_loan_rec.LOAN_ID,
6284 					p_amortization_schedule_id => l_loan_rec.NEXT_AMORTIZATION_ID);
6285 
6286     if P_COMMIT = FND_API.G_TRUE then
6287         COMMIT WORK;
6288         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
6289     end if;
6290 
6291     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created OFFCYCLE bill');
6292 
6293     -- loan forgiveness adjustment for manual bills: fix for bug 7429910
6294     if l_loan_rec.FORGIVENESS_FLAG = 'Y' and
6295        l_loan_rec.FORGIVENESS_PERCENT > 0 and
6296        g_forgiveness_rec_trx_id is not null then
6297 
6298         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Performing loan forgiveness adjustment...');
6299         FORGIVENESS_ADJUSTMENT(
6300                 P_API_VERSION => 1.0,
6301                 P_INIT_MSG_LIST	=> FND_API.G_FALSE,
6302                 P_COMMIT => P_COMMIT,
6303                 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6304                 P_LOAN_ID => l_loan_rec.LOAN_ID,
6305                 X_RETURN_STATUS	=> l_return_status,
6306                 X_MSG_COUNT => l_msg_count,
6307                 X_MSG_DATA => l_msg_data);
6308 
6309         IF l_return_status = 'S' THEN
6310             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully performed forgiveness adjustment.');
6311         ELSE
6312             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to perform forgiveness adjustment');
6313         END IF;
6314 
6315     else
6316         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will not perform loan forgiveness adjustment');
6317     end if;
6318 
6319     /* applying cash receipts */
6320 
6321     FOR l_Count IN 1..l_lines_tbl.count LOOP
6322 
6323         if l_lines_tbl(l_Count).CASH_RECEIPT_ID is not null and
6324            l_lines_tbl(l_Count).APPLY_AMOUNT is not null and l_lines_tbl(l_Count).APPLY_AMOUNT > 0 then
6325 
6326             APPLY_RECEIPT(P_CASH_RECEIPT_ID => l_lines_tbl(l_Count).CASH_RECEIPT_ID,
6327                         P_TRX_ID => l_lines_tbl(l_Count).CUSTOMER_TRX_ID,
6328                         P_TRX_LINE_ID => l_lines_tbl(l_Count).CUSTOMER_TRX_LINE_ID,
6329                         P_APPLY_AMOUNT => l_lines_tbl(l_Count).APPLY_AMOUNT);
6330 
6331         end if;
6332 
6333     END LOOP;
6334 
6335     -- END OF BODY OF API
6336     x_return_status := FND_API.G_RET_STS_SUCCESS;
6337 
6338     -- Standard call to get message count and if count is 1, get message info
6339     FND_MSG_PUB.Count_And_Get(
6340                 p_encoded => FND_API.G_FALSE,
6341                 p_count => x_msg_count,
6342                 p_data => x_msg_data);
6343 
6344     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6345 
6346 EXCEPTION
6347     WHEN FND_API.G_EXC_ERROR THEN
6348         ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6349         x_return_status := FND_API.G_RET_STS_ERROR;
6350         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6351         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6352     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6353         ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6354         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6355         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6356         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6357     WHEN OTHERS THEN
6358         ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6359         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6360         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6361             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6362         END IF;
6363         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6364         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6365 END;
6366 
6367 
6368 
6369 /*========================================================================
6370  | PUBLIC PROCEDURE CREATE_OFFCYCLE_BILLS
6371  |
6372  | DESCRIPTION
6373  |      This procedure creates many OFFCYCLE bills
6374  |
6375  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
6376  |      None
6377  |
6378  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
6379  |      CREATE_SINGLE_OFFCYCLE_BILL
6380  |      LogMessage
6381  |
6382  | PARAMETERS
6383  |      P_API_VERSION		IN          Standard in parameter
6384  |      P_INIT_MSG_LIST		IN          Standard in parameter
6385  |      P_COMMIT			IN          Standard in parameter
6386  |      P_VALIDATION_LEVEL	IN          Standard in parameter
6387  |      P_BILL_HEADERS_TBL  IN          Manual bill headers
6388  |      P_BILL_LINES_TBL    IN          Manual bill lines
6389  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
6390  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
6391  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
6392  |
6393  | KNOWN ISSUES
6394  |      None
6395  |
6396  | NOTES
6397  |      Any interesting aspect of the code in the package body which needs
6398  |      to be stated.
6399  |
6400  | MODIFICATION HISTORY
6401  | Date                  Author            Description of Changes
6402  | 01-01-2004            scherkas          Created
6403  |
6404  *=======================================================================*/
6405 PROCEDURE CREATE_OFFCYCLE_BILLS(
6406     P_API_VERSION		    IN              NUMBER,
6407     P_INIT_MSG_LIST		    IN              VARCHAR2,
6408     P_COMMIT			    IN              VARCHAR2,
6409     P_VALIDATION_LEVEL	    IN              NUMBER,
6410     P_BILL_HEADERS_TBL      IN              LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL,
6411     P_BILL_LINES_TBL        IN              LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
6412     X_RETURN_STATUS		    OUT     NOCOPY  VARCHAR2,
6413     X_MSG_COUNT			    OUT     NOCOPY  NUMBER,
6414     X_MSG_DATA	    	    OUT     NOCOPY  VARCHAR2)
6415 IS
6416 
6417 /*-----------------------------------------------------------------------+
6418  | Local Variable Declarations and initializations                       |
6419  +-----------------------------------------------------------------------*/
6420 
6421     l_api_name              CONSTANT VARCHAR2(30) := 'CREATE_OFFCYCLE_BILLS';
6422     l_api_version           CONSTANT NUMBER := 1.0;
6423     l_return_status         VARCHAR2(1);
6424     l_msg_count             NUMBER;
6425     l_msg_data              VARCHAR2(32767);
6426     l_Count                 NUMBER;
6427     l_Count1                NUMBER;
6428     l_Count2                NUMBER;
6429     l_bill_lines_tbl        LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
6430 
6431 BEGIN
6432 
6433     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
6434 
6435     -- Standard start of API savepoint
6436     SAVEPOINT CREATE_OFFCYCLE_BILLS;
6437     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
6438 
6439     -- Standard call to check for call compatibility
6440     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6441       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6442     END IF;
6443 
6444     -- Initialize message list if p_init_msg_list is set to TRUE
6445     IF FND_API.To_Boolean(p_init_msg_list) THEN
6446       FND_MSG_PUB.initialize;
6447     END IF;
6448 
6449     -- Initialize API return status to success
6450     l_return_status := FND_API.G_RET_STS_SUCCESS;
6451 
6452     -- START OF BODY OF API
6453     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Creating OFFCYCLE bills...');
6454 
6455     /* Looping thru headers table */
6456     FOR l_Count IN 1..P_BILL_HEADERS_TBL.count LOOP
6457 
6458         if P_BILL_HEADERS_TBL(l_Count).HEADER_ID is null then
6459 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Header ID is not set.');
6460         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_HEADER');
6461     		FND_MSG_PUB.Add;
6462             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6463             RAISE FND_API.G_EXC_ERROR;
6464         end if;
6465 
6466         /* Init lines table */
6467         l_Count2 := 0;
6468         l_bill_lines_tbl.delete;
6469 
6470         /* Looping thru lines table */
6471         FOR l_Count1 IN 1..P_BILL_LINES_TBL.count LOOP
6472 
6473             if P_BILL_LINES_TBL(l_Count1).HEADER_ID is null then
6474 --                LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Header ID for line ' || P_BILL_LINES_TBL(l_Count1).LINE_ID || ' is not set.');
6475             	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_HEADER');
6476             	FND_MESSAGE.SET_TOKEN('LINE', P_BILL_LINES_TBL(l_Count1).LINE_ID);
6477         		FND_MSG_PUB.Add;
6478                 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6479                 RAISE FND_API.G_EXC_ERROR;
6480             end if;
6481 
6482             /* Adding current line record to lines table of current header */
6483             if P_BILL_HEADERS_TBL(l_Count).HEADER_ID = P_BILL_LINES_TBL(l_Count1).HEADER_ID then
6484                 l_Count2 := l_Count2+1;
6485                 l_bill_lines_tbl(l_Count2) := P_BILL_LINES_TBL(l_Count1);
6486             end if;
6487 
6488         END LOOP;
6489 
6490         /* Create a single offcycle bill */
6491         CREATE_SINGLE_OFFCYCLE_BILL(
6492             P_API_VERSION => 1.0,
6493             P_INIT_MSG_LIST	=> FND_API.G_FALSE,
6494             P_COMMIT => P_COMMIT,
6495             P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6496             P_BILL_HEADER_REC => P_BILL_HEADERS_TBL(l_Count),
6497             P_BILL_LINES_TBL => l_bill_lines_tbl,
6498             X_RETURN_STATUS	=> l_return_status,
6499             X_MSG_COUNT => l_msg_count,
6500             X_MSG_DATA => l_msg_data);
6501 
6502         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6503             RAISE FND_API.G_EXC_ERROR;
6504         END IF;
6505 
6506     END LOOP;
6507 
6508     LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
6509     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || P_BILL_HEADERS_TBL.count || ' OFFCYCLE bill(s)');
6510 
6511     if P_COMMIT = FND_API.G_TRUE then
6512         COMMIT WORK;
6513         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
6514     end if;
6515 
6516     -- END OF BODY OF API
6517     x_return_status := FND_API.G_RET_STS_SUCCESS;
6518 
6519     -- Standard call to get message count and if count is 1, get message info
6520     FND_MSG_PUB.Count_And_Get(
6521                 p_encoded => FND_API.G_FALSE,
6522                 p_count => x_msg_count,
6523                 p_data => x_msg_data);
6524 
6525     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6526 
6527 EXCEPTION
6528     WHEN FND_API.G_EXC_ERROR THEN
6529         ROLLBACK TO CREATE_OFFCYCLE_BILLS;
6530         x_return_status := FND_API.G_RET_STS_ERROR;
6531         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6532         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6533     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6534         ROLLBACK TO CREATE_OFFCYCLE_BILLS;
6535         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6536         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6537         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6538     WHEN OTHERS THEN
6539         ROLLBACK TO CREATE_OFFCYCLE_BILLS;
6540         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6541         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6542             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6543         END IF;
6544         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6545         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6546 END;
6547 
6548 
6549 
6550 /*========================================================================
6551  | PUBLIC PROCEDURE REVERSE_OFFCYCLE_BILL
6552  |
6553  | DESCRIPTION
6554  |      This procedure reverses an offcycle bill
6555  |
6556  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
6557  |      None
6558  |
6559  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
6560  |      init
6561  |      CREATE_AR_CM
6562  |      LogMessage
6563  |
6564  | PARAMETERS
6565  |      P_API_VERSION		IN          Standard in parameter
6566  |      P_INIT_MSG_LIST		IN          Standard in parameter
6567  |      P_COMMIT			IN          Standard in parameter
6568  |      P_VALIDATION_LEVEL	IN          Standard in parameter
6569  |      P_AMORTIZATION_ID   IN          Input amortization id to reverse
6570  |      X_RETURN_STATUS		OUT NOCOPY  Standard out parameter
6571  |      X_MSG_COUNT			OUT NOCOPY  Standard out parameter
6572  |      X_MSG_DATA	    	OUT NOCOPY  Standard out parameter
6573  |
6574  | KNOWN ISSUES
6575  |      None
6576  |
6577  | NOTES
6578  |      Any interesting aspect of the code in the package body which needs
6579  |      to be stated.
6580  |
6581  | MODIFICATION HISTORY
6582  | Date                  Author            Description of Changes
6583  | 01-01-2004            scherkas          Created
6584  |
6585  *=======================================================================*/
6586 PROCEDURE REVERSE_OFFCYCLE_BILL(
6587     P_API_VERSION		IN          NUMBER,
6588     P_INIT_MSG_LIST		IN          VARCHAR2,
6589     P_COMMIT			IN          VARCHAR2,
6590     P_VALIDATION_LEVEL	IN          NUMBER,
6591     P_AMORTIZATION_ID   IN          NUMBER,
6592     X_RETURN_STATUS		OUT NOCOPY  VARCHAR2,
6593     X_MSG_COUNT			OUT NOCOPY  NUMBER,
6594     X_MSG_DATA	    	OUT NOCOPY  VARCHAR2)
6595 IS
6596 
6597 /*-----------------------------------------------------------------------+
6598  | Local Variable Declarations and initializations                       |
6599  +-----------------------------------------------------------------------*/
6600 
6601     l_api_name                      CONSTANT VARCHAR2(30) := 'REVERSE_OFFCYCLE_BILL';
6602     l_api_version                   CONSTANT NUMBER := 1.0;
6603     l_return_status                 VARCHAR2(1);
6604     l_msg_count                     NUMBER;
6605     l_msg_data                      VARCHAR2(32767);
6606     l_Count                         number;
6607     l_LOAN_ID                       number;
6608     l_BILL_PAY_ID                   number;
6609     l_CUSTOMER_TRX_ID               number;
6610     l_PAYMENT_SCHEDULE_ID           number;
6611     l_CUSTOMER_TRX_LINE_ID          number;
6612     l_LINE_TYPE                     varchar2(30);
6613     l_TRX_AMOUNT                    number;
6614     l_APPLIED_AMOUNT                number;
6615     l_PAYMENT_NUMBER                number;
6616     l_DUE_DATE                      date;
6617     l_PARENT_AMORTIZATION_ID        number;
6618     l_REVERSED_FLAG                 varchar2(1);
6619     l_TRX_NUMBER                    varchar2(20);
6620     l_ORG_ID                        number;
6621 
6622     l_reverse_tbl                   LNS_BILLING_BATCH_PUB.REVERSE_TBL;
6623 
6624 /*-----------------------------------------------------------------------+
6625  | Cursor Declarations                                                   |
6626  +-----------------------------------------------------------------------*/
6627 
6628     CURSOR amort_cur(P_AMORTIZATION_ID number) IS
6629         select LOAN_ID,
6630             PAYMENT_NUMBER,
6631             DUE_DATE,
6632             PARENT_AMORTIZATION_ID,
6633             REVERSED_CODE
6634         from LNS_AM_SCHEDS_V
6635         where AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
6636 
6637 
6638     CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number) IS
6639         select
6640             trx.trx_number,
6641             trx.customer_trx_id,
6642             psa.payment_schedule_id,
6643             lines.CUST_TRX_LINE_ID,
6644             lines.LINE_TYPE,
6645             lines.AMOUNT,
6646             (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
6647             trx.org_id
6648         from
6649             RA_CUSTOMER_TRX_ALL trx,
6650             lns_amortization_lines lines,
6651             ar_payment_schedules psa
6652         where
6653             trx.customer_trx_id = lines.CUST_TRX_ID and
6654             trx.customer_trx_id = psa.customer_trx_id and
6655             lines.LOAN_ID = P_LOAN_ID and
6656             lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
6657 
6658 BEGIN
6659 
6660     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
6661 
6662     -- Standard start of API savepoint
6663     SAVEPOINT REVERSE_OFFCYCLE_BILL;
6664     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
6665 
6666     -- Standard call to check for call compatibility
6667     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6668       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6669     END IF;
6670 
6671     -- Initialize message list if p_init_msg_list is set to TRUE
6672     IF FND_API.To_Boolean(p_init_msg_list) THEN
6673       FND_MSG_PUB.initialize;
6674     END IF;
6675 
6676     -- Initialize API return status to success
6677     l_return_status := FND_API.G_RET_STS_SUCCESS;
6678 
6679     -- START OF BODY OF API
6680 
6681     init;
6682 
6683     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reversing offcycle bill with amortization_id ' || P_AMORTIZATION_ID);
6684 
6685     /* verify input parameters */
6686     if P_AMORTIZATION_ID is null then
6687 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Amortization ID must be set.');
6688     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NO_AMORT');
6689 		FND_MSG_PUB.Add;
6690         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6691         RAISE FND_API.G_EXC_ERROR;
6692     end if;
6693 
6694     /* verify is it really offcycle bill, reversed etc. */
6695     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for details of the amortization:');
6696 
6697     open amort_cur(P_AMORTIZATION_ID);
6698     fetch amort_cur into
6699         l_LOAN_ID,
6700         l_PAYMENT_NUMBER,
6701         l_DUE_DATE,
6702         l_PARENT_AMORTIZATION_ID,
6703         l_REVERSED_FLAG;
6704 
6705     if amort_cur%NOTFOUND then
6706 
6707 --		LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: No amortization record found.');
6708     	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NO_BILL_FOUND');
6709 		FND_MSG_PUB.Add;
6710         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6711 	    RAISE FND_API.G_EXC_ERROR;
6712 
6713 	else
6714 
6715         LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_LOAN_ID);
6716         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_NUMBER: ' || l_PAYMENT_NUMBER);
6717         LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_DUE_DATE);
6718         LogMessage(FND_LOG.LEVEL_STATEMENT, 'PARENT_AMORTIZATION_ID: ' || l_PARENT_AMORTIZATION_ID);
6719         LogMessage(FND_LOG.LEVEL_STATEMENT, 'REVERSED_FLAG: ' || l_REVERSED_FLAG);
6720 
6721         if l_PARENT_AMORTIZATION_ID is null then
6722 
6723 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The amortization is not offcycle bill.');
6724         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NOT_MAN_BILL');
6725     		FND_MSG_PUB.Add;
6726             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6727             RAISE FND_API.G_EXC_ERROR;
6728 
6729         elsif l_REVERSED_FLAG = 'Y' then
6730 
6731 --            LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The amortization is already reversed.');
6732         	FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_ALREADY_REV');
6733     		FND_MSG_PUB.Add;
6734             LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6735             RAISE FND_API.G_EXC_ERROR;
6736 
6737         end if;
6738 
6739 	end if;
6740 
6741     close amort_cur;
6742 
6743     /* Quering for invoices with lines to reverse */
6744     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to reverse...');
6745 
6746     open trx_to_reverse_cur(l_LOAN_ID, P_AMORTIZATION_ID);
6747 
6748     l_Count := 0;
6749     LOOP
6750         fetch trx_to_reverse_cur into
6751             l_TRX_NUMBER,
6752             l_CUSTOMER_TRX_ID,
6753             l_PAYMENT_SCHEDULE_ID,
6754             l_CUSTOMER_TRX_LINE_ID,
6755             l_LINE_TYPE,
6756             l_TRX_AMOUNT,
6757             l_APPLIED_AMOUNT,
6758             l_ORG_ID;
6759         exit when trx_to_reverse_cur%NOTFOUND;
6760 
6761         l_Count := l_Count+1;
6762         l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
6763         l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
6764         l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
6765         l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
6766         l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
6767         l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
6768         l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
6769         l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
6770 
6771     END LOOP;
6772 
6773     close trx_to_reverse_cur;
6774 
6775     /* Check for table count */
6776     if l_reverse_tbl.count = 0 then
6777 
6778 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No trx lines found to reverse.');
6779     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
6780 		FND_MSG_PUB.Add;
6781         LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6782 	    RAISE FND_API.G_EXC_ERROR;
6783 
6784     end if;
6785 
6786     /* Create credit memos */
6787     CREATE_AR_CM(l_reverse_tbl);
6788 
6789     /* Updating amortization table */
6790     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
6791 
6792     LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
6793         P_AMORTIZATION_SCHEDULE_ID => P_AMORTIZATION_ID
6794         ,P_REVERSED_FLAG => 'Y'
6795         ,P_REVERSED_DATE => sysdate);
6796 
6797     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
6798 
6799     STORE_LAST_PAYMENT_NUMBER(l_LOAN_ID);
6800 
6801     if P_COMMIT = FND_API.G_TRUE then
6802         COMMIT WORK;
6803         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
6804     end if;
6805 
6806     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reversed offcycle bill');
6807 
6808     -- END OF BODY OF API
6809     x_return_status := FND_API.G_RET_STS_SUCCESS;
6810 
6811     -- Standard call to get message count and if count is 1, get message info
6812     FND_MSG_PUB.Count_And_Get(
6813                 p_encoded => FND_API.G_FALSE,
6814                 p_count => x_msg_count,
6815                 p_data => x_msg_data);
6816 
6817     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6818 
6819 EXCEPTION
6820     WHEN FND_API.G_EXC_ERROR THEN
6821         ROLLBACK TO REVERSE_OFFCYCLE_BILL;
6822         x_return_status := FND_API.G_RET_STS_ERROR;
6823         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6824         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6825     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6826         ROLLBACK TO REVERSE_OFFCYCLE_BILL;
6827         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6828         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6829         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6830     WHEN OTHERS THEN
6831         ROLLBACK TO REVERSE_OFFCYCLE_BILL;
6832         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6833         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6834             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6835         END IF;
6836         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6837         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6838 END;
6839 
6840 
6841 
6842 
6843 /*========================================================================
6844  | PUBLIC PROCEDURE ADJUST_ORIGINAL_RECEIVABLE
6845  |
6846  | DESCRIPTION
6847  |      This procedure adjusts loans original receivable in AR
6848  |
6849  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
6850  |      None
6851  |
6852  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
6853  |      init
6854  |      LogMessage
6855  |
6856  | PARAMETERS
6857  |      P_API_VERSION		    IN          Standard in parameter
6858  |      P_INIT_MSG_LIST		    IN          Standard in parameter
6859  |      P_COMMIT			    IN          Standard in parameter
6860  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
6861  |      P_LOAN_ID               IN          Loan ID
6862  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
6863  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
6864  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
6865  |
6866  | KNOWN ISSUES
6867  |      None
6868  |
6869  | NOTES
6870  |      Any interesting aspect of the code in the package body which needs
6871  |      to be stated.
6872  |
6873  | MODIFICATION HISTORY
6874  | Date                  Author            Description of Changes
6875  | 01-01-2004            scherkas          Created
6876  |
6877  *=======================================================================*/
6878 PROCEDURE ADJUST_ORIGINAL_RECEIVABLE(
6879     P_API_VERSION		      IN          NUMBER,
6880     P_INIT_MSG_LIST		    IN          VARCHAR2,
6881     P_COMMIT			        IN          VARCHAR2,
6882     P_VALIDATION_LEVEL	  IN          NUMBER,
6883     P_LOAN_ID             IN          NUMBER,
6884     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
6885     X_MSG_COUNT			      OUT NOCOPY  NUMBER,
6886     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
6887 IS
6888 
6889 /*-----------------------------------------------------------------------+
6890  | Local Variable Declarations and initializations                       |
6891  +-----------------------------------------------------------------------*/
6892 
6893     l_api_name                      CONSTANT VARCHAR2(30) := 'ADJUST_ORIGINAL_RECEIVABLE';
6894     l_api_version                   CONSTANT NUMBER := 1.0;
6895     l_return_status                 VARCHAR2(1);
6896     l_msg_count                     NUMBER;
6897     l_msg_data                      VARCHAR2(32767);
6898     l_loan_number                   varchar2(60);
6899 --    l_funded_amount                 number;
6900     l_trx_number                    varchar2(20);
6901     l_payment_schedule_id           number;
6902     l_amount_due_remaining          number;
6903     l_type                          varchar2(15);
6904     l_loan_desc                     varchar2(250);
6905     l_comments                      varchar2(2000);
6906     l_adj_number                    varchar2(20);
6907     l_adj_id                        number;
6908 --    l_version_number                number;
6909     l_ussgl_flag                    varchar2(3);
6910     l_Count                         number;
6911     l_requested_amount              number;
6912     l_line_id                       number;
6913     l_apply_date                    date;
6914     l_gl_date                       date;
6915     l_org_id                        number;
6916 	l_legal_entity_id               number;
6917 
6918 	-- for on-line accounting call
6919 	l_err                           varchar2(50);
6920 	l_ret                           number;
6921 	ls_info                         xla_events_pub_pkg.t_event_source_info;
6922 	l_accounting_batch_id           number;
6923 	l_request_id                    number;
6924 	l_ledger_id                     number;
6925     l_installment_number            number;
6926 
6927 		cursor c_ledger is
6928     SELECT  so.set_of_books_id
6929       FROM  lns_system_options so
6930            ,gl_sets_of_books sb
6931      WHERE sb.set_of_books_id = so.set_of_books_id;
6932 
6933 /*-----------------------------------------------------------------------+
6934  | Cursor Declarations                                                   |
6935  +-----------------------------------------------------------------------*/
6936 
6937     /* querying trx, psa and loan details */
6938     CURSOR orig_rec_cur(P_LOAN_ID number) IS
6939         select
6940 	        loan.loan_number,
6941             loan.LOAN_DESCRIPTION,
6942             lines.REQUESTED_AMOUNT,
6943             lines.reference_number,
6944             lines.REC_ADJUSTMENT_NUMBER,
6945             nvl(lines.payment_schedule_id, psa.payment_schedule_id),
6946             psa.AMOUNT_DUE_REMAINING,
6947             lines.LOAN_LINE_ID,
6948             psa.TRX_DATE,
6949             psa.GL_DATE,
6950             trx.org_id,
6951     		trx.legal_entity_id,
6952             lines.REC_ADJUSTMENT_ID,
6953             nvl(lines.installment_number, 1)
6954         from LNS_LOAN_HEADERS loan,
6955             RA_CUSTOMER_TRX trx,
6956             ar_payment_schedules psa,
6957             lns_loan_lines lines
6958         where loan.loan_id = P_LOAN_ID and
6959         	loan.loan_id = lines.loan_id and
6960             lines.reference_type = 'RECEIVABLE' and
6961             lines.REFERENCE_ID = trx.CUSTOMER_TRX_ID and
6962             lines.REFERENCE_NUMBER = trx.trx_number and
6963             lines.end_date is null and
6964             trx.CUSTOMER_TRX_ID = psa.CUSTOMER_TRX_ID and
6965             nvl(lines.installment_number, 1) = psa.terms_sequence_number
6966         order by lines.LOAN_LINE_ID;
6967 
6968 BEGIN
6969 
6970     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
6971 
6972     -- Standard start of API savepoint
6973     SAVEPOINT ADJUST_ORIGINAL_RECEIVABLE;
6974     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
6975 
6976     -- Standard call to check for call compatibility
6977     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6978       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6979     END IF;
6980 
6981     -- Initialize message list if p_init_msg_list is set to TRUE
6982     IF FND_API.To_Boolean(p_init_msg_list) THEN
6983       FND_MSG_PUB.initialize;
6984     END IF;
6985 
6986     -- Initialize API return status to success
6987     l_return_status := FND_API.G_RET_STS_SUCCESS;
6988 
6989     -- START OF BODY OF API
6990 
6991     init;
6992 
6993     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id :' || P_LOAN_ID);
6994 
6995     /* verify input parameters */
6996     if P_LOAN_ID is null then
6997 
6998 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
6999 	    	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
7000 				FND_MSG_PUB.Add;
7001         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7002         RAISE FND_API.G_EXC_ERROR;
7003 
7004     end if;
7005 
7006     /* checking for system options values required for adjustment */
7007     if g_receivables_trx_id is null then
7008 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Receivables activity name is not set in the system option.');
7009     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_REC_TRX_IN_SYS_OPT');
7010 		FND_MSG_PUB.Add;
7011         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7012         RAISE FND_API.G_EXC_ERROR;
7013 
7014     end if;
7015 
7016 
7017     /* based on profile USSGL_OPTION value verify value for USSGL_TRANSACTION_CODE */
7018     /* commented out by raverma 07-29-2005
7019 		l_ussgl_flag := NVL(FND_PROFILE.VALUE('USSGL_OPTION'), 'N');
7020 
7021     if l_ussgl_flag = 'Y' then
7022 
7023         if g_USSGL_TRANSACTION_CODE is null then
7024     --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: USSGL Transaction Code is not set in the system option.');
7025             FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_CODE_IN_SYS_OPT');
7026             FND_MSG_PUB.Add;
7027             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7028             RAISE FND_API.G_EXC_ERROR;
7029 
7030         end if;
7031 
7032     end if;
7033 		*/
7034 
7035     /* querying trx, psa, loan and loan lines details */
7036     l_Count := 0;
7037     open orig_rec_cur(P_LOAN_ID);
7038 
7039     LOOP
7040 
7041         fetch orig_rec_cur into
7042             l_loan_number,
7043             l_loan_desc,
7044             l_requested_amount,
7045             l_trx_number,
7046             l_adj_number,
7047             l_payment_schedule_id,
7048             l_amount_due_remaining,
7049             l_line_id,
7050             l_apply_date,
7051             l_gl_date,
7052             l_org_id,
7053 		    l_legal_entity_id,
7054             l_adj_id,
7055             l_installment_number;
7056         exit when orig_rec_cur%NOTFOUND;
7057 
7058         l_Count := l_Count + 1;
7059 
7060         if l_Count = 1 then
7061             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjusting original receivables for loan ' ||  l_loan_number || ' (id ' || P_LOAN_ID || ')...');
7062         end if;
7063 
7064         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjusting receivable ' || l_trx_number || '...');
7065 
7066         /* verify adjust amount and set adjustment type */
7067         if l_requested_amount > l_amount_due_remaining then
7068     --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Adjust amount cannot be greater than receivable remaining amount.');
7069             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
7070             LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount: ' || l_amount_due_remaining);
7071             FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_ADJ_AMT');
7072             FND_MSG_PUB.Add;
7073             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7074             RAISE FND_API.G_EXC_ERROR;
7075         else
7076             l_type := 'LINE';
7077         end if;
7078 
7079         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
7080         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount: ' || l_amount_due_remaining);
7081 
7082         /* checking if adjustment for this loan already was made */
7083         if l_adj_number is not null or l_adj_id is not null then
7084     --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Attempt to duplicate adjustment. Receivable has been already adjusted for this loan by adjustment xxx' );
7085             FND_MESSAGE.SET_NAME('LNS', 'LNS_DUPL_ADJ_ORIG_REC');
7086             FND_MESSAGE.SET_TOKEN('ADJ', l_adj_number);
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         /* buld comments */
7093         l_comments := 'Loan ' || l_loan_number || ' - line ' || l_Count;
7094         /*
7095         if l_loan_desc is not null then
7096             l_comments := 'Loan ' || l_loan_number || ' - ' || l_loan_desc;
7097         else
7098             l_comments := 'Loan ' || l_loan_number;
7099         end if;
7100         */
7101 
7102         /* setting adj_apply_date and adj_gl_date */
7103         if trunc(l_apply_date) < trunc(sysdate) then
7104             l_apply_date := sysdate;
7105         end if;
7106 
7107         if trunc(l_gl_date) < trunc(sysdate) then
7108             l_gl_date := sysdate;
7109         end if;
7110 
7111         /* do adjustment */
7112         CREATE_AR_ADJ(P_TYPE => l_type,
7113             P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id,
7114             P_RECEIVABLES_TRX_ID => g_receivables_trx_id,
7115             P_AMOUNT => -l_requested_amount,
7116             P_APPLY_DATE => l_apply_date,
7117             P_GL_DATE => l_gl_date,
7118             P_CUSTOMER_TRX_LINE_ID => null,
7119             P_CODE_COMBINATION_ID => null,
7120             P_USSGL_TRX_CODE => g_USSGL_TRANSACTION_CODE,
7121             P_REASON_CODE => 'LOAN_CONV',
7122             P_COMMENTS => l_comments,
7123             X_ADJ_ID => l_adj_id,
7124             X_ADJ_NUMBER => l_adj_number,
7125             P_ORG_ID => l_org_id);
7126 
7127         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_LOAN_LINES...');
7128         LNS_LOAN_LINE_PUB.UPDATE_LINE_ADJUSTMENT_NUMBER(
7129             p_init_msg_list             => FND_API.G_FALSE
7130             ,p_loan_id                  => P_LOAN_ID
7131             ,p_loan_line_id             => l_line_id
7132             ,p_rec_adjustment_number    => l_adj_number
7133             ,p_rec_adjustment_id        => l_adj_id
7134             ,P_PAYMENT_SCHEDULE_ID      => l_payment_schedule_id
7135             ,P_INSTALLMENT_NUMBER       => l_installment_number
7136             ,x_return_status            => l_return_status
7137             ,x_msg_count                => l_msg_count
7138             ,x_msg_data                 => l_msg_data);
7139 
7140         LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
7141         IF l_return_status = 'S' THEN
7142             LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully updated LNS_LOAN_LINES');
7143         ELSE
7144             RAISE FND_API.G_EXC_ERROR;
7145         END IF;
7146         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created adjustment ' || l_adj_number || ' for original receivable ' || l_trx_number);
7147 
7148     END LOOP;
7149 
7150     close orig_rec_cur;
7151 
7152     if l_Count = 0 then
7153 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot find receivable to adjust.');
7154     	FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_FIND_ORIG_REC');
7155 		FND_MSG_PUB.Add;
7156         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7157         RAISE FND_API.G_EXC_ERROR;
7158     end if;
7159 
7160     if P_COMMIT = FND_API.G_TRUE then
7161         COMMIT WORK;
7162         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
7163     end if;
7164 
7165     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully adjusted ' || l_Count || ' original receivable for loan ' || l_loan_number);
7166 
7167     -- END OF BODY OF API
7168     x_return_status := FND_API.G_RET_STS_SUCCESS;
7169 
7170     -- Standard call to get message count and if count is 1, get message info
7171     FND_MSG_PUB.Count_And_Get(
7172                 p_encoded => FND_API.G_FALSE,
7173                 p_count => x_msg_count,
7174                 p_data => x_msg_data);
7175 
7176     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7177 
7178 EXCEPTION
7179     WHEN FND_API.G_EXC_ERROR THEN
7180         ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7181         x_return_status := FND_API.G_RET_STS_ERROR;
7182         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7183         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7184     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7185         ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7186         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7187         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7188         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7189     WHEN OTHERS THEN
7190         ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7191         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7192         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7193             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7194         END IF;
7195         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7196         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7197 END;
7198 
7199 
7200 /*========================================================================
7201  | PUBLIC PROCEDURE PREBILL_SINGLE_LOAN
7202  |
7203  | DESCRIPTION
7204  |      This procedure prebill (do initial billing) for single loan
7205  |
7206  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7207  |      None
7208  |
7209  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7210  |      init
7211  |      LogMessage
7212  |      CREATE_OFFCYCLE_BILLS
7213  |
7214  | PARAMETERS
7215  |      P_API_VERSION		    IN          Standard in parameter
7216  |      P_INIT_MSG_LIST		    IN          Standard in parameter
7217  |      P_COMMIT			    IN          Standard in parameter
7218  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
7219  |      P_LOAN_ID               IN          Loan ID
7220  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
7221  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
7222  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
7223  |
7224  | KNOWN ISSUES
7225  |      None
7226  |
7227  | NOTES
7228  |      Any interesting aspect of the code in the package body which needs
7229  |      to be stated.
7230  |
7231  | MODIFICATION HISTORY
7232  | Date                  Author            Description of Changes
7233  | 12-23-2004            scherkas          Created
7234  |
7235  *=======================================================================*/
7236 PROCEDURE PREBILL_SINGLE_LOAN(
7237     P_API_VERSION		    IN          NUMBER,
7238     P_INIT_MSG_LIST		    IN          VARCHAR2,
7239     P_COMMIT			    IN          VARCHAR2,
7240     P_VALIDATION_LEVEL	    IN          NUMBER,
7241     P_LOAN_ID               IN          NUMBER,
7242     X_BILLED_YN             OUT NOCOPY  VARCHAR2,
7243     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
7244     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
7245     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
7246 IS
7247 
7248 /*-----------------------------------------------------------------------+
7249  | Local Variable Declarations and initializations                       |
7250  +-----------------------------------------------------------------------*/
7251 
7252     l_api_name                      CONSTANT VARCHAR2(30) := 'PREBILL_SINGLE_LOAN';
7253     l_api_version                   CONSTANT NUMBER := 1.0;
7254     l_return_status                 VARCHAR2(1);
7255     l_msg_count                     NUMBER;
7256     l_msg_data                      VARCHAR2(32767);
7257     l_installment_num               number;
7258     l_Count                         number;
7259     l_Count1                        number;
7260     l_header_count                  number;
7261     l_loan_number                   varchar2(60);
7262     l_cur_phase                     VARCHAR2(30);
7263 
7264 
7265     l_amortization_rec              LNS_FINANCIALS.AMORTIZATION_REC;
7266     l_fee_tbl                       LNS_FINANCIALS.FEES_TBL;
7267     l_BILL_HEADERS_TBL              LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL;
7268     l_BILL_LINES_TBL                LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
7269 
7270 /*-----------------------------------------------------------------------+
7271  | Cursor Declarations                                                   |
7272  +-----------------------------------------------------------------------*/
7273 
7274     /* querying loan number */
7275     CURSOR loan_cur(P_LOAN_ID number) IS
7276         select
7277             LOAN_NUMBER, nvl(CURRENT_PHASE, 'TERM')
7278         from LNS_LOAN_HEADERS
7279         where LOAN_ID = P_LOAN_ID;
7280 
7281 BEGIN
7282 
7283     X_BILLED_YN := 'N';
7284 
7285     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7286 
7287     -- Standard start of API savepoint
7288     SAVEPOINT PREBILL_SINGLE_LOAN;
7289     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7290 
7291     -- Standard call to check for call compatibility
7292     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7293       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7294     END IF;
7295 
7296     -- Initialize message list if p_init_msg_list is set to TRUE
7297     IF FND_API.To_Boolean(p_init_msg_list) THEN
7298       FND_MSG_PUB.initialize;
7299     END IF;
7300 
7301     -- Initialize API return status to success
7302     l_return_status := FND_API.G_RET_STS_SUCCESS;
7303 
7304     -- START OF BODY OF API
7305     l_installment_num := 0;
7306 
7307     /* verify input parameters */
7308     if P_LOAN_ID is null then
7309 
7310 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
7311         FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
7312         FND_MSG_PUB.Add;
7313         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7314         RAISE FND_API.G_EXC_ERROR;
7315 
7316     end if;
7317 
7318     /* getting loan_number */
7319     open loan_cur(P_LOAN_ID);
7320     fetch loan_cur into l_loan_number, l_cur_phase;
7321     close loan_cur;
7322 
7323     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing 0-th installment for loan ' || l_loan_number || '...');
7324 
7325     /* new principal and interest amounts from getInstallment api */
7326     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
7327 
7328     if l_cur_phase = 'TERM' then
7329 
7330         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
7331         lns_financials.getInstallment(
7332             p_api_version => 1.0,
7333             p_init_msg_list => FND_API.G_TRUE,
7334             p_commit => FND_API.G_FALSE,
7335             p_loan_Id => P_LOAN_ID,
7336             p_installment_number => l_installment_num,
7337             x_amortization_rec => l_amortization_rec,
7338             x_fees_tbl => l_fee_tbl,
7339             X_RETURN_STATUS => l_return_status,
7340             X_MSG_COUNT => l_msg_count,
7341             X_MSG_DATA => l_msg_data);
7342 
7343     else
7344 
7345         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getOpenInstallment...');
7346         lns_financials.getOpenInstallment(
7347 --            p_api_version => 1.0,
7348             p_init_msg_list => FND_API.G_TRUE,
7349 --            p_commit => FND_API.G_FALSE,
7350             p_loan_Id => P_LOAN_ID,
7351             p_installment_number => l_installment_num,
7352             x_amortization_rec => l_amortization_rec,
7353             x_fees_tbl => l_fee_tbl,
7354             X_RETURN_STATUS => l_return_status,
7355             X_MSG_COUNT => l_msg_count,
7356             X_MSG_DATA => l_msg_data);
7357 
7358     end if;
7359 
7360     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
7361     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
7362 
7363     if l_return_status <> 'S' then
7364         RAISE FND_API.G_EXC_ERROR;
7365     end if;
7366 
7367     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Data returned from lns_financials.getInstallment:');
7368     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
7369     LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
7370     LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_amortization_rec.PRINCIPAL_AMOUNT);
7371     LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_amortization_rec.INTEREST_AMOUNT);
7372     LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_amortization_rec.FEE_AMOUNT);
7373 
7374     l_header_count := 101;
7375     l_BILL_HEADERS_TBL(1).HEADER_ID := l_header_count;
7376     l_BILL_HEADERS_TBL(1).LOAN_ID := P_LOAN_ID;
7377     l_BILL_HEADERS_TBL(1).ASSOC_PAYMENT_NUM := l_installment_num;
7378     l_BILL_HEADERS_TBL(1).DUE_DATE := l_amortization_rec.due_date;
7379 
7380     /* checking for returned values */
7381     if (l_amortization_rec.PRINCIPAL_AMOUNT is null or l_amortization_rec.PRINCIPAL_AMOUNT = 0) and
7382        (l_amortization_rec.INTEREST_AMOUNT is null or l_amortization_rec.INTEREST_AMOUNT = 0) and
7383        (l_amortization_rec.FEE_AMOUNT is null or l_amortization_rec.FEE_AMOUNT = 0)
7384     then
7385 
7386         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All amounts returned from lns_financials.getInstallment = 0. Nothing to bill.');
7387         return;
7388 
7389     end if;
7390 
7391     l_Count1 := 0;
7392 
7393     /* adding principal and interest amounts into lines table */
7394 
7395     if l_amortization_rec.PRINCIPAL_AMOUNT > 0 then
7396 
7397         l_Count1 := l_Count1 + 1;
7398         l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
7399         l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
7400         l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_amortization_rec.PRINCIPAL_AMOUNT;
7401         l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'PRIN';
7402 
7403     end if;
7404 
7405     if l_amortization_rec.INTEREST_AMOUNT > 0 then
7406 
7407         l_Count1 := l_Count1 + 1;
7408         l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
7409         l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
7410         l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_amortization_rec.INTEREST_AMOUNT;
7411         l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'INT';
7412 
7413     end if;
7414 
7415     /* adding fee amounts into lines table */
7416     FOR l_Count IN 1..l_fee_tbl.count LOOP
7417 
7418         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fee #' || l_Count || ' Name: ' || l_fee_tbl(l_Count).FEE_NAME || ' Amount: ' || l_fee_tbl(l_Count).FEE_AMOUNT);
7419 
7420         l_Count1 := l_Count1 + 1;
7421         l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
7422         l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
7423         l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_fee_tbl(l_Count).FEE_AMOUNT;
7424         l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'FEE';
7425         l_BILL_LINES_TBL(l_Count1).LINE_REF_ID := l_fee_tbl(l_Count).FEE_ID;
7426         l_BILL_LINES_TBL(l_Count1).LINE_DESC := l_fee_tbl(l_Count).FEE_NAME;
7427         l_BILL_LINES_TBL(l_Count1).FEE_SCHEDULE_ID := l_fee_tbl(l_Count).FEE_SCHEDULE_ID;
7428 
7429         /* added fee installment validation by raverma request */
7430         if l_amortization_rec.INSTALLMENT_NUMBER <> l_fee_tbl(l_Count).FEE_INSTALLMENT then
7431 
7432             FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_FEE_INSTAL');
7433             FND_MSG_PUB.Add;
7434             LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7435             RAISE FND_API.G_EXC_ERROR;
7436 
7437         end if;
7438 
7439         /* updating LNS_FEE_SCHEDULES with billed_flag = Y */
7440         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_FEE_SCHEDULES with billed_flag = Y ...');
7441         UPDATE LNS_FEE_SCHEDULES
7442         SET
7443             BILLED_FLAG                     =     'Y',
7444             last_update_date                =     LNS_UTILITY_PUB.LAST_UPDATE_DATE,
7445             last_updated_by                 =     LNS_UTILITY_PUB.LAST_UPDATED_BY,
7446             last_update_login               =     LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
7447         WHERE
7448             FEE_SCHEDULE_ID = l_fee_tbl(l_Count).fee_schedule_id;
7449         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_FEE_SCHEDULES');
7450 
7451     END LOOP;
7452 
7453     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS...');
7454 
7455     LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS(
7456         P_API_VERSION		    => 1.0,
7457         P_INIT_MSG_LIST		    => FND_API.G_TRUE,
7458         P_COMMIT			    => FND_API.G_FALSE,
7459         P_VALIDATION_LEVEL		=> FND_API.G_VALID_LEVEL_FULL,
7460         P_BILL_HEADERS_TBL      => l_BILL_HEADERS_TBL,
7461         P_BILL_LINES_TBL        => l_BILL_LINES_TBL,
7462         x_return_status         => l_return_status,
7463         x_msg_count             => l_msg_count,
7464         x_msg_data              => l_msg_data);
7465 
7466     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
7467 
7468     if l_return_status <> 'S' then
7469         RAISE FND_API.G_EXC_ERROR;
7470     end if;
7471 
7472     if P_COMMIT = FND_API.G_TRUE then
7473         COMMIT WORK;
7474         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
7475     end if;
7476 
7477     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully billed 0-th installment for loan ' || l_loan_number);
7478 
7479     -- END OF BODY OF API
7480     x_return_status := FND_API.G_RET_STS_SUCCESS;
7481     X_BILLED_YN := 'Y';
7482 
7483     -- Standard call to get message count and if count is 1, get message info
7484     FND_MSG_PUB.Count_And_Get(
7485                 p_encoded => FND_API.G_FALSE,
7486                 p_count => x_msg_count,
7487                 p_data => x_msg_data);
7488 
7489     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7490 
7491 EXCEPTION
7492     WHEN FND_API.G_EXC_ERROR THEN
7493         ROLLBACK TO PREBILL_SINGLE_LOAN;
7494         x_return_status := FND_API.G_RET_STS_ERROR;
7495         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7496         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7497     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7498         ROLLBACK TO PREBILL_SINGLE_LOAN;
7499         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7500         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7501         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7502     WHEN OTHERS THEN
7503         ROLLBACK TO PREBILL_SINGLE_LOAN;
7504         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7505         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7506             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7507         END IF;
7508         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7509         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7510 END;
7511 
7512 
7513 
7514 /*========================================================================
7515  | PRIVATE PROCEDURE FORGIVENESS_ADJUSTMENT
7516  |
7517  | DESCRIPTION
7518  |      This procedure make adjustment to just billed principal as loan forgiveness program
7519  |
7520  | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7521  |      None
7522  |
7523  | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7524  |      init
7525  |      LogMessage
7526  |
7527  | PARAMETERS
7528  |      P_API_VERSION		    IN          Standard in parameter
7529  |      P_INIT_MSG_LIST		    IN          Standard in parameter
7530  |      P_COMMIT			    IN          Standard in parameter
7531  |      P_VALIDATION_LEVEL	    IN          Standard in parameter
7532  |      P_LOAN_ID               IN          Loan ID
7533  |      X_RETURN_STATUS		    OUT NOCOPY  Standard out parameter
7534  |      X_MSG_COUNT			    OUT NOCOPY  Standard out parameter
7535  |      X_MSG_DATA	    	    OUT NOCOPY  Standard out parameter
7536  |
7537  | KNOWN ISSUES
7538  |      None
7539  |
7540  | NOTES
7541  |      Any interesting aspect of the code in the package body which needs
7542  |      to be stated.
7543  |
7544  | MODIFICATION HISTORY
7545  | Date                  Author            Description of Changes
7546  | 09-01-2008            scherkas          Created for bug 7387659
7547  |
7548  *=======================================================================*/
7549 PROCEDURE FORGIVENESS_ADJUSTMENT(
7550     P_API_VERSION		    IN          NUMBER,
7551     P_INIT_MSG_LIST		    IN          VARCHAR2,
7552     P_COMMIT			    IN          VARCHAR2,
7553     P_VALIDATION_LEVEL	    IN          NUMBER,
7554     P_LOAN_ID               IN          NUMBER,
7555     X_RETURN_STATUS		    OUT NOCOPY  VARCHAR2,
7556     X_MSG_COUNT			    OUT NOCOPY  NUMBER,
7557     X_MSG_DATA	    	    OUT NOCOPY  VARCHAR2)
7558 IS
7559 
7560 /*-----------------------------------------------------------------------+
7561  | Local Variable Declarations and initializations                       |
7562  +-----------------------------------------------------------------------*/
7563 
7564     l_api_name                      CONSTANT VARCHAR2(30) := 'FORGIVENESS_ADJUSTMENT';
7565     l_api_version                   CONSTANT NUMBER := 1.0;
7566     l_return_status                 VARCHAR2(1);
7567     l_msg_count                     NUMBER;
7568     l_msg_data                      VARCHAR2(32767);
7569     l_loan_number                   varchar2(60);
7570     l_trx_id                        number;
7571     l_payment_schedule_id           number;
7572     l_original_amount               number;
7573     l_type                          varchar2(15);
7574     l_loan_desc                     varchar2(250);
7575     l_comments                      varchar2(2000);
7576     l_adj_number                    varchar2(20);
7577     l_adj_id                        number;
7578     l_requested_amount              number;
7579     l_apply_date                    date;
7580     l_gl_date                       date;
7581     l_forgiveness_flag              varchar2(1);
7582     l_forgiveness_percent           number;
7583     l_payment_number                number;
7584 	l_org_id						number;
7585     l_phase							VARCHAR2(30);
7586     l_precision                     number;
7587     l_ext_precision                 number;
7588     l_min_acct_unit                 number;
7589     l_currency                      VARCHAR2(15);
7590 
7591 /*-----------------------------------------------------------------------+
7592  | Cursor Declarations                                                   |
7593  +-----------------------------------------------------------------------*/
7594 
7595     /* querying psa and loan details */
7596     CURSOR details_cur(P_LOAN_ID number) IS
7597         select
7598             loan.loan_number,
7599             loan.LOAN_DESCRIPTION,
7600             nvl(loan.FORGIVENESS_FLAG, 'N'),
7601             nvl(loan.FORGIVENESS_PERCENT, 0),
7602             am.PAYMENT_NUMBER,
7603             am.PRINCIPAL_TRX_ID,
7604             psa.payment_schedule_id,
7605             nvl(psa.AMOUNT_DUE_ORIGINAL, 0),
7606             psa.TRX_DATE,
7607             psa.GL_DATE,
7608             nvl(loan.CURRENT_PHASE, 'TERM'),
7609 			psa.org_id,
7610             loan.LOAN_CURRENCY
7611         from LNS_LOAN_HEADERS loan,
7612             lns_amortization_scheds am,
7613             ar_payment_schedules psa
7614         where
7615             loan.loan_id = P_LOAN_ID and
7616             loan.LAST_AMORTIZATION_ID = am.AMORTIZATION_SCHEDULE_ID and
7617             loan.loan_id = am.loan_id and
7618             am.PRINCIPAL_TRX_ID = psa.CUSTOMER_TRX_ID(+);
7619 
7620 BEGIN
7621 
7622     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7623 
7624     -- Standard start of API savepoint
7625     SAVEPOINT FORGIVENESS_ADJUSTMENT;
7626     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7627 
7628     -- Standard call to check for call compatibility
7629     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7630       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7631     END IF;
7632 
7633     -- Initialize message list if p_init_msg_list is set to TRUE
7634     IF FND_API.To_Boolean(p_init_msg_list) THEN
7635       FND_MSG_PUB.initialize;
7636     END IF;
7637 
7638     -- Initialize API return status to success
7639     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
7640 
7641     -- START OF BODY OF API
7642     LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
7643 
7644     /* verify input parameters */
7645     if P_LOAN_ID is null then
7646 
7647 --        LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
7648     	FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
7649 		FND_MSG_PUB.Add;
7650         LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7651         RAISE FND_API.G_EXC_ERROR;
7652 
7653     end if;
7654 
7655     /* checking for system options values required for adjustment */
7656     if g_forgiveness_rec_trx_id is null then
7657         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan Forgiveness receivables activity name is not set in the system option. Exiting.');
7658         return;
7659     end if;
7660 
7661     /* querying psa, loan details */
7662     open details_cur(P_LOAN_ID);
7663     fetch details_cur into
7664         l_loan_number,
7665         l_loan_desc,
7666         l_forgiveness_flag,
7667         l_forgiveness_percent,
7668         l_payment_number,
7669         l_trx_id,
7670         l_payment_schedule_id,
7671         l_original_amount,
7672         l_apply_date,
7673         l_gl_date,
7674         l_phase,
7675 		l_org_id,
7676         l_currency;
7677     close details_cur;
7678 
7679     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan_number = ' || l_loan_number);
7680     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan_desc = ' || l_loan_desc);
7681     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_forgiveness_flag = ' || l_forgiveness_flag);
7682     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_forgiveness_percent = ' || l_forgiveness_percent);
7683     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_payment_number = ' || l_payment_number);
7684     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_id = ' || l_trx_id);
7685     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_payment_schedule_id = ' || l_payment_schedule_id);
7686     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_original_amount = ' || l_original_amount);
7687     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_apply_date = ' || l_apply_date);
7688     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_gl_date = ' || l_gl_date);
7689     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_phase = ' || l_phase);
7690     LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_org_id = ' || l_org_id);
7691 
7692     if l_trx_id is null then
7693         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Nothing to adjust - principal invoice does not exist for payment number ' || l_payment_number || '. Exiting.');
7694         return;
7695     end if;
7696 
7697     if l_payment_schedule_id is null then
7698         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot create adjustment - principal invoice is INCOMPLETE!');
7699         RAISE FND_API.G_EXC_ERROR;
7700     end if;
7701 
7702     if l_forgiveness_flag = 'N' then
7703         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not part of loan forgiveness program. Exiting.');
7704         return;
7705     end if;
7706 
7707     if l_forgiveness_percent = 0 then
7708         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness percent = 0. Will not perform forgiveness adjustment. Exiting.');
7709         return;
7710     end if;
7711 
7712     if l_original_amount = 0 then
7713         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Principal amount = 0. Will not perform forgiveness adjustment. Exiting.');
7714         return;
7715     end if;
7716 
7717     l_type := 'LINE';
7718 
7719     -- fix for bug 7712669
7720     fnd_currency.GET_INFO(CURRENCY_CODE => l_currency,
7721                         PRECISION => l_precision,
7722                         EXT_PRECISION => l_ext_precision,
7723                         MIN_ACCT_UNIT => l_min_acct_unit);
7724     l_requested_amount := round(l_original_amount * (l_forgiveness_percent/100), l_precision);
7725 
7726     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
7727 
7728     /* buld comments */
7729     l_comments := 'Loan Forgiveness Program for loan ' || l_loan_number;
7730 
7731     /* do adjustment */
7732     CREATE_AR_ADJ(P_TYPE => l_type,
7733         P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id,
7734         P_RECEIVABLES_TRX_ID => g_forgiveness_rec_trx_id,
7735         P_AMOUNT => -l_requested_amount,
7736         P_APPLY_DATE => l_apply_date,
7737         P_GL_DATE => l_gl_date,
7738         P_CUSTOMER_TRX_LINE_ID => null,
7739         P_CODE_COMBINATION_ID => null,
7740         P_USSGL_TRX_CODE => null,
7741         P_REASON_CODE => null,
7742         P_COMMENTS => l_comments,
7743         X_ADJ_ID => l_adj_id,
7744         X_ADJ_NUMBER => l_adj_number,
7745 		P_ORG_ID => l_org_id);
7746 
7747     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_adj_number = ' || l_adj_number || ' (l_adj_id = ' || l_adj_id || ')');
7748 
7749     if l_adj_id is null and l_adj_number is null then
7750         RAISE FND_API.G_EXC_ERROR;
7751     end if;
7752 
7753     if P_COMMIT = FND_API.G_TRUE then
7754         COMMIT WORK;
7755         LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
7756     end if;
7757 
7758     LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully adjusted payment ' || l_payment_number || ' for loan ' || l_loan_number);
7759 
7760     -- END OF BODY OF API
7761     x_return_status := FND_API.G_RET_STS_SUCCESS;
7762 
7763     -- Standard call to get message count and if count is 1, get message info
7764     FND_MSG_PUB.Count_And_Get(
7765                 p_encoded => FND_API.G_FALSE,
7766                 p_count => x_msg_count,
7767                 p_data => x_msg_data);
7768 
7769     LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7770 
7771 EXCEPTION
7772     WHEN FND_API.G_EXC_ERROR THEN
7773         ROLLBACK TO FORGIVENESS_ADJUSTMENT;
7774         x_return_status := FND_API.G_RET_STS_ERROR;
7775         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7776         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7777     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7778         ROLLBACK TO FORGIVENESS_ADJUSTMENT;
7779         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7780         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7781         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7782     WHEN OTHERS THEN
7783         ROLLBACK TO FORGIVENESS_ADJUSTMENT;
7784         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7785         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7786             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7787         END IF;
7788         FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7789         LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7790 END;
7791 
7792 
7793 
7794 BEGIN
7795     G_LOG_ENABLED := 'N';
7796     G_MSG_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7797 
7798     /* getting msg logging info */
7799     G_LOG_ENABLED := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'), 'N');
7800     /*
7801     if (G_LOG_ENABLED = 'N') then
7802        G_MSG_LEVEL := FND_LOG.LEVEL_UNEXPECTED;
7803     else
7804        G_MSG_LEVEL := NVL(to_number(FND_PROFILE.VALUE('AFLOG_LEVEL')), FND_LOG.LEVEL_UNEXPECTED);
7805     end if;
7806     */
7807     LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_LOG_ENABLED: ' || G_LOG_ENABLED);
7808     LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_MSG_LEVEL: ' || G_MSG_LEVEL);
7809 
7810 END;