Commit 5e46d028 authored by aali's avatar aali

Updated as per latest source provided by Piysuh sir


git-svn-id: http://15.206.35.175/svn/proteus/business-java/trunk@103461 ce508802-f39f-4f6c-b175-0d175dae99d5
parent 4746b5b4
......@@ -52,7 +52,8 @@ CREATE TYPE TFO_LOAN_INT_INFO AS OBJECT
AMORTISED_COST_CL_BAL NUMBER(12,3),
EMP_BENEFIT NUMBER(12,3),
DIFF_PRINC_DEDN NUMBER(12,3),
LOAN_INT_CALC_STR VARCHAR2(4000)
LOAN_INT_CALC_STR VARCHAR2(4000),
REPAYMENT_INCL_INTEREST_1 NUMBER(12,3),
)
/
CREATE TYPE TFT_LOAN_INT_INFO AS TABLE OF TFO_LOAN_INT_INFO
......@@ -700,1058 +701,9 @@ VALUES
COMMIT;
----- Modified on 17/06/2016.Start ----
CREATE TYPE TFO_LOAN_INT_INFO AS OBJECT
(
ACCT_PRD_ARG CHAR(6),
ACCT_PRD_DATA CHAR(6),
PRD_CODE__FR CHAR(6),
PRD_CODE__TO CHAR(6),
EMP_CODE CHAR(10),
EMP_FULL_NAME VARCHAR2(120),
PAY_SITE CHAR(5),
FIN_ENTITY CHAR(10),
CCTR_CODE__SAL CHAR(4),
LOAN_NO CHAR(15),
SCHEME_NO CHAR(10),
SCHEME_TYPE CHAR(5),
LOAN_AMT NUMBER(12,3),
TERM NUMBER(3),
INT_TERM CHAR(5),
ISSUE_DATE DATE,
LOAN_DISB_DATE DATE,
LOAN_START_RECO_DATE DATE,
LOAN_CLOUSRE_DATE DATE,
MON_INST NUMBER(12,3),
PRE_PAID_EMP_BENIFIT NUMBER(12,3),
INTEREST NUMBER(6,2),
ISA_EFF_INT_RATE NUMBER(6,2),
APPR_DATE DATE,
BALANCE_AMT NUMBER(12,3),
DATE__BALANCE DATE,
DATE__INTEREST DATE,
LOAN_TYPE CHAR(1),
EMI_NO NUMBER(10),
EMI_PRD_CODE CHAR(6),
EMI_PRD_DESCR VARCHAR2(10),
OP_BALANCE_AMT NUMBER(12,3),
INTEREST_AMT NUMBER(12,3),
PRINC_CUM_INTEREST_AMT NUMBER(12,3),
MON_DEDN NUMBER(12,3),
RECOVER_AMT NUMBER(12,3),
CL_BALANCE_AMT NUMBER(12,3),
PRINC_DEDN NUMBER(12,3),
PV_FACTOR NUMBER(10,4),
PRESENT_VALUE NUMBER(12,3),
AMORTISED_COST_OP_BAL NUMBER(12,3),
INTEREST_AT_EFF_RATE NUMBER(12,3),
REPAYMENT_INCL_INTEREST NUMBER(12,3),
AMORTISED_COST_CL_BAL NUMBER(12,3),
EMP_BENEFIT NUMBER(12,3),
DIFF_PRINC_DEDN NUMBER(12,3),
LOAN_INT_CALC_STR VARCHAR2(4000),
REPAYMENT_INCL_INTEREST_1 NUMBER(12,3)
)
/
CREATE TYPE TFT_LOAN_INT_INFO AS TABLE OF TFO_LOAN_INT_INFO
/
CREATE OR REPLACE
FUNCTION FN_TF_LOAN_INT_INFO
(
FIN_ENTITY_CODE_FR FINENT.FIN_ENTITY%TYPE,
FIN_ENTITY_CODE_TO FINENT.FIN_ENTITY%TYPE,
ACCT_PRD ACCTPRD.CODE%TYPE,
PRD_CODE__FR PERIOD.CODE%TYPE,
PRD_CODE__TO PERIOD.CODE%TYPE,
SITE_CODE__FR SITE.SITE_CODE%TYPE,
SITE_CODE__TO SITE.SITE_CODE%TYPE,
CCTR_CODE__FR EMPLOYEE.CCTR_CODE__SAL%TYPE,
CCTR_CODE__TO EMPLOYEE.CCTR_CODE__SAL%TYPE,
EMP_CODE__FR EMPLOYEE.EMP_CODE%TYPE,
EMP_CODE__TO EMPLOYEE.EMP_CODE%TYPE,
EFF_INT_RATE LOANS.INTEREST%TYPE
)
RETURN TFT_LOAN_INT_INFO
PIPELINED IS
OUT_REC TFO_LOAN_INT_INFO := TFO_LOAN_INT_INFO( NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
LI_CNT NUMBER(6);
LI_CNT1 NUMBER(6);
LI_CNT2 NUMBER(6);
EMI_NO NUMBER(6);
TOT_INST_DEDN NUMBER(6);
TOT_INST_NO NUMBER(6);
LC_LOAN_OP_BAL LOANS.LOAN_AMT%TYPE;
LC_LOAN_RECO LOANS.LOAN_AMT%TYPE;
LD_LOAN_CLOUSRE_DATE DATE;
LD_INT_FIRST_DATE DATE;
LD_INT_LAST_DATE DATE;
EMI_PRD_CODE PERIOD.CODE%TYPE;
EMI_PRD_DESCR PERIOD.DESCR%TYPE;
PV_FACTOR NUMBER(12,4);
PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
TOT_PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_OP_BAL LOANS.LOAN_AMT%TYPE;
INTEREST_AT_EFF_RATE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_CL_BAL LOANS.LOAN_AMT%TYPE;
EMP_BENEFIT LOANS.LOAN_AMT%TYPE;
DIFF_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_INT_DEDN LOANS.LOAN_AMT%TYPE;
LC_OTH_RECOVERY LOANS.LOAN_AMT%TYPE;
LC_EFF_INT_RATE LOANS.INTEREST%TYPE;
LS_EXCLUDE_SCHEME_TYPE VARCHAR2(1024);
LOAN_INT_CALC_STR VARCHAR2(4000);
ARG_ACCT_PRD_CODE ACCTPRD.CODE%TYPE;
LD_CAL_FDATE ACCTPRD.FR_DATE%TYPE;
LD_CAL_TDATE ACCTPRD.TO_DATE%TYPE;
LI_NO_DAYS_IN_CAL_YR NUMBER(3);
CURSOR LOAN_INFO(AS_EXCLUDE_SCHEME_TYPE VARCHAR2) IS
SELECT
LN.EMP_CODE AS EMP_CODE ,
TRIM(EM.EMP_FNAME) || ' ' || TRIM(EM.EMP_MNAME) || TRIM(EM.EMP_LNAME) AS EMP_FULL_NAME,
EM.PAY_SITE AS PAY_SITE,
EM.CCTR_CODE__SAL AS CCTR_CODE__SAL,
LN.LOAN_NO AS LOAN_NO,
LN.SCHEME_NO SCHEME_NO,
LN.ISSUE_DATE AS ISSUE_DATE,
LN.START_RECO AS START_RECO,
LN.TERM AS TERM,
LN.LOAN_AMT AS LOAN_AMT,
LN.INTEREST AS INTEREST,
LN.MON_INST AS MON_INST,
LN.INT_TERM AS INT_TERM,
LN.INTEREST_AMT AS INTEREST_AMT,
LN.RECOVER_AMT AS RECOVER_AMT,
LN.APPR_DATE AS APPR_DATE,
LN.BALANCE_AMT AS BALANCE_AMT,
LN.DATE__BALANCE AS DATE__BALANCE,
LN.DATE__INTEREST AS DATE__INTEREST,
LN.LOAN_TYPE AS LOAN_TYPE,
LN.ACT_TERM AS ACT_TERM,
AP.FR_DATE AS FY_FROM_DATE,
AP.TO_DATE AS FY_TO_DATE,
LS.AD_CODE__INT AS AD_CODE__INT,
LS.AD_CODE__DED AS AD_CODE__DED,
LS.SCHEME_TYPE AS SCHEME_TYPE,
SM.FIN_ENTITY AS FIN_ENTITY
FROM LOANS LN, EMPLOYEE EM, SITE SM, ACCTPRD AP, LOAN_SCHEME LS
WHERE EM.EMP_CODE = LN.EMP_CODE
AND LN.EMP_CODE >= EMP_CODE__FR
AND LN.EMP_CODE <= EMP_CODE__TO
AND EM.PAY_SITE >= SITE_CODE__FR
AND EM.PAY_SITE <= SITE_CODE__TO
AND SM.SITE_CODE = EM.PAY_SITE
--AND SM.FIN_ENTITY = FIN_ENTITY_CODE_FR
AND SM.FIN_ENTITY BETWEEN FIN_ENTITY_CODE_FR AND FIN_ENTITY_CODE_TO
AND LN.ISSUE_DATE <= AP.TO_DATE
AND AP.CODE = ACCT_PRD
AND LN.STATUS IN ('A','E')
AND LS.SCHEME_NO = LN.SCHEME_NO
--AND LS.SCHEME_TYPE NOT IN ('A','B')
-- AND LS.SCHEME_TYPE NOT IN (AS_EXCLUDE_SCHEME_TYPE)
AND LS.SCHEME_TYPE NOT IN ( SELECT regexp_substr(AS_EXCLUDE_SCHEME_TYPE, '[^,]+', 1, LEVEL)
token FROM dual CONNECT BY LEVEL <= length(AS_EXCLUDE_SCHEME_TYPE) -
length(REPLACE(AS_EXCLUDE_SCHEME_TYPE, ',', '')) + 1)
ORDER BY SM.FIN_ENTITY,LN.EMP_CODE,LN.ISSUE_DATE;
CURSOR PRD_INFO(START_DATE DATE) IS SELECT A.CODE,A.FR_DATE,A.TO_DATE,
A.ACCT_PRD AS P_ACCT_PRD,B.FR_DATE AS FY_FROM_DATE,B.TO_DATE AS FY_TO_DATE
FROM PERIOD A,ACCTPRD B
WHERE B.CODE = A.ACCT_PRD AND A.TO_DATE >= START_DATE ORDER BY TO_DATE;
CURSOR LOAN_INST_INFO(ARG_LOAN_NO CHAR) IS SELECT * FROM LOANS_SCHEDULE
WHERE LOAN_NO = ARG_LOAN_NO
AND (NO_INST <> NO_INST_DED OR (NO_INST IS NULL AND PRD_CODE IS NULL)) ORDER BY LINE_NO ;
CURSOR LOAN_RECO_INFO(ARG_LOAN_NO CHAR , ARG_FR_DATE DATE , ARG_TO_DATE DATE)
IS SELECT * FROM LOAN_REG WHERE LOAN_NO = ARG_LOAN_NO
AND TRAN_DATE BETWEEN ARG_FR_DATE AND ARG_TO_DATE
AND AMOUNT <> 0 AND TRAN_TYPE NOT IN ('P') AND
CASE WHEN INT_CALCULATED IS NULL THEN 'N' ELSE INT_CALCULATED END = 'N'
ORDER BY TRAN_DATE;
CURSOR LOAN_INT_CALC_INFO(ARG_LOAN_NO CHAR , ARG_PRD_CODE CHAR)
IS SELECT * FROM LOANS_INTEREST_DET WHERE LOAN_NO = ARG_LOAN_NO
AND PRD_CODE = ARG_PRD_CODE ORDER BY PRD_CODE,LINE_NO;
BEGIN
ARG_ACCT_PRD_CODE := ACCT_PRD;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PERIOD WHERE CODE BETWEEN PRD_CODE__FR AND PRD_CODE__TO
AND ACCT_PRD = ARG_ACCT_PRD_CODE;
IF LI_CNT2 = 0 THEN
RETURN;
END IF;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
IF LI_CNT2 > 0 THEN
SELECT TRIM(VAR_VALUE) INTO LS_EXCLUDE_SCHEME_TYPE FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
ELSE
LS_EXCLUDE_SCHEME_TYPE := '';
END IF;
IF LS_EXCLUDE_SCHEME_TYPE IS NULL OR LENGTH(TRIM(LS_EXCLUDE_SCHEME_TYPE)) = 0 THEN
LS_EXCLUDE_SCHEME_TYPE := '**********';
END IF;
DBMS_OUTPUT.PUT_LINE(LS_EXCLUDE_SCHEME_TYPE);
LI_CNT2 := 0;
FOR I IN LOAN_INFO(LS_EXCLUDE_SCHEME_TYPE)
LOOP
LI_CNT2 := LI_CNT2 + 1;
LI_CNT := 0;
LC_LOAN_OP_BAL := I.LOAN_AMT;
SELECT SUM(AMOUNT) INTO LC_LOAN_RECO FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_DATE < I.FY_FROM_DATE;
IF LC_LOAN_RECO IS NOT NULL THEN
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_LOAN_RECO;
END IF;
LI_CNT1 := 0;
SELECT COUNT(1), MIN(FROM_DATE) INTO LI_CNT1, LD_INT_FIRST_DATE FROM LOAN_INT_REG WHERE LOAN_NO=I.LOAN_NO ;
IF LI_CNT1 > 0 THEN
LD_INT_LAST_DATE := I.DATE__INTEREST + 1;
ELSE
LD_INT_LAST_DATE := I.DATE__INTEREST;
LD_INT_FIRST_DATE := I.DATE__INTEREST;
END IF;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
SELECT SUM(INT_RATE) INTO LC_EFF_INT_RATE FROM LOANSCHEME_INT_RATE
WHERE SCHEME_TYPE = I.SCHEME_TYPE AND LD_INT_FIRST_DATE BETWEEN EFF_FROM AND VALID_UPTO;
IF LC_EFF_INT_RATE IS NULL THEN
LC_EFF_INT_RATE := CASE WHEN EFF_INT_RATE IS NULL OR EFF_INT_RATE <= 0 THEN
I.INTEREST ELSE EFF_INT_RATE END;
END IF;
IF LC_EFF_INT_RATE <= I.INTEREST THEN
LC_LOAN_OP_BAL := 0;
END IF;
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := 0;
TOT_PRESENT_VALUE := 0;
LC_LOAN_OP_BAL := I.LOAN_AMT;
INSERT INTO PAYRPARM (PRD_CODE,VAR_NAME,VAR_TYPE,VAR_VALUE,DESCR,VAR_SUBS,CHG_DATE,CHG_USER,CHG_TERM)
VALUES
('999999','IAS_LNREPO_EXCL_SCHM','S','AD001','SCHEME TYPES TO EXCLUDE FROM ISA LOAN REPORT',null,FN_SYSDATE(),'BASE','BASE');
FOR J IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLL WHERE EMP_CODE = I.EMP_CODE
AND PRD_CODE = J.CODE;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
IF I.START_RECO <= J.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K.NO_INST IS NULL THEN 9999
ELSE K.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_LOAN_OP_BAL > K.AMOUNT THEN K.AMOUNT ELSE LC_LOAN_OP_BAL END;
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
FOR L IN LOAN_RECO_INFO(I.LOAN_NO, J.FR_DATE, J.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
IF TRIM(I.INT_TERM) = 'EMI' THEN
LC_PRINC_DEDN := I.MON_INST - LC_INT_DEDN;
ELSE
LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
TOT_PRESENT_VALUE := TOT_PRESENT_VALUE + PRESENT_VALUE;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
LD_LOAN_CLOUSRE_DATE := J.TO_DATE;
ELSE
EXIT;
END IF;
END LOOP;
IF LD_LOAN_CLOUSRE_DATE >= I.FY_FROM_DATE THEN
LC_LOAN_OP_BAL := I.LOAN_AMT;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LC_PRINC_DEDN := 0;
EMI_NO := 0;
FOR J IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
IF LC_LOAN_OP_BAL > 0 THEN
LC_OTH_RECOVERY := 0;
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLL WHERE EMP_CODE = I.EMP_CODE
AND PRD_CODE = J.CODE;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
IF I.START_RECO <= J.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K.NO_INST IS NULL THEN 999999
ELSE K.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_LOAN_OP_BAL > K.AMOUNT THEN K.AMOUNT ELSE LC_LOAN_OP_BAL END;
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LOAN_INT_CALC_STR := '';
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := 0.00;
-- Modified to calculate interest as per ERP.End
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
FOR M IN LOAN_INT_CALC_INFO(I.LOAN_NO , J.CODE)
LOOP
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[AI-' || M.REF_TYPE || '-' ||
TRIM(TO_CHAR(M.AMOUNT)) ||
'-' || TO_CHAR(M.DATE__FROM , 'DD-MON-YY') || '-' ||
'-' || TO_CHAR(M.DATE__TO , 'DD-MON-YY') || '-' ||
'-' || TRIM(TO_CHAR(M.NO_DAYS)) || '-' ||
TRIM(TO_CHAR(M.INT_PERC)) || '-' ||
TRIM(TO_CHAR(M.INTEREST_AMT__DIFF)) || ']';
END LOOP;
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LOANBL-' ||
TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || '-' ||
TO_CHAR(CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END , 'DD-MON-YY') || '-' ||
TO_CHAR(J.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR(LC_INT_DEDN)) || ']' ;
FOR L IN LOAN_RECO_INFO(I.LOAN_NO, J.FR_DATE, J.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LNRECO-' ||
TRIM(TO_CHAR(L.AMOUNT)) || '-' ||
TO_CHAR(L.TRAN_DATE , 'DD-MON-YY') || '-' ||
TO_CHAR(J.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J.TO_DATE - L.TRAN_DATE) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR((ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2)))) || ']' ;
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE - (ROUND((L.AMOUNT * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
-- Modified to calculate interest as per ERP.End
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
IF TRIM(I.INT_TERM) = 'EMI' THEN
LC_PRINC_DEDN := I.MON_INST - LC_INT_DEDN;
ELSE
LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
AMORTISED_COST_OP_BAL := CASE WHEN EMI_NO = 1 THEN TOT_PRESENT_VALUE ELSE AMORTISED_COST_CL_BAL END;
-- Commented and shofted above to calculate interest as per ERP logic
-- INTEREST_AT_EFF_RATE := ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE + (ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2));
-- Commented and modified bellow to set cl bal 0 on clauser of loan.Start
--AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
if LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 then
AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
else
AMORTISED_COST_CL_BAL := 0;
end if;
-- Commented and modified bellow to set cl bal 0 on clauser of loan.End
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
EMP_BENEFIT := INTEREST_AT_EFF_RATE - LC_INT_DEDN;
DIFF_PRINC_DEDN := (LC_LOAN_OP_BAL - (LC_PRINC_DEDN + LC_OTH_RECOVERY)) - AMORTISED_COST_CL_BAL;
OUT_REC.ACCT_PRD_ARG := ACCT_PRD;
OUT_REC.ACCT_PRD_DATA := J.P_ACCT_PRD;
OUT_REC.PRD_CODE__FR := PRD_CODE__FR;
OUT_REC.PRD_CODE__TO := PRD_CODE__TO;
OUT_REC.FIN_ENTITY := I.FIN_ENTITY;
OUT_REC.EMP_CODE := I.EMP_CODE;
OUT_REC.EMP_FULL_NAME := I.EMP_FULL_NAME;
OUT_REC.PAY_SITE := I.PAY_SITE;
OUT_REC.CCTR_CODE__SAL := I.CCTR_CODE__SAL;
OUT_REC.LOAN_NO := I.LOAN_NO;
OUT_REC.SCHEME_NO := I.SCHEME_NO;
OUT_REC.SCHEME_TYPE := I.SCHEME_TYPE;
OUT_REC.ISSUE_DATE := I.ISSUE_DATE;
OUT_REC.LOAN_DISB_DATE := LD_INT_FIRST_DATE;
OUT_REC.TERM := I.TERM;
OUT_REC.LOAN_AMT := I.LOAN_AMT;
OUT_REC.INTEREST := I.INTEREST;
OUT_REC.MON_INST := I.MON_INST;
OUT_REC.INT_TERM := I.INT_TERM;
OUT_REC.APPR_DATE := I.APPR_DATE;
OUT_REC.DATE__BALANCE := I.DATE__BALANCE;
OUT_REC.DATE__INTEREST := I.DATE__INTEREST;
OUT_REC.LOAN_TYPE := I.LOAN_TYPE;
OUT_REC.LOAN_CLOUSRE_DATE := LD_LOAN_CLOUSRE_DATE;
OUT_REC.ISA_EFF_INT_RATE := LC_EFF_INT_RATE;
OUT_REC.BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.LOAN_START_RECO_DATE := I.START_RECO;
OUT_REC.EMI_NO := EMI_NO;
OUT_REC.EMI_PRD_CODE := J.CODE;
OUT_REC.EMI_PRD_DESCR := TO_CHAR(J.FR_DATE , 'MON-YY');
OUT_REC.OP_BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.INTEREST_AMT := LC_INT_DEDN;
OUT_REC.PRINC_CUM_INTEREST_AMT := (LC_LOAN_OP_BAL + LC_INT_DEDN);
OUT_REC.MON_DEDN := (LC_PRINC_DEDN + LC_INT_DEDN);
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.RECOVER_AMT := LC_OTH_RECOVERY;
OUT_REC.CL_BALANCE_AMT := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
OUT_REC.PV_FACTOR := PV_FACTOR;
OUT_REC.PRESENT_VALUE := PRESENT_VALUE;
OUT_REC.AMORTISED_COST_OP_BAL := AMORTISED_COST_OP_BAL;
OUT_REC.INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE;
OUT_REC.REPAYMENT_INCL_INTEREST := (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ;
OUT_REC.AMORTISED_COST_CL_BAL := AMORTISED_COST_CL_BAL;
OUT_REC.EMP_BENEFIT := EMP_BENEFIT;
OUT_REC.DIFF_PRINC_DEDN := DIFF_PRINC_DEDN;
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.LOAN_INT_CALC_STR := LOAN_INT_CALC_STR;
OUT_REC.REPAYMENT_INCL_INTEREST_1 := CASE WHEN LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 THEN (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ELSE AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE END;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
pipe row ( out_rec );
ELSE
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END LOOP;
RETURN ;
END;
/
----- Modified on 17/06/2016.End ----
----- Modified on 12/07/2016.Start ----
CREATE OR REPLACE
FUNCTION FN_TF_LOAN_INT_INFO
(
FIN_ENTITY_CODE_FR FINENT.FIN_ENTITY%TYPE,
FIN_ENTITY_CODE_TO FINENT.FIN_ENTITY%TYPE,
ACCT_PRD ACCTPRD.CODE%TYPE,
PRD_CODE__FR PERIOD.CODE%TYPE,
PRD_CODE__TO PERIOD.CODE%TYPE,
SITE_CODE__FR SITE.SITE_CODE%TYPE,
SITE_CODE__TO SITE.SITE_CODE%TYPE,
CCTR_CODE__FR EMPLOYEE.CCTR_CODE__SAL%TYPE,
CCTR_CODE__TO EMPLOYEE.CCTR_CODE__SAL%TYPE,
EMP_CODE__FR EMPLOYEE.EMP_CODE%TYPE,
EMP_CODE__TO EMPLOYEE.EMP_CODE%TYPE,
EFF_INT_RATE LOANS.INTEREST%TYPE
)
RETURN TFT_LOAN_INT_INFO
PIPELINED IS
OUT_REC TFO_LOAN_INT_INFO := TFO_LOAN_INT_INFO( NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
LI_CNT NUMBER(6);
LI_CNT1 NUMBER(6);
LI_CNT2 NUMBER(6);
EMI_NO NUMBER(6);
TOT_INST_DEDN NUMBER(6);
TOT_INST_NO NUMBER(6);
LC_LOAN_OP_BAL LOANS.LOAN_AMT%TYPE;
LC_LOAN_RECO LOANS.LOAN_AMT%TYPE;
LD_LOAN_CLOUSRE_DATE DATE;
LD_INT_FIRST_DATE DATE;
LD_INT_LAST_DATE DATE;
EMI_PRD_CODE PERIOD.CODE%TYPE;
EMI_PRD_DESCR PERIOD.DESCR%TYPE;
PV_FACTOR NUMBER(12,4);
PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
TOT_PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_OP_BAL LOANS.LOAN_AMT%TYPE;
INTEREST_AT_EFF_RATE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_CL_BAL LOANS.LOAN_AMT%TYPE;
EMP_BENEFIT LOANS.LOAN_AMT%TYPE;
DIFF_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_INT_DEDN LOANS.LOAN_AMT%TYPE;
LC_OTH_RECOVERY LOANS.LOAN_AMT%TYPE;
LC_EFF_INT_RATE LOANS.INTEREST%TYPE;
LS_EXCLUDE_SCHEME_TYPE VARCHAR2(1024);
LOAN_INT_CALC_STR VARCHAR2(4000);
ARG_ACCT_PRD_CODE ACCTPRD.CODE%TYPE;
LD_CAL_FDATE ACCTPRD.FR_DATE%TYPE;
LD_CAL_TDATE ACCTPRD.TO_DATE%TYPE;
LI_NO_DAYS_IN_CAL_YR NUMBER(3);
LC_TEMP_RECO LOANS.LOAN_AMT%TYPE;
LC_TEMP_BAL LOANS.LOAN_AMT%TYPE;
LC_PROJ_INST LOANS.LOAN_AMT%TYPE;
CURSOR LOAN_INFO(AS_EXCLUDE_SCHEME_TYPE VARCHAR2) IS
SELECT
LN.EMP_CODE AS EMP_CODE ,
TRIM(EM.EMP_FNAME) || ' ' || TRIM(EM.EMP_MNAME) || TRIM(EM.EMP_LNAME) AS EMP_FULL_NAME,
EM.PAY_SITE AS PAY_SITE,
EM.CCTR_CODE__SAL AS CCTR_CODE__SAL,
LN.LOAN_NO AS LOAN_NO,
LN.SCHEME_NO SCHEME_NO,
LN.ISSUE_DATE AS ISSUE_DATE,
LN.START_RECO AS START_RECO,
LN.TERM AS TERM,
LN.LOAN_AMT AS LOAN_AMT,
LN.INTEREST AS INTEREST,
LN.MON_INST AS MON_INST,
LN.INT_TERM AS INT_TERM,
LN.INTEREST_AMT AS INTEREST_AMT,
LN.RECOVER_AMT AS RECOVER_AMT,
LN.APPR_DATE AS APPR_DATE,
LN.BALANCE_AMT AS BALANCE_AMT,
LN.DATE__BALANCE AS DATE__BALANCE,
LN.DATE__INTEREST AS DATE__INTEREST,
LN.LOAN_TYPE AS LOAN_TYPE,
LN.ACT_TERM AS ACT_TERM,
AP.FR_DATE AS FY_FROM_DATE,
AP.TO_DATE AS FY_TO_DATE,
LS.AD_CODE__INT AS AD_CODE__INT,
LS.AD_CODE__DED AS AD_CODE__DED,
LS.SCHEME_TYPE AS SCHEME_TYPE,
SM.FIN_ENTITY AS FIN_ENTITY
FROM LOANS LN, EMPLOYEE EM, SITE SM, ACCTPRD AP, LOAN_SCHEME LS
WHERE EM.EMP_CODE = LN.EMP_CODE
AND LN.EMP_CODE >= EMP_CODE__FR
AND LN.EMP_CODE <= EMP_CODE__TO
AND EM.PAY_SITE >= SITE_CODE__FR
AND EM.PAY_SITE <= SITE_CODE__TO
AND SM.SITE_CODE = EM.PAY_SITE
--AND SM.FIN_ENTITY = FIN_ENTITY_CODE_FR
AND SM.FIN_ENTITY BETWEEN FIN_ENTITY_CODE_FR AND FIN_ENTITY_CODE_TO
AND LN.ISSUE_DATE <= AP.TO_DATE
AND AP.CODE = ACCT_PRD
AND LN.STATUS IN ('A','E')
AND LS.SCHEME_NO = LN.SCHEME_NO
--AND LS.SCHEME_TYPE NOT IN ('A','B')
-- AND LS.SCHEME_TYPE NOT IN (AS_EXCLUDE_SCHEME_TYPE)
AND LS.SCHEME_TYPE NOT IN ( SELECT regexp_substr(AS_EXCLUDE_SCHEME_TYPE, '[^,]+', 1, LEVEL)
token FROM dual CONNECT BY LEVEL <= length(AS_EXCLUDE_SCHEME_TYPE) -
length(REPLACE(AS_EXCLUDE_SCHEME_TYPE, ',', '')) + 1)
ORDER BY SM.FIN_ENTITY,LN.EMP_CODE,LN.ISSUE_DATE;
CURSOR PRD_INFO(START_DATE DATE) IS SELECT A.CODE,A.FR_DATE,A.TO_DATE,
A.ACCT_PRD AS P_ACCT_PRD,B.FR_DATE AS FY_FROM_DATE,B.TO_DATE AS FY_TO_DATE
FROM PERIOD A,ACCTPRD B
WHERE B.CODE = A.ACCT_PRD AND A.TO_DATE >= START_DATE ORDER BY TO_DATE;
CURSOR LOAN_INST_INFO(ARG_LOAN_NO CHAR) IS SELECT * FROM LOANS_SCHEDULE
WHERE LOAN_NO = ARG_LOAN_NO
AND (NO_INST <> NO_INST_DED OR (NO_INST IS NULL AND PRD_CODE IS NULL)) ORDER BY LINE_NO ;
CURSOR LOAN_RECO_INFO(ARG_LOAN_NO CHAR , ARG_FR_DATE DATE , ARG_TO_DATE DATE)
IS SELECT * FROM LOAN_REG WHERE LOAN_NO = ARG_LOAN_NO
AND TRAN_DATE BETWEEN ARG_FR_DATE AND ARG_TO_DATE
AND AMOUNT <> 0 AND TRAN_TYPE NOT IN ('P') AND
CASE WHEN INT_CALCULATED IS NULL THEN 'N' ELSE INT_CALCULATED END = 'N'
ORDER BY TRAN_DATE;
CURSOR LOAN_INT_CALC_INFO(ARG_LOAN_NO CHAR , ARG_PRD_CODE CHAR)
IS SELECT * FROM LOANS_INTEREST_DET WHERE LOAN_NO = ARG_LOAN_NO
AND PRD_CODE = ARG_PRD_CODE ORDER BY PRD_CODE,LINE_NO;
BEGIN
ARG_ACCT_PRD_CODE := ACCT_PRD;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PERIOD WHERE CODE BETWEEN PRD_CODE__FR AND PRD_CODE__TO
AND ACCT_PRD = ARG_ACCT_PRD_CODE;
IF LI_CNT2 = 0 THEN
RETURN;
END IF;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
IF LI_CNT2 > 0 THEN
SELECT TRIM(VAR_VALUE) INTO LS_EXCLUDE_SCHEME_TYPE FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
ELSE
LS_EXCLUDE_SCHEME_TYPE := '';
END IF;
IF LS_EXCLUDE_SCHEME_TYPE IS NULL OR LENGTH(TRIM(LS_EXCLUDE_SCHEME_TYPE)) = 0 THEN
LS_EXCLUDE_SCHEME_TYPE := '**********';
END IF;
--DBMS_OUTPUT.PUT_LINE(LS_EXCLUDE_SCHEME_TYPE);
LI_CNT2 := 0;
FOR I IN LOAN_INFO(LS_EXCLUDE_SCHEME_TYPE)
LOOP
LI_CNT2 := LI_CNT2 + 1;
LI_CNT := 0;
LC_PROJ_INST := 0.00;
LC_LOAN_OP_BAL := I.LOAN_AMT;
SELECT SUM(AMOUNT) INTO LC_LOAN_RECO FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_DATE < I.FY_FROM_DATE;
IF LC_LOAN_RECO IS NOT NULL THEN
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_LOAN_RECO;
END IF;
LI_CNT1 := 0;
SELECT COUNT(1), MIN(FROM_DATE) INTO LI_CNT1, LD_INT_FIRST_DATE FROM LOAN_INT_REG WHERE LOAN_NO=I.LOAN_NO ;
IF LI_CNT1 > 0 THEN
LD_INT_LAST_DATE := I.DATE__INTEREST + 1;
ELSE
LD_INT_LAST_DATE := I.DATE__INTEREST;
LD_INT_FIRST_DATE := I.DATE__INTEREST;
END IF;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
SELECT SUM(INT_RATE) INTO LC_EFF_INT_RATE FROM LOANSCHEME_INT_RATE
WHERE SCHEME_TYPE = I.SCHEME_TYPE AND LD_INT_FIRST_DATE BETWEEN EFF_FROM AND VALID_UPTO;
IF LC_EFF_INT_RATE IS NULL THEN
LC_EFF_INT_RATE := CASE WHEN EFF_INT_RATE IS NULL OR EFF_INT_RATE <= 0 THEN
I.INTEREST ELSE EFF_INT_RATE END;
END IF;
IF LC_EFF_INT_RATE <= I.INTEREST THEN
LC_LOAN_OP_BAL := 0;
END IF;
--DBMS_OUTPUT.PUT_LINE('EMP CODE [' || TRIM(I.EMP_CODE) || '] LOAN NO [' || I.LOAN_NO || '] OP BALANCE [' || TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || ']');
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := 0;
TOT_PRESENT_VALUE := 0;
LC_LOAN_OP_BAL := I.LOAN_AMT;
FOR J IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
LC_PROJ_INST := 0.00;
LC_PRINC_DEDN := 0;
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
LC_TEMP_RECO := 0.00;
LC_TEMP_BAL := LC_LOAN_OP_BAL;
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_TEMP_RECO FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE NOT IN ('P') AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LC_TEMP_RECO IS NOT NULL THEN
LC_TEMP_BAL := LC_TEMP_BAL - LC_TEMP_RECO;
END IF;
LC_TEMP_RECO := 0.00;
LC_PROJ_INST := I.MON_INST;
LC_PRINC_DEDN := I.MON_INST;
IF I.START_RECO <= J.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K.NO_INST IS NULL THEN 9999
ELSE K.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_TEMP_BAL > K.AMOUNT THEN K.AMOUNT ELSE LC_TEMP_BAL END;
LC_PROJ_INST := K.AMOUNT;
--DBMS_OUTPUT.PUT_LINE('EXITED FROM K LOOP');
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
FOR L IN LOAN_RECO_INFO(I.LOAN_NO, J.FR_DATE, J.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
LC_PRINC_DEDN := NVL(LC_PRINC_DEDN , 0);
LC_INT_DEDN := NVL(LC_INT_DEDN , 0);
LC_PROJ_INST := NVL(LC_PROJ_INST , 0);
IF TRIM(I.INT_TERM) = 'EMI' THEN
IF LC_PROJ_INST > 0 THEN
IF LC_PRINC_DEDN = LC_PROJ_INST THEN
LC_PRINC_DEDN := LC_PRINC_DEDN - LC_INT_DEDN;
END IF;
END IF;
--ELSE
-- LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
LC_PRINC_DEDN := NVL(LC_PRINC_DEDN , 0);
LC_INT_DEDN := NVL(LC_INT_DEDN , 0);
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL - LC_OTH_RECOVERY THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL - LC_OTH_RECOVERY;
END IF;
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
TOT_PRESENT_VALUE := TOT_PRESENT_VALUE + PRESENT_VALUE;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
LD_LOAN_CLOUSRE_DATE := J.TO_DATE;
ELSE
--DBMS_OUTPUT.PUT_LINE('EXITED FROM J LOOP');
EXIT;
END IF;
END LOOP;
--DBMS_OUTPUT.PUT_LINE('EMP CODE [' || TRIM(I.EMP_CODE) || '] LOAN NO [' || I.LOAN_NO || '] OP BALANCE [' || TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || '] CL DATE [' || TO_CHAR(LD_LOAN_CLOUSRE_DATE , 'DD-MON-YYYY') || ']' );
IF LD_LOAN_CLOUSRE_DATE >= I.FY_FROM_DATE THEN
LC_LOAN_OP_BAL := I.LOAN_AMT;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LC_PRINC_DEDN := 0;
EMI_NO := 0;
FOR J1 IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J1.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J1.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
LC_PROJ_INST := 0.00;
LC_PRINC_DEDN := 0;
IF LC_LOAN_OP_BAL > 0 THEN
LC_OTH_RECOVERY := 0;
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J1.FR_DATE AND J1.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J1.FR_DATE AND J1.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J1.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J1.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
LC_TEMP_RECO := 0;
LC_TEMP_BAL := LC_LOAN_OP_BAL;
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END) INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J1.FR_DATE AND J1.TO_DATE;
IF LC_TEMP_RECO IS NOT NULL THEN
LC_TEMP_BAL := LC_TEMP_BAL - LC_TEMP_RECO;
END IF;
LC_TEMP_RECO := 0;
LC_PROJ_INST := I.MON_INST;
LC_PRINC_DEDN := I.MON_INST;
IF I.START_RECO <= J1.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K1 IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K1.NO_INST IS NULL THEN 999999
ELSE K1.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_LOAN_OP_BAL > K1.AMOUNT THEN K1.AMOUNT ELSE LC_LOAN_OP_BAL END;
LC_PROJ_INST := K1.AMOUNT;
--DBMS_OUTPUT.PUT_LINE('EXITED FROM K1 LOOP');
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LOAN_INT_CALC_STR := '';
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := 0.00;
-- Modified to calculate interest as per ERP.End
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J1.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J1.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
FOR M1 IN LOAN_INT_CALC_INFO(I.LOAN_NO , J1.CODE)
LOOP
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[AI-' || M1.REF_TYPE || '-' ||
TRIM(TO_CHAR(M1.AMOUNT)) ||
'-' || TO_CHAR(M1.DATE__FROM , 'DD-MON-YY') || '-' ||
'-' || TO_CHAR(M1.DATE__TO , 'DD-MON-YY') || '-' ||
'-' || TRIM(TO_CHAR(M1.NO_DAYS)) || '-' ||
TRIM(TO_CHAR(M1.INT_PERC)) || '-' ||
TRIM(TO_CHAR(M1.INTEREST_AMT__DIFF)) || ']';
END LOOP;
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END) + 1),2);
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LOANBL-' ||
TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || '-' ||
TO_CHAR(CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END , 'DD-MON-YY') || '-' ||
TO_CHAR(J1.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J1.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR(LC_INT_DEDN)) || ']' ;
FOR L1 IN LOAN_RECO_INFO(I.LOAN_NO, J1.FR_DATE, J1.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L1.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - L1.TRAN_DATE) + 1),2));
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LNRECO-' ||
TRIM(TO_CHAR(L1.AMOUNT)) || '-' ||
TO_CHAR(L1.TRAN_DATE , 'DD-MON-YY') || '-' ||
TO_CHAR(J1.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J1.TO_DATE - L1.TRAN_DATE) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR((ROUND((L1.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - L1.TRAN_DATE) + 1),2)))) || ']' ;
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE - (ROUND((L1.AMOUNT * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - L1.TRAN_DATE) + 1),2));
-- Modified to calculate interest as per ERP.End
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
LC_PRINC_DEDN := NVL(LC_PRINC_DEDN , 0);
LC_INT_DEDN := NVL(LC_INT_DEDN , 0);
LC_PROJ_INST := NVL(LC_PROJ_INST , 0);
IF TRIM(I.INT_TERM) = 'EMI' THEN
IF LC_PROJ_INST > 0 THEN
IF LC_PRINC_DEDN = LC_PROJ_INST THEN
LC_PRINC_DEDN := LC_PRINC_DEDN - LC_INT_DEDN;
END IF;
END IF;
--ELSE
-- LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J1.FR_DATE AND J1.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
LC_PRINC_DEDN := NVL(LC_PRINC_DEDN , 0);
LC_INT_DEDN := NVL(LC_INT_DEDN , 0);
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL - LC_OTH_RECOVERY THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL - LC_OTH_RECOVERY;
END IF;
AMORTISED_COST_OP_BAL := CASE WHEN EMI_NO = 1 THEN TOT_PRESENT_VALUE ELSE AMORTISED_COST_CL_BAL END;
-- Commented and shofted above to calculate interest as per ERP logic
-- INTEREST_AT_EFF_RATE := ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END) + 1),2);
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE + (ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END) + 1),2));
-- Commented and modified bellow to set cl bal 0 on clauser of loan.Start
--AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
if LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 then
AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
IF AMORTISED_COST_CL_BAL < 0 THEN
AMORTISED_COST_CL_BAL := 0;
END IF;
else
AMORTISED_COST_CL_BAL := 0;
end if;
-- Commented and modified bellow to set cl bal 0 on clauser of loan.End
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
EMP_BENEFIT := INTEREST_AT_EFF_RATE - LC_INT_DEDN;
DIFF_PRINC_DEDN := (LC_LOAN_OP_BAL - (LC_PRINC_DEDN + LC_OTH_RECOVERY)) - AMORTISED_COST_CL_BAL;
OUT_REC.ACCT_PRD_ARG := ACCT_PRD;
OUT_REC.ACCT_PRD_DATA := J1.P_ACCT_PRD;
OUT_REC.PRD_CODE__FR := PRD_CODE__FR;
OUT_REC.PRD_CODE__TO := PRD_CODE__TO;
OUT_REC.FIN_ENTITY := I.FIN_ENTITY;
OUT_REC.EMP_CODE := I.EMP_CODE;
OUT_REC.EMP_FULL_NAME := I.EMP_FULL_NAME;
OUT_REC.PAY_SITE := I.PAY_SITE;
OUT_REC.CCTR_CODE__SAL := I.CCTR_CODE__SAL;
OUT_REC.LOAN_NO := I.LOAN_NO;
OUT_REC.SCHEME_NO := I.SCHEME_NO;
OUT_REC.SCHEME_TYPE := I.SCHEME_TYPE;
OUT_REC.ISSUE_DATE := I.ISSUE_DATE;
OUT_REC.LOAN_DISB_DATE := LD_INT_FIRST_DATE;
OUT_REC.TERM := I.TERM;
OUT_REC.LOAN_AMT := I.LOAN_AMT;
OUT_REC.INTEREST := I.INTEREST;
OUT_REC.MON_INST := I.MON_INST;
OUT_REC.INT_TERM := I.INT_TERM;
OUT_REC.APPR_DATE := I.APPR_DATE;
OUT_REC.DATE__BALANCE := I.DATE__BALANCE;
OUT_REC.DATE__INTEREST := I.DATE__INTEREST;
OUT_REC.LOAN_TYPE := I.LOAN_TYPE;
OUT_REC.LOAN_CLOUSRE_DATE := LD_LOAN_CLOUSRE_DATE;
OUT_REC.ISA_EFF_INT_RATE := LC_EFF_INT_RATE;
OUT_REC.BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.LOAN_START_RECO_DATE := I.START_RECO;
OUT_REC.EMI_NO := EMI_NO;
OUT_REC.EMI_PRD_CODE := J1.CODE;
OUT_REC.EMI_PRD_DESCR := TO_CHAR(J1.FR_DATE , 'MON-YY');
OUT_REC.OP_BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.INTEREST_AMT := LC_INT_DEDN;
OUT_REC.PRINC_CUM_INTEREST_AMT := (LC_LOAN_OP_BAL + LC_INT_DEDN);
OUT_REC.MON_DEDN := (LC_PRINC_DEDN + LC_INT_DEDN);
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.RECOVER_AMT := LC_OTH_RECOVERY;
OUT_REC.CL_BALANCE_AMT := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
OUT_REC.PV_FACTOR := PV_FACTOR;
OUT_REC.PRESENT_VALUE := PRESENT_VALUE;
OUT_REC.AMORTISED_COST_OP_BAL := AMORTISED_COST_OP_BAL;
OUT_REC.INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE;
OUT_REC.REPAYMENT_INCL_INTEREST := (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ;
OUT_REC.AMORTISED_COST_CL_BAL := AMORTISED_COST_CL_BAL;
OUT_REC.EMP_BENEFIT := EMP_BENEFIT;
OUT_REC.DIFF_PRINC_DEDN := DIFF_PRINC_DEDN;
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.LOAN_INT_CALC_STR := LOAN_INT_CALC_STR;
OUT_REC.REPAYMENT_INCL_INTEREST_1 := CASE WHEN LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 THEN (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ELSE AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE END;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
pipe row ( out_rec );
ELSE
--DBMS_OUTPUT.PUT_LINE('EXITED FROM J1 LOOP');
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END LOOP;
RETURN ;
END;
/
COMMIT;
----- Modified on 12/07/2016.End ----
SET DEFINE OFF
DROP FUNCTION FN_TF_LOAN_INT_INFO;
DROP TYPE TFT_LOAN_INT_INFO;
DROP TYPE TFO_LOAN_INT_INFO;
CREATE TYPE TFO_LOAN_INT_INFO AS OBJECT
(
ACCT_PRD_ARG CHAR(6),
ACCT_PRD_DATA CHAR(6),
PRD_CODE__FR CHAR(6),
PRD_CODE__TO CHAR(6),
EMP_CODE CHAR(10),
EMP_FULL_NAME VARCHAR2(120),
PAY_SITE CHAR(5),
FIN_ENTITY CHAR(10),
CCTR_CODE__SAL CHAR(4),
LOAN_NO CHAR(15),
SCHEME_NO CHAR(10),
SCHEME_TYPE CHAR(5),
LOAN_AMT NUMBER(12,3),
TERM NUMBER(3),
INT_TERM CHAR(5),
ISSUE_DATE DATE,
LOAN_DISB_DATE DATE,
LOAN_START_RECO_DATE DATE,
LOAN_CLOUSRE_DATE DATE,
MON_INST NUMBER(12,3),
PRE_PAID_EMP_BENIFIT NUMBER(12,3),
INTEREST NUMBER(6,2),
ISA_EFF_INT_RATE NUMBER(6,2),
APPR_DATE DATE,
BALANCE_AMT NUMBER(12,3),
DATE__BALANCE DATE,
DATE__INTEREST DATE,
LOAN_TYPE CHAR(1),
EMI_NO NUMBER(10),
EMI_PRD_CODE CHAR(6),
EMI_PRD_DESCR VARCHAR2(10),
OP_BALANCE_AMT NUMBER(12,3),
INTEREST_AMT NUMBER(12,3),
PRINC_CUM_INTEREST_AMT NUMBER(12,3),
MON_DEDN NUMBER(12,3),
RECOVER_AMT NUMBER(12,3),
CL_BALANCE_AMT NUMBER(12,3),
PRINC_DEDN NUMBER(12,3),
PV_FACTOR NUMBER(10,4),
PRESENT_VALUE NUMBER(12,3),
AMORTISED_COST_OP_BAL NUMBER(12,3),
INTEREST_AT_EFF_RATE NUMBER(12,3),
REPAYMENT_INCL_INTEREST NUMBER(12,3),
AMORTISED_COST_CL_BAL NUMBER(12,3),
EMP_BENEFIT NUMBER(12,3),
DIFF_PRINC_DEDN NUMBER(12,3),
LOAN_INT_CALC_STR VARCHAR2(4000),
REPAYMENT_INCL_INTEREST_1 NUMBER(12,3)
)
/
CREATE TYPE TFT_LOAN_INT_INFO AS TABLE OF TFO_LOAN_INT_INFO
/
CREATE OR REPLACE
FUNCTION FN_TF_LOAN_INT_INFO
(
FIN_ENTITY_CODE_FR FINENT.FIN_ENTITY%TYPE,
FIN_ENTITY_CODE_TO FINENT.FIN_ENTITY%TYPE,
ACCT_PRD ACCTPRD.CODE%TYPE,
PRD_CODE__FR PERIOD.CODE%TYPE,
PRD_CODE__TO PERIOD.CODE%TYPE,
SITE_CODE__FR SITE.SITE_CODE%TYPE,
SITE_CODE__TO SITE.SITE_CODE%TYPE,
CCTR_CODE__FR EMPLOYEE.CCTR_CODE__SAL%TYPE,
CCTR_CODE__TO EMPLOYEE.CCTR_CODE__SAL%TYPE,
EMP_CODE__FR EMPLOYEE.EMP_CODE%TYPE,
EMP_CODE__TO EMPLOYEE.EMP_CODE%TYPE,
EFF_INT_RATE LOANS.INTEREST%TYPE
)
RETURN TFT_LOAN_INT_INFO
PIPELINED IS
OUT_REC TFO_LOAN_INT_INFO := TFO_LOAN_INT_INFO( NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
LI_CNT NUMBER(6);
LI_CNT1 NUMBER(6);
LI_CNT2 NUMBER(6);
EMI_NO NUMBER(6);
TOT_INST_DEDN NUMBER(6);
TOT_INST_NO NUMBER(6);
LC_LOAN_OP_BAL LOANS.LOAN_AMT%TYPE;
LC_LOAN_RECO LOANS.LOAN_AMT%TYPE;
LD_LOAN_CLOUSRE_DATE DATE;
LD_INT_FIRST_DATE DATE;
LD_INT_LAST_DATE DATE;
EMI_PRD_CODE PERIOD.CODE%TYPE;
EMI_PRD_DESCR PERIOD.DESCR%TYPE;
PV_FACTOR NUMBER(12,4);
PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
TOT_PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_OP_BAL LOANS.LOAN_AMT%TYPE;
INTEREST_AT_EFF_RATE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_CL_BAL LOANS.LOAN_AMT%TYPE;
EMP_BENEFIT LOANS.LOAN_AMT%TYPE;
DIFF_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_INT_DEDN LOANS.LOAN_AMT%TYPE;
LC_OTH_RECOVERY LOANS.LOAN_AMT%TYPE;
LC_EFF_INT_RATE LOANS.INTEREST%TYPE;
LS_EXCLUDE_SCHEME_TYPE VARCHAR2(1024);
LOAN_INT_CALC_STR VARCHAR2(4000);
ARG_ACCT_PRD_CODE ACCTPRD.CODE%TYPE;
LD_CAL_FDATE ACCTPRD.FR_DATE%TYPE;
LD_CAL_TDATE ACCTPRD.TO_DATE%TYPE;
LI_NO_DAYS_IN_CAL_YR NUMBER(3);
CURSOR LOAN_INFO(AS_EXCLUDE_SCHEME_TYPE VARCHAR2) IS
SELECT
LN.EMP_CODE AS EMP_CODE ,
TRIM(EM.EMP_FNAME) || ' ' || TRIM(EM.EMP_MNAME) || TRIM(EM.EMP_LNAME) AS EMP_FULL_NAME,
EM.PAY_SITE AS PAY_SITE,
EM.CCTR_CODE__SAL AS CCTR_CODE__SAL,
LN.LOAN_NO AS LOAN_NO,
LN.SCHEME_NO SCHEME_NO,
LN.ISSUE_DATE AS ISSUE_DATE,
LN.START_RECO AS START_RECO,
LN.TERM AS TERM,
LN.LOAN_AMT AS LOAN_AMT,
LN.INTEREST AS INTEREST,
LN.MON_INST AS MON_INST,
LN.INT_TERM AS INT_TERM,
LN.INTEREST_AMT AS INTEREST_AMT,
LN.RECOVER_AMT AS RECOVER_AMT,
LN.APPR_DATE AS APPR_DATE,
LN.BALANCE_AMT AS BALANCE_AMT,
LN.DATE__BALANCE AS DATE__BALANCE,
LN.DATE__INTEREST AS DATE__INTEREST,
LN.LOAN_TYPE AS LOAN_TYPE,
LN.ACT_TERM AS ACT_TERM,
AP.FR_DATE AS FY_FROM_DATE,
AP.TO_DATE AS FY_TO_DATE,
LS.AD_CODE__INT AS AD_CODE__INT,
LS.AD_CODE__DED AS AD_CODE__DED,
LS.SCHEME_TYPE AS SCHEME_TYPE,
SM.FIN_ENTITY AS FIN_ENTITY
FROM LOANS LN, EMPLOYEE EM, SITE SM, ACCTPRD AP, LOAN_SCHEME LS
WHERE EM.EMP_CODE = LN.EMP_CODE
AND LN.EMP_CODE >= EMP_CODE__FR
AND LN.EMP_CODE <= EMP_CODE__TO
AND EM.PAY_SITE >= SITE_CODE__FR
AND EM.PAY_SITE <= SITE_CODE__TO
AND SM.SITE_CODE = EM.PAY_SITE
--AND SM.FIN_ENTITY = FIN_ENTITY_CODE_FR
AND SM.FIN_ENTITY BETWEEN FIN_ENTITY_CODE_FR AND FIN_ENTITY_CODE_TO
AND LN.ISSUE_DATE <= AP.TO_DATE
AND AP.CODE = ACCT_PRD
AND LN.STATUS IN ('A','E')
AND LS.SCHEME_NO = LN.SCHEME_NO
--AND LS.SCHEME_TYPE NOT IN ('A','B')
-- AND LS.SCHEME_TYPE NOT IN (AS_EXCLUDE_SCHEME_TYPE)
AND LS.SCHEME_TYPE NOT IN ( SELECT regexp_substr(AS_EXCLUDE_SCHEME_TYPE, '[^,]+', 1, LEVEL)
token FROM dual CONNECT BY LEVEL <= length(AS_EXCLUDE_SCHEME_TYPE) -
length(REPLACE(AS_EXCLUDE_SCHEME_TYPE, ',', '')) + 1)
ORDER BY SM.FIN_ENTITY,LN.EMP_CODE,LN.ISSUE_DATE;
CURSOR PRD_INFO(START_DATE DATE) IS SELECT A.CODE,A.FR_DATE,A.TO_DATE,
A.ACCT_PRD AS P_ACCT_PRD,B.FR_DATE AS FY_FROM_DATE,B.TO_DATE AS FY_TO_DATE
FROM PERIOD A,ACCTPRD B
WHERE B.CODE = A.ACCT_PRD AND A.TO_DATE >= START_DATE ORDER BY TO_DATE;
CURSOR LOAN_INST_INFO(ARG_LOAN_NO CHAR) IS SELECT * FROM LOANS_SCHEDULE
WHERE LOAN_NO = ARG_LOAN_NO
AND (NO_INST <> NO_INST_DED OR (NO_INST IS NULL AND PRD_CODE IS NULL)) ORDER BY LINE_NO ;
CURSOR LOAN_RECO_INFO(ARG_LOAN_NO CHAR , ARG_FR_DATE DATE , ARG_TO_DATE DATE)
IS SELECT * FROM LOAN_REG WHERE LOAN_NO = ARG_LOAN_NO
AND TRAN_DATE BETWEEN ARG_FR_DATE AND ARG_TO_DATE
AND AMOUNT <> 0 AND TRAN_TYPE NOT IN ('P') AND
CASE WHEN INT_CALCULATED IS NULL THEN 'N' ELSE INT_CALCULATED END = 'N'
ORDER BY TRAN_DATE;
CURSOR LOAN_INT_CALC_INFO(ARG_LOAN_NO CHAR , ARG_PRD_CODE CHAR)
IS SELECT * FROM LOANS_INTEREST_DET WHERE LOAN_NO = ARG_LOAN_NO
AND PRD_CODE = ARG_PRD_CODE ORDER BY PRD_CODE,LINE_NO;
BEGIN
ARG_ACCT_PRD_CODE := ACCT_PRD;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PERIOD WHERE CODE BETWEEN PRD_CODE__FR AND PRD_CODE__TO
AND ACCT_PRD = ARG_ACCT_PRD_CODE;
IF LI_CNT2 = 0 THEN
RETURN;
END IF;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
IF LI_CNT2 > 0 THEN
SELECT TRIM(VAR_VALUE) INTO LS_EXCLUDE_SCHEME_TYPE FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
ELSE
LS_EXCLUDE_SCHEME_TYPE := '';
END IF;
IF LS_EXCLUDE_SCHEME_TYPE IS NULL OR LENGTH(TRIM(LS_EXCLUDE_SCHEME_TYPE)) = 0 THEN
LS_EXCLUDE_SCHEME_TYPE := '**********';
END IF;
DBMS_OUTPUT.PUT_LINE(LS_EXCLUDE_SCHEME_TYPE);
LI_CNT2 := 0;
FOR I IN LOAN_INFO(LS_EXCLUDE_SCHEME_TYPE)
LOOP
LI_CNT2 := LI_CNT2 + 1;
LI_CNT := 0;
LC_LOAN_OP_BAL := I.LOAN_AMT;
SELECT SUM(AMOUNT) INTO LC_LOAN_RECO FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_DATE < I.FY_FROM_DATE;
IF LC_LOAN_RECO IS NOT NULL THEN
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_LOAN_RECO;
END IF;
LI_CNT1 := 0;
SELECT COUNT(1), MIN(FROM_DATE) INTO LI_CNT1, LD_INT_FIRST_DATE FROM LOAN_INT_REG WHERE LOAN_NO=I.LOAN_NO ;
IF LI_CNT1 > 0 THEN
LD_INT_LAST_DATE := I.DATE__INTEREST + 1;
ELSE
LD_INT_LAST_DATE := I.DATE__INTEREST;
LD_INT_FIRST_DATE := I.DATE__INTEREST;
END IF;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
SELECT SUM(INT_RATE) INTO LC_EFF_INT_RATE FROM LOANSCHEME_INT_RATE
WHERE SCHEME_TYPE = I.SCHEME_TYPE AND LD_INT_FIRST_DATE BETWEEN EFF_FROM AND VALID_UPTO;
IF LC_EFF_INT_RATE IS NULL THEN
LC_EFF_INT_RATE := CASE WHEN EFF_INT_RATE IS NULL OR EFF_INT_RATE <= 0 THEN
I.INTEREST ELSE EFF_INT_RATE END;
END IF;
IF LC_EFF_INT_RATE <= I.INTEREST THEN
LC_LOAN_OP_BAL := 0;
END IF;
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := 0;
TOT_PRESENT_VALUE := 0;
LC_LOAN_OP_BAL := I.LOAN_AMT;
FOR J IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLL WHERE EMP_CODE = I.EMP_CODE
AND PRD_CODE = J.CODE;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
IF I.START_RECO <= J.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K.NO_INST IS NULL THEN 9999
ELSE K.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_LOAN_OP_BAL > K.AMOUNT THEN K.AMOUNT ELSE LC_LOAN_OP_BAL END;
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
FOR L IN LOAN_RECO_INFO(I.LOAN_NO, J.FR_DATE, J.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
IF TRIM(I.INT_TERM) = 'EMI' THEN
LC_PRINC_DEDN := I.MON_INST - LC_INT_DEDN;
ELSE
LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
TOT_PRESENT_VALUE := TOT_PRESENT_VALUE + PRESENT_VALUE;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
LD_LOAN_CLOUSRE_DATE := J.TO_DATE;
ELSE
EXIT;
END IF;
END LOOP;
IF LD_LOAN_CLOUSRE_DATE >= I.FY_FROM_DATE THEN
LC_LOAN_OP_BAL := I.LOAN_AMT;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LC_PRINC_DEDN := 0;
EMI_NO := 0;
FOR J IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
IF LC_LOAN_OP_BAL > 0 THEN
LC_OTH_RECOVERY := 0;
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLL WHERE EMP_CODE = I.EMP_CODE
AND PRD_CODE = J.CODE;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
IF I.START_RECO <= J.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K.NO_INST IS NULL THEN 999999
ELSE K.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_LOAN_OP_BAL > K.AMOUNT THEN K.AMOUNT ELSE LC_LOAN_OP_BAL END;
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LOAN_INT_CALC_STR := '';
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := 0.00;
-- Modified to calculate interest as per ERP.End
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
FOR M IN LOAN_INT_CALC_INFO(I.LOAN_NO , J.CODE)
LOOP
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[AI-' || M.REF_TYPE || '-' ||
TRIM(TO_CHAR(M.AMOUNT)) ||
'-' || TO_CHAR(M.DATE__FROM , 'DD-MON-YY') || '-' ||
'-' || TO_CHAR(M.DATE__TO , 'DD-MON-YY') || '-' ||
'-' || TRIM(TO_CHAR(M.NO_DAYS)) || '-' ||
TRIM(TO_CHAR(M.INT_PERC)) || '-' ||
TRIM(TO_CHAR(M.INTEREST_AMT__DIFF)) || ']';
END LOOP;
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LOANBL-' ||
TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || '-' ||
TO_CHAR(CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END , 'DD-MON-YY') || '-' ||
TO_CHAR(J.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR(LC_INT_DEDN)) || ']' ;
FOR L IN LOAN_RECO_INFO(I.LOAN_NO, J.FR_DATE, J.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LNRECO-' ||
TRIM(TO_CHAR(L.AMOUNT)) || '-' ||
TO_CHAR(L.TRAN_DATE , 'DD-MON-YY') || '-' ||
TO_CHAR(J.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J.TO_DATE - L.TRAN_DATE) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR((ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2)))) || ']' ;
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE - (ROUND((L.AMOUNT * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
-- Modified to calculate interest as per ERP.End
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
IF TRIM(I.INT_TERM) = 'EMI' THEN
LC_PRINC_DEDN := I.MON_INST - LC_INT_DEDN;
ELSE
LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
AMORTISED_COST_OP_BAL := CASE WHEN EMI_NO = 1 THEN TOT_PRESENT_VALUE ELSE AMORTISED_COST_CL_BAL END;
-- Commented and shofted above to calculate interest as per ERP logic
-- INTEREST_AT_EFF_RATE := ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE + (ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2));
-- Commented and modified bellow to set cl bal 0 on clauser of loan.Start
--AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
if LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 then
AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
else
AMORTISED_COST_CL_BAL := 0;
end if;
-- Commented and modified bellow to set cl bal 0 on clauser of loan.End
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
EMP_BENEFIT := INTEREST_AT_EFF_RATE - LC_INT_DEDN;
DIFF_PRINC_DEDN := (LC_LOAN_OP_BAL - (LC_PRINC_DEDN + LC_OTH_RECOVERY)) - AMORTISED_COST_CL_BAL;
OUT_REC.ACCT_PRD_ARG := ACCT_PRD;
OUT_REC.ACCT_PRD_DATA := J.P_ACCT_PRD;
OUT_REC.PRD_CODE__FR := PRD_CODE__FR;
OUT_REC.PRD_CODE__TO := PRD_CODE__TO;
OUT_REC.FIN_ENTITY := I.FIN_ENTITY;
OUT_REC.EMP_CODE := I.EMP_CODE;
OUT_REC.EMP_FULL_NAME := I.EMP_FULL_NAME;
OUT_REC.PAY_SITE := I.PAY_SITE;
OUT_REC.CCTR_CODE__SAL := I.CCTR_CODE__SAL;
OUT_REC.LOAN_NO := I.LOAN_NO;
OUT_REC.SCHEME_NO := I.SCHEME_NO;
OUT_REC.SCHEME_TYPE := I.SCHEME_TYPE;
OUT_REC.ISSUE_DATE := I.ISSUE_DATE;
OUT_REC.LOAN_DISB_DATE := LD_INT_FIRST_DATE;
OUT_REC.TERM := I.TERM;
OUT_REC.LOAN_AMT := I.LOAN_AMT;
OUT_REC.INTEREST := I.INTEREST;
OUT_REC.MON_INST := I.MON_INST;
OUT_REC.INT_TERM := I.INT_TERM;
OUT_REC.APPR_DATE := I.APPR_DATE;
OUT_REC.DATE__BALANCE := I.DATE__BALANCE;
OUT_REC.DATE__INTEREST := I.DATE__INTEREST;
OUT_REC.LOAN_TYPE := I.LOAN_TYPE;
OUT_REC.LOAN_CLOUSRE_DATE := LD_LOAN_CLOUSRE_DATE;
OUT_REC.ISA_EFF_INT_RATE := LC_EFF_INT_RATE;
OUT_REC.BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.LOAN_START_RECO_DATE := I.START_RECO;
OUT_REC.EMI_NO := EMI_NO;
OUT_REC.EMI_PRD_CODE := J.CODE;
OUT_REC.EMI_PRD_DESCR := TO_CHAR(J.FR_DATE , 'MON-YY');
OUT_REC.OP_BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.INTEREST_AMT := LC_INT_DEDN;
OUT_REC.PRINC_CUM_INTEREST_AMT := (LC_LOAN_OP_BAL + LC_INT_DEDN);
OUT_REC.MON_DEDN := (LC_PRINC_DEDN + LC_INT_DEDN);
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.RECOVER_AMT := LC_OTH_RECOVERY;
OUT_REC.CL_BALANCE_AMT := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
OUT_REC.PV_FACTOR := PV_FACTOR;
OUT_REC.PRESENT_VALUE := PRESENT_VALUE;
OUT_REC.AMORTISED_COST_OP_BAL := AMORTISED_COST_OP_BAL;
OUT_REC.INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE;
OUT_REC.REPAYMENT_INCL_INTEREST := (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ;
OUT_REC.AMORTISED_COST_CL_BAL := AMORTISED_COST_CL_BAL;
OUT_REC.EMP_BENEFIT := EMP_BENEFIT;
OUT_REC.DIFF_PRINC_DEDN := DIFF_PRINC_DEDN;
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.LOAN_INT_CALC_STR := LOAN_INT_CALC_STR;
OUT_REC.REPAYMENT_INCL_INTEREST_1 := CASE WHEN LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 THEN (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ELSE AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE END;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
pipe row ( out_rec );
ELSE
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END LOOP;
RETURN ;
END;
/
CREATE OR REPLACE
FUNCTION FN_TF_LOAN_INT_INFO
(
FIN_ENTITY_CODE_FR FINENT.FIN_ENTITY%TYPE,
FIN_ENTITY_CODE_TO FINENT.FIN_ENTITY%TYPE,
ACCT_PRD ACCTPRD.CODE%TYPE,
PRD_CODE__FR PERIOD.CODE%TYPE,
PRD_CODE__TO PERIOD.CODE%TYPE,
SITE_CODE__FR SITE.SITE_CODE%TYPE,
SITE_CODE__TO SITE.SITE_CODE%TYPE,
CCTR_CODE__FR EMPLOYEE.CCTR_CODE__SAL%TYPE,
CCTR_CODE__TO EMPLOYEE.CCTR_CODE__SAL%TYPE,
EMP_CODE__FR EMPLOYEE.EMP_CODE%TYPE,
EMP_CODE__TO EMPLOYEE.EMP_CODE%TYPE,
EFF_INT_RATE LOANS.INTEREST%TYPE
)
RETURN TFT_LOAN_INT_INFO
PIPELINED IS
OUT_REC TFO_LOAN_INT_INFO := TFO_LOAN_INT_INFO( NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
LI_CNT NUMBER(6);
LI_CNT1 NUMBER(6);
LI_CNT2 NUMBER(6);
EMI_NO NUMBER(6);
TOT_INST_DEDN NUMBER(6);
TOT_INST_NO NUMBER(6);
LC_LOAN_OP_BAL LOANS.LOAN_AMT%TYPE;
LC_LOAN_RECO LOANS.LOAN_AMT%TYPE;
LD_LOAN_CLOUSRE_DATE DATE;
LD_INT_FIRST_DATE DATE;
LD_INT_LAST_DATE DATE;
EMI_PRD_CODE PERIOD.CODE%TYPE;
EMI_PRD_DESCR PERIOD.DESCR%TYPE;
PV_FACTOR NUMBER(12,4);
PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
TOT_PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_OP_BAL LOANS.LOAN_AMT%TYPE;
INTEREST_AT_EFF_RATE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_CL_BAL LOANS.LOAN_AMT%TYPE;
EMP_BENEFIT LOANS.LOAN_AMT%TYPE;
DIFF_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_INT_DEDN LOANS.LOAN_AMT%TYPE;
LC_OTH_RECOVERY LOANS.LOAN_AMT%TYPE;
LC_EFF_INT_RATE LOANS.INTEREST%TYPE;
LS_EXCLUDE_SCHEME_TYPE VARCHAR2(1024);
LOAN_INT_CALC_STR VARCHAR2(4000);
ARG_ACCT_PRD_CODE ACCTPRD.CODE%TYPE;
LD_CAL_FDATE ACCTPRD.FR_DATE%TYPE;
LD_CAL_TDATE ACCTPRD.TO_DATE%TYPE;
LI_NO_DAYS_IN_CAL_YR NUMBER(3);
LC_TEMP_RECO LOANS.LOAN_AMT%TYPE;
LC_TEMP_BAL LOANS.LOAN_AMT%TYPE;
LC_PROJ_INST LOANS.LOAN_AMT%TYPE;
CURSOR LOAN_INFO(AS_EXCLUDE_SCHEME_TYPE VARCHAR2) IS
SELECT
LN.EMP_CODE AS EMP_CODE ,
TRIM(EM.EMP_FNAME) || ' ' || TRIM(EM.EMP_MNAME) || TRIM(EM.EMP_LNAME) AS EMP_FULL_NAME,
EM.PAY_SITE AS PAY_SITE,
EM.CCTR_CODE__SAL AS CCTR_CODE__SAL,
LN.LOAN_NO AS LOAN_NO,
LN.SCHEME_NO SCHEME_NO,
LN.ISSUE_DATE AS ISSUE_DATE,
LN.START_RECO AS START_RECO,
LN.TERM AS TERM,
LN.LOAN_AMT AS LOAN_AMT,
LN.INTEREST AS INTEREST,
LN.MON_INST AS MON_INST,
LN.INT_TERM AS INT_TERM,
LN.INTEREST_AMT AS INTEREST_AMT,
LN.RECOVER_AMT AS RECOVER_AMT,
LN.APPR_DATE AS APPR_DATE,
LN.BALANCE_AMT AS BALANCE_AMT,
LN.DATE__BALANCE AS DATE__BALANCE,
LN.DATE__INTEREST AS DATE__INTEREST,
LN.LOAN_TYPE AS LOAN_TYPE,
LN.ACT_TERM AS ACT_TERM,
AP.FR_DATE AS FY_FROM_DATE,
AP.TO_DATE AS FY_TO_DATE,
LS.AD_CODE__INT AS AD_CODE__INT,
LS.AD_CODE__DED AS AD_CODE__DED,
LS.SCHEME_TYPE AS SCHEME_TYPE,
SM.FIN_ENTITY AS FIN_ENTITY
FROM LOANS LN, EMPLOYEE EM, SITE SM, ACCTPRD AP, LOAN_SCHEME LS
WHERE EM.EMP_CODE = LN.EMP_CODE
AND LN.EMP_CODE >= EMP_CODE__FR
AND LN.EMP_CODE <= EMP_CODE__TO
AND EM.PAY_SITE >= SITE_CODE__FR
AND EM.PAY_SITE <= SITE_CODE__TO
AND SM.SITE_CODE = EM.PAY_SITE
--AND SM.FIN_ENTITY = FIN_ENTITY_CODE_FR
AND SM.FIN_ENTITY BETWEEN FIN_ENTITY_CODE_FR AND FIN_ENTITY_CODE_TO
AND LN.ISSUE_DATE <= AP.TO_DATE
AND AP.CODE = ACCT_PRD
AND LN.STATUS IN ('A','E')
AND LS.SCHEME_NO = LN.SCHEME_NO
--AND LS.SCHEME_TYPE NOT IN ('A','B')
-- AND LS.SCHEME_TYPE NOT IN (AS_EXCLUDE_SCHEME_TYPE)
AND LS.SCHEME_TYPE NOT IN ( SELECT regexp_substr(AS_EXCLUDE_SCHEME_TYPE, '[^,]+', 1, LEVEL)
token FROM dual CONNECT BY LEVEL <= length(AS_EXCLUDE_SCHEME_TYPE) -
length(REPLACE(AS_EXCLUDE_SCHEME_TYPE, ',', '')) + 1)
ORDER BY SM.FIN_ENTITY,LN.EMP_CODE,LN.ISSUE_DATE;
CURSOR PRD_INFO(START_DATE DATE) IS SELECT A.CODE,A.FR_DATE,A.TO_DATE,
A.ACCT_PRD AS P_ACCT_PRD,B.FR_DATE AS FY_FROM_DATE,B.TO_DATE AS FY_TO_DATE
FROM PERIOD A,ACCTPRD B
WHERE B.CODE = A.ACCT_PRD AND A.TO_DATE >= START_DATE ORDER BY TO_DATE;
CURSOR LOAN_INST_INFO(ARG_LOAN_NO CHAR) IS SELECT * FROM LOANS_SCHEDULE
WHERE LOAN_NO = ARG_LOAN_NO
AND (NO_INST <> NO_INST_DED OR (NO_INST IS NULL AND PRD_CODE IS NULL)) ORDER BY LINE_NO ;
CURSOR LOAN_RECO_INFO(ARG_LOAN_NO CHAR , ARG_FR_DATE DATE , ARG_TO_DATE DATE)
IS SELECT * FROM LOAN_REG WHERE LOAN_NO = ARG_LOAN_NO
AND TRAN_DATE BETWEEN ARG_FR_DATE AND ARG_TO_DATE
AND AMOUNT <> 0 AND TRAN_TYPE NOT IN ('P') AND
CASE WHEN INT_CALCULATED IS NULL THEN 'N' ELSE INT_CALCULATED END = 'N'
ORDER BY TRAN_DATE;
CURSOR LOAN_INT_CALC_INFO(ARG_LOAN_NO CHAR , ARG_PRD_CODE CHAR)
IS SELECT * FROM LOANS_INTEREST_DET WHERE LOAN_NO = ARG_LOAN_NO
AND PRD_CODE = ARG_PRD_CODE ORDER BY PRD_CODE,LINE_NO;
BEGIN
ARG_ACCT_PRD_CODE := ACCT_PRD;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PERIOD WHERE CODE BETWEEN PRD_CODE__FR AND PRD_CODE__TO
AND ACCT_PRD = ARG_ACCT_PRD_CODE;
IF LI_CNT2 = 0 THEN
RETURN;
END IF;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
IF LI_CNT2 > 0 THEN
SELECT TRIM(VAR_VALUE) INTO LS_EXCLUDE_SCHEME_TYPE FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
ELSE
LS_EXCLUDE_SCHEME_TYPE := '';
END IF;
IF LS_EXCLUDE_SCHEME_TYPE IS NULL OR LENGTH(TRIM(LS_EXCLUDE_SCHEME_TYPE)) = 0 THEN
LS_EXCLUDE_SCHEME_TYPE := '**********';
END IF;
--DBMS_OUTPUT.PUT_LINE(LS_EXCLUDE_SCHEME_TYPE);
LI_CNT2 := 0;
FOR I IN LOAN_INFO(LS_EXCLUDE_SCHEME_TYPE)
LOOP
LI_CNT2 := LI_CNT2 + 1;
LI_CNT := 0;
LC_PROJ_INST := 0.00;
LC_LOAN_OP_BAL := I.LOAN_AMT;
SELECT SUM(AMOUNT) INTO LC_LOAN_RECO FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_DATE < I.FY_FROM_DATE;
IF LC_LOAN_RECO IS NOT NULL THEN
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_LOAN_RECO;
END IF;
LI_CNT1 := 0;
SELECT COUNT(1), MIN(FROM_DATE) INTO LI_CNT1, LD_INT_FIRST_DATE FROM LOAN_INT_REG WHERE LOAN_NO=I.LOAN_NO ;
IF LI_CNT1 > 0 THEN
LD_INT_LAST_DATE := I.DATE__INTEREST + 1;
ELSE
LD_INT_LAST_DATE := I.DATE__INTEREST;
LD_INT_FIRST_DATE := I.DATE__INTEREST;
END IF;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
SELECT SUM(INT_RATE) INTO LC_EFF_INT_RATE FROM LOANSCHEME_INT_RATE
WHERE SCHEME_TYPE = I.SCHEME_TYPE AND LD_INT_FIRST_DATE BETWEEN EFF_FROM AND VALID_UPTO;
IF LC_EFF_INT_RATE IS NULL THEN
LC_EFF_INT_RATE := CASE WHEN EFF_INT_RATE IS NULL OR EFF_INT_RATE <= 0 THEN
I.INTEREST ELSE EFF_INT_RATE END;
END IF;
IF LC_EFF_INT_RATE <= I.INTEREST THEN
LC_LOAN_OP_BAL := 0;
END IF;
--DBMS_OUTPUT.PUT_LINE('EMP CODE [' || TRIM(I.EMP_CODE) || '] LOAN NO [' || I.LOAN_NO || '] OP BALANCE [' || TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || ']');
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := 0;
TOT_PRESENT_VALUE := 0;
LC_LOAN_OP_BAL := I.LOAN_AMT;
FOR J IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
LC_PROJ_INST := 0.00;
LC_PRINC_DEDN := 0;
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
LC_TEMP_RECO := 0.00;
LC_TEMP_BAL := LC_LOAN_OP_BAL;
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_TEMP_RECO FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE NOT IN ('P') AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LC_TEMP_RECO IS NOT NULL THEN
LC_TEMP_BAL := LC_TEMP_BAL - LC_TEMP_RECO;
END IF;
LC_TEMP_RECO := 0.00;
LC_PROJ_INST := I.MON_INST;
LC_PRINC_DEDN := I.MON_INST;
IF I.START_RECO <= J.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K.NO_INST IS NULL THEN 9999
ELSE K.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_TEMP_BAL > K.AMOUNT THEN K.AMOUNT ELSE LC_TEMP_BAL END;
LC_PROJ_INST := K.AMOUNT;
--DBMS_OUTPUT.PUT_LINE('EXITED FROM K LOOP');
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
FOR L IN LOAN_RECO_INFO(I.LOAN_NO, J.FR_DATE, J.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
LC_PRINC_DEDN := NVL(LC_PRINC_DEDN , 0);
LC_INT_DEDN := NVL(LC_INT_DEDN , 0);
LC_PROJ_INST := NVL(LC_PROJ_INST , 0);
IF TRIM(I.INT_TERM) = 'EMI' THEN
IF LC_PROJ_INST > 0 THEN
IF LC_PRINC_DEDN = LC_PROJ_INST THEN
LC_PRINC_DEDN := LC_PRINC_DEDN - LC_INT_DEDN;
END IF;
END IF;
--ELSE
-- LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
LC_PRINC_DEDN := NVL(LC_PRINC_DEDN , 0);
LC_INT_DEDN := NVL(LC_INT_DEDN , 0);
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL - LC_OTH_RECOVERY THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL - LC_OTH_RECOVERY;
END IF;
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
TOT_PRESENT_VALUE := TOT_PRESENT_VALUE + PRESENT_VALUE;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
LD_LOAN_CLOUSRE_DATE := J.TO_DATE;
ELSE
--DBMS_OUTPUT.PUT_LINE('EXITED FROM J LOOP');
EXIT;
END IF;
END LOOP;
--DBMS_OUTPUT.PUT_LINE('EMP CODE [' || TRIM(I.EMP_CODE) || '] LOAN NO [' || I.LOAN_NO || '] OP BALANCE [' || TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || '] CL DATE [' || TO_CHAR(LD_LOAN_CLOUSRE_DATE , 'DD-MON-YYYY') || ']' );
IF LD_LOAN_CLOUSRE_DATE >= I.FY_FROM_DATE THEN
LC_LOAN_OP_BAL := I.LOAN_AMT;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LC_PRINC_DEDN := 0;
EMI_NO := 0;
FOR J1 IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J1.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J1.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
LC_PROJ_INST := 0.00;
LC_PRINC_DEDN := 0;
IF LC_LOAN_OP_BAL > 0 THEN
LC_OTH_RECOVERY := 0;
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J1.FR_DATE AND J1.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J1.FR_DATE AND J1.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J1.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J1.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
LC_TEMP_RECO := 0;
LC_TEMP_BAL := LC_LOAN_OP_BAL;
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END) INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J1.FR_DATE AND J1.TO_DATE;
IF LC_TEMP_RECO IS NOT NULL THEN
LC_TEMP_BAL := LC_TEMP_BAL - LC_TEMP_RECO;
END IF;
LC_TEMP_RECO := 0;
LC_PROJ_INST := I.MON_INST;
LC_PRINC_DEDN := I.MON_INST;
IF I.START_RECO <= J1.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K1 IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K1.NO_INST IS NULL THEN 999999
ELSE K1.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_LOAN_OP_BAL > K1.AMOUNT THEN K1.AMOUNT ELSE LC_LOAN_OP_BAL END;
LC_PROJ_INST := K1.AMOUNT;
--DBMS_OUTPUT.PUT_LINE('EXITED FROM K1 LOOP');
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LOAN_INT_CALC_STR := '';
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := 0.00;
-- Modified to calculate interest as per ERP.End
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J1.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J1.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
FOR M1 IN LOAN_INT_CALC_INFO(I.LOAN_NO , J1.CODE)
LOOP
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[AI-' || M1.REF_TYPE || '-' ||
TRIM(TO_CHAR(M1.AMOUNT)) ||
'-' || TO_CHAR(M1.DATE__FROM , 'DD-MON-YY') || '-' ||
'-' || TO_CHAR(M1.DATE__TO , 'DD-MON-YY') || '-' ||
'-' || TRIM(TO_CHAR(M1.NO_DAYS)) || '-' ||
TRIM(TO_CHAR(M1.INT_PERC)) || '-' ||
TRIM(TO_CHAR(M1.INTEREST_AMT__DIFF)) || ']';
END LOOP;
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END) + 1),2);
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LOANBL-' ||
TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || '-' ||
TO_CHAR(CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END , 'DD-MON-YY') || '-' ||
TO_CHAR(J1.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J1.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR(LC_INT_DEDN)) || ']' ;
FOR L1 IN LOAN_RECO_INFO(I.LOAN_NO, J1.FR_DATE, J1.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L1.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - L1.TRAN_DATE) + 1),2));
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LNRECO-' ||
TRIM(TO_CHAR(L1.AMOUNT)) || '-' ||
TO_CHAR(L1.TRAN_DATE , 'DD-MON-YY') || '-' ||
TO_CHAR(J1.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J1.TO_DATE - L1.TRAN_DATE) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR((ROUND((L1.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - L1.TRAN_DATE) + 1),2)))) || ']' ;
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE - (ROUND((L1.AMOUNT * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - L1.TRAN_DATE) + 1),2));
-- Modified to calculate interest as per ERP.End
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
LC_PRINC_DEDN := NVL(LC_PRINC_DEDN , 0);
LC_INT_DEDN := NVL(LC_INT_DEDN , 0);
LC_PROJ_INST := NVL(LC_PROJ_INST , 0);
IF TRIM(I.INT_TERM) = 'EMI' THEN
IF LC_PROJ_INST > 0 THEN
IF LC_PRINC_DEDN = LC_PROJ_INST THEN
LC_PRINC_DEDN := LC_PRINC_DEDN - LC_INT_DEDN;
END IF;
END IF;
--ELSE
-- LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J1.FR_DATE AND J1.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
LC_PRINC_DEDN := NVL(LC_PRINC_DEDN , 0);
LC_INT_DEDN := NVL(LC_INT_DEDN , 0);
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL - LC_OTH_RECOVERY THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL - LC_OTH_RECOVERY;
END IF;
AMORTISED_COST_OP_BAL := CASE WHEN EMI_NO = 1 THEN TOT_PRESENT_VALUE ELSE AMORTISED_COST_CL_BAL END;
-- Commented and shofted above to calculate interest as per ERP logic
-- INTEREST_AT_EFF_RATE := ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END) + 1),2);
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE + (ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J1.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J1.FR_DATE THEN LD_INT_FIRST_DATE ELSE J1.FR_DATE END) + 1),2));
-- Commented and modified bellow to set cl bal 0 on clauser of loan.Start
--AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
if LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 then
AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
IF AMORTISED_COST_CL_BAL < 0 THEN
AMORTISED_COST_CL_BAL := 0;
END IF;
else
AMORTISED_COST_CL_BAL := 0;
end if;
-- Commented and modified bellow to set cl bal 0 on clauser of loan.End
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
EMP_BENEFIT := INTEREST_AT_EFF_RATE - LC_INT_DEDN;
DIFF_PRINC_DEDN := (LC_LOAN_OP_BAL - (LC_PRINC_DEDN + LC_OTH_RECOVERY)) - AMORTISED_COST_CL_BAL;
OUT_REC.ACCT_PRD_ARG := ACCT_PRD;
OUT_REC.ACCT_PRD_DATA := J1.P_ACCT_PRD;
OUT_REC.PRD_CODE__FR := PRD_CODE__FR;
OUT_REC.PRD_CODE__TO := PRD_CODE__TO;
OUT_REC.FIN_ENTITY := I.FIN_ENTITY;
OUT_REC.EMP_CODE := I.EMP_CODE;
OUT_REC.EMP_FULL_NAME := I.EMP_FULL_NAME;
OUT_REC.PAY_SITE := I.PAY_SITE;
OUT_REC.CCTR_CODE__SAL := I.CCTR_CODE__SAL;
OUT_REC.LOAN_NO := I.LOAN_NO;
OUT_REC.SCHEME_NO := I.SCHEME_NO;
OUT_REC.SCHEME_TYPE := I.SCHEME_TYPE;
OUT_REC.ISSUE_DATE := I.ISSUE_DATE;
OUT_REC.LOAN_DISB_DATE := LD_INT_FIRST_DATE;
OUT_REC.TERM := I.TERM;
OUT_REC.LOAN_AMT := I.LOAN_AMT;
OUT_REC.INTEREST := I.INTEREST;
OUT_REC.MON_INST := I.MON_INST;
OUT_REC.INT_TERM := I.INT_TERM;
OUT_REC.APPR_DATE := I.APPR_DATE;
OUT_REC.DATE__BALANCE := I.DATE__BALANCE;
OUT_REC.DATE__INTEREST := I.DATE__INTEREST;
OUT_REC.LOAN_TYPE := I.LOAN_TYPE;
OUT_REC.LOAN_CLOUSRE_DATE := LD_LOAN_CLOUSRE_DATE;
OUT_REC.ISA_EFF_INT_RATE := LC_EFF_INT_RATE;
OUT_REC.BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.LOAN_START_RECO_DATE := I.START_RECO;
OUT_REC.EMI_NO := EMI_NO;
OUT_REC.EMI_PRD_CODE := J1.CODE;
OUT_REC.EMI_PRD_DESCR := TO_CHAR(J1.FR_DATE , 'MON-YY');
OUT_REC.OP_BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.INTEREST_AMT := LC_INT_DEDN;
OUT_REC.PRINC_CUM_INTEREST_AMT := (LC_LOAN_OP_BAL + LC_INT_DEDN);
OUT_REC.MON_DEDN := (LC_PRINC_DEDN + LC_INT_DEDN);
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.RECOVER_AMT := LC_OTH_RECOVERY;
OUT_REC.CL_BALANCE_AMT := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
OUT_REC.PV_FACTOR := PV_FACTOR;
OUT_REC.PRESENT_VALUE := PRESENT_VALUE;
OUT_REC.AMORTISED_COST_OP_BAL := AMORTISED_COST_OP_BAL;
OUT_REC.INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE;
OUT_REC.REPAYMENT_INCL_INTEREST := (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ;
OUT_REC.AMORTISED_COST_CL_BAL := AMORTISED_COST_CL_BAL;
OUT_REC.EMP_BENEFIT := EMP_BENEFIT;
OUT_REC.DIFF_PRINC_DEDN := DIFF_PRINC_DEDN;
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.LOAN_INT_CALC_STR := LOAN_INT_CALC_STR;
OUT_REC.REPAYMENT_INCL_INTEREST_1 := CASE WHEN LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 THEN (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ELSE AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE END;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
pipe row ( out_rec );
ELSE
--DBMS_OUTPUT.PUT_LINE('EXITED FROM J1 LOOP');
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END LOOP;
RETURN ;
END;
/
SET DEFINE OFF
DROP FUNCTION FN_TF_LOAN_INT_INFO;
DROP TYPE TFT_LOAN_INT_INFO;
DROP TYPE TFO_LOAN_INT_INFO;
CREATE TYPE TFO_LOAN_INT_INFO AS OBJECT
(
ACCT_PRD_ARG CHAR(6),
ACCT_PRD_DATA CHAR(6),
PRD_CODE__FR CHAR(6),
PRD_CODE__TO CHAR(6),
EMP_CODE CHAR(10),
EMP_FULL_NAME VARCHAR2(120),
PAY_SITE CHAR(5),
FIN_ENTITY CHAR(10),
CCTR_CODE__SAL CHAR(4),
LOAN_NO CHAR(15),
SCHEME_NO CHAR(10),
SCHEME_TYPE CHAR(5),
LOAN_AMT NUMBER(12,3),
TERM NUMBER(3),
INT_TERM CHAR(5),
ISSUE_DATE DATE,
LOAN_DISB_DATE DATE,
LOAN_START_RECO_DATE DATE,
LOAN_CLOUSRE_DATE DATE,
MON_INST NUMBER(12,3),
PRE_PAID_EMP_BENIFIT NUMBER(12,3),
INTEREST NUMBER(6,2),
ISA_EFF_INT_RATE NUMBER(6,2),
APPR_DATE DATE,
BALANCE_AMT NUMBER(12,3),
DATE__BALANCE DATE,
DATE__INTEREST DATE,
LOAN_TYPE CHAR(1),
EMI_NO NUMBER(10),
EMI_PRD_CODE CHAR(6),
EMI_PRD_DESCR VARCHAR2(10),
OP_BALANCE_AMT NUMBER(12,3),
INTEREST_AMT NUMBER(12,3),
PRINC_CUM_INTEREST_AMT NUMBER(12,3),
MON_DEDN NUMBER(12,3),
RECOVER_AMT NUMBER(12,3),
CL_BALANCE_AMT NUMBER(12,3),
PRINC_DEDN NUMBER(12,3),
PV_FACTOR NUMBER(10,4),
PRESENT_VALUE NUMBER(12,3),
AMORTISED_COST_OP_BAL NUMBER(12,3),
INTEREST_AT_EFF_RATE NUMBER(12,3),
REPAYMENT_INCL_INTEREST NUMBER(12,3),
AMORTISED_COST_CL_BAL NUMBER(12,3),
EMP_BENEFIT NUMBER(12,3),
DIFF_PRINC_DEDN NUMBER(12,3),
LOAN_INT_CALC_STR VARCHAR2(4000),
REPAYMENT_INCL_INTEREST_1 NUMBER(12,3)
)
/
CREATE TYPE TFT_LOAN_INT_INFO AS TABLE OF TFO_LOAN_INT_INFO
/
CREATE OR REPLACE
FUNCTION FN_TF_LOAN_INT_INFO
(
FIN_ENTITY_CODE_FR FINENT.FIN_ENTITY%TYPE,
FIN_ENTITY_CODE_TO FINENT.FIN_ENTITY%TYPE,
ACCT_PRD ACCTPRD.CODE%TYPE,
PRD_CODE__FR PERIOD.CODE%TYPE,
PRD_CODE__TO PERIOD.CODE%TYPE,
SITE_CODE__FR SITE.SITE_CODE%TYPE,
SITE_CODE__TO SITE.SITE_CODE%TYPE,
CCTR_CODE__FR EMPLOYEE.CCTR_CODE__SAL%TYPE,
CCTR_CODE__TO EMPLOYEE.CCTR_CODE__SAL%TYPE,
EMP_CODE__FR EMPLOYEE.EMP_CODE%TYPE,
EMP_CODE__TO EMPLOYEE.EMP_CODE%TYPE,
EFF_INT_RATE LOANS.INTEREST%TYPE
)
RETURN TFT_LOAN_INT_INFO
PIPELINED IS
OUT_REC TFO_LOAN_INT_INFO := TFO_LOAN_INT_INFO( NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
LI_CNT NUMBER(6);
LI_CNT1 NUMBER(6);
LI_CNT2 NUMBER(6);
EMI_NO NUMBER(6);
TOT_INST_DEDN NUMBER(6);
TOT_INST_NO NUMBER(6);
LC_LOAN_OP_BAL LOANS.LOAN_AMT%TYPE;
LC_LOAN_RECO LOANS.LOAN_AMT%TYPE;
LD_LOAN_CLOUSRE_DATE DATE;
LD_INT_FIRST_DATE DATE;
LD_INT_LAST_DATE DATE;
EMI_PRD_CODE PERIOD.CODE%TYPE;
EMI_PRD_DESCR PERIOD.DESCR%TYPE;
PV_FACTOR NUMBER(12,4);
PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
TOT_PRESENT_VALUE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_OP_BAL LOANS.LOAN_AMT%TYPE;
INTEREST_AT_EFF_RATE LOANS.LOAN_AMT%TYPE;
AMORTISED_COST_CL_BAL LOANS.LOAN_AMT%TYPE;
EMP_BENEFIT LOANS.LOAN_AMT%TYPE;
DIFF_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_PRINC_DEDN LOANS.LOAN_AMT%TYPE;
LC_INT_DEDN LOANS.LOAN_AMT%TYPE;
LC_OTH_RECOVERY LOANS.LOAN_AMT%TYPE;
LC_EFF_INT_RATE LOANS.INTEREST%TYPE;
LS_EXCLUDE_SCHEME_TYPE VARCHAR2(1024);
LOAN_INT_CALC_STR VARCHAR2(4000);
ARG_ACCT_PRD_CODE ACCTPRD.CODE%TYPE;
LD_CAL_FDATE ACCTPRD.FR_DATE%TYPE;
LD_CAL_TDATE ACCTPRD.TO_DATE%TYPE;
LI_NO_DAYS_IN_CAL_YR NUMBER(3);
CURSOR LOAN_INFO(AS_EXCLUDE_SCHEME_TYPE VARCHAR2) IS
SELECT
LN.EMP_CODE AS EMP_CODE ,
TRIM(EM.EMP_FNAME) || ' ' || TRIM(EM.EMP_MNAME) || TRIM(EM.EMP_LNAME) AS EMP_FULL_NAME,
EM.PAY_SITE AS PAY_SITE,
EM.CCTR_CODE__SAL AS CCTR_CODE__SAL,
LN.LOAN_NO AS LOAN_NO,
LN.SCHEME_NO SCHEME_NO,
LN.ISSUE_DATE AS ISSUE_DATE,
LN.START_RECO AS START_RECO,
LN.TERM AS TERM,
LN.LOAN_AMT AS LOAN_AMT,
LN.INTEREST AS INTEREST,
LN.MON_INST AS MON_INST,
LN.INT_TERM AS INT_TERM,
LN.INTEREST_AMT AS INTEREST_AMT,
LN.RECOVER_AMT AS RECOVER_AMT,
LN.APPR_DATE AS APPR_DATE,
LN.BALANCE_AMT AS BALANCE_AMT,
LN.DATE__BALANCE AS DATE__BALANCE,
LN.DATE__INTEREST AS DATE__INTEREST,
LN.LOAN_TYPE AS LOAN_TYPE,
LN.ACT_TERM AS ACT_TERM,
AP.FR_DATE AS FY_FROM_DATE,
AP.TO_DATE AS FY_TO_DATE,
LS.AD_CODE__INT AS AD_CODE__INT,
LS.AD_CODE__DED AS AD_CODE__DED,
LS.SCHEME_TYPE AS SCHEME_TYPE,
SM.FIN_ENTITY AS FIN_ENTITY
FROM LOANS LN, EMPLOYEE EM, SITE SM, ACCTPRD AP, LOAN_SCHEME LS
WHERE EM.EMP_CODE = LN.EMP_CODE
AND LN.EMP_CODE >= EMP_CODE__FR
AND LN.EMP_CODE <= EMP_CODE__TO
AND EM.PAY_SITE >= SITE_CODE__FR
AND EM.PAY_SITE <= SITE_CODE__TO
AND SM.SITE_CODE = EM.PAY_SITE
--AND SM.FIN_ENTITY = FIN_ENTITY_CODE_FR
AND SM.FIN_ENTITY BETWEEN FIN_ENTITY_CODE_FR AND FIN_ENTITY_CODE_TO
AND LN.ISSUE_DATE <= AP.TO_DATE
AND AP.CODE = ACCT_PRD
AND LN.STATUS IN ('A','E')
AND LS.SCHEME_NO = LN.SCHEME_NO
--AND LS.SCHEME_TYPE NOT IN ('A','B')
-- AND LS.SCHEME_TYPE NOT IN (AS_EXCLUDE_SCHEME_TYPE)
AND LS.SCHEME_TYPE NOT IN ( SELECT regexp_substr(AS_EXCLUDE_SCHEME_TYPE, '[^,]+', 1, LEVEL)
token FROM dual CONNECT BY LEVEL <= length(AS_EXCLUDE_SCHEME_TYPE) -
length(REPLACE(AS_EXCLUDE_SCHEME_TYPE, ',', '')) + 1)
ORDER BY SM.FIN_ENTITY,LN.EMP_CODE,LN.ISSUE_DATE;
CURSOR PRD_INFO(START_DATE DATE) IS SELECT A.CODE,A.FR_DATE,A.TO_DATE,
A.ACCT_PRD AS P_ACCT_PRD,B.FR_DATE AS FY_FROM_DATE,B.TO_DATE AS FY_TO_DATE
FROM PERIOD A,ACCTPRD B
WHERE B.CODE = A.ACCT_PRD AND A.TO_DATE >= START_DATE ORDER BY TO_DATE;
CURSOR LOAN_INST_INFO(ARG_LOAN_NO CHAR) IS SELECT * FROM LOANS_SCHEDULE
WHERE LOAN_NO = ARG_LOAN_NO
AND (NO_INST <> NO_INST_DED OR (NO_INST IS NULL AND PRD_CODE IS NULL)) ORDER BY LINE_NO ;
CURSOR LOAN_RECO_INFO(ARG_LOAN_NO CHAR , ARG_FR_DATE DATE , ARG_TO_DATE DATE)
IS SELECT * FROM LOAN_REG WHERE LOAN_NO = ARG_LOAN_NO
AND TRAN_DATE BETWEEN ARG_FR_DATE AND ARG_TO_DATE
AND AMOUNT <> 0 AND TRAN_TYPE NOT IN ('P') AND
CASE WHEN INT_CALCULATED IS NULL THEN 'N' ELSE INT_CALCULATED END = 'N'
ORDER BY TRAN_DATE;
CURSOR LOAN_INT_CALC_INFO(ARG_LOAN_NO CHAR , ARG_PRD_CODE CHAR)
IS SELECT * FROM LOANS_INTEREST_DET WHERE LOAN_NO = ARG_LOAN_NO
AND PRD_CODE = ARG_PRD_CODE ORDER BY PRD_CODE,LINE_NO;
BEGIN
ARG_ACCT_PRD_CODE := ACCT_PRD;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PERIOD WHERE CODE BETWEEN PRD_CODE__FR AND PRD_CODE__TO
AND ACCT_PRD = ARG_ACCT_PRD_CODE;
IF LI_CNT2 = 0 THEN
RETURN;
END IF;
LI_CNT2 := 0;
SELECT COUNT(1) INTO LI_CNT2 FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
IF LI_CNT2 > 0 THEN
SELECT TRIM(VAR_VALUE) INTO LS_EXCLUDE_SCHEME_TYPE FROM PAYRPARM
WHERE PRD_CODE = '999999' AND VAR_NAME = 'IAS_LNREPO_EXCL_SCHM';
ELSE
LS_EXCLUDE_SCHEME_TYPE := '';
END IF;
IF LS_EXCLUDE_SCHEME_TYPE IS NULL OR LENGTH(TRIM(LS_EXCLUDE_SCHEME_TYPE)) = 0 THEN
LS_EXCLUDE_SCHEME_TYPE := '**********';
END IF;
DBMS_OUTPUT.PUT_LINE(LS_EXCLUDE_SCHEME_TYPE);
LI_CNT2 := 0;
FOR I IN LOAN_INFO(LS_EXCLUDE_SCHEME_TYPE)
LOOP
LI_CNT2 := LI_CNT2 + 1;
LI_CNT := 0;
LC_LOAN_OP_BAL := I.LOAN_AMT;
SELECT SUM(AMOUNT) INTO LC_LOAN_RECO FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_DATE < I.FY_FROM_DATE;
IF LC_LOAN_RECO IS NOT NULL THEN
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_LOAN_RECO;
END IF;
LI_CNT1 := 0;
SELECT COUNT(1), MIN(FROM_DATE) INTO LI_CNT1, LD_INT_FIRST_DATE FROM LOAN_INT_REG WHERE LOAN_NO=I.LOAN_NO ;
IF LI_CNT1 > 0 THEN
LD_INT_LAST_DATE := I.DATE__INTEREST + 1;
ELSE
LD_INT_LAST_DATE := I.DATE__INTEREST;
LD_INT_FIRST_DATE := I.DATE__INTEREST;
END IF;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
SELECT SUM(INT_RATE) INTO LC_EFF_INT_RATE FROM LOANSCHEME_INT_RATE
WHERE SCHEME_TYPE = I.SCHEME_TYPE AND LD_INT_FIRST_DATE BETWEEN EFF_FROM AND VALID_UPTO;
IF LC_EFF_INT_RATE IS NULL THEN
LC_EFF_INT_RATE := CASE WHEN EFF_INT_RATE IS NULL OR EFF_INT_RATE <= 0 THEN
I.INTEREST ELSE EFF_INT_RATE END;
END IF;
IF LC_EFF_INT_RATE <= I.INTEREST THEN
LC_LOAN_OP_BAL := 0;
END IF;
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := 0;
TOT_PRESENT_VALUE := 0;
LC_LOAN_OP_BAL := I.LOAN_AMT;
FOR J IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
IF LC_LOAN_OP_BAL > 0 THEN
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLL WHERE EMP_CODE = I.EMP_CODE
AND PRD_CODE = J.CODE;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
IF I.START_RECO <= J.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K.NO_INST IS NULL THEN 9999
ELSE K.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_LOAN_OP_BAL > K.AMOUNT THEN K.AMOUNT ELSE LC_LOAN_OP_BAL END;
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
FOR L IN LOAN_RECO_INFO(I.LOAN_NO, J.FR_DATE, J.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
IF TRIM(I.INT_TERM) = 'EMI' THEN
LC_PRINC_DEDN := I.MON_INST - LC_INT_DEDN;
ELSE
LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
TOT_PRESENT_VALUE := TOT_PRESENT_VALUE + PRESENT_VALUE;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
LD_LOAN_CLOUSRE_DATE := J.TO_DATE;
ELSE
EXIT;
END IF;
END LOOP;
IF LD_LOAN_CLOUSRE_DATE >= I.FY_FROM_DATE THEN
LC_LOAN_OP_BAL := I.LOAN_AMT;
LI_CNT1 := 0;
SELECT CASE WHEN LD_INT_FIRST_DATE > (SELECT TO_DATE FROM PERIOD
WHERE CODE = PRD_CODE__TO) THEN 0 ELSE LC_LOAN_OP_BAL END INTO LC_LOAN_OP_BAL
FROM DUAL;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LC_PRINC_DEDN := 0;
EMI_NO := 0;
FOR J IN PRD_INFO(LD_INT_FIRST_DATE)
LOOP
LD_CAL_FDATE := TO_DATE('01/01/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LD_CAL_TDATE := TO_DATE('31/12/' || TO_CHAR(J.FR_DATE , 'YYYY') , 'DD/MM/YYYY');
LI_NO_DAYS_IN_CAL_YR := LD_CAL_TDATE - LD_CAL_FDATE + 1;
LI_NO_DAYS_IN_CAL_YR := 365; -- Modified by Piyush on 17/06/2016 as per ERP
IF LC_LOAN_OP_BAL > 0 THEN
LC_OTH_RECOVERY := 0;
EMI_NO := EMI_NO + 1;
LI_CNT1 := 0;
LC_PRINC_DEDN := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
IF LI_CNT1 > 0 THEN
SELECT SUM(CASE WHEN AMOUNT IS NULL THEN 0 ELSE AMOUNT END)
INTO LC_PRINC_DEDN FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO
AND TRAN_TYPE = 'P' AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE;
ELSE
LI_CNT1 := 0;
SELECT COUNT(1) INTO LI_CNT1 FROM PAYROLL WHERE EMP_CODE = I.EMP_CODE
AND PRD_CODE = J.CODE;
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_PRINC_DEDN FROM PAYROLLDET
WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND
((REF_TYPE = 'L' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__DED);
ELSE
IF I.START_RECO <= J.FR_DATE THEN
TOT_INST_DEDN := 0;
TOT_INST_NO := 0;
FOR K IN LOAN_INST_INFO(I.LOAN_NO)
LOOP
TOT_INST_NO := TOT_INST_NO + CASE WHEN K.NO_INST IS NULL THEN 999999
ELSE K.NO_INST END;
IF TOT_INST_NO >= EMI_NO THEN
LC_PRINC_DEDN := CASE WHEN LC_LOAN_OP_BAL > K.AMOUNT THEN K.AMOUNT ELSE LC_LOAN_OP_BAL END;
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END IF;
PV_FACTOR := 0;
PRESENT_VALUE := 0;
LC_OTH_RECOVERY := 0;
LC_INT_DEDN := 0;
LOAN_INT_CALC_STR := '';
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := 0.00;
-- Modified to calculate interest as per ERP.End
IF LI_CNT1 > 0 THEN
SELECT AMOUNT INTO LC_INT_DEDN FROM PAYROLLDET WHERE EMP_CODE = I.EMP_CODE AND PRD_CODE = J.CODE AND ((REF_TYPE = 'N' AND REF_NO = I.LOAN_NO) OR AD_CODE = I.AD_CODE__INT);
FOR M IN LOAN_INT_CALC_INFO(I.LOAN_NO , J.CODE)
LOOP
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[AI-' || M.REF_TYPE || '-' ||
TRIM(TO_CHAR(M.AMOUNT)) ||
'-' || TO_CHAR(M.DATE__FROM , 'DD-MON-YY') || '-' ||
'-' || TO_CHAR(M.DATE__TO , 'DD-MON-YY') || '-' ||
'-' || TRIM(TO_CHAR(M.NO_DAYS)) || '-' ||
TRIM(TO_CHAR(M.INT_PERC)) || '-' ||
TRIM(TO_CHAR(M.INTEREST_AMT__DIFF)) || ']';
END LOOP;
ELSE
LC_INT_DEDN := ROUND((LC_LOAN_OP_BAL * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LOANBL-' ||
TRIM(TO_CHAR(LC_LOAN_OP_BAL)) || '-' ||
TO_CHAR(CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END , 'DD-MON-YY') || '-' ||
TO_CHAR(J.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR(LC_INT_DEDN)) || ']' ;
FOR L IN LOAN_RECO_INFO(I.LOAN_NO, J.FR_DATE, J.TO_DATE)
LOOP
LC_INT_DEDN := LC_INT_DEDN - (ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
LOAN_INT_CALC_STR := LOAN_INT_CALC_STR || '[PI-LNRECO-' ||
TRIM(TO_CHAR(L.AMOUNT)) || '-' ||
TO_CHAR(L.TRAN_DATE , 'DD-MON-YY') || '-' ||
TO_CHAR(J.TO_DATE , 'DD-MON-YY') || '-' ||
TRIM(TO_CHAR(((J.TO_DATE - L.TRAN_DATE) + 1))) || '-' ||
TRIM(TO_CHAR(I.INTEREST)) || '-' ||
TRIM(TO_CHAR((ROUND((L.AMOUNT * I.INTEREST / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2)))) || ']' ;
-- Modified to calculate interest as per ERP.Start
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE - (ROUND((L.AMOUNT * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - L.TRAN_DATE) + 1),2));
-- Modified to calculate interest as per ERP.End
END LOOP;
LC_INT_DEDN := CASE WHEN LC_INT_DEDN >= 0 THEN LC_INT_DEDN ELSE 0 END;
IF TRIM(I.INT_TERM) = 'EMI' THEN
LC_PRINC_DEDN := I.MON_INST - LC_INT_DEDN;
ELSE
LC_PRINC_DEDN := I.MON_INST;
END IF;
END IF;
IF LC_PRINC_DEDN > LC_LOAN_OP_BAL THEN
LC_PRINC_DEDN := LC_LOAN_OP_BAL;
END IF;
SELECT SUM(AMOUNT) INTO LC_OTH_RECOVERY FROM LOAN_REG WHERE LOAN_NO = I.LOAN_NO AND TRAN_DATE BETWEEN J.FR_DATE AND J.TO_DATE AND TRAN_TYPE NOT IN ('P');
IF LC_OTH_RECOVERY IS NULL THEN
LC_OTH_RECOVERY := 0;
END IF;
AMORTISED_COST_OP_BAL := CASE WHEN EMI_NO = 1 THEN TOT_PRESENT_VALUE ELSE AMORTISED_COST_CL_BAL END;
-- Commented and shofted above to calculate interest as per ERP logic
-- INTEREST_AT_EFF_RATE := ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2);
INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE + (ROUND((AMORTISED_COST_OP_BAL * LC_EFF_INT_RATE / 100) / (LI_NO_DAYS_IN_CAL_YR) * ((J.TO_DATE - CASE WHEN LD_INT_FIRST_DATE > J.FR_DATE THEN LD_INT_FIRST_DATE ELSE J.FR_DATE END) + 1),2));
-- Commented and modified bellow to set cl bal 0 on clauser of loan.Start
--AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
if LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 then
AMORTISED_COST_CL_BAL := AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE - (LC_PRINC_DEDN + LC_OTH_RECOVERY + LC_INT_DEDN);
else
AMORTISED_COST_CL_BAL := 0;
end if;
-- Commented and modified bellow to set cl bal 0 on clauser of loan.End
PV_FACTOR := ROUND(1 / POWER((1 + ROUND(LC_EFF_INT_RATE / 1200 , 4)),EMI_NO),4);
PRESENT_VALUE := ROUND((LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) * PV_FACTOR , 2);
EMP_BENEFIT := INTEREST_AT_EFF_RATE - LC_INT_DEDN;
DIFF_PRINC_DEDN := (LC_LOAN_OP_BAL - (LC_PRINC_DEDN + LC_OTH_RECOVERY)) - AMORTISED_COST_CL_BAL;
OUT_REC.ACCT_PRD_ARG := ACCT_PRD;
OUT_REC.ACCT_PRD_DATA := J.P_ACCT_PRD;
OUT_REC.PRD_CODE__FR := PRD_CODE__FR;
OUT_REC.PRD_CODE__TO := PRD_CODE__TO;
OUT_REC.FIN_ENTITY := I.FIN_ENTITY;
OUT_REC.EMP_CODE := I.EMP_CODE;
OUT_REC.EMP_FULL_NAME := I.EMP_FULL_NAME;
OUT_REC.PAY_SITE := I.PAY_SITE;
OUT_REC.CCTR_CODE__SAL := I.CCTR_CODE__SAL;
OUT_REC.LOAN_NO := I.LOAN_NO;
OUT_REC.SCHEME_NO := I.SCHEME_NO;
OUT_REC.SCHEME_TYPE := I.SCHEME_TYPE;
OUT_REC.ISSUE_DATE := I.ISSUE_DATE;
OUT_REC.LOAN_DISB_DATE := LD_INT_FIRST_DATE;
OUT_REC.TERM := I.TERM;
OUT_REC.LOAN_AMT := I.LOAN_AMT;
OUT_REC.INTEREST := I.INTEREST;
OUT_REC.MON_INST := I.MON_INST;
OUT_REC.INT_TERM := I.INT_TERM;
OUT_REC.APPR_DATE := I.APPR_DATE;
OUT_REC.DATE__BALANCE := I.DATE__BALANCE;
OUT_REC.DATE__INTEREST := I.DATE__INTEREST;
OUT_REC.LOAN_TYPE := I.LOAN_TYPE;
OUT_REC.LOAN_CLOUSRE_DATE := LD_LOAN_CLOUSRE_DATE;
OUT_REC.ISA_EFF_INT_RATE := LC_EFF_INT_RATE;
OUT_REC.BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.LOAN_START_RECO_DATE := I.START_RECO;
OUT_REC.EMI_NO := EMI_NO;
OUT_REC.EMI_PRD_CODE := J.CODE;
OUT_REC.EMI_PRD_DESCR := TO_CHAR(J.FR_DATE , 'MON-YY');
OUT_REC.OP_BALANCE_AMT := LC_LOAN_OP_BAL;
OUT_REC.INTEREST_AMT := LC_INT_DEDN;
OUT_REC.PRINC_CUM_INTEREST_AMT := (LC_LOAN_OP_BAL + LC_INT_DEDN);
OUT_REC.MON_DEDN := (LC_PRINC_DEDN + LC_INT_DEDN);
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.RECOVER_AMT := LC_OTH_RECOVERY;
OUT_REC.CL_BALANCE_AMT := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
OUT_REC.PV_FACTOR := PV_FACTOR;
OUT_REC.PRESENT_VALUE := PRESENT_VALUE;
OUT_REC.AMORTISED_COST_OP_BAL := AMORTISED_COST_OP_BAL;
OUT_REC.INTEREST_AT_EFF_RATE := INTEREST_AT_EFF_RATE;
OUT_REC.REPAYMENT_INCL_INTEREST := (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ;
OUT_REC.AMORTISED_COST_CL_BAL := AMORTISED_COST_CL_BAL;
OUT_REC.EMP_BENEFIT := EMP_BENEFIT;
OUT_REC.DIFF_PRINC_DEDN := DIFF_PRINC_DEDN;
OUT_REC.PRINC_DEDN := LC_PRINC_DEDN;
OUT_REC.LOAN_INT_CALC_STR := LOAN_INT_CALC_STR;
OUT_REC.REPAYMENT_INCL_INTEREST_1 := CASE WHEN LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY > 0 THEN (LC_PRINC_DEDN + LC_INT_DEDN + LC_OTH_RECOVERY) ELSE AMORTISED_COST_OP_BAL + INTEREST_AT_EFF_RATE END;
LC_LOAN_OP_BAL := LC_LOAN_OP_BAL - LC_PRINC_DEDN - LC_OTH_RECOVERY;
pipe row ( out_rec );
ELSE
EXIT;
END IF;
END LOOP;
END IF;
END IF;
END LOOP;
RETURN ;
END;
/
......@@ -39,7 +39,7 @@ OP_BALANCE_AMT - AMORTISED_COST_OP_BAL AS PREPAIDE_EMP_BENEFIT,
CL_BALANCE_AMT CLOSING_BAL_EMP_LOAN_ACTUAL,
AMORTISED_COST_CL_BAL CLOSING_BAL_EMP_LOAN_IND_AS
FROM
TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct_prd}','$P!{as_prd_code_fr}','$P!{as_prd_code_fr}','$P!{as_site_code_fr}','$P!{as_site_code_to}','$P!{as_cost_center_fr}','$P!{as_cost_center_to}','$P!{as_emp_code_fr}','$P!{as_emp_code_to}',0)) where emi_prd_code = '$P!{as_prd_code_fr}') A , PERIOD B WHERE B.CODE = A.EMI_PRD_CODE]]>
TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct_prd}','$P!{as_prd_code_fr}','$P!{as_prd_code_fr}','$P!{as_site_code_fr}','$P!{as_site_code_to}','$P!{as_cost_center_fr}','$P!{as_cost_center_to}','$P!{as_emp_code_fr}','$P!{as_emp_code_to}',0)) where emi_prd_code = '$P!{as_prd_code_fr}') A , PERIOD B WHERE B.CODE = A.EMI_PRD_CODE AND A.DATE_OF_DISB < B.FR_DATE]]>
</queryString>
<field name="SR_NO" class="java.math.BigDecimal"/>
<field name="EMP_CODE" class="java.lang.String"/>
......@@ -82,7 +82,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField evaluationTime="Group" evaluationGroup="emp_code" isBlankWhenNull="true">
<reportElement uuid="d85f848f-7117-4c72-8db6-fcc762422793" x="4" y="0" width="30" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="SR NO"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Sr No."/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement>
......@@ -92,7 +92,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</textField>
<textField isBlankWhenNull="true">
<reportElement uuid="554e92a1-6661-4b35-87bd-85292596db4c" x="45" y="0" width="55" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="EMP CODE"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Employee Code"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement>
......@@ -105,7 +105,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField isBlankWhenNull="true">
<reportElement uuid="08c83944-02e3-4d45-869b-b530089290c5" x="102" y="0" width="189" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="EMP NAME"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Employee Name"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement>
......@@ -121,7 +121,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField isBlankWhenNull="true">
<reportElement uuid="fb06ccaa-cad9-4161-9899-d4575836fb4a" x="294" y="0" width="40" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="COST CENTER"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Cost Center"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement>
......@@ -134,7 +134,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField isBlankWhenNull="true">
<reportElement uuid="4fecf50f-c985-4fbd-b380-90440de8f904" x="339" y="0" width="44" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="SITE CODE"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Site Code"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement>
......@@ -147,7 +147,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField pattern="0.00" isBlankWhenNull="true">
<reportElement uuid="137df36d-2e83-480e-869d-d384846dc56a" x="471" y="0" width="71" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="ORIGINAL LOAN AMT"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Original Loan Amount"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement textAlignment="Right">
......@@ -160,7 +160,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField pattern="MMM-yy" isBlankWhenNull="true">
<reportElement uuid="4bfa123a-6a82-49b2-abfc-ed563dac5fef" x="546" y="0" width="68" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="DATE OF DISBURSEMENT"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Date of Disbursement"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement textAlignment="Center">
......@@ -173,7 +173,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField pattern="MMM-yy" isBlankWhenNull="true">
<reportElement uuid="02fc4b4b-f3c5-4dde-a9cc-b524566fa402" x="614" y="0" width="68" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="LOAN CLOSER DATE"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Loan Closer Date"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement textAlignment="Center">
......@@ -199,7 +199,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField isBlankWhenNull="true">
<reportElement uuid="e4f83494-2960-4031-adec-752458a52b3b" x="741" y="0" width="39" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="INTEREST RATE %"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Interest Rate %"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement textAlignment="Right">
......@@ -212,7 +212,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField isBlankWhenNull="true">
<reportElement uuid="5470288d-744f-4cda-a9e4-8bfcfde4ddec" x="785" y="0" width="55" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="EFFECTIVE INTEREST RATE %"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Effective Interest Rate %"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement textAlignment="Right">
......@@ -225,7 +225,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField pattern="0.00" isBlankWhenNull="true">
<reportElement uuid="0b2a2331-552c-4f7f-8cd6-89308e135648" x="858" y="0" width="98" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="PREPAID EMP BENEFITS"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Closing Bal of Loan - Actual"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement textAlignment="Right">
......@@ -238,7 +238,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField pattern="0.00" isBlankWhenNull="true">
<reportElement uuid="a74eb774-2a86-4e9c-a11f-a625ac5eb652" x="963" y="0" width="74" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="INTEREST ON STAFF LOAN INCOME"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Closing Bal of Loan - Ind - AS"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement textAlignment="Right">
......@@ -251,7 +251,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField pattern="0.00" isBlankWhenNull="true">
<reportElement uuid="08e0893a-3279-4f48-a7c1-017e4dcee53b" x="1043" y="0" width="80" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="REPAYMENT INCLUDING INTEREST"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Prepaid Employee Benefits"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement textAlignment="Right">
......@@ -267,7 +267,7 @@ TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct
</line>
<textField pattern="0.00" isBlankWhenNull="true">
<reportElement uuid="9d1e1343-0e85-4423-b216-4f8bb13d7da5" x="387" y="-1" width="83" height="14">
<property name="net.sf.jasperreports.export.xls.column.name" value="ORIGINAL LOAN AMT"/>
<property name="net.sf.jasperreports.export.xls.column.name" value="Loan No"/>
<property name="net.sf.jasperreports.export.xls.repeat.value" value="true"/>
</reportElement>
<textElement verticalAlignment="Middle">
......
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="d_loan_summary_monthly" pageWidth="1475" pageHeight="559" orientation="Landscape" columnWidth="1460" leftMargin="12" rightMargin="3" topMargin="8" bottomMargin="3" uuid="d6bb3a4a-9094-4c68-b4f9-3a14837b080b">
<property name="ireport.zoom" value="1.2100000000000004"/>
<property name="ireport.x" value="0"/>
<property name="ireport.x" value="998"/>
<property name="ireport.y" value="0"/>
<property name="net.sf.jasperreports.export.xls.write.header" value="true"/>
<parameter name="as_fin_entity" class="java.lang.String"/>
......@@ -31,15 +31,18 @@ LOAN_CLOUSRE_DATE AS LOAN_CLOSER_DATE,
MON_INST AS EMI,
INTEREST AS INTEREST_RATE,
ISA_EFF_INT_RATE AS EFF_INTEREST_RATE,
SUM(EMP_BENEFIT) AS PREPAIDE_EMP_BENEFIT,
SUM(CASE WHEN LOAN_DISB_DATE <= '31-Mar-2015' AND EMI_PRD_CODE = '201503' THEN CL_BALANCE_AMT - AMORTISED_COST_CL_BAL WHEN LOAN_DISB_DATE > '31-Mar-2015' THEN EMP_BENEFIT ELSE 0 END) AS PREPAIDE_EMP_BENEFIT,
SUM(CASE WHEN EMI_PRD_CODE BETWEEN '$P!{as_prd_code_fr}' and '$P!{as_prd_code_to}' and acct_prd_data = '$P!{as_acct_prd}' THEN INTEREST_AT_EFF_RATE ELSE 0 END) AS SUM_INTEREST_STAFF_LOAN_INCOME,
SUM(CASE WHEN EMI_PRD_CODE BETWEEN '$P!{as_prd_code_fr}' and '$P!{as_prd_code_to}' and acct_prd_data = '$P!{as_acct_prd}' THEN REPAYMENT_INCL_INTEREST ELSE 0 END) AS SUM_REPAYMENT_INCLUDE_INTEREST,
SUM(CASE WHEN EMI_PRD_CODE BETWEEN '$P!{as_prd_code_fr}' and '$P!{as_prd_code_to}' and acct_prd_data = '$P!{as_acct_prd}' THEN EMP_BENEFIT ELSE 0 END) SUM_EMP_BENEFIT_EXP,
SUM(CASE WHEN EMI_PRD_CODE BETWEEN '$P!{as_prd_code_fr}' and '$P!{as_prd_code_to}' and acct_prd_data = '$P!{as_acct_prd}' THEN REPAYMENT_INCL_INTEREST_1 ELSE 0 END) AS SUM_REPAYMENT_INCLUDE_INTEREST,
SUM(CASE WHEN EMI_PRD_CODE BETWEEN '$P!{as_prd_code_fr}' and '$P!{as_prd_code_to}' and acct_prd_data = '$P!{as_acct_prd}' THEN EMP_BENEFIT ELSE 0 END) AS SUM_EMP_BENEFIT_EXP,
MIN(CASE WHEN EMI_PRD_CODE BETWEEN '$P!{as_prd_code_fr}' and '$P!{as_prd_code_to}' and acct_prd_data = '$P!{as_acct_prd}' THEN CL_BALANCE_AMT ELSE 99999999999.99 END) AS CLOSING_BAL_EMP_LOAN_ACTUAL,
MIN(CASE WHEN EMI_PRD_CODE BETWEEN '$P!{as_prd_code_fr}' and '$P!{as_prd_code_to}' and acct_prd_data = '$P!{as_acct_prd}' THEN AMORTISED_COST_CL_BAL ELSE 99999999999.99 END) AS CLOSING_BAL_EMP_LOAN_IND_AS,
MIN(CASE WHEN EMI_PRD_CODE BETWEEN '$P!{as_prd_code_fr}' and '$P!{as_prd_code_to}' and acct_prd_data = '$P!{as_acct_prd}' THEN DIFF_PRINC_DEDN ELSE 99999999999.99 END) AS SUM_DIFF_PRINC_DEDN
FROM
TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct_prd}','$P!{as_prd_code_fr}','$P!{as_prd_code_to}','$P!{as_site_code_fr}','$P!{as_site_code_to}','$P!{as_cost_center_fr}','$P!{as_cost_center_to}','$P!{as_emp_code_fr}','$P!{as_emp_code_to}',0)) GROUP BY EMP_CODE,EMP_FULL_NAME,CCTR_CODE__SAL,PAY_SITE,LOAN_NO,LOAN_AMT,LOAN_DISB_DATE,LOAN_CLOUSRE_DATE,MON_INST,INTEREST,ISA_EFF_INT_RATE) A]]>
(
SELECT * FROM
TABLE(FN_TF_LOAN_INT_INFO('$P!{as_fin_entity}','$P!{as_fin_entity}','$P!{as_acct_prd}','$P!{as_prd_code_fr}','$P!{as_prd_code_to}','$P!{as_site_code_fr}','$P!{as_site_code_to}','$P!{as_cost_center_fr}','$P!{as_cost_center_to}','$P!{as_emp_code_fr}','$P!{as_emp_code_to}',0)) A1,ACCTPRD B1
WHERE B1.CODE = A1.ACCT_PRD_DATA ORDER BY A1.EMP_CODE , A1.LOAN_NO , A1.EMI_NO) A2 GROUP BY EMP_CODE,EMP_FULL_NAME,CCTR_CODE__SAL,PAY_SITE,LOAN_NO,LOAN_AMT,LOAN_DISB_DATE,LOAN_CLOUSRE_DATE,MON_INST,INTEREST,ISA_EFF_INT_RATE ORDER BY EMP_CODE,LOAN_NO) A WHERE CLOSING_BAL_EMP_LOAN_ACTUAL <> 99999999999.99 AND CLOSING_BAL_EMP_LOAN_IND_AS <> 99999999999.99]]>
</queryString>
<field name="SR_NO" class="java.math.BigDecimal"/>
<field name="EMP_CODE" class="java.lang.String"/>
......@@ -575,7 +578,7 @@ Center
<textElement textAlignment="Right">
<font fontName="Times New Roman" size="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{SUM_EMP_BENEFIT_EXP}]]></textFieldExpression>
<textFieldExpression><![CDATA[$F{PREPAIDE_EMP_BENEFIT}]]></textFieldExpression>
</textField>
<line>
<reportElement uuid="ff0d78d7-3135-44d5-adeb-ee75cbe5b015" stretchType="RelativeToBandHeight" x="936" y="1" width="1" height="14"/>
......
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