CREATE DEFINER=`root`@`localhost` PROCEDURE `due_date_change`(IN I_COMPANY_ID INT, IN I_RESCH_ID INT(10),
							      IN I_CURR_DATE DATE, IN I_USER_ID VARCHAR(10),
							      IN I_STATUS VARCHAR(1), IN I_REMARKS VARCHAR(100),
                                                              OUT O_FLAT_RATE DECIMAL(10,7), OUT O_LOAN_EFF_RATE DECIMAL(10,7),
                                                              OUT O_MKTIRR1 DECIMAL(10,7), OUT O_MKTIRR2 DECIMAL(10,7),
							      out o_error_flag varchar(1), out o_error_msg Varchar(100))
BEGIN
DECLARE V_RESCH_EFF_DATE		DATE;
DECLARE V_PREPAYMENT_AMOUNT		DECIMAL(22,4);
DECLARE V_RESCH_CHARGES			DECIMAL(22,4);
DECLARE V_DEFERAL_FROM_INSTL		INT(3);
DECLARE V_INSTL_DEFERRED		INT(3);
DECLARE V_INTEREST_METHOD		VARCHAR(1);
DECLARE V_NEXT_DUE_DATE 		DATE;
DECLARE V_DEAL_ID		INT(10);
Declare v_LOAN_PRODUCT_CATEGORY	VARCHAR(10);
Declare v_LOAN_PRODUCT		VARCHAR(10);
Declare V_LOAN_CUSTOMER_ID	VARCHAR(10);
Declare v_LOAN_SCHEME		int(10);
Declare v_LOAN_PROMO_SCHEME	int(10);
Declare v_LOAN_PRODUCT_TYPE	VARCHAR(1);
Declare v_LOAN_INITIATION_DATE	DATE;
Declare v_LOAN_APPROVAL_DATE	DATE;
Declare v_LOAN_DISBURSAL_DATE	DATE;
Declare v_LOAN_REPAY_EFF_DATE	DATE;
Declare v_LOAN_MATURITY_DATE	DATE;
Declare v_LOAN_LOAN_AMOUNT	DECIMAL(22,4) DEFAULT 0;
Declare v_LOAN_TENURE		Int(5);
Declare v_LOAN_REPAYMENT_FREQ	VARCHAR(1);
Declare v_LOAN_RATE_TYPE	VARCHAR(1);
Declare v_LOAN_RATE_METHOD	VARCHAR(1);
Declare v_LOAN_FINAL_RATE	DECIMAL(10,7)  DEFAULT 0;
Declare V_FLAT_RATE		DECIMAL(10,7)  DEFAULT 0;
Declare v_LOAN_REPAYMENT_TYPE	VARCHAR(1);
Declare v_LOAN_INSTALLMENT_TYPE	VARCHAR(1);
Declare v_LOAN_INSTALLMENT_MODE	VARCHAR(1);
Declare v_LOAN_NUMBER_DISBURSAL	Int(3);
Declare v_LOAN_ADVANCE_INSTL	Int(3);
Declare v_LOAN_DUE_DAY		Int(2);
DECLARE V_LOAN_EFF_RATE		DECIMAL(10,7);
Declare v_LOAN_DAYS_BASIS	VARCHAR(1);
Declare v_LOAN_DAYS_PER_YEAR	int(3);
Declare v_RV_AMOUNT		DECIMAL(22,4)  DEFAULT 0;
DECLARE V_INSTL_ROUND_TYPE 	VARCHAR(1);
DECLARE V_INSTL_ROUNDING 	INT (1);
DECLARE V_INT_ROUND_TYPE 	VARCHAR(1);
DECLARE V_INT_ROUNDING 		INT (1);
DECLARE V_FREQ_MONTHS 		INT (2);
DECLARE V_NO_OF_INSTL 		INT(3);
DECLARE V_ERROR_FLAG 		VARCHAR (1);
DECLARE V_ERROR_MSG 		VARCHAR (100);
DECLARE V_TOTAL_INSTALLMENT_AMOUNT 	DECIMAL (22,4) DEFAULT 0;
DECLARE V_INSTALLMENT_AMOUNT 	DECIMAL (22,4) DEFAULT 0;
DECLARE V_PRINCIPAL_AMOUNT 	DECIMAL (22,4) DEFAULT 0;
DECLARE V_INTEREST_AMOUNT 	DECIMAL (22,4) DEFAULT 0;
DECLARE V_PREV_INSTL_AMOUNT 	DECIMAL (22,4);
DECLARE V_PREV_PRIN_COMP  	DECIMAL (22,4);
DECLARE V_TOTAL_PRINCIPAL	DECIMAL(22,4) DEFAULT 0;
DECLARE V_RECOVERY_AMOUNT	DECIMAL(22,4) default 0;
DECLARE DONE 			INT;
DECLARE V_LOAN_ID 		INT(10);
DECLARE V_SEQ_NO  		INT (3);
DECLARE v_FROM_INSTL_NO 	INT(3) default 0 ;
DECLARE v_TO_INSTL_NO 		INT(3) default 0;
DECLARE V_RECOVERY_PERCENT	DECIMAL (5,2)  DEFAULT 0;
DECLARE I 			INT DEFAULT 0;
DECLARE J 			INT DEFAULT 0;
DECLARE V_LAST_INSTL_NO		INT(3);
DECLARE V_DUE_DATE 		DATE;
DECLARE V_ORG_DUE_DATE		DATE;
DECLARE V_INSTL_AMOUNT 		DECIMAL (22,4);
DECLARE V_PRIN_COMP 		DECIMAL (22,4);
DECLARE V_INT_COMP 		DECIMAL (22,4);
DECLARE V_INT_COMP1 		DECIMAL (22,4);
DECLARE V_ORG_INT_COMP 		DECIMAL (22,4);
DECLARE V_EXCESS_INT_COMP 	DECIMAL (22,4);
DECLARE V_PRIN_OS 		DECIMAL (22,4) default 0;
DECLARE V_ADV_FLAG 		VARCHAR(1);
DECLARE V_BILL_FLAG 		VARCHAR(1);
DECLARE V_COUNT 		INT(5) DEFAULT 0;
DECLARE V_REC_TYPE		VARCHAR(1);
DECLARE V_PREV_DUE_DATE		DATE;
DECLARE V_DAYS			INT(5) DEFAULT 0;
DECLARE V_INT_OS 		DECIMAL (22,4);
DECLARE V_PREV_PRIN_OS 		DECIMAL (22,4);
Declare v_MKTIRR1  		DECIMAL (10,7) Default 0;
Declare v_MKTIRR2  		DECIMAL (10,7) Default 0;
Declare v_UpFront_InFlow	DECIMAL (22,4) default 0;
Declare v_End_OutFlow 		DECIMAL (22,4) default 0;
DECLARE v_TOTAL_RECOVERY 	DECIMAL (5,2) Default 0;
DECLARE V_OPPORTUNITY_INTEREST  DECIMAL (10,7) DEFAULT 15;
DECLARE V_GEN_ROUND_TYPE VARCHAR(1) DEFAULT 'R';
DECLARE V_GEN_ROUND_PARA INT(1) DEFAULT 2;
DECLARE V_ADVANCE_AMOUNT	DECIMAL(22,4) DEFAULT 0;
DECLARE V_SD_ADJ_FLAG		VARCHAR(1) DEFAULT 'N';
DECLARE V_RECOVERY_TYPE 	VARCHAR(1);
declare V_TOTAL_AMOUNT		DECIMAL(22,4);
Declare v_NEW_EffRate  		DECIMAL (10,7) Default 0;
DECLARE V_ALLOC_FLAG		VARCHAR(1) DEFAULT 'N';
DECLARE V_INSTL_COUNT		INT(5);
DECLARE V_LOAN_NO_OF_INSTALLMENT INT(5);
DECLARE V_PREV_INSTL_COUNT		INT(3);
DECLARE V_INSTL_PLAN_HST_ID     INT(10);
DECLARE V_REPAY_HST_ID     	INT(10);
DECLARE V_OLD_INTEREST			DECIMAL(22,4);
DECLARE V_NEW_INTEREST			DECIMAL(22,4);
DECLARE V_TXNADVICE_ID			INT(10);
DECLARE V_TXN_TYPE		VARCHAR(3);
DECLARE V_TXN_ID		INT(10);
DECLARE V_ADVICE_DATE		DATE;
DECLARE V_ADVICE_TYPE		VARCHAR(1);
DECLARE V_CHARGE_CODE_ID	INT(10);
DECLARE V_ADVICE_AMOUNT		DECIMAL(22,4) DEFAULT 0;
DECLARE V_TXN_ADJUSTED_AMOUNT	DECIMAL(22,4) DEFAULT 0;
DECLARE V_AMOUNT_IN_PROCESS	DECIMAL(22,4) DEFAULT 0;
DECLARE V_CHARGE_CODE			INT(10);
DECLARE V_CHARGE_ID			INT(10);
DECLARE V_CHARGE_TYPE			VARCHAR(1);
DECLARE V_CHARGE_AMOUNT			DECIMAL(22,4) DEFAULT 0;
DECLARE V_BP_TYPE			VARCHAR(3);
DECLARE V_BP_ID 			INT(10);
DECLARE V_BP_NAME			VARCHAR(50);
DECLARE V_CHARGE_METHOD			VARCHAR(1);
DECLARE V_TAX_RATE1			DECIMAL(7,4) DEFAULT 0;
DECLARE V_TAX_RATE2			DECIMAL(7,4) DEFAULT 0;
DECLARE V_TDS_RATE			DECIMAL(7,4) DEFAULT 0;
DECLARE V_TDS_AMOUNT			DECIMAL(22,4) DEFAULT 0;
DECLARE V_TAX_AMOUNT1			DECIMAL(22,4) DEFAULT 0;
DECLARE V_TAX_AMOUNT2			DECIMAL(22,4) DEFAULT 0;
DECLARE V_TDS_APPLICABLE		VARCHAR(1) DEFAULT 'N';
DECLARE V_TAX_APPLICABLE		VARCHAR(1) DEFAULT 'N';
DECLARE V_TAX_INCLUSIVE			VARCHAR(1) DEFAULT 'N';
DECLARE I_DEPARTMENT			INT(10);
DECLARE V_ACCOUNTING_FLAG 		VARCHAR(1) DEFAULT 'N';
DECLARE V_CHARGE_STR			VARCHAR(1000) DEFAULT '';
DECLARE V_VOUCHER_STR			VARCHAR(500);
DECLARE V_CHARGE_AMT			DECIMAL(22,4) DEFAULT 0;
DECLARE V_VOUCHER_NO			VARCHAR(20);
DECLARE V_EXCESS_INT_FLAG	VARCHAR(1);
DECLARE V_ORG_SEQ_NO			INT(3);
DECLARE V_DISBURSAL_STATUS VARCHAR(1);
DECLARE V_LAST_DUE_DATE DATE;
DECLARE V_INSTL_NO INT;
DECLARE V_LOAN_BRANCH  INT;
DECLARE V_NPA_FLAG VARCHAR(30);
DECLARE V_LOAN_CUSTOMER_NAME VARCHAR(100);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
Begin
  Rollback;
  set o_Error_Flag = 'E';
  set o_Error_msg = 'Due_Date_Change-Unknown exception in SQL Execution, Contact System Administrator...';
End;
DECLARE EXIT HANDLER FOR 1205
Begin
  Rollback;
  set o_Error_Flag = 'E';
  set o_Error_msg = 'Due_Date_Change-RECORD IS LOCKED BY SOME OTHER USER, TRY AFTER SOME TIME';
End;
SET AUTOCOMMIT=0;
set o_Error_Flag = 'S';
set o_Error_msg = '';
Create Temporary Table IF NOT EXISTS Instl_Plan_TEMP (P_LOAN_ID INT(10), P_RECOVERY_TYPE VARCHAR(1), P_SEQ_NO INT(3), P_FROM_INSTL_NO INT(3), P_TO_INSTL_NO INT(3),
                                                      P_RECOVERY_PERCENT DECIMAL(7,4), P_PRINCIPAL_AMOUNT DECIMAL(22,4),
                                                      P_INSTALLMENT_AMOUNT DECIMAL (22,4),P_REC_TYPE VARCHAR(1));
DELETE FROM Instl_Plan_TEMP;
Create Temporary Table IF NOT EXISTS Repay_Temp (R_LOAN_ID int(10), R_Seq_No int (3), R_Org_Due_Date Date, R_Due_Date Date,
                                                 R_Instl_Amount DECIMAL (22,4), R_Prin_Comp DECIMAL (22,4), R_Int_Comp DECIMAL (22,4),
                                                 R_EXCESS_Int_Comp DECIMAL (22,4), R_Prin_OS DECIMAL (22,4), R_EFFRATE DECIMAL (10,7),
                                                 R_ADV_FLAG VARCHAR(1), R_BILL_FLAG VARCHAR(1), R_Count int(5), R_REC_TYPE VARCHAR(1),
                                                 R_ORG_SEQ_NO INT(3), R_OTHER_CHARGES DECIMAL(22,4) );
DELETE FROM Repay_Temp;
Create Temporary Table IF NOT EXISTS Repay_Temp1 (R_LOAN_ID int(10), R_Seq_No int (3), R_Org_Due_Date Date, R_Due_Date Date,
                                                  R_Instl_Amount DECIMAL (22,4), R_Prin_Comp DECIMAL (22,4), R_Int_Comp DECIMAL (22,4),
                                                  R_EXCESS_Int_Comp DECIMAL (22,4), R_Prin_OS DECIMAL (22,4), R_EFFRATE DECIMAL (10,7),
                                                  R_ADV_FLAG VARCHAR(1), R_BILL_FLAG VARCHAR(1), R_Count int(5), R_REC_TYPE VARCHAR(1),
                                                  R_ORG_SEQ_NO INT(3), R_OTHER_CHARGES DECIMAL(22,4));
DELETE FROM Repay_Temp1;
BEGIN
DECLARE Instl_Plan_Cur CURSOR for select P_RECOVERY_TYPE, P_LOAN_ID, P_SEQ_NO, P_FROM_INSTL_NO, P_TO_INSTL_NO, IFNULL(P_RECOVERY_PERCENT,0), IFNULL(P_PRINCIPAL_AMOUNT,0), IFNULL(P_INSTALLMENT_AMOUNT,0)
                                  from Instl_Plan_TEMP
                                 Where P_LOAN_ID = V_LOAN_ID
                                 ORDER BY P_LOAN_ID, P_SEQ_NO;
