Replace due_date_change

parent e33be78b
......@@ -239,78 +239,77 @@ SET V_PREV_DUE_DATE = v_LOAN_REPAY_EFF_DATE;
SET V_PREV_PRIN_OS = v_LOAN_LOAN_AMOUNT;
SET V_INT_COMP1 = 0;
OPEN REPAY_TEMP_CUR;
REPAY_TEMP_CUR_READ: LOOP
FETCH REPAY_TEMP_CUR INTO V_LOAN_ID, V_SEQ_NO, V_ORG_DUE_DATE, V_DUE_DATE,
V_INSTL_AMOUNT, V_PRIN_COMP, V_INT_COMP,
V_EXCESS_INT_COMP, V_ADV_FLAG, V_BILL_FLAG,
V_PRIN_OS, V_REC_TYPE, V_ORG_SEQ_NO;
IF DONE = 1 THEN
SET DONE = 0;
LEAVE REPAY_TEMP_CUR_READ;
END IF;
IF V_SEQ_NO < V_DEFERAL_FROM_INSTL THEN
IF V_REC_TYPE = 'P' OR V_REC_TYPE = 'D' THEN
SET V_DAYS = GET_DAYS_BETWEEN(V_PREV_DUE_DATE, V_DUE_DATE, V_LOAN_DAYS_BASIS);
SET V_INT_COMP1 = V_INT_COMP1 + GET_ROUNDED_VALUE((V_PREV_PRIN_OS * V_LOAN_EFF_RATE * V_DAYS)
/ (V_LOAN_DAYS_PER_YEAR * 100), V_INT_ROUND_TYPE, V_INT_ROUNDING);
ELSE
SET V_INT_COMP1 = 0;
END IF;
SET V_PREV_DUE_DATE = V_DUE_DATE;
SET V_PREV_PRIN_OS = V_PRIN_OS;
ELSE
SET V_ORG_DUE_DATE = DATE_ADD(V_PREV_DUE_DATE, INTERVAL V_FREQ_MONTHS MONTH);
IF V_SEQ_NO = V_DEFERAL_FROM_INSTL THEN
SET V_DUE_DATE = V_NEXT_DUE_DATE;
ELSE
SET V_DUE_DATE = DATE_ADD(V_PREV_DUE_DATE, INTERVAL V_FREQ_MONTHS MONTH);
IF EXTRACT(DAY FROM LAST_DAY(V_DUE_DATE)) <= V_LOAN_DUE_DAY THEN
SET V_DUE_DATE = STR_TO_DATE(CONCAT(EXTRACT(YEAR_MONTH FROM V_DUE_DATE),
EXTRACT(DAY FROM LAST_DAY(V_DUE_DATE))), '%Y%m%d');
ELSE
SET V_DUE_DATE = STR_TO_DATE(CONCAT(EXTRACT(YEAR_MONTH FROM V_DUE_DATE),
V_LOAN_DUE_DAY), '%Y%m%d');
END IF;
END IF;
SET V_DAYS = GET_DAYS_BETWEEN(V_PREV_DUE_DATE, V_ORG_DUE_DATE, V_LOAN_DAYS_BASIS);
SET V_ORG_INT_COMP = GET_ROUNDED_VALUE((V_PREV_PRIN_OS * V_LOAN_EFF_RATE * V_DAYS)
/ (V_LOAN_DAYS_PER_YEAR * 100), V_INT_ROUND_TYPE, V_INT_ROUNDING);
SET V_ORG_INT_COMP = V_ORG_INT_COMP + V_INT_COMP1;
SET V_DAYS = GET_DAYS_BETWEEN(V_PREV_DUE_DATE, V_DUE_DATE, V_LOAN_DAYS_BASIS);
SET V_INT_COMP = GET_ROUNDED_VALUE((V_PREV_PRIN_OS * V_LOAN_EFF_RATE * V_DAYS)
/ (V_LOAN_DAYS_PER_YEAR * 100), V_INT_ROUND_TYPE, V_INT_ROUNDING);
SET V_INT_COMP = V_INT_COMP + V_INT_COMP1;
SET V_INT_COMP1 = 0;
IF V_EXCESS_INT_FLAG = 'N' THEN
SET V_EXCESS_INT_COMP = 0;
ELSE
SET V_EXCESS_INT_COMP = V_ORG_INT_COMP - V_INT_COMP;
END IF;
SET V_PRIN_COMP = V_INSTL_AMOUNT - V_INT_COMP;
IF V_SEQ_NO < (SELECT MAX(R_SEQ_NO) FROM REPAY_TEMP WHERE R_LOAN_ID = V_LOAN_ID) THEN
SET V_PRIN_COMP = V_PRIN_COMP + V_EXCESS_INT_COMP;
REPAY_TEMP_CUR_READ : LOOP
FETCH REPAY_TEMP_CUR INTO V_LOAN_ID, V_SEQ_NO, V_ORG_DUE_DATE, V_DUE_DATE,
V_INSTL_AMOUNT, V_PRIN_COMP, V_INT_COMP,
V_EXCESS_INT_COMP, V_ADV_FLAG, V_BILL_FLAG, V_PRIN_OS, V_REC_TYPE, V_ORG_SEQ_NO;
IF DONE = 1 THEN
SET DONE = 0;
LEAVE REPAY_TEMP_CUR_READ;
END IF;
SET V_PRIN_OS = V_PREV_PRIN_OS - V_PRIN_COMP;
SET V_INT_OS = V_INT_OS - V_INT_COMP - V_EXCESS_INT_COMP;
UPDATE REPAY_TEMP
SET R_ORG_DUE_DATE = V_ORG_DUE_DATE,
R_DUE_DATE = V_DUE_DATE,
R_INSTL_AMOUNT = V_INSTL_AMOUNT,
R_PRIN_COMP = V_PRIN_COMP,
R_INT_COMP = V_INT_COMP,
R_EXCESS_INT_COMP = V_EXCESS_INT_COMP,
R_PRIN_OS = V_PRIN_OS,
R_EFFRATE = V_LOAN_EFF_RATE,
R_COUNT = V_COUNT
WHERE R_LOAN_ID = V_LOAN_ID
AND R_SEQ_NO = V_SEQ_NO;
SET V_PREV_DUE_DATE = V_DUE_DATE;
SET V_PREV_PRIN_OS = V_PRIN_OS;
END IF;
IF V_SEQ_NO < V_DEFERAL_FROM_INSTL THEN
IF V_REC_TYPE = 'P' OR V_REC_TYPE = 'D' THEN
SET V_DAYS = GET_DAYS_BETWEEN(V_PREV_DUE_DATE, V_DUE_DATE, V_LOAN_DAYS_BASIS);
SET V_INT_COMP1 = V_INT_COMP1 + GET_ROUNDED_VALUE((V_PREV_PRIN_OS * V_LOAN_EFF_RATE * V_DAYS) / (V_LOAN_DAYS_PER_YEAR * 100),V_INT_ROUND_TYPE, V_INT_ROUNDING);
ELSE
SET V_INT_COMP1 = 0;
END IF;
SET V_PREV_DUE_DATE = V_DUE_DATE;
SET V_PREV_PRIN_OS = V_PRIN_OS;
ELSE
SET V_ORG_DUE_DATE = DATE_ADD(V_PREV_DUE_DATE, INTERVAL V_FREQ_MONTHS MONTH);
IF V_SEQ_NO = V_DEFERAL_FROM_INSTL THEN
SET V_DAYS = GET_DAYS_BETWEEN(V_PREV_DUE_DATE, V_NEXT_DUE_DATE, V_LOAN_DAYS_BASIS);
SET V_INT_COMP1 = GET_ROUNDED_VALUE((V_PREV_PRIN_OS * V_LOAN_EFF_RATE * V_DAYS) / (V_LOAN_DAYS_PER_YEAR * 100),V_INT_ROUND_TYPE, V_INT_ROUNDING);
SET V_INT_COMP = V_INT_COMP + V_INT_COMP1;
SET V_INSTL_AMOUNT = V_INSTL_AMOUNT + V_INT_COMP1;
SET V_DUE_DATE = V_NEXT_DUE_DATE;
ELSE
SET V_DUE_DATE = DATE_ADD(V_PREV_DUE_DATE, INTERVAL V_FREQ_MONTHS MONTH);
IF EXTRACT(DAY FROM LAST_DAY(V_Due_Date)) <= V_LOAN_DUE_DAY THEN
SET V_Due_Date = STR_TO_DATE(CONCAT(EXTRACT(YEAR_MONTH FROM V_Due_Date), EXTRACT(DAY FROM LAST_DAY(V_Due_Date))), '%Y%m%d');
ELSE
Set V_Due_Date = STR_TO_DATE(CONCAT(EXTRACT(YEAR_MONTH FROM V_Due_Date), V_LOAN_DUE_DAY), '%Y%m%d');
END IF;
END IF;
-- Regular EMI calculation
SET V_DAYS = GET_DAYS_BETWEEN(V_PREV_DUE_DATE, V_DUE_DATE, V_LOAN_DAYS_BASIS);
SET V_INT_COMP = GET_ROUNDED_VALUE((V_PREV_PRIN_OS * V_LOAN_EFF_RATE * V_DAYS) / (V_LOAN_DAYS_PER_YEAR * 100),V_INT_ROUND_TYPE, V_INT_ROUNDING);
IF V_EXCESS_INT_FLAG = 'N' THEN
SET V_EXCESS_INT_COMP = 0;
ELSE
SET V_EXCESS_INT_COMP = V_ORG_INT_COMP - V_INT_COMP;
END IF;
SET V_PRIN_COMP = V_INSTL_AMOUNT - V_INT_COMP;
IF V_SEQ_NO < (SELECT MAX(R_SEQ_NO) FROM REPAY_TEMP WHERE R_LOAN_ID = V_LOAN_ID) THEN
SET V_PRIN_COMP = V_PRIN_COMP - V_EXCESS_INT_COMP;
ELSE
SET V_PRIN_COMP = V_PRIN_COMP;
END IF;
SET V_PRIN_OS = V_PREV_PRIN_OS - V_PRIN_COMP;
SET V_INT_OS = V_INT_OS - V_INT_COMP - V_EXCESS_INT_COMP;
SET V_PREV_DUE_DATE = V_DUE_DATE;
SET V_PREV_PRIN_OS = V_PRIN_OS;
UPDATE REPAY_TEMP
SET R_ORG_DUE_DATE = V_ORG_DUE_DATE,
R_DUE_DATE = V_DUE_DATE,
R_INSTL_AMOUNT = V_INSTL_AMOUNT,
R_PRIN_COMP = V_PRIN_COMP,
R_INT_COMP = V_INT_COMP,
R_EXCESS_INT_COMP = V_EXCESS_INT_COMP,
R_PRIN_OS = V_PRIN_OS,
R_EFFRATE = V_LOAN_EFF_RATE,
R_COUNT = V_COUNT
WHERE R_LOAN_ID = V_LOAN_ID
AND R_SEQ_NO = V_SEQ_NO;
END IF;
END LOOP;
CLOSE REPAY_TEMP_CUR;
IF V_PRIN_OS <> 0 THEN
SET V_PRIN_COMP = V_PRIN_COMP + V_PRIN_OS;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment