1: PACKAGE BODY LNS_CUSTOM_PUB AS
2: /* $Header: LNS_CUST_PUBP_B.pls 120.2.12010000.4 2009/01/21 20:22:42 scherkas ship $ */
3: G_DEBUG_COUNT CONSTANT NUMBER := 0;
4: G_DEBUG CONSTANT BOOLEAN := FALSE;
5:
2: /* $Header: LNS_CUST_PUBP_B.pls 120.2.12010000.4 2009/01/21 20:22:42 scherkas ship $ */
3: G_DEBUG_COUNT CONSTANT NUMBER := 0;
4: G_DEBUG CONSTANT BOOLEAN := FALSE;
5:
6: G_PKG_NAME CONSTANT VARCHAR2(30) := 'LNS_CUSTOM_PUB';
7:
8:
9: ---------------------------------------------------------------------------
10: -- internal package routines
29:
30: /* this funciton will ensure the rows in the custom tbl are ordered by payment number
31: || will NOT validate that payment numbers are unique. this should be done prior to sorting
32: */
33: procedure sortRows(p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl)
34:
35: is
36: l_return_tbl LNS_CUSTOM_PUB.custom_tbl;
37: j number;
32: */
33: procedure sortRows(p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl)
34:
35: is
36: l_return_tbl LNS_CUSTOM_PUB.custom_tbl;
37: j number;
38: l_tmp_row lns_custom_pub.custom_sched_type;
39: l_number number;
40: l_min number;
34:
35: is
36: l_return_tbl LNS_CUSTOM_PUB.custom_tbl;
37: j number;
38: l_tmp_row lns_custom_pub.custom_sched_type;
39: l_number number;
40: l_min number;
41: l_tmp number;
42:
283:
284: l_loan_header_rec LNS_LOAN_HEADER_PUB.loan_header_rec_type;
285: l_object_version number;
286: g_object_version number;
287: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
288: l_api_name varchar2(25);
289: l_loan_start_date date;
290: l_original_loan_amount number;
291: l_fee_amount number;
339: l_custom_tbl(m) := p_custom_tbl(j);
340: end if;
341: end loop;
342:
343: lns_custom_pub.validateCustomTable(p_cust_tbl => l_custom_tbl
344: ,p_loan_id => p_loan_id
345: ,p_create_flag => true
346: ,x_installment => l_installment
347: ,x_return_status => l_return_status
485: l_custom_tbl(k + 1).installment_begin_balance := l_custom_rec.installment_end_balance;
486: end if;
487:
488: -- call api to update rows one-by-one for compliance reasons
489: lns_custom_pub.createCustomSched(P_CUSTOM_REC => l_custom_rec
490: ,x_return_status => l_return_status
491: ,x_custom_sched_id => l_custom_sched_id
492: ,x_msg_count => l_msg_Count
493: ,x_msg_data => l_msg_Data);
600: l_return_Status VARCHAR2(1);
601: l_installment NUMBER;
602: l_custom_rec custom_sched_type;
603: l_total_amount NUMBER;
604: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
605: l_custom_tbl2 LNS_CUSTOM_PUB.CUSTOM_TBL;
606:
607: l_api_name varchar2(25);
608:
601: l_installment NUMBER;
602: l_custom_rec custom_sched_type;
603: l_total_amount NUMBER;
604: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
605: l_custom_tbl2 LNS_CUSTOM_PUB.CUSTOM_TBL;
606:
607: l_api_name varchar2(25);
608:
609:
667:
668: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' - after clean up records');
669: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' - num records is '|| l_custom_tbl.count);
670:
671: lns_custom_pub.validateCustomTable(p_cust_tbl => l_custom_tbl
672: ,p_loan_id => p_loan_id
673: ,p_create_flag => false
674: ,x_installment => l_installment
675: ,x_return_status => l_return_status
727: l_custom_tbl(k+1).installment_begin_balance := l_custom_rec.installment_end_balance;
728: end if;
729:
730: -- call api to update rows one-by-one for compliance reasons
731: lns_custom_pub.updateCustomSched(P_CUSTOM_REC => l_custom_rec
732: ,x_return_status => l_return_status
733: ,x_msg_count => l_msg_Count
734: ,x_msg_data => l_msg_Data);
735:
1152: /*
1153: This funciton will ensure the rows in the custom tbl are ordered by due date.
1154: Will validate that due dates are unique
1155: */
1156: procedure sortRowsByDate(p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl)
1157:
1158: is
1159: l_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1160: i number;
1155: */
1156: procedure sortRowsByDate(p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl)
1157:
1158: is
1159: l_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1160: i number;
1161: j number;
1162: l_temp LNS_CUSTOM_PUB.custom_sched_type;
1163:
1158: is
1159: l_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1160: i number;
1161: j number;
1162: l_temp LNS_CUSTOM_PUB.custom_sched_type;
1163:
1164: begin
1165: l_custom_tbl := p_custom_tbl;
1166:
1191:
1192: /*
1193: This procedure will filter the custom tbl from deleted rows
1194: */
1195: procedure filterCustSchedule(p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl)
1196:
1197: is
1198: l_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1199: l_new_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1194: */
1195: procedure filterCustSchedule(p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl)
1196:
1197: is
1198: l_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1199: l_new_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1200: i number;
1201: j number;
1202:
1195: procedure filterCustSchedule(p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl)
1196:
1197: is
1198: l_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1199: l_new_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
1200: i number;
1201: j number;
1202:
1203: begin
1416:
1417:
1418:
1419: function getLoanDetails(p_loan_id in number
1420: ,p_based_on_terms in varchar2) return LNS_CUSTOM_PUB.LOAN_DETAILS_REC
1421:
1422: is
1423:
1424: /*-----------------------------------------------------------------------+
1425: | Local Variable Declarations and initializations |
1426: +-----------------------------------------------------------------------*/
1427:
1428: l_api_name CONSTANT VARCHAR2(30) := 'getLoanDetails';
1429: l_loan_Details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
1430: l_billed_principal number;
1431:
1432: /*-----------------------------------------------------------------------+
1433: | Cursor Declarations |
1631: P_VALIDATION_LEVEL IN NUMBER,
1632: P_LOAN_ID IN NUMBER,
1633: P_BASED_ON_TERMS IN VARCHAR2,
1634: X_AMORT_METHOD OUT NOCOPY VARCHAR2,
1635: X_CUSTOM_TBL OUT NOCOPY LNS_CUSTOM_PUB.CUSTOM_TBL,
1636: X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1637: X_MSG_COUNT OUT NOCOPY NUMBER,
1638: X_MSG_DATA OUT NOCOPY VARCHAR2)
1639: IS
1647: l_return_status VARCHAR2(1);
1648: l_msg_count NUMBER;
1649: l_msg_data VARCHAR2(32767);
1650:
1651: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
1652: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
1653: l_temp_row LNS_CUSTOM_PUB.custom_sched_type;
1654: l_amort_tbl LNS_FINANCIALS.AMORTIZATION_TBL;
1655: i number;
1648: l_msg_count NUMBER;
1649: l_msg_data VARCHAR2(32767);
1650:
1651: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
1652: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
1653: l_temp_row LNS_CUSTOM_PUB.custom_sched_type;
1654: l_amort_tbl LNS_FINANCIALS.AMORTIZATION_TBL;
1655: i number;
1656: j number;
1649: l_msg_data VARCHAR2(32767);
1650:
1651: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
1652: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
1653: l_temp_row LNS_CUSTOM_PUB.custom_sched_type;
1654: l_amort_tbl LNS_FINANCIALS.AMORTIZATION_TBL;
1655: i number;
1656: j number;
1657:
1822:
1823: end if;
1824:
1825: LogMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'Recalculating schedule...');
1826: LNS_CUSTOM_PUB.recalcCustomSchedule(
1827: P_API_VERSION => 1.0,
1828: P_INIT_MSG_LIST => FND_API.G_TRUE,
1829: P_COMMIT => FND_API.G_FALSE,
1830: P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
1890: P_VALIDATION_LEVEL IN NUMBER,
1891: P_LOAN_ID IN NUMBER,
1892: P_AMORT_METHOD IN VARCHAR2,
1893: P_BASED_ON_TERMS IN VARCHAR2,
1894: P_CUSTOM_TBL IN OUT NOCOPY LNS_CUSTOM_PUB.CUSTOM_TBL,
1895: X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1896: X_MSG_COUNT OUT NOCOPY NUMBER,
1897: X_MSG_DATA OUT NOCOPY VARCHAR2)
1898: IS
1906: l_return_status VARCHAR2(1);
1907: l_msg_count NUMBER;
1908: l_msg_data VARCHAR2(32767);
1909:
1910: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
1911: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
1912: l_temp_row LNS_CUSTOM_PUB.custom_sched_type;
1913: l_rate_tbl LNS_FINANCIALS.RATE_SCHEDULE_TBL;
1914: l_rate_details LNS_FINANCIALS.INTEREST_RATE_REC;
1907: l_msg_count NUMBER;
1908: l_msg_data VARCHAR2(32767);
1909:
1910: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
1911: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
1912: l_temp_row LNS_CUSTOM_PUB.custom_sched_type;
1913: l_rate_tbl LNS_FINANCIALS.RATE_SCHEDULE_TBL;
1914: l_rate_details LNS_FINANCIALS.INTEREST_RATE_REC;
1915:
1908: l_msg_data VARCHAR2(32767);
1909:
1910: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
1911: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
1912: l_temp_row LNS_CUSTOM_PUB.custom_sched_type;
1913: l_rate_tbl LNS_FINANCIALS.RATE_SCHEDULE_TBL;
1914: l_rate_details LNS_FINANCIALS.INTEREST_RATE_REC;
1915:
1916: l_compound_freq varchar2(30);
2810: P_VALIDATION_LEVEL IN NUMBER,
2811: P_LOAN_ID IN NUMBER,
2812: P_AMORT_METHOD IN VARCHAR2,
2813: P_BASED_ON_TERMS IN VARCHAR2,
2814: P_CUSTOM_TBL IN OUT NOCOPY LNS_CUSTOM_PUB.CUSTOM_TBL,
2815: X_RETURN_STATUS OUT NOCOPY VARCHAR2,
2816: X_MSG_COUNT OUT NOCOPY NUMBER,
2817: X_MSG_DATA OUT NOCOPY VARCHAR2)
2818: IS
2826: l_return_status VARCHAR2(1);
2827: l_msg_count NUMBER;
2828: l_msg_data VARCHAR2(32767);
2829:
2830: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
2831: l_CUSTOM_TBL LNS_CUSTOM_PUB.CUSTOM_TBL;
2832: l_custom_rec LNS_CUSTOM_PUB.custom_sched_type;
2833: l_loan_header_rec LNS_LOAN_HEADER_PUB.LOAN_HEADER_REC_TYPE;
2834: l_term_rec LNS_TERMS_PUB.loan_term_rec_type;
2827: l_msg_count NUMBER;
2828: l_msg_data VARCHAR2(32767);
2829:
2830: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
2831: l_CUSTOM_TBL LNS_CUSTOM_PUB.CUSTOM_TBL;
2832: l_custom_rec LNS_CUSTOM_PUB.custom_sched_type;
2833: l_loan_header_rec LNS_LOAN_HEADER_PUB.LOAN_HEADER_REC_TYPE;
2834: l_term_rec LNS_TERMS_PUB.loan_term_rec_type;
2835:
2828: l_msg_data VARCHAR2(32767);
2829:
2830: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
2831: l_CUSTOM_TBL LNS_CUSTOM_PUB.CUSTOM_TBL;
2832: l_custom_rec LNS_CUSTOM_PUB.custom_sched_type;
2833: l_loan_header_rec LNS_LOAN_HEADER_PUB.LOAN_HEADER_REC_TYPE;
2834: l_term_rec LNS_TERMS_PUB.loan_term_rec_type;
2835:
2836: l_custom_sched_id number;
2896: end if;
2897:
2898: l_CUSTOM_TBL := P_CUSTOM_TBL;
2899:
2900: LNS_CUSTOM_PUB.recalcCustomSchedule(
2901: P_API_VERSION => 1.0,
2902: P_INIT_MSG_LIST => FND_API.G_TRUE,
2903: P_COMMIT => FND_API.G_FALSE,
2904: P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
2938: CUSTOM_SCHEDULE_ID = l_custom_tbl(i).CUSTOM_SCHEDULE_ID;
2939:
2940:
2941: -- call api to update rows one-by-one for compliance reasons
2942: lns_custom_pub.updateCustomSched(P_CUSTOM_REC => l_custom_rec
2943: ,x_return_status => l_return_status
2944: ,x_msg_count => l_msg_Count
2945: ,x_msg_data => l_msg_Data);
2946:
2950:
2951: elsif l_custom_tbl(i).ACTION = 'I' then
2952:
2953: -- call api to update rows one-by-one for compliance reasons
2954: lns_custom_pub.createCustomSched(P_CUSTOM_REC => l_custom_rec
2955: ,x_return_status => l_return_status
2956: ,x_custom_sched_id => l_custom_sched_id
2957: ,x_msg_count => l_msg_Count
2958: ,x_msg_data => l_msg_Data);
3120: l_return_status VARCHAR2(1);
3121: l_msg_count NUMBER;
3122: l_msg_data VARCHAR2(32767);
3123:
3124: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
3125: l_loan_header_rec LNS_LOAN_HEADER_PUB.LOAN_HEADER_REC_TYPE;
3126: l_term_rec LNS_TERMS_PUB.loan_term_rec_type;
3127:
3128: l_object_version number;
3311: l_return_status VARCHAR2(1);
3312: l_msg_count NUMBER;
3313: l_msg_data VARCHAR2(32767);
3314:
3315: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
3316: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
3317: l_AMORT_METHOD varchar2(30);
3318: l_BASED_ON_TERMS varchar2(30);
3319:
3312: l_msg_count NUMBER;
3313: l_msg_data VARCHAR2(32767);
3314:
3315: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
3316: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
3317: l_AMORT_METHOD varchar2(30);
3318: l_BASED_ON_TERMS varchar2(30);
3319:
3320: /*-----------------------------------------------------------------------+
3362: -- allow to save initial custom schedule only if this loan is in INCOMPLETE status and is not customized yet
3363: if l_loan_details.loan_status = 'INCOMPLETE' and l_loan_details.CUSTOM_SCHEDULE = 'N' then
3364:
3365: -- load initial schedule
3366: LNS_CUSTOM_PUB.loadCustomSchedule(
3367: P_API_VERSION => 1.0,
3368: P_INIT_MSG_LIST => FND_API.G_TRUE,
3369: P_COMMIT => FND_API.G_FALSE,
3370: P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
3380: RAISE FND_API.G_EXC_ERROR;
3381: END IF;
3382:
3383: -- immediatly save it
3384: LNS_CUSTOM_PUB.saveCustomSchedule(
3385: P_API_VERSION => 1.0,
3386: P_INIT_MSG_LIST => FND_API.G_TRUE,
3387: P_COMMIT => FND_API.G_FALSE,
3388: P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
3445: Return 1 - success; 0 - failed
3446: */
3447: function shiftRowsByDate(P_OLD_DUE_DATE IN DATE,
3448: P_NEW_DUE_DATE IN DATE,
3449: p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl) return NUMBER
3450: is
3451: l_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
3452: i number;
3453: l_found boolean;
3447: function shiftRowsByDate(P_OLD_DUE_DATE IN DATE,
3448: P_NEW_DUE_DATE IN DATE,
3449: p_custom_tbl in out nocopy LNS_CUSTOM_PUB.custom_tbl) return NUMBER
3450: is
3451: l_custom_tbl LNS_CUSTOM_PUB.custom_tbl;
3452: i number;
3453: l_found boolean;
3454: l_shift_from_row number;
3455: l_month_diff number;
3532: P_OLD_DUE_DATE IN DATE,
3533: P_NEW_DUE_DATE IN DATE,
3534: P_AMORT_METHOD IN VARCHAR2,
3535: P_BASED_ON_TERMS IN VARCHAR2,
3536: P_CUSTOM_TBL IN OUT NOCOPY LNS_CUSTOM_PUB.CUSTOM_TBL,
3537: X_RETURN_STATUS OUT NOCOPY VARCHAR2,
3538: X_MSG_COUNT OUT NOCOPY NUMBER,
3539: X_MSG_DATA OUT NOCOPY VARCHAR2)
3540: IS
3548: l_return_status VARCHAR2(1);
3549: l_msg_count NUMBER;
3550: l_msg_data VARCHAR2(32767);
3551:
3552: l_custom_tbl LNS_CUSTOM_PUB.CUSTOM_TBL;
3553: l_return number;
3554:
3555: /*-----------------------------------------------------------------------+
3556: | Cursor Declarations |
3636: if l_return = 0 then
3637: return;
3638: end if;
3639:
3640: LNS_CUSTOM_PUB.recalcCustomSchedule(
3641: P_API_VERSION => 1.0,
3642: P_INIT_MSG_LIST => FND_API.G_TRUE,
3643: P_COMMIT => FND_API.G_FALSE,
3644: P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL,
3714: l_return_status VARCHAR2(1);
3715: l_msg_count NUMBER;
3716: l_msg_data VARCHAR2(32767);
3717:
3718: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
3719: l_loan_header_rec LNS_LOAN_HEADER_PUB.LOAN_HEADER_REC_TYPE;
3720: l_term_rec LNS_TERMS_PUB.loan_term_rec_type;
3721:
3722: l_object_version number;
3830: +-----------------------------------------------------------------------*/
3831:
3832: l_api_name CONSTANT VARCHAR2(30) := 'buildCustomPaySchedule';
3833: l_payment_schedule LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
3834: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
3835: l_due_date date;
3836: l_payment_number number;
3837: i number;
3838:
3939: P_API_VERSION IN NUMBER,
3940: P_INIT_MSG_LIST IN VARCHAR2,
3941: P_COMMIT IN VARCHAR2,
3942: P_VALIDATION_LEVEL IN NUMBER,
3943: P_INSTALLMENT_REC IN LNS_CUSTOM_PUB.custom_sched_type,
3944: X_RETURN_STATUS OUT NOCOPY VARCHAR2,
3945: X_MSG_COUNT OUT NOCOPY NUMBER,
3946: X_MSG_DATA OUT NOCOPY VARCHAR2)
3947: IS
3955: l_return_status VARCHAR2(1);
3956: l_msg_count NUMBER;
3957: l_msg_data VARCHAR2(32767);
3958:
3959: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
3960: l_custom_sched_id NUMBER;
3961: l_INSTALLMENT_REC LNS_CUSTOM_PUB.custom_sched_type;
3962:
3963: /*-----------------------------------------------------------------------+
3957: l_msg_data VARCHAR2(32767);
3958:
3959: l_loan_details LNS_CUSTOM_PUB.LOAN_DETAILS_REC;
3960: l_custom_sched_id NUMBER;
3961: l_INSTALLMENT_REC LNS_CUSTOM_PUB.custom_sched_type;
3962:
3963: /*-----------------------------------------------------------------------+
3964: | Cursor Declarations |
3965: +-----------------------------------------------------------------------*/
4074: l_INSTALLMENT_REC.LOCK_INT := 'Y';
4075: end if;
4076:
4077: -- call api to insert new row
4078: lns_custom_pub.createCustomSched(P_CUSTOM_REC => l_INSTALLMENT_REC
4079: ,x_return_status => l_return_status
4080: ,x_custom_sched_id => l_custom_sched_id
4081: ,x_msg_count => l_msg_Count
4082: ,x_msg_data => l_msg_Data);
4125: LogMessage(FND_LOG.LEVEL_UNEXPECTED, G_PKG_NAME, 'Rollbacked');
4126: END;
4127:
4128:
4129: END LNS_CUSTOM_PUB;
4130: