Replace due_date_change

parent d8f2b0e1
......@@ -243,10 +243,12 @@ 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
-- Pre-deferal installment logic
IF V_REC_TYPE = 'P' OR V_REC_TYPE = 'D' THEN
......@@ -258,14 +260,22 @@ IF V_SEQ_NO < V_DEFERAL_FROM_INSTL THEN
SET V_PREV_DUE_DATE = V_DUE_DATE;
SET V_PREV_PRIN_OS = V_PRIN_OS;
ELSE
-- Regular installment logic
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
-- Calculate the gap period (e.g., from 06-Oct to 16-Oct)
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);
-- Add this additional interest to the next EMI (calculated in the next loop iteration)
SET V_NEXT_EMI_INT_COMP = V_INT_COMP1;
SET V_NEXT_EMI_INSTL_AMOUNT = V_INSTL_AMOUNT + V_INT_COMP1;
-- Shift the due date to the next one
SET V_DUE_DATE = V_NEXT_DUE_DATE;
ELSE
-- Calculate the regular due date
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');
......@@ -273,20 +283,32 @@ 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;
-- Principal component adjustment (no changes here)
SET V_PRIN_COMP = V_INSTL_AMOUNT - V_INT_COMP - V_EXCESS_INT_COMP;
-- Prevent principal from becoming negative (for last EMI)
IF V_PRIN_COMP < 0 THEN
SET V_PRIN_COMP = 0;
END IF;
-- Outstanding principal update
SET V_PRIN_OS = V_PREV_PRIN_OS - V_PRIN_COMP;
SET V_PREV_DUE_DATE = V_DUE_DATE;
SET V_PREV_PRIN_OS = V_PRIN_OS;
-- Update the REPAY_TEMP table with the new values for the current EMI
UPDATE REPAY_TEMP
SET R_ORG_DUE_DATE = V_ORG_DUE_DATE,
R_DUE_DATE = V_DUE_DATE,
......@@ -299,14 +321,15 @@ ELSE
R_COUNT = V_COUNT
WHERE R_LOAN_ID = V_LOAN_ID
AND R_SEQ_NO = V_SEQ_NO;
IF V_SEQ_NO = V_DEFERAL_FROM_INSTL THEN
UPDATE REPAY_TEMP
SET R_INT_COMP = V_NEXT_EMI_INT_COMP,
R_INSTL_AMOUNT = V_NEXT_EMI_INSTL_AMOUNT
WHERE R_LOAN_ID = V_LOAN_ID
AND R_SEQ_NO = V_SEQ_NO + 1;
AND R_SEQ_NO = V_SEQ_NO + 1; -- Assuming next EMI is the next sequence number
END IF;
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