You are on page 1of 7

ID Children Education Loan Recovery

XXTK_CHILDREN_EDU_LOAN_DED

/***************************************************
*
* Formula Name : XXTK_CHILDREN_EDU_LOAN_DED
*
* Description : This formula is to compute Deduction amount for
* Elements mentioned below. Deductions with Negatvie Salary Carry Forward
*
*
* Element Requirements
* 1.
*
* User Defined Function
* 1. None
*
* Change History
* --------------
*
* Who Date Description
* ---------- ---------- -----------------------
* Sabyasachi 22-Jun-11 Created.
* Nadeem 03-Oct-17 Modified to include the Reducing interest rate for interest
calculation
* Nadeem 27-Dec-17 Modified to include the Negative Balance Issue
*****************************************************/

/* ====== Defaults for Variables Begins ====== */


DEFAULT FOR STOP IS 'NO'
DEFAULT FOR TOTAL_AMOUNT IS 0
DEFAULT FOR NUMBER_OF_INSTALLMENTS IS 0
DEFAULT FOR INSTALLMENT_AMOUNT IS 0
DEFAULT FOR OVERRIDE_DEDUCTION_RULE IS 'N'
DEFAULT FOR CASH_SETTLEMENT IS 0
DEFAULT FOR AMOUNT_PAID_BACK IS 0
DEFAULT FOR BALANCE_OUTSTANDING IS 9999999999999999
DEFAULT FOR MSG IS ' '
DEFAULT FOR NEG_BALANCE IS 0
DEFAULT FOR DEDUCTED_PRINCIPAL IS '0'
DEFAULT FOR DEDUCTED_INTEREST IS '0'
/* ====== Defaults for Variables Ends ====== */
/* ====== Database Items Defaults Begins ====== */
DEFAULT FOR EMP_TERM_DATE IS '31-DEC-4712' (DATE)
DEFAULT FOR PAY_PROC_PERIOD_END_DATE IS '31-DEC-4712' (DATE)
DEFAULT FOR XXTK_MINIMUM_SALARY_PERCENTAGE IS 1
DEFAULT FOR DEFINED_BALANCE_ID IS 0
DEFAULT FOR BALANCE_NAME IS '0'
DEFAULT FOR DIMESION_NAME IS '0'
DEFAULT FOR ELEMENT_NAME IS '0'
DEFAULT FOR INSTALLMENTS_DEDUCTED IS 0
DEFAULT FOR PRINCIPAL IS 0
DEFAULT FOR INTEREST IS 0
DEFAULT FOR PRINCIPAL_REMAINING IS 0
DEFAULT FOR NEG_INTEREST IS 0
/* ====== Database Items Defaults Ends ====== */
/* ====== Formula Body Begins ====== */
INPUTS ARE
TOTAL_AMOUNT,
NUMBER_OF_INSTALLMENTS,
INSTALLMENT_AMOUNT,
OVERRIDE_DEDUCTION_RULE (TEXT),
CASH_SETTLEMENT,
AMOUNT_PAID_BACK,
BALANCE_OUTSTANDING,
NEG_BALANCE,
INSTALLMENTS_DEDUCTED,
PRINCIPAL_REMAINING,
E2 (TEXT),
E1 (TEXT),
REMARKS (TEXT)

/*BALANCE_NAME = ELEMENT_NAME||' Neg'


DIMESION_NAME = '_ASG_LTD'
DEFINED_BALANCE_ID = XXTK_GET_DEFINED_BALANCE_ID(BALANCE_NAME,DIMESION_NAME)
NEG_SAL_BF_BAL =
XXTK_GET_BALANCE_VALUE(DEFINED_BALANCE_ID,PAY_PROC_PERIOD_END_DATE)*/

NEG_SAL_BF_BAL = NEG_BALANCE

/* Minimum Salary Criteria */


IF OVERRIDE_DEDUCTION_RULE = 'N' THEN
MIN_SAL_PERCENTAGE = XXTK_MINIMUM_SALARY_PERCENTAGE
ELSE
MIN_SAL_PERCENTAGE = 1
/* Minimum Salary Criteria */
MAX_DEDUCTION_RULE_AMT = DEDUCTION_RULE_SALARY_ASG_RUN * MIN_SAL_PERCENTAGE

MSG = 'MAX_DEDUCTION_RULE_AMT '||


TO_TEXT(MAX_DEDUCTION_RULE_AMT)||'MIN_SAL_PERCENTAGE '||TO_TEXT(MIN_SAL_PERCENTAGE)

/* Deriving the installment amount */


IF INSTALLMENT_AMOUNT WAS DEFAULTED THEN
(
INSTALLMENT_AMOUNT_VALUE = TOTAL_AMOUNT/NUMBER_OF_INSTALLMENTS
)
ELSE
(
INSTALLMENT_AMOUNT_VALUE = INSTALLMENT_AMOUNT
)

/* Stop the loan once the deduction is over */


IF (BALANCE_OUTSTANDING) = 0 THEN
(
MSG = ELEMENT_NAME ||' - HAS BEEN PAID BACK. '
STOP = 'YES'
RETURN MSG, STOP
)
/* /* New Loan */
/*IF BALANCE_OUTSTANDING WAS DEFAULTED THEN*/
/* Included Installment_Deducted variable in order to calculate the Balance
outstanding for
the next month when the balance outstanding is not defaulted*/

OS_LOAN = GREATEST((BALANCE_OUTSTANDING - CASH_SETTLEMENT),0)

IF AMOUNT_PAID_BACK WAS DEFAULTED THEN


(
AMT_PAID = 0
)
ELSE
(
AMT_PAID = AMOUNT_PAID_BACK
)

MON_PAYMENT = LEAST(INSTALLMENT_AMOUNT_VALUE,OS_LOAN)

IF OS_LOAN <= INSTALLMENT_AMOUNT_VALUE THEN


(
DEDUCTION_AMOUNT = MON_PAYMENT
)
ELSE
(
DEDUCTION_AMOUNT = LEAST( (MON_PAYMENT + NEG_SAL_BF_BAL), OS_LOAN)
)

/* No fund for deduction */


IF (DEDUCTION_RULE_SALARY_ASG_RUN-MAX_DEDUCTION_RULE_AMT) >= NET_PAY_ASG_RUN
THEN
(
NEG_SAL_CF = DEDUCTION_AMOUNT
CNT = NEG_SAL_CF/INSTALLMENT_AMOUNT_VALUE
INTEREST_P = ROUND(INSTALLMENT_AMOUNT_VALUE * ((4/100)/12),0)
MON_PAYMENT = 0
/*MSG = ELEMENT_NAME ||' is not deducted this month No funds available'*/
INSTALLMENTS_DEDUCTED_N = INSTALLMENTS_DEDUCTED
INTEREST_N=TRIM(SUBSTR((REMARKS),1,INSTR((REMARKS),'-',1)-1))
PRINCIPLE_N=TRIM(SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))+1,
(INSTR(SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))+1,LENGTH(REMARKS)),'-',1))-1))
IF ISNULL(PRINCIPLE_N) = 'Y' THEN PRINCIPLE_N = '0' ELSE PRINCIPLE_N =
PRINCIPLE_N
OUTSTAN_PRIN_N=TRIM(SUBSTR((SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))
+1,LENGTH(REMARKS))),(INSTR(SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))
+1,LENGTH(REMARKS)),'-',1))+1,LENGTH(REMARKS)))
IF to_number(PRINCIPLE_N) !=0 THEN
(
INTEREST_C=ROUND(to_number(OUTSTAN_PRIN_N)*((4/100)/12),0) + INTEREST_P
PRINCIPAL_REMAINING_NEW1 = (to_number(OUTSTAN_PRIN_N)
+ROUND(to_number(OUTSTAN_PRIN_N)*((4/100)/12),0)) - INSTALLMENT_AMOUNT
)
ELSE
(
INTEREST_C=ROUND(PRINCIPAL_REMAINING*((4/100)/12),0) + INTEREST_P
PRINCIPAL_REMAINING_NEW1 =
(PRINCIPAL_REMAINING+ROUND(PRINCIPAL_REMAINING*((4/100)/12),0)) -
INSTALLMENT_AMOUNT
)
PRINCIPAL_C=ROUND(INSTALLMENT_AMOUNT - INTEREST_C,0) + INTEREST_P
INTEREST_REM = TO_CHAR(INTEREST_C+to_number(INTEREST_N)) ||' - ' ||
TO_CHAR(PRINCIPAL_C+to_number(PRINCIPLE_N)) || ' - ' ||
TO_CHAR(PRINCIPAL_REMAINING_NEW1)
MSG = ELEMENT_NAME||' '|| PRINCIPLE_N ||' '||INTEREST_REM ||' '||
TO_CHAR(PRINCIPAL_C)||' '|| TO_CHAR(PRINCIPAL_REMAINING)||' '|| TO_CHAR(INTEREST_C
- INTEREST_P)||' '||TO_CHAR(INTEREST_P)||' '||TO_CHAR(INTEREST_C)|| ' '||
TO_CHAR(PRINCIPAL_REMAINING_NEW1)||' is not deducted this month No funds available'
/*MSG = ELEMENT_NAME|| PRINCIPLE_N ||' '|| TO_CHAR(PRINCIPAL_C)||' '||
TO_CHAR(PRINCIPAL_REMAINING)||' '|| TO_CHAR(INTEREST_C - INTEREST_P)||' '||
TO_CHAR(INTEREST_P)||' '||TO_CHAR(INTEREST_C)|| ' '||
TO_CHAR(PRINCIPAL_REMAINING_NEW1)||' is not deducted this month No funds
available'*/
PRINCIPAL = 0
INTEREST = 0
NEG_INTEREST = 0
INSTALLMENTS_DEDUCTED_C = TO_CHAR(INSTALLMENTS_DEDUCTED_N)
IF CNT = 1 THEN
PRINCIPAL_REMAINING_C = PRINCIPAL_REMAINING
ELSE
PRINCIPAL_REMAINING_C = PRINCIPAL_REMAINING_NEW1
IF ISNULL(PRINCIPAL_REMAINING_C) = 'Y' THEN PRINCIPAL_REMAINING = 0 ELSE
PRINCIPAL_REMAINING = PRINCIPAL_REMAINING_C
)
/* if there is sufficient funds of recovery */
ELSE IF (DEDUCTION_RULE_SALARY_ASG_RUN-MAX_DEDUCTION_RULE_AMT) <=
(NET_PAY_ASG_RUN-DEDUCTION_AMOUNT) THEN
(
MON_PAYMENT = DEDUCTION_AMOUNT
IF (NEG_BALANCE != 0) THEN CNT = NEG_BALANCE/INSTALLMENT_AMOUNT_VALUE ELSE CNT
= 0
NEG_SAL_CF = 0
INSTALLMENTS_DEDUCTED_N = INSTALLMENTS_DEDUCTED + CNT + 1
INSTALLMENTS_DEDUCTED_C = TO_CHAR(INSTALLMENTS_DEDUCTED_N)
OUTSTAN_PRIN_N=TRIM(SUBSTR((SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))
+1,LENGTH(REMARKS))),(INSTR(SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))
+1,LENGTH(REMARKS)),'-',1))+1,LENGTH(REMARKS)))
IF TO_NUMBER(OUTSTAN_PRIN_N) != 0 THEN
(
INTEREST_N=TRIM(SUBSTR((REMARKS),1,INSTR((REMARKS),'-',1)-1))
PRINCIPLE_N=TRIM(SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))+1,
(INSTR(SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))+1,LENGTH(REMARKS)),'-',1))-1))
OUTSTAN_PRIN_N=TRIM(SUBSTR((SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))
+1,LENGTH(REMARKS))),(INSTR(SUBSTR((REMARKS),(INSTR((REMARKS),'-',1))
+1,LENGTH(REMARKS)),'-',1))+1,LENGTH(REMARKS)))
INTEREST_C = TO_NUMBER(INTEREST_N) +
ROUND(TO_NUMBER(OUTSTAN_PRIN_N)*((4/100)/12),0)
IF ISNULL(INTEREST_C) = 'Y' THEN INTEREST = 0 ELSE INTEREST = INTEREST_C
PRINCIPAL_C = TO_NUMBER(PRINCIPLE_N) + ROUND(INSTALLMENT_AMOUNT -
ROUND(TO_NUMBER(OUTSTAN_PRIN_N)*((4/100)/12),0),0)
IF ISNULL(PRINCIPAL_C) = 'Y' THEN PRINCIPAL = 0 ELSE PRINCIPAL = PRINCIPAL_C
INTEREST_P = ROUND(INSTALLMENT_AMOUNT_VALUE * ((4/100)/12),0)
PRINCIPAL_REMAINING_C = ((TO_NUMBER(OUTSTAN_PRIN_N)+
(ROUND(TO_NUMBER(OUTSTAN_PRIN_N)*((4/100)/12),0))) - INSTALLMENT_AMOUNT_VALUE)
NEG_INTEREST = ROUND(INSTALLMENT_AMOUNT_VALUE * ((4/100)/12),0) * CNT
IF ISNULL(NEG_INTEREST) = 'Y' THEN NEG_INTEREST = 0 ELSE NEG_INTEREST =
NEG_INTEREST
)
ELSE
(
INTEREST_C= ROUND(PRINCIPAL_REMAINING*((4/100)/12),0)
NEG_INTEREST = 0
IF ISNULL(INTEREST_C) = 'Y' THEN INTEREST = 0 ELSE INTEREST = INTEREST_C
PRINCIPAL_C= ROUND(INSTALLMENT_AMOUNT - INTEREST_C,0)
IF ISNULL(PRINCIPAL_C) = 'Y' THEN PRINCIPAL = 0 ELSE PRINCIPAL = PRINCIPAL_C
PRINCIPAL_REMAINING_C = (PRINCIPAL_REMAINING+INTEREST) - MON_PAYMENT
)
)
/* Partial Deduction*/
ELSE IF (DEDUCTION_RULE_SALARY_ASG_RUN-MAX_DEDUCTION_RULE_AMT) <=
NET_PAY_ASG_RUN THEN
(
NEG_SAL_CF = DEDUCTION_AMOUNT
MON_PAYMENT = 0
MSG = ELEMENT_NAME ||' is not deducted this month.Partial funds available'
INSTALLMENTS_DEDUCTED_N = INSTALLMENTS_DEDUCTED
INTEREST_C=ROUND(PRINCIPAL_REMAINING*((4/100)/12),0)
PRINCIPAL_C=ROUND(INSTALLMENT_AMOUNT - INTEREST_C,0)
INTEREST_REM = TO_CHAR(INTEREST_C) ||' - ' ||TO_CHAR(PRINCIPAL_C)
PRINCIPAL = 0
INTEREST = 0
INSTALLMENTS_DEDUCTED_C = TO_CHAR(INSTALLMENTS_DEDUCTED_N)
PRINCIPAL_REMAINING_C = PRINCIPAL_REMAINING
/*XXTK_GET_TABLE_VALUE('XXTK Children Education Loan EMI
Details',INSTALLMENTS_DEDUCTED_C, 'Principal Remaining',
PAY_PROC_PERIOD_END_DATE)*/
IF ISNULL(PRINCIPAL_REMAINING_C) = 'Y' THEN PRINCIPAL_REMAINING = 0 ELSE
PRINCIPAL_REMAINING = PRINCIPAL_REMAINING_C
)
/*MSG = ELEMENT_NAME||INTEREST_REM ||' '|| TO_CHAR(PRINCIPAL_C)||' '||
TO_CHAR(PRINCIPAL_REMAINING)||' '|| TO_CHAR(INTEREST_C - INTEREST_P)||' '||
TO_CHAR(INTEREST_P)||' '||TO_CHAR(INTEREST_C)|| ' '||
TO_CHAR(PRINCIPAL_REMAINING_NEW1)||' is not deducted this month No funds
available'*/
NEG_INTEREST = 0
MON_PAYMENT = MON_PAYMENT + NEG_INTEREST
OS_LOAN_NEW = (OS_LOAN - MON_PAYMENT)
DEDUCTED_PRINCIPAL1 = TO_NUMBER((SUBSTR (E1,1,INSTR (E1,'-')- 1))) + PRINCIPAL
IF (DEDUCTED_PRINCIPAL1 > 9999) OR (DEDUCTED_PRINCIPAL1 < 0) THEN
DEDUCTED_PRINCIPAL = '0 - DEDUCTED_PRINCIPAL' ELSE DEDUCTED_PRINCIPAL =
TO_TEXT(DEDUCTED_PRINCIPAL1) + ' - Deducted Principal'
DEDUCTED_INTEREST1 = TO_NUMBER((SUBSTR (E2,1,INSTR (E2,'-')- 1))) + INTEREST
IF (DEDUCTED_INTEREST1 > 9999) OR (DEDUCTED_INTEREST1 < 0) THEN
DEDUCTED_INTEREST = '0 - DEDUCTED_INTEREST' ELSE DEDUCTED_INTEREST =
TO_TEXT(DEDUCTED_INTEREST1) + ' - Deducted Interest'
/*DEDUCTED_INTEREST = TO_TEXT ((TO_NUMBER((SUBSTR (E2,1,INSTR (E2,'-')- 1))) +
INTEREST)) + ' - Deducted Interest'*/
MSG = MSG||' ' ||TO_CHAR(PRINCIPAL_REMAINING_C)||' '||ELEMENT_NAME ||' -
OUTSTANDING BALANCE = '||TO_TEXT(OS_LOAN_NEW)
PRINCIPAL_REMAINING = PRINCIPAL_REMAINING_C
AMT_PAID_NEW = (AMOUNT_PAID_BACK + MON_PAYMENT + CASH_SETTLEMENT)
CASH_SETTLE = 0
TOT_AMT_PAID = (TOTAL_AMOUNT)
/*ACCUMULATED_INTEREST = TO_TEXT(TO_NUMBER(E2)+INTEREST) + '- Accumulated
Interest'*/