DECLARE REPAY_TEMP_CUR CURSOR FOR SELECT R_LOAN_ID, R_SEQ_NO, R_ORG_DUE_DATE, R_DUE_DATE,
                                         R_INSTL_AMOUNT, R_PRIN_COMP, R_INT_COMP,
                                         R_EXCESS_INT_COMP, R_ADV_FLAG, R_BILL_FLAG, R_Prin_OS, IFNULL(R_REC_TYPE, 'I'), R_ORG_SEQ_NO
                                    FROM REPAY_TEMP
                                    ORDER BY R_LOAN_ID, R_ORG_SEQ_NO;
SELECT PARAMETER_VALUE INTO V_EXCESS_INT_FLAG
  FROM PARAMETER_MST
 WHERE PARAMETER_KEY = 'EXCESS_INT_FLAG';
IF DONE = 1 THEN
   SET DONE = 0;
   SET V_EXCESS_INT_FLAG = 'Y';
END IF;
SELECT LOAN_ID, RESCH_EFF_DATE, IFNULL(RESCH_CHARGES,0), ifnull(DEFERAL_FROM_INSTL,0), ifnull(INSTL_DEFERRED,0), GAP_INTEREST_METHOD, NEW_DUE_DATE
  INTO V_LOAN_ID, V_RESCH_EFF_DATE, V_RESCH_CHARGES, V_DEFERAL_FROM_INSTL, V_INSTL_DEFERRED, V_INTEREST_METHOD, V_NEXT_DUE_DATE
  FROM CR_RESCH_DTL
 WHERE RESCH_ID = I_RESCH_ID;
IF DONE = 1 THEN
   SET DONE = 0;
   rollback;
   set o_Error_Flag = 'E';
   set o_Error_msg = 'DEFERRAL DETAILS NOT FOUND';
END IF;
Select LOAN_ID, LOAN_DEAL_ID, LOAN_PRODUCT, LOAN_SCHEME, LOAN_PROMO_SCHEME, LOAN_PRODUCT_TYPE, LOAN_INITIATION_DATE,
          LOAN_APPROVAL_DATE, LOAN_DISBURSAL_DATE, LOAN_REPAY_EFF_DATE, LOAN_LOAN_AMOUNT, LOAN_TENURE, LOAN_REPAYMENT_FREQ, LOAN_RATE_TYPE,
	  LOAN_RATE_METHOD, LOAN_FINAL_RATE, LOAN_REPAYMENT_TYPE, LOAN_INSTALLMENT_TYPE, LOAN_INSTALLMENT_MODE,
	  LOAN_ADVANCE_INSTL, LOAN_DUE_DAY, LOAN_MATURITY_DATE, LOAN_EFF_RATE, LOAN_NO_OF_INSTALLMENT,
          LOAN_FLAT_RATE, LOAN_EFF_RATE, LOAN_IRR1, LOAN_IRR2, DISBURSAL_STATUS,LOAN_BRANCH,NPA_FLAG,CUSTOMER_NAME
  into    V_LOAN_ID, V_DEAL_ID, v_LOAN_PRODUCT, v_LOAN_SCHEME, v_LOAN_PROMO_SCHEME, v_LOAN_PRODUCT_TYPE, v_LOAN_INITIATION_DATE,
	  v_LOAN_APPROVAL_DATE, v_LOAN_DISBURSAL_DATE, v_LOAN_REPAY_EFF_DATE, v_LOAN_LOAN_AMOUNT, v_LOAN_TENURE, v_LOAN_REPAYMENT_FREQ, v_LOAN_RATE_TYPE,
	  v_LOAN_RATE_METHOD, v_LOAN_FINAL_RATE, v_LOAN_REPAYMENT_TYPE, v_LOAN_INSTALLMENT_TYPE,  v_LOAN_INSTALLMENT_MODE,
	  v_LOAN_ADVANCE_INSTL, v_LOAN_DUE_DAY, V_LOAN_MATURITY_DATE, V_LOAN_EFF_RATE, V_LOAN_NO_OF_INSTALLMENT,
          V_FLAT_RATE, V_LOAN_EFF_RATE, V_MKTIRR1,V_MKTIRR2, V_DISBURSAL_STATUS,V_LOAN_BRANCH,V_NPA_FLAG,V_LOAN_CUSTOMER_NAME
  from CR_LOAN_DTL
JOIN   GCD_CUSTOMER_M ON CR_LOAN_DTL.LOAN_CUSTOMER_ID=GCD_CUSTOMER_M.CUSTOMER_ID
 where Loan_Id = V_LOAN_ID
   AND IFNULL(LOAN_REPAYMENT_TYPE, 'I') = 'I';
