1: PACKAGE BODY LNS_FIN_UTILS AS
2: /* $Header: LNS_FIN_UTILS_B.pls 120.25.12020000.3 2013/02/11 14:40:03 scherkas ship $ */
3:
4: --------------------------------------------
5: -- declaration of global variables and types
1: PACKAGE BODY LNS_FIN_UTILS AS
2: /* $Header: LNS_FIN_UTILS_B.pls 120.25.12020000.3 2013/02/11 14:40:03 scherkas ship $ */
3:
4: --------------------------------------------
5: -- declaration of global variables and types
6: --------------------------------------------
5: -- declaration of global variables and types
6: --------------------------------------------
7: G_DEBUG_COUNT NUMBER := 0;
8: G_DEBUG BOOLEAN := FALSE;
9: G_FILE_NAME CONSTANT VARCHAR2(30) := 'LNS_FIN_UTILS_B.pls';
10:
11: G_PKG_NAME CONSTANT VARCHAR2(30) := 'LNS_FIN_UTILS';
12: G_DAYS_COUNT NUMBER;
13: G_DAYS_IN_YEAR NUMBER;
7: G_DEBUG_COUNT NUMBER := 0;
8: G_DEBUG BOOLEAN := FALSE;
9: G_FILE_NAME CONSTANT VARCHAR2(30) := 'LNS_FIN_UTILS_B.pls';
10:
11: G_PKG_NAME CONSTANT VARCHAR2(30) := 'LNS_FIN_UTILS';
12: G_DAYS_COUNT NUMBER;
13: G_DAYS_IN_YEAR NUMBER;
14:
15: --------------------------------------------
255: l_year2 := to_number(to_char(p_end_date, 'YYYY'));
256:
257: if p_day_count_method = 'ACTUAL_ACTUAL' then
258: l_day_Count := to_number(TO_CHAR(p_end_date, 'J')) - to_number(TO_CHAR(p_start_date, 'J'));
259: --l_day_count := LNS_FIN_UTILS.Julian_date(p_end_date) - LNS_FIN_UTILS.Julian_date(p_start_date);
260:
261: elsif p_day_count_method = '30/360' then
262:
263: -- begin bug fix 6498179; scherkas; 10/12/2007;
261: elsif p_day_count_method = '30/360' then
262:
263: -- begin bug fix 6498179; scherkas; 10/12/2007;
264: if l_month1 = 2 then
265: if not LNS_FIN_UTILS.isLeapYear(l_year1) then
266: if l_day1 = 28 then
267: l_day1 := 30;
268: if l_day2 = 28 or l_day2 = 29 then
269: l_day2 := 30;
283: end if;
284: end if;
285:
286: if l_month2 = 2 then
287: if not LNS_FIN_UTILS.isLeapYear(l_year2) then
288: if l_day2 = 28 then
289: l_day2 := 30;
290: if l_day1 = 28 or l_day1 = 29 then
291: l_day1 := 30;
332: l_day_count := ( ( l_day2 - l_day1 ) + 30 * ( l_month2 - l_month1 ) + 360 * ( l_year2 - l_year1 ) );
333:
334: elsif p_day_count_method = 'ACTUAL_360' then
335: l_day_Count := to_number(TO_CHAR(p_end_date, 'J')) - to_number(TO_CHAR(p_start_date, 'J'));
336: --l_day_count := LNS_FIN_UTILS.Julian_date(p_end_date) - LNS_FIN_UTILS.Julian_date(p_start_date);
337:
338: elsif p_day_count_method = 'ACTUAL_365' then
339: l_day_Count := to_number(TO_CHAR(p_end_date, 'J')) - to_number(TO_CHAR(p_start_date, 'J'));
340: --l_day_count := LNS_FIN_UTILS.Julian_date(p_end_date) - LNS_FIN_UTILS.Julian_date(p_start_date);
336: --l_day_count := LNS_FIN_UTILS.Julian_date(p_end_date) - LNS_FIN_UTILS.Julian_date(p_start_date);
337:
338: elsif p_day_count_method = 'ACTUAL_365' then
339: l_day_Count := to_number(TO_CHAR(p_end_date, 'J')) - to_number(TO_CHAR(p_start_date, 'J'));
340: --l_day_count := LNS_FIN_UTILS.Julian_date(p_end_date) - LNS_FIN_UTILS.Julian_date(p_start_date);
341:
342: elsif p_day_count_method = 'ACTUAL_365L' then
343: l_day_Count := to_number(TO_CHAR(p_end_date, 'J')) - to_number(TO_CHAR(p_start_date, 'J'));
344: --l_day_count := LNS_FIN_UTILS.Julian_date(p_end_date) - LNS_FIN_UTILS.Julian_date(p_start_date);
340: --l_day_count := LNS_FIN_UTILS.Julian_date(p_end_date) - LNS_FIN_UTILS.Julian_date(p_start_date);
341:
342: elsif p_day_count_method = 'ACTUAL_365L' then
343: l_day_Count := to_number(TO_CHAR(p_end_date, 'J')) - to_number(TO_CHAR(p_start_date, 'J'));
344: --l_day_count := LNS_FIN_UTILS.Julian_date(p_end_date) - LNS_FIN_UTILS.Julian_date(p_start_date);
345:
346: end if;
347:
348: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, l_api_name || ': day count is: ' || l_day_count || ' by method ' || p_day_count_method);
369:
370: -- if the year is actual number of days then we need to determine if
371: -- it's a leap year or not
372: elsif p_year_count_method = 'ACTUAL_ACTUAL' or p_year_count_method = 'ACTUAL_365L' then
373: if LNS_FIN_UTILS.isLeapYear(p_year) then
374: l_days_in_year := 366;
375: else
376: l_days_in_year := 365;
377: end if;
889: ,p_term_period in varchar2
890: ,p_frequency in varchar2
891: ,p_start_date in date) return date
892: is
893: --l_pay_dates lns_fin_utils.DATE_TBL;
894: l_intervals NUMBER;
895: l_date date;
896: l_next_date date;
897: l_api_name varchar2(30);
931:
932: ELSE
933:
934: -- first get number of intervals in loan
935: l_intervals := lns_fin_utils.intervalsInPeriod(l_term
936: ,l_term_period
937: ,'MONTHLY');
938:
939: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' - intervals ' || l_intervals);
946: -- Bug#6634845 - Commented out this.
947: /*
948: WHILE i <= l_intervals LOOP
949: -- bug 5842639; scherkas 1/16/2007: changed calculation method for payment dates
950: --l_next_date := lns_fin_utils.getNextDate(l_date, p_frequency, 1);
951: l_next_date := lns_fin_utils.getNextDate(p_start_date, p_frequency, i); -- new way
952: l_date := l_next_date;
953: i := i + 1;
954: END LOOP;
947: /*
948: WHILE i <= l_intervals LOOP
949: -- bug 5842639; scherkas 1/16/2007: changed calculation method for payment dates
950: --l_next_date := lns_fin_utils.getNextDate(l_date, p_frequency, 1);
951: l_next_date := lns_fin_utils.getNextDate(p_start_date, p_frequency, i); -- new way
952: l_date := l_next_date;
953: i := i + 1;
954: END LOOP;
955: */
995: ,p_first_pay_date in date
996: ,p_maturity_date in date
997: ,p_pay_in_arrears in boolean
998: ,p_num_intervals in number
999: ,p_interval_type in varchar2) return lns_fin_utils.DATE_TBL
1000: is
1001: l_payment_dates lns_fin_utils.DATE_TBL;
1002: i number;
1003: k number;
997: ,p_pay_in_arrears in boolean
998: ,p_num_intervals in number
999: ,p_interval_type in varchar2) return lns_fin_utils.DATE_TBL
1000: is
1001: l_payment_dates lns_fin_utils.DATE_TBL;
1002: i number;
1003: k number;
1004: l_date date;
1005: l_next_date date;
1024:
1025: if p_first_pay_date <> p_maturity_date then
1026:
1027: k := 1;
1028: l_next_date := lns_fin_utils.getNextDate(p_first_pay_date, p_interval_type, k);
1029: while true loop
1030:
1031: if trunc(l_next_date) > trunc(p_maturity_date) then
1032: exit;
1036: l_payment_dates(i) := l_next_date;
1037: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' ' || i || ' - ' || l_payment_dates(i));
1038:
1039: k := k + 1;
1040: l_next_date := lns_fin_utils.getNextDate(p_first_pay_date, p_interval_type, k);
1041:
1042: end loop;
1043:
1044: end if;
1074: || MODIFICATION HISTORY
1075: || Date Author Description of Changes
1076: || 09/05/2012 scherkas Created
1077: *=======================================================================*/
1078: function getPaymentSchedule(p_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL
1079: ,p_loan_maturity_date in date) return lns_fin_utils.DATE_TBL
1080: is
1081: l_api_name varchar2(25);
1082: l_payment_dates lns_fin_utils.DATE_TBL;
1075: || Date Author Description of Changes
1076: || 09/05/2012 scherkas Created
1077: *=======================================================================*/
1078: function getPaymentSchedule(p_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL
1079: ,p_loan_maturity_date in date) return lns_fin_utils.DATE_TBL
1080: is
1081: l_api_name varchar2(25);
1082: l_payment_dates lns_fin_utils.DATE_TBL;
1083: i number;
1078: function getPaymentSchedule(p_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL
1079: ,p_loan_maturity_date in date) return lns_fin_utils.DATE_TBL
1080: is
1081: l_api_name varchar2(25);
1082: l_payment_dates lns_fin_utils.DATE_TBL;
1083: i number;
1084: j number;
1085: k number;
1086: l_freq_count number;
1116:
1117: while true loop
1118:
1119: k := k + 1;
1120: l_current_date := lns_fin_utils.getNextDate(l_first_date, l_current_freq, k);
1121:
1122: if i < l_freq_count then
1123: l_next_freq := p_freq_schedule_tbl(i+1).FREQUENCY;
1124: l_next_date := p_freq_schedule_tbl(i+1).PERIOD_BEGIN_DATE;
1211: into l_payment_frequency
1212: ,l_first_payment_date;
1213: close c_payment_info;
1214:
1215: l_installment_date := lns_fin_utils.getNextDate(p_date => l_first_payment_date
1216: ,p_interval_type => l_payment_frequency
1217: ,p_direction => p_installment_number);
1218: return l_installment_date;
1219:
1289: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'l_amortized_term_period: ' || l_amortized_term_period);
1290: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'l_amortization_frequency: ' || l_amortization_frequency);
1291: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'l_payment_frequency: ' || l_payment_frequency);
1292:
1293: l_installments := lns_fin_utils.intervalsInPeriod(l_term
1294: ,l_term_period
1295: ,l_payment_frequency);
1296:
1297: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'l_installments: ' || l_installments);
1325: close c_phase;
1326:
1327: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'l_phase: ' || l_phase);
1328:
1329: l_installments := lns_fin_utils.getNumberInstallments(p_loan_id, l_phase);
1330:
1331: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'l_installments: ' || l_installments);
1332: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' - END');
1333:
1378: l_prin_pay_in_arrears varchar2(1);
1379: l_prin_pay_in_arrears_bool boolean;
1380: l_pay_calc_method varchar2(30);
1381:
1382: l_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1383: l_custom_schedule varchar2(1);
1384:
1385: cursor c_details (p_loan_id NUMBER, p_phase varchar2)
1386: is
1457: else
1458: l_pay_in_arrears_bool := false;
1459: end if;
1460:
1461: l_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
1462: p_loan_start_date => l_loan_start_date
1463: ,p_loan_maturity_date => l_maturity_date
1464: ,p_first_pay_date => l_first_payment_date
1465: ,p_num_intervals => null
1485: else
1486: l_prin_pay_in_arrears_bool := false;
1487: end if;
1488:
1489: l_payment_tbl := LNS_FIN_UTILS.buildSIPPaymentSchedule(
1490: p_loan_start_date => l_loan_start_date
1491: ,p_loan_maturity_date => l_maturity_date
1492: ,p_int_first_pay_date => l_first_payment_date
1493: ,p_int_num_intervals => l_intervals
1507: else
1508: l_pay_in_arrears_bool := false;
1509: end if;
1510:
1511: l_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
1512: p_loan_start_date => l_loan_start_date
1513: ,p_loan_maturity_date => l_maturity_date
1514: ,p_first_pay_date => l_first_payment_date
1515: ,p_num_intervals => null
1552: ,p_phase in varchar2) return NUMBER
1553: is
1554: l_api_name varchar2(25);
1555: l_installments NUMBER;
1556: l_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1557:
1558: begin
1559:
1560: l_api_name := 'getNumberInstallments2';
1562: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_loan_id: ' || p_loan_id);
1563: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_phase: ' || p_phase);
1564:
1565: l_installments := 0;
1566: l_payment_tbl := LNS_FIN_UTILS.buildPaymentScheduleExt(p_loan_id, p_phase);
1567: l_installments := l_payment_tbl.count;
1568:
1569: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'l_installments: ' || l_installments);
1570: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' - END');
1602: ,p_loan_maturity_date in date
1603: ,p_first_pay_date in date
1604: ,p_num_intervals in number
1605: ,p_interval_type in varchar2
1606: ,p_pay_in_arrears in boolean) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1607:
1608: is
1609: l_pay_dates LNS_FIN_UTILS.DATE_TBL;
1610: l_payment_schedule LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1605: ,p_interval_type in varchar2
1606: ,p_pay_in_arrears in boolean) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1607:
1608: is
1609: l_pay_dates LNS_FIN_UTILS.DATE_TBL;
1610: l_payment_schedule LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1611: l_num_installments number;
1612: l_multiplier number;
1613: l_api_name varchar2(25);
1606: ,p_pay_in_arrears in boolean) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1607:
1608: is
1609: l_pay_dates LNS_FIN_UTILS.DATE_TBL;
1610: l_payment_schedule LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1611: l_num_installments number;
1612: l_multiplier number;
1613: l_api_name varchar2(25);
1614:
1623: if p_pay_in_arrears then
1624: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' - p_pay_in_arrears TRUE');
1625: end if;
1626:
1627: -- fix for bug 5842639: added p_loan_start_date parameter to LNS_FIN_UTILS.getPaymentSchedule
1628: l_pay_dates := LNS_FIN_UTILS.getPaymentSchedule(p_loan_start_date => p_loan_start_date
1629: ,p_first_pay_date => p_first_pay_date
1630: ,p_maturity_Date => p_loan_maturity_date
1631: ,p_pay_in_arrears => p_pay_in_arrears
1624: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' - p_pay_in_arrears TRUE');
1625: end if;
1626:
1627: -- fix for bug 5842639: added p_loan_start_date parameter to LNS_FIN_UTILS.getPaymentSchedule
1628: l_pay_dates := LNS_FIN_UTILS.getPaymentSchedule(p_loan_start_date => p_loan_start_date
1629: ,p_first_pay_date => p_first_pay_date
1630: ,p_maturity_Date => p_loan_maturity_date
1631: ,p_pay_in_arrears => p_pay_in_arrears
1632: ,p_num_intervals => p_num_intervals
1665:
1666:
1667: function buildPaymentSchedule(p_loan_start_date in date
1668: ,p_loan_maturity_date in date
1669: ,p_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1670:
1671: is
1672: l_pay_dates LNS_FIN_UTILS.DATE_TBL;
1673: l_payment_schedule LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1668: ,p_loan_maturity_date in date
1669: ,p_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1670:
1671: is
1672: l_pay_dates LNS_FIN_UTILS.DATE_TBL;
1673: l_payment_schedule LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1674: l_num_installments number;
1675: l_api_name varchar2(25);
1676:
1669: ,p_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1670:
1671: is
1672: l_pay_dates LNS_FIN_UTILS.DATE_TBL;
1673: l_payment_schedule LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1674: l_num_installments number;
1675: l_api_name varchar2(25);
1676:
1677: begin
1681: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_loan_start_date = ' || p_loan_start_date);
1682: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_loan_maturity_date = ' || p_loan_maturity_date);
1683: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_freq_schedule_tbl count = ' || p_freq_schedule_tbl.count);
1684:
1685: l_pay_dates := LNS_FIN_UTILS.getPaymentSchedule(p_freq_schedule_tbl => p_freq_schedule_tbl
1686: ,p_loan_maturity_date => p_loan_maturity_date);
1687:
1688: l_num_installments := l_pay_dates.count;
1689: logMessage(FND_LOG.LEVEL_PROCEDURE, G_PKG_NAME, l_api_name || ' - number installments: ' || l_num_installments);
1740: ,p_int_pay_in_arrears in boolean
1741: ,p_prin_first_pay_date in date
1742: ,p_prin_num_intervals in number
1743: ,p_prin_interval_type in varchar2
1744: ,p_prin_pay_in_arrears in boolean) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1745: is
1746: l_api_name varchar2(25);
1747: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1748: l_int_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1743: ,p_prin_interval_type in varchar2
1744: ,p_prin_pay_in_arrears in boolean) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1745: is
1746: l_api_name varchar2(25);
1747: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1748: l_int_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1749: l_prin_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1750: int_count number;
1751: prin_count number;
1744: ,p_prin_pay_in_arrears in boolean) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1745: is
1746: l_api_name varchar2(25);
1747: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1748: l_int_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1749: l_prin_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1750: int_count number;
1751: prin_count number;
1752: merged_count number;
1745: is
1746: l_api_name varchar2(25);
1747: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1748: l_int_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1749: l_prin_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1750: int_count number;
1751: prin_count number;
1752: merged_count number;
1753: l_int_due_date date;
1751: prin_count number;
1752: merged_count number;
1753: l_int_due_date date;
1754: l_prin_due_date date;
1755: l_int_pay LNS_FIN_UTILS.PAYMENT_SCHEDULE;
1756: l_prin_pay LNS_FIN_UTILS.PAYMENT_SCHEDULE;
1757: l_size number;
1758: i number;
1759: j number;
1752: merged_count number;
1753: l_int_due_date date;
1754: l_prin_due_date date;
1755: l_int_pay LNS_FIN_UTILS.PAYMENT_SCHEDULE;
1756: l_prin_pay LNS_FIN_UTILS.PAYMENT_SCHEDULE;
1757: l_size number;
1758: i number;
1759: j number;
1760:
1785: end if;
1786:
1787: -- get interest payment schedule
1788: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'INT payment schedule:');
1789: l_int_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
1790: p_loan_start_date => p_loan_start_date
1791: ,p_loan_maturity_date => p_loan_maturity_date
1792: ,p_first_pay_date => p_int_first_pay_date
1793: ,p_num_intervals => p_int_num_intervals
1799: end loop;
1800: */
1801: -- get principal payment schedule
1802: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'PRIN payment schedule:');
1803: l_prin_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
1804: p_loan_start_date => p_loan_start_date
1805: ,p_loan_maturity_date => p_loan_maturity_date
1806: ,p_first_pay_date => p_prin_first_pay_date
1807: ,p_num_intervals => p_prin_num_intervals
1942:
1943:
1944: function buildSIPPaymentSchedule(p_loan_start_date in date
1945: ,p_loan_maturity_date in date
1946: ,p_prin_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL
1947: ,p_int_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1948: is
1949: l_api_name varchar2(25);
1950: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1943:
1944: function buildSIPPaymentSchedule(p_loan_start_date in date
1945: ,p_loan_maturity_date in date
1946: ,p_prin_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL
1947: ,p_int_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1948: is
1949: l_api_name varchar2(25);
1950: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1951: l_int_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1946: ,p_prin_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL
1947: ,p_int_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1948: is
1949: l_api_name varchar2(25);
1950: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1951: l_int_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1952: l_prin_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1953: int_count number;
1954: prin_count number;
1947: ,p_int_freq_schedule_tbl in LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
1948: is
1949: l_api_name varchar2(25);
1950: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1951: l_int_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1952: l_prin_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1953: int_count number;
1954: prin_count number;
1955: merged_count number;
1948: is
1949: l_api_name varchar2(25);
1950: l_merged_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1951: l_int_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1952: l_prin_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
1953: int_count number;
1954: prin_count number;
1955: merged_count number;
1956: l_int_due_date date;
1954: prin_count number;
1955: merged_count number;
1956: l_int_due_date date;
1957: l_prin_due_date date;
1958: l_int_pay LNS_FIN_UTILS.PAYMENT_SCHEDULE;
1959: l_prin_pay LNS_FIN_UTILS.PAYMENT_SCHEDULE;
1960: l_size number;
1961: i number;
1962: j number;
1955: merged_count number;
1956: l_int_due_date date;
1957: l_prin_due_date date;
1958: l_int_pay LNS_FIN_UTILS.PAYMENT_SCHEDULE;
1959: l_prin_pay LNS_FIN_UTILS.PAYMENT_SCHEDULE;
1960: l_size number;
1961: i number;
1962: j number;
1963:
1974: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_int_freq_schedule_tbl.count = ' || p_int_freq_schedule_tbl.count);
1975:
1976: -- get interest payment schedule
1977: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'INT payment schedule:');
1978: l_int_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
1979: p_loan_start_date => p_loan_start_date
1980: ,p_loan_maturity_date => p_loan_maturity_date
1981: ,p_freq_schedule_tbl => p_int_freq_schedule_tbl);
1982:
1981: ,p_freq_schedule_tbl => p_int_freq_schedule_tbl);
1982:
1983: -- get principal payment schedule
1984: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'PRIN payment schedule:');
1985: l_prin_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
1986: p_loan_start_date => p_loan_start_date
1987: ,p_loan_maturity_date => p_loan_maturity_date
1988: ,p_freq_schedule_tbl => p_prin_freq_schedule_tbl);
1989:
2209: || PUBLIC PROCEDURE getPaymentScheduleExt
2210: ||
2211: || DESCRIPTION
2212: ||
2213: || Overview: returns lns_fin_utils.DATE_TBL for a loan
2214: ||
2215: || Parameter: p_loan_id => loan_id
2216: || p_phase => phase of the loan
2217: ||
2214: ||
2215: || Parameter: p_loan_id => loan_id
2216: || p_phase => phase of the loan
2217: ||
2218: || Return value: lns_fin_utils.DATE_TBL
2219: ||
2220: || MODIFICATION HISTORY
2221: || Date Author Description of Changes
2222: || 02/24/2009 6:22PM scherkas Created
2222: || 02/24/2009 6:22PM scherkas Created
2223: *=======================================================================*/
2224: /*
2225: function buildPaymentScheduleExt(p_loan_id in number
2226: ,p_phase in varchar2) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
2227: is
2228: l_api_name varchar2(25);
2229:
2230: l_installments NUMBER;
2244: l_prin_pay_in_arrears varchar2(1);
2245: l_prin_pay_in_arrears_bool boolean;
2246: l_pay_calc_method varchar2(30);
2247:
2248: l_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
2249: l_custom_schedule varchar2(1);
2250:
2251: cursor c_details (p_loan_id NUMBER, p_phase varchar2)
2252: is
2319: else
2320: l_pay_in_arrears_bool := false;
2321: end if;
2322:
2323: l_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
2324: p_loan_start_date => l_loan_start_date
2325: ,p_loan_maturity_date => l_maturity_date
2326: ,p_first_pay_date => l_first_payment_date
2327: ,p_num_intervals => null
2345: else
2346: l_prin_pay_in_arrears_bool := false;
2347: end if;
2348:
2349: l_payment_tbl := LNS_FIN_UTILS.buildSIPPaymentSchedule(
2350: p_loan_start_date => l_loan_start_date
2351: ,p_loan_maturity_date => l_maturity_date
2352: ,p_int_first_pay_date => l_first_payment_date
2353: ,p_int_num_intervals => l_intervals
2365: else
2366: l_pay_in_arrears_bool := false;
2367: end if;
2368:
2369: l_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
2370: p_loan_start_date => l_loan_start_date
2371: ,p_loan_maturity_date => l_maturity_date
2372: ,p_first_pay_date => l_first_payment_date
2373: ,p_num_intervals => null
2391: end buildPaymentScheduleExt;
2392: */
2393:
2394: function buildPaymentScheduleExt(p_loan_id in number
2395: ,p_phase in varchar2) return LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL
2396: is
2397: l_api_name varchar2(25);
2398: l_loan_start_date date;
2399: l_maturity_date date;
2399: l_maturity_date date;
2400: l_pay_calc_method varchar2(30);
2401: l_custom_schedule varchar2(1);
2402:
2403: l_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
2404: l_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2405: l_int_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2406: l_prin_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2407:
2400: l_pay_calc_method varchar2(30);
2401: l_custom_schedule varchar2(1);
2402:
2403: l_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
2404: l_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2405: l_int_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2406: l_prin_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2407:
2408: cursor c_details (p_loan_id NUMBER, p_phase varchar2)
2401: l_custom_schedule varchar2(1);
2402:
2403: l_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
2404: l_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2405: l_int_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2406: l_prin_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2407:
2408: cursor c_details (p_loan_id NUMBER, p_phase varchar2)
2409: is
2402:
2403: l_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
2404: l_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2405: l_int_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2406: l_prin_freq_schedule_tbl LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2407:
2408: cursor c_details (p_loan_id NUMBER, p_phase varchar2)
2409: is
2410: SELECT decode(p_phase, 'TERM', trunc(h.loan_start_date),
2443: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'l_custom_schedule: ' || l_custom_schedule);
2444:
2445: if p_phase = 'OPEN' then
2446:
2447: l_freq_schedule_tbl := LNS_FIN_UTILS.fetchFreqSchedule(
2448: P_LOAN_ID => p_loan_id,
2449: P_PHASE => 'OPEN',
2450: P_COMPONENT => 'PRIN_INT');
2451:
2448: P_LOAN_ID => p_loan_id,
2449: P_PHASE => 'OPEN',
2450: P_COMPONENT => 'PRIN_INT');
2451:
2452: l_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
2453: p_loan_start_date => l_loan_start_date
2454: ,p_loan_maturity_date => l_maturity_date
2455: ,p_freq_schedule_tbl => l_freq_schedule_tbl);
2456:
2459: if l_custom_schedule = 'N' then
2460:
2461: if (l_pay_calc_method = 'SEPARATE_SCHEDULES') then
2462:
2463: l_int_freq_schedule_tbl := LNS_FIN_UTILS.fetchFreqSchedule(
2464: P_LOAN_ID => p_loan_id,
2465: P_PHASE => 'TERM',
2466: P_COMPONENT => 'INT');
2467:
2464: P_LOAN_ID => p_loan_id,
2465: P_PHASE => 'TERM',
2466: P_COMPONENT => 'INT');
2467:
2468: l_prin_freq_schedule_tbl := LNS_FIN_UTILS.fetchFreqSchedule(
2469: P_LOAN_ID => p_loan_id,
2470: P_PHASE => 'TERM',
2471: P_COMPONENT => 'PRIN');
2472:
2469: P_LOAN_ID => p_loan_id,
2470: P_PHASE => 'TERM',
2471: P_COMPONENT => 'PRIN');
2472:
2473: l_payment_tbl := LNS_FIN_UTILS.buildSIPPaymentSchedule(
2474: p_loan_start_date => l_loan_start_date,
2475: p_loan_maturity_date => l_maturity_date,
2476: p_prin_freq_schedule_tbl => l_prin_freq_schedule_tbl,
2477: p_int_freq_schedule_tbl => l_int_freq_schedule_tbl);
2477: p_int_freq_schedule_tbl => l_int_freq_schedule_tbl);
2478:
2479: else
2480:
2481: l_freq_schedule_tbl := LNS_FIN_UTILS.fetchFreqSchedule(
2482: P_LOAN_ID => p_loan_id,
2483: P_PHASE => 'TERM',
2484: P_COMPONENT => 'PRIN_INT');
2485:
2482: P_LOAN_ID => p_loan_id,
2483: P_PHASE => 'TERM',
2484: P_COMPONENT => 'PRIN_INT');
2485:
2486: l_payment_tbl := LNS_FIN_UTILS.buildPaymentSchedule(
2487: p_loan_start_date => l_loan_start_date
2488: ,p_loan_maturity_date => l_maturity_date
2489: ,p_freq_schedule_tbl => l_freq_schedule_tbl);
2490:
2530: ,p_phase in varchar2) return NUMBER
2531: is
2532: l_api_name varchar2(30);
2533: l_installment_no NUMBER;
2534: l_payment_tbl LNS_FIN_UTILS.PAYMENT_SCHEDULE_TBL;
2535:
2536: begin
2537:
2538: l_api_name := 'getNextInstallmentAfterDate';
2540: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_loan_id: ' || p_loan_id);
2541: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_phase: ' || p_phase);
2542:
2543: l_installment_no := null;
2544: l_payment_tbl := LNS_FIN_UTILS.buildPaymentScheduleExt(p_loan_id, p_phase);
2545: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, l_api_name || ' l_payment_tbl.count = ' || l_payment_tbl.count);
2546:
2547: logMessage(FND_LOG.LEVEL_STATEMENT, G_PKG_NAME, 'p_date: ' || p_date);
2548: FOR k in 1..l_payment_tbl.count LOOP
2849: function fetchFreqSchedule(
2850: P_LOAN_ID IN NUMBER,
2851: P_PHASE IN VARCHAR2, -- OPEN/TERM/null will be defaulted to TERM
2852: P_COMPONENT IN VARCHAR2 -- PRIN/INT/PRIN_INT/null will be defaulted to PRIN_INT
2853: ) return LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL
2854: IS
2855:
2856: /*-----------------------------------------------------------------------+
2857: | Local Variable Declarations and initializations |
2863: l_return_status VARCHAR2(1);
2864: i number;
2865: l_FREQUENCY_BEGIN_DATE date;
2866: l_FREQUENCY VARCHAR2(30);
2867: l_FREQ_SCHEDULE_TBL LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL;
2868:
2869: /*-----------------------------------------------------------------------+
2870: | Cursor Declarations |
2871: +-----------------------------------------------------------------------*/
2909: END;
2910:
2911:
2912: procedure fetchPayFreqRecByDate(
2913: p_FREQUENCY_SCHEDULE IN LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL,
2914: p_DATE IN DATE,
2915: x_FREQUENCY_REC OUT NOCOPY LNS_FIN_UTILS.FREQUENCY_SCHEDULE)
2916: IS
2917:
2911:
2912: procedure fetchPayFreqRecByDate(
2913: p_FREQUENCY_SCHEDULE IN LNS_FIN_UTILS.FREQUENCY_SCHEDULE_TBL,
2914: p_DATE IN DATE,
2915: x_FREQUENCY_REC OUT NOCOPY LNS_FIN_UTILS.FREQUENCY_SCHEDULE)
2916: IS
2917:
2918: l_api_name CONSTANT VARCHAR2(30) := 'fetchPayFreqRecByDate';
2919:
2937:
2938: END;
2939:
2940:
2941: END LNS_FIN_UTILS;