[Home] [Help]
PACKAGE BODY: APPS.LNS_BILLING_BATCH_PUB
Source
1 PACKAGE BODY LNS_BILLING_BATCH_PUB as
2 /* $Header: LNS_BILLING_B.pls 120.74.12020000.4 2012/10/17 12:59:35 scherkas ship $ */
3
4
5 /*=======================================================================+
6 | Package Global Constants
7 +=======================================================================*/
8 G_PKG_NAME CONSTANT VARCHAR2(30):= 'LNS_BILLING_BATCH_PUB';
9 G_LOG_ENABLED varchar2(5);
10 G_MSG_LEVEL NUMBER;
11 g_org_id number;
12 g_batch_source_id number;
13 g_days_to_bill_before_dd number;
14 g_trx_type_id number;
15 g_day_togl_after_dd number;
16 g_multiple_lines VARCHAR2(1);
17 g_sys_opt_num number;
18 g_int_trx_type_id number;
19 g_fee_trx_type_id number;
20 g_cr_return_status varchar2(10);
21 g_receivables_trx_id number;
22 g_USSGL_TRANSACTION_CODE varchar2(30);
23 g_last_billing_report clob;
24 g_last_all_statements clob;
25 g_forgiveness_rec_trx_id number;
26 g_set_of_books_id number;
27
28
29 PROCEDURE FORGIVENESS_ADJUSTMENT(
30 P_API_VERSION IN NUMBER,
31 P_INIT_MSG_LIST IN VARCHAR2,
32 P_COMMIT IN VARCHAR2,
33 P_VALIDATION_LEVEL IN NUMBER,
34 P_LOAN_ID IN NUMBER,
35 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
36 X_MSG_COUNT OUT NOCOPY NUMBER,
37 X_MSG_DATA OUT NOCOPY VARCHAR2);
38
39 PROCEDURE REVERSE_BILLED_FEES(p_amortization_id IN NUMBER);
40
41
42 /*========================================================================
43 | PRIVATE PROCEDURE LogMessage
44 |
45 | DESCRIPTION
46 | This procedure logs debug messages to db and to CM log
47 |
48 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
49 | init
50 | CREATE_AR_INVOICES
51 | CREATE_AR_CM
52 | APPLY_RECEIPT
53 | BILL_SINGLE_LOAN
54 | CALC_SINGLE_LOAN_NEXT_DD
55 | LNS_BILLING_CONCUR
56 | LNS_RVRS_PMT_CONCUR
57 | BILL_LOANS
58 | CALC_PAST_DUE_LOANS_NEXT_DD
59 | REVERSE_LAST_AMORTIZATION
60 | CREATE_SINGLE_OFFCYCLE_BILL
61 | CREATE_OFFCYCLE_BILLS
62 | REVERSE_OFFCYCLE_BILL
63 |
64 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
65 | None
66 |
67 | PARAMETERS
68 | p_msg_level IN Debug msg level
69 | p_msg IN Debug msg itself
70 |
71 | KNOWN ISSUES
72 | None
73 |
74 | NOTES
75 | Any interesting aspect of the code in the package body which needs
76 | to be stated.
77 |
78 | MODIFICATION HISTORY
79 | Date Author Description of Changes
80 | 01-01-2004 scherkas Created
81 |
82 *=======================================================================*/
83 Procedure LogMessage(p_msg_level IN NUMBER, p_msg in varchar2)
84 IS
85 BEGIN
86
87 if (p_msg_level >= G_MSG_LEVEL) then
88 FND_LOG.STRING(p_msg_level, G_PKG_NAME, p_msg);
89 end if;
90
91 if FND_GLOBAL.Conc_Request_Id is not null then
92 fnd_file.put_line(FND_FILE.LOG, p_msg);
93 end if;
94
95 EXCEPTION
96 WHEN OTHERS THEN
97 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: ' || sqlerrm);
98 END;
99
100
101
102 /*========================================================================
103 | PRIVATE PROCEDURE init
104 |
105 | DESCRIPTION
106 | This procedure inits data needed for processing
107 |
108 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
109 | LNS_BILLING_CONCUR
110 | LNS_RVRS_PMT_CONCUR
111 | BILL_LOANS
112 | CALC_PAST_DUE_LOANS_NEXT_DD
113 | REVERSE_LAST_AMORTIZATION
114 | CREATE_SINGLE_OFFCYCLE_BILL
115 | REVERSE_OFFCYCLE_BILL
116 |
117 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
118 | LogMessage
119 |
120 | PARAMETERS
121 | None
122 |
123 | KNOWN ISSUES
124 | None
125 |
126 | NOTES
127 | Any interesting aspect of the code in the package body which needs
128 | to be stated.
129 |
130 | MODIFICATION HISTORY
131 | Date Author Description of Changes
132 | 01-01-2004 scherkas Created
133 |
134 *=======================================================================*/
135 Procedure init
136 IS
137 l_api_name CONSTANT VARCHAR2(30) := 'INIT';
138 l_org_status varchar2(1);
139 BEGIN
140
141 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
142 --fnd_global.apps_initialize(FND_GLOBAL.USER_ID, FND_GLOBAL.RESP_ID, FND_GLOBAL.RESP_APPL_ID, FND_GLOBAL.SECURITY_GROUP_ID);
143
144 /* getting msg logging info */
145 G_LOG_ENABLED := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'), 'N');
146 G_MSG_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
147 /*
148 if (G_LOG_ENABLED = 'N') then
149 G_MSG_LEVEL := FND_LOG.LEVEL_UNEXPECTED;
150 else
151 G_MSG_LEVEL := NVL(to_number(FND_PROFILE.VALUE('AFLOG_LEVEL')), FND_LOG.LEVEL_UNEXPECTED);
152 end if;
153 */
154
155 LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_LOG_ENABLED: ' || G_LOG_ENABLED);
156 LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_MSG_LEVEL: ' || G_MSG_LEVEL);
157
158 /* getting org_id */
159 -- g_org_id := to_number(fnd_profile.value('ORG_ID'));
160 g_org_id := MO_GLOBAL.GET_CURRENT_ORG_ID();
161 LogMessage(FND_LOG.LEVEL_STATEMENT, 'g_org_id: ' || g_org_id);
162 l_org_status := MO_GLOBAL.check_valid_org(g_org_id);
163 LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.check_valid_org(' || g_org_id || '): ' || l_org_status);
164
165 /* checking for number of system options record for giving org_id */
166 select count(1) into g_sys_opt_num from LNS_SYSTEM_OPTIONS where ORG_ID = g_org_id;
167
168 if g_sys_opt_num = 0 then
169
170 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No system options found for the org ' || g_org_id);
171 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_SYSTEM_OPTIONS');
172 FND_MESSAGE.SET_TOKEN('ORG', g_org_id);
173 FND_MSG_PUB.Add;
174 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
175 RAISE FND_API.G_EXC_ERROR;
176
177 elsif g_sys_opt_num > 1 then
178
179 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Found more then 1 system options records for the org ' || g_org_id);
180 FND_MESSAGE.SET_NAME('LNS', 'LNS_MANY_SYSTEM_OPTIONS');
181 FND_MESSAGE.SET_TOKEN('ORG', g_org_id);
182 FND_MSG_PUB.Add;
183 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
184 RAISE FND_API.G_EXC_ERROR;
185
186 end if;
187
188 /* getting system options */
189 select BATCH_SOURCE_ID,
190 DAYS_TOBILL_BEFORE_DUE_DATE,
191 TRX_TYPE_ID,
192 DAYS_TOGL_AFTER_DUE_DATE,
193 COMBINE_INT_PRIN_FLAG,
194 INTEREST_TRX_TYPE_ID,
195 FEE_TRX_TYPE_ID,
196 RECEIVABLES_TRX_ID,
197 ADJUST_USSGL_TRX_CODE,
198 FORGIVENESS_REC_TRX_ID,
199 SET_OF_BOOKS_ID
200 into g_batch_source_id,
201 g_days_to_bill_before_dd,
202 g_trx_type_id,
203 g_day_togl_after_dd,
204 g_multiple_lines,
205 g_int_trx_type_id,
206 g_fee_trx_type_id,
207 g_receivables_trx_id,
208 g_USSGL_TRANSACTION_CODE,
209 g_forgiveness_rec_trx_id,
210 g_set_of_books_id
211 FROM LNS_SYSTEM_OPTIONS
212 WHERE ORG_ID = g_org_id;
213
214 LogMessage(FND_LOG.LEVEL_STATEMENT, 'System options:');
215 LogMessage(FND_LOG.LEVEL_STATEMENT, 'batch_source_id: ' || g_batch_source_id);
216 LogMessage(FND_LOG.LEVEL_STATEMENT, 'days_to_bill_before_dd: ' || g_days_to_bill_before_dd);
217 LogMessage(FND_LOG.LEVEL_STATEMENT, 'trx_type_id: ' || g_trx_type_id);
218 LogMessage(FND_LOG.LEVEL_STATEMENT, 'day_togl_after_dd: ' || g_day_togl_after_dd);
219 LogMessage(FND_LOG.LEVEL_STATEMENT, 'multiple_lines: ' || g_multiple_lines);
220 LogMessage(FND_LOG.LEVEL_STATEMENT, 'int_trx_type_id: ' || g_int_trx_type_id);
221 LogMessage(FND_LOG.LEVEL_STATEMENT, 'fee_trx_type_id: ' || g_fee_trx_type_id);
222 LogMessage(FND_LOG.LEVEL_STATEMENT, 'receivables_trx_id: ' || g_receivables_trx_id);
223 LogMessage(FND_LOG.LEVEL_STATEMENT, 'USSGL_TRANSACTION_CODE: ' || g_USSGL_TRANSACTION_CODE);
224 LogMessage(FND_LOG.LEVEL_STATEMENT, 'g_forgiveness_rec_trx_id: ' || g_forgiveness_rec_trx_id);
225 LogMessage(FND_LOG.LEVEL_STATEMENT, 'g_set_of_books_id: ' || g_set_of_books_id);
226
227 if g_batch_source_id is null then
228
229 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Batch Source is not set in the system option.');
230 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_BATCH_IN_SYS_OPT');
231 FND_MSG_PUB.Add;
232 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
233 RAISE FND_API.G_EXC_ERROR;
234
235 end if;
236
237 if g_trx_type_id is null then
238
239 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Default Transaction Type is not set in the system option.');
240 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_TYPE_IN_SYS_OPT');
241 FND_MSG_PUB.Add;
242 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
243 RAISE FND_API.G_EXC_ERROR;
244
245 end if;
246
247 if g_multiple_lines is null then
248
249 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Combination Invoice is not set in the system option.');
250 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INV_COMB_IN_SYS_OPT');
251 FND_MSG_PUB.Add;
252 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
253 RAISE FND_API.G_EXC_ERROR;
254
255 end if;
256
257 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
258
259 END;
260
261
262
263 FUNCTION GET_BILLING_DATE(P_DAYS IN NUMBER) RETURN VARCHAR2 IS
264 l_return varchar2(20);
265 BEGIN
266
267 if P_DAYS is not null then
268 -- l_return := ' ( ' || (sysdate + P_DAYS) || ' )';
269 l_return := to_char(sysdate + P_DAYS,'YYYY-MM-DD');
270 end if;
271
272 return l_return;
273 END;
274
275
276
277 /*========================================================================
278 | PRIVATE PROCEDURE STORE_LAST_PAYMENT_NUMBER
279 |
280 | DESCRIPTION
281 | This procedure stores last payment number and last amortization id in lns_loan_headers_all
282 |
283 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
284 |
285 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
286 | LogMessage
287 |
288 | PARAMETERS
289 | P_LOAN_ID IN Loan ID
290 |
291 | KNOWN ISSUES
292 | None
293 |
294 | NOTES
295 | Any interesting aspect of the code in the package body which needs
296 | to be stated.
297 |
298 | MODIFICATION HISTORY
299 | Date Author Description of Changes
300 | 02-11-2005 scherkas Created
301 |
302 *=======================================================================*/
303 Procedure STORE_LAST_PAYMENT_NUMBER(P_LOAN_ID IN NUMBER)
304 IS
305
306 /*-----------------------------------------------------------------------+
307 | Local Variable Declarations and initializations |
308 +-----------------------------------------------------------------------*/
309
310 l_api_name CONSTANT VARCHAR2(30) := 'STORE_LAST_PAYMENT_NUMBER';
311 l_api_version CONSTANT NUMBER := 1.0;
312 l_return_status VARCHAR2(1);
313 l_msg_count NUMBER;
314 l_msg_data VARCHAR2(32767);
315 l_version_number number;
316 l_loan_id number;
317 l_Count number;
318 l_loan_number varchar2(60);
319 l_last_payment_number number;
320 l_amortization_id number;
321 l_old_last_payment_number number;
322 l_old_amortization_id number;
323 l_current_phase varchar2(30);
324
325 l_loan_header_rec LNS_LOAN_HEADER_PUB.loan_header_rec_type;
326
327 /*-----------------------------------------------------------------------+
328 | Cursor Declarations |
329 +-----------------------------------------------------------------------*/
330 CURSOR loan_ver_cur(P_LOAN_ID NUMBER) IS
331 select
332 head.OBJECT_VERSION_NUMBER,
333 head.loan_id,
334 head.loan_number,
335 head.LAST_PAYMENT_NUMBER,
336 head.LAST_AMORTIZATION_ID,
337 nvl(head.CURRENT_PHASE, 'TERM')
338 from
339 LNS_LOAN_HEADERS head
340 where
341 head.loan_id = P_LOAN_ID;
342
343 CURSOR pay_number_cur(P_LOAN_ID NUMBER, P_PHASE VARCHAR2) IS
344 select max(PAYMENT_NUMBER)
345 from LNS_AMORTIZATION_SCHEDS
346 where LOAN_ID = P_LOAN_ID
347 and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
348 and REAMORTIZATION_AMOUNT is null
349 and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM');
350
351 CURSOR amortization_cur(P_LOAN_ID NUMBER, P_PHASE VARCHAR2) IS
352 select max(AMORTIZATION_SCHEDULE_ID)
353 from LNS_AMORTIZATION_SCHEDS
354 where LOAN_ID = P_LOAN_ID
355 and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
356 and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM')
357 and PAYMENT_NUMBER =
358 nvl((select max(PAYMENT_NUMBER)
359 from LNS_AMORTIZATION_SCHEDS
360 where LOAN_ID = P_LOAN_ID
361 and (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
362 and REAMORTIZATION_AMOUNT is null
363 and nvl(PHASE, 'TERM') = nvl(P_PHASE, 'TERM')), 0);
364 BEGIN
365
366 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
367
368 open loan_ver_cur(P_LOAN_ID);
369 fetch loan_ver_cur into
370 l_version_number,
371 l_loan_id,
372 l_loan_number,
373 l_old_last_payment_number,
374 l_old_amortization_id,
375 l_current_phase;
376 close loan_ver_cur;
377
378 open pay_number_cur(P_LOAN_ID, l_current_phase);
379 fetch pay_number_cur into l_last_payment_number;
380 close pay_number_cur;
381
382 open amortization_cur(P_LOAN_ID, l_current_phase);
383 fetch amortization_cur into l_amortization_id;
384 close amortization_cur;
385
386 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Old LAST_PAYMENT_NUMBER: ' || l_old_last_payment_number);
387 LogMessage(FND_LOG.LEVEL_STATEMENT, 'New LAST_PAYMENT_NUMBER: ' || l_last_payment_number);
388 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Old LAST_AMORTIZATION_ID: ' || l_old_amortization_id);
389 LogMessage(FND_LOG.LEVEL_STATEMENT, 'New LAST_AMORTIZATION_ID: ' || l_amortization_id);
390
391 /* updating loan header table */
392 l_loan_header_rec.loan_id := l_loan_id;
393
394 if l_last_payment_number is null then
395 l_loan_header_rec.LAST_PAYMENT_NUMBER := FND_API.G_MISS_NUM;
396 else
397 l_loan_header_rec.LAST_PAYMENT_NUMBER := l_last_payment_number;
398 end if;
399
400 if l_amortization_id is null then
401 l_loan_header_rec.LAST_AMORTIZATION_ID := FND_API.G_MISS_NUM;
402 else
403 l_loan_header_rec.LAST_AMORTIZATION_ID := l_amortization_id;
404 end if;
405
406 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header...');
407
408 LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
409 P_LOAN_HEADER_REC => l_loan_header_rec,
410 P_INIT_MSG_LIST => FND_API.G_FALSE,
411 X_RETURN_STATUS => l_return_status,
412 X_MSG_COUNT => l_msg_count,
413 X_MSG_DATA => l_msg_data);
414
415 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
416
417 IF l_return_status = 'S' THEN
418 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
419 ELSE
420 FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
421 FND_MSG_PUB.Add;
422 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
423 RAISE FND_API.G_EXC_ERROR;
424 END IF;
425
426 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
427
428 END;
429
430
431
432 /*========================================================================
433 | PUBLIC PROCEDURE PROCESS_PAID_LOANS
434 |
435 | DESCRIPTION
436 | This procedure sets still active paid off loans to status PAIDOFF
437 |
438 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
439 | None
440 |
441 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
442 | LogMessage
443 |
444 | PARAMETERS
445 | P_API_VERSION IN Standard in parameter
446 | P_INIT_MSG_LIST IN Standard in parameter
447 | P_COMMIT IN Standard in parameter
448 | P_VALIDATION_LEVEL IN Standard in parameter
449 | P_LOAN_ID IN Loan
450 | P_PAYOFF_DATE IN Pay off date
451 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
452 | X_MSG_COUNT OUT NOCOPY Standard out parameter
453 | X_MSG_DATA OUT NOCOPY Standard out parameter
454
455 | KNOWN ISSUES
456 | None
457 |
458 | NOTES
459 | Any interesting aspect of the code in the package body which needs
460 | to be stated.
461 |
462 | MODIFICATION HISTORY
463 | Date Author Description of Changes
464 | 01-01-2004 scherkas Created
465 |
466 *=======================================================================*/
467 PROCEDURE PROCESS_PAID_LOANS(
468 P_API_VERSION IN NUMBER,
469 P_INIT_MSG_LIST IN VARCHAR2,
470 P_COMMIT IN VARCHAR2,
471 P_VALIDATION_LEVEL IN NUMBER,
472 P_LOAN_ID IN NUMBER,
473 P_PAYOFF_DATE IN DATE,
474 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
475 X_MSG_COUNT OUT NOCOPY NUMBER,
476 X_MSG_DATA OUT NOCOPY VARCHAR2)
477 IS
478
479 /*-----------------------------------------------------------------------+
480 | Local Variable Declarations and initializations |
481 +-----------------------------------------------------------------------*/
482
483 l_api_name CONSTANT VARCHAR2(30) := 'PROCESS_PAID_LOANS';
484 l_api_version CONSTANT NUMBER := 1.0;
485 l_return_status VARCHAR2(1);
486 l_msg_count NUMBER;
487 l_msg_data VARCHAR2(32767);
488 l_version_number number;
489 l_loan_id number;
490 l_Count number;
491 l_loan_number varchar2(60);
492 l_remaining_amount number;
493 l_end date;
494 l_start date;
495
496 l_loan_header_rec LNS_LOAN_HEADER_PUB.loan_header_rec_type;
497
498 /*-----------------------------------------------------------------------+
499 | Cursor Declarations |
500 +-----------------------------------------------------------------------*/
501
502 /* query paid off loans that are still active */
503 CURSOR paidoff_loans_cur(P_LOAN_ID number) IS
504 select
505 head.OBJECT_VERSION_NUMBER,
506 head.loan_id,
507 head.loan_number
508 from
509 LNS_PAY_SUM_V sum,
510 LNS_LOAN_HEADERS head
511 where
512 head.loan_id = nvl(P_LOAN_ID, head.loan_id) and
513 head.loan_id = sum.loan_id and
514 head.loan_status in ('ACTIVE', 'DEFAULT', 'DELINQUENT') and
515 head.last_payment_number is not null and
516 head.last_amortization_id is not null and
517 sum.total_principal_balance <= 0 and
518 (head.REQUESTED_AMOUNT + nvl(head.ADD_REQUESTED_AMOUNT, 0)) = sum.TOTAL_PRIN_PAID_TODATE;
519
520 CURSOR validate_loan_cur(P_LOAN_ID number) IS
521 select nvl(sum(total_remaining_amount),0)
522 from LNS_AM_SCHEDS_V
523 where loan_id = P_LOAN_ID and
524 reversed_code = 'N';
525
526 BEGIN
527
528 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
529 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing paid off loans...');
530 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input parameters:');
531 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ID: ' || P_LOAN_ID);
532 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Payoff date: ' || P_PAYOFF_DATE);
533 -- Standard Start of API savepoint
534 SAVEPOINT PROCESS_PAID_LOANS;
535
536 -- Initialize message list IF p_init_msg_list is set to TRUE.
537 IF FND_API.to_Boolean(p_init_msg_list) THEN
538 FND_MSG_PUB.initialize;
539 END IF;
540
541 -- Initialize API return status to SUCCESS
542 x_return_status := FND_API.G_RET_STS_SUCCESS;
543
544 --
545 -- Api body
546 -- ----------------------------------------------------------------
547
548 /* init variables */
549 l_Count := 0;
550
551 l_start := sysdate;
552 open paidoff_loans_cur(P_LOAN_ID);
553
554 LOOP
555
556 fetch paidoff_loans_cur into
557 l_version_number,
558 l_loan_id,
559 l_loan_number;
560 exit when paidoff_loans_cur%NOTFOUND;
561
562 l_Count := l_Count + 1;
563 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Processing loan ' || l_loan_number || ' id ' || l_loan_id);
564
565 BEGIN
566
567 open validate_loan_cur(l_loan_id);
568 fetch validate_loan_cur into l_remaining_amount;
569 close validate_loan_cur;
570
571 if l_remaining_amount = 0 then
572
573 LNS_FUNDING_PUB.VALIDATE_DISB_FOR_PAYOFF(
574 P_API_VERSION => 1.0,
575 P_INIT_MSG_LIST => FND_API.G_TRUE,
576 P_COMMIT => FND_API.G_FALSE,
577 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
578 P_LOAN_ID => l_loan_id,
579 X_RETURN_STATUS => l_return_status,
580 X_MSG_COUNT => l_msg_count,
581 X_MSG_DATA => l_msg_data);
582
583 IF l_return_status <> 'S' THEN
584 RAISE FND_API.G_EXC_ERROR;
585 END IF;
586
587 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_fee_assignments...');
588 update lns_fee_assignments
589 set end_date_active = P_PAYOFF_DATE
590 where loan_id = l_loan_id
591 and (end_date_active is null OR end_date_active > P_PAYOFF_DATE);
592 LogMessage(FND_LOG.LEVEL_STATEMENT, 'lns_fee_assignments is updated');
593
594 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_fee_schedules...');
595 update lns_fee_schedules
596 set billed_flag = 'Y'
597 where loan_id = l_loan_id
598 and active_flag = 'Y'
599 and billed_flag = 'N'
600 and object_version_number = object_version_number + 1;
601 LogMessage(FND_LOG.LEVEL_STATEMENT, 'lns_fee_schedules is updated');
602
603 /* updating loan header table */
604 l_loan_header_rec.loan_id := l_loan_id;
605 l_loan_header_rec.LOAN_STATUS := 'PAIDOFF';
606 l_loan_header_rec.SECONDARY_STATUS := FND_API.G_MISS_CHAR;
607
608 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
609 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_STATUS: ' || l_loan_header_rec.LOAN_STATUS);
610 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Secondary status: ' || l_loan_header_rec.SECONDARY_STATUS);
611
612 LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
613 P_LOAN_HEADER_REC => l_loan_header_rec,
614 P_INIT_MSG_LIST => FND_API.G_FALSE,
615 X_RETURN_STATUS => l_return_status,
616 X_MSG_COUNT => l_msg_count,
617 X_MSG_DATA => l_msg_data);
618
619 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
620
621 IF l_return_status = 'S' THEN
622 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
623 ELSE
624 FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
625 FND_MSG_PUB.Add;
626 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
627 RAISE FND_API.G_EXC_ERROR;
628 END IF;
629
630 if P_COMMIT = FND_API.G_TRUE then
631 COMMIT WORK;
632 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
633 end if;
634
635 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully paid off loan ' || l_loan_number || ' id ' || l_loan_id);
636
637 else
638
639 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Cannot pay off loan ' || l_loan_number || '. Outstanding amount is ' || l_remaining_amount);
640
641 end if;
642
643 EXCEPTION
644 WHEN OTHERS THEN
645 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to process loan ' || l_loan_number);
646 END;
647
648 END LOOP;
649
650 close paidoff_loans_cur;
651
652 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
653 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || l_Count || ' loan(s)');
654 l_end := sysdate;
655 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Process Paid Loans Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
656
657 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
658
659 EXCEPTION
660
661 WHEN FND_API.G_EXC_ERROR THEN
662 ROLLBACK TO PROCESS_PAID_LOANS;
663 x_return_status := FND_API.G_RET_STS_ERROR;
664 logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
665
666 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
667 ROLLBACK TO PROCESS_PAID_LOANS;
668 x_return_status := FND_API.G_RET_STS_ERROR;
669 logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
670
671 WHEN OTHERS THEN
672 ROLLBACK TO PROCESS_PAID_LOANS;
673 x_return_status := FND_API.G_RET_STS_ERROR;
674 logMessage(FND_LOG.LEVEL_ERROR, sqlerrm);
675
676 END;
677
678
679
680
681 /*========================================================================
682 | PRIVATE PROCEDURE REACTIVATE_PAID_LOANS
683 |
684 | DESCRIPTION
685 | This procedure sets still active paid off loans to status PAIDOFF
686 |
687 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
688 | None
689 |
690 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
691 | LogMessage
692 |
693 | PARAMETERS
694 | None
695 |
696 | KNOWN ISSUES
697 | None
698 |
699 | NOTES
700 | Any interesting aspect of the code in the package body which needs
701 | to be stated.
702 |
703 | MODIFICATION HISTORY
704 | Date Author Description of Changes
705 | 01-01-2004 scherkas Created
706 |
707 *=======================================================================*/
708 PROCEDURE REACTIVATE_PAID_LOANS(
709 P_API_VERSION IN NUMBER,
710 P_INIT_MSG_LIST IN VARCHAR2,
711 P_COMMIT IN VARCHAR2,
712 P_VALIDATION_LEVEL IN NUMBER,
713 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
714 X_MSG_COUNT OUT NOCOPY NUMBER,
715 X_MSG_DATA OUT NOCOPY VARCHAR2)
716 IS
717
718 /*-----------------------------------------------------------------------+
719 | Local Variable Declarations and initializations |
720 +-----------------------------------------------------------------------*/
721
722 l_api_name CONSTANT VARCHAR2(30) := 'REACTIVATE_PAID_LOANS';
723 l_api_version CONSTANT NUMBER := 1.0;
724 l_return_status VARCHAR2(1);
725 l_msg_count NUMBER;
726 l_msg_data VARCHAR2(32767);
727 l_version_number number;
728 l_loan_id number;
729 l_Count number;
730 l_loan_number varchar2(60);
731 l_end date;
732 l_start date;
733
734 l_loan_header_rec LNS_LOAN_HEADER_PUB.loan_header_rec_type;
735
736 /*-----------------------------------------------------------------------+
737 | Cursor Declarations |
738 +-----------------------------------------------------------------------*/
739
740 /* query paid off loans that must be reactivated */
741 CURSOR paidoff_loans_cur IS
742 select
743 head.OBJECT_VERSION_NUMBER,
744 head.loan_id,
745 head.loan_number
746 from
747 LNS_LOAN_HEADERS head
748 where
749 head.loan_status = 'PAIDOFF' and
750 ((select nvl(sum(total_remaining_amount),0)
751 from LNS_AM_SCHEDS_V
752 where loan_id = head.loan_id and
753 reversed_code = 'N') > 0);
754
755 BEGIN
756
757 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
758 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reactivating paid off loans...');
759
760 /* init variables */
761 l_Count := 0;
762
763 l_start := sysdate;
764 open paidoff_loans_cur;
765
766 LOOP
767
768 fetch paidoff_loans_cur into
769 l_version_number,
770 l_loan_id,
771 l_loan_number;
772 exit when paidoff_loans_cur%NOTFOUND;
773
774 l_Count := l_Count + 1;
775 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ' || l_loan_number || ' id ' || l_loan_id);
776
777 BEGIN
778 /* updating loan header table */
779 l_loan_header_rec.loan_id := l_loan_id;
780 l_loan_header_rec.LOAN_STATUS := 'ACTIVE';
781
782 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
783 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_STATUS: ' || l_loan_header_rec.LOAN_STATUS);
784
785 LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_version_number,
786 P_LOAN_HEADER_REC => l_loan_header_rec,
787 P_INIT_MSG_LIST => FND_API.G_FALSE,
788 X_RETURN_STATUS => l_return_status,
789 X_MSG_COUNT => l_msg_count,
790 X_MSG_DATA => l_msg_data);
791
792 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
793
794 IF l_return_status = 'S' THEN
795 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully updated LNS_LOAN_HEADERS_ALL');
796 ELSE
797 FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
798 FND_MSG_PUB.Add;
799 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
800 RAISE FND_API.G_EXC_ERROR;
801 END IF;
802
803 if P_COMMIT = FND_API.G_TRUE then
804 COMMIT WORK;
805 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
806 end if;
807
808 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reactivated loan ' || l_loan_number || ' id ' || l_loan_id);
809
810 EXCEPTION
811 WHEN OTHERS THEN
812 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to process loan ' || l_loan_number);
813 END;
814
815 END LOOP;
816
817 close paidoff_loans_cur;
818
819 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
820 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || l_Count || ' loan(s)');
821 l_end := sysdate;
822 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reactivate Loans Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
823
824 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
825
826 EXCEPTION
827 WHEN OTHERS THEN
828 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to reactivate paid off loans');
829
830 END;
831
832
833
834
835 /*========================================================================
836 | PRIVATE PROCEDURE GET_RECEIVABLES_FUND_DESC
837 |
838 | DESCRIPTION
839 | This procedure gets receivable fund description for appending to AR line description
840 |
841 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
842 | None
843 |
844 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
845 | LogMessage
846 |
847 | PARAMETERS
848 | None
849 |
850 | KNOWN ISSUES
851 | None
852 |
853 | NOTES
854 | Any interesting aspect of the code in the package body which needs
855 | to be stated.
856 |
857 | MODIFICATION HISTORY
858 | Date Author Description of Changes
859 | 01-01-2004 scherkas Created
860 |
861 *=======================================================================*/
862 FUNCTION GET_RECEIVABLES_FUND_DESC(P_CC_ID number) RETURN VARCHAR2
863 IS
864
865 /*-----------------------------------------------------------------------+
866 | Local Variable Declarations and initializations |
867 +-----------------------------------------------------------------------*/
868
869 l_api_name CONSTANT VARCHAR2(30) := 'GET_RECEIVABLES_FUND_DESC';
870 l_description varchar2(240);
871
872 /*-----------------------------------------------------------------------+
873 | Cursor Declarations |
874 +-----------------------------------------------------------------------*/
875
876 /* query receivable fund description */
877 CURSOR rec_fund_desc_cur(P_ORG_ID number, P_CC_ID number) IS
878 SELECT
879 FVL.DESCRIPTION
880 FROM LNS_SYSTEM_OPTIONS LSO
881 ,gl_sets_of_books SB
882 ,FND_ID_FLEX_STRUCTURES_VL STR
883 ,FND_ID_FLEX_SEGMENTS_VL SEG
884 ,fnd_flex_value_sets FVS
885 ,FND_FLEX_VALUES_VL FVL
886 ,FND_SEGMENT_ATTRIBUTE_VALUES SAV
887 ,GL_CODE_COMBINATIONS GL
888 WHERE STR.APPLICATION_ID = 101 -- GENERAL LEDGER
889 and lso.set_of_books_id = sb.set_of_books_id
890 and sb.chart_of_accounts_id = STR.id_flex_num
891 and gl.chart_of_accounts_id = sb.chart_of_accounts_id
892 and SEG.FLEX_VALUE_SET_ID = FVS.FLEX_VALUE_SET_ID
893 and FVS.FLEX_VALUE_SET_ID = FVL.FLEX_VALUE_SET_ID
894 and str.id_flex_num = SEG.ID_FLEX_NUM
895 and STR.id_flex_num = sav.id_flex_num
896 and STR.ID_FLEX_CODE='GL#'
897 and seg.id_flex_code ='GL#'
898 and STR.enabled_flag = 'Y'
899 and LSO.org_id = P_ORG_ID
900 and gl.code_combination_id = P_CC_ID
901 and fvl.flex_value = (decode(sav.application_column_name,
902 'SEGMENT1', GL.segment1,
903 'SEGMENT2', GL.segment2,
904 'SEGMENT3', GL.segment3,
905 'SEGMENT4', GL.segment4,
906 'SEGMENT5', GL.segment5))
907 and (('' IS NULL) OR (structured_hierarchy_level IN
908 (SELECT h.hierarchy_id
909 FROM fnd_flex_hierarchies_vl h
910 WHERE h.flex_value_set_id = FVL.flex_value_set_id
911 AND h.hierarchy_name like '')))
912 and exists
913 ( SELECT 1
914 FROM FND_SEGMENT_ATTRIBUTE_TYPES T
915 WHERE T.APPLICATION_ID = SAV.APPLICATION_ID
916 AND T.ID_FLEX_CODE = SAV.ID_FLEX_CODE
917 AND T.SEGMENT_ATTRIBUTE_TYPE = SAV.SEGMENT_ATTRIBUTE_TYPE
918 AND GLOBAL_FLAG = 'N'
919 and SAV.ID_FLEX_CODE='GL#'
920 and SAV.APPLICATION_ID=101
921 and sav.segment_attribute_type = 'GL_BALANCING'
922 and attribute_value = 'Y'
923 );
924
925
926 BEGIN
927
928 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
929
930 l_description := null;
931
932 open rec_fund_desc_cur(g_org_id, P_CC_ID);
933 fetch rec_fund_desc_cur into l_description;
934 close rec_fund_desc_cur;
935
936 if l_description is not null then
937 l_description := ' - ' || l_description;
938 end if;
939
940 return l_description;
941
942 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
943
944 EXCEPTION
945 WHEN OTHERS THEN
946 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to get receivable fund description');
947 return l_description;
948
949 END;
950
951
952
953
954 /*========================================================================
955 | PRIVATE PROCEDURE CREATE_AR_INVOICES
956 |
957 | DESCRIPTION
958 | This procedure creates AR invoices.
959 |
960 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
961 | BILL_SINGLE_LOAN
962 | CREATE_SINGLE_OFFCYCLE_BILL
963 |
964 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
965 | LogMessage
966 |
967 | PARAMETERS
968 | P_LOAN_REC IN OUT NOCOPY Loan record
969 | P_LINES_TBL IN OUT NOCOPY Lines table
970 |
971 | KNOWN ISSUES
972 | None
973 |
974 | NOTES
975 | Any interesting aspect of the code in the package body which needs
976 | to be stated.
977 |
978 | MODIFICATION HISTORY
979 | Date Author Description of Changes
980 | 03-31-2006 karamach Revert the billing_date = due_date change in trx header since invoice api throws AR_TAPI_BFB_BILLING_DATE_INV error if billing_date is passed when bfb is disabled based on ar_bfb_utils_pvt.is_valid_billing_date
981 | 03-28-2006 karamach Pass the taxable_flag 'N' in trx line and billing_date = due_date in trx header for bug5124908
982 | 01-01-2004 scherkas Created
983 |
984 *=======================================================================*/
985 PROCEDURE CREATE_AR_INVOICES(P_LOAN_REC IN OUT NOCOPY LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC,
986 P_LINES_TBL IN OUT NOCOPY LNS_BILLING_BATCH_PUB.BILL_LINES_TBL)
987 IS
988
989 /*-----------------------------------------------------------------------+
990 | Local Variable Declarations and initializations |
991 +-----------------------------------------------------------------------*/
992
993 l_api_name CONSTANT VARCHAR2(30) := 'CREATE_AR_INVOICES';
994 l_return_status VARCHAR2(1);
995 l_msg_count NUMBER;
996 l_msg_data VARCHAR2(32767);
997 l_Count1 number;
998 l_Count2 number;
999 l_Count3 number;
1000 l_Count4 number;
1001 l_Count5 number;
1002 l_Count6 number;
1003 l_customer_trx_id number;
1004 l_trx_number VARCHAR2(20);
1005 l_customer_trx_line_id number;
1006 l_payment_schedule_id number;
1007 l_due_date date;
1008 l_batch_id number;
1009 l_line_type varchar2(30);
1010 l_amount number;
1011 l_id number;
1012 l_next_line varchar2(5);
1013 l_generate_trx_number varchar2(1);
1014 l_COPY_DOC_NUMBER_FLAG varchar2(1);
1015 l_AUTO_TRX_NUMBERING_FLAG varchar2(1);
1016 l_search_str varchar2(1);
1017 l_exit_loop varchar2(1);
1018 l_start_pos number;
1019 l_end_pos number;
1020 l_populate_dist varchar2(1);
1021 l_cc_id number;
1022 l_percent number;
1023 l_payment_order number;
1024 l_trx_header_id number;
1025 l_trx_line_id number;
1026 l_error_message varchar2(2000);
1027 l_invalid_value varchar2(2000);
1028 l_principal_trx_id number;
1029 l_interest_trx_id number;
1030 l_fee_trx_id number;
1031 l_prin_trx_type number;
1032 l_USSGL_TRANSACTION_CODE VARCHAR2(30);
1033 l_line_desc VARCHAR2(240);
1034 l_orig_line_amount number;
1035 l_split_flag varchar2(1);
1036 l_running_sum number;
1037 l_ar_error_counter number;
1038 l_fee_header number;
1039 l_fee_line_num number;
1040 l_site_use_id number;
1041 l_amortization_line_id number;
1042 l_precision number;
1043 l_ext_precision number;
1044 l_min_acct_unit number;
1045 l_org_status varchar2(1);
1046 l_org_id number;
1047 l_start date;
1048 l_end date;
1049 l_phase varchar2(10);
1050 l_int_header number;
1051 l_int_line_num number;
1052 l_bill_0_prin_inv varchar2(1);
1053 l_inv_comment varchar2(240);
1054 l_is_disable_bill varchar2(1);
1055 l_feeRec_exists varchar2(1);
1056 l_disb_hdr_id NUMBER;
1057 l_trx_date date;
1058 l_term_id number;
1059 l_ar_inv_created boolean;
1060 l_PRIMARY_SALESREP_ID number;
1061
1062 l_batch_source_rec ar_invoice_api_pub.batch_source_rec_type;
1063 l_trx_header_tbl ar_invoice_api_pub.trx_header_tbl_type;
1064 l_trx_lines_tbl ar_invoice_api_pub.trx_line_tbl_type;
1065 l_trx_dist_tbl ar_invoice_api_pub.trx_dist_tbl_type;
1066 l_trx_salescredits_tbl ar_invoice_api_pub.trx_salescredits_tbl_type;
1067 l_new_lines_tbl LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
1068
1069 /*-----------------------------------------------------------------------+
1070 | Cursor Declarations |
1071 +-----------------------------------------------------------------------*/
1072
1073 /* query of batch source attributes */
1074 CURSOR gen_trx_num_cur(P_SOURCE_ID number) IS
1075 select COPY_DOC_NUMBER_FLAG,
1076 AUTO_TRX_NUMBERING_FLAG
1077 FROM RA_BATCH_SOURCES
1078 where BATCH_SOURCE_ID = P_SOURCE_ID;
1079
1080 /* generate new trx number */
1081 CURSOR new_trx_num_cur IS
1082 select LNS_TRX_NUMBER_S.NEXTVAL
1083 from dual;
1084
1085 /* query of meaning of PAYMENT_APPLICATION_TYPE */
1086 CURSOR meaning_cur(P_LOOKUP_CODE varchar2) IS
1087 select meaning
1088 from LNS_LOOKUPS
1089 where lookup_type = 'PAYMENT_APPLICATION_TYPE' and
1090 lookup_code = P_LOOKUP_CODE;
1091
1092 /* query of distributions for principal dr */
1093 CURSOR prin_dr_dist_cur(P_LOAN_ID number) IS
1094 select CODE_COMBINATION_ID,
1095 DISTRIBUTION_PERCENT,
1096 USSGL_TRANSACTION_CODE
1097 from lns_distributions
1098 where LOAN_ID = P_LOAN_ID and
1099 account_type = 'DR' and
1100 account_name = 'PRINCIPAL_RECEIVABLE' and
1101 line_type = 'PRIN';
1102
1103 /* query of distributions for interest dr */
1104 CURSOR int_dr_dist_cur(P_LOAN_ID number) IS
1105 select CODE_COMBINATION_ID,
1106 DISTRIBUTION_PERCENT,
1107 USSGL_TRANSACTION_CODE
1108 from lns_distributions
1109 where LOAN_ID = P_LOAN_ID and
1110 account_type = 'DR' and
1111 account_name = 'INTEREST_RECEIVABLE' and
1112 line_type = 'INT' and
1113 activity is null;
1114
1115 /* query of distributions for fee dr */
1116 CURSOR cur_fee_dr_dist(c_loan_id NUMBER, c_fee_id NUMBER, c_disb_hdr_id NUMBER) IS
1117 select CODE_COMBINATION_ID,
1118 DISTRIBUTION_PERCENT,
1119 USSGL_TRANSACTION_CODE
1120 from lns_distributions
1121 where LOAN_ID = c_loan_id and
1122 fee_id = c_fee_id and
1123 -- The below code criteria retrieves though the disb_header_id is null for fees, which are not disbFees
1124 nvl(disb_header_id, -1) = nvl(c_disb_hdr_id, -1) and
1125 account_type = 'DR' and
1126 account_name = 'FEE_RECEIVABLE' and
1127 line_type = 'FEE';
1128
1129 /* query of distributions for fee dr based on loan
1130 This is used for existed disbFees(before fix bug#9054623), wihch doesn't contain FEE_RECEIVABLE for all fees.
1131 These existed disbFees contains one FEE_RECEIVABLE a/c for all fees per loan */
1132 CURSOR fee_dr_dist_cur(P_LOAN_ID number) IS
1133 select CODE_COMBINATION_ID,
1134 DISTRIBUTION_PERCENT,
1135 USSGL_TRANSACTION_CODE
1136 from lns_distributions
1137 where LOAN_ID = P_LOAN_ID and
1138 account_type = 'DR' and
1139 account_name = 'FEE_RECEIVABLE' and
1140 line_type = 'FEE';
1141
1142 /* query of distributions for principal cr */
1143 CURSOR prin_cr_dist_cur(P_LOAN_ID number, P_DATE date) IS
1144 select dist.CODE_COMBINATION_ID,
1145 sum(dist.DISTRIBUTION_PERCENT),
1146 dist.USSGL_TRANSACTION_CODE
1147 from lns_distributions dist
1148 where dist.LOAN_ID = P_LOAN_ID and
1149 dist.account_type = 'CR' and
1150 dist.account_name = 'LOAN_RECEIVABLE' and
1151 dist.line_type = 'PRIN' and
1152 nvl(dist.loan_line_id, -1) =
1153 nvl((select max(loan_line_id)
1154 from lns_loan_lines
1155 where status = 'APPROVED'
1156 and LOAN_ID = P_LOAN_ID
1157 and original_flag = 'N'
1158 and adjustment_date <= P_DATE), -1)
1159 group by dist.CODE_COMBINATION_ID, dist.USSGL_TRANSACTION_CODE;
1160
1161 /* query of distributions for interest cr */
1162 CURSOR int_cr_dist_cur(P_LOAN_ID number) IS
1163 select CODE_COMBINATION_ID,
1164 DISTRIBUTION_PERCENT,
1165 USSGL_TRANSACTION_CODE
1166 from lns_distributions
1167 where LOAN_ID = P_LOAN_ID and
1168 account_type = 'CR' and
1169 account_name = 'INTEREST_INCOME' and
1170 line_type = 'INT' and
1171 activity is null;
1172
1173 /* query of distributions for fee cr */
1174 CURSOR fee_cr_dist_cur(P_LOAN_ID number, P_FEE_ID number, C_DISB_HDR_ID number) IS
1175 select CODE_COMBINATION_ID,
1176 DISTRIBUTION_PERCENT,
1177 USSGL_TRANSACTION_CODE
1178 from lns_distributions
1179 where LOAN_ID = P_LOAN_ID and
1180 account_type = 'CR' and
1181 account_name = 'FEE_INCOME' and
1182 line_type = 'FEE' and
1183 fee_id = P_FEE_ID and
1184 nvl(disb_header_id, -1) = nvl(C_DISB_HDR_ID, -1);
1185
1186 /* query of AR errors */
1187 CURSOR ar_invoice_err_cur IS
1188 SELECT trx_header_id, trx_line_id, error_message, invalid_value
1189 from ar_trx_errors_gt;
1190
1191 /* query invoice details */
1192 CURSOR ar_invoices_cur(P_BATCH_ID number) IS
1193 select
1194 trx.customer_trx_id,
1195 trx.trx_number,
1196 lines.customer_trx_line_id,
1197 psa.payment_schedule_id,
1198 psa.due_date,
1199 lines.extended_amount,
1200 lines.INTERFACE_LINE_ATTRIBUTE5,
1201 lines.INTERFACE_LINE_ATTRIBUTE6
1202 from RA_CUSTOMER_TRX trx,
1203 RA_CUSTOMER_TRX_LINES lines,
1204 ar_payment_schedules_all psa
1205 where
1206 trx.batch_id = P_BATCH_ID
1207 and trx.customer_trx_id = lines.customer_trx_id
1208 and trx.customer_trx_id = psa.customer_trx_id(+) -- outer join is for case when invoice is created incomplete
1209 and lines.line_type = 'LINE'
1210 ORDER BY lines.customer_trx_line_id;
1211
1212 /* query trx_type_id */
1213 CURSOR trx_type_cur(P_LOAN_ID number) IS
1214 select REFERENCE_TYPE_ID
1215 from LNS_LOAN_HEADERS
1216 where loan_id = P_LOAN_ID;
1217
1218 /* query for site_use_id */
1219 CURSOR site_use_id_cur(P_SITE_ID number) IS
1220 select site_use_id, PRIMARY_SALESREP_ID
1221 from hz_cust_site_uses
1222 where cust_acct_site_id = P_SITE_ID
1223 and site_use_code = 'BILL_TO'
1224 and status = 'A';
1225
1226 CURSOR cur_get_disbHdr_id(c_fee_schd_id number) IS
1227 SELECT disb_header_id
1228 from lns_fee_schedules
1229 where fee_schedule_id =c_fee_schd_id;
1230
1231 BEGIN
1232 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
1233
1234 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Checking the Disable_billing_flag in '||l_api_name);
1235 l_is_disable_bill := IS_BILLING_DISABLED(P_LOAN_REC.LOAN_ID);
1236 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_is_disable_bill is '||l_is_disable_bill);
1237 IF l_is_disable_bill = 'Y' THEN
1238 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: BILLING is Disabled for the loan '||p_loan_rec.loan_number);
1239 FND_MESSAGE.SET_NAME('LNS', 'LNS_BILLING_DISABLED');
1240 FND_MESSAGE.SET_TOKEN('LOAN_NUMBER', p_loan_rec.loan_number);
1241 FND_MSG_PUB.Add;
1242 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1243 RAISE FND_API.G_EXC_ERROR;
1244 END IF;
1245
1246 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Preparing to call AR invoice api...');
1247
1248
1249 /* init variables */
1250 l_generate_trx_number := 'Y';
1251 l_COPY_DOC_NUMBER_FLAG := 'N';
1252 l_AUTO_TRX_NUMBERING_FLAG := 'N';
1253 l_search_str := '_';
1254 l_start_pos := 1;
1255 l_end_pos := 1;
1256
1257 l_batch_source_rec.batch_source_id := g_batch_source_id;
1258
1259 /* check if we need to generate trx_number */
1260 open gen_trx_num_cur(l_batch_source_rec.batch_source_id);
1261 fetch gen_trx_num_cur into l_COPY_DOC_NUMBER_FLAG, l_AUTO_TRX_NUMBERING_FLAG;
1262 close gen_trx_num_cur;
1263
1264 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_COPY_DOC_NUMBER_FLAG: ' || l_COPY_DOC_NUMBER_FLAG);
1265 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_AUTO_TRX_NUMBERING_FLAG: ' || l_AUTO_TRX_NUMBERING_FLAG);
1266
1267 if l_COPY_DOC_NUMBER_FLAG = 'Y' or l_AUTO_TRX_NUMBERING_FLAG = 'Y' then
1268 l_generate_trx_number := 'N';
1269 end if;
1270
1271 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_generate_trx_number: ' || l_generate_trx_number);
1272
1273 /* query trx_type_id */
1274 open trx_type_cur(P_LOAN_REC.LOAN_ID);
1275 fetch trx_type_cur into l_prin_trx_type;
1276 close trx_type_cur;
1277
1278 LogMessage(FND_LOG.LEVEL_STATEMENT, 'prin_trx_type: ' || l_prin_trx_type);
1279
1280 /* query for site_use_id */
1281 open site_use_id_cur(P_LOAN_REC.BILL_TO_ADDRESS_ID);
1282 fetch site_use_id_cur into l_site_use_id, l_PRIMARY_SALESREP_ID;
1283 close site_use_id_cur;
1284
1285 /* check exchange rate: if its User - pass exchange rate; otherwise - pass null */
1286 if P_LOAN_REC.EXCHANGE_RATE_TYPE is null or
1287 (P_LOAN_REC.EXCHANGE_RATE_TYPE is not null and P_LOAN_REC.EXCHANGE_RATE_TYPE <> 'User') then
1288
1289 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Setting exchange rate = null');
1290 P_LOAN_REC.EXCHANGE_RATE := null;
1291
1292 end if;
1293
1294 -- setting phase for invoice reference
1295 if P_LOAN_REC.CURRENT_PHASE = 'OPEN' then
1296 l_phase := 'Disb';
1297 else
1298 l_phase := 'Term';
1299 end if;
1300
1301 -- fix for bug 5840180: get LNS_CREATE_ZERO_PRIN_INV profile value to see if we need to bill 0 amount principal invoices
1302 l_bill_0_prin_inv := NVL(FND_PROFILE.VALUE('LNS_CREATE_ZERO_PRIN_INV'), 'N');
1303 LogMessage(FND_LOG.LEVEL_STATEMENT, 'The profile LNS_CREATE_ZERO_PRIN_INV value is : '||l_bill_0_prin_inv);
1304
1305 select LNS_AMORTIZATION_SCHEDS_S.NEXTVAL into P_LOAN_REC.NEXT_AMORTIZATION_ID from dual;
1306
1307 l_Count1 := 0; -- lines counter
1308 l_Count2 := 0; -- distributions counter
1309 l_Count3 := 0; -- header counter
1310 l_Count6 := 0; -- returned lines table
1311 l_fee_header := -1;
1312 l_int_header := -1;
1313 l_exit_loop := 'N';
1314 l_end_pos := instr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_search_str, l_start_pos, 1);
1315 l_inv_comment := substr(P_LOAN_REC.LOAN_DESCRIPTION, 1, 240);
1316
1317 LNS_BILLING_UTIL_PUB.GET_TRX_DATE(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
1318 P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
1319 X_TRX_DATE => l_trx_date,
1320 X_RA_TERM_ID => l_term_id);
1321
1322 while true loop
1323
1324 if l_end_pos <> 0 then
1325 l_next_line := substr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_start_pos, l_end_pos-l_start_pos);
1326 else
1327 l_next_line := substr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_start_pos,
1328 LENGTH(P_LOAN_REC.PAYMENT_APPLICATION_ORDER)-l_start_pos+1);
1329 l_exit_loop := 'Y';
1330 end if;
1331
1332 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_next_line: ' || l_next_line);
1333
1334 FOR l_Count4 IN 1..P_LINES_TBL.COUNT LOOP
1335
1336 if P_LINES_TBL(l_Count4).LINE_TYPE = l_next_line and
1337 P_LINES_TBL(l_Count4).LINE_AMOUNT is not null and
1338 P_LINES_TBL(l_Count4).PAYMENT_ORDER is null and
1339 (P_LINES_TBL(l_Count4).LINE_AMOUNT <> 0 or
1340 (P_LINES_TBL(l_Count4).LINE_AMOUNT = 0 and P_LINES_TBL(l_Count4).LINE_TYPE = 'PRIN' and l_bill_0_prin_inv = 'Y')) --fix for bug 5840180
1341
1342 then
1343
1344 l_Count1 := l_Count1 + 1; -- lines
1345
1346 if ((g_multiple_lines = 'Y' and l_Count3 = 0) or
1347 -- (g_multiple_lines = 'N' and (l_next_line = 'PRIN' or l_next_line = 'INT')) or
1348 (g_multiple_lines = 'N' and l_next_line = 'PRIN') or
1349 (g_multiple_lines = 'N' and l_next_line = 'INT' and l_int_header = -1) or
1350 (g_multiple_lines = 'N' and l_next_line = 'FEE' and l_fee_header = -1))
1351 then
1352 l_Count3 := l_Count3 + 1; -- header
1353 end if;
1354
1355 /* populate line description */
1356 open meaning_cur(l_next_line);
1357 fetch meaning_cur into l_line_desc;
1358 close meaning_cur;
1359
1360 if P_LINES_TBL(l_Count4).LINE_DESC is not null then
1361 l_trx_lines_tbl(l_Count1).description := l_line_desc || ' - ' || P_LINES_TBL(l_Count4).LINE_DESC;
1362 else
1363 l_trx_lines_tbl(l_Count1).description := l_line_desc;
1364 end if;
1365
1366 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Line ' || l_Count1 || ' - ' || l_trx_lines_tbl(l_Count1).description);
1367
1368 if g_multiple_lines = 'Y' then
1369
1370 if l_Count3 = 1 then
1371
1372 if l_generate_trx_number = 'Y' then
1373 /*
1374 -- generate new id for new AR invoice_number
1375 open new_trx_num_cur;
1376 fetch new_trx_num_cur into l_id;
1377 close new_trx_num_cur;
1378
1379 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1380 */
1381 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1382
1383 end if;
1384
1385 /* populate header info */
1386 l_trx_header_tbl(l_Count3).comments := l_inv_comment;
1387 l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1388 l_trx_header_tbl(l_Count3).trx_date := l_trx_date;
1389 --l_trx_header_tbl(l_Count3).trx_date := trunc(P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1390 --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1391 l_trx_header_tbl(l_Count3).gl_date := l_trx_header_tbl(l_Count3).trx_date + g_day_togl_after_dd;
1392 l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1393 l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1394 l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1395 l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1396 l_trx_header_tbl(l_Count3).cust_trx_type_id := nvl(l_prin_trx_type, g_trx_type_id);
1397 l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1398 l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1399 l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1400 l_trx_header_tbl(l_Count3).primary_salesrep_id := l_PRIMARY_SALESREP_ID;
1401 l_trx_header_tbl(l_Count3).term_id := l_term_id; --5; --always IMMEDIATE
1402 l_trx_header_tbl(l_Count3).finance_charges := 'N';
1403 l_trx_header_tbl(l_Count3).status_trx := 'OP';
1404 l_trx_header_tbl(l_Count3).printing_option := null; -- fix for bug 7714411
1405 l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1406 l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1407 l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1408 l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1409
1410 if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1411 l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1412 end if;
1413
1414 end if;
1415
1416 l_trx_lines_tbl(l_Count1).line_number := l_Count1;
1417 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1418
1419 else
1420
1421 -- if l_next_line = 'PRIN' or l_next_line = 'INT' then
1422 if l_next_line = 'PRIN' then
1423
1424 if l_generate_trx_number = 'Y' then
1425 /*
1426 -- generate new id for new AR invoice_number
1427 open new_trx_num_cur;
1428 fetch new_trx_num_cur into l_id;
1429 close new_trx_num_cur;
1430
1431 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1432 */
1433 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1434
1435 end if;
1436
1437 /* populate rest of header info */
1438 l_trx_header_tbl(l_Count3).comments := l_inv_comment;
1439 l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1440 l_trx_header_tbl(l_Count3).trx_date := l_trx_date;
1441 --l_trx_header_tbl(l_Count3).trx_date := trunc(P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1442 --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1443 l_trx_header_tbl(l_Count3).gl_date := l_trx_header_tbl(l_Count3).trx_date + g_day_togl_after_dd;
1444 l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1445 l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1446 l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1447 l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1448 l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1449 l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1450 l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1451 l_trx_header_tbl(l_Count3).primary_salesrep_id := l_PRIMARY_SALESREP_ID;
1452 l_trx_header_tbl(l_Count3).term_id := l_term_id; --5; --always IMMEDIATE
1453 l_trx_header_tbl(l_Count3).finance_charges := 'N';
1454 l_trx_header_tbl(l_Count3).status_trx := 'OP';
1455 l_trx_header_tbl(l_Count3).printing_option := null; -- fix for bug 7714411
1456 l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1457 l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1458 l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1459 l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1460
1461 if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1462 l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1463 end if;
1464
1465 -- set trx_type_id
1466 l_trx_header_tbl(l_Count3).cust_trx_type_id := nvl(l_prin_trx_type, g_trx_type_id);
1467 l_trx_lines_tbl(l_Count1).line_number := 1;
1468 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1469
1470 elsif l_next_line = 'INT' then
1471
1472 if l_int_header = -1 then
1473
1474 if l_generate_trx_number = 'Y' then
1475 /*
1476 -- generate new id for new AR invoice_number
1477 open new_trx_num_cur;
1478 fetch new_trx_num_cur into l_id;
1479 close new_trx_num_cur;
1480
1481 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1482 */
1483 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1484
1485 end if;
1486
1487 /* populate rest of header info */
1488 l_trx_header_tbl(l_Count3).comments := l_inv_comment;
1489 l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1490 l_trx_header_tbl(l_Count3).trx_date := l_trx_date;
1491 --l_trx_header_tbl(l_Count3).trx_date := trunc(P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1492 l_trx_header_tbl(l_Count3).gl_date := l_trx_header_tbl(l_Count3).trx_date + g_day_togl_after_dd;
1493 l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1494 l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1495 l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1496 l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1497 l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1498 l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1499 l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1500 l_trx_header_tbl(l_Count3).primary_salesrep_id := l_PRIMARY_SALESREP_ID;
1501 l_trx_header_tbl(l_Count3).term_id := l_term_id; --5; --always IMMEDIATE
1502 l_trx_header_tbl(l_Count3).finance_charges := 'N';
1503 l_trx_header_tbl(l_Count3).status_trx := 'OP';
1504 l_trx_header_tbl(l_Count3).printing_option := null; -- fix for bug 7714411
1505 l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1506 l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1507 l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1508 l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1509
1510 if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1511 l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1512 end if;
1513
1514 /* set trx_type_id */
1515
1516 if g_int_trx_type_id is null then
1517
1518 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Interest transaction type is not set.');
1519 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INT_TRX_TYPE_IN_SYS_OPT');
1520 FND_MSG_PUB.Add;
1521 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1522 RAISE FND_API.G_EXC_ERROR;
1523
1524 end if;
1525
1526 l_trx_header_tbl(l_Count3).cust_trx_type_id := g_int_trx_type_id;
1527 l_int_line_num := 1;
1528 l_trx_lines_tbl(l_Count1).line_number := l_int_line_num;
1529 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1530
1531 else
1532
1533 l_int_line_num := l_int_line_num + 1;
1534 l_trx_lines_tbl(l_Count1).line_number := l_int_line_num;
1535 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_int_header).trx_header_id;
1536
1537 end if;
1538
1539 elsif l_next_line = 'FEE' then
1540
1541 if l_fee_header = -1 then
1542
1543 if l_generate_trx_number = 'Y' then
1544 /*
1545 -- generate new id for new AR invoice_number
1546 open new_trx_num_cur;
1547 fetch new_trx_num_cur into l_id;
1548 close new_trx_num_cur;
1549
1550 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER || '-' || l_id;
1551 */
1552 l_trx_header_tbl(l_Count3).trx_number := P_LOAN_REC.LOAN_NUMBER;
1553
1554 end if;
1555
1556 /* populate rest of header info */
1557 l_trx_header_tbl(l_Count3).comments := l_inv_comment;
1558 l_trx_header_tbl(l_Count3).trx_header_id := 100 + l_Count3;
1559 l_trx_header_tbl(l_Count3).trx_date := l_trx_date;
1560 --l_trx_header_tbl(l_Count3).trx_date := trunc(P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1561 --l_trx_header_tbl(l_Count3).billing_date := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE; --karamach bug5124908
1562 l_trx_header_tbl(l_Count3).gl_date := l_trx_header_tbl(l_Count3).trx_date + g_day_togl_after_dd;
1563 l_trx_header_tbl(l_Count3).trx_currency := P_LOAN_REC.LOAN_CURRENCY;
1564 l_trx_header_tbl(l_Count3).exchange_rate_type := P_LOAN_REC.EXCHANGE_RATE_TYPE;
1565 l_trx_header_tbl(l_Count3).exchange_date := P_LOAN_REC.EXCHANGE_DATE;
1566 l_trx_header_tbl(l_Count3).exchange_rate := P_LOAN_REC.EXCHANGE_RATE;
1567 l_trx_header_tbl(l_Count3).bill_to_customer_id := P_LOAN_REC.CUST_ACCOUNT_ID;
1568 l_trx_header_tbl(l_Count3).bill_to_address_id := P_LOAN_REC.BILL_TO_ADDRESS_ID;
1569 l_trx_header_tbl(l_Count3).bill_to_site_use_id := l_site_use_id;
1570 l_trx_header_tbl(l_Count3).primary_salesrep_id := l_PRIMARY_SALESREP_ID;
1571 l_trx_header_tbl(l_Count3).term_id := l_term_id; --5; --always IMMEDIATE
1572 l_trx_header_tbl(l_Count3).finance_charges := 'N';
1573 l_trx_header_tbl(l_Count3).status_trx := 'OP';
1574 l_trx_header_tbl(l_Count3).printing_option := null; -- fix for bug 7714411
1575 l_trx_header_tbl(l_Count3).interface_header_attribute1 :=
1576 l_phase || ':Pay#' || P_LOAN_REC.NEXT_PAYMENT_NUMBER || ' ' || l_line_desc;
1577 l_trx_header_tbl(l_Count3).org_id := P_LOAN_REC.ORG_ID;
1578 l_trx_header_tbl(l_Count3).legal_entity_id := P_LOAN_REC.LEGAL_ENTITY_ID;
1579
1580 if P_LOAN_REC.PARENT_AMORTIZATION_ID is not null then
1581 l_trx_header_tbl(l_Count3).interface_header_attribute1 := l_trx_header_tbl(l_Count3).interface_header_attribute1 || '(M)';
1582 end if;
1583
1584 /* set trx_type_id */
1585 if g_fee_trx_type_id is null then
1586
1587 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Fee transaction type is not set.');
1588 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_FEE_TRX_TYPE_IN_SYS_OPT');
1589 FND_MSG_PUB.Add;
1590 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
1591 RAISE FND_API.G_EXC_ERROR;
1592
1593 end if;
1594
1595 l_trx_header_tbl(l_Count3).cust_trx_type_id := g_fee_trx_type_id;
1596 l_fee_line_num := 1;
1597 l_trx_lines_tbl(l_Count1).line_number := l_fee_line_num;
1598 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1599
1600 else
1601
1602 l_fee_line_num := l_fee_line_num + 1;
1603 l_trx_lines_tbl(l_Count1).line_number := l_fee_line_num;
1604 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_fee_header).trx_header_id;
1605
1606 end if;
1607
1608 end if;
1609
1610 end if;
1611
1612 /* populate rest of line info */
1613
1614 l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1615 l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1616 l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1617 l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1618 l_trx_lines_tbl(l_Count1).unit_selling_price := P_LINES_TBL(l_Count4).LINE_AMOUNT;
1619 l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1620 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1621 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1622 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1623 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1624 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1625 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1626 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1627
1628 /* populate new return lines table */
1629 l_Count6 := l_Count6 +1;
1630 l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1631 l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1632 l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1633 l_new_lines_tbl(l_Count6).LINE_AMOUNT := P_LINES_TBL(l_Count4).LINE_AMOUNT;
1634 l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1635 l_new_lines_tbl(l_Count6).LINE_DESC := P_LINES_TBL(l_Count4).LINE_DESC;
1636 l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1637 l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1638 l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1639 l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1640 l_new_lines_tbl(l_Count6).LINE_DETAILS := P_LINES_TBL(l_Count4).LINE_DETAILS;
1641
1642 P_LINES_TBL(l_Count4).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1643
1644 if l_next_line = 'PRIN' then
1645
1646 /* query and populate distribution lines for principal dr */
1647 open prin_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1648
1649 fetch prin_dr_dist_cur into
1650 l_cc_id,
1651 l_percent,
1652 l_USSGL_TRANSACTION_CODE;
1653
1654 if prin_dr_dist_cur%FOUND then
1655
1656 l_Count2 := l_Count2 + 1;
1657 l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1658 l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1659 l_trx_dist_tbl(l_Count2).percent := l_percent;
1660 l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1661
1662 if g_multiple_lines = 'Y' then
1663 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1664 --l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1665 else
1666 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1667 --l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1668 end if;
1669
1670 end if;
1671 close prin_dr_dist_cur;
1672
1673 /* query and populate distribution lines for principal cr */
1674 open prin_cr_dist_cur(P_LOAN_REC.LOAN_ID, P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
1675
1676 l_Count5 := 0;
1677 l_split_flag := 'N';
1678 l_running_sum := 0;
1679 LOOP
1680
1681 fetch prin_cr_dist_cur into
1682 l_cc_id,
1683 l_percent,
1684 l_USSGL_TRANSACTION_CODE;
1685 exit when prin_cr_dist_cur%NOTFOUND;
1686
1687 l_Count5 := l_Count5 + 1;
1688 l_Count2 := l_Count2 + 1;
1689 l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1690 l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1691 l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1692 l_trx_dist_tbl(l_Count2).percent := l_percent;
1693 l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1694
1695 /* for each distribution create seperate trx line for current trx header */
1696
1697 if l_Count5 = 1 then
1698 l_orig_line_amount := l_trx_lines_tbl(l_Count1).unit_selling_price;
1699
1700 fnd_currency.GET_INFO(CURRENCY_CODE => P_LOAN_REC.LOAN_CURRENCY,
1701 PRECISION => l_precision,
1702 EXT_PRECISION => l_ext_precision,
1703 MIN_ACCT_UNIT => l_min_acct_unit);
1704
1705 else
1706
1707 l_split_flag := 'Y';
1708 l_Count1 := l_Count1 + 1;
1709 l_trx_lines_tbl(l_Count1).line_number := l_Count5;
1710 l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1711 l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1712 l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1713 l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1714 l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1715 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1716 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1717 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1718 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1719 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1720 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1721 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1722
1723 l_Count6 := l_Count6 +1;
1724 l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1725 l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1726 l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1727 l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1728 l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1729 l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1730 l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1731 l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1732
1733 if g_multiple_lines = 'Y' then
1734 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1735 else
1736 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1737 end if;
1738
1739 l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1740
1741 end if;
1742
1743 --l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1744 l_trx_lines_tbl(l_Count1).description := l_trx_lines_tbl(l_Count1).description || GET_RECEIVABLES_FUND_DESC(l_cc_id);
1745 l_trx_lines_tbl(l_Count1).unit_selling_price := round(l_orig_line_amount * l_trx_dist_tbl(l_Count2).percent / 100, l_precision);
1746 l_trx_dist_tbl(l_Count2).percent := 100;
1747 l_running_sum := l_running_sum + l_trx_lines_tbl(l_Count1).unit_selling_price;
1748
1749 l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1750 l_new_lines_tbl(l_Count6).LINE_DESC := l_trx_lines_tbl(l_Count1).description;
1751
1752 END LOOP;
1753
1754 if l_split_flag = 'Y' then
1755 l_trx_lines_tbl(l_Count1).unit_selling_price := l_orig_line_amount -
1756 (l_running_sum - l_trx_lines_tbl(l_Count1).unit_selling_price);
1757 l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1758 end if;
1759
1760 close prin_cr_dist_cur;
1761
1762 elsif l_next_line = 'INT' then
1763
1764 if l_int_header = -1 then
1765 /* query and populate distribution lines for interest dr */
1766 open int_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1767
1768 fetch int_dr_dist_cur into
1769 l_cc_id,
1770 l_percent,
1771 l_USSGL_TRANSACTION_CODE;
1772
1773 if int_dr_dist_cur%FOUND then
1774
1775 l_Count2 := l_Count2 + 1;
1776 l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1777 l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1778 l_trx_dist_tbl(l_Count2).percent := l_percent;
1779 l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1780
1781 if g_multiple_lines = 'Y' then
1782 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1783 --l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1784 else
1785 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1786 --l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1787 end if;
1788
1789 end if;
1790 close int_dr_dist_cur;
1791 end if;
1792
1793 /* query and populate distribution lines for interest cr */
1794 open int_cr_dist_cur(P_LOAN_REC.LOAN_ID);
1795
1796 l_Count5 := 0;
1797 l_split_flag := 'N';
1798 l_running_sum := 0;
1799 LOOP
1800
1801 fetch int_cr_dist_cur into
1802 l_cc_id,
1803 l_percent,
1804 l_USSGL_TRANSACTION_CODE;
1805 exit when int_cr_dist_cur%NOTFOUND;
1806
1807 l_Count5 := l_Count5 + 1;
1808 l_Count2 := l_Count2 + 1;
1809 l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1810 l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1811 l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1812 l_trx_dist_tbl(l_Count2).percent := l_percent;
1813 l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1814
1815 /* for each distribution create seperate trx line for current trx header */
1816
1817 if l_Count5 = 1 then
1818 l_orig_line_amount := l_trx_lines_tbl(l_Count1).unit_selling_price;
1819
1820 fnd_currency.GET_INFO(CURRENCY_CODE => P_LOAN_REC.LOAN_CURRENCY,
1821 PRECISION => l_precision,
1822 EXT_PRECISION => l_ext_precision,
1823 MIN_ACCT_UNIT => l_min_acct_unit);
1824
1825 else
1826
1827 l_split_flag := 'Y';
1828 l_Count1 := l_Count1 + 1;
1829 l_trx_lines_tbl(l_Count1).line_number := l_Count5;
1830 l_trx_lines_tbl(l_Count1).trx_line_id := 100 + l_Count1;
1831 l_trx_lines_tbl(l_Count1).taxable_flag := 'N'; --karamach bug5124908
1832 l_trx_lines_tbl(l_Count1).quantity_invoiced := 1;
1833 l_trx_lines_tbl(l_Count1).line_type := 'LINE';
1834 l_trx_lines_tbl(l_Count1).interface_line_context := 'LOANS';
1835 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE1 := P_LOAN_REC.LOAN_ID;
1836 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE2 := P_LOAN_REC.NEXT_AMORTIZATION_ID;
1837 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE3 := P_LOAN_REC.NEXT_PAYMENT_NUMBER;
1838 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE4 := P_LOAN_REC.LOAN_NUMBER;
1839 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE5 := l_next_line;
1840 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6 := l_Count1;
1841 l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE7 := P_LOAN_REC.PARENT_AMORTIZATION_ID;
1842
1843 l_Count6 := l_Count6 +1;
1844 l_new_lines_tbl(l_Count6).HEADER_ID := P_LINES_TBL(l_Count4).HEADER_ID;
1845 l_new_lines_tbl(l_Count6).LINE_ID := P_LINES_TBL(l_Count4).LINE_ID;
1846 l_new_lines_tbl(l_Count6).LINE_REF_ID := P_LINES_TBL(l_Count4).LINE_REF_ID;
1847 l_new_lines_tbl(l_Count6).LINE_TYPE := P_LINES_TBL(l_Count4).LINE_TYPE;
1848 l_new_lines_tbl(l_Count6).CASH_RECEIPT_ID := P_LINES_TBL(l_Count4).CASH_RECEIPT_ID;
1849 l_new_lines_tbl(l_Count6).APPLY_AMOUNT := P_LINES_TBL(l_Count4).APPLY_AMOUNT;
1850 l_new_lines_tbl(l_Count6).PAYMENT_ORDER := l_trx_lines_tbl(l_Count1).INTERFACE_LINE_ATTRIBUTE6;
1851 l_new_lines_tbl(l_Count6).FEE_SCHEDULE_ID := P_LINES_TBL(l_Count4).FEE_SCHEDULE_ID;
1852
1853 if g_multiple_lines = 'Y' then
1854 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1855 else
1856 l_trx_lines_tbl(l_Count1).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1857 end if;
1858
1859 l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1860
1861 end if;
1862
1863 --l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1864 l_trx_lines_tbl(l_Count1).description := l_trx_lines_tbl(l_Count1).description || GET_RECEIVABLES_FUND_DESC(l_cc_id);
1865 l_trx_lines_tbl(l_Count1).unit_selling_price := round(l_orig_line_amount * l_trx_dist_tbl(l_Count2).percent / 100, l_precision);
1866 l_trx_dist_tbl(l_Count2).percent := 100;
1867 l_running_sum := l_running_sum + l_trx_lines_tbl(l_Count1).unit_selling_price;
1868
1869 l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1870 l_new_lines_tbl(l_Count6).LINE_DESC := l_trx_lines_tbl(l_Count1).description;
1871
1872 END LOOP;
1873
1874 if l_split_flag = 'Y' then
1875 l_trx_lines_tbl(l_Count1).unit_selling_price := l_orig_line_amount -
1876 (l_running_sum - l_trx_lines_tbl(l_Count1).unit_selling_price);
1877 l_new_lines_tbl(l_Count6).LINE_AMOUNT := l_trx_lines_tbl(l_Count1).unit_selling_price;
1878 end if;
1879
1880 close int_cr_dist_cur;
1881
1882 if l_int_header = -1 then
1883 l_int_header := l_Count3;
1884 end if;
1885
1886 elsif l_next_line = 'FEE' then
1887
1888 if P_LINES_TBL(l_Count4).LINE_REF_ID is not null then
1889
1890 l_disb_hdr_id := null;
1891
1892 open cur_get_disbHdr_id(P_LINES_TBL(l_Count4).fee_schedule_id);
1893 fetch cur_get_disbHdr_id into l_disb_hdr_id;
1894 close cur_get_disbHdr_id;
1895 LogMessage(FND_LOG.LEVEL_STATEMENT, 'disb_header_id is '||l_disb_hdr_id||' for fee_schedule_id : '||P_LINES_TBL(l_Count4).fee_schedule_id);
1896
1897 if l_fee_header = -1 then
1898
1899 l_feeRec_exists := 'N';
1900 /* query and populate distribution lines for fee dr */
1901 open cur_fee_dr_dist(P_LOAN_REC.LOAN_ID, P_LINES_TBL(l_Count4).LINE_REF_ID, l_disb_hdr_id);
1902 fetch cur_fee_dr_dist into
1903 l_cc_id,
1904 l_percent,
1905 l_USSGL_TRANSACTION_CODE;
1906
1907 IF (cur_fee_dr_dist%NOTFOUND) THEN
1908
1909 /* Existed disbFees before fix of bug#9054263, contains only one FEE_RECEIVABLE
1910 for all fees in a loan */
1911 /* query and populate distribution lines for fee dr */
1912 open fee_dr_dist_cur(P_LOAN_REC.LOAN_ID);
1913
1914 fetch fee_dr_dist_cur into
1915 l_cc_id,
1916 l_percent,
1917 l_USSGL_TRANSACTION_CODE;
1918
1919 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Executed cursor fee_dr_dist_cur(for a LOAN)');
1920 if(fee_dr_dist_cur%FOUND) THEN
1921 l_feeRec_exists := 'Y';
1922 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Records found for cursor fee_dr_dist_cur(for a LOAN)');
1923 end if;
1924 close fee_dr_dist_cur;
1925 ELSE
1926 l_feeRec_exists := 'Y';
1927 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Records found for cursor cur_fee_dr_dist(for each fee)');
1928 end if;
1929
1930 if l_feeRec_exists = 'Y' then
1931
1932 l_Count2 := l_Count2 + 1;
1933 l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1934 l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1935 l_trx_dist_tbl(l_Count2).percent := l_percent;
1936 l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REC';
1937
1938 if g_multiple_lines = 'Y' then
1939 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(1).trx_header_id;
1940 --l_trx_header_tbl(1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1941 else
1942 l_trx_dist_tbl(l_Count2).trx_header_id := l_trx_header_tbl(l_Count3).trx_header_id;
1943 --l_trx_header_tbl(l_Count3).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1944 end if;
1945
1946 end if;
1947
1948 close cur_fee_dr_dist;
1949
1950 end if;
1951
1952 /* query and populate distribution lines for fee cr */
1953 open fee_cr_dist_cur(P_LOAN_REC.LOAN_ID, P_LINES_TBL(l_Count4).LINE_REF_ID, l_disb_hdr_id);
1954
1955 LOOP
1956
1957 fetch fee_cr_dist_cur into
1958 l_cc_id,
1959 l_percent,
1960 l_USSGL_TRANSACTION_CODE;
1961 exit when fee_cr_dist_cur%NOTFOUND;
1962
1963 l_Count2 := l_Count2 + 1;
1964 l_trx_dist_tbl(l_Count2).trx_dist_id := 100 + l_Count2;
1965 l_trx_dist_tbl(l_Count2).trx_line_id := l_trx_lines_tbl(l_Count1).trx_line_id;
1966 l_trx_dist_tbl(l_Count2).CODE_COMBINATION_ID := l_cc_id;
1967 l_trx_dist_tbl(l_Count2).percent := l_percent;
1968 l_trx_dist_tbl(l_Count2).ACCOUNT_CLASS := 'REV';
1969
1970 --l_trx_lines_tbl(l_Count1).default_ussgl_transaction_code := l_USSGL_TRANSACTION_CODE;
1971
1972 END LOOP;
1973
1974 close fee_cr_dist_cur;
1975
1976 end if;
1977
1978 if l_fee_header = -1 then
1979 l_fee_header := l_Count3;
1980 end if;
1981
1982 end if;
1983
1984 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will create invoice/line for ' || l_trx_lines_tbl(l_Count1).description || ' with amount ' || l_trx_lines_tbl(l_Count1).unit_selling_price);
1985
1986 end if;
1987
1988 END LOOP;
1989
1990 /* exit looping */
1991 if l_exit_loop = 'Y' then
1992 exit;
1993 end if;
1994
1995 l_start_pos := l_end_pos+1;
1996 l_end_pos := instr(P_LOAN_REC.PAYMENT_APPLICATION_ORDER, l_search_str, l_start_pos, 1);
1997
1998 end loop;
1999
2000 l_ar_inv_created := false;
2001 if l_trx_header_tbl.COUNT > 0 then
2002 -- fix for bug 7000066: returning without error if there are no data to create invoices
2003 --LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'WARNING: No data available to create invoices. Returning.');
2004 --return;
2005 /*
2006 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No data to create invoices.');
2007 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_DATA_CR_INV');
2008 FND_MSG_PUB.Add;
2009 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2010 RAISE FND_API.G_EXC_ERROR;
2011 */
2012
2013 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Creating AR invoices with following values:');
2014 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_batch_source_rec.batch_source_id: ' || l_batch_source_rec.batch_source_id);
2015
2016 FOR l_Count3 IN 1..l_trx_header_tbl.COUNT LOOP
2017
2018 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice header ' || l_Count3);
2019 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_header_tbl(l_Count3).trx_header_id);
2020 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_number: ' || l_trx_header_tbl(l_Count3).trx_number);
2021 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_date: ' || l_trx_header_tbl(l_Count3).trx_date);
2022 --LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').billing_date: ' || l_trx_header_tbl(l_Count3).billing_date);
2023 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').trx_currency: ' || l_trx_header_tbl(l_Count3).trx_currency);
2024 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_rate_type: ' || l_trx_header_tbl(l_Count3).exchange_rate_type);
2025 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_date: ' || l_trx_header_tbl(l_Count3).exchange_date);
2026 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').exchange_rate: ' || l_trx_header_tbl(l_Count3).exchange_rate);
2027 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').cust_trx_type_id: ' || l_trx_header_tbl(l_Count3).cust_trx_type_id);
2028 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').bill_to_customer_id: ' || l_trx_header_tbl(l_Count3).bill_to_customer_id);
2029 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').bill_to_address_id: ' || l_trx_header_tbl(l_Count3).bill_to_address_id);
2030 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').bill_to_site_use_id: ' || l_trx_header_tbl(l_Count3).bill_to_site_use_id);
2031 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').primary_salesrep_id: ' || l_trx_header_tbl(l_Count3).primary_salesrep_id);
2032 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').term_id: ' || l_trx_header_tbl(l_Count3).term_id);
2033 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').finance_charges: ' || l_trx_header_tbl(l_Count3).finance_charges);
2034 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').status_trx: ' || l_trx_header_tbl(l_Count3).status_trx);
2035 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').printing_option: ' || l_trx_header_tbl(l_Count3).printing_option);
2036 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').interface_header_attribute1: ' || l_trx_header_tbl(l_Count3).interface_header_attribute1);
2037 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').default_ussgl_transaction_code: ' || l_trx_header_tbl(l_Count3).default_ussgl_transaction_code);
2038 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').org_id: ' || l_trx_header_tbl(l_Count3).org_id);
2039 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').legal_entity_id: ' || l_trx_header_tbl(l_Count3).legal_entity_id);
2040
2041 -- fix for bug 8859462
2042 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE...');
2043 LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
2044 p_gl_date => l_trx_header_tbl(l_Count3).gl_date,
2045 p_trx_date => l_trx_header_tbl(l_Count3).trx_date,
2046 p_set_of_books_id => g_set_of_books_id,
2047 x_default_gl_date => l_trx_header_tbl(l_Count3).gl_date);
2048 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_header_tbl(' || l_Count3 || ').gl_date: ' || l_trx_header_tbl(l_Count3).gl_date);
2049
2050 END LOOP;
2051
2052 FOR l_Count3 IN 1..l_trx_lines_tbl.COUNT LOOP
2053
2054 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice line ' || l_Count3);
2055 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').trx_line_id: ' || l_trx_lines_tbl(l_Count3).trx_line_id);
2056 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_lines_tbl(l_Count3).trx_header_id);
2057 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').line_number: ' || l_trx_lines_tbl(l_Count3).line_number);
2058 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').description: ' || l_trx_lines_tbl(l_Count3).description);
2059 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').quantity_invoiced: ' || l_trx_lines_tbl(l_Count3).quantity_invoiced);
2060 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').unit_selling_price: ' || l_trx_lines_tbl(l_Count3).unit_selling_price);
2061 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').line_type: ' || l_trx_lines_tbl(l_Count3).line_type);
2062 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').interface_line_context: ' || l_trx_lines_tbl(l_Count3).interface_line_context);
2063 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE1: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE1);
2064 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE2: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE2);
2065 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE3: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE3);
2066 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE4: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE4);
2067 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE5: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE5);
2068 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE6: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE6);
2069 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').INTERFACE_LINE_ATTRIBUTE7: ' || l_trx_lines_tbl(l_Count3).INTERFACE_LINE_ATTRIBUTE7);
2070 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_lines_tbl(' || l_Count3 || ').default_ussgl_transaction_code: ' || l_trx_lines_tbl(l_Count3).default_ussgl_transaction_code);
2071
2072 END LOOP;
2073
2074 FOR l_Count3 IN 1..l_trx_dist_tbl.COUNT LOOP
2075
2076 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Distribution ' || l_Count3);
2077 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_dist_id: ' || l_trx_dist_tbl(l_Count3).trx_dist_id);
2078 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_header_id: ' || l_trx_dist_tbl(l_Count3).trx_header_id);
2079 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').trx_line_id: ' || l_trx_dist_tbl(l_Count3).trx_line_id);
2080 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').ACCOUNT_CLASS: ' || l_trx_dist_tbl(l_Count3).ACCOUNT_CLASS);
2081 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').percent: ' || l_trx_dist_tbl(l_Count3).percent);
2082 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_dist_tbl(' || l_Count3 || ').CODE_COMBINATION_ID: ' || l_trx_dist_tbl(l_Count3).CODE_COMBINATION_ID);
2083
2084 END LOOP;
2085
2086 -- fnd_global.apps_initialize(FND_GLOBAL.USER_ID, FND_GLOBAL.RESP_ID, FND_GLOBAL.RESP_APPL_ID, FND_GLOBAL.SECURITY_GROUP_ID);
2087
2088 l_batch_id := null;
2089 ar_invoice_api_pub.g_api_outputs.batch_id := null;
2090
2091 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Org info just before call to invoice api');
2092 l_org_id := MO_GLOBAL.GET_CURRENT_ORG_ID();
2093 LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.GET_CURRENT_ORG_ID(): ' || l_org_id);
2094 l_org_status := MO_GLOBAL.check_valid_org(g_org_id);
2095 LogMessage(FND_LOG.LEVEL_STATEMENT, 'MO_GLOBAL.check_valid_org(' || g_org_id || '): ' || l_org_status);
2096
2097 BEGIN
2098
2099 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Calling AR_INVOICE_API_PUB.CREATE_INVOICE...');
2100 l_start := sysdate;
2101 AR_INVOICE_API_PUB.CREATE_INVOICE(
2102 p_api_version => 1.0,
2103 p_init_msg_list => FND_API.G_TRUE,
2104 p_commit => FND_API.G_FALSE,
2105 p_batch_source_rec => l_batch_source_rec,
2106 p_trx_header_tbl => l_trx_header_tbl,
2107 p_trx_lines_tbl => l_trx_lines_tbl,
2108 p_trx_dist_tbl => l_trx_dist_tbl,
2109 p_trx_salescredits_tbl => l_trx_salescredits_tbl,
2110 x_return_status => l_return_status,
2111 x_msg_count => l_msg_count,
2112 x_msg_data => l_msg_data);
2113
2114 EXCEPTION
2115 WHEN OTHERS THEN
2116
2117 l_end := sysdate;
2118 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Invoice API timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
2119 LogMessage(FND_LOG.LEVEL_ERROR, 'Invoice API throws exception!');
2120
2121 /* query AR errors */
2122 l_ar_error_counter := 0;
2123 open ar_invoice_err_cur;
2124
2125 LOOP
2126
2127 fetch ar_invoice_err_cur into
2128 l_trx_header_id,
2129 l_trx_line_id,
2130 l_error_message,
2131 l_invalid_value;
2132 exit when ar_invoice_err_cur%NOTFOUND;
2133
2134 l_ar_error_counter := l_ar_error_counter + 1;
2135
2136 if l_ar_error_counter = 1 then
2137 FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_FAIL');
2138 FND_MESSAGE.SET_TOKEN('MSG', l_msg_data);
2139 FND_MSG_PUB.Add;
2140 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2141 end if;
2142
2143 FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_ERROR');
2144 FND_MESSAGE.SET_TOKEN('ERR', l_error_message);
2145 FND_MESSAGE.SET_TOKEN('VALUE', l_invalid_value);
2146 FND_MESSAGE.SET_TOKEN('HEADER', l_trx_header_id);
2147 FND_MESSAGE.SET_TOKEN('LINE', l_trx_line_id);
2148 FND_MSG_PUB.Add;
2149 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2150
2151 END LOOP;
2152
2153 close ar_invoice_err_cur;
2154
2155 if l_ar_error_counter = 0 then
2156 LogMessage(FND_LOG.LEVEL_ERROR, 'No AR errors found.');
2157 end if;
2158
2159 RAISE FND_API.G_EXC_ERROR;
2160 END;
2161
2162 l_end := sysdate;
2163 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Invoice API timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
2164
2165 l_batch_id := ar_invoice_api_pub.g_api_outputs.batch_id;
2166
2167 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2168 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2169 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_batch_id: ' || l_batch_id);
2170
2171 l_ar_error_counter := 0;
2172 IF l_return_status = fnd_api.g_ret_sts_error OR l_return_status = fnd_api.g_ret_sts_unexp_error OR l_batch_id is null THEN
2173
2174 l_ar_error_counter := 1;
2175 FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_FAIL');
2176 FND_MESSAGE.SET_TOKEN('MSG', l_msg_data);
2177 FND_MSG_PUB.Add;
2178 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2179
2180 END IF;
2181
2182 /* query AR errors */
2183 open ar_invoice_err_cur;
2184
2185 LOOP
2186
2187 fetch ar_invoice_err_cur into
2188 l_trx_header_id,
2189 l_trx_line_id,
2190 l_error_message,
2191 l_invalid_value;
2192 exit when ar_invoice_err_cur%NOTFOUND;
2193
2194 l_ar_error_counter := l_ar_error_counter + 1;
2195 FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_INV_ERROR');
2196 FND_MESSAGE.SET_TOKEN('ERR', l_error_message);
2197 FND_MESSAGE.SET_TOKEN('VALUE', l_invalid_value);
2198 FND_MESSAGE.SET_TOKEN('HEADER', l_trx_header_id);
2199 FND_MESSAGE.SET_TOKEN('LINE', l_trx_line_id);
2200 FND_MSG_PUB.Add;
2201 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2202
2203 END LOOP;
2204
2205 close ar_invoice_err_cur;
2206
2207 if l_ar_error_counter > 0 then
2208 RAISE FND_API.G_EXC_ERROR;
2209 else
2210 l_ar_inv_created := true;
2211 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoices successfully created!') ;
2212 end if;
2213
2214 end if;
2215
2216 /* inserting record into LNS_AMORTIZATION_SCHEDS */
2217 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Inserting new record into LNS_AMORTIZATION_SCHEDS w following values:');
2218 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_LOAN_REC.LOAN_ID);
2219 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || P_LOAN_REC.NEXT_PAYMENT_NUMBER);
2220 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
2221 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LATE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_LATE_DATE);
2222 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT);
2223 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || P_LOAN_REC.NEXT_INTEREST_AMOUNT);
2224 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || P_LOAN_REC.NEXT_FEE_AMOUNT);
2225 LogMessage(FND_LOG.LEVEL_STATEMENT, 'RATE_ID: ' || P_LOAN_REC.RATE_ID);
2226 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PARENT_AMORTIZATION_ID: ' || P_LOAN_REC.PARENT_AMORTIZATION_ID);
2227 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_BALANCE: ' || P_LOAN_REC.PRINCIPAL_BALANCE);
2228 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PHASE: ' || P_LOAN_REC.CURRENT_PHASE);
2229 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || P_LOAN_REC.FUNDED_AMOUNT);
2230 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DEFERRED_INT_AMOUNT: ' || P_LOAN_REC.DEFERRED_INT_AMOUNT);
2231 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURR_CAP_INT_AMOUNT: ' || P_LOAN_REC.CURR_CAP_INT_AMOUNT);
2232 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CAP_INT_AMOUNT: ' || P_LOAN_REC.CAP_INT_AMOUNT);
2233
2234 LNS_AMORTIZATION_SCHEDS_PKG.Insert_Row(
2235 X_AMORTIZATION_SCHEDULE_ID => P_LOAN_REC.NEXT_AMORTIZATION_ID
2236 ,P_LOAN_ID => P_LOAN_REC.LOAN_ID
2237 ,P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER
2238 ,P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE
2239 ,P_LATE_DATE => P_LOAN_REC.NEXT_PAYMENT_LATE_DATE
2240 ,P_PRINCIPAL_AMOUNT => P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT
2241 ,P_INTEREST_AMOUNT => P_LOAN_REC.NEXT_INTEREST_AMOUNT
2242 ,P_FEE_AMOUNT => P_LOAN_REC.NEXT_FEE_AMOUNT
2243 ,P_REVERSED_FLAG => 'N'
2244 ,P_RATE_ID => P_LOAN_REC.RATE_ID
2245 ,P_OBJECT_VERSION_NUMBER => 1
2246 ,P_PARENT_AMORTIZATION_ID => P_LOAN_REC.PARENT_AMORTIZATION_ID
2247 ,P_PRINCIPAL_BALANCE => P_LOAN_REC.PRINCIPAL_BALANCE
2248 ,P_PHASE => P_LOAN_REC.CURRENT_PHASE
2249 ,P_FUNDED_AMOUNT => P_LOAN_REC.FUNDED_AMOUNT
2250 ,P_DEFERRED_INT_AMOUNT => P_LOAN_REC.DEFERRED_INT_AMOUNT
2251 ,P_CURR_CAP_INT_AMOUNT => P_LOAN_REC.CURR_CAP_INT_AMOUNT
2252 ,P_CAP_INT_AMOUNT => P_LOAN_REC.CAP_INT_AMOUNT);
2253
2254 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_SCHEDULE_ID: ' || P_LOAN_REC.NEXT_AMORTIZATION_ID);
2255 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully inserted record into LNS_AMORTIZATION_SCHEDS');
2256
2257 if l_ar_inv_created = true then
2258
2259 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fetching inserted ar invoice details...');
2260
2261 /* query for cust_trx_id(s) and payment_schedule_id(s) */
2262 open ar_invoices_cur(l_batch_id);
2263
2264 l_Count2 := 0; -- counter
2265
2266 LOOP
2267
2268 fetch ar_invoices_cur into
2269 l_customer_trx_id,
2270 l_trx_number,
2271 l_customer_trx_line_id,
2272 l_payment_schedule_id,
2273 l_due_date,
2274 l_amount,
2275 l_line_type,
2276 l_payment_order;
2277 exit when ar_invoices_cur%NOTFOUND;
2278
2279 l_Count2 := l_Count2+1;
2280 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Trx ' || l_Count2 ||'; trx_number: ' || l_trx_number);
2281 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_ID: ' || l_customer_trx_id);
2282 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_LINE_ID: ' || l_customer_trx_line_id);
2283 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || l_payment_schedule_id);
2284 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_due_date);
2285 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMOUNT: ' || l_amount);
2286 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_line_type);
2287 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_ORDER: ' || l_payment_order);
2288
2289 if l_payment_schedule_id is null then
2290 LogMessage(FND_LOG.LEVEL_ERROR, 'WARNING: Invoice ' || l_trx_number || '(id ' || l_customer_trx_id || ') ' || l_line_type || ' is incomplete!');
2291 end if;
2292
2293 if l_line_type = 'PRIN' then
2294 l_principal_trx_id := l_customer_trx_id;
2295 elsif l_line_type = 'INT' then
2296 l_interest_trx_id := l_customer_trx_id;
2297 elsif l_line_type = 'FEE' then
2298 l_fee_trx_id := l_customer_trx_id;
2299 end if;
2300
2301 /* search right record in l_new_lines_tbl table and set AR info */
2302 FOR l_Count3 IN 1..l_new_lines_tbl.COUNT LOOP
2303
2304 if l_line_type = l_new_lines_tbl(l_Count3).LINE_TYPE and l_payment_order = l_new_lines_tbl(l_Count3).PAYMENT_ORDER then
2305
2306 l_new_lines_tbl(l_Count3).CUSTOMER_TRX_ID := l_customer_trx_id;
2307 l_new_lines_tbl(l_Count3).PAYMENT_SCHEDULE_ID := l_payment_schedule_id;
2308 l_new_lines_tbl(l_Count3).CUSTOMER_TRX_LINE_ID := l_customer_trx_line_id;
2309
2310 /* inserting new record into LNS_AMORTIZATION_LINES */
2311 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Inserting new record into LNS_AMORTIZATION_LINES w following values:');
2312 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_SCHEDULE_ID: ' || P_LOAN_REC.NEXT_AMORTIZATION_ID);
2313 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_LOAN_REC.LOAN_ID);
2314 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_line_type);
2315 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMOUNT: ' || l_amount);
2316 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_ID: ' || l_customer_trx_id);
2317 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_LINE_ID: ' || l_customer_trx_line_id);
2318 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_ID: ' || l_new_lines_tbl(l_Count3).LINE_REF_ID);
2319 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_SCHEDULE_ID: ' || l_new_lines_tbl(l_Count3).FEE_SCHEDULE_ID);
2320
2321 l_amortization_line_id := null;
2322 LNS_AMORTIZATION_LINES_PKG.Insert_Row(
2323 X_AMORTIZATION_LINE_ID => l_amortization_line_id
2324 ,P_AMORTIZATION_SCHEDULE_ID => P_LOAN_REC.NEXT_AMORTIZATION_ID
2325 ,P_LOAN_ID => P_LOAN_REC.LOAN_ID
2326 ,P_LINE_TYPE => l_line_type
2327 ,P_AMOUNT => l_amount
2328 ,P_CUST_TRX_ID => l_customer_trx_id
2329 ,P_CUST_TRX_LINE_ID => l_customer_trx_line_id
2330 ,P_FEE_ID => l_new_lines_tbl(l_Count3).LINE_REF_ID
2331 ,P_OBJECT_VERSION_NUMBER => 1
2332 ,P_FEE_SCHEDULE_ID => l_new_lines_tbl(l_Count3).FEE_SCHEDULE_ID
2333 ,P_LINE_DETAILS => l_new_lines_tbl(l_Count3).LINE_DETAILS);
2334
2335 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_LINE_ID: ' || l_amortization_line_id);
2336 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully inserted record into LNS_AMORTIZATION_LINES');
2337
2338 exit;
2339
2340 end if;
2341
2342 END LOOP;
2343
2344 END LOOP;
2345
2346 close ar_invoices_cur;
2347
2348 if l_Count2 = 0 then
2349 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No AR invoices fetched');
2350 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INV_FETCHED');
2351 FND_MSG_PUB.Add;
2352 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2353 RAISE FND_API.G_EXC_ERROR;
2354 end if;
2355
2356 /* Update interest and fee trxs with principal_trx_id as RELATED_CUSTOMER_TRX_ID */
2357 if g_multiple_lines = 'N' and l_principal_trx_id is not null then
2358
2359 if l_interest_trx_id is not null then
2360
2361 update RA_CUSTOMER_TRX_ALL set RELATED_CUSTOMER_TRX_ID = l_principal_trx_id where CUSTOMER_TRX_ID = l_interest_trx_id;
2362
2363 if (sql%notfound) then
2364 -- LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Update RA_CUSTOMER_TRX_ALL with RELATED_CUSTOMER_TRX_ID failed');
2365 FND_MESSAGE.SET_NAME('LNS', 'LNS_RELATE_INV_FAIL');
2366 FND_MSG_PUB.Add;
2367 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2368 RAISE FND_API.G_EXC_ERROR;
2369 end if;
2370
2371 end if;
2372
2373 if l_fee_trx_id is not null then
2374
2375 update RA_CUSTOMER_TRX_ALL set RELATED_CUSTOMER_TRX_ID = l_principal_trx_id where CUSTOMER_TRX_ID = l_fee_trx_id;
2376
2377 if (sql%notfound) then
2378 -- LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Update RA_CUSTOMER_TRX_ALL with RELATED_CUSTOMER_TRX_ID failed');
2379 FND_MESSAGE.SET_NAME('LNS', 'LNS_RELATE_INV_FAIL');
2380 FND_MSG_PUB.Add;
2381 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2382 RAISE FND_API.G_EXC_ERROR;
2383 end if;
2384
2385 end if;
2386
2387 end if;
2388
2389 /* Update amortization table with new principal, interest and fee ids */
2390
2391 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_AMORTIZATION_SCHEDS with new trx ids:');
2392 LogMessage(FND_LOG.LEVEL_STATEMENT, 'principal_trx_id: ' || l_principal_trx_id);
2393 LogMessage(FND_LOG.LEVEL_STATEMENT, 'interest_trx_id: ' || l_interest_trx_id);
2394 LogMessage(FND_LOG.LEVEL_STATEMENT, 'fee_trx_id: ' || l_fee_trx_id);
2395
2396 LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
2397 P_AMORTIZATION_SCHEDULE_ID => P_LOAN_REC.NEXT_AMORTIZATION_ID
2398 ,P_PRINCIPAL_TRX_ID => l_principal_trx_id
2399 ,P_INTEREST_TRX_ID => l_interest_trx_id
2400 ,P_FEE_TRX_ID => l_fee_trx_id);
2401
2402 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
2403
2404 P_LINES_TBL := l_new_lines_tbl;
2405
2406 end if;
2407
2408 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2409 END;
2410
2411
2412
2413 /*========================================================================
2414 | PRIVATE PROCEDURE CREATE_AR_CM
2415 |
2416 | DESCRIPTION
2417 | This procedure creates AR credit memos.
2418 |
2419 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2420 | REVERSE_LAST_AMORTIZATION
2421 | REVERSE_OFFCYCLE_BILL
2422 |
2423 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2424 | LogMessage
2425 |
2426 | PARAMETERS
2427 | P_REVERSE_TBL IN OUT Table of records needs to be reversed
2428 |
2429 | KNOWN ISSUES
2430 | None
2431 |
2432 | NOTES
2433 | Any interesting aspect of the code in the package body which needs
2434 | to be stated.
2435 |
2436 | MODIFICATION HISTORY
2437 | Date Author Description of Changes
2438 | 01-01-2004 scherkas Created
2439 |
2440 *=======================================================================*/
2441 PROCEDURE CREATE_AR_CM(P_REVERSE_TBL IN OUT NOCOPY LNS_BILLING_BATCH_PUB.REVERSE_TBL)
2442 IS
2443
2444 /*-----------------------------------------------------------------------+
2445 | Local Variable Declarations and initializations |
2446 +-----------------------------------------------------------------------*/
2447
2448 l_api_name CONSTANT VARCHAR2(30) := 'CREATE_AR_CM';
2449 l_return_status VARCHAR2(1);
2450 l_msg_count NUMBER;
2451 l_msg_data VARCHAR2(2000);
2452 l_Count number;
2453 l_Count1 number;
2454 l_Count2 number;
2455 l_trx_found varchar2(1);
2456 l_request_id varchar2(50);
2457 l_batch_source_name VARCHAR2(50);
2458 l_cm_batch_source_name VARCHAR2(50);
2459 l_cm_batch_source_id number;
2460 l_Count4 number;
2461 l_LINE_CREDIT_FLAG varchar2(1);
2462 l_amount number;
2463
2464 l_trx_tbl DBMS_SQL.NUMBER_TABLE;
2465 l_cm_line_tbl AR_CREDIT_MEMO_API_PUB.Cm_Line_Tbl_Type_Cover%type;
2466
2467 /*-----------------------------------------------------------------------+
2468 | Cursor Declarations |
2469 +-----------------------------------------------------------------------*/
2470
2471 /* query for batch_source_name and cm_batch_source_id */
2472 CURSOR batch_source_cur(P_BATCH_SOURCE_ID number) IS
2473 select name, CREDIT_MEMO_BATCH_SOURCE_ID
2474 from RA_BATCH_SOURCES
2475 where batch_source_id = P_BATCH_SOURCE_ID;
2476
2477 /* query for cm_batch_source_name */
2478 CURSOR cm_batch_source_cur(P_BATCH_SOURCE_ID number) IS
2479 select name
2480 from RA_BATCH_SOURCES
2481 where batch_source_id = P_BATCH_SOURCE_ID;
2482
2483 BEGIN
2484 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2485
2486 init;
2487
2488 l_Count1 := 0;
2489 FOR l_Count IN 1..P_REVERSE_TBL.count LOOP
2490
2491 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Trx Line #' || l_Count);
2492 LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_NUMBER: ' || P_REVERSE_TBL(l_Count).TRX_NUMBER);
2493 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_ID: ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID);
2494 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || P_REVERSE_TBL(l_Count).PAYMENT_SCHEDULE_ID);
2495 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOMER_TRX_LINE_ID: ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_LINE_ID);
2496 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || P_REVERSE_TBL(l_Count).LINE_TYPE);
2497 LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_AMOUNT: ' || P_REVERSE_TBL(l_Count).TRX_AMOUNT);
2498 LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLIED_AMOUNT: ' || P_REVERSE_TBL(l_Count).APPLIED_AMOUNT);
2499 LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || P_REVERSE_TBL(l_Count).ORG_ID);
2500
2501 if P_REVERSE_TBL(l_Count).APPLIED_AMOUNT <> 0 then
2502
2503 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot reverse because there are some valid activities on trx.');
2504 FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_REV_BILL');
2505 FND_MSG_PUB.Add;
2506 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2507 RAISE FND_API.G_EXC_ERROR;
2508
2509 end if;
2510
2511 /* searching/adding trx(s) into unique trx table */
2512 l_trx_found := 'N';
2513
2514 FOR l_Count1 IN 1..l_trx_tbl.count LOOP
2515
2516 if l_trx_tbl(l_Count1) = P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID then
2517 l_trx_found := 'Y';
2518 exit;
2519 end if;
2520
2521 END LOOP;
2522
2523 if l_trx_found = 'N' then
2524
2525 l_Count1 := l_Count1 + 1;
2526 l_trx_tbl(l_Count1) := P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID;
2527 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added trx ' || P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID || ' into unique trx table');
2528
2529 end if;
2530
2531 END LOOP;
2532
2533 LogMessage(FND_LOG.LEVEL_STATEMENT, '______________');
2534 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Total found ' || l_trx_tbl.count || ' unique trx(s)');
2535 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Total found ' || P_REVERSE_TBL.count || ' trx line(s)');
2536
2537 if P_REVERSE_TBL.count = 0 or l_trx_tbl.count = 0 then
2538
2539 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No AR transactions found to reverse.');
2540 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_REVERSE');
2541 FND_MSG_PUB.Add;
2542 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2543 RAISE FND_API.G_EXC_ERROR;
2544
2545 end if;
2546
2547 /* query for batch_source_name and cm_batch_source_id */
2548 open batch_source_cur(g_batch_source_id);
2549 fetch batch_source_cur into l_batch_source_name, l_cm_batch_source_id;
2550 close batch_source_cur;
2551
2552 if l_cm_batch_source_id is null then
2553
2554 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CM_BATCH');
2555 FND_MESSAGE.SET_TOKEN('BATCH', l_batch_source_name);
2556 FND_MSG_PUB.Add;
2557 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2558 RAISE FND_API.G_EXC_ERROR;
2559
2560 end if;
2561
2562 /* query for cm_batch_source_name */
2563 open cm_batch_source_cur(l_cm_batch_source_id);
2564 fetch cm_batch_source_cur into l_cm_batch_source_name;
2565 close cm_batch_source_cur;
2566
2567 --l_batch_source_name := 'Credit Memo';
2568 LogMessage(FND_LOG.LEVEL_STATEMENT, 'batch_source_name: ' || l_batch_source_name);
2569 LogMessage(FND_LOG.LEVEL_STATEMENT, 'cm_batch_source_name: ' || l_cm_batch_source_name);
2570
2571 /* looping thru table of unique trx(s) */
2572 FOR l_Count1 IN 1..l_trx_tbl.count LOOP
2573
2574 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Processing trx ' || l_trx_tbl(l_Count1));
2575
2576 l_cm_line_tbl.delete;
2577 l_Count2 := 0;
2578 l_Count4 := 0;
2579 l_LINE_CREDIT_FLAG := 'Y';
2580 l_amount := null;
2581
2582 FOR l_Count IN 1..P_REVERSE_TBL.count LOOP
2583
2584 if l_trx_tbl(l_Count1) = P_REVERSE_TBL(l_Count).CUSTOMER_TRX_ID then
2585
2586 if P_REVERSE_TBL(l_Count).CUSTOMER_TRX_LINE_ID is null then
2587 l_amount := -P_REVERSE_TBL(l_Count).TRX_AMOUNT;
2588 l_LINE_CREDIT_FLAG := 'N';
2589 exit;
2590 else
2591 l_Count2 := l_Count2 + 1;
2592 l_Count4 := l_Count;
2593 l_cm_line_tbl(l_Count2).customer_trx_line_id := P_REVERSE_TBL(l_Count).CUSTOMER_TRX_LINE_ID;
2594 l_cm_line_tbl(l_Count2).extended_amount := -P_REVERSE_TBL(l_Count).TRX_AMOUNT;
2595 l_cm_line_tbl(l_Count2).quantity_credited := 1;
2596 l_cm_line_tbl(l_Count2).price := -P_REVERSE_TBL(l_Count).TRX_AMOUNT;
2597
2598 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding a line to cm_line_tbl:');
2599 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').customer_trx_line_id: ' || l_cm_line_tbl(l_Count2).customer_trx_line_id);
2600 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').extended_amount: ' || l_cm_line_tbl(l_Count2).extended_amount);
2601 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').quantity_credited: ' || l_cm_line_tbl(l_Count2).quantity_credited);
2602 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl(' || l_Count2 || ').price: ' || l_cm_line_tbl(l_Count2).price);
2603 end if;
2604 end if;
2605
2606 END LOOP;
2607
2608 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST for trx ' || l_trx_tbl(l_Count1));
2609 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_LINE_CREDIT_FLAG = ' || l_LINE_CREDIT_FLAG);
2610 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_amount = ' || l_amount);
2611 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_line_tbl.count = ' || l_cm_line_tbl.count);
2612 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_cm_batch_source_name = ' || l_cm_batch_source_name);
2613
2614 begin
2615 AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST(
2616 P_API_VERSION => 1.0,
2617 P_INIT_MSG_LIST => FND_API.G_TRUE,
2618 P_COMMIT => FND_API.G_FALSE,
2619 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
2620 P_CUSTOMER_TRX_ID => l_trx_tbl(l_Count1),
2621 P_LINE_CREDIT_FLAG => l_LINE_CREDIT_FLAG,
2622 p_line_amount => l_amount,
2623 P_CM_REASON_CODE => 'CANCELLATION',
2624 p_cm_line_tbl => l_cm_line_tbl,
2625 P_SKIP_WORKFLOW_FLAG => 'Y',
2626 P_CREDIT_METHOD_INSTALLMENTS => null,
2627 P_CREDIT_METHOD_RULES => null,
2628 P_BATCH_SOURCE_NAME => l_cm_batch_source_name,
2629 P_ORG_ID => P_REVERSE_TBL(l_Count4).ORG_ID,
2630 X_REQUEST_ID => l_request_id,
2631 X_RETURN_STATUS => l_return_status,
2632 X_MSG_COUNT => l_msg_count,
2633 X_MSG_DATA => l_msg_data);
2634
2635 EXCEPTION
2636 WHEN OTHERS THEN
2637 LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: ' || sqlerrm);
2638 RAISE FND_API.G_EXC_ERROR;
2639 end;
2640
2641 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2642 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2643 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_request_id: ' || l_request_id);
2644
2645 IF l_return_status = fnd_api.g_ret_sts_error OR l_return_status = fnd_api.g_ret_sts_unexp_error OR
2646 l_request_id is null OR l_request_id = -1
2647
2648 THEN
2649
2650 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: AR_CREDIT_MEMO_API_PUB.CREATE_REQUEST raised unexpected error: ' || substr(l_msg_data,1,225));
2651 FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_CM_FAIL');
2652 FND_MESSAGE.SET_TOKEN('BATCH', l_cm_batch_source_name);
2653 FND_MSG_PUB.Add;
2654 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2655 RAISE FND_API.G_EXC_ERROR;
2656
2657 ELSE
2658
2659 if l_msg_data is not null then
2660 g_cr_return_status := 'WARNING';
2661 end if;
2662
2663 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CM successfully created!') ;
2664
2665
2666 END IF;
2667
2668 END LOOP;
2669
2670 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2671 END;
2672
2673
2674
2675 /*========================================================================
2676 | PRIVATE PROCEDURE APPLY_RECEIPT
2677 |
2678 | DESCRIPTION
2679 | This procedure applies cash receipt to invoice.
2680 |
2681 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2682 | CREATE_SINGLE_OFFCYCLE_BILL
2683 |
2684 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2685 | LogMessage
2686 |
2687 | PARAMETERS
2688 | P_CASH_RECEIPT_ID IN Cash receipt to apply
2689 | P_TRX_ID IN Apply receipt to this trx
2690 | P_TRX_LINE_ID IN Apply receipt to this trx line
2691 | P_APPLY_AMOUNT IN Apply amount
2692 |
2693 | KNOWN ISSUES
2694 | None
2695 |
2696 | NOTES
2697 | Any interesting aspect of the code in the package body which needs
2698 | to be stated.
2699 |
2700 | MODIFICATION HISTORY
2701 | Date Author Description of Changes
2702 | 01-01-2004 scherkas Created
2703 |
2704 *=======================================================================*/
2705 PROCEDURE APPLY_RECEIPT(P_CASH_RECEIPT_ID IN NUMBER,
2706 P_TRX_ID IN NUMBER,
2707 P_TRX_LINE_ID IN NUMBER,
2708 P_APPLY_AMOUNT IN NUMBER)
2709 IS
2710
2711 /*-----------------------------------------------------------------------+
2712 | Local Variable Declarations and initializations |
2713 +-----------------------------------------------------------------------*/
2714
2715 l_api_name CONSTANT VARCHAR2(30) := 'APPLY_RECEIPT';
2716 l_return_status VARCHAR2(1);
2717 l_msg_count NUMBER;
2718 l_msg_data VARCHAR2(32767);
2719 l_receipt_rem_amount number;
2720
2721 /*-----------------------------------------------------------------------+
2722 | Cursor Declarations |
2723 +-----------------------------------------------------------------------*/
2724
2725 CURSOR receipt_cur(P_RECEIPT_ID number) IS
2726 select ABS(AMOUNT_DUE_REMAINING)
2727 from ar_payment_schedules
2728 where CASH_RECEIPT_ID = P_RECEIPT_ID
2729 and status = 'OP'
2730 and class = 'PMT';
2731
2732 BEGIN
2733
2734 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2735 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Applying cash receipt ' || P_CASH_RECEIPT_ID);
2736
2737 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input data:');
2738 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_CASH_RECEIPT_ID: ' || P_CASH_RECEIPT_ID);
2739 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_TRX_ID: ' || P_TRX_ID);
2740 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_TRX_LINE_ID: ' || P_TRX_LINE_ID);
2741 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_APPLY_AMOUNT: ' || P_APPLY_AMOUNT);
2742
2743 /* verify input data */
2744
2745 if P_CASH_RECEIPT_ID is null then
2746 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cash Receipt ID is not set.');
2747 FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_NOT_SET');
2748 FND_MSG_PUB.Add;
2749 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2750 RAISE FND_API.G_EXC_ERROR;
2751 end if;
2752
2753 if P_TRX_ID is null then
2754 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Trx ID is not set.');
2755 FND_MESSAGE.SET_NAME('LNS', 'LNS_TRX_NOT_SET');
2756 FND_MSG_PUB.Add;
2757 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2758 RAISE FND_API.G_EXC_ERROR;
2759 end if;
2760
2761 if P_TRX_LINE_ID is null then
2762 -- LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Trx Line ID is not set.');
2763 FND_MESSAGE.SET_NAME('LNS', 'LNS_TRX_LINE_NOT_SET');
2764 FND_MSG_PUB.Add;
2765 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2766 RAISE FND_API.G_EXC_ERROR;
2767 end if;
2768
2769 if P_APPLY_AMOUNT is null or P_APPLY_AMOUNT <= 0 then
2770 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Apply Amount is not set.');
2771 FND_MESSAGE.SET_NAME('LNS', 'LNS_AMOUNT_NOT_SET');
2772 FND_MSG_PUB.Add;
2773 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2774 RAISE FND_API.G_EXC_ERROR;
2775 end if;
2776
2777 /* verifying requested qpply amount */
2778
2779 open receipt_cur(P_CASH_RECEIPT_ID);
2780 fetch receipt_cur into l_receipt_rem_amount;
2781
2782 if receipt_cur%NOTFOUND then
2783 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No receipt found to apply.');
2784 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CR_FOUND');
2785 FND_MSG_PUB.Add;
2786 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2787 RAISE FND_API.G_EXC_ERROR;
2788 end if;
2789
2790 close receipt_cur;
2791
2792 if l_receipt_rem_amount < P_APPLY_AMOUNT then
2793 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The receipt does not have enough funds to apply requested amount.');
2794 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_CR_FUNDS');
2795 FND_MSG_PUB.Add;
2796 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2797 RAISE FND_API.G_EXC_ERROR;
2798 end if;
2799
2800 /* Applying cash receipt to invoice */
2801 /*
2802 AR_RECEIPT_API_PUB.APPLY(
2803 P_API_VERSION => 1.0,
2804 P_INIT_MSG_LIST => FND_API.G_FALSE,
2805 P_COMMIT => FND_API.G_TRUE,
2806 X_RETURN_STATUS => L_RETURN_STATUS,
2807 X_MSG_COUNT => L_MSG_COUNT,
2808 X_MSG_DATA => L_MSG_DATA,
2809 p_cash_receipt_id => P_CASH_RECEIPT_ID,
2810 p_customer_trx_id => P_TRX_ID,
2811 p_amount_applied => P_APPLY_AMOUNT,
2812 p_customer_trx_line_id => P_TRX_LINE_ID);
2813 */
2814 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2815 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
2816
2817 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2818
2819 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: AR_RECEIPT_API_PUB.APPLY raised error: ' || substr(l_msg_data,1,225));
2820 FND_MESSAGE.SET_NAME('LNS', 'LNS_APPL_CR_FAIL');
2821 FND_MSG_PUB.Add;
2822 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
2823 RAISE FND_API.G_EXC_ERROR;
2824
2825 ELSE
2826 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully applied cash receipt to trx ' || P_TRX_ID || ' line ' || P_TRX_LINE_ID);
2827 END IF;
2828
2829 -- END OF BODY OF API
2830
2831 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
2832
2833 EXCEPTION
2834 WHEN OTHERS THEN
2835 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to apply cash receipt to trx ' || P_TRX_ID || ' line ' || P_TRX_LINE_ID);
2836
2837 END;
2838
2839
2840
2841
2842 /*========================================================================
2843 | PRIVATE PROCEDURE CREATE_AR_ADJ
2844 |
2845 | DESCRIPTION
2846 | This procedure creates AR adjustment.
2847 |
2848 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
2849 | CREATE_SINGLE_OFFCYCLE_BILL
2850 |
2851 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
2852 | LogMessage
2853 |
2854 | PARAMETERS
2855 | P_TYPE IN Adjustment type
2856 | P_PAYMENT_SCHEDULE_ID IN Payment schedule ID
2857 | P_RECEIVABLES_TRX_ID IN Receivables trx ID
2858 | P_AMOUNT IN Adjust amount
2859 | P_CUSTOMER_TRX_LINE_ID IN Trx line ID
2860 | P_CODE_COMBINATION_ID IN Code combination ID
2861 | P_USSGL_TRX_CODE IN USSGL Trx code
2862 | P_REASON_CODE IN Adjust reason
2863 | P_COMMENTS IN Adjust comments
2864 | X_ADJ_ID OUT Adjust comments
2865 | X_ADJ_NUMBER OUT Adjust comments
2866 |
2867 | KNOWN ISSUES
2868 | None
2869 |
2870 | NOTES
2871 | Any interesting aspect of the code in the package body which needs
2872 | to be stated.
2873 |
2874 | MODIFICATION HISTORY
2875 | Date Author Description of Changes
2876 | 03-16-2006 karamach Always pass INVOICE for adjustment type and also pass p_check_amount 'F' to fix bug5092620 when adjusting invoice with Tax/Freight/Charges
2877 | 01-01-2004 scherkas Created
2878 |
2879 *=======================================================================*/
2880 PROCEDURE CREATE_AR_ADJ(P_TYPE IN VARCHAR2,
2881 P_PAYMENT_SCHEDULE_ID IN NUMBER,
2882 P_RECEIVABLES_TRX_ID IN NUMBER,
2883 P_AMOUNT IN NUMBER,
2884 P_APPLY_DATE IN DATE,
2885 P_GL_DATE IN DATE,
2886 P_CUSTOMER_TRX_LINE_ID IN NUMBER,
2887 P_CODE_COMBINATION_ID IN NUMBER,
2888 P_USSGL_TRX_CODE IN VARCHAR2,
2889 P_REASON_CODE IN VARCHAR2,
2890 P_COMMENTS IN VARCHAR2,
2891 X_ADJ_ID OUT NOCOPY NUMBER,
2892 X_ADJ_NUMBER OUT NOCOPY VARCHAR2,
2893 P_ORG_ID IN NUMBER)
2894 IS
2895
2896 /*-----------------------------------------------------------------------+
2897 | Local Variable Declarations and initializations |
2898 +-----------------------------------------------------------------------*/
2899
2900 l_api_name CONSTANT VARCHAR2(30) := 'CREATE_AR_ADJ';
2901 l_return_status VARCHAR2(1);
2902 l_msg_count NUMBER;
2903 l_msg_data VARCHAR2(32767);
2904 l_adj_rec ar_adjustments%rowtype;
2905 l_adj_num varchar2(20);
2906 l_adj_id number;
2907 l_index number := 0;
2908 l_indexNo number := 1;
2909 l_msg varchar2(4000) := null;
2910
2911 /*-----------------------------------------------------------------------+
2912 | Cursor Declarations |
2913 +-----------------------------------------------------------------------*/
2914
2915
2916 BEGIN
2917
2918 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
2919 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adjusting invoice...');
2920
2921 if P_AMOUNT < 0 then
2922 l_adj_rec.type := 'INVOICE'; --P_TYPE; --karamach Bug5092620
2923 else
2924 l_adj_rec.type := P_TYPE;
2925 end if;
2926
2927 l_adj_rec.payment_schedule_id := P_PAYMENT_SCHEDULE_ID;
2928 l_adj_rec.RECEIVABLES_TRX_ID := P_RECEIVABLES_TRX_ID;
2929 l_adj_rec.apply_date := P_APPLY_DATE;
2930 l_adj_rec.gl_date := P_GL_DATE;
2931 l_adj_rec.created_from := G_PKG_NAME;
2932 l_adj_rec.amount := P_AMOUNT;
2933 l_adj_rec.customer_trx_line_id := P_CUSTOMER_TRX_LINE_ID;
2934 l_adj_rec.code_combination_id := P_CODE_COMBINATION_ID;
2935 --l_adj_rec.ussgl_transaction_code := P_USSGL_TRX_CODE;
2936 l_adj_rec.reason_code := P_REASON_CODE;
2937 l_adj_rec.comments := P_COMMENTS;
2938 l_adj_rec.org_id := P_ORG_ID;
2939
2940 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE...');
2941 LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
2942 p_gl_date => P_GL_DATE,
2943 p_trx_date => P_APPLY_DATE,
2944 p_set_of_books_id => g_set_of_books_id,
2945 x_default_gl_date => l_adj_rec.gl_date);
2946
2947 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Sending following data to adjustment api:');
2948 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.type: ' || l_adj_rec.type);
2949 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.payment_schedule_id: ' || l_adj_rec.payment_schedule_id);
2950 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.RECEIVABLES_TRX_ID: ' || l_adj_rec.RECEIVABLES_TRX_ID);
2951 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.apply_date: ' || l_adj_rec.apply_date);
2952 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.gl_date: ' || l_adj_rec.gl_date);
2953 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.created_from: ' || l_adj_rec.created_from);
2954 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.amount: ' || l_adj_rec.amount);
2955 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.customer_trx_line_id: ' || l_adj_rec.customer_trx_line_id);
2956 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.code_combination_id: ' || l_adj_rec.code_combination_id);
2957 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.ussgl_transaction_code: ' || l_adj_rec.ussgl_transaction_code);
2958 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.reason_code: ' || l_adj_rec.reason_code);
2959 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.comments: ' || l_adj_rec.comments);
2960 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_rec.org_id: ' || l_adj_rec.org_id);
2961
2962 /* Adjusting invoice */
2963
2964 AR_ADJUST_PUB.Create_Adjustment(
2965 p_api_name => 'AR_ADJUST_PUB',
2966 p_api_version => 1.0,
2967 p_init_msg_list => FND_API.G_TRUE,
2968 p_commit_flag => FND_API.G_FALSE,
2969 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2970 p_msg_count => l_msg_count,
2971 p_msg_data => l_msg_data,
2972 p_return_status => l_return_status,
2973 p_adj_rec => l_adj_rec,
2974 p_chk_approval_limits => 'F',
2975 p_check_amount => 'F', --karamach Bug5092620
2976 p_new_adjust_number => l_adj_num,
2977 p_new_adjust_id => l_adj_id,
2978 p_org_id => P_ORG_ID);
2979
2980
2981 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
2982 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_id: ' || l_adj_id);
2983 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_adj_num: ' || l_adj_num);
2984
2985 IF l_return_status <> FND_API.G_RET_STS_SUCCESS or
2986 l_adj_id is null or
2987 l_adj_num is null
2988 THEN
2989 FND_MESSAGE.SET_NAME('LNS', 'LNS_CR_ADJ_FAIL');
2990 if l_return_status = FND_API.G_RET_STS_SUCCESS and l_adj_id is null then
2991 FND_MESSAGE.SET_TOKEN('REASON', 'new_adjust_id is null');
2992 elsif l_return_status = FND_API.G_RET_STS_SUCCESS and l_adj_num is null then
2993 FND_MESSAGE.SET_TOKEN('REASON', 'new_adjust_number is null');
2994 else
2995 FND_MESSAGE.SET_TOKEN('REASON', 'unknown');
2996 end if;
2997 FND_MSG_PUB.Add;
2998 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
2999
3000 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_count: ' || l_msg_count);
3001 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
3002
3003 while (l_indexNo <= l_msg_Count ) loop
3004 fnd_msg_pub.get(l_indexNo, 'F', l_msg, l_index);
3005 LogMessage(FND_LOG.LEVEL_ERROR, 'Error: ' || l_msg);
3006 l_indexNo := l_indexNo + 1;
3007 End Loop;
3008
3009 RAISE FND_API.G_EXC_ERROR;
3010
3011 END IF;
3012
3013 X_ADJ_ID := l_adj_id;
3014 X_ADJ_NUMBER := l_adj_num;
3015
3016 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3017
3018 END;
3019
3020
3021
3022
3023 /*========================================================================
3024 | PRIVATE PROCEDURE BUILD_ERROR_STATEMENT
3025 |
3026 | DESCRIPTION
3027 | This procedure builds error statement.
3028 |
3029 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3030 |
3031 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3032 | LogMessage
3033 |
3034 | PARAMETERS
3035 | P_BORROWER_ID IN Bborrower ID
3036 | P_LOAN_ID IN Loans ID
3037 | P_FROM_DAYS_TO_DD IN From days
3038 | P_TO_DAYS_TO_DD IN To days
3039 | X_REPORT_XML OUT NOCOPY Return full report xml
3040 |
3041 | KNOWN ISSUES
3042 | None
3043 |
3044 | NOTES
3045 | Any interesting aspect of the code in the package body which needs
3046 | to be stated.
3047 |
3048 | MODIFICATION HISTORY
3049 | Date Author Description of Changes
3050 | 04-21-2005 scherkas Created
3051 |
3052 *=======================================================================*/
3053 PROCEDURE BUILD_ERROR_STATEMENT(
3054 P_LOAN_ID IN NUMBER,
3055 P_PAYMENT_NUMBER IN NUMBER,
3056 P_PRIN_AMOUNT_DUE IN NUMBER,
3057 P_INT_AMOUNT_DUE IN NUMBER,
3058 P_FEE_AMOUNT_DUE IN NUMBER,
3059 P_DUE_DATE IN DATE,
3060 P_ERR_COUNT IN NUMBER,
3061 X_STATEMENT_XML OUT NOCOPY CLOB)
3062 IS
3063
3064 /*-----------------------------------------------------------------------+
3065 | Local Variable Declarations and initializations |
3066 +-----------------------------------------------------------------------*/
3067
3068 l_api_name CONSTANT VARCHAR2(30) := 'BUILD_ERROR_STATEMENT';
3069 l_new_line varchar2(1);
3070 l_statement varchar2(2000);
3071 l_borrower VARCHAR2(360);
3072 l_loan VARCHAR2(60);
3073 l_currency VARCHAR2(15);
3074 l_f_prin_amount varchar2(50);
3075 l_f_int_amount varchar2(50);
3076 l_f_fee_amount varchar2(50);
3077 l_f_sum_amount varchar2(50);
3078 l_index number;
3079 l_indexNo number;
3080 l_error varchar2(500);
3081 /*-----------------------------------------------------------------------+
3082 | Cursor Declarations |
3083 +-----------------------------------------------------------------------*/
3084
3085 /* query for loan number and borrower name */
3086 CURSOR loan_cur(P_LOAN_ID number, P_PRIN_AMOUNT_DUE number, P_INT_AMOUNT_DUE number, P_FEE_AMOUNT_DUE number) IS
3087 select party.party_name,
3088 loan.loan_number,
3089 loan.LOAN_CURRENCY,
3090 to_char(P_PRIN_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
3091 to_char(P_INT_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
3092 to_char(P_FEE_AMOUNT_DUE, FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50)),
3093 to_char((P_PRIN_AMOUNT_DUE + P_INT_AMOUNT_DUE + P_FEE_AMOUNT_DUE), FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50))
3094 from lns_loan_headers loan,
3095 hz_parties party
3096 where party.party_id = loan.PRIMARY_BORROWER_ID and
3097 loan.loan_id = P_LOAN_ID;
3098
3099 BEGIN
3100
3101 l_index := 0;
3102 l_indexNo := 1;
3103 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
3104 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3105
3106 l_new_line := '
3107 ';
3108
3109 /* query for loan number and borrower name */
3110 open loan_cur(P_LOAN_ID, P_PRIN_AMOUNT_DUE, P_INT_AMOUNT_DUE, P_FEE_AMOUNT_DUE);
3111 fetch loan_cur into l_borrower, l_loan, l_currency, l_f_prin_amount, l_f_int_amount, l_f_fee_amount, l_f_sum_amount;
3112 close loan_cur;
3113 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_borrower: ' || l_borrower);
3114 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan: ' || l_loan);
3115
3116 /* build error */
3117 l_statement := '<LOAN>';
3118 l_statement := l_statement || l_new_line || '<LOAN_ID>' || P_LOAN_ID || '</LOAN_ID>';
3119 l_statement := l_statement || l_new_line || '<BILL_DATE>' || sysdate || '</BILL_DATE>';
3120 l_statement := l_statement || l_new_line || '<LOAN_NUMBER>' || l_loan || '</LOAN_NUMBER>';
3121 l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_NUMBER>' || P_PAYMENT_NUMBER || '</NEXT_PAYMENT_NUMBER>';
3122 l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_DUE_DATE>' || P_DUE_DATE || '</NEXT_PAYMENT_DUE_DATE>';
3123 l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_PRINCIPAL_DUE>' || l_f_prin_amount || '</F_NEXT_PAYMENT_PRINCIPAL_DUE>';
3124 l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_INTEREST_DUE>' || l_f_int_amount || '</F_NEXT_PAYMENT_INTEREST_DUE>';
3125 l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_FEE_DUE>' || l_f_fee_amount || '</F_NEXT_PAYMENT_FEE_DUE>';
3126 l_statement := l_statement || l_new_line || '<F_NEXT_PAYMENT_TOTAL_DUE>' || l_f_sum_amount || '</F_NEXT_PAYMENT_TOTAL_DUE>';
3127 l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_PRINCIPAL_DUE>' || P_PRIN_AMOUNT_DUE || '</NEXT_PAYMENT_PRINCIPAL_DUE>';
3128 l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_INTEREST_DUE>' || P_INT_AMOUNT_DUE || '</NEXT_PAYMENT_INTEREST_DUE>';
3129 l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_FEE_DUE>' || P_FEE_AMOUNT_DUE || '</NEXT_PAYMENT_FEE_DUE>';
3130 l_statement := l_statement || l_new_line || '<NEXT_PAYMENT_TOTAL_DUE>' || (P_PRIN_AMOUNT_DUE + P_INT_AMOUNT_DUE + P_FEE_AMOUNT_DUE) || '</NEXT_PAYMENT_TOTAL_DUE>';
3131 l_statement := l_statement || l_new_line || '<BORROWER_NAME>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_borrower) || '</BORROWER_NAME>';
3132 l_statement := l_statement || l_new_line || '<LOAN_CURRENCY_CODE>' || l_currency || '</LOAN_CURRENCY_CODE>';
3133
3134 l_statement := l_statement || l_new_line || '<ERROR>' || l_new_line;
3135 while (l_indexNo <= P_ERR_COUNT ) loop
3136 fnd_msg_pub.get(l_indexNo, 'F', l_error, l_index);
3137 l_error := LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_error);
3138 l_statement := l_statement || l_error;
3139 l_indexNo := l_indexNo + 1;
3140 End Loop;
3141 l_statement := l_statement || '</ERROR>';
3142
3143 l_statement := l_statement || l_new_line || '</LOAN>';
3144 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_statement: ' || l_statement);
3145
3146 /* init statement xml */
3147 DBMS_LOB.createtemporary(X_STATEMENT_XML, FALSE, DBMS_LOB.CALL);
3148 DBMS_LOB.open(X_STATEMENT_XML, DBMS_LOB.lob_readwrite);
3149
3150 /* building clob */
3151 DBMS_LOB.write(X_STATEMENT_XML, length(l_statement), 1, l_statement);
3152
3153 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3154
3155 EXCEPTION
3156 WHEN OTHERS THEN
3157 LogMessage(FND_LOG.LEVEL_ERROR, 'Failed to generate error statement for loan ' || l_loan);
3158 END;
3159
3160
3161
3162
3163 /*========================================================================
3164 | PRIVATE PROCEDURE BUILD_BILLING_REPORT
3165 |
3166 | DESCRIPTION
3167 | This procedure builds billing report.
3168 |
3169 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3170 |
3171 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3172 | LogMessage
3173 |
3174 | PARAMETERS
3175 | P_TYPE_ID IN Loan type ID
3176 | P_PRODUCT_ID IN Loan product ID
3177 | P_BORROWER_ID IN Bborrower ID
3178 | P_LOAN_ID IN Loans ID
3179 | P_FROM_DAYS_TO_DD IN From days
3180 | P_TO_DAYS_TO_DD IN To days
3181 | X_REPORT_XML OUT NOCOPY Return full report xml
3182 |
3183 | KNOWN ISSUES
3184 | None
3185 |
3186 | NOTES
3187 | Any interesting aspect of the code in the package body which needs
3188 | to be stated.
3189 |
3190 | MODIFICATION HISTORY
3191 | Date Author Description of Changes
3192 | 04-21-2005 scherkas Created
3193 |
3194 *=======================================================================*/
3195 PROCEDURE BUILD_BILLING_REPORT(
3196 P_TYPE_ID IN NUMBER,
3197 P_PRODUCT_ID IN NUMBER,
3198 P_BORROWER_ID IN NUMBER,
3199 P_LOAN_ID IN NUMBER,
3200 P_FROM_DAYS_TO_DD IN NUMBER,
3201 P_TO_DAYS_TO_DD IN NUMBER,
3202 P_STATEMENTS_XML IN CLOB)
3203 IS
3204
3205 /*-----------------------------------------------------------------------+
3206 | Local Variable Declarations and initializations |
3207 +-----------------------------------------------------------------------*/
3208
3209 l_api_name CONSTANT VARCHAR2(30) := 'BUILD_BILLING_REPORT';
3210 l_new_line varchar2(1);
3211 l_header varchar2(1000);
3212 l_footer varchar2(100);
3213 l_parameters varchar2(1000);
3214 l_borrower VARCHAR2(360);
3215 l_loan VARCHAR2(60);
3216 l_from_days varchar2(50);
3217 l_to_days varchar2(50);
3218 l_org_name VARCHAR2(240);
3219 l_from_days_date varchar2(100);
3220 l_to_days_date varchar2(100);
3221 l_product varchar2(80);
3222 l_type varchar2(80);
3223 /*-----------------------------------------------------------------------+
3224 | Cursor Declarations |
3225 +-----------------------------------------------------------------------*/
3226
3227 /* query for borrower name */
3228 CURSOR borrower_cur(P_BORROWER_ID number) IS
3229 select party_name from hz_parties party where party_id = P_BORROWER_ID;
3230
3231 /* query for loan number */
3232 CURSOR loan_cur(P_LOAN_ID number) IS
3233 select loan_number from lns_loan_headers where loan_id = P_LOAN_ID;
3234
3235 /* query for org name */
3236 CURSOR org_cur(P_ORG_ID number) IS
3237 select name
3238 from hr_all_organization_units_tl
3239 where ORGANIZATION_ID = P_ORG_ID and
3240 language(+) = userenv('LANG');
3241
3242 /* query for loan product name */
3243 CURSOR loan_product_cur(P_PRODUCT_ID number) IS
3244 select LOAN_PRODUCT_NAME from lns_loan_products_vl where LOAN_PRODUCT_ID = P_PRODUCT_ID;
3245
3246 /* query for loan type name */
3247 CURSOR loan_type_cur(P_TYPE_ID number) IS
3248 select LOAN_TYPE_NAME from LNS_LOAN_TYPES_VL where LOAN_TYPE_ID = P_TYPE_ID;
3249
3250 BEGIN
3251
3252 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
3253 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3254
3255 /* init report clob */
3256 dbms_lob.createtemporary(g_last_billing_report, FALSE, DBMS_LOB.CALL);
3257 dbms_lob.open(g_last_billing_report, dbms_lob.lob_readwrite);
3258
3259 l_new_line := '
3260 ';
3261 l_header := '<?xml version="1.0" encoding="UTF-8"?>' || l_new_line || '<BILLBATCH>';
3262 l_footer := l_new_line || '</BILLBATCH>' || l_new_line;
3263 l_parameters := l_new_line || '<PARAMETERS>';
3264
3265 /* adding org name to parameter list */
3266 open org_cur(g_org_id);
3267 fetch org_cur into l_org_name;
3268 close org_cur;
3269 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_org_name: ' || l_org_name);
3270 l_parameters := l_parameters || l_new_line || '<ORG_NAME>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_org_name) || '</ORG_NAME>';
3271
3272 /* adding loan type to parameter list */
3273 if P_TYPE_ID is not null then
3274 open loan_type_cur(P_TYPE_ID);
3275 fetch loan_type_cur into l_type;
3276 close loan_type_cur;
3277 end if;
3278 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_type: ' || l_type);
3279 l_parameters := l_parameters || l_new_line || '<LOAN_TYPE>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_type) || '</LOAN_TYPE>';
3280
3281 /* adding loan product to parameter list */
3282 if P_PRODUCT_ID is not null then
3283 open loan_product_cur(P_PRODUCT_ID);
3284 fetch loan_product_cur into l_product;
3285 close loan_product_cur;
3286 end if;
3287 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_product: ' || l_product);
3288 l_parameters := l_parameters || l_new_line || '<LOAN_PRODUCT>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_product) || '</LOAN_PRODUCT>';
3289
3290 /* adding borrower to parameter list */
3291 if P_BORROWER_ID is not null then
3292 open borrower_cur(P_BORROWER_ID);
3293 fetch borrower_cur into l_borrower;
3294 close borrower_cur;
3295 end if;
3296 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_borrower: ' || l_borrower);
3297 l_parameters := l_parameters || l_new_line || '<BORROWER_NAME>' || LNS_REP_UTILS.REPLACE_SPECIAL_CHARS(l_borrower) || '</BORROWER_NAME>';
3298
3299 /* adding loan to parameter list */
3300 if P_LOAN_ID is not null then
3301 open loan_cur(P_LOAN_ID);
3302 fetch loan_cur into l_loan;
3303 close loan_cur;
3304 end if;
3305 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan: ' || l_loan);
3306 l_parameters := l_parameters || l_new_line || '<LOAN_NUMBER>' || l_loan || '</LOAN_NUMBER>';
3307
3308 /* adding from days to parameter list */
3309 if P_FROM_DAYS_TO_DD is not null then
3310 l_from_days := P_FROM_DAYS_TO_DD;
3311 l_from_days_date := GET_BILLING_DATE(P_FROM_DAYS_TO_DD);
3312 end if;
3313 l_parameters := l_parameters || l_new_line || '<FROM_DAYS_TO_DD>' || l_from_days || ' - ' || '</FROM_DAYS_TO_DD>';
3314 --Added as part of International Calender Support
3315 l_parameters := l_parameters || l_new_line || '<FROM_DAYS_TO_DD_DATE>' || l_from_days_date || '</FROM_DAYS_TO_DD_DATE>';
3316 l_parameters := l_parameters || l_new_line || '<REPORT_GENERATION_DATE>' || to_char(sysdate,'YYYY-MM-DD') || '</REPORT_GENERATION_DATE>';
3317
3318 /* adding to days to parameter list */
3319 if P_TO_DAYS_TO_DD is not null then
3320 l_to_days := P_TO_DAYS_TO_DD;
3321 l_to_days_date := GET_BILLING_DATE(P_TO_DAYS_TO_DD);
3322 end if;
3323 l_parameters := l_parameters || l_new_line || '<TO_DAYS_TO_DD>' || l_to_days || ' - ' || '</TO_DAYS_TO_DD>';
3324 --Added as part of International Calender Support
3325 l_parameters := l_parameters || l_new_line || '<TO_DAYS_TO_DD_DATE>' || l_to_days_date || '</TO_DAYS_TO_DD_DATE>';
3326 l_parameters := l_parameters || l_new_line || '</PARAMETERS>' || l_new_line;
3327 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_parameters: ' || l_parameters);
3328
3329
3330 /* add header to billing report */
3331 DBMS_LOB.write(g_last_billing_report, length(l_header), 1, l_header);
3332 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added header to report');
3333
3334 /* add parameters to billing report */
3335 dbms_lob.writeAppend(g_last_billing_report, length(l_parameters), l_parameters);
3336 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added parameters to report');
3337
3338 /* add all statements to billing report */
3339 if dbms_lob.getlength(P_STATEMENTS_XML) > 0 then
3340 DBMS_LOB.Append(g_last_billing_report, P_STATEMENTS_XML);
3341 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added statements to report');
3342 end if;
3343
3344 /* add footer to billing report */
3345 dbms_lob.writeAppend(g_last_billing_report, length(l_footer), l_footer);
3346 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added footer to report');
3347
3348 /* print report to output file */
3349 LNS_REP_UTILS.PRINT_CLOB(g_last_billing_report); -- fix for bug 6938098
3350 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Printed report into output file.');
3351
3352 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3353
3354 EXCEPTION
3355 WHEN OTHERS THEN
3356 LogMessage(FND_LOG.LEVEL_ERROR, 'Failed to generate billing report');
3357 g_cr_return_status := 'WARNING';
3358 END;
3359
3360
3361
3362 /*========================================================================
3363 | PUBLIC PROCEDURE GENERATE_BILLING_STATEMENT_XML
3364 |
3365 | DESCRIPTION
3366 | This procedure creates the billing statement xml for single loan
3367 |
3368 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3369 | BILL_SINGLE_LOAN
3370 |
3371 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3372 | LogMessage
3373 |
3374 | PARAMETERS
3375 | P_LOAN_ID IN NUMBER
3376 | P_AMORTIZATION_SCHEDULE_ID IN NUMBER
3377 | KNOWN ISSUES
3378 | None
3379 |
3380 | NOTES
3381 | Any interesting aspect of the code in the package body which needs
3382 | to be stated.
3383 |
3384 | MODIFICATION HISTORY
3385 | Date Author Description of Changes
3386 | 04-24-2004 karamach Created
3387 | 05-04-2004 scherkas Modified
3388 | 06-19-2004 karamach Changed to use DBMS_XMLQUERY (8i pkg) instead of DBMS_XMLGEN (9i pkg)
3389 | to be compatible with the supported Oracle database version 8.1.7.4
3390 | and avoid 9i dependency
3391 | 06-21-2006 karamach Added cursor c_get_currency_format_mask and changed query to improve performance to fix bug5264818
3392 |
3393 *=======================================================================*/
3394 PROCEDURE GENERATE_BILLING_STATEMENT_XML(p_loan_id IN NUMBER,
3395 p_amortization_schedule_id IN NUMBER) IS
3396
3397 /*-----------------------------------------------------------------------+
3398 | Local Variable Declarations and initializations |
3399 +-----------------------------------------------------------------------*/
3400
3401 l_api_name CONSTANT VARCHAR2(30) := 'GENERATE_BILLING_STATEMENT_XML';
3402 qry_string Varchar2(12000);
3403 -- qryCtx DBMS_XMLGEN.ctxHandle;
3404 qryCtx DBMS_XMLQuery.ctxType;
3405 result CLOB;
3406 l_current_phase varchar2(30);
3407 l_currency_format_mask varchar2(4000);
3408 /*-----------------------------------------------------------------------+
3409 | Cursor Declarations |
3410 +-----------------------------------------------------------------------*/
3411
3412 CURSOR c_get_currency_format_mask(pLoanId Number) is
3413 select FND_CURRENCY.SAFE_GET_FORMAT_MASK(loan.LOAN_CURRENCY,50) mask
3414 from lns_loan_headers_all loan
3415 where loan.loan_id = pLoanId;
3416
3417 BEGIN
3418
3419 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3420
3421 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting Currency Format Mask for loan');
3422 OPEN c_get_currency_format_mask(p_loan_id);
3423 FETCH c_get_currency_format_mask INTO l_currency_format_mask;
3424 CLOSE c_get_currency_format_mask;
3425
3426 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Generating billing statement...');
3427
3428 qry_string := 'SELECT loan.loan_id, ' ||
3429 'PAY_SUM.next_payment_amortization_id, ' ||
3430 'to_char(sysdate, ''YYYY-MM-DD'') bill_date, ' ||
3431 'to_char(sysdate, ''YYYY-MM-DD'') report_generation_date, ' ||
3432 'loan.loan_number, ' ||
3433 'loan.LOAN_DESCRIPTION, ' ||
3434 'am.PAYMENT_NUMBER next_payment_number, ' ||
3435 'to_char(am.DUE_DATE, ''YYYY-MM-DD'') next_payment_due_date, ' ||
3436 'to_char(am.PRINCIPAL_AMOUNT, :CURRENCY_FORMAT1) f_next_payment_principal_due, ' ||
3437 'to_char(am.INTEREST_AMOUNT, :CURRENCY_FORMAT2) f_next_payment_interest_due, ' ||
3438 'to_char(am.FEE_AMOUNT, :CURRENCY_FORMAT3) f_next_payment_fee_due, ' ||
3439 'to_char((am.PRINCIPAL_AMOUNT+am.INTEREST_AMOUNT+am.FEE_AMOUNT), :CURRENCY_FORMAT4) f_next_payment_total_due, ' ||
3440 'am.PRINCIPAL_AMOUNT next_payment_principal_due, ' ||
3441 'am.INTEREST_AMOUNT next_payment_interest_due, ' ||
3442 'am.FEE_AMOUNT next_payment_fee_due, ' ||
3443 '(am.PRINCIPAL_AMOUNT+am.INTEREST_AMOUNT+am.FEE_AMOUNT) next_payment_total_due, ' ||
3444 'party.party_name Borrower_Name, ' ||
3445 'loc.address1 || '' '' || loc.city || '' '' || loc.state || '' '' || loc.postal_code || '' '' || terr.TERRITORY_SHORT_NAME Primary_Address, ' ||
3446 'party.jgzz_fiscal_code tax_id, ' ||
3447 'org.name operating_unit, ' ||
3448 'loan_type.loan_type_name loan_type, ' ||
3449 'loan_class.meaning loan_class, ' ||
3450 'loan.loan_term || '' '' || periodlkup.meaning loan_term, ' ||
3451 'to_char(LNS_FIN_UTILS.getActiveRate(loan.loan_id)) current_interest_rate, ' ||
3452 'to_char(loan.loan_maturity_date, ''YYYY-MM-DD'') loan_maturity_date, ' ||
3453 'to_char(PAY_SUM.total_principal_balance, :CURRENCY_FORMAT5) f_remaining_balance_amount, ' ||
3454 'to_char(PAY_SUM.principal_paid_todate, :CURRENCY_FORMAT6) f_principal_paid_todate, ' ||
3455 'to_char(PAY_SUM.interest_paid_todate, :CURRENCY_FORMAT7) f_interest_paid_todate, ' ||
3456 'to_char(PAY_SUM.fee_paid_todate, :CURRENCY_FORMAT8) f_fee_paid_todate, ' ||
3457 'to_char(PAY_SUM.total_prin_paid_todate, :CURRENCY_FORMAT9) f_total_prin_paid_todate, ' ||
3458 'to_char(PAY_SUM_YEARLY.principal_paid_ytd, :CURRENCY_FORMAT10) f_principal_paid_ytd, ' ||
3459 'to_char(PAY_SUM_YEARLY.interest_paid_ytd, :CURRENCY_FORMAT11) f_interest_paid_ytd, ' ||
3460 'to_char(PAY_SUM_YEARLY.fee_paid_ytd, :CURRENCY_FORMAT12) f_fee_paid_ytd, ' ||
3461 'to_char(PAY_SUM_OVERDUE.principal_overdue, :CURRENCY_FORMAT13) f_principal_overdue, ' ||
3462 'to_char(PAY_SUM_OVERDUE.interest_overdue, :CURRENCY_FORMAT14) f_interest_overdue, ' ||
3463 'to_char(PAY_SUM_OVERDUE.fee_overdue, :CURRENCY_FORMAT15) f_fee_overdue, ' ||
3464 'to_char(PAY_SUM_OVERDUE.total_overdue, :CURRENCY_FORMAT16) f_total_overdue, ' ||
3465 'PAY_SUM.total_principal_balance remaining_balance_amount, ' ||
3466 'PAY_SUM.principal_paid_todate principal_paid_todate, ' ||
3467 'PAY_SUM.interest_paid_todate interest_paid_todate, ' ||
3468 'PAY_SUM.fee_paid_todate fee_paid_todate, ' ||
3469 'PAY_SUM.total_prin_paid_todate total_prin_paid_todate, ' ||
3470 'PAY_SUM_YEARLY.principal_paid_ytd principal_paid_ytd, ' ||
3471 'PAY_SUM_YEARLY.interest_paid_ytd interest_paid_ytd, ' ||
3472 'PAY_SUM_YEARLY.fee_paid_ytd fee_paid_ytd, ' ||
3473 'PAY_SUM_OVERDUE.principal_overdue principal_overdue, ' ||
3474 'PAY_SUM_OVERDUE.interest_overdue interest_overdue, ' ||
3475 'PAY_SUM_OVERDUE.fee_overdue fee_overdue, ' ||
3476 'PAY_SUM_OVERDUE.total_overdue total_overdue, ' ||
3477 'PAY_SUM_OVERDUE.number_overdue_bills number_of_overdue_payments, ' ||
3478 'to_char(PAY_SUM_OVERDUE.last_overdue_date, ''YYYY-MM-DD'') last_overdue_date, ' ||
3479 'to_char(PAY_SUM_OVERDUE.last_payment_amount, :CURRENCY_FORMAT17) f_last_payment_amount, ' ||
3480 'PAY_SUM_OVERDUE.last_payment_amount last_payment_amount, ' ||
3481 'to_char(PAY_SUM_OVERDUE.last_payment_date, ''YYYY-MM-DD'') last_payment_date, ' ||
3482 '(LNS_FIN_UTILS.getNumberInstallments(loan.loan_id, nvl(loan.current_phase, ''TERM'')) - PAY_SUM.next_payment_number) remaining_number_of_payments, ' ||
3483 'contact_person.party_name PRIMARY_LOAN_CONTACT, ' ||
3484 'loan.LOAN_CURRENCY LOAN_CURRENCY_CODE, ' ||
3485 'curr.name LOAN_CURRENCY_MEANING, ' ||
3486 'loan_subtype.meaning loan_subtype, ' ||
3487 'nvl(loan.current_phase, ''TERM'') phase, ' ||
3488 'rate_type.meaning rate_type, ' ||
3489 'int_rate_hdr.INTEREST_RATE_NAME index_rate, ' ||
3490 'rate_freq.meaning floating_frequency, ' ||
3491 'pay_freq.meaning payment_frequency, ' ||
3492 'to_char(terms.LOCK_IN_DATE, ''YYYY-MM-DD'') lock_date, ' ||
3493 'to_char(terms.LOCK_TO_DATE, ''YYYY-MM-DD'') lock_exp_date, ' ||
3494 'terms.CEILING_RATE Ceiling_Rate, ' ||
3495 'terms.FLOOR_RATE floor_rate, ' ||
3496 'loan.open_to_term_flag open_to_term, ' ||
3497 'open_to_term.meaning open_to_term_flag, ' ||
3498 'product.loan_product_name loan_product, ' ||
3499 'decode(nvl(loan.current_phase, ''TERM''), ''OPEN'',
3500 to_char(rate_sched1.INDEX_DATE, ''YYYY-MM-DD''), null) open_index_date, ' ||
3501 'decode(nvl(loan.current_phase, ''TERM''), ''OPEN'',
3502 rate_sched1.CURRENT_INTEREST_RATE, null) open_interest_rate, ' ||
3503 'decode(nvl(loan.current_phase, ''TERM''), ''OPEN'',
3504 to_char(rate_sched2.INDEX_DATE, ''YYYY-MM-DD''),
3505 to_char(rate_sched1.INDEX_DATE, ''YYYY-MM-DD'')) term_index_date, ' ||
3506 'decode(nvl(loan.current_phase, ''TERM''), ''OPEN'',
3507 rate_sched2.CURRENT_INTEREST_RATE,
3508 rate_sched1.CURRENT_INTEREST_RATE) term_interest_rate, ' ||
3509 'loan.MULTIPLE_FUNDING_FLAG, ' ||
3510
3511 -- adding disbursement schedule
3512 'CURSOR ' ||
3513 '(select head.DISB_HEADER_ID, ' ||
3514 'head.DISBURSEMENT_NUMBER, ' ||
3515 'to_char(head.TARGET_DATE, ''YYYY-MM-DD'') TARGET_DATE, ' ||
3516 'to_char(head.PAYMENT_REQUEST_DATE, ''YYYY-MM-DD'') PAYMENT_REQUEST_DATE, ' ||
3517 'head.HEADER_PERCENT, ' ||
3518 'to_char(head.HEADER_AMOUNT, :CURRENCY_FORMAT18) f_header_amount, ' ||
3519 'fnd_date.date_to_chardate((select max(DISBURSEMENT_DATE) from lns_disb_lines where DISB_HEADER_ID = head.DISB_HEADER_ID)) DISBURSEMENT_DATE, ' ||
3520 'fund_status.meaning status, ' ||
3521 'fund_act.meaning activity_name ' ||
3522 'from lns_disb_headers head, ' ||
3523 'lns_lookups fund_status, ' ||
3524 'lns_lookups fund_act ' ||
3525 'where head.loan_id = loan.loan_id and ' ||
3526 'fund_status.lookup_type(+) = ''FUNDING_STATUS'' and ' ||
3527 'fund_status.lookup_code(+) = head.STATUS and ' ||
3528 'fund_act.lookup_type(+) = ''DISB_ACTIVITY'' and ' ||
3529 'fund_act.lookup_code(+) = head.ACTIVITY_CODE) ' ||
3530 'AS Disbursement_Schedule, ' ||
3531
3532 -- adding payment history
3533 'CURSOR ' ||
3534 '(select amortization_schedule_id, ' ||
3535 'loan_id, ' ||
3536 'payment_number, ' ||
3537 'to_char(creation_date, ''YYYY-MM-DD'') bill_date, ' ||
3538 'to_char(last_applied_date, ''YYYY-MM-DD'') paid_date, ' ||
3539 'to_char(due_date, ''YYYY-MM-DD'') due_date, ' ||
3540 'to_char(principal_amount, :CURRENCY_FORMAT19) f_principal_amount, ' ||
3541 'to_char(interest_amount, :CURRENCY_FORMAT20) f_interest_amount, ' ||
3542 'to_char(fee_amount, :CURRENCY_FORMAT21) f_fee_amount, ' ||
3543 'to_char(total_billed_amount, :CURRENCY_FORMAT22) f_total_billed_amount, ' ||
3544 'to_char((PRINCIPAL_PAID + INTEREST_PAID + FEE_PAID), :CURRENCY_FORMAT23) f_total_payment_amount, ' ||
3545 'principal_amount principal_amount, ' ||
3546 'interest_amount interest_amount, ' ||
3547 'fee_amount fee_amount, ' ||
3548 'total_billed_amount total_billed_amount, ' ||
3549 '(PRINCIPAL_PAID + INTEREST_PAID + FEE_PAID) total_payment_amount ' ||
3550 'from lns_am_scheds_v payment_history ' ||
3551 'where payment_history.loan_id = loan.loan_id and ' ||
3552 'nvl(payment_history.PHASE, ''TERM'') = nvl(loan.CURRENT_PHASE, ''TERM'') and ' ||
3553 'payment_history.reversed_code = ''N'' and ' ||
3554 '(payment_history.payment_number between (PAY_SUM.next_payment_number - 2) and PAY_SUM.next_payment_number) and ' ||
3555 'payment_history.AMORTIZATION_SCHEDULE_ID < PAY_SUM.next_payment_amortization_id ' ||
3556 'order by payment_history.AMORTIZATION_SCHEDULE_ID) ' ||
3557 'AS Recent_Payment_History ' ||
3558
3559 'FROM lns_loan_headers_all_vl loan, ' ||
3560 'hz_parties party, ' ||
3561 'fnd_territories_tl terr, ' ||
3562 'hr_all_organization_units_tl org, ' ||
3563 'LNS_PAY_SUM_V PAY_SUM, ' ||
3564 'LNS_PAY_SUM_YEARLY_V PAY_SUM_YEARLY, ' ||
3565 'LNS_PAY_SUM_OVERDUE_V PAY_SUM_OVERDUE, ' ||
3566 'lns_amortization_scheds am, ' ||
3567 'hz_locations loc, ' ||
3568 'hz_cust_acct_sites_all acct_site, ' ||
3569 'hz_party_sites site, ' ||
3570 'fnd_currencies_tl curr, ' ||
3571 'hz_parties contact_person, ' ||
3572 'lns_loan_types_vl loan_type, ' ||
3573 'lns_lookups loan_class, ' ||
3574 'lns_lookups periodlkup, ' ||
3575 'lns_lookups loan_subtype, ' ||
3576 'lns_terms terms, ' ||
3577 'lns_int_rate_headers_vl int_rate_hdr, ' ||
3578 'lns_lookups rate_type, ' ||
3579 'lns_lookups rate_freq, ' ||
3580 'lns_lookups pay_freq, ' ||
3581 'fnd_lookups open_to_term, ' ||
3582 'lns_loan_products_vl product, ' ||
3583 'lns_rate_schedules rate_sched1, ' ||
3584 'lns_rate_schedules rate_sched2 ' ||
3585
3586 'WHERE party.party_id = loan.primary_borrower_id and ' ||
3587 'org.organization_id = loan.org_id and ' ||
3588 'org.language = userenv(''LANG'') and ' ||
3589 'acct_site.cust_acct_site_id = loan.bill_to_acct_site_id and ' ||
3590 'acct_site.org_id = loan.org_id and ' ||
3591 'site.party_site_id = acct_site.party_site_id and ' ||
3592 'site.location_id = loc.location_id and ' ||
3593 'loc.country = terr.TERRITORY_CODE and ' ||
3594 'terr.language = userenv(''LANG'') and ' ||
3595 'loan.LOAN_CURRENCY = curr.currency_code and ' ||
3596 'curr.language = userenv(''LANG'') and ' ||
3597 'loan.contact_pers_party_id = contact_person.party_id(+) and ' ||
3598 'loan_type.loan_type_id = loan.loan_type_id AND ' ||
3599 'loan_class.lookup_type = ''LOAN_CLASS'' AND ' ||
3600 'loan_class.lookup_code = loan.loan_class_code AND ' ||
3601 'periodlkup.lookup_type = ''PERIOD'' and ' ||
3602 'periodlkup.lookup_code = loan.loan_term_period and ' ||
3603 'loan_subtype.lookup_type = ''LOAN_SUBTYPE'' and ' ||
3604 'loan_subtype.lookup_code = loan.loan_subtype and ' ||
3605 'loan.loan_id = PAY_SUM.loan_id and ' ||
3606 'loan.loan_id = PAY_SUM_YEARLY.loan_id and ' ||
3607 'loan.loan_id = PAY_SUM_OVERDUE.loan_id and ' ||
3608 'loan.loan_id = terms.loan_id and ' ||
3609 'rate_type.lookup_type = ''RATE_TYPE'' and ' ||
3610 'rate_type.lookup_code = terms.RATE_TYPE and ' ||
3611 'terms.INDEX_RATE_ID = int_rate_hdr.INTEREST_RATE_ID(+) and ' ||
3612 'rate_freq.lookup_type(+) = ''FREQUENCY'' and ' ||
3613 'rate_freq.lookup_code(+) = terms.RATE_CHANGE_FREQUENCY and ' ||
3614 'pay_freq.lookup_type = ''FREQUENCY'' and ' ||
3615 'pay_freq.lookup_code = terms.LOAN_PAYMENT_FREQUENCY and ' ||
3616 'open_to_term.lookup_type = ''YES_NO'' and ' ||
3617 'open_to_term.lookup_code = nvl(loan.open_to_term_flag, ''N'') and ' ||
3618 'loan.product_id = product.LOAN_PRODUCT_ID(+) and ' ||
3619 'rate_sched1.term_id = terms.term_id and ' ||
3620 'rate_sched1.PHASE = nvl(loan.current_phase, ''TERM'') and ' ||
3621 '(decode(am.PAYMENT_NUMBER, 0, rate_sched1.begin_installment_number, -1) = 1 or ' ||
3622 'am.PAYMENT_NUMBER between rate_sched1.begin_installment_number and rate_sched1.end_installment_number) and ' ||
3623 'rate_sched1.end_date_active is null and ' ||
3624 'rate_sched2.term_id = terms.term_id and ' ||
3625 'rate_sched2.PHASE = ''TERM'' and ' ||
3626 'rate_sched2.begin_installment_number = 1 and ' ||
3627 'rate_sched2.end_date_active is null and ' ||
3628 'loan.loan_id = am.loan_id and ' ||
3629 'am.AMORTIZATION_SCHEDULE_ID = PAY_SUM.next_payment_amortization_id and ' ||
3630 'nvl(am.phase, ''TERM'') = nvl(loan.current_phase, ''TERM'') and ' ||
3631 'loan.loan_id = :LOAN_ID';
3632
3633 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Before set new context');
3634 qryCtx := DBMS_XMLQuery.newContext(qry_string);
3635 -- qryCtx := DBMS_XMLGEN.newContext(qry_string);
3636 LogMessage(FND_LOG.LEVEL_STATEMENT, 'After set new context');
3637
3638 -- set the rowset header to null
3639 DBMS_XMLQuery.setRowSetTag(qryCtx, 'LOANSET');
3640 -- DBMS_XMLGEN.setRowSetTag(qryCtx, 'LOANSET');
3641
3642 -- set the row tag name to be LOAN
3643 DBMS_XMLQuery.setRowTag(qryCtx, 'LOAN');
3644 -- DBMS_XMLGEN.setRowTag(qryCtx, 'LOAN');
3645
3646 --Set bind values
3647 DBMS_XMLQuery.setBindValue(qryCtx, 'LOAN_ID', p_loan_id);
3648 -- DBMS_XMLGEN.setBindValue(qryCtx, 'LOAN_ID', p_loan_id);
3649 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT1', l_currency_format_mask);
3650 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT2', l_currency_format_mask);
3651 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT3', l_currency_format_mask);
3652 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT4', l_currency_format_mask);
3653 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT5', l_currency_format_mask);
3654 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT6', l_currency_format_mask);
3655 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT7', l_currency_format_mask);
3656 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT8', l_currency_format_mask);
3657 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT9', l_currency_format_mask);
3658 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT10', l_currency_format_mask);
3659 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT11', l_currency_format_mask);
3660 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT12', l_currency_format_mask);
3661 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT13', l_currency_format_mask);
3662 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT14', l_currency_format_mask);
3663 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT15', l_currency_format_mask);
3664 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT16', l_currency_format_mask);
3665 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT17', l_currency_format_mask);
3666 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT18', l_currency_format_mask);
3667 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT19', l_currency_format_mask);
3668 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT20', l_currency_format_mask);
3669 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT21', l_currency_format_mask);
3670 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT22', l_currency_format_mask);
3671 DBMS_XMLQuery.setBindValue(qryCtx, 'CURRENCY_FORMAT23', l_currency_format_mask);
3672
3673 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Bind value: LOAN_ID = ' || p_loan_id);
3674 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Bind value: CURRENCY_FORMAT = ' || l_currency_format_mask);
3675
3676 -- now get the result
3677 result := DBMS_XMLQuery.getXml(qryCtx);
3678 -- result := DBMS_XMLGEN.getXml(qryCtx);
3679 -- LogMessage(FND_LOG.LEVEL_STATEMENT, 'Result xml: ' || result);
3680
3681 if (result is not null) then
3682
3683 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Generated billing statement');
3684
3685 /* Update amortization table */
3686 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
3687
3688 LNS_AMORTIZATION_SCHEDS_PKG.Update_Statement(
3689 P_AMORTIZATION_SCHEDULE_ID => p_amortization_schedule_id
3690 ,P_STATEMENT_XML => result);
3691
3692 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
3693
3694 else
3695 RAISE FND_API.G_EXC_ERROR;
3696 end if;
3697
3698 --close context
3699 DBMS_XMLQuery.closeContext(qryCtx);
3700 -- DBMS_XMLGEN.closeContext(qryCtx);
3701
3702 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3703
3704 EXCEPTION
3705 WHEN OTHERS THEN
3706 -- Bug#8848035 - Thow the user defined exception if it fails
3707 FND_MESSAGE.SET_NAME('LNS', 'LNS_BILL_STMT_GEN_FAIL');
3708 FND_MSG_PUB.Add;
3709 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3710 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to generate billing statement');
3711 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: ' || sqlerrm);
3712 RAISE FND_API.G_EXC_ERROR;
3713
3714 END GENERATE_BILLING_STATEMENT_XML;
3715
3716 -- this function returns available amount to be billed for the specified date
3717 FUNCTION GET_AVAILABLE_PRIN_AMOUNT(P_LOAN_ID NUMBER, P_DATE DATE) return NUMBER
3718 IS
3719
3720 /*-----------------------------------------------------------------------+
3721 | Local Variable Declarations and initializations |
3722 +-----------------------------------------------------------------------*/
3723 l_api_name CONSTANT VARCHAR2(30) := 'GET_AVAILABLE_PRIN_AMOUNT';
3724 l_billed_amount number;
3725 l_funded_amount number;
3726 l_available_amount number;
3727
3728 /*-----------------------------------------------------------------------+
3729 | Cursor Declarations |
3730 +-----------------------------------------------------------------------*/
3731
3732 CURSOR verify_amount_cur(P_LOAN_ID number) IS
3733 select nvl(sum(am.PRINCIPAL_AMOUNT), 0)
3734 from
3735 LNS_AMORTIZATION_SCHEDS am,
3736 lns_loan_headers head
3737 where
3738 head.loan_id = P_LOAN_ID
3739 and head.loan_id = am.LOAN_ID
3740 and (am.REVERSED_FLAG is null or am.REVERSED_FLAG = 'N')
3741 and nvl(am.PHASE, 'TERM') = nvl(head.CURRENT_PHASE, 'TERM');
3742 BEGIN
3743
3744 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3745
3746 /* verify amount that we will bill */
3747 open verify_amount_cur(P_LOAN_ID);
3748 fetch verify_amount_cur into l_billed_amount;
3749 close verify_amount_cur;
3750 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_billed_amount = ' || l_billed_amount) ;
3751
3752 l_funded_amount := LNS_FINANCIALS.getFundedAmount(P_LOAN_ID, P_DATE, 'CURRENT');
3753 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_funded_amount = ' || l_funded_amount) ;
3754
3755 l_available_amount := l_funded_amount - l_billed_amount;
3756 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_available_amount = ' || l_available_amount) ;
3757
3758 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
3759
3760 return l_available_amount;
3761 END;
3762
3763
3764 PROCEDURE VALIDATE_PRIN_AMOUNT(P_LOAN_ID NUMBER, P_PRIN_AMOUNT NUMBER, P_DATE DATE)
3765 IS
3766
3767 /*-----------------------------------------------------------------------+
3768 | Local Variable Declarations and initializations |
3769 +-----------------------------------------------------------------------*/
3770 l_available_amount number;
3771
3772 /*-----------------------------------------------------------------------+
3773 | Cursor Declarations |
3774 +-----------------------------------------------------------------------*/
3775 BEGIN
3776
3777 l_available_amount := GET_AVAILABLE_PRIN_AMOUNT(P_LOAN_ID, P_DATE);
3778
3779 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_PRIN_AMOUNT = ' || P_PRIN_AMOUNT) ;
3780
3781 if P_PRIN_AMOUNT > l_available_amount then
3782 -- FND_MESSAGE.SET_ENCODED('Principal bill amount cannot be greater than ' || l_valid_amount);
3783 FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_PRIN_BILL_AMOUNT');
3784 FND_MSG_PUB.Add;
3785 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3786 RAISE FND_API.G_EXC_ERROR;
3787 end if;
3788
3789 END;
3790
3791
3792
3793 /*========================================================================
3794 | PRIVATE PROCEDURE BILL_SINGLE_LOAN
3795 |
3796 | DESCRIPTION
3797 | This procedure process a single loan.
3798 |
3799 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
3800 | BILL_LOANS
3801 |
3802 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
3803 | LogMessage
3804 | CREATE_AR_INVOICES
3805 |
3806 | PARAMETERS
3807 | P_LOAN_REC IN OUT NOCOPY Loan record to bill
3808 |
3809 | KNOWN ISSUES
3810 | None
3811 |
3812 | NOTES
3813 | Any interesting aspect of the code in the package body which needs
3814 | to be stated.
3815 |
3816 | MODIFICATION HISTORY
3817 | Date Author Description of Changes
3818 | 01-01-2004 scherkas Created
3819 |
3820 *=======================================================================*/
3821 PROCEDURE BILL_SINGLE_LOAN(
3822 P_API_VERSION IN NUMBER,
3823 P_INIT_MSG_LIST IN VARCHAR2,
3824 P_COMMIT IN VARCHAR2,
3825 P_VALIDATION_LEVEL IN NUMBER,
3826 P_LOAN_REC IN OUT NOCOPY LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC,
3827 X_STATEMENT_XML OUT NOCOPY CLOB,
3828 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
3829 X_MSG_COUNT OUT NOCOPY NUMBER,
3830 X_MSG_DATA OUT NOCOPY VARCHAR2)
3831 IS
3832
3833 /*-----------------------------------------------------------------------+
3834 | Local Variable Declarations and initializations |
3835 +-----------------------------------------------------------------------*/
3836
3837 l_api_name CONSTANT VARCHAR2(30) := 'BILL_SINGLE_LOAN';
3838 l_api_version CONSTANT NUMBER := 1.0;
3839 l_return_status VARCHAR2(1);
3840 l_msg_count NUMBER;
3841 l_msg_data VARCHAR2(32767);
3842 l_org_id number;
3843 l_Count number;
3844 l_header_id number;
3845 l_Count1 number;
3846 l_prin_bal number;
3847 l_billed_0th_yn varchar2(1);
3848 l_do_billing number;
3849 l_offset number(38);
3850 l_statement_xml clob;
3851 l_prin_balance number;
3852 l_start date;
3853 l_end date;
3854 -- l_floating_flag varchar2(1);
3855 l_create_zero_instal varchar2(1);
3856 l_profile_name VARCHAR2(240);
3857
3858 l_loan_header_rec LNS_LOAN_HEADER_PUB.loan_header_rec_type;
3859 l_amortization_rec LNS_FINANCIALS.AMORTIZATION_REC;
3860 l_lines_tbl LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
3861 l_fee_tbl LNS_FINANCIALS.FEES_TBL;
3862 l_is_disable_bill varchar2(1);
3863
3864 /*-----------------------------------------------------------------------+
3865 | Cursor Declarations |
3866 +-----------------------------------------------------------------------*/
3867
3868 /* check to start billing for 0-th installment */
3869 CURSOR do_billing_cur(C_LOAN_ID number, C_PHASE varchar2) IS
3870 select nvl(count(1),0)
3871 from lns_fee_assignments
3872 where begin_installment_number = 0
3873 and end_installment_number = 0
3874 and end_date_active is null
3875 and (billing_option = 'ORIGINATION'
3876 -- Only for Term Pase, check the Event_conversion Fees
3877 OR billing_option = decode(nvl(C_PHASE, 'TERM'), 'TERM','TERM_CONVERSION', null)
3878 )
3879 and loan_id = C_LOAN_ID
3880 and phase = C_PHASE;
3881
3882 /* get statement after its billed */
3883 CURSOR get_statement_cur(P_LOAN_ID number) IS
3884 select STATEMENT_XML
3885 from LNS_LOAN_HEADERS loan,
3886 lns_amortization_scheds am
3887 where loan.loan_id = am.loan_id and
3888 am.AMORTIZATION_SCHEDULE_ID = loan.LAST_AMORTIZATION_ID and
3889 am.PAYMENT_NUMBER = loan.LAST_PAYMENT_NUMBER and
3890 loan.loan_id = P_LOAN_ID;
3891
3892 -- getting loan version
3893 CURSOR loan_version_cur(P_LOAN_ID number) IS
3894 select OBJECT_VERSION_NUMBER
3895 from LNS_LOAN_HEADERS
3896 where LOAN_ID = P_LOAN_ID;
3897 /*
3898 cursor cur_floating(p_loan_id number, p_phase varchar2, p_installment number) is
3899 select nvl(floating_flag, 'N')
3900 from lns_rate_schedules rs
3901 ,lns_terms t
3902 where t.loan_id = p_loan_id
3903 and t.term_id = rs.term_id
3904 and rs.end_date_active is null
3905 and rs.phase = p_phase
3906 and p_installment between rs.begin_installment_number and rs.end_installment_number;
3907 */
3908 BEGIN
3909
3910 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
3911
3912 -- Standard start of API savepoint
3913 SAVEPOINT PROCESS_SINGLE_LOAN_PVT;
3914 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
3915
3916 -- Standard call to check for call compatibility
3917 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3918 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3919 END IF;
3920
3921 -- Initialize message list if p_init_msg_list is set to TRUE
3922 IF FND_API.To_Boolean(p_init_msg_list) THEN
3923 FND_MSG_PUB.initialize;
3924 END IF;
3925
3926 -- Initialize API return status to success
3927 l_return_status := FND_API.G_RET_STS_SUCCESS;
3928
3929 -- START OF BODY OF API
3930
3931
3932 dbms_lob.createtemporary(X_STATEMENT_XML, FALSE, DBMS_LOB.CALL);
3933 dbms_lob.open(X_STATEMENT_XML, dbms_lob.lob_readwrite);
3934
3935 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing loan ' || P_LOAN_REC.LOAN_NUMBER);
3936 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'LOAN ID: ' || P_LOAN_REC.LOAN_ID);
3937 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'LOAN DESCRIPTION: ' || P_LOAN_REC.LOAN_DESCRIPTION);
3938 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || P_LOAN_REC.FUNDED_AMOUNT);
3939 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FIRST_PAYMENT_DATE: ' || P_LOAN_REC.FIRST_PAYMENT_DATE);
3940 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
3941 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || P_LOAN_REC.BILLED_FLAG);
3942 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || P_LOAN_REC.LOAN_CURRENCY);
3943 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || P_LOAN_REC.CUST_ACCOUNT_ID);
3944 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || P_LOAN_REC.BILL_TO_ADDRESS_ID);
3945 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || P_LOAN_REC.CUSTOM_PAYMENTS_FLAG);
3946 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_PAYMENT_FREQUENCY: ' || P_LOAN_REC.LOAN_PAYMENT_FREQUENCY);
3947 LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || P_LOAN_REC.NUMBER_GRACE_DAYS);
3948 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || P_LOAN_REC.PAYMENT_APPLICATION_ORDER);
3949 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || P_LOAN_REC.EXCHANGE_RATE_TYPE);
3950 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || P_LOAN_REC.EXCHANGE_DATE);
3951 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || P_LOAN_REC.EXCHANGE_RATE);
3952 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'ORG ID: ' || P_LOAN_REC.ORG_ID);
3953 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'LE ID: ' || P_LOAN_REC.LEGAL_ENTITY_ID);
3954 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'CURRENT_PHASE: ' || P_LOAN_REC.CURRENT_PHASE);
3955
3956 /* Check for loan data */
3957 if P_LOAN_REC.PAYMENT_APPLICATION_ORDER is null or
3958 P_LOAN_REC.FIRST_PAYMENT_DATE is null or
3959 P_LOAN_REC.NEXT_PAYMENT_DUE_DATE is null or
3960 P_LOAN_REC.LOAN_PAYMENT_FREQUENCY is null then
3961
3962 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan misses some important data. Cannot proceed with billing of this loan.');
3963 FND_MESSAGE.SET_NAME('LNS', 'LNS_LOAN_MISS_DATA');
3964 FND_MESSAGE.SET_TOKEN('LOAN', P_LOAN_REC.LOAN_NUMBER);
3965 FND_MSG_PUB.Add;
3966 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
3967 RAISE FND_API.G_EXC_ERROR;
3968
3969 end if;
3970
3971 /* getting current payment number */
3972 P_LOAN_REC.NEXT_PAYMENT_NUMBER := LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER_EXT_2(P_LOAN_REC.LOAN_ID);
3973
3974 if P_LOAN_REC.NEXT_PAYMENT_NUMBER = -1 then
3975
3976 P_LOAN_REC.NEXT_PAYMENT_NUMBER := 0;
3977
3978 /* check to start billing for 0-th installment */
3979 open do_billing_cur(P_LOAN_REC.LOAN_ID, P_LOAN_REC.CURRENT_PHASE);
3980 fetch do_billing_cur into l_do_billing;
3981 close do_billing_cur;
3982
3983 if l_do_billing > 0 then
3984
3985 LNS_BILLING_BATCH_PUB.PREBILL_SINGLE_LOAN(
3986 P_API_VERSION => 1.0,
3987 P_INIT_MSG_LIST => FND_API.G_TRUE,
3988 P_COMMIT => FND_API.G_FALSE,
3989 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
3990 P_LOAN_ID => P_LOAN_REC.LOAN_ID,
3991 X_BILLED_YN => l_billed_0th_yn,
3992 x_return_status => l_return_status,
3993 x_msg_count => l_msg_count,
3994 x_msg_data => l_msg_data);
3995
3996 if l_return_status <> 'S' then
3997 RAISE FND_API.G_EXC_ERROR;
3998 end if;
3999
4000 if l_billed_0th_yn = 'Y' then
4001
4002 /* get statement after its billed */
4003 open get_statement_cur(P_LOAN_REC.LOAN_ID);
4004 fetch get_statement_cur into l_statement_xml;
4005 close get_statement_cur;
4006
4007 /* remove xml header */
4008 l_offset := DBMS_LOB.INSTR(lob_loc => l_statement_xml,
4009 pattern => '>',
4010 offset => 1,
4011 nth => 1);
4012 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have removed header from the statement');
4013
4014 /* copy generated statement to output */
4015 dbms_lob.copy(dest_lob => X_STATEMENT_XML,
4016 src_lob => l_statement_xml,
4017 amount => dbms_lob.getlength(l_statement_xml)-l_offset,
4018 src_offset => l_offset+1);
4019
4020 x_return_status := l_return_status; --fix for bug 8830573
4021 return;
4022 end if;
4023
4024 end if;
4025
4026 end if;
4027
4028 /* setting next payment number */
4029 P_LOAN_REC.NEXT_PAYMENT_NUMBER := P_LOAN_REC.NEXT_PAYMENT_NUMBER + 1;
4030 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || P_LOAN_REC.NEXT_PAYMENT_NUMBER);
4031
4032 /* new principal and interest amounts from getInstallment api */
4033
4034 if P_LOAN_REC.CURRENT_PHASE = 'TERM' then
4035
4036 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
4037 l_start := sysdate;
4038 lns_financials.getInstallment(
4039 p_api_version => 1.0,
4040 p_init_msg_list => FND_API.G_TRUE,
4041 p_commit => FND_API.G_FALSE,
4042 p_loan_Id => P_LOAN_REC.LOAN_ID,
4043 p_installment_number => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4044 x_amortization_rec => l_amortization_rec,
4045 x_fees_tbl => l_fee_tbl,
4046 X_RETURN_STATUS => l_return_status,
4047 X_MSG_COUNT => l_msg_count,
4048 X_MSG_DATA => l_msg_data);
4049
4050 l_end := sysdate;
4051 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'getInstallment Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4052
4053 else
4054
4055 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getOpenInstallment...');
4056 l_start := sysdate;
4057 lns_financials.getOpenInstallment(
4058 p_init_msg_list => FND_API.G_TRUE,
4059 p_loan_Id => P_LOAN_REC.LOAN_ID,
4060 p_installment_number => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4061 x_amortization_rec => l_amortization_rec,
4062 x_fees_tbl => l_fee_tbl,
4063 X_RETURN_STATUS => l_return_status,
4064 X_MSG_COUNT => l_msg_count,
4065 X_MSG_DATA => l_msg_data);
4066
4067 l_end := sysdate;
4068 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'getOpenInstallment Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4069
4070 end if;
4071
4072 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4073 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
4074
4075 if l_return_status <> 'S' then
4076 RAISE FND_API.G_EXC_ERROR;
4077 end if;
4078
4079 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Data returned from lns_financials.getInstallment:');
4080 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
4081 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
4082 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_amortization_rec.PRINCIPAL_AMOUNT);
4083 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_amortization_rec.INTEREST_AMOUNT);
4084 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DEFERRED_INT_AMOUNT: ' || l_amortization_rec.DEFERRED_INT_AMOUNT);
4085 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURR_CAP_INT_AMOUNT: ' || l_amortization_rec.CURR_CAP_INT_AMOUNT);
4086 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CAP_INT_AMOUNT: ' || l_amortization_rec.CAP_INT_AMOUNT);
4087 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EARLY_PAY_CR_AMOUNT: ' || l_amortization_rec.EARLY_PAY_CR_AMOUNT);
4088 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_amortization_rec.FEE_AMOUNT);
4089
4090 P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT := l_amortization_rec.PRINCIPAL_AMOUNT;
4091 P_LOAN_REC.NEXT_INTEREST_AMOUNT := l_amortization_rec.INTEREST_AMOUNT;
4092 P_LOAN_REC.NEXT_FEE_AMOUNT := l_amortization_rec.FEE_AMOUNT;
4093 P_LOAN_REC.RATE_ID := l_amortization_rec.RATE_ID;
4094 P_LOAN_REC.NEXT_PAYMENT_DUE_DATE := l_amortization_rec.due_date;
4095
4096 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Checking the Disable_billing_flag in '||l_api_name);
4097 l_is_disable_bill := IS_BILLING_DISABLED(P_LOAN_REC.LOAN_ID);
4098 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_is_disable_bill is '||l_is_disable_bill);
4099 IF l_is_disable_bill = 'Y' THEN
4100 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: BILLING is Disabled for the loan '||p_loan_rec.loan_number);
4101 FND_MESSAGE.SET_NAME('LNS', 'LNS_BILLING_DISABLED');
4102 FND_MESSAGE.SET_TOKEN('LOAN_NUMBER', p_loan_rec.loan_number);
4103 FND_MSG_PUB.Add;
4104 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
4105 RAISE FND_API.G_EXC_ERROR;
4106 END IF;
4107
4108
4109 /* checking for returned values */
4110 if l_amortization_rec.INSTALLMENT_NUMBER is null and
4111 l_amortization_rec.due_date is null
4112 then
4113
4114 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'lns_financials.getInstallment returns no data. Nothing to bill. Returning.');
4115 return;
4116
4117 end if;
4118
4119 if (P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT is null or P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT = 0) and
4120 (P_LOAN_REC.NEXT_INTEREST_AMOUNT is null or P_LOAN_REC.NEXT_INTEREST_AMOUNT = 0) and
4121 (P_LOAN_REC.NEXT_FEE_AMOUNT is null or P_LOAN_REC.NEXT_FEE_AMOUNT = 0)
4122 then
4123
4124 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All amounts returned from lns_financials.getInstallment = 0. ');
4125
4126 -- fix for bug 7000066: get LNS_CREATE_ZERO_INSTAL profile value to see if we need to create 0 amount installment
4127 l_create_zero_instal := NVL(FND_PROFILE.VALUE('LNS_CREATE_ZERO_INSTAL'), 'N');
4128 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LNS_CREATE_ZERO_INSTAL profile: ' || l_create_zero_instal);
4129
4130 if l_create_zero_instal = 'N' then
4131
4132 select USER_PROFILE_OPTION_NAME into l_profile_name
4133 from FND_PROFILE_OPTIONS_VL
4134 where PROFILE_OPTION_NAME = 'LNS_CREATE_ZERO_INSTAL';
4135
4136 FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_BILL_ZERO_AMOUNT');
4137 FND_MESSAGE.SET_TOKEN('PROFILE', l_profile_name);
4138 FND_MSG_PUB.Add;
4139 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
4140 RAISE FND_API.G_EXC_ERROR;
4141 -- return;
4142 end if;
4143
4144 end if;
4145
4146 /* adding principal and interest amounts into lines table */
4147 l_Count1 := 1;
4148 l_lines_tbl(l_Count1).LINE_TYPE := 'PRIN';
4149 l_lines_tbl(l_Count1).LINE_AMOUNT := P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT;
4150
4151 if l_amortization_rec.INTEREST_AMOUNT > 0 and l_amortization_rec.CURR_CAP_INT_AMOUNT = 0 then
4152
4153 if l_amortization_rec.NORMAL_INT_AMOUNT > 0 or l_amortization_rec.ADD_PRIN_INT_AMOUNT > 0 or
4154 l_amortization_rec.ADD_INT_INT_AMOUNT > 0 or l_amortization_rec.PENAL_INT_AMOUNT > 0 or
4155 l_amortization_rec.PREV_DEFERRED_INT_AMOUNT > 0 or l_amortization_rec.PREV_CAP_INT_AMOUNT > 0
4156 then
4157
4158 if l_amortization_rec.NORMAL_INT_AMOUNT > 0 then
4159 l_Count1 := l_Count1 + 1;
4160 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4161 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.NORMAL_INT_DETAILS;
4162 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.NORMAL_INT_AMOUNT;
4163 l_lines_tbl(l_Count1).LINE_DESC := 'Normal Interest';
4164 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4165 end if;
4166 if l_amortization_rec.ADD_PRIN_INT_AMOUNT > 0 then
4167 l_Count1 := l_Count1 + 1;
4168 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4169 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.ADD_PRIN_INT_DETAILS;
4170 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.ADD_PRIN_INT_AMOUNT;
4171 l_lines_tbl(l_Count1).LINE_DESC := 'Additional Interest on Unpaid Principal';
4172 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4173 end if;
4174 if l_amortization_rec.ADD_INT_INT_AMOUNT > 0 then
4175 l_Count1 := l_Count1 + 1;
4176 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4177 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.ADD_INT_INT_DETAILS;
4178 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.ADD_INT_INT_AMOUNT;
4179 l_lines_tbl(l_Count1).LINE_DESC := 'Additional Interest on Unpaid Interest';
4180 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4181 end if;
4182 if l_amortization_rec.PENAL_INT_AMOUNT > 0 then
4183 l_Count1 := l_Count1 + 1;
4184 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4185 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.PENAL_INT_DETAILS;
4186 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.PENAL_INT_AMOUNT;
4187 l_lines_tbl(l_Count1).LINE_DESC := 'Penal Interest';
4188 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4189 end if;
4190 if l_amortization_rec.PREV_DEFERRED_INT_AMOUNT > 0 then
4191 l_Count1 := l_Count1 + 1;
4192 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4193 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.DEFERRED_INT_DETAILS;
4194 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.PREV_DEFERRED_INT_AMOUNT;
4195 l_lines_tbl(l_Count1).LINE_DESC := 'Previously Deferred Interest';
4196 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4197 end if;
4198 if l_amortization_rec.PREV_CAP_INT_AMOUNT > 0 then
4199 l_Count1 := l_Count1 + 1;
4200 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4201 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.CAP_INT_DETAILS;
4202 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.PREV_CAP_INT_AMOUNT;
4203 l_lines_tbl(l_Count1).LINE_DESC := 'Previously Capitalized Interest';
4204 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4205 end if;
4206 if l_amortization_rec.EARLY_PAY_CR_AMOUNT < 0 then
4207 l_Count1 := l_Count1 + 1;
4208 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4209 l_lines_tbl(l_Count1).LINE_DETAILS := l_amortization_rec.EARLY_PAY_CR_DETAILS;
4210 l_lines_tbl(l_Count1).LINE_AMOUNT := l_amortization_rec.EARLY_PAY_CR_AMOUNT;
4211 l_lines_tbl(l_Count1).LINE_DESC := 'Interest Credit for Early Payment';
4212 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Adding ' || l_lines_tbl(l_Count1).LINE_DESC || ' = ' || l_lines_tbl(l_Count1).LINE_AMOUNT);
4213 end if;
4214
4215 else
4216
4217 l_Count1 := l_Count1 + 1;
4218 l_lines_tbl(l_Count1).LINE_TYPE := 'INT';
4219 l_lines_tbl(l_Count1).LINE_AMOUNT := P_LOAN_REC.NEXT_INTEREST_AMOUNT;
4220
4221 end if;
4222
4223 -- else
4224 -- l_curr_cap_int_amount := P_LOAN_REC.NEXT_INTEREST_AMOUNT;
4225 -- P_LOAN_REC.NEXT_INTEREST_AMOUNT := 0;
4226 end if;
4227
4228 /* adding fee amounts into lines table */
4229 FOR l_Count IN 1..l_fee_tbl.count LOOP
4230
4231 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fee #' || l_Count || ' Name: ' || l_fee_tbl(l_Count).FEE_NAME || ' Amount: ' || l_fee_tbl(l_Count).FEE_AMOUNT);
4232
4233 l_Count1 := l_Count1 + 1;
4234 l_lines_tbl(l_Count1).LINE_REF_ID := l_fee_tbl(l_Count).FEE_ID;
4235 l_lines_tbl(l_Count1).LINE_TYPE := 'FEE';
4236 l_lines_tbl(l_Count1).LINE_DESC := l_fee_tbl(l_Count).FEE_NAME;
4237 l_lines_tbl(l_Count1).LINE_AMOUNT := l_fee_tbl(l_Count).FEE_AMOUNT;
4238 l_lines_tbl(l_Count1).FEE_SCHEDULE_ID := l_fee_tbl(l_Count).FEE_SCHEDULE_ID;
4239
4240 /* added fee installment validation by raverma request */
4241 if l_amortization_rec.INSTALLMENT_NUMBER <> l_fee_tbl(l_Count).FEE_INSTALLMENT then
4242
4243 FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_FEE_INSTAL');
4244 FND_MSG_PUB.Add;
4245 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4246 RAISE FND_API.G_EXC_ERROR;
4247
4248 end if;
4249
4250 /* updating LNS_FEE_SCHEDULES with billed_flag = Y */
4251 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_FEE_SCHEDULES with billed_flag = Y ...');
4252 UPDATE LNS_FEE_SCHEDULES
4253 SET
4254 BILLED_FLAG = 'Y',
4255 last_update_date = LNS_UTILITY_PUB.LAST_UPDATE_DATE,
4256 last_updated_by = LNS_UTILITY_PUB.LAST_UPDATED_BY,
4257 last_update_login = LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
4258 WHERE
4259 FEE_SCHEDULE_ID = l_fee_tbl(l_Count).fee_schedule_id;
4260 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_FEE_SCHEDULES');
4261
4262 END LOOP;
4263
4264 /* validate principal amount */
4265 VALIDATE_PRIN_AMOUNT(P_LOAN_REC.LOAN_ID, P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, P_LOAN_REC.NEXT_PAYMENT_DUE_DATE);
4266
4267 /* late date */
4268 P_LOAN_REC.NEXT_PAYMENT_LATE_DATE := P_LOAN_REC.NEXT_PAYMENT_DUE_DATE + nvl(P_LOAN_REC.NUMBER_GRACE_DAYS, 0);
4269
4270 P_LOAN_REC.PRINCIPAL_BALANCE := null;
4271 if P_LOAN_REC.CURRENT_PHASE is not null and P_LOAN_REC.CURRENT_PHASE = 'OPEN' then
4272 P_LOAN_REC.PRINCIPAL_BALANCE := P_LOAN_REC.FUNDED_AMOUNT;
4273 end if;
4274 P_LOAN_REC.FUNDED_AMOUNT := l_amortization_rec.FUNDED_AMOUNT;
4275 P_LOAN_REC.DEFERRED_INT_AMOUNT := l_amortization_rec.DEFERRED_INT_AMOUNT;
4276 P_LOAN_REC.CURR_CAP_INT_AMOUNT := l_amortization_rec.CURR_CAP_INT_AMOUNT;
4277 P_LOAN_REC.CAP_INT_AMOUNT := l_amortization_rec.CAP_INT_AMOUNT;
4278
4279 /* creating AR invoices */
4280 CREATE_AR_INVOICES(P_LOAN_REC, l_lines_tbl);
4281
4282 /* updating loan header table */
4283
4284 -- getting loan version
4285 open loan_version_cur(P_LOAN_REC.LOAN_ID);
4286 fetch loan_version_cur into P_LOAN_REC.OBJECT_VERSION_NUMBER;
4287 close loan_version_cur;
4288
4289 l_loan_header_rec.loan_id := P_LOAN_REC.LOAN_ID;
4290 l_loan_header_rec.BILLED_FLAG := 'Y';
4291 l_loan_header_rec.LAST_BILLED_DATE := sysdate;
4292
4293 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating loan header info w following values:');
4294 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || l_loan_header_rec.BILLED_FLAG);
4295 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LAST_BILLED_DATE: ' || l_loan_header_rec.LAST_BILLED_DATE);
4296
4297 LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => P_LOAN_REC.OBJECT_VERSION_NUMBER,
4298 P_LOAN_HEADER_REC => l_loan_header_rec,
4299 P_INIT_MSG_LIST => FND_API.G_FALSE,
4300 X_RETURN_STATUS => l_return_status,
4301 X_MSG_COUNT => l_msg_count,
4302 X_MSG_DATA => l_msg_data);
4303
4304 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4305
4306 IF l_return_status = 'S' THEN
4307 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
4308 ELSE
4309 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_LOAN_HEADER_PUB.UPDATE_LOAN returned error: ' || substr(l_msg_data,1,225));
4310 FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
4311 FND_MSG_PUB.Add;
4312 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4313 RAISE FND_API.G_EXC_ERROR;
4314 END IF;
4315
4316 STORE_LAST_PAYMENT_NUMBER(P_LOAN_REC.LOAN_ID);
4317
4318 /* Generate xml for printable billing statement */
4319 l_start := sysdate;
4320
4321 GENERATE_BILLING_STATEMENT_XML(
4322 p_loan_id => P_LOAN_REC.LOAN_ID,
4323 p_amortization_schedule_id => P_LOAN_REC.NEXT_AMORTIZATION_ID);
4324
4325 l_end := sysdate;
4326 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Statement generation timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4327
4328 /* get statement after it stored in db */
4329 open get_statement_cur(P_LOAN_REC.LOAN_ID);
4330 fetch get_statement_cur into l_statement_xml;
4331 close get_statement_cur;
4332
4333 /* remove xml header */
4334 l_offset := DBMS_LOB.INSTR(lob_loc => l_statement_xml,
4335 pattern => '>',
4336 offset => 1,
4337 nth => 1);
4338 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have removed header from the statement');
4339 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_offset: ' || l_offset);
4340
4341 /* copy generated statement to output */
4342 dbms_lob.copy(dest_lob => X_STATEMENT_XML,
4343 src_lob => l_statement_xml,
4344 amount => dbms_lob.getlength(l_statement_xml)-l_offset,
4345 src_offset => l_offset+1);
4346 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Have copied generated statement to output');
4347
4348 if P_COMMIT = FND_API.G_TRUE then
4349 COMMIT WORK;
4350 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan ' || P_LOAN_REC.LOAN_NUMBER);
4351 end if;
4352
4353 -- END OF BODY OF API
4354 x_return_status := FND_API.G_RET_STS_SUCCESS;
4355
4356 -- Standard call to get message count and if count is 1, get message info
4357 FND_MSG_PUB.Count_And_Get(
4358 p_encoded => FND_API.G_FALSE,
4359 p_count => x_msg_count,
4360 p_data => x_msg_data);
4361
4362 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully processed loan ' || P_LOAN_REC.LOAN_NUMBER);
4363 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
4364
4365 EXCEPTION
4366 WHEN FND_API.G_EXC_ERROR THEN
4367 ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4368 x_return_status := FND_API.G_RET_STS_ERROR;
4369 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4370 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4371 g_cr_return_status := 'WARNING';
4372
4373 /* building error statement */
4374 BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4375 P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4376 P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4377 P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4378 P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4379 P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4380 P_ERR_COUNT => x_msg_count,
4381 X_STATEMENT_XML => X_STATEMENT_XML);
4382
4383 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4384 ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4385 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4386 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4387 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4388 g_cr_return_status := 'WARNING';
4389
4390 /* building error statement */
4391 BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4392 P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4393 P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4394 P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4395 P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4396 P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4397 P_ERR_COUNT => x_msg_count,
4398 X_STATEMENT_XML => X_STATEMENT_XML);
4399
4400 WHEN OTHERS THEN
4401 ROLLBACK TO PROCESS_SINGLE_LOAN_PVT;
4402 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4403 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
4404 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
4405 END IF;
4406 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4407 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_REC.LOAN_NUMBER);
4408 g_cr_return_status := 'WARNING';
4409
4410 /* building error statement */
4411 BUILD_ERROR_STATEMENT(P_LOAN_ID => P_LOAN_REC.LOAN_ID,
4412 P_PAYMENT_NUMBER => P_LOAN_REC.NEXT_PAYMENT_NUMBER,
4413 P_PRIN_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_PRINCIPAL_AMOUNT, 0),
4414 P_INT_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_INTEREST_AMOUNT, 0),
4415 P_FEE_AMOUNT_DUE => nvl(P_LOAN_REC.NEXT_FEE_AMOUNT, 0),
4416 P_DUE_DATE => P_LOAN_REC.NEXT_PAYMENT_DUE_DATE,
4417 P_ERR_COUNT => x_msg_count,
4418 X_STATEMENT_XML => X_STATEMENT_XML);
4419
4420 END;
4421
4422 /*========================================================================
4423 | PRIVATE PROCEDURE CALC_SINGLE_LOAN_NEXT_DD
4424 |
4425 | DESCRIPTION
4426 | This procedure recalculates next payment due date for single loan
4427 |
4428 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4429 | CALC_PAST_DUE_LOANS_NEXT_DD
4430 |
4431 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4432 | LogMessage
4433 |
4434 | PARAMETERS
4435 | P_LOAN_NEXT_DD_REC IN Loan record that needs new due date
4436 |
4437 | KNOWN ISSUES
4438 | None
4439 |
4440 | NOTES
4441 | Any interesting aspect of the code in the package body which needs
4442 | to be stated.
4443 |
4444 | MODIFICATION HISTORY
4445 | Date Author Description of Changes
4446 | 01-01-2004 scherkas Created
4447 |
4448 *=======================================================================*/
4449 PROCEDURE CALC_SINGLE_LOAN_NEXT_DD(
4450 P_API_VERSION IN NUMBER,
4451 P_INIT_MSG_LIST IN VARCHAR2,
4452 P_COMMIT IN VARCHAR2,
4453 P_VALIDATION_LEVEL IN NUMBER,
4454 P_LOAN_NEXT_DD_REC IN LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC,
4455 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
4456 X_MSG_COUNT OUT NOCOPY NUMBER,
4457 X_MSG_DATA OUT NOCOPY VARCHAR2)
4458 IS
4459
4460 /*-----------------------------------------------------------------------+
4461 | Local Variable Declarations and initializations |
4462 +-----------------------------------------------------------------------*/
4463
4464 l_api_name CONSTANT VARCHAR2(30) := 'CALC_SINGLE_LOAN_NEXT_DD';
4465 l_api_version CONSTANT NUMBER := 1.0;
4466 l_return_status VARCHAR2(1);
4467 l_msg_count NUMBER;
4468 l_msg_data VARCHAR2(32767);
4469 l_next_payment_due_date date;
4470 l_object_version_number number;
4471 l_term_id number;
4472 l_version_number number;
4473 l_prin_bal number;
4474 l_cur_phase varchar2(30);
4475 l_end date;
4476 l_start date;
4477
4478 l_loan_header_rec LNS_LOAN_HEADER_PUB.loan_header_rec_type;
4479 l_amortization_rec lns_financials.AMORTIZATION_REC;
4480 l_term_rec LNS_TERMS_PUB.loan_term_rec_type;
4481
4482 /*-----------------------------------------------------------------------+
4483 | Cursor Declarations |
4484 +-----------------------------------------------------------------------*/
4485
4486 CURSOR term_version_cur(P_LOAN_ID number) IS
4487 select TERM_ID,
4488 OBJECT_VERSION_NUMBER
4489 from LNS_TERMS
4490 where LOAN_ID = P_LOAN_ID;
4491
4492 /* get loan current phase */
4493 CURSOR loan_cur_phase_cur(P_LOAN_ID number) IS
4494 select nvl(CURRENT_PHASE, 'TERM')
4495 from LNS_LOAN_HEADERS
4496 where LOAN_ID = P_LOAN_ID;
4497
4498 BEGIN
4499
4500 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4501 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
4502
4503 -- Standard start of API savepoint
4504 SAVEPOINT SINGLE_LOAN_NEXT_DD_PVT;
4505 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
4506
4507 -- Standard call to check for call compatibility
4508 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4509 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4510 END IF;
4511
4512 -- Initialize message list if p_init_msg_list is set to TRUE
4513 IF FND_API.To_Boolean(p_init_msg_list) THEN
4514 FND_MSG_PUB.initialize;
4515 END IF;
4516
4517 -- Initialize API return status to success
4518 l_return_status := FND_API.G_RET_STS_SUCCESS;
4519
4520 -- START OF BODY OF API
4521 l_start := sysdate;
4522
4523 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4524 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id: ' || P_LOAN_NEXT_DD_REC.LOAN_ID);
4525 LogMessage(FND_LOG.LEVEL_STATEMENT, 'object_version: ' || P_LOAN_NEXT_DD_REC.OBJECT_VERSION_NUMBER);
4526 LogMessage(FND_LOG.LEVEL_STATEMENT, 'next_payment_number: ' || P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER);
4527 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || P_LOAN_NEXT_DD_REC.CUSTOM_PAYMENTS_FLAG);
4528
4529 /* get loan current phase */
4530 open loan_cur_phase_cur(P_LOAN_NEXT_DD_REC.LOAN_ID);
4531 fetch loan_cur_phase_cur into l_cur_phase;
4532 close loan_cur_phase_cur;
4533
4534 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_cur_phase);
4535 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting next payment due date from lns_financials.preProcessInstallment...');
4536
4537 if l_cur_phase = 'TERM' then
4538 lns_financials.preProcessInstallment(
4539 P_API_VERSION => 1.0,
4540 P_INIT_MSG_LIST => FND_API.G_FALSE,
4541 P_COMMIT => FND_API.G_FALSE,
4542 p_loan_Id => P_LOAN_NEXT_DD_REC.LOAN_ID,
4543 p_installment_number => P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER,
4544 X_AMORTIZATION_REC => l_amortization_rec,
4545 X_RETURN_STATUS => l_return_status,
4546 X_MSG_COUNT => l_msg_count,
4547 X_MSG_DATA => l_msg_data);
4548 else
4549 lns_financials.preProcessOpenInstallment(
4550 -- P_API_VERSION => 1.0,
4551 P_INIT_MSG_LIST => FND_API.G_FALSE,
4552 P_COMMIT => FND_API.G_FALSE,
4553 p_loan_Id => P_LOAN_NEXT_DD_REC.LOAN_ID,
4554 p_installment_number => P_LOAN_NEXT_DD_REC.NEXT_PAYMENT_NUMBER,
4555 X_AMORTIZATION_REC => l_amortization_rec,
4556 X_RETURN_STATUS => l_return_status,
4557 X_MSG_COUNT => l_msg_count,
4558 X_MSG_DATA => l_msg_data);
4559 end if;
4560
4561 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Returns from lns_financials.preProcessInstallment:');
4562 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
4563 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
4564
4565 l_next_payment_due_date := l_amortization_rec.due_date;
4566
4567 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'next_payment_due_date: ' || l_next_payment_due_date);
4568
4569 if l_next_payment_due_date is null then
4570
4571 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Next installment date is unknown.');
4572 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_INST_DUE_DATE');
4573 FND_MSG_PUB.Add;
4574 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4575 -- RAISE FND_API.G_EXC_ERROR;
4576
4577 end if;
4578
4579 /* Updating loan header */
4580 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_LOAN_HEADER_ALL table...');
4581
4582 l_loan_header_rec.loan_id := P_LOAN_NEXT_DD_REC.LOAN_ID;
4583 l_loan_header_rec.BILLED_FLAG := 'N';
4584 l_object_version_number := P_LOAN_NEXT_DD_REC.OBJECT_VERSION_NUMBER;
4585
4586 LNS_LOAN_HEADER_PUB.UPDATE_LOAN(P_OBJECT_VERSION_NUMBER => l_object_version_number,
4587 P_LOAN_HEADER_REC => l_loan_header_rec,
4588 P_INIT_MSG_LIST => FND_API.G_FALSE,
4589 X_RETURN_STATUS => l_return_status,
4590 X_MSG_COUNT => l_msg_count,
4591 X_MSG_DATA => l_msg_data);
4592
4593 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4594
4595 IF l_return_status = 'S' THEN
4596 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_LOAN_HEADERS_ALL');
4597 ELSE
4598 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_LOAN_HEADER_PUB.UPDATE_LOAN returned error: ' || substr(l_msg_data,1,225));
4599 FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_LOAN_FAIL');
4600 FND_MSG_PUB.Add;
4601 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4602 RAISE FND_API.G_EXC_ERROR;
4603 END IF;
4604
4605 /* getting terms version for future update */
4606 open term_version_cur(P_LOAN_NEXT_DD_REC.LOAN_ID);
4607 fetch term_version_cur into l_term_id, l_version_number;
4608 close term_version_cur;
4609
4610 /* Updating terms */
4611 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating lns_terms w following values:');
4612
4613 l_term_rec.TERM_ID := l_term_id;
4614 l_term_rec.LOAN_ID := P_LOAN_NEXT_DD_REC.LOAN_ID;
4615
4616 if l_cur_phase is null or l_cur_phase = 'TERM' then
4617 l_term_rec.NEXT_PAYMENT_DUE_DATE := l_next_payment_due_date;
4618 LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_DUE_DATE: ' || l_term_rec.NEXT_PAYMENT_DUE_DATE);
4619 elsif l_cur_phase = 'OPEN' then
4620 l_term_rec.OPEN_NEXT_PAYMENT_DATE := l_next_payment_due_date;
4621 LogMessage(FND_LOG.LEVEL_STATEMENT, 'OPEN_NEXT_PAYMENT_DATE: ' || l_term_rec.OPEN_NEXT_PAYMENT_DATE);
4622 end if;
4623
4624 LNS_TERMS_PUB.update_term(P_OBJECT_VERSION_NUMBER => l_version_number,
4625 p_init_msg_list => FND_API.G_FALSE,
4626 p_loan_term_rec => l_term_rec,
4627 X_RETURN_STATUS => l_return_status,
4628 X_MSG_COUNT => l_msg_count,
4629 X_MSG_DATA => l_msg_data);
4630
4631 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
4632
4633 IF l_return_status = 'S' THEN
4634 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_TERMS');
4635 ELSE
4636 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: LNS_TERMS_PUB.update_term returned error: ' || substr(l_msg_data,1,225));
4637 FND_MESSAGE.SET_NAME('LNS', 'LNS_UPD_TERM_FAIL');
4638 FND_MSG_PUB.Add;
4639 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
4640 RAISE FND_API.G_EXC_ERROR;
4641 END IF;
4642
4643 l_end := sysdate;
4644 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
4645
4646 if P_COMMIT = FND_API.G_TRUE then
4647 COMMIT WORK;
4648 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4649 end if;
4650
4651 -- END OF BODY OF API
4652 x_return_status := FND_API.G_RET_STS_SUCCESS;
4653
4654 -- Standard call to get message count and if count is 1, get message info
4655 FND_MSG_PUB.Count_And_Get(
4656 p_encoded => FND_API.G_FALSE,
4657 p_count => x_msg_count,
4658 p_data => x_msg_data);
4659
4660 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully processed loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4661 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
4662
4663 EXCEPTION
4664 WHEN FND_API.G_EXC_ERROR THEN
4665 ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4666 x_return_status := FND_API.G_RET_STS_ERROR;
4667 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4668 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4669 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4670 ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4671 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4672 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4673 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4674 WHEN OTHERS THEN
4675 ROLLBACK TO SINGLE_LOAN_NEXT_DD_PVT;
4676 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4677 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
4678 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
4679 END IF;
4680 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4681 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loan ' || P_LOAN_NEXT_DD_REC.LOAN_NUMBER);
4682 END;
4683
4684
4685
4686 /*========================================================================
4687 | PUBLIC PROCEDURE LNS_BILLING_CONCUR
4688 |
4689 | DESCRIPTION
4690 | This procedure got called from concurent manager to bill loans
4691 |
4692 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4693 | None
4694 |
4695 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4696 | init
4697 | CALC_PAST_DUE_LOANS_NEXT_DD
4698 | BILL_LOANS
4699 | LogMessage
4700 |
4701 | PARAMETERS
4702 | ERRBUF OUT Returns errors to CM
4703 | RETCODE OUT Returns error code to CM
4704 | TYPE_ID IN Inputs loan type id
4705 | PRODUCT_ID IN Inputs loan product id
4706 | BORROWER_ID IN Inputs borrower id
4707 | LOAN_ID IN Inputs loan
4708 | FROM_DAYS_TO_DD IN Inputs from days
4709 | TO_DAYS_TO_DD IN Inputs to days
4710 |
4711 | KNOWN ISSUES
4712 | None
4713 |
4714 | NOTES
4715 | Any interesting aspect of the code in the package body which needs
4716 | to be stated.
4717 |
4718 | MODIFICATION HISTORY
4719 | Date Author Description of Changes
4720 | 01-01-2004 scherkas Created
4721 |
4722 *=======================================================================*/
4723 PROCEDURE LNS_BILLING_CONCUR(
4724 ERRBUF OUT NOCOPY VARCHAR2,
4725 RETCODE OUT NOCOPY VARCHAR2,
4726 TYPE_ID IN NUMBER,
4727 PRODUCT_ID IN NUMBER,
4728 BORROWER_ID IN NUMBER,
4729 LOAN_ID IN NUMBER,
4730 FROM_DAYS_TO_DD IN NUMBER,
4731 TO_DAYS_TO_DD IN NUMBER)
4732 IS
4733
4734 /*-----------------------------------------------------------------------+
4735 | Local Variable Declarations and initializations |
4736 +-----------------------------------------------------------------------*/
4737 l_msg_count number;
4738 l_return boolean;
4739 BEGIN
4740
4741 g_cr_return_status := 'NORMAL';
4742
4743 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4744 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Processing paid off loans...-------->>');
4745
4746 PROCESS_PAID_LOANS(
4747 P_API_VERSION => 1.0,
4748 P_INIT_MSG_LIST => FND_API.G_TRUE,
4749 P_COMMIT => FND_API.G_TRUE,
4750 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4751 P_LOAN_ID => null,
4752 P_PAYOFF_DATE => sysdate,
4753 X_RETURN_STATUS => RETCODE,
4754 X_MSG_COUNT => l_msg_count,
4755 X_MSG_DATA => ERRBUF);
4756
4757 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4758
4759 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4760 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Processing paid off loans that must be reactivated...-------->>');
4761
4762 REACTIVATE_PAID_LOANS(
4763 P_API_VERSION => 1.0,
4764 P_INIT_MSG_LIST => FND_API.G_TRUE,
4765 P_COMMIT => FND_API.G_TRUE,
4766 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4767 X_RETURN_STATUS => RETCODE,
4768 X_MSG_COUNT => l_msg_count,
4769 X_MSG_DATA => ERRBUF);
4770
4771 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4772 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Recalculating due date for past due loans...-------->>');
4773
4774 CALC_PAST_DUE_LOANS_NEXT_DD(
4775 P_API_VERSION => 1.0,
4776 P_INIT_MSG_LIST => FND_API.G_TRUE,
4777 P_COMMIT => FND_API.G_TRUE,
4778 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4779 X_RETURN_STATUS => RETCODE,
4780 X_MSG_COUNT => l_msg_count,
4781 X_MSG_DATA => ERRBUF);
4782
4783 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4784 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Billing loans...-------->>');
4785
4786 /* bill loans and stores all last billed statements in g_last_all_statements */
4787 BILL_LOANS(
4788 P_API_VERSION => 1.0,
4789 P_INIT_MSG_LIST => FND_API.G_TRUE,
4790 P_COMMIT => FND_API.G_TRUE,
4791 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4792 P_TYPE_ID => TYPE_ID,
4793 P_PRODUCT_ID => PRODUCT_ID,
4794 P_BORROWER_ID => BORROWER_ID,
4795 P_LOAN_ID => LOAN_ID,
4796 P_FROM_DAYS_TO_DD => FROM_DAYS_TO_DD,
4797 P_TO_DAYS_TO_DD => TO_DAYS_TO_DD,
4798 X_RETURN_STATUS => RETCODE,
4799 X_MSG_COUNT => l_msg_count,
4800 X_MSG_DATA => ERRBUF);
4801
4802 /* build billing report and stores it in g_last_billing_report */
4803 BUILD_BILLING_REPORT(P_TYPE_ID => TYPE_ID,
4804 P_PRODUCT_ID => PRODUCT_ID,
4805 P_BORROWER_ID => BORROWER_ID,
4806 P_LOAN_ID => LOAN_ID,
4807 P_FROM_DAYS_TO_DD => FROM_DAYS_TO_DD,
4808 P_TO_DAYS_TO_DD => TO_DAYS_TO_DD,
4809 P_STATEMENTS_XML => g_last_all_statements);
4810
4811 if g_cr_return_status = 'WARNING' then
4812 l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4813 status => g_cr_return_status,
4814 message => 'Not all loans were billed successfully. Please review log file.');
4815 elsif g_cr_return_status = 'ERROR' then
4816 l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4817 status => g_cr_return_status,
4818 message => 'Billing process has failed. Please review log file.');
4819 end if;
4820
4821 END;
4822
4823
4824
4825 /*========================================================================
4826 | PUBLIC PROCEDURE LNS_RVRS_PMT_CONCUR
4827 |
4828 | DESCRIPTION
4829 | This procedure got called from concurent manager to bill loans
4830 |
4831 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4832 | None
4833 |
4834 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4835 | init
4836 | REVERSE_LAST_AMORTIZATION
4837 | LogMessage
4838 |
4839 | PARAMETERS
4840 | ERRBUF OUT Returns errors to CM
4841 | RETCODE OUT Returns error code to CM
4842 | LOAN_ID IN Inputs loan
4843 | REBILL_FLAG IN Inputs rebill flag
4844 |
4845 | KNOWN ISSUES
4846 | None
4847 |
4848 | NOTES
4849 | Any interesting aspect of the code in the package body which needs
4850 | to be stated.
4851 |
4852 | MODIFICATION HISTORY
4853 | Date Author Description of Changes
4854 | 01-01-2004 scherkas Created
4855 |
4856 *=======================================================================*/
4857 PROCEDURE LNS_RVRS_PMT_CONCUR(
4858 ERRBUF OUT NOCOPY VARCHAR2,
4859 RETCODE OUT NOCOPY VARCHAR2,
4860 LOAN_ID IN NUMBER,
4861 REBILL_FLAG IN VARCHAR2)
4862 IS
4863
4864 /*-----------------------------------------------------------------------+
4865 | Local Variable Declarations and initializations |
4866 +-----------------------------------------------------------------------*/
4867 l_msg_count number;
4868 l_return boolean;
4869
4870 BEGIN
4871
4872 g_cr_return_status := 'NORMAL';
4873
4874 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4875 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '<<--------Reversing a loans last payment...-------->>');
4876
4877 REVERSE_LAST_AMORTIZATION(
4878 P_API_VERSION => 1.0,
4879 P_INIT_MSG_LIST => FND_API.G_TRUE,
4880 P_COMMIT => FND_API.G_TRUE,
4881 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4882 P_LOAN_ID => LOAN_ID,
4883 P_REBILL_FLAG => REBILL_FLAG,
4884 X_RETURN_STATUS => RETCODE,
4885 X_MSG_COUNT => l_msg_count,
4886 X_MSG_DATA => ERRBUF);
4887
4888 if g_cr_return_status = 'WARNING' then
4889 l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4890 status => g_cr_return_status,
4891 message => 'Reversing process has succeeded with warnings. Please review log file.');
4892 elsif g_cr_return_status = 'ERROR' then
4893 l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4894 status => g_cr_return_status,
4895 message => 'Reversing process has failed. Please review log file.');
4896 end if;
4897
4898 END;
4899
4900
4901
4902 /*========================================================================
4903 | PUBLIC PROCEDURE LNS_ADJUST_RECEIV_CONCUR
4904 |
4905 | DESCRIPTION
4906 | This procedure got called from concurent manager to adjust original receivables for a loan
4907 |
4908 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4909 | None
4910 |
4911 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4912 | init
4913 | ADJUST_ORIGINAL_RECEIVABLE
4914 | LogMessage
4915 |
4916 | PARAMETERS
4917 | ERRBUF OUT Returns errors to CM
4918 | RETCODE OUT Returns error code to CM
4919 | LOAN_ID IN Inputs loan
4920 |
4921 | KNOWN ISSUES
4922 | None
4923 |
4924 | NOTES
4925 | Any interesting aspect of the code in the package body which needs
4926 | to be stated.
4927 |
4928 | MODIFICATION HISTORY
4929 | Date Author Description of Changes
4930 | 01-01-2004 scherkas Created
4931 |
4932 *=======================================================================*/
4933 PROCEDURE LNS_ADJUST_RECEIV_CONCUR(
4934 ERRBUF OUT NOCOPY VARCHAR2,
4935 RETCODE OUT NOCOPY VARCHAR2,
4936 LOAN_ID IN NUMBER)
4937 IS
4938
4939 /*-----------------------------------------------------------------------+
4940 | Local Variable Declarations and initializations |
4941 +-----------------------------------------------------------------------*/
4942 l_msg_count number;
4943 l_return boolean;
4944
4945 BEGIN
4946
4947 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
4948
4949 ADJUST_ORIGINAL_RECEIVABLE(
4950 P_API_VERSION => 1.0,
4951 P_INIT_MSG_LIST => FND_API.G_TRUE,
4952 P_COMMIT => FND_API.G_TRUE,
4953 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
4954 P_LOAN_ID => LOAN_ID,
4955 X_RETURN_STATUS => RETCODE,
4956 X_MSG_COUNT => l_msg_count,
4957 X_MSG_DATA => ERRBUF);
4958
4959 if RETCODE <> 'S' then
4960 l_return := FND_CONCURRENT.SET_COMPLETION_STATUS(
4961 status => 'ERROR',
4962 message => 'Adjustment of original receivable has failed. Please review log file.');
4963 end if;
4964
4965 END;
4966
4967
4968 /*========================================================================
4969 | PRIVATE PROCEDURE BILL_LOANS_EXT
4970 |
4971 | DESCRIPTION
4972 | This procedure process passed loans table
4973 |
4974 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
4975 | LNS_BILLING_CONCUR
4976 |
4977 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
4978 | init
4979 | BILL_SINGLE_LOAN
4980 | LogMessage
4981 |
4982 | PARAMETERS
4983 | P_API_VERSION IN Standard in parameter
4984 | P_INIT_MSG_LIST IN Standard in parameter
4985 | P_COMMIT IN Standard in parameter
4986 | P_VALIDATION_LEVEL IN Standard in parameter
4987 | P_LOANS_TO_BILL_TBL IN Inputs table of loans to be billed
4988 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
4989 | X_MSG_COUNT OUT NOCOPY Standard out parameter
4990 | X_MSG_DATA OUT NOCOPY Standard out parameter
4991 |
4992 | KNOWN ISSUES
4993 | None
4994 |
4995 | NOTES
4996 | Any interesting aspect of the code in the package body which needs
4997 | to be stated.
4998 |
4999 | MODIFICATION HISTORY
5000 | Date Author Description of Changes
5001 | 27-06-2008 scherkas Created for bug 7129399: bill passed loans table
5002 |
5003 *=======================================================================*/
5004 PROCEDURE BILL_LOANS_EXT(
5005 P_API_VERSION IN NUMBER,
5006 P_INIT_MSG_LIST IN VARCHAR2,
5007 P_COMMIT IN VARCHAR2,
5008 P_VALIDATION_LEVEL IN NUMBER,
5009 P_LOANS_TO_BILL_TBL IN LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL,
5010 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5011 X_MSG_COUNT OUT NOCOPY NUMBER,
5012 X_MSG_DATA OUT NOCOPY VARCHAR2)
5013 IS
5014
5015 /*-----------------------------------------------------------------------+
5016 | Local Variable Declarations and initializations |
5017 +-----------------------------------------------------------------------*/
5018
5019 l_api_name CONSTANT VARCHAR2(30) := 'BILL_LOANS_EXT';
5020 l_api_version CONSTANT NUMBER := 1.0;
5021 l_return_status VARCHAR2(1);
5022 l_msg_count NUMBER;
5023 l_msg_data VARCHAR2(32767);
5024 l_Count number;
5025 l_Count1 number;
5026 l_new_line varchar2(1);
5027 l_error_statements_xml clob;
5028 l_error_header varchar2(20);
5029 l_error_footer varchar2(20);
5030 l_single_statement_xml clob;
5031 l_start date;
5032 l_end date;
5033 l_start1 date;
5034 l_end1 date;
5035
5036 l_loans_to_bill_tbl LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
5037
5038 /*-----------------------------------------------------------------------+
5039 | Cursor Declarations |
5040 +-----------------------------------------------------------------------*/
5041
5042 BEGIN
5043
5044 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5045
5046 -- Standard start of API savepoint
5047 SAVEPOINT BILL_LOANS_EXT_PVT;
5048 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
5049
5050 -- Standard call to check for call compatibility
5051 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5052 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5053 END IF;
5054
5055 -- Initialize message list if p_init_msg_list is set to TRUE
5056 IF FND_API.To_Boolean(p_init_msg_list) THEN
5057 FND_MSG_PUB.initialize;
5058 END IF;
5059
5060 -- Initialize API return status to success
5061 l_return_status := FND_API.G_RET_STS_SUCCESS;
5062
5063 -- START OF BODY OF API
5064
5065 l_loans_to_bill_tbl := P_LOANS_TO_BILL_TBL;
5066
5067 dbms_lob.createtemporary(l_error_statements_xml, FALSE, DBMS_LOB.CALL);
5068 dbms_lob.open(l_error_statements_xml, dbms_lob.lob_readwrite);
5069
5070 /* bill all selected loans */
5071 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing loans...');
5072 FOR l_Count1 IN 1..l_loans_to_bill_tbl.COUNT LOOP
5073
5074 LogMessage(FND_LOG.LEVEL_UNEXPECTED, ' ');
5075 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Processing loan #' || l_Count1);
5076
5077 BEGIN
5078
5079 SAVEPOINT BILL_LOANS_EXT_PVT1;
5080
5081 l_start := sysdate;
5082 BILL_SINGLE_LOAN(
5083 P_API_VERSION => 1.0,
5084 P_INIT_MSG_LIST => FND_API.G_TRUE,
5085 P_COMMIT => FND_API.G_FALSE,
5086 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5087 P_LOAN_REC => l_loans_to_bill_tbl(l_Count1),
5088 X_STATEMENT_XML => l_single_statement_xml,
5089 X_RETURN_STATUS => l_return_status,
5090 X_MSG_COUNT => l_msg_count,
5091 X_MSG_DATA => l_msg_data);
5092
5093 l_end := sysdate;
5094 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
5095
5096 IF l_return_status = 'S' THEN /* append to all statements clob */
5097
5098 -- loan forgiveness adjustment: fix for bug 7387659
5099 if l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG = 'Y' and
5100 l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT > 0 and
5101 g_forgiveness_rec_trx_id is not null then
5102
5103 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Performing loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID || '...');
5104 l_start1 := sysdate;
5105 FORGIVENESS_ADJUSTMENT(
5106 P_API_VERSION => 1.0,
5107 P_INIT_MSG_LIST => FND_API.G_TRUE,
5108 P_COMMIT => FND_API.G_FALSE,
5109 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5110 P_LOAN_ID => l_loans_to_bill_tbl(l_Count1).LOAN_ID,
5111 X_RETURN_STATUS => l_return_status,
5112 X_MSG_COUNT => l_msg_count,
5113 X_MSG_DATA => l_msg_data);
5114
5115 l_end1 := sysdate;
5116 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness adjustment timing: ' || round((l_end1 - l_start1)*86400, 2) || ' sec');
5117
5118 IF l_return_status = 'S' THEN
5119 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully performed forgiveness adjustment.');
5120 ELSE
5121 -- g_cr_return_status := 'WARNING';
5122 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to perform forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5123 FND_MESSAGE.SET_NAME('LNS', 'LNS_FORGIVENESS_FAIL');
5124 FND_MSG_PUB.Add;
5125 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
5126 RAISE FND_API.G_EXC_ERROR;
5127 END IF;
5128
5129 else
5130 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will not perform loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
5131 end if;
5132
5133 dbms_lob.Append(g_last_all_statements, l_single_statement_xml);
5134
5135 if P_COMMIT = FND_API.G_TRUE then
5136 COMMIT WORK;
5137 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5138 end if;
5139
5140 ELSE /* otherwise append to errors clob */
5141
5142 dbms_lob.Append(l_error_statements_xml, l_single_statement_xml);
5143
5144 END IF;
5145
5146 EXCEPTION
5147 WHEN OTHERS THEN
5148 ROLLBACK TO BILL_LOANS_EXT_PVT1;
5149 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5150 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5151 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5152 g_cr_return_status := 'WARNING';
5153
5154 /* building error statement */
5155 BUILD_ERROR_STATEMENT(P_LOAN_ID => l_loans_to_bill_tbl(l_Count1).LOAN_ID,
5156 P_PAYMENT_NUMBER => l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_NUMBER,
5157 P_PRIN_AMOUNT_DUE => nvl(l_loans_to_bill_tbl(l_Count1).NEXT_PRINCIPAL_AMOUNT, 0),
5158 P_INT_AMOUNT_DUE => nvl(l_loans_to_bill_tbl(l_Count1).NEXT_INTEREST_AMOUNT, 0),
5159 P_FEE_AMOUNT_DUE => nvl(l_loans_to_bill_tbl(l_Count1).NEXT_FEE_AMOUNT, 0),
5160 P_DUE_DATE => l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE,
5161 P_ERR_COUNT => x_msg_count,
5162 X_STATEMENT_XML => l_single_statement_xml);
5163
5164 dbms_lob.Append(l_error_statements_xml, l_single_statement_xml);
5165 END;
5166
5167 END LOOP;
5168
5169 /* if there are errors, add errors section */
5170 if dbms_lob.getlength(l_error_statements_xml) > 0 then
5171
5172 l_new_line := '
5173 ';
5174 l_error_header := l_new_line || '<ERRORS>' || l_new_line;
5175 l_error_footer := l_new_line || '</ERRORS>' || l_new_line;
5176 dbms_lob.writeAppend(g_last_all_statements, length(l_error_header), l_error_header);
5177 dbms_lob.Append(g_last_all_statements, l_error_statements_xml);
5178 dbms_lob.writeAppend(g_last_all_statements, length(l_error_footer), l_error_footer);
5179
5180 end if;
5181
5182 IF l_return_status <> 'S' THEN
5183 -- Above the error statements are created and now raise the error
5184 RAISE FND_API.G_EXC_ERROR;
5185 END IF;
5186
5187 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
5188 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || l_loans_to_bill_tbl.COUNT || ' loan(s)');
5189
5190 if P_COMMIT = FND_API.G_TRUE then
5191 COMMIT WORK;
5192 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loans');
5193 end if;
5194
5195 -- END OF BODY OF API
5196 x_return_status := FND_API.G_RET_STS_SUCCESS;
5197
5198 -- Standard call to get message count and if count is 1, get message info
5199 FND_MSG_PUB.Count_And_Get(
5200 p_encoded => FND_API.G_FALSE,
5201 p_count => x_msg_count,
5202 p_data => x_msg_data);
5203
5204 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5205
5206 EXCEPTION
5207 WHEN FND_API.G_EXC_ERROR THEN
5208 ROLLBACK TO BILL_LOANS_EXT_PVT;
5209 x_return_status := FND_API.G_RET_STS_ERROR;
5210 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5211 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loans');
5212 g_cr_return_status := 'ERROR';
5213 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5214 ROLLBACK TO BILL_LOANS_EXT_PVT;
5215 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5216 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5217 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loans');
5218 g_cr_return_status := 'ERROR';
5219 WHEN OTHERS THEN
5220 ROLLBACK TO BILL_LOANS_EXT_PVT;
5221 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5222 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5223 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5224 END IF;
5225 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5226 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loans');
5227 g_cr_return_status := 'ERROR';
5228 END;
5229
5230
5231
5232
5233 /*========================================================================
5234 | PUBLIC PROCEDURE BILL_LOANS
5235 |
5236 | DESCRIPTION
5237 | This procedure process all available loans
5238 |
5239 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5240 | LNS_BILLING_CONCUR
5241 |
5242 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5243 | init
5244 | BILL_SINGLE_LOAN
5245 | LogMessage
5246 |
5247 | PARAMETERS
5248 | P_API_VERSION IN Standard in parameter
5249 | P_INIT_MSG_LIST IN Standard in parameter
5250 | P_COMMIT IN Standard in parameter
5251 | P_VALIDATION_LEVEL IN Standard in parameter
5252 | P_TYPE_ID IN Inputs loan type id
5253 | P_PRODUCT_ID IN Inputs loan product id
5254 | P_BORROWER_ID IN Inputs borrower id
5255 | P_LOAN_ID IN Inputs loan id
5256 | P_FROM_DAYS_TO_DD IN Inputs from days
5257 | P_TO_DAYS_TO_DD IN Inputs to days
5258 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
5259 | X_MSG_COUNT OUT NOCOPY Standard out parameter
5260 | X_MSG_DATA OUT NOCOPY Standard out parameter
5261 |
5262 | KNOWN ISSUES
5263 | None
5264 |
5265 | NOTES
5266 | Any interesting aspect of the code in the package body which needs
5267 | to be stated.
5268 |
5269 | MODIFICATION HISTORY
5270 | Date Author Description of Changes
5271 | 01-01-2004 scherkas Created
5272 |
5273 *=======================================================================*/
5274 PROCEDURE BILL_LOANS(
5275 P_API_VERSION IN NUMBER,
5276 P_INIT_MSG_LIST IN VARCHAR2,
5277 P_COMMIT IN VARCHAR2,
5278 P_VALIDATION_LEVEL IN NUMBER,
5279 P_TYPE_ID IN NUMBER,
5280 P_PRODUCT_ID IN NUMBER,
5281 P_BORROWER_ID IN NUMBER,
5282 P_LOAN_ID IN NUMBER,
5283 P_FROM_DAYS_TO_DD IN NUMBER,
5284 P_TO_DAYS_TO_DD IN NUMBER,
5285 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5286 X_MSG_COUNT OUT NOCOPY NUMBER,
5287 X_MSG_DATA OUT NOCOPY VARCHAR2)
5288 IS
5289
5290 /*-----------------------------------------------------------------------+
5291 | Local Variable Declarations and initializations |
5292 +-----------------------------------------------------------------------*/
5293
5294 l_api_name CONSTANT VARCHAR2(30) := 'BILL_LOANS';
5295 l_api_version CONSTANT NUMBER := 1.0;
5296 l_return_status VARCHAR2(1);
5297 l_msg_count NUMBER;
5298 l_msg_data VARCHAR2(32767);
5299 l_Count number;
5300 l_Count1 number;
5301 l_borrower_id number;
5302 l_loan_id number;
5303 l_from_date number;
5304 l_to_date number;
5305 l_new_line varchar2(1);
5306 l_error_statements_xml clob;
5307 l_error_header varchar2(20);
5308 l_error_footer varchar2(20);
5309 l_single_statement_xml clob;
5310 l_start date;
5311 l_end date;
5312 l_start1 date;
5313 l_end1 date;
5314 l_type_id number;
5315 l_product_id number;
5316
5317 l_loans_to_bill_tbl LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
5318
5319 /*-----------------------------------------------------------------------+
5320 | Cursor Declarations |
5321 +-----------------------------------------------------------------------*/
5322
5323 /* get all loans to bill in all stages */
5324 CURSOR loans_to_bill_cur(P_TYPE_ID number, P_PRODUCT_ID number, P_BORROWER_ID number, P_LOAN_ID number, P_FROM_DAYS_TO_DD number, P_TO_DAYS_TO_DD number) IS
5325 select
5326 head.LOAN_ID,
5327 head.LOAN_NUMBER,
5328 head.LOAN_DESCRIPTION,
5329 head.OBJECT_VERSION_NUMBER,
5330 head.FUNDED_AMOUNT,
5331 head.BILL_TO_ACCT_SITE_ID,
5332 decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_FIRST_PAYMENT_DATE, term.FIRST_PAYMENT_DATE),
5333 decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE),
5334 nvl(head.BILLED_FLAG, 'N'),
5335 head.LOAN_CURRENCY,
5336 head.CUST_ACCOUNT_ID,
5337 decode(head.CURRENT_PHASE, 'OPEN', 'N', head.CUSTOM_PAYMENTS_FLAG),
5338 decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_PAYMENT_FREQUENCY, term.LOAN_PAYMENT_FREQUENCY),
5339 term.NUMBER_GRACE_DAYS,
5340 term.PAYMENT_APPLICATION_ORDER,
5341 head.EXCHANGE_RATE_TYPE,
5342 head.EXCHANGE_DATE,
5343 head.EXCHANGE_RATE,
5344 head.ORG_ID,
5345 head.LEGAL_ENTITY_ID,
5346 nvl(head.CURRENT_PHASE, 'TERM'),
5347 nvl(head.FORGIVENESS_FLAG, 'N'),
5348 nvl(head.FORGIVENESS_PERCENT, 0),
5349 nvl(head.DISABLE_BILLING_FLAG, 'N')
5350 from LNS_LOAN_HEADERS_VL head,
5351 LNS_TERMS term
5352 where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
5353 and head.loan_id = term.loan_id
5354 and LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) < LNS_FIN_UTILS.getNumberInstallments(head.LOAN_ID, nvl(head.current_phase, 'TERM'))
5355 and (head.BILLED_FLAG is null or head.BILLED_FLAG = 'N')
5356 and head.LOAN_TYPE_ID = nvl(P_TYPE_ID, head.LOAN_TYPE_ID)
5357 and nvl(head.PRODUCT_ID, -1) = nvl(P_PRODUCT_ID, nvl(head.PRODUCT_ID, -1)) -- fix for bug 14153250
5358 and head.PRIMARY_BORROWER_ID = nvl(P_BORROWER_ID, head.PRIMARY_BORROWER_ID)
5359 and head.LOAN_ID = nvl(P_LOAN_ID, head.LOAN_ID)
5360 and (trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
5361 >= nvl(P_FROM_DAYS_TO_DD, trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
5362 and (trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
5363 <= nvl(P_TO_DAYS_TO_DD, trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE)) - trunc(sysdate))
5364 ORDER BY head.LOAN_ID;
5365
5366 BEGIN
5367
5368 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5369
5370 -- Standard start of API savepoint
5371 SAVEPOINT BILL_LOANS_PVT;
5372 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
5373
5374 -- Standard call to check for call compatibility
5375 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5376 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5377 END IF;
5378
5379 -- Initialize message list if p_init_msg_list is set to TRUE
5380 IF FND_API.To_Boolean(p_init_msg_list) THEN
5381 FND_MSG_PUB.initialize;
5382 END IF;
5383
5384 -- Initialize API return status to success
5385 l_return_status := FND_API.G_RET_STS_SUCCESS;
5386
5387 -- START OF BODY OF API
5388
5389 /* init all_statements clob */
5390 dbms_lob.createtemporary(g_last_all_statements, FALSE, DBMS_LOB.CALL);
5391 dbms_lob.open(g_last_all_statements, dbms_lob.lob_readwrite);
5392
5393 init;
5394
5395 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Passed input parameters:');
5396 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Type ID: ' || P_TYPE_ID);
5397 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Product ID: ' || P_PRODUCT_ID);
5398 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Borrower ID: ' || P_BORROWER_ID);
5399 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan ID: ' || P_LOAN_ID);
5400 LogMessage(FND_LOG.LEVEL_STATEMENT, 'From Days/Date: ' || P_FROM_DAYS_TO_DD || GET_BILLING_DATE(P_FROM_DAYS_TO_DD));
5401 LogMessage(FND_LOG.LEVEL_STATEMENT, 'To Days/Date: ' || P_TO_DAYS_TO_DD || GET_BILLING_DATE(P_TO_DAYS_TO_DD));
5402
5403 /* making decision what to do */
5404 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Using following parameters:');
5405
5406 if P_LOAN_ID is not null then -- if loan_id is passed - ignore all other input parameters
5407
5408 l_loan_id := P_LOAN_ID;
5409 l_type_id := null;
5410 l_product_id := null;
5411 l_borrower_id := null;
5412 l_from_date := null;
5413 l_to_date := null;
5414
5415 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Loan ID: ' || l_loan_id);
5416
5417 elsif P_TYPE_ID is null and P_PRODUCT_ID is null and P_BORROWER_ID is null and P_FROM_DAYS_TO_DD is null and P_TO_DAYS_TO_DD is null then
5418
5419 if g_days_to_bill_before_dd is null then
5420 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: At least one of the days must be set.');
5421 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_BILLING_INP_PAR');
5422 FND_MSG_PUB.Add;
5423 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
5424 RAISE FND_API.G_EXC_ERROR;
5425 else
5426 l_to_date := g_days_to_bill_before_dd;
5427 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'To Days/Date: ' || l_to_date || GET_BILLING_DATE(l_to_date));
5428 end if;
5429
5430
5431 else
5432
5433 l_loan_id := null;
5434 l_type_id := P_TYPE_ID;
5435 l_product_id := P_PRODUCT_ID;
5436 l_borrower_id := P_BORROWER_ID;
5437 l_from_date := P_FROM_DAYS_TO_DD;
5438 l_to_date := P_TO_DAYS_TO_DD;
5439
5440 if l_type_id is not null then
5441 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Type ID: ' || l_type_id);
5442 end if;
5443
5444 if l_product_id is not null then
5445 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Product ID: ' || l_product_id);
5446 end if;
5447
5448 if l_borrower_id is not null then
5449 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Borrower ID: ' || l_borrower_id);
5450 end if;
5451
5452 if l_from_date is not null then
5453 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'From Days/Date: ' || l_from_date || GET_BILLING_DATE(l_from_date));
5454 end if;
5455
5456 if l_to_date is not null then
5457 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'To Days/Date: ' || l_to_date || GET_BILLING_DATE(l_to_date));
5458 end if;
5459
5460 end if;
5461
5462 /* quering for loans */
5463 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Searching for not billed yet loans to process...');
5464
5465 open loans_to_bill_cur(l_type_id, l_product_id, l_borrower_id, l_loan_id, l_from_date, l_to_date);
5466
5467 l_Count1 := 0;
5468
5469 LOOP
5470
5471 l_Count1 := l_Count1+1;
5472
5473 fetch loans_to_bill_cur into
5474 l_loans_to_bill_tbl(l_Count1).LOAN_ID,
5475 l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER,
5476 l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION,
5477 l_loans_to_bill_tbl(l_Count1).OBJECT_VERSION_NUMBER,
5478 l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT,
5479 l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID,
5480 l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE,
5481 l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE,
5482 l_loans_to_bill_tbl(l_Count1).BILLED_FLAG,
5483 l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY,
5484 l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID,
5485 l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG,
5486 l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY,
5487 l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS,
5488 l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER,
5489 l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE,
5490 l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE,
5491 l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE,
5492 l_loans_to_bill_tbl(l_Count1).ORG_ID,
5493 l_loans_to_bill_tbl(l_Count1).LEGAL_ENTITY_ID,
5494 l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE,
5495 l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG,
5496 l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT,
5497 l_loans_to_bill_tbl(l_Count1).DISABLE_BILLING_FLAG;
5498
5499 exit when loans_to_bill_cur%NOTFOUND;
5500
5501 LogMessage(FND_LOG.LEVEL_STATEMENT, ' ');
5502 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan #' || l_Count1);
5503 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
5504 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER: ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5505 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_DESCRIPTION: ' || l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION);
5506 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT);
5507 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID);
5508 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FIRST_PAYMENT_DATE: ' || l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE);
5509 LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_DUE_DATE: ' || l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE);
5510 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || l_loans_to_bill_tbl(l_Count1).BILLED_FLAG);
5511 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY);
5512 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID);
5513 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG);
5514 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_PAYMENT_FREQUENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY);
5515 LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS);
5516 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER);
5517 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE);
5518 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE);
5519 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE);
5520 LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || l_loans_to_bill_tbl(l_Count1).ORG_ID);
5521 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LEGAL_ENTITY_ID: ' || l_loans_to_bill_tbl(l_Count1).LEGAL_ENTITY_ID);
5522 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE);
5523 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG);
5524 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_PERCENT: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT);
5525 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DISABLE_BILLING_FLAG : ' || l_loans_to_bill_tbl(l_Count1).DISABLE_BILLING_FLAG);
5526
5527 END LOOP;
5528
5529 close loans_to_bill_cur;
5530
5531 l_Count := l_loans_to_bill_tbl.count;
5532 LogMessage(FND_LOG.LEVEL_STATEMENT, '______________');
5533 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total found ' || l_Count || ' loan(s) to process');
5534
5535 if l_Count > 0 then
5536
5537 dbms_lob.createtemporary(l_error_statements_xml, FALSE, DBMS_LOB.CALL);
5538 dbms_lob.open(l_error_statements_xml, dbms_lob.lob_readwrite);
5539
5540 /* bill all selected loans */
5541 FOR l_Count1 IN 1..l_loans_to_bill_tbl.COUNT LOOP
5542
5543 LogMessage(FND_LOG.LEVEL_PROCEDURE, ' ');
5544 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Processing loan #' || l_Count1);
5545
5546 l_start := sysdate;
5547 BILL_SINGLE_LOAN(
5548 P_API_VERSION => 1.0,
5549 P_INIT_MSG_LIST => FND_API.G_FALSE,
5550 P_COMMIT => P_COMMIT,
5551 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5552 P_LOAN_REC => l_loans_to_bill_tbl(l_Count1),
5553 X_STATEMENT_XML => l_single_statement_xml,
5554 X_RETURN_STATUS => l_return_status,
5555 X_MSG_COUNT => l_msg_count,
5556 X_MSG_DATA => l_msg_data);
5557
5558 l_end := sysdate;
5559 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total billing timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
5560
5561 IF l_return_status = 'S' THEN /* append to all statements clob */
5562
5563 dbms_lob.Append(g_last_all_statements, l_single_statement_xml);
5564
5565 -- loan forgiveness adjustment: fix for bug 7387659
5566 if l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG = 'Y' and
5567 l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT > 0 and
5568 g_forgiveness_rec_trx_id is not null then
5569
5570 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Performing loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID || '...');
5571 l_start1 := sysdate;
5572 FORGIVENESS_ADJUSTMENT(
5573 P_API_VERSION => 1.0,
5574 P_INIT_MSG_LIST => FND_API.G_FALSE,
5575 P_COMMIT => P_COMMIT,
5576 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5577 P_LOAN_ID => l_loans_to_bill_tbl(l_Count1).LOAN_ID,
5578 X_RETURN_STATUS => l_return_status,
5579 X_MSG_COUNT => l_msg_count,
5580 X_MSG_DATA => l_msg_data);
5581
5582 IF l_return_status = 'S' THEN
5583 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully performed forgiveness adjustment.');
5584 ELSE
5585 g_cr_return_status := 'WARNING';
5586 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to perform forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
5587 END IF;
5588
5589 l_end1 := sysdate;
5590 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness adjustment timing: ' || round((l_end1 - l_start1)*86400, 2) || ' sec');
5591
5592 else
5593 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will not perform loan forgiveness adjustment for loan ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
5594 end if;
5595
5596 ELSE /* otherwise append to errors clob */
5597
5598 dbms_lob.Append(l_error_statements_xml, l_single_statement_xml);
5599
5600 END IF;
5601
5602 END LOOP;
5603
5604 /* if there are errors, add errors section */
5605 if dbms_lob.getlength(l_error_statements_xml) > 0 then
5606
5607 l_new_line := '
5608 ';
5609 l_error_header := l_new_line || '<ERRORS>' || l_new_line;
5610 l_error_footer := l_new_line || '</ERRORS>' || l_new_line;
5611 dbms_lob.writeAppend(g_last_all_statements, length(l_error_header), l_error_header);
5612 dbms_lob.Append(g_last_all_statements, l_error_statements_xml);
5613 dbms_lob.writeAppend(g_last_all_statements, length(l_error_footer), l_error_footer);
5614
5615 end if;
5616
5617
5618 END IF;
5619
5620 LogMessage(FND_LOG.LEVEL_PROCEDURE, '______________');
5621 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total processed ' || (l_Count1-1) || ' loan(s)');
5622
5623 if P_COMMIT = FND_API.G_TRUE then
5624 COMMIT WORK;
5625 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loans');
5626 end if;
5627
5628 -- END OF BODY OF API
5629 x_return_status := FND_API.G_RET_STS_SUCCESS;
5630
5631 -- Standard call to get message count and if count is 1, get message info
5632 FND_MSG_PUB.Count_And_Get(
5633 p_encoded => FND_API.G_FALSE,
5634 p_count => x_msg_count,
5635 p_data => x_msg_data);
5636
5637 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5638
5639 EXCEPTION
5640 WHEN FND_API.G_EXC_ERROR THEN
5641 ROLLBACK TO BILL_LOANS_PVT;
5642 x_return_status := FND_API.G_RET_STS_ERROR;
5643 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5644 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5645 g_cr_return_status := 'ERROR';
5646 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5647 ROLLBACK TO BILL_LOANS_PVT;
5648 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5649 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5650 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5651 g_cr_return_status := 'ERROR';
5652 WHEN OTHERS THEN
5653 ROLLBACK TO BILL_LOANS_PVT;
5654 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5655 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5656 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5657 END IF;
5658 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5659 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5660 g_cr_return_status := 'ERROR';
5661 END;
5662
5663
5664
5665 /*========================================================================
5666 | PUBLIC PROCEDURE CALC_PAST_DUE_LOANS_NEXT_DD
5667 |
5668 | DESCRIPTION
5669 | This procedure recalculates next payment due date for all past due loans
5670 |
5671 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5672 | LNS_BILLING_CONCUR
5673 |
5674 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5675 | init
5676 | CALC_SINGLE_LOAN_NEXT_DD
5677 | LogMessage
5678 |
5679 | PARAMETERS
5680 | P_API_VERSION IN Standard in parameter
5681 | P_INIT_MSG_LIST IN Standard in parameter
5682 | P_COMMIT IN Standard in parameter
5683 | P_VALIDATION_LEVEL IN Standard in parameter
5684 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
5685 | X_MSG_COUNT OUT NOCOPY Standard out parameter
5686 | X_MSG_DATA OUT NOCOPY Standard out parameter
5687 |
5688 | KNOWN ISSUES
5689 | None
5690 |
5691 | NOTES
5692 | Any interesting aspect of the code in the package body which needs
5693 | to be stated.
5694 |
5695 | MODIFICATION HISTORY
5696 | Date Author Description of Changes
5697 | 01-01-2004 scherkas Created
5698 |
5699 *=======================================================================*/
5700 PROCEDURE CALC_PAST_DUE_LOANS_NEXT_DD(
5701 P_API_VERSION IN NUMBER,
5702 P_INIT_MSG_LIST IN VARCHAR2,
5703 P_COMMIT IN VARCHAR2,
5704 P_VALIDATION_LEVEL IN NUMBER,
5705 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5706 X_MSG_COUNT OUT NOCOPY NUMBER,
5707 X_MSG_DATA OUT NOCOPY VARCHAR2)
5708 IS
5709
5710 /*-----------------------------------------------------------------------+
5711 | Local Variable Declarations and initializations |
5712 +-----------------------------------------------------------------------*/
5713
5714 l_api_name CONSTANT VARCHAR2(30) := 'CALC_PAST_DUE_LOANS_NEXT_DD';
5715 l_api_version CONSTANT NUMBER := 1.0;
5716 l_return_status VARCHAR2(1);
5717 l_msg_count NUMBER;
5718 l_msg_data VARCHAR2(32767);
5719 l_org_id number;
5720 l_Count1 number;
5721 l_next_payment_due_date date;
5722 l_end date;
5723 l_start date;
5724
5725 l_loans_next_dd_rec LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
5726
5727 /*-----------------------------------------------------------------------+
5728 | Cursor Declarations |
5729 +-----------------------------------------------------------------------*/
5730
5731 CURSOR past_due_loans_cur IS
5732 select
5733 head.LOAN_ID,
5734 head.LOAN_NUMBER,
5735 head.OBJECT_VERSION_NUMBER,
5736 LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) + 1,
5737 head.CUSTOM_PAYMENTS_FLAG
5738 from LNS_LOAN_HEADERS head,
5739 LNS_TERMS term
5740 where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
5741 and head.loan_id = term.loan_id
5742 and (head.BILLED_FLAG = 'Y' or head.BILLED_FLAG is null) -- scherkas; fix for bug 5687852
5743 and LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) < LNS_FIN_UTILS.getNumberInstallments(head.LOAN_ID, nvl(head.current_phase, 'TERM'))
5744 and trunc(decode(head.CURRENT_PHASE, 'OPEN', term.OPEN_NEXT_PAYMENT_DATE, term.NEXT_PAYMENT_DUE_DATE) + nvl(term.NUMBER_GRACE_DAYS, 0)) < trunc(sysdate)
5745 ORDER BY head.LOAN_ID;
5746
5747 BEGIN
5748
5749 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5750
5751 -- Standard start of API savepoint
5752 SAVEPOINT LOANS_NEXT_DD_PVT;
5753 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Established savepoint');
5754
5755 -- Standard call to check for call compatibility
5756 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5757 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5758 END IF;
5759
5760 -- Initialize message list if p_init_msg_list is set to TRUE
5761 IF FND_API.To_Boolean(p_init_msg_list) THEN
5762 FND_MSG_PUB.initialize;
5763 END IF;
5764
5765 -- Initialize API return status to success
5766 l_return_status := FND_API.G_RET_STS_SUCCESS;
5767
5768 -- START OF BODY OF API
5769
5770 init;
5771
5772 /* quering for loans past due */
5773 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Searching for loans to process...');
5774
5775 l_start := sysdate;
5776 open past_due_loans_cur;
5777
5778 l_Count1 := 1;
5779
5780 LOOP
5781
5782 fetch past_due_loans_cur into
5783 l_loans_next_dd_rec.LOAN_ID,
5784 l_loans_next_dd_rec.LOAN_NUMBER,
5785 l_loans_next_dd_rec.OBJECT_VERSION_NUMBER,
5786 l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER,
5787 l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG;
5788
5789 exit when past_due_loans_cur%NOTFOUND;
5790
5791 l_Count1 := l_Count1+1;
5792
5793 CALC_SINGLE_LOAN_NEXT_DD(
5794 P_API_VERSION => 1.0,
5795 P_INIT_MSG_LIST => FND_API.G_FALSE,
5796 P_COMMIT => P_COMMIT,
5797 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
5798 P_LOAN_NEXT_DD_REC => l_loans_next_dd_rec,
5799 X_RETURN_STATUS => l_return_status,
5800 X_MSG_COUNT => l_msg_count,
5801 X_MSG_DATA => l_msg_data);
5802
5803 END LOOP;
5804
5805 close past_due_loans_cur;
5806
5807 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
5808 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || (l_Count1-1) || ' loan(s)');
5809 l_end := sysdate;
5810 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All Recalc Timing: ' || round((l_end - l_start)*86400, 2) || ' sec');
5811
5812 if P_COMMIT = FND_API.G_TRUE then
5813 COMMIT WORK;
5814 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loans');
5815 end if;
5816
5817 -- END OF BODY OF API
5818 x_return_status := FND_API.G_RET_STS_SUCCESS;
5819
5820 -- Standard call to get message count and if count is 1, get message info
5821 FND_MSG_PUB.Count_And_Get(
5822 p_encoded => FND_API.G_FALSE,
5823 p_count => x_msg_count,
5824 p_data => x_msg_data);
5825
5826 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
5827
5828 EXCEPTION
5829 WHEN FND_API.G_EXC_ERROR THEN
5830 ROLLBACK TO LOANS_NEXT_DD_PVT;
5831 x_return_status := FND_API.G_RET_STS_ERROR;
5832 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5833 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5834 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5835 ROLLBACK TO LOANS_NEXT_DD_PVT;
5836 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5837 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5838 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5839 WHEN OTHERS THEN
5840 ROLLBACK TO LOANS_NEXT_DD_PVT;
5841 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5842 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
5843 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
5844 END IF;
5845 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
5846 LogMessage(FND_LOG.LEVEL_ERROR, 'Rollbacked loans');
5847 END;
5848
5849
5850
5851 /*========================================================================
5852 | PUBLIC PROCEDURE REVERSE_LAST_AMORTIZATION
5853 |
5854 | DESCRIPTION
5855 | This procedure reverses a loans last bill
5856 |
5857 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
5858 | LNS_RVRS_PMT_CONCUR
5859 |
5860 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
5861 | init
5862 | CREATE_AR_CM
5863 | LogMessage
5864 |
5865 | PARAMETERS
5866 | P_API_VERSION IN Standard in parameter
5867 | P_INIT_MSG_LIST IN Standard in parameter
5868 | P_COMMIT IN Standard in parameter
5869 | P_VALIDATION_LEVEL IN Standard in parameter
5870 | P_LOAN_ID IN Inputs loan id
5871 | P_REBILL_FLAG IN Inputs rebill flag
5872 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
5873 | X_MSG_COUNT OUT NOCOPY Standard out parameter
5874 | X_MSG_DATA OUT NOCOPY Standard out parameter
5875 |
5876 | KNOWN ISSUES
5877 | None
5878 |
5879 | NOTES
5880 | Any interesting aspect of the code in the package body which needs
5881 | to be stated.
5882 |
5883 | MODIFICATION HISTORY
5884 | Date Author Description of Changes
5885 | 01-01-2004 scherkas Created
5886 | 01-20-2006 raverma delete row from rate_scheds for variable rate loan
5887 | 06-16-2006 karamach Removed code that deleted the rate sch row from lns_rate_schedules
5888 | and added fix in LNS_FINANCIAL_B.pls floatingRatePostProcessing procedure to update existing row to fix bug5331888
5889 | 07-31-2006 karamach Added code to update active_flag to N in lns_fee_schedules for unbilled manual fees to fix bug5397345
5890 *=======================================================================*/
5891 PROCEDURE REVERSE_LAST_AMORTIZATION(
5892 P_API_VERSION IN NUMBER,
5893 P_INIT_MSG_LIST IN VARCHAR2,
5894 P_COMMIT IN VARCHAR2,
5895 P_VALIDATION_LEVEL IN NUMBER,
5896 P_LOAN_ID IN NUMBER,
5897 P_REBILL_FLAG IN VARCHAR2,
5898 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5899 X_MSG_COUNT OUT NOCOPY NUMBER,
5900 X_MSG_DATA OUT NOCOPY VARCHAR2)
5901 IS
5902
5903 /*-----------------------------------------------------------------------+
5904 | Local Variable Declarations and initializations |
5905 +-----------------------------------------------------------------------*/
5906 l_api_name CONSTANT VARCHAR2(30) := 'REVERSE_LAST_AMORTIZATION';
5907 l_api_version CONSTANT NUMBER := 1.0;
5908 l_return_status VARCHAR2(1);
5909 l_msg_count NUMBER;
5910 l_msg_data VARCHAR2(32767);
5911 l_Count number;
5912 l_LAST_PAYMENT_NUMBER number;
5913 l_amortization_schedule_id number;
5914 l_batch_source_name varchar2(50);
5915 l_custom_payment_flag varchar2(1);
5916 l_next_payment_due_date date;
5917 l_term_id number;
5918 l_version_number number;
5919 l_BILL_PAY_ID number;
5920 l_CUSTOMER_TRX_ID number;
5921 l_PAYMENT_SCHEDULE_ID number;
5922 l_CUSTOMER_TRX_LINE_ID number;
5923 l_LINE_TYPE varchar2(30);
5924 l_TRX_AMOUNT number;
5925 l_APPLIED_AMOUNT number;
5926 l_request_id number;
5927 l_TRX_NUMBER varchar2(20);
5928 l_loan_number varchar2(60);
5929 l_due_date date;
5930 l_ORG_ID number;
5931 l_last_rate_id number;
5932 l_rate_type varchar2(30);
5933
5934 l_reverse_tbl LNS_BILLING_BATCH_PUB.REVERSE_TBL;
5935 l_loans_next_dd_rec LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
5936 l_INSTALLMENT_REC LNS_CUSTOM_PUB.custom_sched_type;
5937 l_principal NUMBER;
5938 l_interest NUMBER;
5939
5940 /*-----------------------------------------------------------------------+
5941 | Cursor Declarations |
5942 +-----------------------------------------------------------------------*/
5943
5944 CURSOR last_loan_amort_cur(P_LOAN_ID number) IS
5945 select PAYMENT_NUMBER,
5946 DUE_DATE,
5947 AMORTIZATION_SCHEDULE_ID,
5948 RATE_ID
5949 from LNS_AMORTIZATION_SCHEDS
5950 where LOAN_ID = P_LOAN_ID
5951 and AMORTIZATION_SCHEDULE_ID = LNS_BILLING_UTIL_PUB.LAST_AMORTIZATION_SCHED(LOAN_ID);
5952
5953 CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number) IS
5954 select
5955 trx.trx_number,
5956 trx.customer_trx_id,
5957 psa.payment_schedule_id,
5958 lines.CUST_TRX_LINE_ID,
5959 lines.LINE_TYPE,
5960 lines.AMOUNT,
5961 (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
5962 trx.org_id
5963 from
5964 RA_CUSTOMER_TRX_ALL trx,
5965 lns_amortization_lines lines,
5966 ar_payment_schedules psa
5967 where
5968 trx.customer_trx_id = lines.CUST_TRX_ID and
5969 trx.customer_trx_id = psa.customer_trx_id and
5970 lines.LOAN_ID = P_LOAN_ID and
5971 lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
5972
5973 CURSOR loan_version_cur(P_LOAN_ID number) IS
5974 select
5975 LOAN_NUMBER,
5976 OBJECT_VERSION_NUMBER,
5977 CUSTOM_PAYMENTS_FLAG
5978 from LNS_LOAN_HEADERS
5979 where LOAN_ID = P_LOAN_ID;
5980
5981 CURSOR terms_cur(P_LOAN_ID number) IS
5982 select rate_type
5983 from LNS_TERMS
5984 where LOAN_ID = P_LOAN_ID;
5985
5986 BEGIN
5987
5988 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
5989
5990 -- Standard start of API savepoint
5991 SAVEPOINT REVERSE_LAST_AMORTIZATION;
5992 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
5993
5994 -- Standard call to check for call compatibility
5995 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5996 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5997 END IF;
5998
5999 -- Initialize message list if p_init_msg_list is set to TRUE
6000 IF FND_API.To_Boolean(p_init_msg_list) THEN
6001 FND_MSG_PUB.initialize;
6002 END IF;
6003
6004 -- Initialize API return status to success
6005 l_return_status := FND_API.G_RET_STS_SUCCESS;
6006
6007 -- START OF BODY OF API
6008
6009 init;
6010
6011 /* getting object version and custom flag for further loan update */
6012
6013 open loan_version_cur(P_LOAN_ID);
6014 fetch loan_version_cur into l_loan_number, l_version_number, l_custom_payment_flag;
6015 close loan_version_cur;
6016
6017 open terms_cur(p_loan_id);
6018 fetch terms_cur into l_rate_type;
6019 close terms_cur;
6020
6021 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reversing loan ' || l_loan_number);
6022 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id ' || P_LOAN_ID);
6023 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'rate type ' || l_rate_type);
6024
6025 /* verify input parameters */
6026 if P_LOAN_ID is null then
6027
6028 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
6029 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
6030 FND_MSG_PUB.Add;
6031 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6032 RAISE FND_API.G_EXC_ERROR;
6033
6034 end if;
6035
6036 /* quering for last loan amortization record */
6037 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for last amortization record in LNS_AMORTIZATION_SCHEDS:');
6038
6039 open last_loan_amort_cur(P_LOAN_ID);
6040
6041 fetch last_loan_amort_cur into
6042 l_LAST_PAYMENT_NUMBER,
6043 l_due_date,
6044 l_amortization_schedule_id,
6045 l_last_rate_id;
6046
6047 if last_loan_amort_cur%NOTFOUND then
6048
6049 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'No amortization record found. Exiting');
6050 return;
6051
6052 else
6053
6054 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
6055 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || l_LAST_PAYMENT_NUMBER);
6056 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || l_due_date);
6057 LogMessage(FND_LOG.LEVEL_STATEMENT, 'amortization_schedule_id: ' || l_amortization_schedule_id);
6058
6059 end if;
6060
6061 close last_loan_amort_cur;
6062
6063 /* Quering for invoices with lines to reverse */
6064 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to reverse...');
6065
6066 l_Count := 0;
6067 l_principal := 0;
6068 l_interest := 0;
6069 open trx_to_reverse_cur(P_LOAN_ID, l_amortization_schedule_id);
6070
6071 LOOP
6072
6073 fetch trx_to_reverse_cur into
6074 l_TRX_NUMBER,
6075 l_CUSTOMER_TRX_ID,
6076 l_PAYMENT_SCHEDULE_ID,
6077 l_CUSTOMER_TRX_LINE_ID,
6078 l_LINE_TYPE,
6079 l_TRX_AMOUNT,
6080 l_APPLIED_AMOUNT,
6081 l_ORG_ID;
6082
6083 exit when trx_to_reverse_cur%NOTFOUND;
6084
6085 l_Count := l_Count+1;
6086
6087 l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
6088 l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
6089 l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
6090 l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
6091 l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
6092 l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
6093 l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
6094 l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
6095
6096 if l_LINE_TYPE = 'PRIN' then
6097 l_principal := l_principal + l_TRX_AMOUNT;
6098 elsif l_LINE_TYPE = 'INT' then
6099 l_interest := l_interest + l_TRX_AMOUNT;
6100 end if;
6101
6102 END LOOP;
6103
6104 close trx_to_reverse_cur;
6105
6106 /* Verify count */
6107 if l_reverse_tbl.count = 0 then
6108
6109 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'No trx lines found to reverse - will not create AR CM.');
6110 /*
6111 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
6112 FND_MSG_PUB.Add;
6113 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6114 RAISE FND_API.G_EXC_ERROR;
6115 */
6116 else
6117
6118 /* Create credit memos */
6119 CREATE_AR_CM(l_reverse_tbl);
6120
6121 end if;
6122
6123
6124 /* Deleting reamortize record */
6125 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Deleting reamortize record...');
6126
6127 delete from LNS_AMORTIZATION_SCHEDS
6128 where loan_id = P_LOAN_ID and
6129 REAMORTIZE_FROM_INSTALLMENT = l_last_payment_number;
6130
6131 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Deleted!');
6132
6133 /* Update amortization table */
6134 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
6135
6136 LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
6137 P_AMORTIZATION_SCHEDULE_ID => l_amortization_schedule_id
6138 ,P_REVERSED_FLAG => 'Y'
6139 ,P_REVERSED_DATE => sysdate);
6140
6141 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
6142
6143 -- fix for bug 7716548: if its custom schedule call LNS_CUSTOM_PUB.addMissingInstallment to add custom row if needed
6144 if l_custom_payment_flag = 'Y' then
6145
6146 l_INSTALLMENT_REC.LOAN_ID := P_LOAN_ID;
6147 l_INSTALLMENT_REC.PAYMENT_NUMBER := l_LAST_PAYMENT_NUMBER;
6148 l_INSTALLMENT_REC.DUE_DATE := l_due_date;
6149 l_INSTALLMENT_REC.PRINCIPAL_AMOUNT := l_principal;
6150 l_INSTALLMENT_REC.INTEREST_AMOUNT := l_interest;
6151 l_INSTALLMENT_REC.LOCK_PRIN := 'Y';
6152 l_INSTALLMENT_REC.LOCK_INT := 'Y';
6153
6154 LNS_CUSTOM_PUB.addMissingInstallment(
6155 P_API_VERSION => 1.0,
6156 P_INIT_MSG_LIST => FND_API.G_FALSE,
6157 P_COMMIT => FND_API.G_FALSE,
6158 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6159 P_INSTALLMENT_REC => l_INSTALLMENT_REC,
6160 X_RETURN_STATUS => l_return_status,
6161 X_MSG_COUNT => l_msg_count,
6162 X_MSG_DATA => l_msg_data);
6163
6164 IF l_return_status <> 'S' THEN
6165 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Failed to insert missing custom schedule row.');
6166 END IF;
6167
6168 end if;
6169
6170
6171 /* recalculating next due date */
6172 l_loans_next_dd_rec.LOAN_ID := P_LOAN_ID;
6173 l_loans_next_dd_rec.LOAN_NUMBER := l_loan_number;
6174 l_loans_next_dd_rec.OBJECT_VERSION_NUMBER := l_version_number;
6175 l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER := l_LAST_PAYMENT_NUMBER;
6176 l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG := l_custom_payment_flag;
6177
6178 CALC_SINGLE_LOAN_NEXT_DD(
6179 P_API_VERSION => 1.0,
6180 P_INIT_MSG_LIST => FND_API.G_FALSE,
6181 P_COMMIT => P_COMMIT,
6182 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6183 P_LOAN_NEXT_DD_REC => l_loans_next_dd_rec,
6184 X_RETURN_STATUS => l_return_status,
6185 X_MSG_COUNT => l_msg_count,
6186 X_MSG_DATA => l_msg_data);
6187
6188
6189 IF l_return_status = 'S' THEN
6190 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully calculated next payment due date.');
6191 ELSE
6192 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to calculate next payment due date.');
6193 FND_MESSAGE.SET_NAME('LNS', 'LNS_CALC_NEXT_DUE_FAIL');
6194 FND_MSG_PUB.Add;
6195 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6196 RAISE FND_API.G_EXC_ERROR;
6197 END IF;
6198
6199 STORE_LAST_PAYMENT_NUMBER(P_LOAN_ID);
6200
6201 if P_COMMIT = FND_API.G_TRUE then
6202 COMMIT WORK;
6203 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
6204 end if;
6205
6206 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reversed loan ' || l_loan_number);
6207
6208 /* start billing process if P_REBILL_FLAG = 'Y' */
6209 if P_REBILL_FLAG = 'Y' then
6210
6211 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Reprocessing Fees for loan ' || l_loan_number || ' payment number ' || l_LAST_PAYMENT_NUMBER);
6212 LNS_FEE_ENGINE.reprocessFees(
6213 p_init_msg_list => FND_API.G_TRUE,
6214 p_commit => FND_API.G_TRUE,
6215 p_loan_id => P_LOAN_ID,
6216 p_installment_number => l_LAST_PAYMENT_NUMBER,
6217 p_phase => 'TERM', -- At present change it as 'TERM' which is null
6218 x_return_status => l_return_status,
6219 x_msg_count => l_msg_count,
6220 x_msg_data => l_msg_data);
6221
6222 IF l_return_status = 'S' THEN
6223 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully reprocessed fees.');
6224 ELSE
6225 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed to reprocess fees.');
6226 RAISE FND_API.G_EXC_ERROR;
6227 END IF;
6228
6229 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Starting billing for loan ' || l_loan_number);
6230
6231 BILL_LOANS(
6232 P_API_VERSION => 1.0,
6233 P_INIT_MSG_LIST => FND_API.G_TRUE,
6234 P_COMMIT => FND_API.G_TRUE,
6235 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6236 P_TYPE_ID => null,
6237 P_PRODUCT_ID => null,
6238 P_BORROWER_ID => null,
6239 P_LOAN_ID => P_LOAN_ID,
6240 P_FROM_DAYS_TO_DD => null,
6241 P_TO_DAYS_TO_DD => null,
6242 X_RETURN_STATUS => l_return_status,
6243 X_MSG_COUNT => l_msg_count,
6244 X_MSG_DATA => l_msg_data);
6245
6246 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Done billing for loan ' || l_loan_number);
6247
6248 else
6249 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Before inactivating unbilled manual fees for this installment: ' || l_LAST_PAYMENT_NUMBER);
6250 --Bug5397345
6251 --Make sure unbilled manual fees for this reversed installment are inactivated
6252 UPDATE LNS_FEE_SCHEDULES SET ACTIVE_FLAG = 'N', LAST_UPDATE_DATE = sysdate, LAST_UPDATED_BY = lns_utility_pub.last_updated_by, LAST_UPDATE_LOGIN = lns_utility_pub.last_update_login, OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER+1
6253 WHERE LOAN_ID = P_LOAN_ID AND BILLED_FLAG = 'N' AND FEE_INSTALLMENT = l_LAST_PAYMENT_NUMBER;
6254 LogMessage(FND_LOG.LEVEL_STATEMENT, 'After inactivating unbilled manual fees by updating the active_flag in lns_fee_schedules for this loan and installment');
6255
6256 end if;
6257
6258 -- END OF BODY OF API
6259 x_return_status := FND_API.G_RET_STS_SUCCESS;
6260
6261 -- Standard call to get message count and if count is 1, get message info
6262 FND_MSG_PUB.Count_And_Get(
6263 p_encoded => FND_API.G_FALSE,
6264 p_count => x_msg_count,
6265 p_data => x_msg_data);
6266
6267 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6268
6269 EXCEPTION
6270 WHEN FND_API.G_EXC_ERROR THEN
6271 ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6272 x_return_status := FND_API.G_RET_STS_ERROR;
6273 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6274 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6275 g_cr_return_status := 'ERROR';
6276 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6277 ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6278 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6279 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6280 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6281 g_cr_return_status := 'ERROR';
6282 WHEN OTHERS THEN
6283 ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6284 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6285 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6286 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6287 END IF;
6288 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6289 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6290 g_cr_return_status := 'ERROR';
6291 END;
6292
6293
6294 /*========================================================================
6295 | PUBLIC PROCEDURE CREDIT_AMORTIZATION_PARTIAL
6296 |
6297 | DESCRIPTION
6298 | This procedure will credit a portion of the last amortization.
6299 | The portion can be principal interest or fees
6300 |
6301 | PSEUDO CODE/LOGIC
6302 |
6303 | PARAMETERS
6304 | P_API_VERSION IN Standard in parameter
6305 | P_INIT_MSG_LIST IN Standard in parameter
6306 | P_COMMIT IN Standard in parameter
6307 | P_VALIDATION_LEVEL IN Standard in parameter
6308 | P_LOAN_ID IN Inputs loan id
6309 | P_LINE_TYPE IN PRIN or INT or FEE
6310 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
6311 | X_MSG_COUNT OUT NOCOPY Standard out parameter
6312 | X_MSG_DATA OUT NOCOPY Standard out parameter
6313 |
6314 | KNOWN ISSUES
6315 | None
6316 |
6317 | NOTES
6318 |
6319 | MODIFICATION HISTORY
6320 | Date Author Description of Changes
6321 | 10-12-2004 raverma Created
6322 |
6323 *=======================================================================*/
6324 PROCEDURE CREDIT_AMORTIZATION_PARTIAL(P_API_VERSION IN NUMBER
6325 ,P_INIT_MSG_LIST IN VARCHAR2
6326 ,P_COMMIT IN VARCHAR2
6327 ,P_VALIDATION_LEVEL IN NUMBER
6328 ,P_LOAN_ID IN NUMBER
6329 ,P_LINE_TYPE IN VARCHAR2
6330 ,X_RETURN_STATUS OUT NOCOPY VARCHAR
6331 ,X_MSG_COUNT OUT NOCOPY NUMBER
6332 ,X_MSG_DATA OUT NOCOPY VARCHAR2)
6333
6334 is
6335 /*-----------------------------------------------------------------------+
6336 | Local Variable Declarations and initializations |
6337 +-----------------------------------------------------------------------*/
6338 l_api_name CONSTANT VARCHAR2(30) := 'CREDIT_AMORTIZATION_PARTIAL';
6339 l_api_version CONSTANT NUMBER := 1.0;
6340 l_return_status VARCHAR2(1);
6341 l_msg_count NUMBER;
6342 l_msg_data VARCHAR2(32767);
6343 l_Count number;
6344 l_LAST_PAYMENT_NUMBER number;
6345 l_amortization_schedule_id number;
6346 l_batch_source_name varchar2(50);
6347 l_custom_payment_flag varchar2(1);
6348 l_next_payment_due_date date;
6349 l_term_id number;
6350 l_version_number number;
6351 l_BILL_PAY_ID number;
6352 l_CUSTOMER_TRX_ID number;
6353 l_PAYMENT_SCHEDULE_ID number;
6354 l_CUSTOMER_TRX_LINE_ID number;
6355 l_LINE_TYPE varchar2(30);
6356 l_TRX_AMOUNT number;
6357 l_APPLIED_AMOUNT number;
6358 l_request_id number;
6359 l_TRX_NUMBER varchar2(20);
6360 l_loan_number varchar2(60);
6361 l_due_date date;
6362 l_ORG_ID number;
6363
6364 l_reverse_tbl LNS_BILLING_BATCH_PUB.REVERSE_TBL;
6365 l_loans_next_dd_rec LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
6366
6367
6368 /*-----------------------------------------------------------------------+
6369 | Cursor Declarations |
6370 +-----------------------------------------------------------------------*/
6371
6372 CURSOR last_loan_amort_cur(P_LOAN_ID number) IS
6373 select PAYMENT_NUMBER,
6374 DUE_DATE,
6375 AMORTIZATION_SCHEDULE_ID
6376 from LNS_AMORTIZATION_SCHEDS
6377 where LOAN_ID = P_LOAN_ID
6378 and AMORTIZATION_SCHEDULE_ID = LNS_BILLING_UTIL_PUB.LAST_AMORTIZATION_SCHED(LOAN_ID);
6379
6380 CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number, p_line_type varchar2) IS
6381 select
6382 trx.trx_number,
6383 trx.customer_trx_id,
6384 psa.payment_schedule_id,
6385 lines.CUST_TRX_LINE_ID,
6386 lines.LINE_TYPE,
6387 lines.AMOUNT,
6388 (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
6389 trx.org_id
6390 from
6391 RA_CUSTOMER_TRX_ALL trx,
6392 lns_amortization_lines lines,
6393 ar_payment_schedules psa
6394 where
6395 trx.customer_trx_id = lines.CUST_TRX_ID and
6396 trx.customer_trx_id = psa.customer_trx_id and
6397 lines.LOAN_ID = P_LOAN_ID and
6398 lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID and
6399 lines.LINE_TYPE = p_line_type;
6400
6401 CURSOR loan_version_cur(P_LOAN_ID number) IS
6402 select
6403 LOAN_NUMBER,
6404 OBJECT_VERSION_NUMBER,
6405 CUSTOM_PAYMENTS_FLAG
6406 from LNS_LOAN_HEADERS
6407 where LOAN_ID = P_LOAN_ID;
6408
6409 BEGIN
6410
6411 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
6412
6413 -- Standard start of API savepoint
6414 SAVEPOINT REVERSE_LAST_AMORTIZATION;
6415 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
6416
6417 -- Standard call to check for call compatibility
6418 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6419 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6420 END IF;
6421
6422 -- Initialize message list if p_init_msg_list is set to TRUE
6423 IF FND_API.To_Boolean(p_init_msg_list) THEN
6424 FND_MSG_PUB.initialize;
6425 END IF;
6426
6427 -- Initialize API return status to success
6428 l_return_status := FND_API.G_RET_STS_SUCCESS;
6429
6430 -- START OF BODY OF API
6431
6432 init;
6433
6434 /* getting object version and custom flag for further loan update */
6435
6436 open loan_version_cur(P_LOAN_ID);
6437 fetch loan_version_cur into l_loan_number, l_version_number, l_custom_payment_flag;
6438 close loan_version_cur;
6439
6440 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Crediting loan ' || l_loan_number);
6441 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'loan_id ' || P_LOAN_ID);
6442
6443 /* verify input parameters */
6444 if P_LOAN_ID is null then
6445
6446 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
6447 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
6448 FND_MSG_PUB.Add;
6449 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6450 RAISE FND_API.G_EXC_ERROR;
6451
6452 end if;
6453
6454 if P_LINE_TYPE is null then
6455 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LINE_TYPE');
6456 FND_MSG_PUB.Add;
6457 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6458 RAISE FND_API.G_EXC_ERROR;
6459 end if;
6460
6461 /* quering for last loan amortization record */
6462 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for last amortization record in LNS_AMORTIZATION_SCHEDS:');
6463
6464 open last_loan_amort_cur(P_LOAN_ID);
6465
6466 fetch last_loan_amort_cur into
6467 l_LAST_PAYMENT_NUMBER,
6468 l_due_date,
6469 l_amortization_schedule_id;
6470
6471 if last_loan_amort_cur%NOTFOUND then
6472
6473 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'No amortization record found. Exiting');
6474 return;
6475
6476 else
6477
6478 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
6479 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'PAYMENT_NUMBER: ' || l_LAST_PAYMENT_NUMBER);
6480 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'DUE_DATE: ' || l_due_date);
6481 LogMessage(FND_LOG.LEVEL_STATEMENT, 'amortization_schedule_id: ' || l_amortization_schedule_id);
6482
6483 end if;
6484
6485 close last_loan_amort_cur;
6486
6487 /* Quering for invoices with lines to reverse */
6488 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to Credit...');
6489
6490 l_Count := 0;
6491 open trx_to_reverse_cur(P_LOAN_ID, l_amortization_schedule_id, p_line_type);
6492
6493 LOOP
6494
6495 fetch trx_to_reverse_cur into
6496 l_TRX_NUMBER,
6497 l_CUSTOMER_TRX_ID,
6498 l_PAYMENT_SCHEDULE_ID,
6499 l_CUSTOMER_TRX_LINE_ID,
6500 l_LINE_TYPE,
6501 l_TRX_AMOUNT,
6502 l_APPLIED_AMOUNT,
6503 l_ORG_ID;
6504
6505 exit when trx_to_reverse_cur%NOTFOUND;
6506
6507 l_Count := l_Count+1;
6508 l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
6509 l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
6510 l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
6511 l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
6512 l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
6513 l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
6514 l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
6515 l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
6516
6517 END LOOP;
6518
6519 close trx_to_reverse_cur;
6520
6521 /* Verify count */
6522 if l_reverse_tbl.count = 0 then
6523
6524 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
6525 FND_MSG_PUB.Add;
6526 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
6527 RAISE FND_API.G_EXC_ERROR;
6528
6529 end if;
6530
6531 /* Create credit memos */
6532 CREATE_AR_CM(l_reverse_tbl);
6533
6534 if P_COMMIT = FND_API.G_TRUE then
6535 COMMIT WORK;
6536 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
6537 end if;
6538
6539 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully credit loan ' || l_loan_number);
6540
6541 -- END OF BODY OF API
6542 x_return_status := FND_API.G_RET_STS_SUCCESS;
6543
6544 -- Standard call to get message count and if count is 1, get message info
6545 FND_MSG_PUB.Count_And_Get(
6546 p_encoded => FND_API.G_FALSE,
6547 p_count => x_msg_count,
6548 p_data => x_msg_data);
6549
6550 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6551
6552 EXCEPTION
6553 WHEN FND_API.G_EXC_ERROR THEN
6554 ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6555 x_return_status := FND_API.G_RET_STS_ERROR;
6556 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6557 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6558 g_cr_return_status := 'ERROR';
6559 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6560 ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6561 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6562 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6563 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6564 g_cr_return_status := 'ERROR';
6565 WHEN OTHERS THEN
6566 ROLLBACK TO REVERSE_LAST_AMORTIZATION;
6567 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6568 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6569 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6570 END IF;
6571 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6572 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
6573 g_cr_return_status := 'ERROR';
6574
6575 END CREDIT_AMORTIZATION_PARTIAL;
6576
6577 /*========================================================================
6578 | PUBLIC PROCEDURE CREATE_SINGLE_OFFCYCLE_BILL
6579 |
6580 | DESCRIPTION
6581 | This procedure creates a single OFFCYCLE bill
6582 |
6583 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
6584 | CREATE_OFFCYCLE_BILLS
6585 |
6586 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
6587 | init
6588 | CREATE_AR_INVOICES
6589 | LogMessage
6590 |
6591 | PARAMETERS
6592 | P_API_VERSION IN Standard in parameter
6593 | P_INIT_MSG_LIST IN Standard in parameter
6594 | P_COMMIT IN Standard in parameter
6595 | P_VALIDATION_LEVEL IN Standard in parameter
6596 | P_BILL_HEADER_REC IN Manual bill header record
6597 | P_BILL_LINES_TBL IN Manual bill lines
6598 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
6599 | X_MSG_COUNT OUT NOCOPY Standard out parameter
6600 | X_MSG_DATA OUT NOCOPY Standard out parameter
6601 |
6602 | KNOWN ISSUES
6603 | None
6604 |
6605 | NOTES
6606 | Any interesting aspect of the code in the package body which needs
6607 | to be stated.
6608 |
6609 | MODIFICATION HISTORY
6610 | Date Author Description of Changes
6611 | 01-01-2004 scherkas Created
6612 |
6613 *=======================================================================*/
6614 PROCEDURE CREATE_SINGLE_OFFCYCLE_BILL(
6615 P_API_VERSION IN NUMBER,
6616 P_INIT_MSG_LIST IN VARCHAR2,
6617 P_COMMIT IN VARCHAR2,
6618 P_VALIDATION_LEVEL IN NUMBER,
6619 P_BILL_HEADER_REC IN LNS_BILLING_BATCH_PUB.BILL_HEADER_REC,
6620 P_BILL_LINES_TBL IN LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
6621 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
6622 X_MSG_COUNT OUT NOCOPY NUMBER,
6623 X_MSG_DATA OUT NOCOPY VARCHAR2)
6624 IS
6625
6626 /*-----------------------------------------------------------------------+
6627 | Local Variable Declarations and initializations |
6628 +-----------------------------------------------------------------------*/
6629 l_api_name CONSTANT VARCHAR2(30) := 'CREATE_SINGLE_OFFCYCLE_BILL';
6630 l_api_version CONSTANT NUMBER := 1.0;
6631 l_return_status VARCHAR2(1);
6632 l_msg_count NUMBER;
6633 l_msg_data VARCHAR2(32767);
6634 l_Count NUMBER;
6635 l_prin_balance number;
6636 l_funded_amount number;
6637
6638 l_loan_header_rec LNS_LOAN_HEADER_PUB.loan_header_rec_type;
6639 l_loan_rec LNS_BILLING_BATCH_PUB.LOAN_TO_BILL_REC;
6640 l_lines_tbl LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
6641
6642 /*-----------------------------------------------------------------------+
6643 | Cursor Declarations |
6644 +-----------------------------------------------------------------------*/
6645
6646 CURSOR loan_cur(P_LOAN_ID number, P_PAYMENT_NUMBER number) IS
6647 select
6648 head.LOAN_ID,
6649 head.LOAN_NUMBER,
6650 head.LOAN_DESCRIPTION,
6651 head.LOAN_CURRENCY,
6652 head.CUST_ACCOUNT_ID,
6653 head.BILL_TO_ACCT_SITE_ID,
6654 term.NUMBER_GRACE_DAYS,
6655 term.PAYMENT_APPLICATION_ORDER,
6656 decode(am.AMORTIZATION_SCHEDULE_ID, null, -1, am.AMORTIZATION_SCHEDULE_ID) AMORTIZATION_SCHEDULE_ID,
6657 head.EXCHANGE_RATE_TYPE,
6658 head.EXCHANGE_DATE,
6659 head.EXCHANGE_RATE,
6660 head.ORG_ID,
6661 head.LEGAL_ENTITY_ID,
6662 head.FUNDED_AMOUNT,
6663 nvl(head.CURRENT_PHASE, 'TERM'),
6664 nvl(head.FORGIVENESS_FLAG, 'N'),
6665 nvl(head.FORGIVENESS_PERCENT, 0),
6666 decode(am.AMORTIZATION_SCHEDULE_ID, null, head.FUNDED_AMOUNT, am.FUNDED_AMOUNT)
6667 from LNS_LOAN_HEADERS_VL head,
6668 LNS_TERMS term,
6669 LNS_AMORTIZATION_SCHEDS am
6670 where head.LOAN_ID = P_LOAN_ID
6671 -- Bug#6830765 - Enable billing for all loan status, used in Application fee 'SubmitForApproval Fee'
6672 -- and head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
6673 and head.loan_id = term.loan_id
6674 and head.loan_id = am.loan_id(+)
6675 and am.PARENT_AMORTIZATION_ID(+) is null
6676 and am.PAYMENT_NUMBER(+) = P_PAYMENT_NUMBER
6677 and (am.REVERSED_FLAG is null or am.REVERSED_FLAG = 'N')
6678 and nvl(am.PHASE(+), 'TERM') = nvl(head.CURRENT_PHASE, 'TERM');
6679
6680 -- getting loan version
6681 CURSOR loan_version_cur(P_LOAN_ID number) IS
6682 select OBJECT_VERSION_NUMBER
6683 from LNS_LOAN_HEADERS
6684 where LOAN_ID = P_LOAN_ID;
6685
6686
6687 BEGIN
6688
6689 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
6690
6691 l_lines_tbl := P_BILL_LINES_TBL;
6692
6693 -- Standard start of API savepoint
6694 SAVEPOINT CREATE_SINGLE_OFFCYCLE_BILL;
6695 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
6696
6697 -- Standard call to check for call compatibility
6698 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6699 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6700 END IF;
6701
6702 -- Initialize message list if p_init_msg_list is set to TRUE
6703 IF FND_API.To_Boolean(p_init_msg_list) THEN
6704 FND_MSG_PUB.initialize;
6705 END IF;
6706
6707 -- Initialize API return status to success
6708 l_return_status := FND_API.G_RET_STS_SUCCESS;
6709
6710 -- START OF BODY OF API
6711
6712 init;
6713
6714 /* verify input parameters */
6715
6716 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Header data:');
6717 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || P_BILL_HEADER_REC.LOAN_ID);
6718 LogMessage(FND_LOG.LEVEL_STATEMENT, 'ASSOC_PAYMENT_NUM: ' || P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6719 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || P_BILL_HEADER_REC.DUE_DATE);
6720
6721 if P_BILL_HEADER_REC.LOAN_ID is null then
6722 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan ID is not set.');
6723 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LOAN');
6724 FND_MSG_PUB.Add;
6725 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6726 RAISE FND_API.G_EXC_ERROR;
6727 end if;
6728
6729 if P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM is null then
6730 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Associated Payment Number is not set.');
6731 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_NUM');
6732 FND_MSG_PUB.Add;
6733 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6734 RAISE FND_API.G_EXC_ERROR;
6735 end if;
6736
6737 if P_BILL_HEADER_REC.DUE_DATE is null then
6738 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Bill Due Date is not set.');
6739 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_DUE');
6740 FND_MSG_PUB.Add;
6741 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6742 RAISE FND_API.G_EXC_ERROR;
6743 end if;
6744
6745 if l_lines_tbl.count = 0 then
6746 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No lines found for header ' || P_BILL_HEADER_REC.HEADER_ID);
6747 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINES');
6748 FND_MESSAGE.SET_TOKEN('HEADER', P_BILL_HEADER_REC.HEADER_ID);
6749 FND_MSG_PUB.Add;
6750 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6751 RAISE FND_API.G_EXC_ERROR;
6752 end if;
6753
6754 /* init amounts */
6755 l_loan_rec.NEXT_PRINCIPAL_AMOUNT := 0;
6756 l_loan_rec.NEXT_INTEREST_AMOUNT := 0;
6757 l_loan_rec.NEXT_FEE_AMOUNT := 0;
6758
6759 /* looping and suming amounts */
6760 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Lines data:');
6761
6762 FOR l_Count IN 1..l_lines_tbl.count LOOP
6763
6764 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Line # ' || l_Count);
6765 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_ID: ' || l_lines_tbl(l_Count).LINE_ID);
6766 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_AMOUNT: ' || l_lines_tbl(l_Count).LINE_AMOUNT);
6767 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_TYPE: ' || l_lines_tbl(l_Count).LINE_TYPE);
6768 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_DESC: ' || l_lines_tbl(l_Count).LINE_DESC);
6769 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LINE_REF_ID: ' || l_lines_tbl(l_Count).LINE_REF_ID);
6770 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CASH_RECEIPT_ID: ' || l_lines_tbl(l_Count).CASH_RECEIPT_ID);
6771 LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLY_AMOUNT: ' || l_lines_tbl(l_Count).APPLY_AMOUNT);
6772 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_SCHEDULE_ID: ' || l_lines_tbl(l_Count).FEE_SCHEDULE_ID);
6773
6774 /* Verifying lines data */
6775 if l_lines_tbl(l_Count).LINE_AMOUNT is null or l_lines_tbl(l_Count).LINE_AMOUNT = 0 then
6776 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Amount for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6777 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_AMOUNT');
6778 FND_MESSAGE.SET_TOKEN('LINE', l_lines_tbl(l_Count).LINE_ID);
6779 FND_MSG_PUB.Add;
6780 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6781 RAISE FND_API.G_EXC_ERROR;
6782 end if;
6783
6784 if l_lines_tbl(l_Count).LINE_TYPE is null then
6785 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Line type for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6786 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_TYPE');
6787 FND_MESSAGE.SET_TOKEN('LINE', l_lines_tbl(l_Count).LINE_ID);
6788 FND_MSG_PUB.Add;
6789 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6790 RAISE FND_API.G_EXC_ERROR;
6791 end if;
6792 /*
6793 if l_lines_tbl(l_Count).LINE_DESC is null then
6794 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Line description for line ' || l_lines_tbl(l_Count).LINE_ID || ' is not set.');
6795 RAISE FND_API.G_EXC_ERROR;
6796 end if;
6797 */
6798 /* Suming amounts */
6799 if l_lines_tbl(l_Count).LINE_TYPE = 'PRIN' then
6800 l_loan_rec.NEXT_PRINCIPAL_AMOUNT := l_loan_rec.NEXT_PRINCIPAL_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6801 elsif l_lines_tbl(l_Count).LINE_TYPE = 'INT' then
6802 l_loan_rec.NEXT_INTEREST_AMOUNT := l_loan_rec.NEXT_INTEREST_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6803 elsif l_lines_tbl(l_Count).LINE_TYPE = 'FEE' then
6804 l_loan_rec.NEXT_FEE_AMOUNT := l_loan_rec.NEXT_FEE_AMOUNT + l_lines_tbl(l_Count).LINE_AMOUNT;
6805 end if;
6806
6807 END LOOP;
6808
6809 /* validate principal amount */
6810 VALIDATE_PRIN_AMOUNT(P_BILL_HEADER_REC.LOAN_ID, l_loan_rec.NEXT_PRINCIPAL_AMOUNT, P_BILL_HEADER_REC.DUE_DATE);
6811
6812 /* quering for data needed for billing */
6813 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Creating OFFCYCLE bill for loan ' || P_BILL_HEADER_REC.LOAN_ID);
6814
6815 open loan_cur(P_BILL_HEADER_REC.LOAN_ID, P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6816
6817 fetch loan_cur into
6818 l_loan_rec.LOAN_ID,
6819 l_loan_rec.LOAN_NUMBER,
6820 l_loan_rec.LOAN_DESCRIPTION,
6821 l_loan_rec.LOAN_CURRENCY,
6822 l_loan_rec.CUST_ACCOUNT_ID,
6823 l_loan_rec.BILL_TO_ADDRESS_ID,
6824 l_loan_rec.NUMBER_GRACE_DAYS,
6825 l_loan_rec.PAYMENT_APPLICATION_ORDER,
6826 l_loan_rec.PARENT_AMORTIZATION_ID,
6827 l_loan_rec.EXCHANGE_RATE_TYPE,
6828 l_loan_rec.EXCHANGE_DATE,
6829 l_loan_rec.EXCHANGE_RATE,
6830 l_loan_rec.ORG_ID,
6831 l_loan_rec.LEGAL_ENTITY_ID,
6832 l_loan_rec.FUNDED_AMOUNT,
6833 l_loan_rec.CURRENT_PHASE,
6834 l_loan_rec.FORGIVENESS_FLAG,
6835 l_loan_rec.FORGIVENESS_PERCENT,
6836 l_funded_amount;
6837
6838 if loan_cur%NOTFOUND then
6839 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No amortization record found.');
6840 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_INSTALLMENT');
6841 FND_MESSAGE.SET_TOKEN('LOAN',P_BILL_HEADER_REC.LOAN_ID);
6842 FND_MESSAGE.SET_TOKEN('INST', P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM);
6843 FND_MSG_PUB.Add;
6844 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6845 RAISE FND_API.G_EXC_ERROR;
6846 end if;
6847
6848 close loan_cur;
6849
6850 if P_BILL_HEADER_REC.CUST_ACCOUNT_ID is not null and P_BILL_HEADER_REC.BILL_TO_ADDRESS_ID is not null then
6851 l_loan_rec.CUST_ACCOUNT_ID := P_BILL_HEADER_REC.CUST_ACCOUNT_ID;
6852 l_loan_rec.BILL_TO_ADDRESS_ID := P_BILL_HEADER_REC.BILL_TO_ADDRESS_ID;
6853 end if;
6854
6855 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization record found:');
6856 LogMessage(FND_LOG.LEVEL_STATEMENT, 'AMORTIZATION_ID: ' || l_loan_rec.PARENT_AMORTIZATION_ID);
6857 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER: ' || l_loan_rec.LOAN_NUMBER);
6858 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_DESCRIPTION: ' || l_loan_rec.LOAN_DESCRIPTION);
6859 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || l_loan_rec.LOAN_CURRENCY);
6860 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || l_loan_rec.CUST_ACCOUNT_ID);
6861 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || l_loan_rec.BILL_TO_ADDRESS_ID);
6862 LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || l_loan_rec.NUMBER_GRACE_DAYS);
6863 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || l_loan_rec.PAYMENT_APPLICATION_ORDER);
6864 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_loan_rec.EXCHANGE_RATE_TYPE);
6865 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_loan_rec.EXCHANGE_DATE);
6866 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_loan_rec.EXCHANGE_RATE);
6867 LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORG_ID: ' || l_loan_rec.ORG_ID);
6868 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LEGAL_ENTITY_ID: ' || l_loan_rec.LEGAL_ENTITY_ID);
6869 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || l_loan_rec.FUNDED_AMOUNT);
6870 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_loan_rec.CURRENT_PHASE);
6871 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_FLAG: ' || l_loan_rec.FORGIVENESS_FLAG);
6872 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_PERCENT: ' || l_loan_rec.FORGIVENESS_PERCENT);
6873
6874 /* setting new values */
6875 l_loan_rec.NEXT_PAYMENT_NUMBER := P_BILL_HEADER_REC.ASSOC_PAYMENT_NUM;
6876 l_loan_rec.NEXT_PAYMENT_DUE_DATE := P_BILL_HEADER_REC.DUE_DATE;
6877 l_loan_rec.NEXT_PAYMENT_LATE_DATE := P_BILL_HEADER_REC.DUE_DATE + nvl(l_loan_rec.NUMBER_GRACE_DAYS, 0);
6878
6879 /* Inserting new record into LNS_AMORTIZATION_SCHEDS */
6880 l_prin_balance := null;
6881 if l_loan_rec.CURRENT_PHASE is not null and l_loan_rec.CURRENT_PHASE = 'OPEN' then
6882 l_prin_balance := l_loan_rec.FUNDED_AMOUNT;
6883 end if;
6884
6885 l_loan_rec.PRINCIPAL_BALANCE := null;
6886 if l_loan_rec.CURRENT_PHASE is not null and l_loan_rec.CURRENT_PHASE = 'OPEN' then
6887 l_loan_rec.PRINCIPAL_BALANCE := l_loan_rec.FUNDED_AMOUNT;
6888 end if;
6889 l_loan_rec.FUNDED_AMOUNT := l_funded_amount;
6890 l_loan_rec.DEFERRED_INT_AMOUNT := 0;
6891 l_loan_rec.CURR_CAP_INT_AMOUNT := 0;
6892 l_loan_rec.CAP_INT_AMOUNT := 0;
6893
6894 /* Creating AR invoices */
6895 CREATE_AR_INVOICES(l_loan_rec, l_lines_tbl);
6896
6897 STORE_LAST_PAYMENT_NUMBER(l_loan_rec.LOAN_ID);
6898
6899 GENERATE_BILLING_STATEMENT_XML(
6900 p_loan_id => l_loan_rec.LOAN_ID,
6901 p_amortization_schedule_id => l_loan_rec.NEXT_AMORTIZATION_ID);
6902
6903 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created OFFCYCLE bill');
6904
6905 -- loan forgiveness adjustment for manual bills: fix for bug 7429910
6906 -- fix for bug 14488464 - dont do forgiveness if its for loan split
6907 if l_loan_rec.FORGIVENESS_FLAG = 'Y' and
6908 l_loan_rec.FORGIVENESS_PERCENT > 0 and
6909 g_forgiveness_rec_trx_id is not null and
6910 P_BILL_HEADER_REC.CUST_ACCOUNT_ID is null and P_BILL_HEADER_REC.BILL_TO_ADDRESS_ID is null --fix for bug 14488464
6911 then
6912
6913 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Performing loan forgiveness adjustment...');
6914 FORGIVENESS_ADJUSTMENT(
6915 P_API_VERSION => 1.0,
6916 P_INIT_MSG_LIST => FND_API.G_TRUE,
6917 P_COMMIT => FND_API.G_FALSE,
6918 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
6919 P_LOAN_ID => l_loan_rec.LOAN_ID,
6920 X_RETURN_STATUS => l_return_status,
6921 X_MSG_COUNT => l_msg_count,
6922 X_MSG_DATA => l_msg_data);
6923
6924 IF l_return_status = 'S' THEN
6925 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully performed forgiveness adjustment.');
6926 ELSE
6927 --LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to perform forgiveness adjustment');
6928 FND_MESSAGE.SET_NAME('LNS', 'LNS_FORGIVENESS_FAIL');
6929 FND_MSG_PUB.Add;
6930 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
6931 RAISE FND_API.G_EXC_ERROR;
6932 END IF;
6933
6934 else
6935 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Will not perform loan forgiveness adjustment');
6936 end if;
6937
6938 if P_COMMIT = FND_API.G_TRUE then
6939 COMMIT WORK;
6940 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
6941 end if;
6942
6943 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created OFFCYCLE bill');
6944
6945 /* applying cash receipts */
6946
6947 FOR l_Count IN 1..l_lines_tbl.count LOOP
6948
6949 if l_lines_tbl(l_Count).CASH_RECEIPT_ID is not null and
6950 l_lines_tbl(l_Count).APPLY_AMOUNT is not null and l_lines_tbl(l_Count).APPLY_AMOUNT > 0 then
6951
6952 APPLY_RECEIPT(P_CASH_RECEIPT_ID => l_lines_tbl(l_Count).CASH_RECEIPT_ID,
6953 P_TRX_ID => l_lines_tbl(l_Count).CUSTOMER_TRX_ID,
6954 P_TRX_LINE_ID => l_lines_tbl(l_Count).CUSTOMER_TRX_LINE_ID,
6955 P_APPLY_AMOUNT => l_lines_tbl(l_Count).APPLY_AMOUNT);
6956
6957 end if;
6958
6959 END LOOP;
6960
6961 -- END OF BODY OF API
6962 x_return_status := FND_API.G_RET_STS_SUCCESS;
6963
6964 -- Standard call to get message count and if count is 1, get message info
6965 FND_MSG_PUB.Count_And_Get(
6966 p_encoded => FND_API.G_FALSE,
6967 p_count => x_msg_count,
6968 p_data => x_msg_data);
6969
6970 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
6971
6972 EXCEPTION
6973 WHEN FND_API.G_EXC_ERROR THEN
6974 ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6975 x_return_status := FND_API.G_RET_STS_ERROR;
6976 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6977 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6978 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6979 ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6980 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6981 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6982 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6983 WHEN OTHERS THEN
6984 ROLLBACK TO CREATE_SINGLE_OFFCYCLE_BILL;
6985 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6986 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
6987 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
6988 END IF;
6989 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
6990 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
6991 END;
6992
6993
6994
6995 /*========================================================================
6996 | PUBLIC PROCEDURE CREATE_OFFCYCLE_BILLS
6997 |
6998 | DESCRIPTION
6999 | This procedure creates many OFFCYCLE bills
7000 |
7001 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7002 | None
7003 |
7004 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7005 | CREATE_SINGLE_OFFCYCLE_BILL
7006 | LogMessage
7007 |
7008 | PARAMETERS
7009 | P_API_VERSION IN Standard in parameter
7010 | P_INIT_MSG_LIST IN Standard in parameter
7011 | P_COMMIT IN Standard in parameter
7012 | P_VALIDATION_LEVEL IN Standard in parameter
7013 | P_BILL_HEADERS_TBL IN Manual bill headers
7014 | P_BILL_LINES_TBL IN Manual bill lines
7015 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
7016 | X_MSG_COUNT OUT NOCOPY Standard out parameter
7017 | X_MSG_DATA OUT NOCOPY Standard out parameter
7018 |
7019 | KNOWN ISSUES
7020 | None
7021 |
7022 | NOTES
7023 | Any interesting aspect of the code in the package body which needs
7024 | to be stated.
7025 |
7026 | MODIFICATION HISTORY
7027 | Date Author Description of Changes
7028 | 01-01-2004 scherkas Created
7029 |
7030 *=======================================================================*/
7031 PROCEDURE CREATE_OFFCYCLE_BILLS(
7032 P_API_VERSION IN NUMBER,
7033 P_INIT_MSG_LIST IN VARCHAR2,
7034 P_COMMIT IN VARCHAR2,
7035 P_VALIDATION_LEVEL IN NUMBER,
7036 P_BILL_HEADERS_TBL IN LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL,
7037 P_BILL_LINES_TBL IN LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
7038 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
7039 X_MSG_COUNT OUT NOCOPY NUMBER,
7040 X_MSG_DATA OUT NOCOPY VARCHAR2)
7041 IS
7042
7043 /*-----------------------------------------------------------------------+
7044 | Local Variable Declarations and initializations |
7045 +-----------------------------------------------------------------------*/
7046
7047 l_api_name CONSTANT VARCHAR2(30) := 'CREATE_OFFCYCLE_BILLS';
7048 l_api_version CONSTANT NUMBER := 1.0;
7049 l_return_status VARCHAR2(1);
7050 l_msg_count NUMBER;
7051 l_msg_data VARCHAR2(32767);
7052 l_Count NUMBER;
7053 l_Count1 NUMBER;
7054 l_Count2 NUMBER;
7055 l_bill_lines_tbl LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
7056
7057 BEGIN
7058
7059 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7060
7061 -- Standard start of API savepoint
7062 SAVEPOINT CREATE_OFFCYCLE_BILLS;
7063 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7064
7065 -- Standard call to check for call compatibility
7066 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7067 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7068 END IF;
7069
7070 -- Initialize message list if p_init_msg_list is set to TRUE
7071 IF FND_API.To_Boolean(p_init_msg_list) THEN
7072 FND_MSG_PUB.initialize;
7073 END IF;
7074
7075 -- Initialize API return status to success
7076 l_return_status := FND_API.G_RET_STS_SUCCESS;
7077
7078 -- START OF BODY OF API
7079 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Creating OFFCYCLE bills...');
7080
7081 /* Looping thru headers table */
7082 FOR l_Count IN 1..P_BILL_HEADERS_TBL.count LOOP
7083
7084 if P_BILL_HEADERS_TBL(l_Count).HEADER_ID is null then
7085 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Header ID is not set.');
7086 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_HEADER');
7087 FND_MSG_PUB.Add;
7088 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7089 RAISE FND_API.G_EXC_ERROR;
7090 end if;
7091
7092 /* Init lines table */
7093 l_Count2 := 0;
7094 l_bill_lines_tbl.delete;
7095
7096 /* Looping thru lines table */
7097 FOR l_Count1 IN 1..P_BILL_LINES_TBL.count LOOP
7098
7099 if P_BILL_LINES_TBL(l_Count1).HEADER_ID is null then
7100 -- LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: Header ID for line ' || P_BILL_LINES_TBL(l_Count1).LINE_ID || ' is not set.');
7101 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_BILL_NO_LINE_HEADER');
7102 FND_MESSAGE.SET_TOKEN('LINE', P_BILL_LINES_TBL(l_Count1).LINE_ID);
7103 FND_MSG_PUB.Add;
7104 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7105 RAISE FND_API.G_EXC_ERROR;
7106 end if;
7107
7108 /* Adding current line record to lines table of current header */
7109 if P_BILL_HEADERS_TBL(l_Count).HEADER_ID = P_BILL_LINES_TBL(l_Count1).HEADER_ID then
7110 l_Count2 := l_Count2+1;
7111 l_bill_lines_tbl(l_Count2) := P_BILL_LINES_TBL(l_Count1);
7112 end if;
7113
7114 END LOOP;
7115
7116 /* Create a single offcycle bill */
7117 CREATE_SINGLE_OFFCYCLE_BILL(
7118 P_API_VERSION => 1.0,
7119 P_INIT_MSG_LIST => FND_API.G_TRUE,
7120 P_COMMIT => FND_API.G_FALSE,
7121 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
7122 P_BILL_HEADER_REC => P_BILL_HEADERS_TBL(l_Count),
7123 P_BILL_LINES_TBL => l_bill_lines_tbl,
7124 X_RETURN_STATUS => l_return_status,
7125 X_MSG_COUNT => l_msg_count,
7126 X_MSG_DATA => l_msg_data);
7127
7128 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7129 RAISE FND_API.G_EXC_ERROR;
7130 END IF;
7131
7132 END LOOP;
7133
7134 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
7135 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Total processed ' || P_BILL_HEADERS_TBL.count || ' OFFCYCLE bill(s)');
7136
7137 if P_COMMIT = FND_API.G_TRUE then
7138 COMMIT WORK;
7139 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited loan');
7140 end if;
7141
7142 -- END OF BODY OF API
7143 x_return_status := FND_API.G_RET_STS_SUCCESS;
7144
7145 -- Standard call to get message count and if count is 1, get message info
7146 FND_MSG_PUB.Count_And_Get(
7147 p_encoded => FND_API.G_FALSE,
7148 p_count => x_msg_count,
7149 p_data => x_msg_data);
7150
7151 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7152
7153 EXCEPTION
7154 WHEN FND_API.G_EXC_ERROR THEN
7155 ROLLBACK TO CREATE_OFFCYCLE_BILLS;
7156 x_return_status := FND_API.G_RET_STS_ERROR;
7157 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7158 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
7159 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7160 ROLLBACK TO CREATE_OFFCYCLE_BILLS;
7161 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7162 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7163 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
7164 WHEN OTHERS THEN
7165 ROLLBACK TO CREATE_OFFCYCLE_BILLS;
7166 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7167 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7168 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7169 END IF;
7170 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7171 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked loan');
7172 END;
7173
7174
7175
7176 /*========================================================================
7177 | PUBLIC PROCEDURE REVERSE_OFFCYCLE_BILL
7178 |
7179 | DESCRIPTION
7180 | This procedure reverses an offcycle bill
7181 |
7182 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7183 | None
7184 |
7185 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7186 | init
7187 | CREATE_AR_CM
7188 | LogMessage
7189 |
7190 | PARAMETERS
7191 | P_API_VERSION IN Standard in parameter
7192 | P_INIT_MSG_LIST IN Standard in parameter
7193 | P_COMMIT IN Standard in parameter
7194 | P_VALIDATION_LEVEL IN Standard in parameter
7195 | P_AMORTIZATION_ID IN Input amortization id to reverse
7196 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
7197 | X_MSG_COUNT OUT NOCOPY Standard out parameter
7198 | X_MSG_DATA OUT NOCOPY Standard out parameter
7199 |
7200 | KNOWN ISSUES
7201 | None
7202 |
7203 | NOTES
7204 | Any interesting aspect of the code in the package body which needs
7205 | to be stated.
7206 |
7207 | MODIFICATION HISTORY
7208 | Date Author Description of Changes
7209 | 01-01-2004 scherkas Created
7210 |
7211 *=======================================================================*/
7212 PROCEDURE REVERSE_OFFCYCLE_BILL(
7213 P_API_VERSION IN NUMBER,
7214 P_INIT_MSG_LIST IN VARCHAR2,
7215 P_COMMIT IN VARCHAR2,
7216 P_VALIDATION_LEVEL IN NUMBER,
7217 P_AMORTIZATION_ID IN NUMBER,
7218 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
7219 X_MSG_COUNT OUT NOCOPY NUMBER,
7220 X_MSG_DATA OUT NOCOPY VARCHAR2)
7221 IS
7222
7223 /*-----------------------------------------------------------------------+
7224 | Local Variable Declarations and initializations |
7225 +-----------------------------------------------------------------------*/
7226
7227 l_api_name CONSTANT VARCHAR2(30) := 'REVERSE_OFFCYCLE_BILL';
7228 l_api_version CONSTANT NUMBER := 1.0;
7229 l_return_status VARCHAR2(1);
7230 l_msg_count NUMBER;
7231 l_msg_data VARCHAR2(32767);
7232 l_Count number;
7233 l_LOAN_ID number;
7234 l_BILL_PAY_ID number;
7235 l_CUSTOMER_TRX_ID number;
7236 l_PAYMENT_SCHEDULE_ID number;
7237 l_CUSTOMER_TRX_LINE_ID number;
7238 l_LINE_TYPE varchar2(30);
7239 l_TRX_AMOUNT number;
7240 l_APPLIED_AMOUNT number;
7241 l_PAYMENT_NUMBER number;
7242 l_DUE_DATE date;
7243 l_PARENT_AMORTIZATION_ID number;
7244 l_REVERSED_FLAG varchar2(1);
7245 l_TRX_NUMBER varchar2(20);
7246 l_ORG_ID number;
7247
7248 l_reverse_tbl LNS_BILLING_BATCH_PUB.REVERSE_TBL;
7249 l_lns_status LNS_LOAN_HEADERS_ALL.loan_status%TYPE;
7250
7251 /*-----------------------------------------------------------------------+
7252 | Cursor Declarations |
7253 +-----------------------------------------------------------------------*/
7254
7255 CURSOR amort_cur(P_AMORTIZATION_ID number) IS
7256 select LOAN_ID,
7257 PAYMENT_NUMBER,
7258 DUE_DATE,
7259 PARENT_AMORTIZATION_ID,
7260 REVERSED_CODE
7261 from LNS_AM_SCHEDS_V
7262 where AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
7263
7264
7265 CURSOR trx_to_reverse_cur(P_LOAN_ID number, P_AMORTIZATION_ID number) IS
7266 select
7267 trx.trx_number,
7268 trx.customer_trx_id,
7269 psa.payment_schedule_id,
7270 lines.CUST_TRX_LINE_ID,
7271 lines.LINE_TYPE,
7272 lines.AMOUNT,
7273 (psa.AMOUNT_DUE_ORIGINAL - psa.AMOUNT_DUE_REMAINING),
7274 trx.org_id
7275 from
7276 RA_CUSTOMER_TRX_ALL trx,
7277 lns_amortization_lines lines,
7278 ar_payment_schedules psa
7279 where
7280 trx.customer_trx_id = lines.CUST_TRX_ID and
7281 trx.customer_trx_id = psa.customer_trx_id and
7282 lines.LOAN_ID = P_LOAN_ID and
7283 lines.AMORTIZATION_SCHEDULE_ID = P_AMORTIZATION_ID;
7284
7285 BEGIN
7286
7287 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7288
7289 -- Standard start of API savepoint
7290 SAVEPOINT REVERSE_OFFCYCLE_BILL;
7291 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7292
7293 -- Standard call to check for call compatibility
7294 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7295 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7296 END IF;
7297
7298 -- Initialize message list if p_init_msg_list is set to TRUE
7299 IF FND_API.To_Boolean(p_init_msg_list) THEN
7300 FND_MSG_PUB.initialize;
7301 END IF;
7302
7303 -- Initialize API return status to success
7304 l_return_status := FND_API.G_RET_STS_SUCCESS;
7305
7306 -- START OF BODY OF API
7307
7308 init;
7309
7310 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reversing offcycle bill with amortization_id ' || P_AMORTIZATION_ID);
7311
7312 /* verify input parameters */
7313 if P_AMORTIZATION_ID is null then
7314 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Amortization ID must be set.');
7315 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NO_AMORT');
7316 FND_MSG_PUB.Add;
7317 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7318 RAISE FND_API.G_EXC_ERROR;
7319 end if;
7320
7321 /* verify is it really offcycle bill, reversed etc. */
7322 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Querying for details of the amortization:');
7323
7324 open amort_cur(P_AMORTIZATION_ID);
7325 fetch amort_cur into
7326 l_LOAN_ID,
7327 l_PAYMENT_NUMBER,
7328 l_DUE_DATE,
7329 l_PARENT_AMORTIZATION_ID,
7330 l_REVERSED_FLAG;
7331
7332 if amort_cur%NOTFOUND then
7333
7334 -- LogMessage(FND_LOG.LEVEL_ERROR, 'ERROR: No amortization record found.');
7335 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NO_BILL_FOUND');
7336 FND_MSG_PUB.Add;
7337 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7338 RAISE FND_API.G_EXC_ERROR;
7339
7340 else
7341
7342 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_LOAN_ID);
7343 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_NUMBER: ' || l_PAYMENT_NUMBER);
7344 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_DUE_DATE);
7345 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PARENT_AMORTIZATION_ID: ' || l_PARENT_AMORTIZATION_ID);
7346 LogMessage(FND_LOG.LEVEL_STATEMENT, 'REVERSED_FLAG: ' || l_REVERSED_FLAG);
7347
7348 if l_PARENT_AMORTIZATION_ID is null then
7349
7350 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The amortization is not offcycle bill.');
7351 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NOT_MAN_BILL');
7352 FND_MSG_PUB.Add;
7353 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7354 RAISE FND_API.G_EXC_ERROR;
7355
7356 elsif l_REVERSED_FLAG = 'Y' then
7357
7358 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: The amortization is already reversed.');
7359 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_ALREADY_REV');
7360 FND_MSG_PUB.Add;
7361 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7362 RAISE FND_API.G_EXC_ERROR;
7363
7364 end if;
7365
7366 end if;
7367
7368 close amort_cur;
7369
7370 /* Quering for invoices with lines to reverse */
7371 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Quering for trx lines to reverse...');
7372
7373 open trx_to_reverse_cur(l_LOAN_ID, P_AMORTIZATION_ID);
7374
7375 l_Count := 0;
7376 LOOP
7377 fetch trx_to_reverse_cur into
7378 l_TRX_NUMBER,
7379 l_CUSTOMER_TRX_ID,
7380 l_PAYMENT_SCHEDULE_ID,
7381 l_CUSTOMER_TRX_LINE_ID,
7382 l_LINE_TYPE,
7383 l_TRX_AMOUNT,
7384 l_APPLIED_AMOUNT,
7385 l_ORG_ID;
7386 exit when trx_to_reverse_cur%NOTFOUND;
7387
7388 l_Count := l_Count+1;
7389 l_reverse_tbl(l_Count).TRX_NUMBER := l_TRX_NUMBER;
7390 l_reverse_tbl(l_Count).CUSTOMER_TRX_ID := l_CUSTOMER_TRX_ID;
7391 l_reverse_tbl(l_Count).PAYMENT_SCHEDULE_ID := l_PAYMENT_SCHEDULE_ID;
7392 l_reverse_tbl(l_Count).CUSTOMER_TRX_LINE_ID := l_CUSTOMER_TRX_LINE_ID;
7393 l_reverse_tbl(l_Count).LINE_TYPE := l_LINE_TYPE;
7394 l_reverse_tbl(l_Count).TRX_AMOUNT := l_TRX_AMOUNT;
7395 l_reverse_tbl(l_Count).APPLIED_AMOUNT := l_APPLIED_AMOUNT;
7396 l_reverse_tbl(l_Count).ORG_ID := l_ORG_ID;
7397
7398 END LOOP;
7399
7400 close trx_to_reverse_cur;
7401
7402 /* Check for table count */
7403 if l_reverse_tbl.count = 0 then
7404
7405 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: No trx lines found to reverse.');
7406 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_LINES_TO_REV');
7407 FND_MSG_PUB.Add;
7408 LogMessage(FND_LOG.LEVEL_ERROR, FND_MSG_PUB.Get(p_encoded => 'F'));
7409 RAISE FND_API.G_EXC_ERROR;
7410
7411 end if;
7412
7413 /* Create credit memos */
7414 CREATE_AR_CM(l_reverse_tbl);
7415
7416 /* Updating amortization table */
7417 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating record in LNS_AMORTIZATION_SCHEDS...') ;
7418
7419 LNS_AMORTIZATION_SCHEDS_PKG.Update_Row(
7420 P_AMORTIZATION_SCHEDULE_ID => P_AMORTIZATION_ID
7421 ,P_REVERSED_FLAG => 'Y'
7422 ,P_REVERSED_DATE => sysdate);
7423
7424 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Update successfull!');
7425
7426 SELECT lhdr.loan_status INTO l_lns_status FROM lns_loan_headers lhdr WHERE lhdr.loan_id = l_LOAN_ID;
7427
7428 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'The LoanStatus of loanid '||l_LOAN_ID||' is '||l_lns_status) ;
7429
7430 -- If the loanStatus is INCOMPLETE, then only update the lns_fee_schedules.billed_flag = 'N' for the submitForApproval fees
7431 IF l_lns_status = 'INCOMPLETE' THEN
7432 REVERSE_BILLED_FEES(p_amortization_id);
7433 END IF;
7434
7435 STORE_LAST_PAYMENT_NUMBER(l_LOAN_ID);
7436
7437 if P_COMMIT = FND_API.G_TRUE then
7438 COMMIT WORK;
7439 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
7440 end if;
7441
7442 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully reversed offcycle bill');
7443
7444 -- END OF BODY OF API
7445 x_return_status := FND_API.G_RET_STS_SUCCESS;
7446
7447 -- Standard call to get message count and if count is 1, get message info
7448 FND_MSG_PUB.Count_And_Get(
7449 p_encoded => FND_API.G_FALSE,
7450 p_count => x_msg_count,
7451 p_data => x_msg_data);
7452
7453 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7454
7455 EXCEPTION
7456 WHEN FND_API.G_EXC_ERROR THEN
7457 ROLLBACK TO REVERSE_OFFCYCLE_BILL;
7458 x_return_status := FND_API.G_RET_STS_ERROR;
7459 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7460 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7461 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7462 ROLLBACK TO REVERSE_OFFCYCLE_BILL;
7463 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7464 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7465 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7466 WHEN OTHERS THEN
7467 ROLLBACK TO REVERSE_OFFCYCLE_BILL;
7468 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7469 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7470 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7471 END IF;
7472 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7473 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7474 END;
7475
7476
7477
7478
7479 /*========================================================================
7480 | PUBLIC PROCEDURE ADJUST_ORIGINAL_RECEIVABLE
7481 |
7482 | DESCRIPTION
7483 | This procedure adjusts loans original receivable in AR
7484 |
7485 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7486 | None
7487 |
7488 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7489 | init
7490 | LogMessage
7491 |
7492 | PARAMETERS
7493 | P_API_VERSION IN Standard in parameter
7494 | P_INIT_MSG_LIST IN Standard in parameter
7495 | P_COMMIT IN Standard in parameter
7496 | P_VALIDATION_LEVEL IN Standard in parameter
7497 | P_LOAN_ID IN Loan ID
7498 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
7499 | X_MSG_COUNT OUT NOCOPY Standard out parameter
7500 | X_MSG_DATA OUT NOCOPY Standard out parameter
7501 |
7502 | KNOWN ISSUES
7503 | None
7504 |
7505 | NOTES
7506 | Any interesting aspect of the code in the package body which needs
7507 | to be stated.
7508 |
7509 | MODIFICATION HISTORY
7510 | Date Author Description of Changes
7511 | 01-01-2004 scherkas Created
7512 |
7513 *=======================================================================*/
7514 PROCEDURE ADJUST_ORIGINAL_RECEIVABLE(
7515 P_API_VERSION IN NUMBER,
7516 P_INIT_MSG_LIST IN VARCHAR2,
7517 P_COMMIT IN VARCHAR2,
7518 P_VALIDATION_LEVEL IN NUMBER,
7519 P_LOAN_ID IN NUMBER,
7520 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
7521 X_MSG_COUNT OUT NOCOPY NUMBER,
7522 X_MSG_DATA OUT NOCOPY VARCHAR2)
7523 IS
7524
7525 /*-----------------------------------------------------------------------+
7526 | Local Variable Declarations and initializations |
7527 +-----------------------------------------------------------------------*/
7528
7529 l_api_name CONSTANT VARCHAR2(30) := 'ADJUST_ORIGINAL_RECEIVABLE';
7530 l_api_version CONSTANT NUMBER := 1.0;
7531 l_return_status VARCHAR2(1);
7532 l_msg_count NUMBER;
7533 l_msg_data VARCHAR2(32767);
7534 l_loan_number varchar2(60);
7535 -- l_funded_amount number;
7536 l_trx_number varchar2(20);
7537 l_payment_schedule_id number;
7538 l_amount_due_remaining number;
7539 l_type varchar2(15);
7540 l_loan_desc varchar2(250);
7541 l_comments varchar2(2000);
7542 l_adj_number varchar2(20);
7543 l_adj_id number;
7544 -- l_version_number number;
7545 l_ussgl_flag varchar2(3);
7546 l_Count number;
7547 l_requested_amount number;
7548 l_line_id number;
7549 l_apply_date date;
7550 l_gl_date date;
7551 l_org_id number;
7552 l_legal_entity_id number;
7553
7554 -- for on-line accounting call
7555 l_err varchar2(50);
7556 l_ret number;
7557 ls_info xla_events_pub_pkg.t_event_source_info;
7558 l_accounting_batch_id number;
7559 l_request_id number;
7560 l_ledger_id number;
7561 l_installment_number number;
7562 l_loan_start_date date;
7563
7564 cursor c_ledger is
7565 SELECT so.set_of_books_id
7566 FROM lns_system_options so
7567 ,gl_sets_of_books sb
7568 WHERE sb.set_of_books_id = so.set_of_books_id;
7569
7570 /*-----------------------------------------------------------------------+
7571 | Cursor Declarations |
7572 +-----------------------------------------------------------------------*/
7573
7574 /* querying trx, psa and loan details */
7575 CURSOR orig_rec_cur(P_LOAN_ID number) IS
7576 select
7577 loan.loan_number,
7578 loan.LOAN_DESCRIPTION,
7579 lines.REQUESTED_AMOUNT,
7580 lines.reference_number,
7581 lines.REC_ADJUSTMENT_NUMBER,
7582 nvl(lines.payment_schedule_id, psa.payment_schedule_id),
7583 psa.AMOUNT_DUE_REMAINING,
7584 lines.LOAN_LINE_ID,
7585 psa.TRX_DATE,
7586 psa.GL_DATE,
7587 trx.org_id,
7588 trx.legal_entity_id,
7589 lines.REC_ADJUSTMENT_ID,
7590 nvl(lines.installment_number, 1),
7591 loan.LOAN_START_DATE
7592 from LNS_LOAN_HEADERS_VL loan,
7593 RA_CUSTOMER_TRX trx,
7594 ar_payment_schedules psa,
7595 lns_loan_lines lines
7596 where loan.loan_id = P_LOAN_ID and
7597 loan.loan_id = lines.loan_id and
7598 lines.reference_type = 'RECEIVABLE' and
7599 lines.REFERENCE_ID = trx.CUSTOMER_TRX_ID and
7600 lines.REFERENCE_NUMBER = trx.trx_number and
7601 lines.end_date is null and
7602 trx.CUSTOMER_TRX_ID = psa.CUSTOMER_TRX_ID and
7603 nvl(lines.installment_number, 1) = psa.terms_sequence_number
7604 order by lines.LOAN_LINE_ID;
7605
7606 BEGIN
7607
7608 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7609
7610 -- Standard start of API savepoint
7611 SAVEPOINT ADJUST_ORIGINAL_RECEIVABLE;
7612 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7613
7614 -- Standard call to check for call compatibility
7615 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7616 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7617 END IF;
7618
7619 -- Initialize message list if p_init_msg_list is set to TRUE
7620 IF FND_API.To_Boolean(p_init_msg_list) THEN
7621 FND_MSG_PUB.initialize;
7622 END IF;
7623
7624 -- Initialize API return status to success
7625 l_return_status := FND_API.G_RET_STS_SUCCESS;
7626
7627 -- START OF BODY OF API
7628
7629 init;
7630
7631 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id :' || P_LOAN_ID);
7632
7633 /* verify input parameters */
7634 if P_LOAN_ID is null then
7635
7636 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
7637 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
7638 FND_MSG_PUB.Add;
7639 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7640 RAISE FND_API.G_EXC_ERROR;
7641
7642 end if;
7643
7644 /* checking for system options values required for adjustment */
7645 if g_receivables_trx_id is null then
7646 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Receivables activity name is not set in the system option.');
7647 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_REC_TRX_IN_SYS_OPT');
7648 FND_MSG_PUB.Add;
7649 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7650 RAISE FND_API.G_EXC_ERROR;
7651
7652 end if;
7653
7654
7655 /* based on profile USSGL_OPTION value verify value for USSGL_TRANSACTION_CODE */
7656 /* commented out by raverma 07-29-2005
7657 l_ussgl_flag := NVL(FND_PROFILE.VALUE('USSGL_OPTION'), 'N');
7658
7659 if l_ussgl_flag = 'Y' then
7660
7661 if g_USSGL_TRANSACTION_CODE is null then
7662 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: USSGL Transaction Code is not set in the system option.');
7663 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_TRX_CODE_IN_SYS_OPT');
7664 FND_MSG_PUB.Add;
7665 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7666 RAISE FND_API.G_EXC_ERROR;
7667
7668 end if;
7669
7670 end if;
7671 */
7672
7673 /* querying trx, psa, loan and loan lines details */
7674 l_Count := 0;
7675 open orig_rec_cur(P_LOAN_ID);
7676
7677 LOOP
7678
7679 fetch orig_rec_cur into
7680 l_loan_number,
7681 l_loan_desc,
7682 l_requested_amount,
7683 l_trx_number,
7684 l_adj_number,
7685 l_payment_schedule_id,
7686 l_amount_due_remaining,
7687 l_line_id,
7688 l_apply_date,
7689 l_gl_date,
7690 l_org_id,
7691 l_legal_entity_id,
7692 l_adj_id,
7693 l_installment_number,
7694 l_loan_start_date;
7695 exit when orig_rec_cur%NOTFOUND;
7696
7697 l_Count := l_Count + 1;
7698
7699 if l_Count = 1 then
7700 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjusting original receivables for loan ' || l_loan_number || ' (id ' || P_LOAN_ID || ')...');
7701 end if;
7702
7703 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjusting receivable ' || l_trx_number || '...');
7704
7705 /* verify adjust amount and set adjustment type */
7706 if l_requested_amount > l_amount_due_remaining then
7707 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Adjust amount cannot be greater than receivable remaining amount.');
7708 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
7709 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount: ' || l_amount_due_remaining);
7710 FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_ADJ_AMT');
7711 FND_MSG_PUB.Add;
7712 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7713 RAISE FND_API.G_EXC_ERROR;
7714 else
7715 l_type := 'LINE';
7716 end if;
7717
7718 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
7719 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount: ' || l_amount_due_remaining);
7720
7721 /* checking if adjustment for this loan already was made */
7722 if l_adj_number is not null or l_adj_id is not null then
7723 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Attempt to duplicate adjustment. Receivable has been already adjusted for this loan by adjustment xxx' );
7724 FND_MESSAGE.SET_NAME('LNS', 'LNS_DUPL_ADJ_ORIG_REC');
7725 FND_MESSAGE.SET_TOKEN('ADJ', l_adj_number);
7726 FND_MSG_PUB.Add;
7727 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7728 RAISE FND_API.G_EXC_ERROR;
7729 end if;
7730
7731 /* buld comments */
7732 l_comments := 'Loan ' || l_loan_number || ' - line ' || l_Count;
7733 /*
7734 if l_loan_desc is not null then
7735 l_comments := 'Loan ' || l_loan_number || ' - ' || l_loan_desc;
7736 else
7737 l_comments := 'Loan ' || l_loan_number;
7738 end if;
7739 */
7740
7741 -- setting adj_apply_date and adj_gl_date
7742 /*
7743 if trunc(l_apply_date) < trunc(sysdate) then
7744 l_apply_date := sysdate;
7745 end if;
7746
7747 if trunc(l_gl_date) < trunc(sysdate) then
7748 l_gl_date := sysdate;
7749 end if;
7750 */
7751
7752 l_apply_date := l_loan_start_date;
7753 l_gl_date := l_loan_start_date;
7754
7755 /* do adjustment */
7756 CREATE_AR_ADJ(P_TYPE => l_type,
7757 P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id,
7758 P_RECEIVABLES_TRX_ID => g_receivables_trx_id,
7759 P_AMOUNT => -l_requested_amount,
7760 P_APPLY_DATE => l_apply_date,
7761 P_GL_DATE => l_gl_date,
7762 P_CUSTOMER_TRX_LINE_ID => null,
7763 P_CODE_COMBINATION_ID => null,
7764 P_USSGL_TRX_CODE => g_USSGL_TRANSACTION_CODE,
7765 P_REASON_CODE => 'LOAN_CONV',
7766 P_COMMENTS => l_comments,
7767 X_ADJ_ID => l_adj_id,
7768 X_ADJ_NUMBER => l_adj_number,
7769 P_ORG_ID => l_org_id);
7770
7771 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_LOAN_LINES...');
7772 LNS_LOAN_LINE_PUB.UPDATE_LINE_ADJUSTMENT_NUMBER(
7773 p_init_msg_list => FND_API.G_FALSE
7774 ,p_loan_id => P_LOAN_ID
7775 ,p_loan_line_id => l_line_id
7776 ,p_rec_adjustment_number => l_adj_number
7777 ,p_rec_adjustment_id => l_adj_id
7778 ,P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id
7779 ,P_INSTALLMENT_NUMBER => l_installment_number
7780 ,p_adjustment_date => l_apply_date
7781 ,p_original_flag => 'Y'
7782 ,x_return_status => l_return_status
7783 ,x_msg_count => l_msg_count
7784 ,x_msg_data => l_msg_data);
7785
7786 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
7787 IF l_return_status = 'S' THEN
7788 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully updated LNS_LOAN_LINES');
7789 ELSE
7790 RAISE FND_API.G_EXC_ERROR;
7791 END IF;
7792 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created adjustment ' || l_adj_number || ' for original receivable ' || l_trx_number);
7793
7794 END LOOP;
7795
7796 close orig_rec_cur;
7797
7798 if l_Count = 0 then
7799 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot find receivable to adjust.');
7800 FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_FIND_ORIG_REC');
7801 FND_MSG_PUB.Add;
7802 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7803 RAISE FND_API.G_EXC_ERROR;
7804 end if;
7805
7806 if P_COMMIT = FND_API.G_TRUE then
7807 COMMIT WORK;
7808 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
7809 end if;
7810
7811 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully adjusted ' || l_Count || ' original receivable for loan ' || l_loan_number);
7812
7813 -- END OF BODY OF API
7814 x_return_status := FND_API.G_RET_STS_SUCCESS;
7815
7816 -- Standard call to get message count and if count is 1, get message info
7817 FND_MSG_PUB.Count_And_Get(
7818 p_encoded => FND_API.G_FALSE,
7819 p_count => x_msg_count,
7820 p_data => x_msg_data);
7821
7822 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
7823
7824 EXCEPTION
7825 WHEN FND_API.G_EXC_ERROR THEN
7826 ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7827 x_return_status := FND_API.G_RET_STS_ERROR;
7828 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7829 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7830 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7831 ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7832 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7833 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7834 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7835 WHEN OTHERS THEN
7836 ROLLBACK TO ADJUST_ORIGINAL_RECEIVABLE;
7837 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7838 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
7839 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
7840 END IF;
7841 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
7842 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
7843 END;
7844
7845
7846 /*========================================================================
7847 | PUBLIC PROCEDURE PREBILL_SINGLE_LOAN
7848 |
7849 | DESCRIPTION
7850 | This procedure prebill (do initial billing) for single loan
7851 |
7852 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
7853 | None
7854 |
7855 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
7856 | init
7857 | LogMessage
7858 | CREATE_OFFCYCLE_BILLS
7859 |
7860 | PARAMETERS
7861 | P_API_VERSION IN Standard in parameter
7862 | P_INIT_MSG_LIST IN Standard in parameter
7863 | P_COMMIT IN Standard in parameter
7864 | P_VALIDATION_LEVEL IN Standard in parameter
7865 | P_LOAN_ID IN Loan ID
7866 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
7867 | X_MSG_COUNT OUT NOCOPY Standard out parameter
7868 | X_MSG_DATA OUT NOCOPY Standard out parameter
7869 |
7870 | KNOWN ISSUES
7871 | None
7872 |
7873 | NOTES
7874 | Any interesting aspect of the code in the package body which needs
7875 | to be stated.
7876 |
7877 | MODIFICATION HISTORY
7878 | Date Author Description of Changes
7879 | 12-23-2004 scherkas Created
7880 |
7881 *=======================================================================*/
7882 PROCEDURE PREBILL_SINGLE_LOAN(
7883 P_API_VERSION IN NUMBER,
7884 P_INIT_MSG_LIST IN VARCHAR2,
7885 P_COMMIT IN VARCHAR2,
7886 P_VALIDATION_LEVEL IN NUMBER,
7887 P_LOAN_ID IN NUMBER,
7888 X_BILLED_YN OUT NOCOPY VARCHAR2,
7889 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
7890 X_MSG_COUNT OUT NOCOPY NUMBER,
7891 X_MSG_DATA OUT NOCOPY VARCHAR2)
7892 IS
7893
7894 /*-----------------------------------------------------------------------+
7895 | Local Variable Declarations and initializations |
7896 +-----------------------------------------------------------------------*/
7897
7898 l_api_name CONSTANT VARCHAR2(30) := 'PREBILL_SINGLE_LOAN';
7899 l_api_version CONSTANT NUMBER := 1.0;
7900 l_return_status VARCHAR2(1);
7901 l_msg_count NUMBER;
7902 l_msg_data VARCHAR2(32767);
7903 l_installment_num number;
7904 l_Count number;
7905 l_Count1 number;
7906 l_header_count number;
7907 l_loan_number varchar2(60);
7908 l_cur_phase VARCHAR2(30);
7909
7910
7911 l_amortization_rec LNS_FINANCIALS.AMORTIZATION_REC;
7912 l_fee_tbl LNS_FINANCIALS.FEES_TBL;
7913 l_BILL_HEADERS_TBL LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL;
7914 l_BILL_LINES_TBL LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
7915
7916 /*-----------------------------------------------------------------------+
7917 | Cursor Declarations |
7918 +-----------------------------------------------------------------------*/
7919
7920 /* querying loan number */
7921 CURSOR loan_cur(P_LOAN_ID number) IS
7922 select
7923 LOAN_NUMBER, nvl(CURRENT_PHASE, 'TERM')
7924 from LNS_LOAN_HEADERS
7925 where LOAN_ID = P_LOAN_ID;
7926
7927 BEGIN
7928
7929 X_BILLED_YN := 'N';
7930
7931 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
7932
7933 -- Standard start of API savepoint
7934 SAVEPOINT PREBILL_SINGLE_LOAN;
7935 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
7936
7937 -- Standard call to check for call compatibility
7938 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7939 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7940 END IF;
7941
7942 -- Initialize message list if p_init_msg_list is set to TRUE
7943 IF FND_API.To_Boolean(p_init_msg_list) THEN
7944 FND_MSG_PUB.initialize;
7945 END IF;
7946
7947 -- Initialize API return status to success
7948 l_return_status := FND_API.G_RET_STS_SUCCESS;
7949
7950 -- START OF BODY OF API
7951 l_installment_num := 0;
7952
7953 /* verify input parameters */
7954 if P_LOAN_ID is null then
7955
7956 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
7957 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
7958 FND_MSG_PUB.Add;
7959 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
7960 RAISE FND_API.G_EXC_ERROR;
7961
7962 end if;
7963
7964 /* getting loan_number */
7965 open loan_cur(P_LOAN_ID);
7966 fetch loan_cur into l_loan_number, l_cur_phase;
7967 close loan_cur;
7968
7969 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing 0-th installment for loan ' || l_loan_number || '...');
7970
7971 /* new principal and interest amounts from getInstallment api */
7972 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
7973
7974 if l_cur_phase = 'TERM' then
7975
7976 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
7977 lns_financials.getInstallment(
7978 p_api_version => 1.0,
7979 p_init_msg_list => FND_API.G_TRUE,
7980 p_commit => FND_API.G_FALSE,
7981 p_loan_Id => P_LOAN_ID,
7982 p_installment_number => l_installment_num,
7983 x_amortization_rec => l_amortization_rec,
7984 x_fees_tbl => l_fee_tbl,
7985 X_RETURN_STATUS => l_return_status,
7986 X_MSG_COUNT => l_msg_count,
7987 X_MSG_DATA => l_msg_data);
7988
7989 else
7990
7991 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getOpenInstallment...');
7992 lns_financials.getOpenInstallment(
7993 -- p_api_version => 1.0,
7994 p_init_msg_list => FND_API.G_TRUE,
7995 -- p_commit => FND_API.G_FALSE,
7996 p_loan_Id => P_LOAN_ID,
7997 p_installment_number => l_installment_num,
7998 x_amortization_rec => l_amortization_rec,
7999 x_fees_tbl => l_fee_tbl,
8000 X_RETURN_STATUS => l_return_status,
8001 X_MSG_COUNT => l_msg_count,
8002 X_MSG_DATA => l_msg_data);
8003
8004 end if;
8005
8006 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
8007 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
8008
8009 if l_return_status <> 'S' then
8010 RAISE FND_API.G_EXC_ERROR;
8011 end if;
8012
8013 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Data returned from lns_financials.getInstallment:');
8014 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
8015 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
8016 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_amortization_rec.PRINCIPAL_AMOUNT);
8017 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_amortization_rec.INTEREST_AMOUNT);
8018 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CAP_INT_AMOUNT: ' || l_amortization_rec.CAP_INT_AMOUNT);
8019 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_amortization_rec.FEE_AMOUNT);
8020
8021 l_header_count := 101;
8022 l_BILL_HEADERS_TBL(1).HEADER_ID := l_header_count;
8023 l_BILL_HEADERS_TBL(1).LOAN_ID := P_LOAN_ID;
8024 l_BILL_HEADERS_TBL(1).ASSOC_PAYMENT_NUM := l_installment_num;
8025 l_BILL_HEADERS_TBL(1).DUE_DATE := l_amortization_rec.due_date;
8026
8027 /* checking for returned values */
8028
8029 if l_amortization_rec.INSTALLMENT_NUMBER is null and
8030 l_amortization_rec.due_date is null
8031 then
8032
8033 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'lns_financials.getInstallment returns no data. Nothing to bill. Returning.');
8034 return;
8035
8036 end if;
8037
8038 if (l_amortization_rec.PRINCIPAL_AMOUNT is null or l_amortization_rec.PRINCIPAL_AMOUNT = 0) and
8039 (l_amortization_rec.INTEREST_AMOUNT is null or l_amortization_rec.INTEREST_AMOUNT = 0) and
8040 (l_amortization_rec.FEE_AMOUNT is null or l_amortization_rec.FEE_AMOUNT = 0)
8041 then
8042
8043 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All amounts returned from lns_financials.getInstallment = 0. Nothing to bill.');
8044 return;
8045
8046 end if;
8047
8048 l_Count1 := 0;
8049
8050 /* adding principal and interest amounts into lines table */
8051
8052 if l_amortization_rec.PRINCIPAL_AMOUNT > 0 then
8053
8054 l_Count1 := l_Count1 + 1;
8055 l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
8056 l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
8057 l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_amortization_rec.PRINCIPAL_AMOUNT;
8058 l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'PRIN';
8059
8060 end if;
8061
8062 if l_amortization_rec.INTEREST_AMOUNT > 0 then
8063
8064 l_Count1 := l_Count1 + 1;
8065 l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
8066 l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
8067 l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_amortization_rec.INTEREST_AMOUNT;
8068 l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'INT';
8069
8070 end if;
8071
8072 /* adding fee amounts into lines table */
8073 FOR l_Count IN 1..l_fee_tbl.count LOOP
8074
8075 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fee #' || l_Count || ' Name: ' || l_fee_tbl(l_Count).FEE_NAME || ' Amount: ' || l_fee_tbl(l_Count).FEE_AMOUNT);
8076
8077 l_Count1 := l_Count1 + 1;
8078 l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
8079 l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
8080 l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_fee_tbl(l_Count).FEE_AMOUNT;
8081 l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'FEE';
8082 l_BILL_LINES_TBL(l_Count1).LINE_REF_ID := l_fee_tbl(l_Count).FEE_ID;
8083 l_BILL_LINES_TBL(l_Count1).LINE_DESC := l_fee_tbl(l_Count).FEE_NAME;
8084 l_BILL_LINES_TBL(l_Count1).FEE_SCHEDULE_ID := l_fee_tbl(l_Count).FEE_SCHEDULE_ID;
8085
8086 /* added fee installment validation by raverma request */
8087 if l_amortization_rec.INSTALLMENT_NUMBER <> l_fee_tbl(l_Count).FEE_INSTALLMENT then
8088
8089 FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_FEE_INSTAL');
8090 FND_MSG_PUB.Add;
8091 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8092 RAISE FND_API.G_EXC_ERROR;
8093
8094 end if;
8095
8096 /* updating LNS_FEE_SCHEDULES with billed_flag = Y */
8097 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_FEE_SCHEDULES with billed_flag = Y ...');
8098 UPDATE LNS_FEE_SCHEDULES
8099 SET
8100 BILLED_FLAG = 'Y',
8101 last_update_date = LNS_UTILITY_PUB.LAST_UPDATE_DATE,
8102 last_updated_by = LNS_UTILITY_PUB.LAST_UPDATED_BY,
8103 last_update_login = LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
8104 WHERE
8105 FEE_SCHEDULE_ID = l_fee_tbl(l_Count).fee_schedule_id;
8106 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_FEE_SCHEDULES');
8107
8108 END LOOP;
8109
8110 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS...');
8111
8112 LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS(
8113 P_API_VERSION => 1.0,
8114 P_INIT_MSG_LIST => FND_API.G_TRUE,
8115 P_COMMIT => FND_API.G_FALSE,
8116 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
8117 P_BILL_HEADERS_TBL => l_BILL_HEADERS_TBL,
8118 P_BILL_LINES_TBL => l_BILL_LINES_TBL,
8119 x_return_status => l_return_status,
8120 x_msg_count => l_msg_count,
8121 x_msg_data => l_msg_data);
8122
8123 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
8124
8125 if l_return_status <> 'S' then
8126 RAISE FND_API.G_EXC_ERROR;
8127 end if;
8128
8129 if P_COMMIT = FND_API.G_TRUE then
8130 COMMIT WORK;
8131 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
8132 end if;
8133
8134 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully billed 0-th installment for loan ' || l_loan_number);
8135
8136 -- END OF BODY OF API
8137 x_return_status := FND_API.G_RET_STS_SUCCESS;
8138 X_BILLED_YN := 'Y';
8139
8140 -- Standard call to get message count and if count is 1, get message info
8141 FND_MSG_PUB.Count_And_Get(
8142 p_encoded => FND_API.G_FALSE,
8143 p_count => x_msg_count,
8144 p_data => x_msg_data);
8145
8146 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
8147
8148 EXCEPTION
8149 WHEN FND_API.G_EXC_ERROR THEN
8150 ROLLBACK TO PREBILL_SINGLE_LOAN;
8151 x_return_status := FND_API.G_RET_STS_ERROR;
8152 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8153 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8154 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8155 ROLLBACK TO PREBILL_SINGLE_LOAN;
8156 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8157 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8158 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8159 WHEN OTHERS THEN
8160 ROLLBACK TO PREBILL_SINGLE_LOAN;
8161 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8162 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
8163 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
8164 END IF;
8165 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8166 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8167 END;
8168
8169
8170 /*========================================================================
8171 | PUBLIC PROCEDURE GET_FORGIVENESS_AMOUNT
8172 |
8173 | DESCRIPTION
8174 | This procedure returns forgiveness amount based on forgiveness settings and passed amount
8175 |
8176 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
8177 | None
8178 |
8179 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
8180 | LogMessage
8181 |
8182 | PARAMETERS
8183 | P_LOAN_ID IN Loan ID
8184 | P_AMOUNT IN Passed amount
8185 | X_FORGIVENESS_AMOUNT OUT NOCOPY Returned forgiveness amount
8186 | X_REMAINING_AMOUNT OUT NOCOPY Returned remianing amount
8187 |
8188 | KNOWN ISSUES
8189 | None
8190 |
8191 | NOTES
8192 | Any interesting aspect of the code in the package body which needs
8193 | to be stated.
8194 |
8195 | MODIFICATION HISTORY
8196 | Date Author Description of Changes
8197 | 04-27-2008 scherkas Created for bug 8400747
8198 |
8199 *=======================================================================*/
8200 PROCEDURE GET_FORGIVENESS_AMOUNT(
8201 P_LOAN_ID IN NUMBER,
8202 P_AMOUNT IN NUMBER,
8203 X_FORGIVENESS_AMOUNT OUT NOCOPY NUMBER,
8204 X_REMAINING_AMOUNT OUT NOCOPY NUMBER)
8205 IS
8206
8207 /*-----------------------------------------------------------------------+
8208 | Local Variable Declarations and initializations |
8209 +-----------------------------------------------------------------------*/
8210
8211 l_api_name CONSTANT VARCHAR2(30) := 'GET_FORGIVENESS_AMOUNT';
8212 l_forgiveness_flag varchar2(1);
8213 l_forgiveness_percent number;
8214 l_precision number;
8215 l_ext_precision number;
8216 l_min_acct_unit number;
8217 l_currency VARCHAR2(15);
8218
8219 /*-----------------------------------------------------------------------+
8220 | Cursor Declarations |
8221 +-----------------------------------------------------------------------*/
8222
8223 /* querying psa and loan details */
8224 CURSOR details_cur(P_LOAN_ID number) IS
8225 select
8226 nvl(loan.FORGIVENESS_FLAG, 'N'),
8227 nvl(loan.FORGIVENESS_PERCENT, 0),
8228 loan.LOAN_CURRENCY
8229 from LNS_LOAN_HEADERS loan
8230 where
8231 loan.loan_id = P_LOAN_ID;
8232
8233 BEGIN
8234
8235 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
8236
8237 -- START OF BODY OF API
8238 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input:');
8239 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_ID = ' || P_LOAN_ID);
8240 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_AMOUNT = ' || P_AMOUNT);
8241
8242 /* verify input parameters */
8243 if P_LOAN_ID is null then
8244
8245 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
8246 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
8247 FND_MSG_PUB.Add;
8248 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8249 RAISE FND_API.G_EXC_ERROR;
8250
8251 end if;
8252 if P_AMOUNT is null then
8253
8254 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'P_AMOUNT is null');
8255 RAISE FND_API.G_EXC_ERROR;
8256
8257 end if;
8258
8259 init;
8260
8261 X_FORGIVENESS_AMOUNT := 0;
8262 X_REMAINING_AMOUNT := P_AMOUNT;
8263
8264 /* checking for system options values required for adjustment */
8265 if g_forgiveness_rec_trx_id is null then
8266 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan Forgiveness receivables activity name is not set in the system option. Exiting.');
8267 return;
8268 end if;
8269
8270 /* querying psa, loan details */
8271 open details_cur(P_LOAN_ID);
8272 fetch details_cur into
8273 l_forgiveness_flag,
8274 l_forgiveness_percent,
8275 l_currency;
8276 close details_cur;
8277
8278 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_forgiveness_flag = ' || l_forgiveness_flag);
8279 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_forgiveness_percent = ' || l_forgiveness_percent);
8280 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_currency = ' || l_currency);
8281
8282 if l_forgiveness_flag = 'N' then
8283 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not part of loan forgiveness program. Exiting.');
8284 return;
8285 end if;
8286
8287 if l_forgiveness_percent = 0 then
8288 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness percent = 0. Exiting.');
8289 return;
8290 end if;
8291
8292 fnd_currency.GET_INFO(CURRENCY_CODE => l_currency,
8293 PRECISION => l_precision,
8294 EXT_PRECISION => l_ext_precision,
8295 MIN_ACCT_UNIT => l_min_acct_unit);
8296 X_FORGIVENESS_AMOUNT := round(P_AMOUNT * (l_forgiveness_percent/100), l_precision);
8297 X_REMAINING_AMOUNT := P_AMOUNT - X_FORGIVENESS_AMOUNT;
8298
8299 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'X_FORGIVENESS_AMOUNT = ' || X_FORGIVENESS_AMOUNT);
8300 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'X_REMAINING_AMOUNT = ' || X_REMAINING_AMOUNT);
8301
8302 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
8303
8304 EXCEPTION
8305 WHEN OTHERS THEN
8306 LogMessage(FND_LOG.LEVEL_UNEXPECTED, l_api_name || ' - In exception');
8307 END;
8308
8309
8310 /*========================================================================
8311 | PRIVATE PROCEDURE FORGIVENESS_ADJUSTMENT
8312 |
8313 | DESCRIPTION
8314 | This procedure make adjustment to just billed principal as loan forgiveness program
8315 |
8316 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
8317 | None
8318 |
8319 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
8320 | init
8321 | LogMessage
8322 |
8323 | PARAMETERS
8324 | P_API_VERSION IN Standard in parameter
8325 | P_INIT_MSG_LIST IN Standard in parameter
8326 | P_COMMIT IN Standard in parameter
8327 | P_VALIDATION_LEVEL IN Standard in parameter
8328 | P_LOAN_ID IN Loan ID
8329 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
8330 | X_MSG_COUNT OUT NOCOPY Standard out parameter
8331 | X_MSG_DATA OUT NOCOPY Standard out parameter
8332 |
8333 | KNOWN ISSUES
8334 | None
8335 |
8336 | NOTES
8337 | Any interesting aspect of the code in the package body which needs
8338 | to be stated.
8339 |
8340 | MODIFICATION HISTORY
8341 | Date Author Description of Changes
8342 | 09-01-2008 scherkas Created for bug 7387659
8343 |
8344 *=======================================================================*/
8345 PROCEDURE FORGIVENESS_ADJUSTMENT(
8346 P_API_VERSION IN NUMBER,
8347 P_INIT_MSG_LIST IN VARCHAR2,
8348 P_COMMIT IN VARCHAR2,
8349 P_VALIDATION_LEVEL IN NUMBER,
8350 P_LOAN_ID IN NUMBER,
8351 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
8352 X_MSG_COUNT OUT NOCOPY NUMBER,
8353 X_MSG_DATA OUT NOCOPY VARCHAR2)
8354 IS
8355
8356 /*-----------------------------------------------------------------------+
8357 | Local Variable Declarations and initializations |
8358 +-----------------------------------------------------------------------*/
8359
8360 l_api_name CONSTANT VARCHAR2(30) := 'FORGIVENESS_ADJUSTMENT';
8361 l_api_version CONSTANT NUMBER := 1.0;
8362 l_return_status VARCHAR2(1);
8363 l_msg_count NUMBER;
8364 l_msg_data VARCHAR2(32767);
8365 l_loan_number varchar2(60);
8366 l_trx_id number;
8367 l_payment_schedule_id number;
8368 l_original_amount number;
8369 l_type varchar2(15);
8370 l_loan_desc varchar2(250);
8371 l_comments varchar2(2000);
8372 l_adj_number varchar2(20);
8373 l_adj_id number;
8374 l_requested_amount number;
8375 l_apply_date date;
8376 l_gl_date date;
8377 l_forgiveness_flag varchar2(1);
8378 l_forgiveness_percent number;
8379 l_payment_number number;
8380 l_org_id number;
8381 l_phase VARCHAR2(30);
8382 l_precision number;
8383 l_ext_precision number;
8384 l_min_acct_unit number;
8385 l_currency VARCHAR2(15);
8386 l_remaining_amount NUMBER;
8387
8388 /*-----------------------------------------------------------------------+
8389 | Cursor Declarations |
8390 +-----------------------------------------------------------------------*/
8391
8392 /* querying psa and loan details */
8393 CURSOR details_cur(P_LOAN_ID number) IS
8394 select
8395 loan.loan_number,
8396 loan.LOAN_DESCRIPTION,
8397 nvl(loan.FORGIVENESS_FLAG, 'N'),
8398 nvl(loan.FORGIVENESS_PERCENT, 0),
8399 am.PAYMENT_NUMBER,
8400 am.PRINCIPAL_TRX_ID,
8401 psa.payment_schedule_id,
8402 nvl(psa.AMOUNT_DUE_ORIGINAL, 0),
8403 psa.TRX_DATE,
8404 psa.GL_DATE,
8405 nvl(loan.CURRENT_PHASE, 'TERM'),
8406 psa.org_id,
8407 loan.LOAN_CURRENCY
8408 from LNS_LOAN_HEADERS_VL loan,
8409 lns_amortization_scheds am,
8410 ar_payment_schedules psa
8411 where
8412 loan.loan_id = P_LOAN_ID and
8413 loan.LAST_AMORTIZATION_ID = am.AMORTIZATION_SCHEDULE_ID and
8414 loan.loan_id = am.loan_id and
8415 am.PRINCIPAL_TRX_ID = psa.CUSTOMER_TRX_ID(+);
8416
8417 BEGIN
8418
8419 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
8420
8421 -- Standard start of API savepoint
8422 SAVEPOINT FORGIVENESS_ADJUSTMENT;
8423 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
8424
8425 -- Standard call to check for call compatibility
8426 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
8427 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8428 END IF;
8429
8430 -- Initialize message list if p_init_msg_list is set to TRUE
8431 IF FND_API.To_Boolean(p_init_msg_list) THEN
8432 FND_MSG_PUB.initialize;
8433 END IF;
8434
8435 -- Initialize API return status to success
8436 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
8437
8438 -- START OF BODY OF API
8439 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
8440
8441 /* verify input parameters */
8442 if P_LOAN_ID is null then
8443
8444 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
8445 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
8446 FND_MSG_PUB.Add;
8447 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8448 RAISE FND_API.G_EXC_ERROR;
8449
8450 end if;
8451
8452 /* checking for system options values required for adjustment */
8453 if g_forgiveness_rec_trx_id is null then
8454 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan Forgiveness receivables activity name is not set in the system option. Exiting.');
8455 return;
8456 end if;
8457
8458 /* querying psa, loan details */
8459 open details_cur(P_LOAN_ID);
8460 fetch details_cur into
8461 l_loan_number,
8462 l_loan_desc,
8463 l_forgiveness_flag,
8464 l_forgiveness_percent,
8465 l_payment_number,
8466 l_trx_id,
8467 l_payment_schedule_id,
8468 l_original_amount,
8469 l_apply_date,
8470 l_gl_date,
8471 l_phase,
8472 l_org_id,
8473 l_currency;
8474 close details_cur;
8475
8476 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan_number = ' || l_loan_number);
8477 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_loan_desc = ' || l_loan_desc);
8478 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_forgiveness_flag = ' || l_forgiveness_flag);
8479 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_forgiveness_percent = ' || l_forgiveness_percent);
8480 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_payment_number = ' || l_payment_number);
8481 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_trx_id = ' || l_trx_id);
8482 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_payment_schedule_id = ' || l_payment_schedule_id);
8483 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_original_amount = ' || l_original_amount);
8484 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_apply_date = ' || l_apply_date);
8485 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_gl_date = ' || l_gl_date);
8486 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_phase = ' || l_phase);
8487 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_org_id = ' || l_org_id);
8488 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_currency = ' || l_currency);
8489
8490 if l_trx_id is null then
8491 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Nothing to adjust - principal invoice does not exist for payment number ' || l_payment_number || '. Exiting.');
8492 return;
8493 end if;
8494
8495 if l_payment_schedule_id is null then
8496 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Cannot create adjustment - principal invoice is INCOMPLETE!');
8497 RAISE FND_API.G_EXC_ERROR;
8498 end if;
8499
8500 if l_forgiveness_flag = 'N' then
8501 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not part of loan forgiveness program. Exiting.');
8502 return;
8503 end if;
8504
8505 if l_forgiveness_percent = 0 then
8506 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness percent = 0. Will not perform forgiveness adjustment. Exiting.');
8507 return;
8508 end if;
8509
8510 if l_original_amount = 0 then
8511 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Principal amount = 0. Will not perform forgiveness adjustment. Exiting.');
8512 return;
8513 end if;
8514
8515 l_type := 'LINE';
8516
8517 GET_FORGIVENESS_AMOUNT(
8518 P_LOAN_ID => P_LOAN_ID,
8519 P_AMOUNT => l_original_amount,
8520 X_FORGIVENESS_AMOUNT => l_requested_amount,
8521 X_REMAINING_AMOUNT => l_remaining_amount);
8522 /*
8523 -- fix for bug 7712669
8524 fnd_currency.GET_INFO(CURRENCY_CODE => l_currency,
8525 PRECISION => l_precision,
8526 EXT_PRECISION => l_ext_precision,
8527 MIN_ACCT_UNIT => l_min_acct_unit);
8528 l_requested_amount := round(l_original_amount * (l_forgiveness_percent/100), l_precision);
8529 */
8530 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
8531
8532 if l_requested_amount = 0 then
8533 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Forgiveness amount = 0. Will not perform forgiveness adjustment. Exiting.');
8534 return;
8535 end if;
8536
8537 /* buld comments */
8538 l_comments := 'Loan Forgiveness Program for loan ' || l_loan_number;
8539
8540 /* do adjustment */
8541 CREATE_AR_ADJ(P_TYPE => l_type,
8542 P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id,
8543 P_RECEIVABLES_TRX_ID => g_forgiveness_rec_trx_id,
8544 P_AMOUNT => -l_requested_amount,
8545 P_APPLY_DATE => l_apply_date,
8546 P_GL_DATE => l_gl_date,
8547 P_CUSTOMER_TRX_LINE_ID => null,
8548 P_CODE_COMBINATION_ID => null,
8549 P_USSGL_TRX_CODE => null,
8550 P_REASON_CODE => null,
8551 P_COMMENTS => l_comments,
8552 X_ADJ_ID => l_adj_id,
8553 X_ADJ_NUMBER => l_adj_number,
8554 P_ORG_ID => l_org_id);
8555
8556 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'l_adj_number = ' || l_adj_number || ' (l_adj_id = ' || l_adj_id || ')');
8557
8558 if l_adj_id is null and l_adj_number is null then
8559 RAISE FND_API.G_EXC_ERROR;
8560 end if;
8561
8562 if P_COMMIT = FND_API.G_TRUE then
8563 COMMIT WORK;
8564 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
8565 end if;
8566
8567 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully adjusted payment ' || l_payment_number || ' for loan ' || l_loan_number);
8568
8569 -- END OF BODY OF API
8570 x_return_status := FND_API.G_RET_STS_SUCCESS;
8571
8572 -- Standard call to get message count and if count is 1, get message info
8573 FND_MSG_PUB.Count_And_Get(
8574 p_encoded => FND_API.G_FALSE,
8575 p_count => x_msg_count,
8576 p_data => x_msg_data);
8577
8578 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
8579
8580 EXCEPTION
8581 WHEN FND_API.G_EXC_ERROR THEN
8582 ROLLBACK TO FORGIVENESS_ADJUSTMENT;
8583 x_return_status := FND_API.G_RET_STS_ERROR;
8584 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8585 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8586 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8587 ROLLBACK TO FORGIVENESS_ADJUSTMENT;
8588 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8589 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8590 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8591 WHEN OTHERS THEN
8592 ROLLBACK TO FORGIVENESS_ADJUSTMENT;
8593 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8594 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
8595 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
8596 END IF;
8597 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8598 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8599 END;
8600
8601
8602
8603
8604 /*========================================================================
8605 | PUBLIC PROCEDURE GET_NEXT_INSTAL_TO_BILL
8606 |
8607 | DESCRIPTION
8608 | This procedure returns next installment to be billed in LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL format
8609 |
8610 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
8611 | None
8612 |
8613 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
8614 | init
8615 | LogMessage
8616 |
8617 | PARAMETERS
8618 | P_API_VERSION IN Standard in parameter
8619 | P_INIT_MSG_LIST IN Standard in parameter
8620 | P_COMMIT IN Standard in parameter
8621 | P_VALIDATION_LEVEL IN Standard in parameter
8622 | P_LOAN_ID IN Loan ID
8623 | X_INVOICES_TBL OUT NOCOPY LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL,
8624 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
8625 | X_MSG_COUNT OUT NOCOPY Standard out parameter
8626 | X_MSG_DATA OUT NOCOPY Standard out parameter
8627 |
8628 | KNOWN ISSUES
8629 | None
8630 |
8631 | NOTES
8632 | Any interesting aspect of the code in the package body which needs
8633 | to be stated.
8634 |
8635 | MODIFICATION HISTORY
8636 | Date Author Description of Changes
8637 | 03-17-2009 scherkas Created for bug
8638 |
8639 *=======================================================================*/
8640 PROCEDURE GET_NEXT_INSTAL_TO_BILL(
8641 P_API_VERSION IN NUMBER,
8642 P_INIT_MSG_LIST IN VARCHAR2,
8643 P_COMMIT IN VARCHAR2,
8644 P_VALIDATION_LEVEL IN NUMBER,
8645 P_LOAN_ID IN NUMBER,
8646 X_INVOICES_TBL OUT NOCOPY LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL,
8647 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
8648 X_MSG_COUNT OUT NOCOPY NUMBER,
8649 X_MSG_DATA OUT NOCOPY VARCHAR2)
8650 IS
8651
8652 /*-----------------------------------------------------------------------+
8653 | Local Variable Declarations and initializations |
8654 +-----------------------------------------------------------------------*/
8655
8656 l_api_name CONSTANT VARCHAR2(30) := 'GET_NEXT_INSTAL_TO_BILL';
8657 l_api_version CONSTANT NUMBER := 1.0;
8658 l_return_status VARCHAR2(1);
8659 l_msg_count NUMBER;
8660 l_msg_data VARCHAR2(32767);
8661 l_NEXT_PAYMENT_NUMBER NUMBER;
8662 l_create_zero_instal varchar2(1);
8663 l_invoice_number varchar2(20);
8664 l_profile_name VARCHAR2(240);
8665 i number;
8666 l_currency varchar2(15);
8667 l_exchange_rate number;
8668 l_prin_trx_type_id number;
8669 l_current_phase varchar2(30);
8670 l_trx_date date;
8671 l_term_id number;
8672
8673 l_amortization_rec LNS_FINANCIALS.AMORTIZATION_REC;
8674 l_fee_tbl LNS_FINANCIALS.FEES_TBL;
8675 l_invoices_tbl LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL;
8676
8677 /*-----------------------------------------------------------------------+
8678 | Cursor Declarations |
8679 +-----------------------------------------------------------------------*/
8680
8681 cursor c_loanInfo(p_loan_id number) is
8682 select loan_number, LOAN_CURRENCY, nvl(EXCHANGE_RATE, 1), nvl(CURRENT_PHASE, 'TERM')
8683 from lns_loan_headers_all
8684 where loan_id = p_loan_id;
8685
8686 /* query trx_type_id */
8687 CURSOR prin_trx_type_cur(P_LOAN_ID number) IS
8688 select REFERENCE_TYPE_ID
8689 from LNS_LOAN_HEADERS_ALL
8690 where loan_id = P_LOAN_ID;
8691
8692 CURSOR trx_type_cur(p_trx_type_id number) IS
8693 select NAME
8694 from RA_CUST_TRX_TYPES_ALL
8695 where cust_trx_type_id = p_trx_type_id;
8696
8697
8698 BEGIN
8699
8700 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
8701
8702 -- Standard start of API savepoint
8703 SAVEPOINT GET_NEXT_INSTAL_TO_BILL;
8704 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
8705
8706 -- Standard call to check for call compatibility
8707 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
8708 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8709 END IF;
8710
8711 -- Initialize message list if p_init_msg_list is set to TRUE
8712 IF FND_API.To_Boolean(p_init_msg_list) THEN
8713 FND_MSG_PUB.initialize;
8714 END IF;
8715
8716 -- Initialize API return status to success
8717 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
8718
8719 -- START OF BODY OF API
8720 init;
8721
8722 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
8723
8724 /* verify input parameters */
8725 if P_LOAN_ID is null then
8726
8727 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
8728 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
8729 FND_MSG_PUB.Add;
8730 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8731 RAISE FND_API.G_EXC_ERROR;
8732
8733 end if;
8734
8735 if CAN_BILL_NEXT_INSTAL(P_LOAN_ID) = false then
8736 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not ready to bill next installment. Returning.');
8737 FND_MESSAGE.SET_NAME('LNS', 'LNS_NOT_READY_BILL_NEXT_INSTAL');
8738 FND_MSG_PUB.Add;
8739 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8740 RAISE FND_API.G_EXC_ERROR;
8741 end if;
8742
8743 -- Bug#6830765 - Added new procedure ..EXT_1, which returns '0' if 0th installment is scheduled and it solves
8744 -- the case if there is no '0th installment' and wants '1st 'installment
8745 l_NEXT_PAYMENT_NUMBER := LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER_EXT_1(P_LOAN_ID) + 1;
8746
8747 open c_loanInfo(P_LOAN_ID);
8748 fetch c_loanInfo into l_invoice_number, l_currency, l_exchange_rate, l_current_phase;
8749 close c_loanInfo;
8750
8751 if l_current_phase = 'TERM' then
8752
8753 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getInstallment...');
8754 lns_financials.getInstallment(
8755 p_api_version => 1.0,
8756 p_init_msg_list => FND_API.G_TRUE,
8757 p_commit => FND_API.G_FALSE,
8758 p_loan_Id => P_LOAN_ID,
8759 p_installment_number => l_NEXT_PAYMENT_NUMBER,
8760 x_amortization_rec => l_amortization_rec,
8761 x_fees_tbl => l_fee_tbl,
8762 X_RETURN_STATUS => l_return_status,
8763 X_MSG_COUNT => l_msg_count,
8764 X_MSG_DATA => l_msg_data);
8765
8766 else
8767
8768 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling lns_financials.getOpenInstallment...');
8769 lns_financials.getOpenInstallment(
8770 p_init_msg_list => FND_API.G_TRUE,
8771 p_loan_Id => P_LOAN_ID,
8772 p_installment_number => l_NEXT_PAYMENT_NUMBER,
8773 x_amortization_rec => l_amortization_rec,
8774 x_fees_tbl => l_fee_tbl,
8775 X_RETURN_STATUS => l_return_status,
8776 X_MSG_COUNT => l_msg_count,
8777 X_MSG_DATA => l_msg_data);
8778
8779 end if;
8780
8781 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
8782 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
8783
8784 if l_return_status <> 'S' then
8785 RAISE FND_API.G_EXC_ERROR;
8786 end if;
8787
8788 -- remove any msg from the stack
8789 FND_MSG_PUB.initialize;
8790
8791 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Data returned:');
8792 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INSTALLMENT_NUMBER: ' || l_amortization_rec.INSTALLMENT_NUMBER);
8793 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_amortization_rec.due_date);
8794 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PRINCIPAL_AMOUNT: ' || l_amortization_rec.PRINCIPAL_AMOUNT);
8795 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INTEREST_AMOUNT: ' || l_amortization_rec.INTEREST_AMOUNT);
8796 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FEE_AMOUNT: ' || l_amortization_rec.FEE_AMOUNT);
8797
8798 /* checking for returned values */
8799 if l_amortization_rec.INSTALLMENT_NUMBER is null and
8800 l_amortization_rec.due_date is null
8801 then
8802
8803 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'lns_financials.getInstallment returns no data. Nothing to bill. Returning.');
8804 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_BILLING_DATA');
8805 FND_MSG_PUB.Add;
8806 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8807 RAISE FND_API.G_EXC_ERROR;
8808
8809 end if;
8810
8811 if l_amortization_rec.PRINCIPAL_AMOUNT = 0 and
8812 l_amortization_rec.INTEREST_AMOUNT = 0 and
8813 l_amortization_rec.FEE_AMOUNT = 0
8814 then
8815
8816 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'All amounts returned from lns_financials.getInstallment = 0.');
8817
8818 -- fix for bug 7000066: get LNS_CREATE_ZERO_INSTAL profile value to see if we need to create 0 amount installment
8819 l_create_zero_instal := NVL(FND_PROFILE.VALUE('LNS_CREATE_ZERO_INSTAL'), 'N');
8820 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LNS_CREATE_ZERO_INSTAL profile: ' || l_create_zero_instal);
8821
8822 if l_create_zero_instal = 'N' then
8823
8824 select USER_PROFILE_OPTION_NAME into l_profile_name
8825 from FND_PROFILE_OPTIONS_VL
8826 where PROFILE_OPTION_NAME = 'LNS_CREATE_ZERO_INSTAL';
8827
8828 --LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing of zero amount installments is disallowed by profile LNS: Create Zero Amount Installments.');
8829 FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_BILL_ZERO_AMOUNT');
8830 FND_MESSAGE.SET_TOKEN('PROFILE', l_profile_name);
8831 FND_MSG_PUB.Add;
8832 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
8833 RAISE FND_API.G_EXC_ERROR;
8834 -- return;
8835 end if;
8836
8837 end if;
8838
8839 -- get trx date
8840 LNS_BILLING_UTIL_PUB.GET_TRX_DATE(P_LOAN_ID => P_LOAN_ID,
8841 P_DUE_DATE => l_amortization_rec.due_date,
8842 X_TRX_DATE => l_trx_date,
8843 X_RA_TERM_ID => l_term_id);
8844
8845 i := 0;
8846
8847 if (l_amortization_rec.PRINCIPAL_AMOUNT = 0 and NVL(FND_PROFILE.VALUE('LNS_CREATE_ZERO_PRIN_INV'), 'N') = 'Y') or
8848 l_amortization_rec.PRINCIPAL_AMOUNT > 0
8849 then
8850 i := i + 1;
8851 l_invoices_tbl(i).CUST_TRX_ID := null;
8852 l_invoices_tbl(i).PAYMENT_SCHEDULE_ID := null;
8853 l_invoices_tbl(i).INSTALLMENT_NUMBER := l_amortization_rec.INSTALLMENT_NUMBER;
8854 l_invoices_tbl(i).INVOICE_NUMBER := l_invoice_number;
8855 l_invoices_tbl(i).ORIGINAL_AMOUNT := l_amortization_rec.PRINCIPAL_AMOUNT;
8856 l_invoices_tbl(i).TRX_DATE := l_trx_date;
8857 l_invoices_tbl(i).DUE_DATE := l_amortization_rec.due_date;
8858 l_invoices_tbl(i).PURPOSE := lns_utility_pub.get_lookup_meaning('PAYMENT_APPLICATION_TYPE', 'PRIN');
8859 l_invoices_tbl(i).BILLED_FLAG := 'N';
8860 l_invoices_tbl(i).INVOICE_CURRENCY := l_currency;
8861 l_invoices_tbl(i).EXCHANGE_RATE := l_exchange_rate;
8862
8863 /* query trx_type_id */
8864 open prin_trx_type_cur(P_LOAN_ID);
8865 fetch prin_trx_type_cur into l_prin_trx_type_id;
8866 close prin_trx_type_cur;
8867
8868 if l_prin_trx_type_id is null then
8869 l_prin_trx_type_id := g_trx_type_id;
8870 end if;
8871
8872 open trx_type_cur(l_prin_trx_type_id);
8873 fetch trx_type_cur into l_invoices_tbl(i).TRANSACTION_TYPE;
8874 close trx_type_cur;
8875
8876 l_invoices_tbl(i).GL_DATE := l_trx_date + nvl(g_day_togl_after_dd, 0);
8877 --l_invoices_tbl(i).GL_DATE := l_invoices_tbl(i).DUE_DATE + nvl(g_day_togl_after_dd, 0);
8878 LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
8879 p_gl_date => l_invoices_tbl(i).GL_DATE,
8880 p_trx_date => l_trx_date, --l_invoices_tbl(i).DUE_DATE,
8881 p_set_of_books_id => g_set_of_books_id,
8882 x_default_gl_date => l_invoices_tbl(i).GL_DATE);
8883
8884 GET_FORGIVENESS_AMOUNT(
8885 P_LOAN_ID => P_LOAN_ID,
8886 P_AMOUNT => l_invoices_tbl(i).ORIGINAL_AMOUNT,
8887 X_FORGIVENESS_AMOUNT => l_invoices_tbl(i).FORGIVENESS_AMOUNT,
8888 X_REMAINING_AMOUNT => l_invoices_tbl(i).REMAINING_AMOUNT);
8889
8890 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added principal ' || l_amortization_rec.PRINCIPAL_AMOUNT);
8891 end if;
8892
8893 if l_amortization_rec.INTEREST_AMOUNT > 0 and l_amortization_rec.CAP_INT_AMOUNT = 0 then
8894 i := i + 1;
8895 l_invoices_tbl(i).CUST_TRX_ID := null;
8896 l_invoices_tbl(i).PAYMENT_SCHEDULE_ID := null;
8897 l_invoices_tbl(i).INSTALLMENT_NUMBER := l_amortization_rec.INSTALLMENT_NUMBER;
8898 l_invoices_tbl(i).INVOICE_NUMBER := l_invoice_number;
8899 l_invoices_tbl(i).TRANSACTION_TYPE := lns_utility_pub.getDocumentName('INT');
8900 l_invoices_tbl(i).ORIGINAL_AMOUNT := l_amortization_rec.INTEREST_AMOUNT;
8901 l_invoices_tbl(i).REMAINING_AMOUNT := l_amortization_rec.INTEREST_AMOUNT;
8902 l_invoices_tbl(i).FORGIVENESS_AMOUNT := 0;
8903 l_invoices_tbl(i).TRX_DATE := l_trx_date;
8904 l_invoices_tbl(i).DUE_DATE := l_amortization_rec.due_date;
8905 l_invoices_tbl(i).PURPOSE := lns_utility_pub.get_lookup_meaning('PAYMENT_APPLICATION_TYPE', 'INT');
8906 l_invoices_tbl(i).BILLED_FLAG := 'N';
8907 l_invoices_tbl(i).INVOICE_CURRENCY := l_currency;
8908 l_invoices_tbl(i).EXCHANGE_RATE := l_exchange_rate;
8909 --l_invoices_tbl(i).GL_DATE := l_invoices_tbl(i).DUE_DATE + nvl(g_day_togl_after_dd, 0);
8910
8911 l_invoices_tbl(i).GL_DATE := l_trx_date + nvl(g_day_togl_after_dd, 0);
8912 LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
8913 p_gl_date => l_invoices_tbl(i).GL_DATE,
8914 p_trx_date => l_trx_date, --l_invoices_tbl(i).DUE_DATE,
8915 p_set_of_books_id => g_set_of_books_id,
8916 x_default_gl_date => l_invoices_tbl(i).GL_DATE);
8917
8918 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added interest ' || l_amortization_rec.INTEREST_AMOUNT);
8919 end if;
8920
8921 if l_amortization_rec.FEE_AMOUNT > 0 then
8922 i := i + 1;
8923 l_invoices_tbl(i).CUST_TRX_ID := null;
8924 l_invoices_tbl(i).PAYMENT_SCHEDULE_ID := null;
8925 l_invoices_tbl(i).INSTALLMENT_NUMBER := l_amortization_rec.INSTALLMENT_NUMBER;
8926 l_invoices_tbl(i).INVOICE_NUMBER := l_invoice_number;
8927 l_invoices_tbl(i).TRANSACTION_TYPE := lns_utility_pub.getDocumentName('FEE');
8928 l_invoices_tbl(i).ORIGINAL_AMOUNT := l_amortization_rec.FEE_AMOUNT;
8929 l_invoices_tbl(i).REMAINING_AMOUNT := l_amortization_rec.FEE_AMOUNT;
8930 l_invoices_tbl(i).FORGIVENESS_AMOUNT := 0;
8931 l_invoices_tbl(i).TRX_DATE := l_trx_date;
8932 l_invoices_tbl(i).DUE_DATE := l_amortization_rec.due_date;
8933 l_invoices_tbl(i).PURPOSE := lns_utility_pub.get_lookup_meaning('PAYMENT_APPLICATION_TYPE', 'FEE');
8934 l_invoices_tbl(i).BILLED_FLAG := 'N';
8935 l_invoices_tbl(i).INVOICE_CURRENCY := l_currency;
8936 l_invoices_tbl(i).EXCHANGE_RATE := l_exchange_rate;
8937 --l_invoices_tbl(i).GL_DATE := l_invoices_tbl(i).DUE_DATE + nvl(g_day_togl_after_dd, 0);
8938
8939 l_invoices_tbl(i).GL_DATE := l_trx_date + nvl(g_day_togl_after_dd, 0);
8940 LNS_BILLING_UTIL_PUB.VALIDATE_AND_DEFAULT_GL_DATE(
8941 p_gl_date => l_invoices_tbl(i).GL_DATE,
8942 p_trx_date => l_trx_date, --l_invoices_tbl(i).DUE_DATE,
8943 p_set_of_books_id => g_set_of_books_id,
8944 x_default_gl_date => l_invoices_tbl(i).GL_DATE);
8945
8946 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Added fee ' || l_amortization_rec.FEE_AMOUNT);
8947 end if;
8948
8949 x_invoices_tbl := l_invoices_tbl;
8950
8951 if P_COMMIT = FND_API.G_TRUE then
8952 COMMIT WORK;
8953 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
8954 end if;
8955
8956 -- END OF BODY OF API
8957 x_return_status := FND_API.G_RET_STS_SUCCESS;
8958
8959 -- Standard call to get message count and if count is 1, get message info
8960 FND_MSG_PUB.Count_And_Get(
8961 p_encoded => FND_API.G_FALSE,
8962 p_count => x_msg_count,
8963 p_data => x_msg_data);
8964
8965 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
8966
8967 EXCEPTION
8968 WHEN FND_API.G_EXC_ERROR THEN
8969 ROLLBACK TO GET_NEXT_INSTAL_TO_BILL;
8970 x_return_status := FND_API.G_RET_STS_ERROR;
8971 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8972 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8973 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8974 ROLLBACK TO GET_NEXT_INSTAL_TO_BILL;
8975 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8976 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8977 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8978 WHEN OTHERS THEN
8979 ROLLBACK TO GET_NEXT_INSTAL_TO_BILL;
8980 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8981 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
8982 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
8983 END IF;
8984 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
8985 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
8986 END;
8987
8988
8989
8990
8991 /*========================================================================
8992 | PUBLIC PROCEDURE BILL_AND_PAY_NEXT_INSTAL
8993 |
8994 | DESCRIPTION
8995 | This procedure bills and pays next scheduled installment
8996 |
8997 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
8998 | None
8999 |
9000 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
9001 | init
9002 | LogMessage
9003 |
9004 | PARAMETERS
9005 | P_API_VERSION IN Standard in parameter
9006 | P_INIT_MSG_LIST IN Standard in parameter
9007 | P_COMMIT IN Standard in parameter
9008 | P_VALIDATION_LEVEL IN Standard in parameter
9009 | P_LOAN_ID IN Loan ID
9010 | P_CASH_RECEIPTS_TBL IN LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL
9011 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
9012 | X_MSG_COUNT OUT NOCOPY Standard out parameter
9013 | X_MSG_DATA OUT NOCOPY Standard out parameter
9014 |
9015 | KNOWN ISSUES
9016 | None
9017 |
9018 | NOTES
9019 | Any interesting aspect of the code in the package body which needs
9020 | to be stated.
9021 |
9022 | MODIFICATION HISTORY
9023 | Date Author Description of Changes
9024 | 03-17-2009 scherkas Created for bug
9025 |
9026 *=======================================================================*/
9027 PROCEDURE BILL_AND_PAY_NEXT_INSTAL(
9028 P_API_VERSION IN NUMBER,
9029 P_INIT_MSG_LIST IN VARCHAR2,
9030 P_COMMIT IN VARCHAR2,
9031 P_VALIDATION_LEVEL IN NUMBER,
9032 P_LOAN_ID IN NUMBER,
9033 P_CASH_RECEIPTS_TBL IN LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL,
9034 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
9035 X_MSG_COUNT OUT NOCOPY NUMBER,
9036 X_MSG_DATA OUT NOCOPY VARCHAR2)
9037 IS
9038
9039 /*-----------------------------------------------------------------------+
9040 | Local Variable Declarations and initializations |
9041 +-----------------------------------------------------------------------*/
9042
9043 l_api_name CONSTANT VARCHAR2(30) := 'BILL_AND_PAY_NEXT_INSTAL';
9044 l_api_version CONSTANT NUMBER := 1.0;
9045 l_return_status VARCHAR2(1);
9046 l_msg_count NUMBER;
9047 l_msg_data VARCHAR2(32767);
9048 l_Count1 NUMBER;
9049
9050 l_am_sched_tbl LNS_BILLING_BATCH_PUB.AMORTIZATION_SCHED_TBL;
9051 l_loans_to_bill_tbl LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
9052
9053 /*-----------------------------------------------------------------------+
9054 | Cursor Declarations |
9055 +-----------------------------------------------------------------------*/
9056
9057 CURSOR loan_to_bill_cur(P_LOAN_ID number) IS
9058 select
9059 head.LOAN_ID,
9060 head.LOAN_NUMBER,
9061 head.LOAN_DESCRIPTION,
9062 head.OBJECT_VERSION_NUMBER,
9063 head.FUNDED_AMOUNT,
9064 head.BILL_TO_ACCT_SITE_ID,
9065 term.FIRST_PAYMENT_DATE,
9066 term.NEXT_PAYMENT_DUE_DATE,
9067 nvl(head.BILLED_FLAG, 'N'),
9068 head.LOAN_CURRENCY,
9069 head.CUST_ACCOUNT_ID,
9070 head.CUSTOM_PAYMENTS_FLAG,
9071 term.LOAN_PAYMENT_FREQUENCY,
9072 term.NUMBER_GRACE_DAYS,
9073 term.PAYMENT_APPLICATION_ORDER,
9074 head.EXCHANGE_RATE_TYPE,
9075 head.EXCHANGE_DATE,
9076 head.EXCHANGE_RATE,
9077 nvl(head.FORGIVENESS_FLAG, 'N'),
9078 nvl(head.FORGIVENESS_PERCENT, 0),
9079 nvl(head.CURRENT_PHASE,'TERM')
9080 from LNS_LOAN_HEADERS_ALL_VL head,
9081 LNS_TERMS term
9082 where head.loan_id = term.loan_id
9083 and head.LOAN_ID = P_LOAN_ID;
9084
9085 CURSOR get_last_am_cur(P_LOAN_ID number) IS
9086 select loan.LAST_AMORTIZATION_ID
9087 from LNS_LOAN_HEADERS_all loan
9088 where loan.loan_id = P_LOAN_ID;
9089
9090 BEGIN
9091
9092 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
9093
9094 -- Standard start of API savepoint
9095 SAVEPOINT BILL_AND_PAY_NEXT_INSTAL;
9096 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
9097
9098 -- Standard call to check for call compatibility
9099 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
9100 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9101 END IF;
9102
9103 -- Initialize message list if p_init_msg_list is set to TRUE
9104 IF FND_API.To_Boolean(p_init_msg_list) THEN
9105 FND_MSG_PUB.initialize;
9106 END IF;
9107
9108 -- Initialize API return status to success
9109 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
9110
9111 -- START OF BODY OF API
9112 init;
9113
9114 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
9115
9116 if CAN_BILL_NEXT_INSTAL(P_LOAN_ID) = false then
9117 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Loan is not ready to bill next installment. Returning.');
9118 FND_MESSAGE.SET_NAME('LNS', 'LNS_NOT_READY_BILL_NEXT_INSTAL');
9119 FND_MSG_PUB.Add;
9120 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
9121 RAISE FND_API.G_EXC_ERROR;
9122 end if;
9123
9124 l_Count1 := 1;
9125 open loan_to_bill_cur(P_LOAN_ID);
9126 fetch loan_to_bill_cur into
9127 l_loans_to_bill_tbl(l_Count1).LOAN_ID,
9128 l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER,
9129 l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION,
9130 l_loans_to_bill_tbl(l_Count1).OBJECT_VERSION_NUMBER,
9131 l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT,
9132 l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID,
9133 l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE,
9134 l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE,
9135 l_loans_to_bill_tbl(l_Count1).BILLED_FLAG,
9136 l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY,
9137 l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID,
9138 l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG,
9139 l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY,
9140 l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS,
9141 l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER,
9142 l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE,
9143 l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE,
9144 l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE,
9145 l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG,
9146 l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT,
9147 l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE;
9148 close loan_to_bill_cur;
9149
9150 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan Info:');
9151 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_ID: ' || l_loans_to_bill_tbl(l_Count1).LOAN_ID);
9152 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER: ' || l_loans_to_bill_tbl(l_Count1).LOAN_NUMBER);
9153 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_DESCRIPTION: ' || l_loans_to_bill_tbl(l_Count1).LOAN_DESCRIPTION);
9154 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FUNDED_AMOUNT: ' || l_loans_to_bill_tbl(l_Count1).FUNDED_AMOUNT);
9155 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILL_TO_ADDRESS_ID: ' || l_loans_to_bill_tbl(l_Count1).BILL_TO_ADDRESS_ID);
9156 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FIRST_PAYMENT_DATE: ' || l_loans_to_bill_tbl(l_Count1).FIRST_PAYMENT_DATE);
9157 LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_DUE_DATE: ' || l_loans_to_bill_tbl(l_Count1).NEXT_PAYMENT_DUE_DATE);
9158 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLED_FLAG: ' || l_loans_to_bill_tbl(l_Count1).BILLED_FLAG);
9159 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_CURRENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_CURRENCY);
9160 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_ACCOUNT_ID: ' || l_loans_to_bill_tbl(l_Count1).CUST_ACCOUNT_ID);
9161 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).CUSTOM_PAYMENTS_FLAG);
9162 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_PAYMENT_FREQUENCY: ' || l_loans_to_bill_tbl(l_Count1).LOAN_PAYMENT_FREQUENCY);
9163 LogMessage(FND_LOG.LEVEL_STATEMENT, 'NUMBER_GRACE_DAYS: ' || l_loans_to_bill_tbl(l_Count1).NUMBER_GRACE_DAYS);
9164 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_APPLICATION_ORDER: ' || l_loans_to_bill_tbl(l_Count1).PAYMENT_APPLICATION_ORDER);
9165 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE_TYPE);
9166 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_DATE);
9167 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_loans_to_bill_tbl(l_Count1).EXCHANGE_RATE);
9168 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_FLAG: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_FLAG);
9169 LogMessage(FND_LOG.LEVEL_STATEMENT, 'FORGIVENESS_PERCENT: ' || l_loans_to_bill_tbl(l_Count1).FORGIVENESS_PERCENT);
9170 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CURRENT_PHASE: ' || l_loans_to_bill_tbl(l_Count1).CURRENT_PHASE);
9171
9172 /* do all needed inits */
9173 dbms_lob.createtemporary(g_last_all_statements, FALSE, DBMS_LOB.CALL);
9174 dbms_lob.open(g_last_all_statements, dbms_lob.lob_readwrite);
9175
9176 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Calling BILL_LOANS_EXT...');
9177 BILL_LOANS_EXT(
9178 P_API_VERSION => 1.0,
9179 P_INIT_MSG_LIST => FND_API.G_TRUE,
9180 P_COMMIT => FND_API.G_FALSE,
9181 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
9182 P_LOANS_TO_BILL_TBL => l_loans_to_bill_tbl,
9183 X_RETURN_STATUS => l_return_status,
9184 X_MSG_COUNT => l_msg_count,
9185 X_MSG_DATA => l_msg_data);
9186
9187 IF l_return_status = 'S' THEN
9188 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully billed next due installment.');
9189 ELSE
9190 RAISE FND_API.G_EXC_ERROR;
9191 END IF;
9192
9193 if P_CASH_RECEIPTS_TBL.count > 0 then
9194
9195 open get_last_am_cur(P_LOAN_ID);
9196 fetch get_last_am_cur into l_am_sched_tbl(1);
9197 close get_last_am_cur;
9198
9199 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling PAY_INSTALLMENTS...');
9200 PAY_INSTALLMENTS(
9201 P_API_VERSION => 1.0,
9202 P_INIT_MSG_LIST => FND_API.G_TRUE,
9203 P_COMMIT => FND_API.G_FALSE,
9204 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
9205 P_LOAN_ID => P_LOAN_ID,
9206 P_AM_SCHED_TBL => l_am_sched_tbl,
9207 P_CASH_RECEIPTS_TBL => P_CASH_RECEIPTS_TBL,
9208 X_RETURN_STATUS => l_return_status,
9209 X_MSG_COUNT => l_msg_count,
9210 X_MSG_DATA => l_msg_data);
9211
9212 IF l_return_status = 'S' THEN
9213 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully applied cash receipts.');
9214 ELSE
9215 RAISE FND_API.G_EXC_ERROR;
9216 END IF;
9217
9218 end if;
9219
9220 if P_COMMIT = FND_API.G_TRUE then
9221 COMMIT WORK;
9222 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
9223 end if;
9224
9225 -- END OF BODY OF API
9226 x_return_status := FND_API.G_RET_STS_SUCCESS;
9227
9228 -- Standard call to get message count and if count is 1, get message info
9229 FND_MSG_PUB.Count_And_Get(
9230 p_encoded => FND_API.G_FALSE,
9231 p_count => x_msg_count,
9232 p_data => x_msg_data);
9233
9234 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
9235
9236 EXCEPTION
9237 WHEN FND_API.G_EXC_ERROR THEN
9238 ROLLBACK TO BILL_AND_PAY_NEXT_INSTAL;
9239 x_return_status := FND_API.G_RET_STS_ERROR;
9240 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9241 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9242 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9243 ROLLBACK TO BILL_AND_PAY_NEXT_INSTAL;
9244 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9245 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9246 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9247 WHEN OTHERS THEN
9248 ROLLBACK TO BILL_AND_PAY_NEXT_INSTAL;
9249 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9250 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
9251 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
9252 END IF;
9253 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9254 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9255 END;
9256
9257
9258
9259
9260 /*========================================================================
9261 | PUBLIC PROCEDURE PAY_INSTALLMENTS
9262 |
9263 | DESCRIPTION
9264 | This procedure applies cash receipts to given installments
9265 |
9266 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
9267 | None
9268 |
9269 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
9270 | init
9271 | LogMessage
9272 |
9273 | PARAMETERS
9274 | P_API_VERSION IN Standard in parameter
9275 | P_INIT_MSG_LIST IN Standard in parameter
9276 | P_COMMIT IN Standard in parameter
9277 | P_VALIDATION_LEVEL IN Standard in parameter
9278 | P_LOAN_ID IN Loan ID
9279 | P_AM_SCHED_TBL IN LNS_BILLING_BATCH_PUB.AMORTIZATION_SCHED_TBL,
9280 | P_CASH_RECEIPTS_TBL IN LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL
9281 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
9282 | X_MSG_COUNT OUT NOCOPY Standard out parameter
9283 | X_MSG_DATA OUT NOCOPY Standard out parameter
9284 |
9285 | KNOWN ISSUES
9286 | None
9287 |
9288 | NOTES
9289 | Any interesting aspect of the code in the package body which needs
9290 | to be stated.
9291 |
9292 | MODIFICATION HISTORY
9293 | Date Author Description of Changes
9294 | 03-17-2009 scherkas Created for bug
9295 |
9296 *=======================================================================*/
9297 PROCEDURE PAY_INSTALLMENTS(
9298 P_API_VERSION IN NUMBER,
9299 P_INIT_MSG_LIST IN VARCHAR2,
9300 P_COMMIT IN VARCHAR2,
9301 P_VALIDATION_LEVEL IN NUMBER,
9302 P_LOAN_ID IN NUMBER,
9303 P_AM_SCHED_TBL IN LNS_BILLING_BATCH_PUB.AMORTIZATION_SCHED_TBL,
9304 P_CASH_RECEIPTS_TBL IN LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL,
9305 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
9306 X_MSG_COUNT OUT NOCOPY NUMBER,
9307 X_MSG_DATA OUT NOCOPY VARCHAR2)
9308 IS
9309
9310 /*-----------------------------------------------------------------------+
9311 | Local Variable Declarations and initializations |
9312 +-----------------------------------------------------------------------*/
9313
9314 l_api_name CONSTANT VARCHAR2(30) := 'PAY_INSTALLMENTS';
9315 l_api_version CONSTANT NUMBER := 1.0;
9316 l_return_status VARCHAR2(1);
9317 l_msg_count NUMBER;
9318 l_msg_data VARCHAR2(32767);
9319 l_Count number;
9320 l_Count1 number;
9321 l_order varchar2(30);
9322 l_search_str varchar2(1);
9323 l_start_pos number;
9324 l_end_pos number;
9325 l_receipt number;
9326 l_exit_loop varchar2(1);
9327 l_quit varchar2(1);
9328 l_apply_amount number;
9329 l_application number;
9330 l_trans_to_receipt_rate number;
9331 l_receipt_amount_from number; -- in receipt currency
9332 l_rc_precision number;
9333 l_rc_ext_precision number;
9334 l_rc_min_acct_unit number;
9335 l_inv_precision number;
9336 l_inv_ext_precision number;
9337 l_inv_min_acct_unit number;
9338 l_apply_date date;
9339 l_inv_am_in_rec_cur number;
9340 l_inv_count number;
9341 l_rc_count number;
9342 l_error varchar2(32767);
9343 l_total_applied_amount number;
9344
9345 l_INVOICE_REC LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_REC;
9346 L_INVOICES_TBL LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL;
9347 l_order_tbl DBMS_SQL.VARCHAR2_TABLE;
9348 l_CASH_RECEIPTS_TBL LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL;
9349
9350 /*-----------------------------------------------------------------------+
9351 | Cursor Declarations |
9352 +-----------------------------------------------------------------------*/
9353
9354 -- get payment application order
9355 CURSOR order_cur(P_LOAN_ID number) IS
9356 select PAYMENT_APPLICATION_ORDER
9357 from lns_terms
9358 where loan_id = P_LOAN_ID;
9359
9360 -- fetching open invoices in payment order
9361 CURSOR invoices_cur(P_LOAN_ID number, P_AMORTIZATION_SCHED_ID number, P_INVOICE_TYPE varchar2) IS
9362 select
9363 decode(P_INVOICE_TYPE, 'INT', am.INTEREST_TRX_ID, 'PRIN', am.principal_trx_id, 'FEE', am.FEE_TRX_ID),
9364 psa.PAYMENT_SCHEDULE_ID,
9365 psa.trx_number,
9366 psa.TRX_DATE,
9367 psa.due_date,
9368 psa.gl_date,
9369 psa.amount_due_remaining,
9370 P_INVOICE_TYPE,
9371 psa.invoice_currency_code,
9372 nvl(loan.EXCHANGE_RATE, 1)
9373 from
9374 lns_amortization_scheds am,
9375 lns_loan_headers loan,
9376 ar_payment_schedules psa,
9377 lns_lookups look
9378 where
9379 am.loan_id = P_LOAN_ID and
9380 am.amortization_schedule_id = P_AMORTIZATION_SCHED_ID and
9381 loan.loan_id = am.loan_id and
9382 am.reversed_flag = 'N' and
9383 psa.customer_trx_id = decode(P_INVOICE_TYPE, 'INT', am.INTEREST_TRX_ID, 'PRIN', am.principal_trx_id, 'FEE', am.FEE_TRX_ID) and
9384 psa.amount_due_remaining > 0 and
9385 psa.status = 'OP' and
9386 (am.INTEREST_TRX_ID is not null or am.principal_trx_id is not null or am.FEE_TRX_ID is not null) and
9387 look.lookup_type = 'PAYMENT_APPLICATION_TYPE' and
9388 look.lookup_code = P_INVOICE_TYPE;
9389
9390 BEGIN
9391
9392 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
9393
9394 -- Standard start of API savepoint
9395 SAVEPOINT PAY_INSTALLMENTS;
9396 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
9397
9398 -- Standard call to check for call compatibility
9399 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
9400 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9401 END IF;
9402
9403 -- Initialize message list if p_init_msg_list is set to TRUE
9404 IF FND_API.To_Boolean(p_init_msg_list) THEN
9405 FND_MSG_PUB.initialize;
9406 END IF;
9407
9408 -- Initialize API return status to success
9409 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
9410
9411 -- START OF BODY OF API
9412 init;
9413
9414 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input:');
9415 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_ID = ' || P_LOAN_ID);
9416
9417 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization schedules:');
9418 for i in 1..P_AM_SCHED_TBL.count loop
9419 LogMessage(FND_LOG.LEVEL_STATEMENT, P_AM_SCHED_TBL(i));
9420 end loop;
9421
9422 l_CASH_RECEIPTS_TBL := P_CASH_RECEIPTS_TBL;
9423 l_total_applied_amount := 0;
9424 for i in 1..l_CASH_RECEIPTS_TBL.count loop
9425 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Cash receipt #' || i);
9426 LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_NUMBER: ' || l_CASH_RECEIPTS_TBL(i).RECEIPT_NUMBER);
9427 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CASH_RECEIPT_ID: ' || l_CASH_RECEIPTS_TBL(i).CASH_RECEIPT_ID);
9428 LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_AMOUNT: ' || l_CASH_RECEIPTS_TBL(i).RECEIPT_AMOUNT);
9429 LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_CURRENCY: ' || l_CASH_RECEIPTS_TBL(i).RECEIPT_CURRENCY);
9430 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_CASH_RECEIPTS_TBL(i).EXCHANGE_RATE);
9431 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_CASH_RECEIPTS_TBL(i).EXCHANGE_DATE);
9432 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_CASH_RECEIPTS_TBL(i).EXCHANGE_RATE_TYPE);
9433 LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORIGINAL_CURRENCY: ' || l_CASH_RECEIPTS_TBL(i).ORIGINAL_CURRENCY);
9434 LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLY_DATE: ' || l_CASH_RECEIPTS_TBL(i).APPLY_DATE);
9435 LogMessage(FND_LOG.LEVEL_STATEMENT, 'GL_DATE: ' || l_CASH_RECEIPTS_TBL(i).GL_DATE);
9436 l_total_applied_amount := l_total_applied_amount + l_CASH_RECEIPTS_TBL(i).RECEIPT_AMOUNT;
9437 end loop;
9438
9439 if l_CASH_RECEIPTS_TBL.count = 0 then
9440 LogMessage(FND_LOG.LEVEL_STATEMENT, 'No cash receipts are passed - nothing to apply. Returning.');
9441 return;
9442 end if;
9443
9444 if l_total_applied_amount = 0 then
9445 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Total applied amount = 0 - nothing to apply. Returning.');
9446 return;
9447 end if;
9448
9449 -- get payment application order
9450 open order_cur(P_LOAN_ID);
9451 fetch order_cur into l_order;
9452 close order_cur;
9453
9454 l_count := 0;
9455 l_search_str := '_';
9456 l_start_pos := 1;
9457 l_end_pos := instr(l_order, l_search_str, l_start_pos, 1);
9458
9459 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Payment application order:' || l_order);
9460 LOOP
9461 l_count := l_count + 1;
9462 if l_end_pos <> 0 then
9463 l_order_tbl(l_count) := substr(l_order, l_start_pos, l_end_pos-l_start_pos);
9464 --LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_count: ' || l_order_tbl(l_count));
9465 else
9466 l_order_tbl(l_count) := substr(l_order, l_start_pos, LENGTH(l_order)-l_start_pos+1);
9467 --LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_count: ' || l_order_tbl(l_count));
9468 exit;
9469 end if;
9470 l_start_pos := l_end_pos+1;
9471 l_end_pos := instr(l_order, l_search_str, l_start_pos, 1);
9472 END LOOP;
9473
9474 l_Count1 := 0;
9475
9476 -- looping thru payment application order table and fetch invoices in order to be applied
9477 FOR l_Count IN 1..l_order_tbl.count LOOP
9478 for i in 1..P_AM_SCHED_TBL.count loop
9479
9480 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Amortization_schedule_id = ' || P_AM_SCHED_TBL(i));
9481
9482 l_INVOICE_REC := null;
9483 open invoices_cur(P_LOAN_ID, P_AM_SCHED_TBL(i), l_order_tbl(l_Count));
9484 fetch invoices_cur into l_INVOICE_REC.CUST_TRX_ID,
9485 l_INVOICE_REC.PAYMENT_SCHEDULE_ID,
9486 l_INVOICE_REC.INVOICE_NUMBER,
9487 l_INVOICE_REC.TRX_DATE,
9488 l_INVOICE_REC.DUE_DATE,
9489 l_INVOICE_REC.GL_DATE,
9490 l_INVOICE_REC.REMAINING_AMOUNT,
9491 l_INVOICE_REC.PURPOSE,
9492 l_INVOICE_REC.INVOICE_CURRENCY,
9493 l_INVOICE_REC.EXCHANGE_RATE;
9494 close invoices_cur;
9495
9496 if l_INVOICE_REC.CUST_TRX_ID is not null then
9497
9498 l_Count1 := l_Count1 + 1;
9499
9500 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice #' || l_Count1);
9501 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || l_INVOICE_REC.PAYMENT_SCHEDULE_ID);
9502 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_ID: ' || l_INVOICE_REC.CUST_TRX_ID);
9503 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INVOICE_NUMBER: ' || l_INVOICE_REC.INVOICE_NUMBER);
9504 LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_DATE: ' || l_INVOICE_REC.TRX_DATE);
9505 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || l_INVOICE_REC.DUE_DATE);
9506 LogMessage(FND_LOG.LEVEL_STATEMENT, 'GL_DATE: ' || l_INVOICE_REC.GL_DATE);
9507 LogMessage(FND_LOG.LEVEL_STATEMENT, 'REMAINING_AMOUNT: ' || l_INVOICE_REC.REMAINING_AMOUNT);
9508 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PURPOSE: ' || l_INVOICE_REC.PURPOSE);
9509 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INVOICE_CURRENCY: ' || l_INVOICE_REC.INVOICE_CURRENCY);
9510 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_INVOICE_REC.EXCHANGE_RATE);
9511
9512 L_INVOICES_TBL(l_Count1) := l_INVOICE_REC;
9513
9514 end if;
9515
9516 END LOOP;
9517 END LOOP;
9518
9519 if L_INVOICES_TBL.count = 0 then
9520 LogMessage(FND_LOG.LEVEL_STATEMENT, 'No open invoices to pay. Returning.');
9521 return;
9522 end if;
9523
9524 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Applying receipts...');
9525
9526 l_receipt := 1;
9527 l_quit := 'N';
9528 l_application := 0;
9529 l_inv_count := 0;
9530 l_rc_count := 0;
9531
9532 -- looping thru invoices and apply receipts
9533 FOR l_Count IN 1..L_INVOICES_TBL.count LOOP
9534
9535 l_inv_count := l_inv_count + 1;
9536 LogMessage(FND_LOG.LEVEL_STATEMENT, '-------------');
9537 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice #' || l_Count);
9538 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PAYMENT_SCHEDULE_ID: ' || L_INVOICES_TBL(l_Count).PAYMENT_SCHEDULE_ID);
9539 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUST_TRX_ID: ' || L_INVOICES_TBL(l_Count).CUST_TRX_ID);
9540 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INVOICE_NUMBER: ' || L_INVOICES_TBL(l_Count).INVOICE_NUMBER);
9541 LogMessage(FND_LOG.LEVEL_STATEMENT, 'TRX_DATE: ' || L_INVOICES_TBL(l_Count).TRX_DATE);
9542 LogMessage(FND_LOG.LEVEL_STATEMENT, 'DUE_DATE: ' || L_INVOICES_TBL(l_Count).DUE_DATE);
9543 LogMessage(FND_LOG.LEVEL_STATEMENT, 'GL_DATE: ' || L_INVOICES_TBL(l_Count).GL_DATE);
9544 LogMessage(FND_LOG.LEVEL_STATEMENT, 'REMAINING_AMOUNT: ' || L_INVOICES_TBL(l_Count).REMAINING_AMOUNT);
9545 LogMessage(FND_LOG.LEVEL_STATEMENT, 'PURPOSE: ' || L_INVOICES_TBL(l_Count).PURPOSE);
9546 LogMessage(FND_LOG.LEVEL_STATEMENT, 'INVOICE_CURRENCY: ' || L_INVOICES_TBL(l_Count).INVOICE_CURRENCY);
9547 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || L_INVOICES_TBL(l_Count).EXCHANGE_RATE);
9548
9549 FOR l_Count1 IN l_receipt..l_CASH_RECEIPTS_TBL.count LOOP
9550
9551 l_rc_count := l_receipt;
9552 LogMessage(FND_LOG.LEVEL_STATEMENT, ' ');
9553 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Receipt #' || l_Count1);
9554 LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_NUMBER: ' || l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_NUMBER);
9555 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CASH_RECEIPT_ID: ' || l_CASH_RECEIPTS_TBL(l_Count1).CASH_RECEIPT_ID);
9556 LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_AMOUNT: ' || l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT);
9557 LogMessage(FND_LOG.LEVEL_STATEMENT, 'RECEIPT_CURRENCY: ' || l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_CURRENCY);
9558 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE: ' || l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE);
9559 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_DATE: ' || l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_DATE);
9560 LogMessage(FND_LOG.LEVEL_STATEMENT, 'EXCHANGE_RATE_TYPE: ' || l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE_TYPE);
9561 LogMessage(FND_LOG.LEVEL_STATEMENT, 'ORIGINAL_CURRENCY: ' || l_CASH_RECEIPTS_TBL(l_Count1).ORIGINAL_CURRENCY);
9562 LogMessage(FND_LOG.LEVEL_STATEMENT, 'APPLY_DATE: ' || l_CASH_RECEIPTS_TBL(l_Count1).APPLY_DATE);
9563 LogMessage(FND_LOG.LEVEL_STATEMENT, 'GL_DATE: ' || l_CASH_RECEIPTS_TBL(l_Count1).GL_DATE);
9564
9565 BEGIN
9566
9567 -- calculate amounts using curencies
9568 if l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_CURRENCY = L_INVOICES_TBL(l_Count).INVOICE_CURRENCY then
9569
9570 if L_INVOICES_TBL(l_Count).REMAINING_AMOUNT > l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT then
9571
9572 l_apply_amount := l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT;
9573 l_exit_loop := 'N';
9574
9575 elsif L_INVOICES_TBL(l_Count).REMAINING_AMOUNT <= l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT then
9576
9577 l_apply_amount := L_INVOICES_TBL(l_Count).REMAINING_AMOUNT;
9578 l_exit_loop := 'Y';
9579
9580 end if;
9581
9582 l_receipt_amount_from := null;
9583 l_trans_to_receipt_rate := null;
9584
9585 else -- if trx currency <> receipt currency
9586
9587 -- get rc/functional currency precision
9588 fnd_currency.GET_INFO(CURRENCY_CODE => l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_CURRENCY,
9589 PRECISION => l_rc_precision,
9590 EXT_PRECISION => l_rc_ext_precision,
9591 MIN_ACCT_UNIT => l_rc_min_acct_unit);
9592
9593 -- get invoice currency precision
9594 fnd_currency.GET_INFO(CURRENCY_CODE => L_INVOICES_TBL(l_Count).INVOICE_CURRENCY,
9595 PRECISION => l_inv_precision,
9596 EXT_PRECISION => l_inv_ext_precision,
9597 MIN_ACCT_UNIT => l_inv_min_acct_unit);
9598
9599 if l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE is not null then
9600 logMessage(FND_LOG.LEVEL_STATEMENT, 'using receipt exchange rate ' || l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE);
9601 l_trans_to_receipt_rate := l_CASH_RECEIPTS_TBL(l_Count1).EXCHANGE_RATE;
9602 else
9603 logMessage(FND_LOG.LEVEL_PROCEDURE, 'using loan exchange rate ' || L_INVOICES_TBL(l_Count).EXCHANGE_RATE);
9604 l_trans_to_receipt_rate := L_INVOICES_TBL(l_Count).EXCHANGE_RATE;
9605 end if;
9606
9607 l_inv_am_in_rec_cur := round(L_INVOICES_TBL(l_Count).REMAINING_AMOUNT * l_trans_to_receipt_rate, l_rc_precision);
9608
9609 if l_inv_am_in_rec_cur > l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT then
9610
9611 l_receipt_amount_from := l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT;
9612 l_apply_amount := round(l_receipt_amount_from / l_trans_to_receipt_rate, l_inv_precision);
9613 l_exit_loop := 'N';
9614
9615 elsif l_inv_am_in_rec_cur < l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT then
9616
9617 l_apply_amount := L_INVOICES_TBL(l_Count).REMAINING_AMOUNT;
9618 l_receipt_amount_from := round(l_apply_amount * l_trans_to_receipt_rate, l_rc_precision);
9619 l_exit_loop := 'Y';
9620
9621 else
9622
9623 l_apply_amount := L_INVOICES_TBL(l_Count).REMAINING_AMOUNT;
9624 l_receipt_amount_from := l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT;
9625 l_exit_loop := 'Y';
9626
9627 end if;
9628
9629 end if;
9630
9631 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling AR_RECEIPT_API_PUB.APPLY with following parameters:');
9632 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_cash_receipt_id: ' || l_CASH_RECEIPTS_TBL(l_Count1).CASH_RECEIPT_ID);
9633 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_applied_payment_schedule_id: ' || L_INVOICES_TBL(l_Count).PAYMENT_SCHEDULE_ID);
9634 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_apply_date: ' || l_CASH_RECEIPTS_TBL(l_Count1).APPLY_DATE);
9635 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_apply_gl_date: ' || l_CASH_RECEIPTS_TBL(l_Count1).GL_DATE);
9636 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_amount_applied: ' || l_apply_amount); -- in loan currency
9637 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_amount_applied_from: ' || l_receipt_amount_from); -- in receipt currency
9638 LogMessage(FND_LOG.LEVEL_STATEMENT, 'p_trans_to_receipt_rate: ' || l_trans_to_receipt_rate);
9639
9640 BEGIN
9641
9642 l_error := null;
9643 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling AR_RECEIPT_API_PUB.APPLY...');
9644 AR_RECEIPT_API_PUB.APPLY(P_API_VERSION => 1.0
9645 ,P_INIT_MSG_LIST => FND_API.G_TRUE
9646 ,P_COMMIT => FND_API.G_FALSE
9647 ,X_RETURN_STATUS => l_return_status
9648 ,X_MSG_COUNT => l_msg_count
9649 ,X_MSG_DATA => l_msg_data
9650 ,p_cash_receipt_id => l_CASH_RECEIPTS_TBL(l_Count1).CASH_RECEIPT_ID
9651 ,p_applied_payment_schedule_id => L_INVOICES_TBL(l_Count).PAYMENT_SCHEDULE_ID
9652 ,p_apply_date => l_CASH_RECEIPTS_TBL(l_Count1).APPLY_DATE
9653 ,p_apply_gl_date => l_CASH_RECEIPTS_TBL(l_Count1).GL_DATE
9654 ,p_amount_applied => l_apply_amount
9655 ,p_amount_applied_from => l_receipt_amount_from
9656 ,p_trans_to_receipt_rate => l_trans_to_receipt_rate);
9657
9658 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
9659 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || l_msg_data);
9660
9661 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9662 l_error := FND_MSG_PUB.Get(p_encoded => 'F');
9663 END IF;
9664
9665 EXCEPTION
9666 WHEN OTHERS THEN
9667 l_return_status := FND_API.G_RET_STS_ERROR;
9668 l_error := SQLERRM;
9669 END;
9670
9671 if l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_CURRENCY = L_INVOICES_TBL(l_Count).INVOICE_CURRENCY then
9672 l_receipt_amount_from := l_apply_amount;
9673 end if;
9674
9675 l_application := l_application + 1;
9676
9677 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9678 FND_MESSAGE.SET_NAME('LNS', 'LNS_APPL_CR_FAIL');
9679 FND_MSG_PUB.Add;
9680 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
9681 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Reported error: ' || l_error);
9682 RAISE FND_API.G_EXC_ERROR;
9683 END IF;
9684
9685 L_INVOICES_TBL(l_Count).REMAINING_AMOUNT := L_INVOICES_TBL(l_Count).REMAINING_AMOUNT - l_apply_amount;
9686 l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT := l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT - l_receipt_amount_from;
9687
9688 if l_CASH_RECEIPTS_TBL(l_Count1).RECEIPT_AMOUNT = 0 then
9689
9690 if l_receipt = l_CASH_RECEIPTS_TBL.count then
9691 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Last receipt has been exhausted - exiting receipts loop');
9692 l_quit := 'Y';
9693 exit;
9694 else
9695 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Receipt #' || l_receipt || ' has been exhausted - continue with next receipt');
9696 l_quit := 'N';
9697 l_receipt := l_receipt + 1;
9698 end if;
9699
9700 end if;
9701
9702 if l_exit_loop = 'Y' then
9703 exit;
9704 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Invoice #' || l_Count || ' has been fully paid - going to next invoice');
9705 end if;
9706
9707 EXCEPTION
9708 WHEN OTHERS THEN
9709 RAISE FND_API.G_EXC_ERROR;
9710 END;
9711
9712 END LOOP;
9713
9714 if l_quit = 'Y' then
9715 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Exiting invoices loop');
9716 exit;
9717 end if;
9718
9719 END LOOP;
9720
9721 LogMessage(FND_LOG.LEVEL_UNEXPECTED, '______________');
9722 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully applied ' || l_rc_count || ' receipts to ' || l_inv_count || ' invoices');
9723 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Number of applications: ' || l_application);
9724
9725 if P_COMMIT = FND_API.G_TRUE then
9726 COMMIT WORK;
9727 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
9728 end if;
9729
9730 -- END OF BODY OF API
9731 x_return_status := FND_API.G_RET_STS_SUCCESS;
9732
9733 -- Standard call to get message count and if count is 1, get message info
9734 FND_MSG_PUB.Count_And_Get(
9735 p_encoded => FND_API.G_FALSE,
9736 p_count => x_msg_count,
9737 p_data => x_msg_data);
9738
9739 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
9740
9741 EXCEPTION
9742 WHEN FND_API.G_EXC_ERROR THEN
9743 ROLLBACK TO PAY_INSTALLMENTS;
9744 x_return_status := FND_API.G_RET_STS_ERROR;
9745 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9746 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9747 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9748 ROLLBACK TO PAY_INSTALLMENTS;
9749 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9750 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9751 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9752 WHEN OTHERS THEN
9753 ROLLBACK TO PAY_INSTALLMENTS;
9754 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9755 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
9756 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
9757 END IF;
9758 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
9759 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
9760 END;
9761
9762
9763
9764
9765 /*========================================================================
9766 | PUBLIC FUNCTION CAN_BILL_NEXT_INSTAL
9767 |
9768 | DESCRIPTION
9769 | This function returns true/false is loan ready to bill next installment
9770 |
9771 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
9772 | None
9773 |
9774 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
9775 | LogMessage
9776 |
9777 | PARAMETERS
9778 | P_LOAN_ID IN Loan ID
9779 |
9780 | KNOWN ISSUES
9781 | None
9782 |
9783 | NOTES
9784 | Any interesting aspect of the code in the package body which needs
9785 | to be stated.
9786 |
9787 | MODIFICATION HISTORY
9788 | Date Author Description of Changes
9789 | 03-17-2009 scherkas Created for bug
9790 |
9791 *=======================================================================*/
9792 FUNCTION CAN_BILL_NEXT_INSTAL(P_LOAN_ID IN NUMBER) return BOOLEAN
9793 IS
9794
9795 /*-----------------------------------------------------------------------+
9796 | Local Variable Declarations and initializations |
9797 +-----------------------------------------------------------------------*/
9798
9799 l_api_name CONSTANT VARCHAR2(30) := 'CAN_BILL_NEXT_INSTAL';
9800 l_return_status VARCHAR2(1);
9801 l_msg_count NUMBER;
9802 l_msg_data VARCHAR2(32767);
9803 l_return BOOLEAN;
9804 l_value varchar2(1);
9805 l_is_disable_bill VARCHAR2(1);
9806
9807 l_loans_next_dd_rec LNS_BILLING_BATCH_PUB.LOAN_NEXT_DD_REC;
9808
9809 /*-----------------------------------------------------------------------+
9810 | Cursor Declarations |
9811 +-----------------------------------------------------------------------*/
9812
9813 CURSOR loans_cur(P_LOAN_ID NUMBER) IS
9814 select
9815 head.LOAN_ID,
9816 head.LOAN_NUMBER,
9817 head.OBJECT_VERSION_NUMBER,
9818 LNS_BILLING_UTIL_PUB.LAST_PAYMENT_NUMBER(head.LOAN_ID) + 1,
9819 head.CUSTOM_PAYMENTS_FLAG
9820 from LNS_LOAN_HEADERS head,
9821 LNS_TERMS term
9822 where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
9823 and head.loan_id = term.loan_id
9824 and (head.BILLED_FLAG = 'Y' or head.BILLED_FLAG is null)
9825 and nvl(head.LAST_PAYMENT_NUMBER, 0) < (select max(END_INSTALLMENT_NUMBER) from lns_rate_schedules
9826 where term_id = term.term_id and phase = nvl(head.CURRENT_PHASE, 'TERM'))
9827 and trunc(term.NEXT_PAYMENT_DUE_DATE + nvl(term.NUMBER_GRACE_DAYS, 0)) < trunc(sysdate)
9828 and head.LOAN_ID = P_LOAN_ID;
9829
9830 CURSOR can_bill_cur(P_LOAN_ID NUMBER) IS
9831 select 'x'
9832 from LNS_LOAN_HEADERS head,
9833 LNS_TERMS term
9834 where head.LOAN_STATUS in ('ACTIVE', 'DEFAULT', 'DELINQUENT')
9835 and head.loan_id = term.loan_id
9836 and (head.BILLED_FLAG is null or head.BILLED_FLAG = 'N')
9837 and nvl(head.LAST_PAYMENT_NUMBER, 0) < (select max(END_INSTALLMENT_NUMBER) from lns_rate_schedules
9838 where term_id = term.term_id and phase = nvl(head.CURRENT_PHASE, 'TERM'))
9839 and head.LOAN_ID = P_LOAN_ID;
9840
9841 BEGIN
9842
9843 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
9844
9845 -- START OF BODY OF API
9846 init;
9847
9848 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
9849 l_return := false;
9850
9851 /* verify input parameters */
9852 if P_LOAN_ID is null then
9853
9854 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
9855 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
9856 FND_MSG_PUB.Add;
9857 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
9858 RAISE FND_API.G_EXC_ERROR;
9859
9860 end if;
9861
9862 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Checking the Disable_billing_flag in '||l_api_name);
9863
9864 l_is_disable_bill := IS_BILLING_DISABLED(P_LOAN_ID);
9865 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_is_disable_bill is '||l_is_disable_bill);
9866 IF l_is_disable_bill = 'Y' THEN
9867 LogMessage(FND_LOG.LEVEL_STATEMENT, 'BILLING is Disabled for the loan : '||p_loan_id);
9868 return l_return;
9869 END IF;
9870
9871 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting loan details...');
9872 open loans_cur(P_LOAN_ID);
9873 fetch loans_cur into
9874 l_loans_next_dd_rec.LOAN_ID,
9875 l_loans_next_dd_rec.LOAN_NUMBER,
9876 l_loans_next_dd_rec.OBJECT_VERSION_NUMBER,
9877 l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER,
9878 l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG;
9879 close loans_cur;
9880
9881 LogMessage(FND_LOG.LEVEL_STATEMENT, 'LOAN_NUMBER = ' || l_loans_next_dd_rec.LOAN_NUMBER);
9882 LogMessage(FND_LOG.LEVEL_STATEMENT, 'NEXT_PAYMENT_NUMBER = ' || l_loans_next_dd_rec.NEXT_PAYMENT_NUMBER);
9883 LogMessage(FND_LOG.LEVEL_STATEMENT, 'CUSTOM_PAYMENTS_FLAG = ' || l_loans_next_dd_rec.CUSTOM_PAYMENTS_FLAG);
9884
9885 if l_loans_next_dd_rec.LOAN_ID is not null then
9886
9887 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling CALC_SINGLE_LOAN_NEXT_DD...');
9888 CALC_SINGLE_LOAN_NEXT_DD(
9889 P_API_VERSION => 1.0,
9890 P_INIT_MSG_LIST => FND_API.G_TRUE,
9891 P_COMMIT => FND_API.G_FALSE,
9892 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
9893 P_LOAN_NEXT_DD_REC => l_loans_next_dd_rec,
9894 X_RETURN_STATUS => l_return_status,
9895 X_MSG_COUNT => l_msg_count,
9896 X_MSG_DATA => l_msg_data);
9897
9898 IF l_return_status = 'S' THEN
9899 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully calculated next payment due date.');
9900 ELSE
9901 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Failed to calculate next payment due date.');
9902 FND_MESSAGE.SET_NAME('LNS', 'LNS_CALC_NEXT_DUE_FAIL');
9903 FND_MSG_PUB.Add;
9904 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
9905 RAISE FND_API.G_EXC_ERROR;
9906 END IF;
9907
9908 end if;
9909
9910 open can_bill_cur(P_LOAN_ID);
9911 fetch can_bill_cur into l_value;
9912 close can_bill_cur;
9913
9914 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_value = ' || l_value);
9915 if l_value is not null then
9916 l_return := true;
9917 end if;
9918
9919 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
9920
9921 return l_return;
9922
9923 EXCEPTION
9924 WHEN OTHERS THEN
9925 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'In exception of ' || l_api_name);
9926 return l_return;
9927 END;
9928
9929
9930
9931 /*========================================================================
9932 | PUBLIC PROCEDURE GET_BILLED_INSTALLMENT
9933 |
9934 | DESCRIPTION
9935 | This procedure returns already billed installment in LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL format
9936 |
9937 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
9938 | None
9939 |
9940 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
9941 | init
9942 | LogMessage
9943 |
9944 | PARAMETERS
9945 | P_API_VERSION IN Standard in parameter
9946 | P_INIT_MSG_LIST IN Standard in parameter
9947 | P_COMMIT IN Standard in parameter
9948 | P_VALIDATION_LEVEL IN Standard in parameter
9949 | P_LOAN_ID IN Loan ID
9950 | P_AM_SCHED_ID IN Amortization sched ID
9951 | X_INVOICES_TBL OUT NOCOPY LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL,
9952 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
9953 | X_MSG_COUNT OUT NOCOPY Standard out parameter
9954 | X_MSG_DATA OUT NOCOPY Standard out parameter
9955 |
9956 | KNOWN ISSUES
9957 | None
9958 |
9959 | NOTES
9960 | Any interesting aspect of the code in the package body which needs
9961 | to be stated.
9962 |
9963 | MODIFICATION HISTORY
9964 | Date Author Description of Changes
9965 | 04-27-2009 scherkas Created for bug
9966 |
9967 *=======================================================================*/
9968 PROCEDURE GET_BILLED_INSTALLMENT(
9969 P_API_VERSION IN NUMBER,
9970 P_INIT_MSG_LIST IN VARCHAR2,
9971 P_COMMIT IN VARCHAR2,
9972 P_VALIDATION_LEVEL IN NUMBER,
9973 P_LOAN_ID IN NUMBER,
9974 P_AM_SCHED_ID IN NUMBER,
9975 X_INVOICES_TBL OUT NOCOPY LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_TBL,
9976 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
9977 X_MSG_COUNT OUT NOCOPY NUMBER,
9978 X_MSG_DATA OUT NOCOPY VARCHAR2)
9979 IS
9980
9981 /*-----------------------------------------------------------------------+
9982 | Local Variable Declarations and initializations |
9983 +-----------------------------------------------------------------------*/
9984
9985 l_api_name CONSTANT VARCHAR2(30) := 'GET_BILLED_INSTALLMENT';
9986 l_api_version CONSTANT NUMBER := 1.0;
9987 l_return_status VARCHAR2(1);
9988 l_msg_count NUMBER;
9989 l_msg_data VARCHAR2(32767);
9990 i number;
9991
9992 l_invoice_rec LNS_BILLING_BATCH_PUB.INVOICE_DETAILS_REC;
9993
9994 /*-----------------------------------------------------------------------+
9995 | Cursor Declarations |
9996 +-----------------------------------------------------------------------*/
9997
9998 -- fetching open invoices in payment order
9999 CURSOR invoices_cur(P_LOAN_ID number, P_AMORTIZATION_SCHED_ID number) IS
10000 select
10001 psa.customer_trx_id,
10002 psa.PAYMENT_SCHEDULE_ID,
10003 psa.trx_number,
10004 am.payment_number,
10005 decode(psa.customer_trx_id, am.principal_trx_id, 'PRIN', am.interest_trx_id, 'INT', am.fee_trx_id, 'FEE'),
10006 decode(psa.customer_trx_id, am.principal_trx_id, am.principal_amount, am.interest_trx_id, am.interest_amount, am.fee_trx_id, am.fee_amount),
10007 psa.amount_due_remaining,
10008 psa.TRX_DATE,
10009 psa.due_date,
10010 psa.GL_DATE,
10011 psa.invoice_currency_code,
10012 nvl(loan.EXCHANGE_RATE, 1),
10013 trx_type.name
10014 from
10015 lns_amortization_scheds am,
10016 lns_loan_headers loan,
10017 ar_payment_schedules psa,
10018 RA_CUST_TRX_TYPES_ALL trx_type
10019 where
10020 am.loan_id = P_LOAN_ID and
10021 am.amortization_schedule_id = P_AMORTIZATION_SCHED_ID and
10022 loan.loan_id = am.loan_id and
10023 psa.customer_trx_id in (am.principal_trx_id, am.interest_trx_id, am.fee_trx_id) and
10024 (am.INTEREST_TRX_ID is not null or am.principal_trx_id is not null or am.FEE_TRX_ID is not null) and
10025 psa.CUST_TRX_TYPE_ID = trx_type.CUST_TRX_TYPE_ID;
10026
10027 BEGIN
10028
10029 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10030
10031 -- Standard start of API savepoint
10032 SAVEPOINT GET_BILLED_INSTALLMENT;
10033 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
10034
10035 -- Standard call to check for call compatibility
10036 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
10037 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10038 END IF;
10039
10040 -- Initialize message list if p_init_msg_list is set to TRUE
10041 IF FND_API.To_Boolean(p_init_msg_list) THEN
10042 FND_MSG_PUB.initialize;
10043 END IF;
10044
10045 -- Initialize API return status to success
10046 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
10047
10048 -- START OF BODY OF API
10049 init;
10050
10051 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input:');
10052 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_ID = ' || P_LOAN_ID);
10053 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_AM_SCHED_ID = ' || P_AM_SCHED_ID);
10054
10055 /* verify input parameters */
10056 if P_LOAN_ID is null or P_AM_SCHED_ID is null then
10057
10058 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
10059 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
10060 FND_MSG_PUB.Add;
10061 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10062 RAISE FND_API.G_EXC_ERROR;
10063
10064 end if;
10065
10066 i := 0;
10067 open invoices_cur(P_LOAN_ID, P_AM_SCHED_ID);
10068 LOOP
10069
10070 fetch invoices_cur into
10071 l_invoice_rec.CUST_TRX_ID,
10072 l_invoice_rec.PAYMENT_SCHEDULE_ID,
10073 l_invoice_rec.INVOICE_NUMBER,
10074 l_invoice_rec.INSTALLMENT_NUMBER,
10075 l_invoice_rec.PURPOSE,
10076 l_invoice_rec.ORIGINAL_AMOUNT,
10077 l_invoice_rec.REMAINING_AMOUNT,
10078 l_invoice_rec.TRX_DATE,
10079 l_invoice_rec.DUE_DATE,
10080 l_invoice_rec.GL_DATE,
10081 l_invoice_rec.INVOICE_CURRENCY,
10082 l_invoice_rec.EXCHANGE_RATE,
10083 l_invoice_rec.TRANSACTION_TYPE;
10084 exit when invoices_cur%NOTFOUND;
10085
10086 i := i + 1;
10087 x_invoices_tbl(i) := l_invoice_rec;
10088
10089 --x_invoices_tbl(i).TRANSACTION_TYPE := lns_utility_pub.getDocumentName(x_invoices_tbl(i).PURPOSE);
10090 x_invoices_tbl(i).PURPOSE := lns_utility_pub.get_lookup_meaning('PAYMENT_APPLICATION_TYPE', x_invoices_tbl(i).PURPOSE);
10091 x_invoices_tbl(i).FORGIVENESS_AMOUNT := 0;
10092 x_invoices_tbl(i).BILLED_FLAG := 'Y';
10093
10094 END LOOP;
10095 close invoices_cur;
10096
10097 if P_COMMIT = FND_API.G_TRUE then
10098 COMMIT WORK;
10099 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
10100 end if;
10101
10102 -- END OF BODY OF API
10103 x_return_status := FND_API.G_RET_STS_SUCCESS;
10104
10105 -- Standard call to get message count and if count is 1, get message info
10106 FND_MSG_PUB.Count_And_Get(
10107 p_encoded => FND_API.G_FALSE,
10108 p_count => x_msg_count,
10109 p_data => x_msg_data);
10110
10111 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10112
10113 EXCEPTION
10114 WHEN FND_API.G_EXC_ERROR THEN
10115 ROLLBACK TO GET_BILLED_INSTALLMENT;
10116 x_return_status := FND_API.G_RET_STS_ERROR;
10117 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10118 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10119 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10120 ROLLBACK TO GET_BILLED_INSTALLMENT;
10121 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10122 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10123 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10124 WHEN OTHERS THEN
10125 ROLLBACK TO GET_BILLED_INSTALLMENT;
10126 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10127 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
10128 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
10129 END IF;
10130 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10131 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10132 END;
10133
10134
10135
10136 /*========================================================================
10137 | PUBLIC PROCEDURE BILL_AND_PAY_OFFCYCLE_BILLS
10138 |
10139 | DESCRIPTION
10140 | This procedure bills and pays manual (offcycle) installments
10141 |
10142 | PSEUDO CODE/LOGIC
10143 |
10144 | PARAMETERS
10145 | P_API_VERSION IN Standard in parameter
10146 | P_INIT_MSG_LIST IN Standard in parameter
10147 | P_COMMIT IN Standard in parameter
10148 | P_VALIDATION_LEVEL IN Standard in parameter
10149 | P_LOAN_ID IN Loan ID
10150 | P_BILL_HEADERS_TBL IN LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL,
10151 | P_BILL_LINES_TBL IN LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
10152 | P_CASH_RECEIPTS_TBL IN LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL
10153 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
10154 | X_MSG_COUNT OUT NOCOPY Standard out parameter
10155 | X_MSG_DATA OUT NOCOPY Standard out parameter
10156 |
10157 | KNOWN ISSUES
10158 | None
10159 |
10160 | NOTES
10161 | Any interesting aspect of the code in the package body which needs
10162 | to be stated.
10163 |
10164 | MODIFICATION HISTORY
10165 | Date Author Description of Changes
10166 | 04-28-2009 scherkas Created for bug
10167 |
10168 *=======================================================================*/
10169 PROCEDURE BILL_AND_PAY_OFFCYCLE_BILLS(
10170 P_API_VERSION IN NUMBER,
10171 P_INIT_MSG_LIST IN VARCHAR2,
10172 P_COMMIT IN VARCHAR2,
10173 P_VALIDATION_LEVEL IN NUMBER,
10174 P_LOAN_ID IN NUMBER,
10175 P_BILL_HEADERS_TBL IN LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL,
10176 P_BILL_LINES_TBL IN LNS_BILLING_BATCH_PUB.BILL_LINES_TBL,
10177 P_CASH_RECEIPTS_TBL IN LNS_BILLING_BATCH_PUB.CASH_RECEIPT_TBL,
10178 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
10179 X_MSG_COUNT OUT NOCOPY NUMBER,
10180 X_MSG_DATA OUT NOCOPY VARCHAR2)
10181 IS
10182
10183 /*-----------------------------------------------------------------------+
10184 | Local Variable Declarations and initializations |
10185 +-----------------------------------------------------------------------*/
10186
10187 l_api_name CONSTANT VARCHAR2(30) := 'BILL_AND_PAY_OFFCYCLE_BILLS';
10188 l_api_version CONSTANT NUMBER := 1.0;
10189 l_return_status VARCHAR2(1);
10190 l_msg_count NUMBER;
10191 l_msg_data VARCHAR2(32767);
10192 l_last_am_id NUMBER;
10193 l_new_am_id NUMBER;
10194 i NUMBER;
10195
10196 l_am_scheds_tbl LNS_BILLING_BATCH_PUB.AMORTIZATION_SCHED_TBL;
10197 l_loans_to_bill_tbl LNS_BILLING_BATCH_PUB.LOANS_TO_BILL_TBL;
10198
10199 /*-----------------------------------------------------------------------+
10200 | Cursor Declarations |
10201 +-----------------------------------------------------------------------*/
10202
10203 CURSOR get_last_am_cur(P_LOAN_ID number) IS
10204 select loan.LAST_AMORTIZATION_ID
10205 from LNS_LOAN_HEADERS_all loan
10206 where loan.loan_id = P_LOAN_ID;
10207
10208 CURSOR get_new_am_cur(P_LOAN_ID number, P_LAST_AM_SCHED number) IS
10209 select AMORTIZATION_SCHEDULE_ID
10210 from LNS_AMORTIZATION_SCHEDS
10211 where loan_id = P_LOAN_ID and
10212 AMORTIZATION_SCHEDULE_ID > P_LAST_AM_SCHED and
10213 (REVERSED_FLAG is null or REVERSED_FLAG = 'N')
10214 order by AMORTIZATION_SCHEDULE_ID;
10215
10216 BEGIN
10217
10218 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10219
10220 -- Standard start of API savepoint
10221 SAVEPOINT BILL_AND_PAY_OFFCYCLE_BILLS;
10222 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
10223
10224 -- Standard call to check for call compatibility
10225 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
10226 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10227 END IF;
10228
10229 -- Initialize message list if p_init_msg_list is set to TRUE
10230 IF FND_API.To_Boolean(p_init_msg_list) THEN
10231 FND_MSG_PUB.initialize;
10232 END IF;
10233
10234 -- Initialize API return status to success
10235 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
10236
10237 -- START OF BODY OF API
10238 init;
10239
10240 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input:');
10241 LogMessage(FND_LOG.LEVEL_STATEMENT, 'P_LOAN_ID = ' || P_LOAN_ID);
10242
10243 /* verify input parameters */
10244 if P_LOAN_ID is null or P_BILL_HEADERS_TBL.count = 0 then
10245
10246 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Loan must be set.');
10247 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
10248 FND_MSG_PUB.Add;
10249 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10250 RAISE FND_API.G_EXC_ERROR;
10251
10252 end if;
10253
10254 -- get last billed amortization_schedule_id
10255 open get_last_am_cur(P_LOAN_ID);
10256 fetch get_last_am_cur into l_last_am_id;
10257 close get_last_am_cur;
10258
10259 if l_last_am_id is null then
10260 l_last_am_id := 0;
10261 end if;
10262
10263 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Calling CREATE_OFFCYCLE_BILLS...');
10264 LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS(
10265 P_API_VERSION => 1.0,
10266 P_INIT_MSG_LIST => FND_API.G_TRUE,
10267 P_COMMIT => FND_API.G_FALSE,
10268 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
10269 P_BILL_HEADERS_TBL => P_BILL_HEADERS_TBL,
10270 P_BILL_LINES_TBL => P_BILL_LINES_TBL,
10271 X_RETURN_STATUS => l_return_status,
10272 X_MSG_COUNT => l_msg_count,
10273 X_MSG_DATA => l_msg_data);
10274
10275 IF l_return_status = 'S' THEN
10276 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully billed offcycle bills.');
10277 ELSE
10278 RAISE FND_API.G_EXC_ERROR;
10279 END IF;
10280
10281 if P_CASH_RECEIPTS_TBL.count > 0 then
10282
10283 -- fetch all created manual bills
10284 i := 0;
10285 open get_new_am_cur(P_LOAN_ID, l_last_am_id);
10286 LOOP
10287
10288 fetch get_new_am_cur into l_new_am_id;
10289 exit when get_new_am_cur%NOTFOUND;
10290
10291 i := i + 1;
10292 l_am_scheds_tbl(i) := l_new_am_id;
10293
10294 END LOOP;
10295 close get_new_am_cur;
10296
10297 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling PAY_INSTALLMENTS...');
10298 PAY_INSTALLMENTS(
10299 P_API_VERSION => 1.0,
10300 P_INIT_MSG_LIST => FND_API.G_TRUE,
10301 P_COMMIT => FND_API.G_FALSE,
10302 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
10303 P_LOAN_ID => P_LOAN_ID,
10304 P_AM_SCHED_TBL => l_am_scheds_tbl,
10305 P_CASH_RECEIPTS_TBL => P_CASH_RECEIPTS_TBL,
10306 X_RETURN_STATUS => l_return_status,
10307 X_MSG_COUNT => l_msg_count,
10308 X_MSG_DATA => l_msg_data);
10309
10310 IF l_return_status = 'S' THEN
10311 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully applied cash receipts.');
10312 ELSE
10313 RAISE FND_API.G_EXC_ERROR;
10314 END IF;
10315
10316 end if;
10317
10318 if P_COMMIT = FND_API.G_TRUE then
10319 COMMIT WORK;
10320 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
10321 end if;
10322
10323 -- END OF BODY OF API
10324 x_return_status := FND_API.G_RET_STS_SUCCESS;
10325
10326 -- Standard call to get message count and if count is 1, get message info
10327 FND_MSG_PUB.Count_And_Get(
10328 p_encoded => FND_API.G_FALSE,
10329 p_count => x_msg_count,
10330 p_data => x_msg_data);
10331
10332 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10333
10334 EXCEPTION
10335 WHEN FND_API.G_EXC_ERROR THEN
10336 ROLLBACK TO BILL_AND_PAY_OFFCYCLE_BILLS;
10337 x_return_status := FND_API.G_RET_STS_ERROR;
10338 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10339 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10340 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10341 ROLLBACK TO BILL_AND_PAY_OFFCYCLE_BILLS;
10342 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10343 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10344 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10345 WHEN OTHERS THEN
10346 ROLLBACK TO BILL_AND_PAY_OFFCYCLE_BILLS;
10347 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10348 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
10349 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
10350 END IF;
10351 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10352 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10353 END;
10354
10355
10356 /*========================================================================
10357 | PUBLIC PROCEDURE BILL_SING_LOAN_SUBMIT_APPR_FEE
10358 |
10359 | DESCRIPTION
10360 | This procedure bills all the 'At Submit for Approval' fees for single loan
10361 |
10362 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
10363 | None
10364 |
10365 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
10366 | init
10367 | LogMessage
10368 | CREATE_OFFCYCLE_BILLS
10369 |
10370 | PARAMETERS
10371 | P_API_VERSION IN Standard in parameter
10372 | P_INIT_MSG_LIST IN Standard in parameter
10373 | P_COMMIT IN Standard in parameter
10374 | P_VALIDATION_LEVEL IN Standard in parameter
10375 | P_LOAN_ID IN Loan ID
10376 | X_BILLED_YN OUT NOCOPY Signifies whether loan billed
10377 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
10378 | X_MSG_COUNT OUT NOCOPY Standard out parameter
10379 | X_MSG_DATA OUT NOCOPY Standard out parameter
10380 |
10381 | KNOWN ISSUES
10382 | None
10383 |
10384 | NOTES
10385 | Any interesting aspect of the code in the package body which needs
10386 | to be stated.
10387 |
10388 | MODIFICATION HISTORY
10389 | Date Author Description of Changes
10390 | 07-JUL-2009 mbolli Bug#6830765 - Created
10391 |
10392 *=======================================================================*/
10393 PROCEDURE BILL_SING_LOAN_SUBMIT_APPR_FEE(
10394 P_API_VERSION IN NUMBER,
10395 P_INIT_MSG_LIST IN VARCHAR2,
10396 P_COMMIT IN VARCHAR2,
10397 P_VALIDATION_LEVEL IN NUMBER,
10398 P_LOAN_ID IN NUMBER,
10399 X_BILLED_YN OUT NOCOPY VARCHAR2,
10400 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
10401 X_MSG_COUNT OUT NOCOPY NUMBER,
10402 X_MSG_DATA OUT NOCOPY VARCHAR2)
10403 IS
10404
10405 /*-----------------------------------------------------------------------+
10406 | Local Variable Declarations and initializations |
10407 +-----------------------------------------------------------------------*/
10408
10409 l_api_name CONSTANT VARCHAR2(30) := 'BILL_SING_LOAN_SUBMIT_APPR_FEE';
10410 l_api_version CONSTANT NUMBER := 1.0;
10411 l_return_status VARCHAR2(1);
10412 l_msg_count NUMBER;
10413 l_msg_data VARCHAR2(32767);
10414
10415 l_installment_num number;
10416 l_Count number;
10417 l_Count1 number;
10418 l_header_count number;
10419 l_loan_number varchar2(60);
10420 l_tot_fee_amt NUMBER;
10421 l_loan_start_date DATE;
10422 l_current_phase varchar2(30);
10423
10424 l_BILL_HEADERS_TBL LNS_BILLING_BATCH_PUB.BILL_HEADERS_TBL;
10425 l_BILL_LINES_TBL LNS_BILLING_BATCH_PUB.BILL_LINES_TBL;
10426 l_fee_basis_tbl LNS_FEE_ENGINE.FEE_BASIS_TBL;
10427 l_fee_structures LNS_FEE_ENGINE.FEE_STRUCTURE_TBL;
10428 l_fee_tbl LNS_FEE_ENGINE.FEE_CALC_TBL;
10429 l_loan_details LNS_FINANCIALS.LOAN_DETAILS_REC;
10430
10431
10432 /*-----------------------------------------------------------------------+
10433 | Cursor Declarations |
10434 +-----------------------------------------------------------------------*/
10435
10436 /* querying loan number */
10437 CURSOR loan_cur(P_LOAN_ID number) IS
10438 select LOAN_NUMBER,
10439 nvl(current_phase, 'TERM'),
10440 decode(current_phase, 'OPEN', OPEN_LOAN_START_DATE, LOAN_START_DATE)
10441 from LNS_LOAN_HEADERS
10442 where LOAN_ID = P_LOAN_ID;
10443
10444 BEGIN
10445
10446
10447
10448 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10449
10450 -- Standard start of API savepoint
10451 SAVEPOINT BILL_SING_LOAN_SUBMIT_APPR_FEE;
10452 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
10453
10454 -- Standard call to check for call compatibility
10455 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
10456 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10457 END IF;
10458
10459 -- Initialize message list if p_init_msg_list is set to TRUE
10460 IF FND_API.To_Boolean(p_init_msg_list) THEN
10461 FND_MSG_PUB.initialize;
10462 END IF;
10463
10464 -- Initialize API return status to success
10465 l_return_status := FND_API.G_RET_STS_SUCCESS;
10466
10467 -- START OF BODY OF API
10468 l_installment_num := 0;
10469
10470 X_BILLED_YN := 'N';
10471
10472 /* verify input parameters */
10473 if P_LOAN_ID is null then
10474 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
10475 FND_MSG_PUB.Add;
10476 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10477 RAISE FND_API.G_EXC_ERROR;
10478 end if;
10479
10480 /* getting loan_number */
10481 open loan_cur(P_LOAN_ID);
10482 fetch loan_cur into l_loan_number, l_current_phase, l_loan_start_date;
10483 close loan_cur;
10484
10485 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Billing At Submit for Approval fee at 0-th installment for loan ' || l_loan_number || '...');
10486
10487 /*
10488 -- get UnBilled 'Submit For Approval' Fees using getSubmitForApprFeeSchedule
10489 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_FEES_ENGINE.getSubmitForApprFeeSchedule for Unbilled fees...');
10490
10491 LNS_FEE_ENGINE.getSubmitForApprFeeSchedule(p_init_msg_list => FND_API.G_TRUE,
10492 p_loan_Id => P_LOAN_ID,
10493 p_billed_flag => 'N',
10494 x_fees_tbl => l_fee_tbl,
10495 X_RETURN_STATUS => l_return_status,
10496 X_MSG_COUNT => l_msg_count,
10497 X_MSG_DATA => l_msg_data);
10498
10499 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
10500 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
10501
10502 if l_return_status <> 'S' then
10503 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Failed in API LNS_FEES_ENGINE.getSubmitForApprFeeSchedule');
10504 RAISE FND_API.G_EXC_ERROR;
10505 end if;
10506 */
10507
10508 logMessage(FND_LOG.LEVEL_PROCEDURE, 'Processing origination submit for approval fees...');
10509
10510 l_loan_details := lns_financials.getLoanDetails(p_loan_id => P_LOAN_ID
10511 ,p_based_on_terms => 'ORIGINAL'
10512 ,p_phase => l_current_phase);
10513
10514 l_fee_structures(1).fee_category := 'EVENT';
10515 l_fee_structures(1).fee_type := 'EVENT_ORIGINATION';
10516 l_fee_structures(1).phase := l_loan_details.LOAN_PHASE;
10517 l_fee_structures(1).FEE_BILLING_OPTION := 'SUBMIT_FOR_APPROVAL';
10518
10519 l_fee_basis_tbl(1).fee_basis_name := 'TOTAL_BAL';
10520 l_fee_basis_tbl(1).fee_basis_amount := 0;
10521 l_fee_basis_tbl(2).fee_basis_name := 'ORIG_LOAN';
10522 l_fee_basis_tbl(2).fee_basis_amount := l_loan_details.requested_amount;
10523 l_fee_basis_tbl(3).fee_basis_name := 'TOTAL_DISB_AMT';
10524 l_fee_basis_tbl(3).fee_basis_amount := 0;
10525 l_fee_basis_tbl(4).fee_basis_name := 'OVERDUE_PRIN';
10526 l_fee_basis_tbl(4).fee_basis_amount := 0;
10527 l_fee_basis_tbl(5).fee_basis_name := 'OVERDUE_PRIN_INT';
10528 l_fee_basis_tbl(5).fee_basis_amount := 0;
10529 l_fee_basis_tbl(6).fee_basis_name := 'IND_DISB_AMT';
10530 l_fee_basis_tbl(6).fee_basis_amount := 0;
10531 l_fee_basis_tbl(7).fee_basis_name := 'TOTAL_UNDISB_AMT';
10532 l_fee_basis_tbl(7).fee_basis_amount := l_loan_details.requested_amount;
10533 l_fee_basis_tbl(8).fee_basis_name := 'OVERDUE_INT';
10534 l_fee_basis_tbl(8).fee_basis_amount := 0;
10535 l_fee_basis_tbl(9).fee_basis_name := 'CURR_LOAN';
10536 l_fee_basis_tbl(9).fee_basis_amount := 0;
10537
10538 lns_fee_engine.processFees(p_init_msg_list => FND_API.G_TRUE
10539 ,p_commit => FND_API.G_FALSE
10540 ,p_loan_id => P_LOAN_ID
10541 ,p_installment_number => 0
10542 ,p_fee_basis_tbl => l_fee_basis_tbl
10543 ,p_fee_structures => l_fee_structures
10544 ,x_fees_tbl => l_fee_tbl
10545 ,x_return_status => l_return_Status
10546 ,x_msg_count => l_msg_count
10547 ,x_msg_data => l_msg_data);
10548
10549 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
10550 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
10551 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
10552 FND_MESSAGE.SET_NAME('LNS', 'LNS_PROCESS_FEE_ERROR');
10553 FND_MSG_PUB.ADD;
10554 RAISE FND_API.G_EXC_ERROR;
10555 end if;
10556
10557 logMessage(FND_LOG.LEVEL_PROCEDURE, 'Calling lns_fee_engine.getFeeSchedule...');
10558 l_fee_tbl.delete;
10559 lns_fee_engine.getFeeSchedule(p_init_msg_list => FND_API.G_TRUE
10560 ,p_loan_id => P_LOAN_ID
10561 ,p_installment_number => 0
10562 ,p_disb_header_id => null
10563 ,p_phase => l_current_phase
10564 ,x_fees_tbl => l_fee_tbl
10565 ,x_return_status => l_return_status
10566 ,x_msg_count => l_msg_count
10567 ,x_msg_data => l_msg_data);
10568
10569 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
10570 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_msg_data: ' || substr(l_msg_data,1,225));
10571 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
10572 FND_MESSAGE.SET_NAME('LNS', 'LNS_READ_FEE_ERROR');
10573 FND_MSG_PUB.ADD;
10574 RAISE FND_API.G_EXC_ERROR;
10575 end if;
10576
10577 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Toal No. of UnBilled SubmitApproval Fees are: ' || l_fee_tbl.count);
10578
10579 l_header_count := 101;
10580 l_BILL_HEADERS_TBL(1).HEADER_ID := l_header_count;
10581 l_BILL_HEADERS_TBL(1).LOAN_ID := P_LOAN_ID;
10582 l_BILL_HEADERS_TBL(1).ASSOC_PAYMENT_NUM := l_installment_num;
10583
10584 -- Bug#8898777
10585 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Loan Start Date is: ' ||l_loan_start_date);
10586 if ( l_loan_start_date < sysdate) then
10587 l_BILL_HEADERS_TBL(1).DUE_DATE := l_loan_start_date;
10588 else
10589 l_BILL_HEADERS_TBL(1).DUE_DATE := sysdate;
10590 end if;
10591
10592 l_Count1 := 0;
10593 l_tot_fee_amt := 0;
10594
10595 /* adding fee amounts into lines table */
10596 FOR l_Count IN 1..l_fee_tbl.count LOOP
10597
10598 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Fee #' || l_Count || ' Name: ' || l_fee_tbl(l_Count).FEE_NAME || ' Amount: ' || l_fee_tbl(l_Count).FEE_AMOUNT);
10599
10600 l_Count1 := l_Count1 + 1;
10601 l_BILL_LINES_TBL(l_Count1).LINE_ID := 100 + l_Count1;
10602 l_BILL_LINES_TBL(l_Count1).HEADER_ID := l_header_count;
10603 l_BILL_LINES_TBL(l_Count1).LINE_AMOUNT := l_fee_tbl(l_Count).FEE_AMOUNT;
10604 l_BILL_LINES_TBL(l_Count1).LINE_TYPE := 'FEE';
10605 l_BILL_LINES_TBL(l_Count1).LINE_REF_ID := l_fee_tbl(l_Count).FEE_ID;
10606 l_BILL_LINES_TBL(l_Count1).LINE_DESC := l_fee_tbl(l_Count).FEE_NAME;
10607 l_BILL_LINES_TBL(l_Count1).FEE_SCHEDULE_ID := l_fee_tbl(l_Count).FEE_SCHEDULE_ID;
10608 l_tot_fee_amt := l_tot_fee_amt + l_fee_tbl(l_Count).FEE_AMOUNT;
10609
10610 /* updating LNS_FEE_SCHEDULES with billed_flag = Y */
10611 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_FEE_SCHEDULES with billed_flag = Y ...');
10612 UPDATE LNS_FEE_SCHEDULES
10613 SET
10614 BILLED_FLAG = 'Y',
10615 last_update_date = LNS_UTILITY_PUB.LAST_UPDATE_DATE,
10616 last_updated_by = LNS_UTILITY_PUB.LAST_UPDATED_BY,
10617 last_update_login = LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
10618 WHERE
10619 FEE_SCHEDULE_ID = l_fee_tbl(l_Count).fee_schedule_id;
10620 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully update LNS_FEE_SCHEDULES');
10621
10622 END LOOP;
10623
10624 IF (l_tot_fee_amt = 0) THEN
10625 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'SubmitForApproval Fee Amount = 0. Nothing to bill.');
10626 return;
10627 END IF;
10628
10629 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Calling LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS...');
10630
10631 LNS_BILLING_BATCH_PUB.CREATE_OFFCYCLE_BILLS(
10632 P_API_VERSION => 1.0,
10633 P_INIT_MSG_LIST => FND_API.G_TRUE,
10634 P_COMMIT => FND_API.G_FALSE,
10635 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
10636 P_BILL_HEADERS_TBL => l_BILL_HEADERS_TBL,
10637 P_BILL_LINES_TBL => l_BILL_LINES_TBL,
10638 x_return_status => l_return_status,
10639 x_msg_count => l_msg_count,
10640 x_msg_data => l_msg_data);
10641
10642 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
10643
10644 if l_return_status <> 'S' then
10645 RAISE FND_API.G_EXC_ERROR;
10646 end if;
10647
10648 if P_COMMIT = FND_API.G_TRUE then
10649 COMMIT WORK;
10650 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
10651 end if;
10652
10653 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully billed At Submit For Approval Fee at 0-th installment for loan ' || l_loan_number);
10654
10655 -- END OF BODY OF API
10656 x_return_status := FND_API.G_RET_STS_SUCCESS;
10657 X_BILLED_YN := 'Y';
10658
10659 -- Standard call to get message count and if count is 1, get message info
10660 FND_MSG_PUB.Count_And_Get(
10661 p_encoded => FND_API.G_FALSE,
10662 p_count => x_msg_count,
10663 p_data => x_msg_data);
10664
10665 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10666
10667 EXCEPTION
10668 WHEN FND_API.G_EXC_ERROR THEN
10669 ROLLBACK TO BILL_SING_LOAN_SUBMIT_APPR_FEE;
10670 x_return_status := FND_API.G_RET_STS_ERROR;
10671 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10672 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10673 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10674 ROLLBACK TO BILL_SING_LOAN_SUBMIT_APPR_FEE;
10675 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10676 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10677 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10678 WHEN OTHERS THEN
10679 ROLLBACK TO BILL_SING_LOAN_SUBMIT_APPR_FEE;
10680 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10681 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
10682 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
10683 END IF;
10684 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
10685 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
10686 END;
10687
10688 PROCEDURE REVERSE_BILLED_FEES(p_amortization_id IN NUMBER)
10689 IS
10690 l_api_name CONSTANT VARCHAR2(30) := 'REVERSE_BILLED_FEES';
10691 l_fee_schedule_id LNS_FEE_SCHEDULES.fee_schedule_id%TYPE;
10692 l_obj_ver_num NUMBER;
10693 l_count NUMBER;
10694
10695 -- At present Reversing only SubmitForApproval Fees
10696 CURSOR c_billed_submitAppFee(c_amortization_id NUMBER) IS
10697 SELECT lines.fee_schedule_id, feeSchd.object_version_number
10698 FROM LNS_AMORTIZATION_SCHEDS scheds,lns_amortization_lines lines, lns_fees_all fee, lns_fee_schedules feeSchd
10699 WHERE scheds.amortization_schedule_id = lines.amortization_schedule_id
10700 AND scheds.amortization_schedule_id = C_AMORTIZATION_ID
10701 AND lines.line_type = 'FEE'
10702 AND fee.fee_id = lines.fee_id
10703 AND fee.billing_option = 'SUBMIT_FOR_APPROVAL'
10704 AND feeSchd.fee_schedule_id = lines.fee_schedule_id
10705 AND feeSchd.billed_flag = 'Y'
10706 AND feeSchd.active_flag = 'Y';
10707
10708 BEGIN
10709 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10710
10711 /* verify input parameters */
10712 if P_AMORTIZATION_ID is null then
10713 FND_MESSAGE.SET_NAME('LNS', 'LNS_MAN_REV_NO_AMORT');
10714 FND_MSG_PUB.Add;
10715 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10716 RAISE FND_API.G_EXC_ERROR;
10717 end if;
10718
10719
10720 l_count := 0;
10721 OPEN c_billed_submitAppFee(P_AMORTIZATION_ID);
10722 LOOP
10723 FETCH c_billed_submitAppFee into l_fee_schedule_id, l_obj_ver_num;
10724 EXIT WHEN c_billed_submitAppFee%NOTFOUND;
10725 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'The fee_schedule_id is '||l_fee_schedule_id);
10726
10727 LNS_FEE_SCHEDULES_PKG.UPDATE_ROW(P_FEE_SCHEDULE_ID => l_fee_schedule_id
10728 ,P_FEE_ID => null
10729 ,P_LOAN_ID => null
10730 ,P_FEE_AMOUNT => null
10731 ,P_FEE_INSTALLMENT => null
10732 ,P_FEE_DESCRIPTION => null
10733 ,P_ACTIVE_FLAG => null
10734 ,P_BILLED_FLAG => 'N' -- Make BilledFlag to 'N'
10735 ,P_FEE_WAIVABLE_FLAG => null
10736 ,P_WAIVED_AMOUNT => null
10737 ,P_LAST_UPDATED_BY => LNS_UTILITY_PUB.LAST_UPDATED_BY
10738 ,P_LAST_UPDATE_DATE => LNS_UTILITY_PUB.LAST_UPDATE_DATE
10739 ,P_LAST_UPDATE_LOGIN => LNS_UTILITY_PUB.LAST_UPDATE_LOGIN
10740 ,P_PROGRAM_ID => null
10741 ,P_REQUEST_ID => null
10742 ,P_OBJECT_VERSION_NUMBER => l_obj_ver_num + 1);
10743 l_count := l_count + 1;
10744 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Updated fee_schedule_id '||l_fee_schedule_id||' successfully');
10745
10746 END LOOP;
10747
10748 LogMessage(FND_LOG.LEVEL_PROCEDURE, 'Total No. of submitForApprFee fee_schedule records updated are '||l_count);
10749 CLOSE c_billed_submitAppFee;
10750
10751 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10752
10753 END REVERSE_BILLED_FEES;
10754
10755
10756 /*========================================================================
10757 | PUBLIC FUNCTION IS_BILLING_DISABLED
10758 |
10759 | DESCRIPTION
10760 | This function returns Y/N is loan is ready to bill or not
10761 |
10762 | PSEUDO CODE/LOGIC
10763 |
10764 | PARAMETERS
10765 | P_LOAN_ID IN Loan ID
10766 |
10767 | KNOWN ISSUES
10768 | None
10769 |
10770 | NOTES
10771 | Any interesting aspect of the code in the package body which needs
10772 | to be stated.
10773 |
10774 | MODIFICATION HISTORY
10775 | Date Author Description of Changes
10776 | 16-Nov-2009 MBOLLI Created for bug#9090782
10777 |
10778 *=======================================================================*/
10779 FUNCTION IS_BILLING_DISABLED(P_LOAN_ID IN NUMBER) return VARCHAR2 IS
10780
10781 /*-----------------------------------------------------------------------+
10782 | Local Variable Declarations and initializations |
10783 +-----------------------------------------------------------------------*/
10784
10785 l_api_name CONSTANT VARCHAR2(30) := 'IS_BILLING_DISABLED';
10786 l_return_status VARCHAR2(1);
10787 l_msg_count NUMBER;
10788 l_msg_data VARCHAR2(32767);
10789 l_return BOOLEAN;
10790 l_disable_bill_flag VARCHAR2(1);
10791
10792 /*-----------------------------------------------------------------------+
10793 | Cursor Declarations |
10794 +-----------------------------------------------------------------------*/
10795
10796 CURSOR cur_disable_bill(C_LOAN_ID NUMBER) IS
10797 SELECT head.DISABLE_BILLING_FLAG
10798 FROM LNS_LOAN_HEADERS_ALL head
10799 where head.loan_id = C_LOAN_ID;
10800 BEGIN
10801
10802 --LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10803
10804 -- START OF BODY OF API
10805 --init;
10806
10807 --LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input loan_id = ' || P_LOAN_ID);
10808 --l_disable_bill_flag := 'N';
10809
10810 /* verify input parameters */
10811 if P_LOAN_ID is null then
10812
10813 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_LOAN');
10814 FND_MSG_PUB.Add;
10815 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10816 RAISE FND_API.G_EXC_ERROR;
10817
10818 end if;
10819
10820 -- LogMessage(FND_LOG.LEVEL_STATEMENT, 'Getting loan details...');
10821 open cur_disable_bill(P_LOAN_ID);
10822 fetch cur_disable_bill into l_disable_bill_flag;
10823 if l_disable_bill_flag IS NULL then
10824 l_disable_bill_flag := 'N';
10825 end if;
10826 close cur_disable_bill;
10827
10828 --LogMessage(FND_LOG.LEVEL_STATEMENT, 'DISABLE_FLAG = ' || l_disable_bill_flag);
10829
10830 -- LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
10831
10832 return l_disable_bill_flag;
10833
10834 EXCEPTION
10835 WHEN OTHERS THEN
10836 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'In exception of ' || l_api_name);
10837 l_disable_bill_flag := NULL;
10838 return l_disable_bill_flag;
10839 END;
10840
10841
10842
10843 /*========================================================================
10844 | PUBLIC PROCEDURE ADJUST_ADD_RECEIVABLE
10845 |
10846 | DESCRIPTION
10847 | This procedure adjusts loans additional receivable in AR
10848 |
10849 | CALLED FROM PROCEDURES/FUNCTIONS (local to this package body)
10850 | None
10851 |
10852 | CALLS PROCEDURES/FUNCTIONS (local to this package body)
10853 | init
10854 | LogMessage
10855 |
10856 | PARAMETERS
10857 | P_API_VERSION IN Standard in parameter
10858 | P_INIT_MSG_LIST IN Standard in parameter
10859 | P_COMMIT IN Standard in parameter
10860 | P_VALIDATION_LEVEL IN Standard in parameter
10861 | P_LOAN_LINE_ID IN Loan Line ID
10862 | X_RETURN_STATUS OUT NOCOPY Standard out parameter
10863 | X_MSG_COUNT OUT NOCOPY Standard out parameter
10864 | X_MSG_DATA OUT NOCOPY Standard out parameter
10865 |
10866 | KNOWN ISSUES
10867 | None
10868 |
10869 | NOTES
10870 | Any interesting aspect of the code in the package body which needs
10871 | to be stated.
10872 |
10873 | MODIFICATION HISTORY
10874 | Date Author Description of Changes
10875 | 03-05-2010 scherkas Created
10876 |
10877 *=======================================================================*/
10878 PROCEDURE ADJUST_ADD_RECEIVABLE(
10879 P_API_VERSION IN NUMBER,
10880 P_INIT_MSG_LIST IN VARCHAR2,
10881 P_COMMIT IN VARCHAR2,
10882 P_VALIDATION_LEVEL IN NUMBER,
10883 P_LOAN_LINE_ID IN NUMBER,
10884 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
10885 X_MSG_COUNT OUT NOCOPY NUMBER,
10886 X_MSG_DATA OUT NOCOPY VARCHAR2)
10887 IS
10888
10889 /*-----------------------------------------------------------------------+
10890 | Local Variable Declarations and initializations |
10891 +-----------------------------------------------------------------------*/
10892
10893 l_api_name CONSTANT VARCHAR2(30) := 'ADJUST_ADD_RECEIVABLE';
10894 l_api_version CONSTANT NUMBER := 1.0;
10895 l_return_status VARCHAR2(1);
10896 l_msg_count NUMBER;
10897 l_msg_data VARCHAR2(32767);
10898 l_loan_number varchar2(60);
10899 l_trx_number varchar2(20);
10900 l_payment_schedule_id number;
10901 l_amount_due_remaining number;
10902 l_type varchar2(15);
10903 l_loan_desc varchar2(250);
10904 l_comments varchar2(2000);
10905 l_adj_number varchar2(20);
10906 l_adj_id number;
10907 l_ussgl_flag varchar2(3);
10908 l_requested_amount number;
10909 l_line_id number;
10910 l_apply_date date;
10911 l_gl_date date;
10912 l_org_id number;
10913 l_legal_entity_id number;
10914 l_installment_number number;
10915 l_loan_id number;
10916
10917 /*-----------------------------------------------------------------------+
10918 | Cursor Declarations |
10919 +-----------------------------------------------------------------------*/
10920
10921 /* querying trx, psa and loan details */
10922 CURSOR add_rec_cur(P_LOAN_LINE_ID number) IS
10923 select
10924 loan.loan_id,
10925 loan.loan_number,
10926 loan.LOAN_DESCRIPTION,
10927 lines.REQUESTED_AMOUNT,
10928 lines.reference_number,
10929 lines.REC_ADJUSTMENT_NUMBER,
10930 nvl(lines.payment_schedule_id, psa.payment_schedule_id),
10931 psa.AMOUNT_DUE_REMAINING,
10932 lines.LOAN_LINE_ID,
10933 lines.ADJUSTMENT_DATE,
10934 psa.GL_DATE,
10935 trx.org_id,
10936 trx.legal_entity_id,
10937 lines.REC_ADJUSTMENT_ID,
10938 nvl(lines.installment_number, 1)
10939 from LNS_LOAN_HEADERS_VL loan,
10940 RA_CUSTOMER_TRX trx,
10941 ar_payment_schedules psa,
10942 lns_loan_lines lines
10943 where lines.LOAN_LINE_ID = P_LOAN_LINE_ID and
10944 loan.loan_id = lines.loan_id and
10945 lines.reference_type = 'RECEIVABLE' and
10946 lines.REFERENCE_ID = trx.CUSTOMER_TRX_ID and
10947 lines.REFERENCE_NUMBER = trx.trx_number and
10948 lines.end_date is null and
10949 trx.CUSTOMER_TRX_ID = psa.CUSTOMER_TRX_ID and
10950 nvl(lines.installment_number, 1) = psa.terms_sequence_number;
10951
10952 BEGIN
10953
10954 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' +');
10955
10956 -- Standard start of API savepoint
10957 SAVEPOINT ADJUST_ADD_RECEIVABLE;
10958 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Savepoint is established');
10959
10960 -- Standard call to check for call compatibility
10961 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
10962 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10963 END IF;
10964
10965 -- Initialize message list if p_init_msg_list is set to TRUE
10966 IF FND_API.To_Boolean(p_init_msg_list) THEN
10967 FND_MSG_PUB.initialize;
10968 END IF;
10969
10970 -- Initialize API return status to success
10971 l_return_status := FND_API.G_RET_STS_SUCCESS;
10972
10973 -- START OF BODY OF API
10974
10975 init;
10976
10977 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Input P_LOAN_LINE_ID = ' || P_LOAN_LINE_ID);
10978
10979 /* verify input parameters */
10980 if P_LOAN_LINE_ID is null then
10981
10982 FND_MESSAGE.SET_NAME( 'LNS', 'LNS_API_MISSING_COLUMN' );
10983 FND_MESSAGE.SET_TOKEN( 'COLUMN', 'P_LOAN_LINE_ID' );
10984 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10985 RAISE FND_API.G_EXC_ERROR;
10986
10987 end if;
10988
10989 /* checking for system options values required for adjustment */
10990 if g_receivables_trx_id is null then
10991 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Receivables activity name is not set in the system option.');
10992 FND_MESSAGE.SET_NAME('LNS', 'LNS_NO_REC_TRX_IN_SYS_OPT');
10993 FND_MSG_PUB.Add;
10994 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
10995 RAISE FND_API.G_EXC_ERROR;
10996
10997 end if;
10998
10999 /* querying trx, psa, loan and loan lines details */
11000 open add_rec_cur(P_LOAN_LINE_ID);
11001 fetch add_rec_cur into
11002 l_loan_id,
11003 l_loan_number,
11004 l_loan_desc,
11005 l_requested_amount,
11006 l_trx_number,
11007 l_adj_number,
11008 l_payment_schedule_id,
11009 l_amount_due_remaining,
11010 l_line_id,
11011 l_apply_date,
11012 l_gl_date,
11013 l_org_id,
11014 l_legal_entity_id,
11015 l_adj_id,
11016 l_installment_number;
11017 close add_rec_cur;
11018
11019 if l_payment_schedule_id is null then
11020 FND_MESSAGE.SET_NAME('LNS', 'LNS_CANT_FIND_ORIG_REC');
11021 FND_MSG_PUB.Add;
11022 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
11023 RAISE FND_API.G_EXC_ERROR;
11024 end if;
11025
11026 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjusting additional receivable ' || l_trx_number || 'for loan ' || l_loan_number || '...');
11027
11028 /* verify adjust amount and set adjustment type */
11029 if l_requested_amount > l_amount_due_remaining then
11030 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Adjust amount cannot be greater than receivable remaining amount.');
11031 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount: -' || l_requested_amount);
11032 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount: ' || l_amount_due_remaining);
11033 FND_MESSAGE.SET_NAME('LNS', 'LNS_INVALID_ADJ_AMT');
11034 FND_MSG_PUB.Add;
11035 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
11036 RAISE FND_API.G_EXC_ERROR;
11037 else
11038 l_type := 'LINE';
11039 end if;
11040
11041 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Adjustment amount = -' || l_requested_amount);
11042 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Receivable remaining amount = ' || l_amount_due_remaining);
11043
11044 /* checking if adjustment for this loan already was made */
11045 if l_adj_number is not null or l_adj_id is not null then
11046 -- LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'ERROR: Attempt to duplicate adjustment. Receivable has been already adjusted for this loan by adjustment xxx' );
11047 FND_MESSAGE.SET_NAME('LNS', 'LNS_DUPL_ADJ_ORIG_REC');
11048 FND_MESSAGE.SET_TOKEN('ADJ', l_adj_number);
11049 FND_MSG_PUB.Add;
11050 LogMessage(FND_LOG.LEVEL_UNEXPECTED, FND_MSG_PUB.Get(p_encoded => 'F'));
11051 RAISE FND_API.G_EXC_ERROR;
11052 end if;
11053
11054 /* buld comments */
11055 l_comments := 'Loan ' || l_loan_number;
11056
11057 /* do adjustment */
11058 CREATE_AR_ADJ(P_TYPE => l_type,
11059 P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id,
11060 P_RECEIVABLES_TRX_ID => g_receivables_trx_id,
11061 P_AMOUNT => -l_requested_amount,
11062 P_APPLY_DATE => l_apply_date,
11063 P_GL_DATE => l_apply_date,
11064 P_CUSTOMER_TRX_LINE_ID => null,
11065 P_CODE_COMBINATION_ID => null,
11066 P_USSGL_TRX_CODE => g_USSGL_TRANSACTION_CODE,
11067 P_REASON_CODE => 'LOAN_CONV',
11068 P_COMMENTS => l_comments,
11069 X_ADJ_ID => l_adj_id,
11070 X_ADJ_NUMBER => l_adj_number,
11071 P_ORG_ID => l_org_id);
11072
11073 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Updating LNS_LOAN_LINES...');
11074 LNS_LOAN_LINE_PUB.UPDATE_LINE_ADJUSTMENT_NUMBER(
11075 p_init_msg_list => FND_API.G_FALSE
11076 ,p_loan_id => l_loan_id
11077 ,p_loan_line_id => l_line_id
11078 ,p_rec_adjustment_number => l_adj_number
11079 ,p_rec_adjustment_id => l_adj_id
11080 ,P_PAYMENT_SCHEDULE_ID => l_payment_schedule_id
11081 ,P_INSTALLMENT_NUMBER => l_installment_number
11082 ,p_adjustment_date => l_apply_date
11083 ,p_original_flag => 'N'
11084 ,x_return_status => l_return_status
11085 ,x_msg_count => l_msg_count
11086 ,x_msg_data => l_msg_data);
11087
11088 LogMessage(FND_LOG.LEVEL_STATEMENT, 'l_return_status: ' || l_return_status);
11089 IF l_return_status = 'S' THEN
11090 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Successfully updated LNS_LOAN_LINES');
11091 ELSE
11092 RAISE FND_API.G_EXC_ERROR;
11093 END IF;
11094 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Successfully created adjustment ' || l_adj_number || ' for additional receivable ' || l_trx_number);
11095
11096 if P_COMMIT = FND_API.G_TRUE then
11097 COMMIT WORK;
11098 LogMessage(FND_LOG.LEVEL_STATEMENT, 'Commited');
11099 end if;
11100
11101 -- END OF BODY OF API
11102 x_return_status := FND_API.G_RET_STS_SUCCESS;
11103
11104 -- Standard call to get message count and if count is 1, get message info
11105 FND_MSG_PUB.Count_And_Get(
11106 p_encoded => FND_API.G_FALSE,
11107 p_count => x_msg_count,
11108 p_data => x_msg_data);
11109
11110 LogMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME || '.' || l_api_name || ' -');
11111
11112 EXCEPTION
11113 WHEN FND_API.G_EXC_ERROR THEN
11114 ROLLBACK TO ADJUST_ADD_RECEIVABLE;
11115 x_return_status := FND_API.G_RET_STS_ERROR;
11116 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
11117 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
11118 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
11119 ROLLBACK TO ADJUST_ADD_RECEIVABLE;
11120 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11121 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
11122 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
11123 WHEN OTHERS THEN
11124 ROLLBACK TO ADJUST_ADD_RECEIVABLE;
11125 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11126 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)THEN
11127 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
11128 END IF;
11129 FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
11130 LogMessage(FND_LOG.LEVEL_UNEXPECTED, 'Rollbacked');
11131 END;
11132
11133
11134
11135 BEGIN
11136 G_LOG_ENABLED := 'N';
11137 G_MSG_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
11138
11139 /* getting msg logging info */
11140 G_LOG_ENABLED := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'), 'N');
11141 /*
11142 if (G_LOG_ENABLED = 'N') then
11143 G_MSG_LEVEL := FND_LOG.LEVEL_UNEXPECTED;
11144 else
11145 G_MSG_LEVEL := NVL(to_number(FND_PROFILE.VALUE('AFLOG_LEVEL')), FND_LOG.LEVEL_UNEXPECTED);
11146 end if;
11147 */
11148 LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_LOG_ENABLED: ' || G_LOG_ENABLED);
11149 LogMessage(FND_LOG.LEVEL_STATEMENT, 'G_MSG_LEVEL: ' || G_MSG_LEVEL);
11150
11151 END;
11152