set v_LOAN_DUE_DAY=EXTRACT(DAY FROM V_NEXT_DUE_DATE) ;
Select DAYS_BASIS, DAYS_PER_YEAR, INSTL_ROUND_TYPE, INSTL_ROUNDING, INT_ROUND_TYPE, INT_ROUNDING, OPPORTUNITY_RATE
  INTO V_LOAN_DAYS_BASIS, V_LOAN_DAYS_PER_YEAR, V_INSTL_ROUND_TYPE, V_INSTL_ROUNDING,V_INT_ROUND_TYPE, V_INT_ROUNDING, V_OPPORTUNITY_INTEREST
  from CR_PRODUCT_M
 Where PRODUCT_ID = V_LOAN_PRODUCT;
insert into Instl_Plan_TEMP (P_RECOVERY_TYPE, P_LOAN_ID, P_SEQ_NO, P_FROM_INSTL_NO, P_TO_INSTL_NO,
                             P_RECOVERY_PERCENT, P_PRINCIPAL_AMOUNT, P_INSTALLMENT_AMOUNT)
                      select RECOVERY_TYPE, LOAN_ID, SEQ_NO, FROM_INSTL_NO, TO_INSTL_NO,
                             RECOVERY_PERCENT, PRINCIPAL_AMOUNT, INSTALLMENT_AMOUNT
                        FROM CR_INSTALLMENT_PLAN WHERE LOAN_ID = V_LOAN_ID;
INSERT INTO Repay_Temp (R_LOAN_ID, R_Seq_No, R_Org_Due_Date, R_Due_Date, R_Instl_Amount, R_Prin_Comp, R_Int_Comp, R_EXCESS_Int_Comp,
                        R_Prin_OS, R_EFFRATE, R_ADV_FLAG, R_BILL_FLAG, R_Count, R_REC_TYPE, R_ORG_SEQ_NO, R_OTHER_CHARGES)
                 SELECT LOAN_ID, INSTL_NO, INSTL_DATE, INSTL_DATE, INSTL_AMOUNT, PRIN_COMP, INT_COMP, EXCESS_INT,
                        PRIN_OS, INTEREST_RATE, ADV_FLAG, BILL_FLAG, 0, IFNULL(REC_TYPE, 'I'), SEQ_NO, OTHER_CHARGES
                   FROM CR_REPAYSCH_DTL
                  WHERE LOAN_ID = V_LOAN_ID
               ORDER BY INSTL_NO;
SET V_FREQ_MONTHS = GET_FREQ_MONTHS (V_LOAN_REPAYMENT_FREQ);
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 - V_EXCESS_INT_COMP;
   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 = 0,
          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;
    SET V_INSTL_AMOUNT = V_PRIN_COMP + V_INT_COMP + V_EXCESS_INT_COMP;
    SET V_PRIN_OS = 0;
    
    UPDATE REPAY_TEMP
      SET R_INSTL_AMOUNT = R_INSTL_AMOUNT + V_EXCESS_INT_COMP,
          R_PRIN_COMP = V_PRIN_COMP,
          R_INT_COMP = 0,
          R_EXCESS_INT_COMP = V_EXCESS_INT_COMP,
          R_PRIN_OS = V_PRIN_OS
    WHERE R_LOAN_ID = V_LOAN_ID
      AND R_SEQ_NO = V_SEQ_NO + 1; 
END IF;

   SET O_FLAT_RATE	= V_FLAT_RATE;
   SET O_LOAN_EFF_RATE	= V_LOAN_EFF_RATE;
   SET O_MKTIRR1	= V_MKTIRR1;
   SET O_MKTIRR2	= V_MKTIRR2;