/************** < Adding section for termination recovery Start>


*******************/
/*********< If deduction is other than Bank Loan, PF Loan or Court >**********/
/*********< recover every thing >**********/

IF (EMP_TERM_DATE <= PAY_PROC_PERIOD_END_DATE AND ELEMENT_NAME <> 'ID Bank


Loan')
OR (EMP_TERM_DATE <= PAY_PROC_PERIOD_END_DATE AND ELEMENT_NAME <> 'ID PF Loan
Recovery')
OR (EMP_TERM_DATE <= PAY_PROC_PERIOD_END_DATE AND ELEMENT_NAME <> 'ID Court
Orders WB')
THEN
(
IF BALANCE_OUTSTANDING WAS DEFAULTED THEN
(
INSTALLMENTS_DEDUCTED_C = TO_CHAR(INSTALLMENTS_DEDUCTED)
PRINCIPAL_REMAINING_C = 0
/*XXTK_GET_TABLE_VALUE('XXTK Children Education Loan EMI
Details',INSTALLMENTS_DEDUCTED_C, 'Principal Remaining',
PAY_PROC_PERIOD_END_DATE)*/
IF ISNULL(PRINCIPAL_REMAINING_C) = 'Y' THEN PRINCIPAL_REMAINING = 0 ELSE
PRINCIPAL_REMAINING = PRINCIPAL_REMAINING_C

MON_PAYMENT = PRINCIPAL_REMAINING/*TOTAL_AMOUNT - CASH_SETTLEMENT*/


OS_LOAN_NEW = 0
AMT_PAID_NEW = TOTAL_AMOUNT
CASH_SETTLE = 0
TOT_AMT_PAID = TOTAL_AMOUNT
MSG = 'Termination Month. Recovering all'
NEG_SAL_CF = 0
PRINCIPAL = PRINCIPAL_REMAINING
INTEREST = 0
)
ELSE
(
INSTALLMENTS_DEDUCTED_C = TO_CHAR(INSTALLMENTS_DEDUCTED)
PRINCIPAL_REMAINING_C = 0
/*XXTK_GET_TABLE_VALUE('XXTK Children Education Loan EMI
Details',INSTALLMENTS_DEDUCTED_C, 'Principal Remaining',
PAY_PROC_PERIOD_END_DATE)*/
IF ISNULL(PRINCIPAL_REMAINING_C) = 'Y' THEN PRINCIPAL_REMAINING = 0 ELSE
PRINCIPAL_REMAINING = PRINCIPAL_REMAINING_C

MON_PAYMENT = PRINCIPAL_REMAINING/*BALANCE_OUTSTANDING -
CASH_SETTLEMENT*/
OS_LOAN_NEW = 0
AMT_PAID_NEW = TOTAL_AMOUNT
CASH_SETTLE = 0
TOT_AMT_PAID = TOTAL_AMOUNT
MSG = 'Termination Month. Recovering all'
NEG_SAL_CF = 0
PRINCIPAL = PRINCIPAL_REMAINING
INTEREST = 0
)
)
/************** < Adding section for termination recovery End>
*******************/

/************** < Adding section for termination recovery Start>


*******************/
/*********< If deduction Bank Loan, PF Loan or Court >**********/
/*********< Do not deduct >**********/

IF (EMP_TERM_DATE <= PAY_PROC_PERIOD_END_DATE AND ELEMENT_NAME = 'ID Bank


Loan')
OR (EMP_TERM_DATE <= PAY_PROC_PERIOD_END_DATE AND ELEMENT_NAME = 'ID PF Loan
Recovery')
OR (EMP_TERM_DATE <= PAY_PROC_PERIOD_END_DATE AND ELEMENT_NAME = 'ID Court
Orders WB')
THEN
(
NEG_SAL_CF = DEDUCTION_AMOUNT
MON_PAYMENT = 0
MON_PAYMENT = MON_PAYMENT
OS_LOAN_NEW = (OS_LOAN - MON_PAYMENT)
AMT_PAID_NEW = (AMOUNT_PAID_BACK + MON_PAYMENT + CASH_SETTLEMENT)
CASH_SETTLE = 0
TOT_AMT_PAID = (TOTAL_AMOUNT)
)

/************** < Adiing section for termination recovery End>


*******************/

RETURN MON_PAYMENT,
OS_LOAN_NEW,
AMT_PAID_NEW,
CASH_SETTLE,
TOT_AMT_PAID,
MSG,
NEG_SAL_CF,
NEG_SAL_BF_BAL,
INSTALLMENTS_DEDUCTED_N,
PRINCIPAL,
INTEREST,
PRINCIPAL_REMAINING,
DEDUCTED_INTEREST,
DEDUCTED_PRINCIPAL,
INTEREST_REM

/* ====== Formula Body Ends ====== */

You might also like