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