IF I_STATUS ='A' THEN

 SELECT MAX(INSTL_DATE) INTO V_LAST_DUE_DATE  FROM CR_REPAYSCH_DTL WHERE LOAN_ID= V_LOAN_ID;
 IF V_LOAN_INSTALLMENT_MODE='A' THEN
   SET V_INSTL_NO = 2;
 ELSE
   SET V_INSTL_NO = 1;
 END IF;
 SELECT V_NEXT_DUE_DATE = INSTL_DATE FROM CR_REPAYSCH_DTL  WHERE LOAN_ID = V_LOAN_ID AND INSTL_NO=V_INSTL_NO LIMIT 1;
  UPDATE CR_LOAN_DTL
  SET LOAN_DUE_DAY=EXTRACT(DAY FROM V_NEXT_DUE_DATE) ,
  LOAN_MATURITY_DATE = IF(LOAN_INSTALLMENT_MODE='A', DATE_ADD(V_LAST_DUE_DATE, INTERVAL GET_FREQ_MONTHS(LOAN_REPAYMENT_FREQ) MONTH), V_LAST_DUE_DATE),
  NEXT_DUE_DATE=V_NEXT_DUE_DATE
  WHERE LOAN_ID =  V_LOAN_ID ;

  SELECT IFNULL(SUM(IFNULL(INT_COMP,0)),0) + IFNULL(SUM(IFNULL(EXCESS_INT,0)),0)
     INTO V_OLD_INTEREST
     FROM CR_REPAYSCH_DTL
    WHERE LOAN_ID = V_LOAN_ID;
   SET V_REPAY_HST_ID =       function_sequence('REPAY_HST_ID');
   INSERT INTO CR_REPAYSCH_DTL_HST (REPAY_HST_ID, REPAYSCH_ID, LOAN_ID, INSTL_NO, INSTL_DATE, INSTL_AMOUNT, PRIN_COMP, INT_COMP, EXCESS_INT,
                                    OTHER_CHARGES, BILL_FLAG, INSTL_AMOUNT_RECD, PRIN_COMP_RECD, INT_COMP_RECD, EXCESS_INT_RECD,
                                    OTHER_CHARGES_RECD, LAST_PMNT_DATE, LAST_OD_CALC_DATE, TOTAL_OD_AMOUNT, INTEREST_RATE, ADV_FLAG,
                                    DISBURSAL_AMOUNT, PRIN_OS, REC_STATUS, MAKER_ID, MAKER_DATE, AUTHOR_ID, AUTHOR_DATE,MVMT_BY, MVMT_DATE, REC_TYPE, SEQ_NO)
                            SELECT V_REPAY_HST_ID, REPAYSCH_ID, LOAN_ID, INSTL_NO, INSTL_DATE, INSTL_AMOUNT, PRIN_COMP, INT_COMP, EXCESS_INT,
                                    OTHER_CHARGES, BILL_FLAG, INSTL_AMOUNT_RECD, PRIN_COMP_RECD, INT_COMP_RECD, EXCESS_INT_RECD,
                                    OTHER_CHARGES_RECD, LAST_PMNT_DATE, LAST_OD_CALC_DATE, TOTAL_OD_AMOUNT, INTEREST_RATE, ADV_FLAG,
                                    DISBURSAL_AMOUNT, PRIN_OS, REC_STATUS, MAKER_ID, MAKER_DATE, AUTHOR_ID, AUTHOR_DATE, I_USER_ID, I_CURR_DATE, REC_TYPE, SEQ_NO
                               FROM CR_REPAYSCH_DTL
                              WHERE LOAN_ID = V_LOAN_ID
                           ORDER BY LOAN_ID, INSTL_NO;
   DELETE FROM CR_REPAYSCH_DTL WHERE LOAN_ID = V_LOAN_ID AND INSTL_DATE > V_RESCH_EFF_DATE;
   INSERT INTO CR_REPAYSCH_DTL(LOAN_ID, INSTL_NO, INSTL_DATE, INSTL_AMOUNT, PRIN_COMP, INT_COMP, EXCESS_INT, BILL_FLAG,
                               INSTL_AMOUNT_RECD, PRIN_COMP_RECD, INT_COMP_RECD, EXCESS_INT_RECD,
                               TOTAL_OD_AMOUNT, INTEREST_RATE, ADV_FLAG, PRIN_OS, REC_STATUS, REC_TYPE, SEQ_NO, OTHER_CHARGES)
                        SELECT R_LOAN_ID, R_Seq_No, R_Due_Date, R_Instl_Amount, R_Prin_Comp, R_Int_Comp, R_EXCESS_Int_Comp, 'N',
                               0, 0, 0, 0,
                               0, V_LOAN_EFF_RATE, R_ADV_FLAG, R_PRIN_OS, 'A', R_REC_TYPE, R_ORG_SEQ_NO, R_OTHER_CHARGES
                          FROM Repay_Temp
                         WHERE R_LOAN_ID = V_LOAN_ID
                           AND R_Due_Date > V_RESCH_EFF_DATE
                      ORDER BY R_LOAN_ID, R_Seq_No;
   SELECT PARAMETER_VALUE INTO I_DEPARTMENT
     FROM PARAMETER_MST
    WHERE PARAMETER_KEY = 'CMDEPARTMENT';
   IF DONE = 1 THEN
      SET DONE = 0;
      SET I_DEPARTMENT = '';
   END IF;
   SELECT COUNT(*) INTO V_COUNT
     FROM CR_SCHEME_ACCOUNTING_DTL
    WHERE SCHEME_ID = V_LOAN_SCHEME
      AND STAGE_ID = 'DDA'
      AND ACCOUNTING_FLAG = 'Y';
   IF V_COUNT > 0 THEN
      SET V_ACCOUNTING_FLAG = 'Y';
   ELSE
      SET V_ACCOUNTING_FLAG = 'N';
   END IF;
   SELECT IFNULL(SUM(IFNULL(INT_COMP,0)),0) + IFNULL(SUM(IFNULL(EXCESS_INT,0)),0)
     INTO V_NEW_INTEREST
     FROM CR_REPAYSCH_DTL
    WHERE LOAN_ID = V_LOAN_ID;
   SET V_CHARGE_STR = '';
   SET V_CHARGE_AMT = 0;
   SET V_TAX_RATE1 = 0;
   SET V_TAX_RATE2 = 0;
   SET V_TDS_RATE = 0;
   SET V_TAX_AMOUNT1 = 0;
   SET V_TAX_AMOUNT2 = 0;
   SET V_TDS_AMOUNT = 0;
   IF (IFNULL(V_NEW_INTEREST,0) - IFNULL(V_OLD_INTEREST,0)) <> 0 AND O_ERROR_FLAG = 'S' AND V_DISBURSAL_STATUS = 'F' THEN
      SET V_CHARGE_CODE = 41;
      SET V_CHARGE_AMT = (IFNULL(V_NEW_INTEREST,0) - IFNULL(V_OLD_INTEREST,0));
      SET V_CHARGE_STR = CONCAT(V_CHARGE_STR, CAST(V_CHARGE_CODE AS CHAR),';', CAST(V_CHARGE_AMT AS CHAR), '|');
      SET V_TAX_RATE1 = 0;
      SET V_TAX_RATE2 = 0;
      SET V_TDS_RATE = 0;
      SET V_TAX_AMOUNT1 = 0;
      SET V_TAX_AMOUNT2 = 0;
      SET V_TDS_AMOUNT = 0;
      SET V_TXN_ADJUSTED_AMOUNT = 0;
   END IF;
   IF V_RESCH_CHARGES > 0 AND O_ERROR_FLAG = 'S' THEN
      SELECT IFNULL(DEAL_CHARGE_METHOD, 'F'), IFNULL(DEAL_CHARGE_TDS_APPLICABLE, 'N'), IFNULL(DEAL_CHARGE_TDS_RATE, 0),
             IFNULL(DEAL_CHARGE_TAX_APPLICABLE, 'N'), IFNULL(DEAL_CHARGE_TAX_INCLUSIVE, 'N'),
             IFNULL(DEAL_CHARGE_TAX_RATE1,0), IFNULL(DEAL_CHARGE_TAX_RATE2,0)
        INTO V_CHARGE_METHOD, V_TDS_APPLICABLE, V_TDS_RATE,
             V_TAX_APPLICABLE, V_TAX_INCLUSIVE, V_TAX_RATE1, V_TAX_RATE2
        FROM CR_TXNCHARGES_DTL
       WHERE TXN_TYPE = 'LIM'
         AND TXN_ID = V_LOAN_ID
         AND DEAL_CHARGE_CODE = 33
         AND REC_STATUS = 'A';
      IF DONE = 1 THEN
         SET DONE = 0;
         SET V_CHARGE_METHOD  = 'F';
         SET V_TDS_APPLICABLE = 'N';
         SET V_TDS_RATE       = 0;
         SET V_TAX_APPLICABLE = 'N';
         SET V_TAX_INCLUSIVE  = 'N';
         SET V_TAX_RATE1      = 0;
         SET V_TAX_RATE2      = 0;
         SET V_TAX_AMOUNT1 = 0;
         SET V_TAX_AMOUNT2 = 0;
         SET V_TDS_AMOUNT = 0;
         SET V_TXN_ADJUSTED_AMOUNT = 0;
      END IF;
      SET V_CHARGE_CODE = 33;
      SET V_CHARGE_AMOUNT = V_RESCH_CHARGES;
      SET V_TAX_AMOUNT1 = 0;
      SET V_TAX_AMOUNT2 = 0;
      SET V_TDS_AMOUNT = 0;
      SET V_TXN_ADJUSTED_AMOUNT = 0;
      SET V_BP_TYPE = 'CS';
      SET V_BP_ID = V_LOAN_CUSTOMER_ID;
      IF V_TAX_APPLICABLE = 'Y' THEN
         SET V_TAX_AMOUNT1 = ((100 * V_CHARGE_AMOUNT) / (100 + V_TAX_RATE1 + V_TAX_RATE2)) * V_TAX_RATE1 / 100;
         SET V_TAX_AMOUNT1 = Get_Rounded_value(V_TAX_AMOUNT1, 'U', 0);
         SET V_TAX_AMOUNT2 = ((100 * V_CHARGE_AMOUNT) / (100 + V_TAX_RATE1 + V_TAX_RATE2)) * V_TAX_RATE2 / 100;
         SET V_TAX_AMOUNT2 = Get_Rounded_value(V_TAX_AMOUNT2, 'U', 0);
         SET V_CHARGE_AMOUNT = V_CHARGE_AMOUNT;
      END IF;
      IF V_TDS_APPLICABLE = 'Y' THEN
         SET V_TDS_AMOUNT = V_CHARGE_AMOUNT * V_TDS_RATE / 100;
         SET V_TDS_AMOUNT = Get_Rounded_value(V_TDS_AMOUNT, 'U', 0);
      END IF;
      INSERT INTO CR_TXNADVICE_DTL (DEAL_ID, LOAN_ID, TXN_TYPE, TXN_ID, BP_TYPE, BP_ID, ADVICE_DATE, ADVICE_TYPE,
                              CHARGE_CODE_ID, ORG_CHARGE_AMOUNT, TAX_RATE1, TAX_RATE2, TDS_RATE, ORG_TAX_AMOUNT1,
                              ORG_TAX_AMOUNT2, ORG_TDS_AMOUNT, ORG_ADVICE_AMOUNT, WAIVE_OFF_AMOUNT, CHARGE_AMOUNT,
                              TAX_AMOUNT1, TAX_AMOUNT2, TDS_AMOUNT, ADVICE_AMOUNT, TXN_ADJUSTED_AMOUNT,
                              AMOUNT_IN_PROCESS, REC_STATUS, MAKER_ID, MAKER_DATE, AUTHOR_ID, AUTHOR_DATE)
                      VALUES (V_DEAL_ID, V_LOAN_ID, 'DDA', I_RESCH_ID,  'CS', V_LOAN_CUSTOMER_ID, V_RESCH_EFF_DATE, 'R',
		              V_CHARGE_CODE, (V_CHARGE_AMT-V_TAX_AMOUNT1-V_TAX_AMOUNT2), V_TAX_RATE1, V_TAX_RATE2, V_TDS_RATE, V_TAX_AMOUNT1,
		              V_TAX_AMOUNT2, V_TDS_AMOUNT, V_CHARGE_AMT, 0, (V_CHARGE_AMT-V_TAX_AMOUNT1-V_TAX_AMOUNT2),
			      V_TAX_AMOUNT1, V_TAX_AMOUNT2, V_TDS_AMOUNT, V_CHARGE_AMT, V_TXN_ADJUSTED_AMOUNT,
			      0, 'A', I_USER_ID, I_CURR_DATE, I_USER_ID, I_CURR_DATE);
      SET V_CHARGE_STR = CONCAT(V_CHARGE_STR, CAST(V_CHARGE_CODE AS CHAR),';', CAST((V_CHARGE_AMT-V_TAX_AMOUNT1-V_TAX_AMOUNT2) AS CHAR), '|');
   END IF;
IF V_ACCOUNTING_FLAG = 'Y' THEN
CALL GenerateVoucher(I_COMPANY_ID, V_LOAN_BRANCH, 'CMS',
                 V_LOAN_SCHEME, I_DEPARTMENT, '',
                 'DDA', V_NPA_FLAG, 0,
                 'CS', V_LOAN_CUSTOMER_ID, V_LOAN_CUSTOMER_NAME,
                 I_CURR_DATE, I_CURR_DATE,
                 V_LOAN_ID,  V_CHARGE_STR,
                 I_USER_ID, V_VOUCHER_STR, O_ERROR_FLAG, O_ERROR_MSG);
IF IFNULL(V_VOUCHER_STR, '') <> '' THEN
   VOUCHER_STR_LOOP: LOOP
      IF INSTR(V_VOUCHER_STR,'|') = 0 THEN
         LEAVE VOUCHER_STR_LOOP;
      END IF;
      SET V_VOUCHER_NO 	= SUBSTRING_INDEX(V_VOUCHER_STR, '|', 1);
      SET V_VOUCHER_STR 	= SUBSTR(V_VOUCHER_STR,INSTR(V_VOUCHER_STR,'|') + 1);
      INSERT INTO CR_LOAN_VOUCHER_DTL(LOAN_ID, TXN_TYPE, TXN_ID, TXN_DATE, VALUE_DATE,
                                      COMPANY_ID, BRANCH_ID, PRODUCT_ID, DEPARTMENT_ID,
                                      STAGE_ID, NPA_STAGE, BP_TYPE, BP_ID, VOUCHER_NO)
                               VALUES(V_LOAN_ID, 'DDA', I_RESCH_ID,  I_CURR_DATE, I_CURR_DATE,
                                      I_COMPANY_ID, V_LOAN_BRANCH, V_LOAN_SCHEME, I_DEPARTMENT,
                                      'DDA', V_NPA_FLAG, 'CS', V_LOAN_CUSTOMER_ID, V_VOUCHER_NO);
   END LOOP;
END IF;
END IF;
END IF;
IF IFNULL(O_ERROR_FLAG,'S') = 'S' AND I_STATUS <> 'T' THEN
UPDATE CR_RESCH_DTL
   SET REC_STATUS = I_STATUS,
       REMARKS    = I_REMARKS,
       AUTHOR_ID = I_USER_ID,
       AUTHOR_DATE = I_CURR_DATE
 WHERE RESCH_ID = I_RESCH_ID;
END IF;
END;
END
