Introduction of EMI and Implementation

EMI is a calculated amount that is paid by user every term.

Type of EMI

  • Fix EMI
  • Equal Principal EMI
  • Staggered EMI

Fix EMI: In this EMI ,Amount is calculated by formulla.

Formulla:

ROUND( ((pi_amount) * (pi_roi/(l_rate*100))) * (power((1 + (pi_roi/(l_rate*100))),pi_emi_tenure)) / ((power((1 + (pi_roi/(l_rate*100))),pi_emi_tenure)) -1))

Equal Principal EMI: In this EMI ,Loan Amount is divide by tenure of loan after that Interest can be add on that calculated amount.

Eg: Loan Amount =500000 , Tenure=12 (EMI)
So Equal Principal EMI= Loan Amount/Tenure + Interest

Formulla: ROUND((pi_amount)/pi_emi_tenure)

Staggered EMI: In this EMI ,EMI is calculated as Equal Principal EMI. But client give Principal according to their suitability and interest are same as paid by client.

Function:(In Oracle)

  1. CREATE OR REPLACE FUNCTION Galaxy_Cc_Calculator  
  2. (  
  3. pi_amount number DEFAULT NULL,  
  4. pi_roi  number DEFAULT NULL,  
  5. pi_emi_tenure number DEFAULT NULL,  
  6. pi_payment_type VARCHAR2 DEFAULT NULL,  
  7. pi_emi_type VARCHAR2 DEFAULT NULL,  
  8. pi_calc_type VARCHAR2 DEFAULT NULL,  
  9. pi_find VARCHAR2 DEFAULT NULL  
  10. )  
  11. RETURN number  
  12. AS  
  13. l_rate number;  
  14. l_principal number;  
  15. l_returnString VARCHAR2(500);  
  16. BEGIN  
  17. l_principal:=0;  
  18. -- Begin Set Rate Emi Quaterly /HAlfyearly/Monthly  
  19. select  
  20. CASE pi_payment_type  
  21. WHEN 'Half Yearly' THEN 2  
  22. WHEN 'Quaterly' THEN 3  
  23. ELSE 12 END into l_rate from dual;  
  24. -- End Set Rate Emi Quaterly /HAlfyearly/Monthly  
  25. -- Begin IRR Calculator  
  26. IF(pi_calc_type='IRR' OR pi_calc_type='ROI' OR pi_calc_type='UPFRONT'THEN  
  27. -- Begin Fixed Emi  
  28. IF(pi_emi_type='FIXED'THEN  
  29. select  
  30. CASE pi_find  
  31. WHEN 'EMI' THEN  
  32. --ROUND( ((pi_amount) * (pi_roi/(l_rate*100))) * (power((1 + (pi_roi/(l_rate*100))),l_rate)) / ((power((1 + (pi_roi/(l_rate*100))),l_rate)) -1))  
  33. ROUND( ((pi_amount) * (pi_roi/(l_rate*100))) * (power((1 + (pi_roi/(l_rate*100))),pi_emi_tenure)) / ((power((1 + (pi_roi/(l_rate*100))),pi_emi_tenure)) -1))  
  34. WHEN 'INTEREST' THEN  
  35. ROUND((pi_amount) * (pi_roi/(l_rate*100)))  
  36. WHEN 'PRINCIPAL' THEN  
  37. --((ROUND( ((pi_amount) * (pi_roi/(l_rate*100))) * (power((1 + (pi_roi/(l_rate*100))),l_rate)) / ((power((1 + (pi_roi/(l_rate*100))),l_rate)) -1)))- (ROUND((pi_amount) * (pi_roi/(l_rate*100)))))  
  38. ((ROUND( ((pi_amount) * (pi_roi/(l_rate*100))) * (power((1 + (pi_roi/(l_rate*100))),pi_emi_tenure)) / ((power((1 + (pi_roi/(l_rate*100))),pi_emi_tenure)) -1)))- (ROUND((pi_amount) * (pi_roi/(l_rate*100)))))  
  39. WHEN 'EVALUATED PRINCIPAL' THEN  
  40. --ROUND((pi_amount)-(((ROUND( ((pi_amount) * (pi_roi/(l_rate*100))) * (power((1 + (pi_roi/(l_rate*100))),l_rate)) / ((power((1 + (pi_roi/(l_rate*100))),l_rate)) -1)))- (ROUND((pi_amount) * (pi_roi/(l_rate*100)))))))  
  41. ROUND((pi_amount)-(((ROUND( ((pi_amount) * (pi_roi/(l_rate*100))) * (power((1 + (pi_roi/(l_rate*100))),pi_emi_tenure)) / ((power((1 + (pi_roi/(l_rate*100))),pi_emi_tenure)) -1)))- (ROUND((pi_amount) * (pi_roi/(l_rate*100)))))))  
  42. ELSE  
  43. 0  
  44. END  
  45. into l_principal from dual;  
  46. END IF;  
  47. -- End Fixed Emi  
  48. -- Begin Fixed Principal Emi  
  49. IF(pi_emi_type='EQUAL PRINCIPAL'THEN  
  50. select  
  51. CASE pi_find  
  52. WHEN 'EMI' THEN  
  53. ROUND((pi_amount)/pi_emi_tenure)  
  54. WHEN 'INTEREST' THEN  
  55. ROUND((pi_amount) * (pi_roi/(l_rate*100)))  
  56. WHEN 'CASH FLOW' THEN  
  57. ROUND(((pi_amount)/pi_emi_tenure)+ ((pi_amount) * (pi_roi/(l_rate*100))))  
  58. WHEN 'EVALUATED PRINCIPAL' THEN  
  59. ROUND((pi_amount)-((pi_amount)/pi_emi_tenure))  
  60. ELSE  
  61. 0  
  62. END  
  63. into l_principal from dual;  
  64. END IF;  
  65. -- End PrincipalFixed Emi  
  66. -- Begin Staggered EMI Emi  
  67. IF(pi_emi_type='STAGGERED EMI'THEN  
  68. select  
  69. CASE pi_find  
  70. WHEN 'EMI' THEN  
  71. ROUND((pi_amount) * (pi_roi/(l_rate*100)) +((pi_amount)/pi_emi_tenure) )  
  72. WHEN 'INTEREST' THEN  
  73. ROUND((pi_amount) * (pi_roi/(l_rate*100)))  
  74. WHEN 'CASH FLOW' THEN  
  75. ROUND((pi_amount)/pi_emi_tenure)  
  76. WHEN 'EVALUATED PRINCIPAL' THEN  
  77. ROUND((pi_amount) - ((pi_amount)/pi_emi_tenure))  
  78. ELSE  
  79. 0  
  80. END  
  81. into l_principal from dual;  
  82. END IF;  
  83. -- End Staggered EMI Emi  
  84. END IF;  
  85. -- End IRR Calculator  
  86. RETURN l_principal;  
  87. EXCEPTION  
  88. WHEN OTHERS THEN  
  89. l_returnString := 'EXCEPTION';  
  90. RETURN l_returnString;  
  91. END;  
  92. /  
  93. ***********  
  94. Procedure   
  95. ***********    
  96. CREATE OR REPLACE PROCEDURE Galaxy_Cc_Get_Fixed_Emi  
  97. (  
  98. pi_userid IN VARCHAR2,  
  99. pi_principal IN NUMBER,  
  100. pi_interest IN NUMBER,  
  101. pi_tenure IN NUMBER,  
  102. pi_emitype IN VARCHAR2,  
  103. pi_charges IN NUMBER,  
  104. pi_repaymentmethod  IN VARCHAR2,  
  105. pi_calctype IN VARCHAR2,  
  106. pi_IRR IN NUMBER DEFAULT 0,  
  107. po_cursor OUT Plms_Package.ref_cursor,  
  108. po_message  OUT VARCHAR2,  
  109. po_upfrontcharges OUT VARCHAR2  
  110. )  
  111. AS  
  112. l_principal NUMBER :=0;  
  113. l_interest NUMBER :=0;  
  114. l_emi   NUMBER :=0;  
  115. l_amnt NUMBER :=0;  
  116. l_Actprncpl NUMBER :=0;  
  117. p_amount_array XIRR_T_AMOUNT_ARRAY;  
  118. p_date_array Xirr_p_date_array;  
  119. l_guess NUMBER := 0.0;  
  120. l_xirr_value NUMBER := 0.0;  
  121. l_nominal_months INT := 12;  
  122. l_nominal_value NUMBER := 0.0;  
  123. creation_table plms_Table80;  
  124. recordcount NUMBER:=1;  
  125. l_count NUMBER:=1;  
  126. l_date VARCHAR2(50);  
  127. l_outflow NUMBER;  
  128. l_counter NUMBER:=1;  
  129. l_roi NUMBER :=1;  
  130. BEGIN  
  131. creation_table := NEW plms_Table80();  
  132. p_amount_array := XIRR_T_AMOUNT_ARRAY();  
  133. p_date_array := Xirr_p_date_array();  
  134. OPEN po_cursor FOR SELECT * FROM DUAL;  
  135. po_message :='SUCCESS';  
  136. --Begins finding Upfront Charges logic 1  
  137. IF pi_calctype ='UPFRONT' THEN  
  138. IF(pi_charges=0) THEN  
  139. l_outflow:=pi_principal*.1;  
  140. p_amount_array.extend(pi_tenure+1);  
  141. p_date_array.extend(pi_tenure+1);  
  142. p_amount_array(l_count):= -l_outflow;  
  143. p_date_array(l_count):= TO_DATE('01-Jan-2015','dd-Mon-rrrr');  
  144. l_count:=2;  
  145. ELSE  
  146. l_outflow:=pi_principal-pi_charges;  
  147. p_amount_array.extend(pi_tenure+1);  
  148. p_amount_array(l_count):= -l_outflow;  
  149. p_date_array.extend(pi_tenure+1);  
  150. p_date_array(l_count):= TO_DATE('01-Jan-2015','dd-Mon-rrrr');  
  151. l_count:=2;  
  152. END IF ;  
  153. l_nominal_months:=pi_tenure;  
  154. END IF;  
  155. SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'mon'),1),'dd-Mon-rrrr'INTO l_date FROM dual;  
  156. --END finding Upfront Charges  
  157. --Begin IRR Calc Type  
  158. IF (pi_calctype='IRR'THEN  
  159. --Begin EMI Type  
  160. IF (pi_emitype='FIXED EMI'THEN  
  161. --Begin Loop  
  162. FOR i IN 1 .. pi_tenure  
  163. LOOP  
  164. --EMI AMOUNT  
  165. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','EMI'INTO l_emi FROM dual ;  
  166. IF i=1 THEN  
  167. --INTEREST AMOUNT  
  168. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','INTEREST'INTO l_interest FROM dual;  
  169. --PRINCIPAL AMOUNT  
  170. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','PRINCIPAL'INTO l_principal FROM dual;  
  171. --POS OUTSTAINDING AMOUNT  
  172. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  173. ELSE  
  174. --INTEREST AMOUNT  
  175. SELECT Galaxy_Cc_Calculator(l_Actprncpl,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','INTEREST'INTO l_interest FROM dual;  
  176. --PRINCIPAL AMOUNT  
  177. SELECT (ROUND(l_emi - l_interest))INTO l_principal FROM dual;  
  178. --POS OUTSTAINDING AMOUNT  
  179. SELECT (ROUND(l_Actprncpl - (l_emi - l_interest) ))INTO l_Actprncpl FROM dual;  
  180. IF i=pi_tenure THEN  
  181. l_principal:=l_principal+l_Actprncpl;  
  182. l_Actprncpl:=0;  
  183. END IF;  
  184. END IF;  
  185. creation_table.EXTEND;  
  186. creation_table(recordcount) := Plms_Object80( i, l_emi,l_interest,l_principal,l_Actprncpl,  
  187. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  188. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  189. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  190. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  191. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  192. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  193. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  194. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  195. NULL,NULL,NULL,NULL);  
  196. recordcount:=recordcount +1;  
  197. END LOOP;  
  198. --End Loop  
  199. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  200. T1.Param1 "EMI",  
  201. T1.Param2 "INTEREST",  
  202. T1.Param3 "PRINCIPAL",  
  203. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  204. END IF;  
  205. --End EMI Type  
  206. --Begin EQUAL PRINCIPAL EMI Type  
  207. IF (pi_emitype='EQUAL PRINCIPAL EMI'THEN  
  208. --Begin Loop  
  209. FOR i IN 1 .. pi_tenure LOOP  
  210. --PRINCIPAL AMOUNT  
  211. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','EMI'INTO l_emi FROM dual ;  
  212. IF i=1 THEN  
  213. --INTEREST AMOUNT  
  214. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','INTEREST'INTO l_interest FROM dual;  
  215. --EMI AMOUNT  
  216. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','CASH FLOW'INTO l_principal FROM dual;  
  217. --POS OUTSTAINDING AMOUNT  
  218. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  219. ELSE  
  220. --INTEREST AMOUNT  
  221. SELECT Galaxy_Cc_Calculator(l_Actprncpl,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','INTEREST'INTO l_interest FROM dual;  
  222. --EMI AMOUNT  
  223. SELECT (ROUND(l_emi + l_interest))INTO l_principal FROM dual;  
  224. --POS OUTSTAINDING AMOUNT  
  225. SELECT (ROUND(l_Actprncpl - (l_emi) ))INTO l_Actprncpl FROM dual;  
  226. IF i=pi_tenure THEN  
  227. l_emi:=l_emi - (ABS(l_Actprncpl));  
  228. l_principal:=l_principal+l_Actprncpl;  
  229. l_Actprncpl:=0;  
  230. END IF;  
  231. END IF;  
  232. creation_table.EXTEND;  
  233. creation_table(recordcount) := Plms_Object80(i, l_emi,l_interest,l_principal,l_Actprncpl,  
  234. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  235. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  236. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  237. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  238. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  239. NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  240. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  241. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  242. NULL,NULL,NULL,NULL);  
  243. recordcount:=recordcount +1;  
  244. END LOOP;  
  245. --End Loop  
  246. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  247. T1.Param1 "PRINCIPAL",  
  248. T1.Param2 "INTEREST",  
  249. T1.Param3 "EMI",  
  250. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  251. END IF;  
  252. --End EQUAL PRINCIPAL EMI Type  
  253. --Begin STAGGERED EMI Type  
  254. IF (pi_emitype='STAGGERED EMI'THEN  
  255. --Begin Loop  
  256. FOR i IN 1 .. pi_tenure LOOP  
  257. --PRINCIPAL AMOUNT  
  258. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','CASH FLOW'INTO l_principal FROM dual;  
  259. IF i=1 THEN  
  260. --EMI AMOUNT  
  261. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','EMI'INTO l_emi FROM dual ;  
  262. --INTEREST AMOUNT  
  263. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','INTEREST'INTO l_interest FROM dual;  
  264. --POS OUTSTAINDING AMOUNT  
  265. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  266. ELSE  
  267. --INTEREST AMOUNT  
  268. SELECT Galaxy_Cc_Calculator(l_Actprncpl,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','INTEREST'INTO l_interest FROM dual;  
  269. --EMI AMOUNT  
  270. SELECT ROUND(l_principal + l_interest )INTO l_emi FROM dual;  
  271. --POS OUTSTAINDING AMOUNT  
  272. SELECT ROUND(l_Actprncpl-l_principal)INTO l_Actprncpl FROM dual;  
  273. IF i=pi_tenure THEN  
  274. l_principal:=l_principal - (ABS(l_Actprncpl));  
  275. l_Actprncpl:=l_Actprncpl+l_principal;  
  276. l_Actprncpl:=0;  
  277. END IF;  
  278. END IF;  
  279. creation_table.EXTEND;  
  280. creation_table(recordcount) := Plms_Object80( i, l_emi,l_interest,l_principal,l_Actprncpl,  
  281. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  282. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  283. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  284. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  285. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  286. NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  287. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  288. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  289. NULL,NULL,NULL,NULL);  
  290. recordcount:=recordcount +1;  
  291. END LOOP;  
  292. --End Loop  
  293. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  294. T1.Param1 "EMI",  
  295. T1.Param2 "INTEREST",  
  296. T1.Param3 "PRINCIPAL",  
  297. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  298. END IF;  
  299. --End STAGGERED EMI Type  
  300. select TO_CHAR(0) into po_upfrontcharges from dual;  
  301. END IF;  
  302. --End IRR Calc Type  
  303. --Begin ROI Calc Type  
  304. IF (pi_calctype='ROI'THEN  
  305. --Begin EMI Type  
  306. IF (pi_emitype='FIXED EMI'THEN  
  307. --Extra Loop  
  308. while(l_roi!= 0)  
  309. LOOP  
  310. p_amount_array := XIRR_T_AMOUNT_ARRAY();  
  311. p_date_array := Xirr_p_date_array();  
  312. l_count:=1;  
  313. --Begins finding ROI logic 1  
  314. IF pi_calctype ='ROI' THEN  
  315. IF(pi_charges=0) THEN  
  316. l_outflow:=pi_principal;  
  317. p_amount_array.extend(pi_tenure+1);  
  318. p_date_array.extend(pi_tenure+1);  
  319. p_amount_array(l_count):= -l_outflow;  
  320. p_date_array(l_count):= TO_DATE('01-Jan-2015','dd-Mon-rrrr');  
  321. l_count:=2;  
  322. ELSE  
  323. l_outflow:=pi_principal-pi_charges;  
  324. p_amount_array.extend(pi_tenure+1);  
  325. p_amount_array(l_count):= -l_outflow;  
  326. p_date_array.extend(pi_tenure+1);  
  327. p_date_array(l_count):= TO_DATE('01-Jan-2015','dd-Mon-rrrr');  
  328. l_count:=2;  
  329. END IF ;  
  330. l_nominal_months:=pi_tenure;  
  331. END IF;  
  332. SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'mon'),1),'dd-Mon-rrrr'INTO l_date FROM dual;  
  333. --END finding ROI logic 1  
  334. --Begin Loop  
  335. FOR i IN 1 .. pi_tenure  
  336. LOOP  
  337. --EMI AMOUNT  
  338. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'FIXED','IRR','EMI'INTO l_emi FROM dual ;  
  339. IF i=1 THEN  
  340. --INTEREST AMOUNT  
  341. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'FIXED','IRR','INTEREST'INTO l_interest FROM dual;  
  342. --PRINCIPAL AMOUNT  
  343. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'FIXED','IRR','PRINCIPAL'INTO l_principal FROM dual;  
  344. --POS OUTSTAINDING AMOUNT  
  345. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'FIXED','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  346. ELSE  
  347. --INTEREST AMOUNT  
  348. SELECT Galaxy_Cc_Calculator(l_Actprncpl,l_roi,pi_tenure,pi_repaymentmethod,'FIXED','IRR','INTEREST'INTO l_interest FROM dual;  
  349. --PRINCIPAL AMOUNT  
  350. SELECT (ROUND(l_emi - l_interest))INTO l_principal FROM dual;  
  351. --POS OUTSTAINDING AMOUNT  
  352. SELECT (ROUND(l_Actprncpl - (l_emi - l_interest) ))INTO l_Actprncpl FROM dual;  
  353. IF i=pi_tenure THEN  
  354. l_principal:=l_principal+l_Actprncpl;  
  355. l_Actprncpl:=0;  
  356. END IF;  
  357. END IF;  
  358. creation_table.EXTEND;  
  359. creation_table(recordcount) := Plms_Object80( i, l_emi,l_interest,l_principal,l_Actprncpl,  
  360. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  361. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  362. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  363. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  364. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  365. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  366. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  367. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  368. NULL,NULL,NULL,NULL);  
  369. recordcount:=recordcount +1;  
  370. --Logic 2 for Finding ROI  
  371. p_date_array(l_count):= TO_DATE(l_date,'dd-Mon-rrrr');  
  372. p_amount_array(l_count):= l_emi;  
  373. l_count:=l_count+1;  
  374. SELECT ADD_MONTHS(TRUNC(TO_DATE(l_date,'dd-Mon-rrrr'),'mon'),1) INTO l_date FROM dual;  
  375. --End Logic 2 for finding ROI  
  376. END LOOP;  
  377. --End Loop  
  378. --Logic 3 for Finding ROI  
  379. l_guess:=0.1;  
  380. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  381. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  382. IF (pi_IRR = l_nominal_value) THEN  
  383. -- l_outflow:=TO_CHAR(l_nominal_value);  
  384. select TO_CHAR(l_roi) into po_upfrontcharges from dual;  
  385. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  386. T1.Param1 "EMI",  
  387. T1.Param2 "INTEREST",  
  388. T1.Param3 "PRINCIPAL",  
  389. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  390. GOTO gotoEndLoop;  
  391. ELSE  
  392. FOR i IN 1 .. recordcount  
  393. LOOP  
  394. creation_table.DELETE(i);  
  395. END LOOP;  
  396. END IF;  
  397. l_roi:=l_roi+1;  
  398. --Logic 3 for Finding ROI  
  399. END LOOP;  
  400. ---End Extra Loop  
  401. END IF;  
  402. --End Fixed EMI Type  
  403. --Begin EQUAL PRINCIPAL EMI Type  
  404. IF (pi_emitype='EQUAL PRINCIPAL EMI'THEN  
  405. --Begin Extra Loop  
  406. WHILE(l_roi!= 0)  
  407. LOOP  
  408. p_amount_array := XIRR_T_AMOUNT_ARRAY();  
  409. p_date_array := Xirr_p_date_array();  
  410. l_count:=1;  
  411. --Begins finding ROI logic 1  
  412. IF pi_calctype ='ROI' THEN  
  413. IF(pi_charges=0) THEN  
  414. l_outflow:=pi_principal;  
  415. p_amount_array.extend(pi_tenure+1);  
  416. p_date_array.extend(pi_tenure+1);  
  417. p_amount_array(l_count):= -l_outflow;  
  418. p_date_array(l_count):= TO_DATE('01-Jan-2015','dd-Mon-rrrr');  
  419. l_count:=2;  
  420. ELSE  
  421. l_outflow:=pi_principal-pi_charges;  
  422. p_amount_array.extend(pi_tenure+1);  
  423. p_amount_array(l_count):= -l_outflow;  
  424. p_date_array.extend(pi_tenure+1);  
  425. p_date_array(l_count):= TO_DATE('01-Jan-2015','dd-Mon-rrrr');  
  426. l_count:=2;  
  427. END IF ;  
  428. l_nominal_months:=pi_tenure;  
  429. END IF;  
  430. SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'mon'),1),'dd-Mon-rrrr'INTO l_date FROM dual;  
  431. --END finding ROI logic 1  
  432. --Begin Loop  
  433. --Principal  
  434. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','EMI'INTO l_emi FROM dual ;  
  435. FOR i IN 1 .. pi_tenure LOOP  
  436. IF i=1 THEN  
  437. --Interest  
  438. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','INTEREST'INTO l_interest FROM dual;  
  439. --EMI AMOUNT  
  440. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','CASH FLOW'INTO l_principal FROM dual;  
  441. --POS OUTSTAINDING  
  442. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  443. ELSE  
  444. --Interest  
  445. SELECT Galaxy_Cc_Calculator(l_Actprncpl,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','INTEREST'INTO l_interest FROM dual;  
  446. --EMI AMOUNT (PRINCIPAL+INTEREST)  
  447. SELECT (ROUND(l_emi + l_interest))INTO l_principal FROM dual;  
  448. --POS OUTSTAINDING(--POS OUTSTANDING-PRINCIPAL)  
  449. SELECT (ROUND(l_Actprncpl - (l_emi) ))INTO l_Actprncpl FROM dual;  
  450. --FOR LAST ROW TO MATCH THE --POS OUTSTANDING  
  451. IF i=pi_tenure THEN  
  452. l_emi:=l_emi - (ABS(l_Actprncpl));  
  453. l_principal:=l_principal+l_Actprncpl;  
  454. l_Actprncpl:=0;  
  455. END IF;  
  456. END IF;  
  457. creation_table.EXTEND;  
  458. creation_table(recordcount) := Plms_Object80(i, l_emi,l_interest,l_principal,l_Actprncpl,  
  459. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  460. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  461. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  462. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  463. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  464. NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  465. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  466. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  467. NULL,NULL,NULL,NULL);  
  468. recordcount:=recordcount +1;  
  469. --Logic 2 for Finding ROI  
  470. p_date_array(l_count):= TO_DATE(l_date,'dd-Mon-rrrr');  
  471. p_amount_array(l_count):= l_principal/*(EMI AMOUNT)*/;  
  472. l_count:=l_count+1;  
  473. SELECT ADD_MONTHS(TRUNC(TO_DATE(l_date,'dd-Mon-rrrr'),'mon'),1) INTO l_date FROM dual;  
  474. --End Logic 2 for finding ROI  
  475. END LOOP;  
  476. --End Loop  
  477. l_guess:=0.1;  
  478. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  479. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  480. IF (pi_IRR = l_nominal_value) THEN  
  481. SELECT TO_CHAR(l_roi) INTO po_upfrontcharges FROM dual;  
  482. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  483. T1.Param1 "PRINCIPAL",  
  484. T1.Param2 "INTEREST",  
  485. T1.Param3 "EMI",  
  486. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  487. l_roi:=0;  
  488. GOTO gotoEndLoop;  
  489. ELSE  
  490. FOR i IN 1 .. recordcount  
  491. LOOP  
  492. creation_table.DELETE(i);  
  493. END LOOP;  
  494. l_roi:=l_roi+1;  
  495. END IF;  
  496. END LOOP;  
  497. ---End Extra Loop  
  498. END IF;  
  499. --End EQUAL PRINCIPAL EMI Type  
  500. --Begin STAGGERED EMI Type  
  501. IF (pi_emitype='STAGGERED EMI'THEN  
  502. --Begin Extra Loop  
  503. WHILE(l_roi!= 0)  
  504. LOOP  
  505. p_amount_array := XIRR_T_AMOUNT_ARRAY();  
  506. p_date_array := Xirr_p_date_array();  
  507. l_count:=1;  
  508. --Begins finding ROI logic 1  
  509. IF pi_calctype ='ROI' THEN  
  510. IF(pi_charges=0) THEN  
  511. l_outflow:=pi_principal;  
  512. p_amount_array.extend(pi_tenure+1);  
  513. p_date_array.extend(pi_tenure+1);  
  514. p_amount_array(l_count):= -l_outflow;  
  515. p_date_array(l_count):= TO_DATE('01-Jan-2015','dd-Mon-rrrr');  
  516. l_count:=2;  
  517. ELSE  
  518. l_outflow:=pi_principal-pi_charges;  
  519. p_amount_array.extend(pi_tenure+1);  
  520. p_amount_array(l_count):= -l_outflow;  
  521. p_date_array.extend(pi_tenure+1);  
  522. p_date_array(l_count):= TO_DATE('01-Jan-2015','dd-Mon-rrrr');  
  523. l_count:=2;  
  524. END IF ;  
  525. l_nominal_months:=pi_tenure;  
  526. END IF;  
  527. SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'mon'),1),'dd-Mon-rrrr'INTO l_date FROM dual;  
  528. --END finding ROI logic 1  
  529. --Begin Loop  
  530. --Principal  
  531. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','EMI'INTO l_emi FROM dual ;  
  532. FOR i IN 1 .. pi_tenure LOOP  
  533. IF i=1 THEN  
  534. --Interest  
  535. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','INTEREST'INTO l_interest FROM dual;  
  536. --EMI AMOUNT  
  537. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','CASH FLOW'INTO l_principal FROM dual;  
  538. --POS OUTSTAINDING  
  539. SELECT Galaxy_Cc_Calculator(pi_principal,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  540. ELSE  
  541. --Interest  
  542. SELECT Galaxy_Cc_Calculator(l_Actprncpl,l_roi,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','INTEREST'INTO l_interest FROM dual;  
  543. --EMI AMOUNT (PRINCIPAL+INTEREST)  
  544. SELECT (ROUND(l_emi + l_interest))INTO l_principal FROM dual;  
  545. --POS OUTSTAINDING(--POS OUTSTANDING-PRINCIPAL)  
  546. SELECT (ROUND(l_Actprncpl - (l_emi) ))INTO l_Actprncpl FROM dual;  
  547. --FOR LAST ROW TO MATCH THE --POS OUTSTANDING  
  548. IF i=pi_tenure THEN  
  549. l_principal:=l_principal - (ABS(l_Actprncpl));  
  550. l_principal:=l_principal+l_Actprncpl;  
  551. l_Actprncpl:=0;  
  552. END IF;  
  553. END IF;  
  554. creation_table.EXTEND;  
  555. creation_table(recordcount) := Plms_Object80(i, l_emi,l_interest,l_principal,l_Actprncpl,  
  556. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  557. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  558. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  559. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  560. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  561. NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  562. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  563. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  564. NULL,NULL,NULL,NULL);  
  565. recordcount:=recordcount +1;  
  566. --Logic 2 for Finding ROI  
  567. p_date_array(l_count):= TO_DATE(l_date,'dd-Mon-rrrr');  
  568. p_amount_array(l_count):= l_principal/*(EMI AMOUNT)*/;  
  569. l_count:=l_count+1;  
  570. SELECT ADD_MONTHS(TRUNC(TO_DATE(l_date,'dd-Mon-rrrr'),'mon'),1) INTO l_date FROM dual;  
  571. --End Logic 2 for finding ROI  
  572. END LOOP;  
  573. --End Loop  
  574. --Logic 3 for Finding ROI  
  575. l_guess:=0.1;  
  576. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  577. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  578. IF (pi_IRR = l_nominal_value) THEN  
  579. SELECT TO_CHAR(l_roi) INTO po_upfrontcharges FROM dual;  
  580. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  581. T1.Param1 "PRINCIPAL",  
  582. T1.Param2 "INTEREST",  
  583. T1.Param3 "EMI",  
  584. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  585. l_roi:=0;  
  586. GOTO gotoEndLoop;  
  587. ELSE  
  588. FOR i IN 1 .. recordcount  
  589. LOOP  
  590. creation_table.DELETE(i);  
  591. END LOOP;  
  592. l_roi:=l_roi+1;  
  593. END IF;  
  594. --End Logic 3 for finding ROI  
  595. END LOOP;  
  596. ---End Extra Loop  
  597. END IF;  
  598. --End STAGGERED EMI Type  
  599. END IF;  
  600. --End ROI Calc Type  
  601. --Begin If Calc Type is UPFRONT  
  602. IF (pi_calctype='UPFRONT'THEN  
  603. --Begin EMI Type  
  604. IF (pi_emitype='FIXED EMI'THEN  
  605. --Begin Loop  
  606. FOR i IN 1 .. pi_tenure  
  607. LOOP  
  608. --EMI AMOUNT  
  609. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','EMI'INTO l_emi FROM dual ;  
  610. IF i=1 THEN  
  611. --INTEREST AMOUNT  
  612. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','INTEREST'INTO l_interest FROM dual;  
  613. --PRINCIPAL AMOUNT  
  614. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','PRINCIPAL'INTO l_principal FROM dual;  
  615. --POS OUTSTAINDING(--POS OUTSTANDING-PRINCIPAL)  
  616. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  617. ELSE  
  618. --INTEREST AMOUNT  
  619. SELECT Galaxy_Cc_Calculator(l_Actprncpl,pi_interest,pi_tenure,pi_repaymentmethod,'FIXED','IRR','INTEREST'INTO l_interest FROM dual;  
  620. --PRINCIPAL AMOUNT  
  621. SELECT (ROUND(l_emi - l_interest))INTO l_principal FROM dual;  
  622. --POS OUTSTAINDING(--POS OUTSTANDING-PRINCIPAL)  
  623. SELECT (ROUND(l_Actprncpl - (l_emi - l_interest) ))INTO l_Actprncpl FROM dual;  
  624. IF i=pi_tenure THEN  
  625. l_principal:=l_principal+l_Actprncpl;  
  626. l_Actprncpl:=0;  
  627. END IF;  
  628. END IF;  
  629. creation_table.EXTEND;  
  630. creation_table(recordcount) := Plms_Object80( i, l_emi,l_interest,l_principal,l_Actprncpl,  
  631. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  632. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  633. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  634. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  635. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  636. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  637. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  638. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  639. NULL,NULL,NULL,NULL);  
  640. recordcount:=recordcount +1;  
  641. --Begins finding Upfront Charges logic 2  
  642. p_date_array(l_count):= TO_DATE(l_date,'dd-Mon-rrrr');  
  643. p_amount_array(l_count):= l_emi;  
  644. l_count:=l_count+1;  
  645. SELECT ADD_MONTHS(TRUNC(TO_DATE(l_date,'dd-Mon-rrrr'),'mon'),1) INTO l_date FROM dual;  
  646. END LOOP;  
  647. --End finding Upfront Charges logic 2  
  648. --Begins finding Upfront Charges logic 3  
  649. l_guess:=0.1;  
  650. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  651. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  652. l_outflow := 0;  
  653. IF (pi_IRR=l_nominal_value) THEN  
  654. --terminate the loop  
  655. po_message:='SUCCESS';  
  656. ELSIF (pi_IRR > l_nominal_value) THEN  
  657. -- increase the outflow  
  658. l_outflow := l_outflow+pi_principal*.025;  
  659. WHILE ROUND(pi_IRR,0)> ROUND(l_nominal_value,0)  
  660. LOOP  
  661. l_outflow := l_outflow+pi_principal*.025;  
  662. p_amount_array(1):=-l_outflow;  
  663. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  664. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  665. l_counter:=l_counter+1;  
  666. IF l_counter = 100000 THEN  
  667. GOTO gotoEndLoop;  
  668. END IF;  
  669. END LOOP;  
  670. ELSIF (pi_IRR < l_nominal_value) THEN  
  671. -- decrease the outflow  
  672. l_outflow:=0;  
  673. l_outflow := l_outflow+(pi_principal-(pi_principal*.3));  
  674. WHILE ROUND(pi_IRR,0)< ROUND(l_nominal_value,0)  
  675. LOOP  
  676. l_outflow := l_outflow+(pi_principal*.0005);  
  677. p_amount_array(1):= l_outflow*(-1);  
  678. l_xirr_value:=0;  
  679. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  680. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  681. l_counter:=l_counter+1;  
  682. IF l_counter = 100000 THEN  
  683. GOTO gotoEndLoop;  
  684. END IF;  
  685. END LOOP;  
  686. END IF;  
  687. --Begins finding Upfront Charges logic 3  
  688. --End Loop  
  689. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  690. T1.Param1 "EMI",  
  691. T1.Param2 "INTEREST",  
  692. T1.Param3 "PRINCIPAL",  
  693. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  694. select TO_CHAR(pi_principal-l_outflow) into po_upfrontcharges from dual;  
  695. END IF;  
  696. --End EMI Type  
  697. --Begin EQUAL PRINCIPAL EMI Type  
  698. IF (pi_emitype='EQUAL PRINCIPAL EMI'THEN  
  699. --Begin Loop  
  700. FOR i IN 1 .. pi_tenure LOOP  
  701. --PRINCIPAL AMOUNT  
  702. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','EMI'INTO l_emi FROM dual ;  
  703. IF i=1 THEN  
  704. --INTEREST AMOUNT  
  705. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','INTEREST'INTO l_interest FROM dual;  
  706. --EMI AMOUNT  
  707. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','CASH FLOW'INTO l_principal FROM dual;  
  708. --POS OUTSTAINDING(--POS OUTSTANDING-PRINCIPAL)  
  709. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  710. ELSE  
  711. --INTEREST AMOUNT  
  712. SELECT Galaxy_Cc_Calculator(l_Actprncpl,pi_interest,pi_tenure,pi_repaymentmethod,'EQUAL PRINCIPAL','IRR','INTEREST'INTO l_interest FROM dual;  
  713. --EMI AMOUNT  
  714. SELECT (ROUND(l_emi + l_interest))INTO l_principal FROM dual;  
  715. --POS OUTSTAINDING(--POS OUTSTANDING-PRINCIPAL)  
  716. SELECT (ROUND(l_Actprncpl - (l_emi) ))INTO l_Actprncpl FROM dual;  
  717. IF i=pi_tenure THEN  
  718. l_emi:=l_emi - (ABS(l_Actprncpl));  
  719. l_principal:=l_principal+l_Actprncpl;  
  720. l_Actprncpl:=0;  
  721. END IF;  
  722. END IF;  
  723. creation_table.EXTEND;  
  724. creation_table(recordcount) := Plms_Object80(i, l_emi,l_interest,l_principal,l_Actprncpl,  
  725. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  726. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  727. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  728. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  729. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  730. NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  731. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  732. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  733. NULL,NULL,NULL,NULL);  
  734. recordcount:=recordcount +1;  
  735. --Begins finding Upfront Charges logic 2  
  736. p_date_array(l_count):= TO_DATE(l_date,'dd-Mon-rrrr');  
  737. p_amount_array(l_count):= l_emi;  
  738. l_count:=l_count+1;  
  739. SELECT ADD_MONTHS(TRUNC(TO_DATE(l_date,'dd-Mon-rrrr'),'mon'),1) INTO l_date FROM dual;  
  740. END LOOP;  
  741. --End finding Upfront Charges logic 2  
  742. --Begins finding Upfront Charges logic 3  
  743. l_guess:=0.1;  
  744. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  745. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  746. l_outflow := 0;  
  747. IF (pi_IRR=l_nominal_value) THEN  
  748. --terminate the loop  
  749. po_message:='SUCCESS';  
  750. ELSIF (pi_IRR > l_nominal_value) THEN  
  751. -- increase the outflow  
  752. l_outflow := l_outflow+pi_principal*.025;  
  753. WHILE ROUND(pi_IRR,0)>=ROUND(l_nominal_value,0)  
  754. LOOP  
  755. l_outflow := l_outflow+pi_principal*.025;  
  756. p_amount_array(1):=-l_outflow;  
  757. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  758. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  759. l_counter:=l_counter+1;  
  760. IF l_counter = 100000 THEN  
  761. GOTO gotoEndLoop;  
  762. END IF;  
  763. END LOOP;  
  764. ELSIF (pi_IRR < l_nominal_value) THEN  
  765. -- decrease the outflow  
  766. l_outflow:=0;  
  767. l_outflow := l_outflow+(pi_principal-(pi_principal*.3));  
  768. WHILE ROUND(pi_IRR,0)<=ROUND(l_nominal_value,0)  
  769. LOOP  
  770. l_outflow := l_outflow+(pi_principal*.0005);  
  771. p_amount_array(1):= l_outflow*(-1);  
  772. l_xirr_value:=0;  
  773. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  774. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  775. l_counter:=l_counter+1;  
  776. IF l_counter = 100000 THEN  
  777. GOTO gotoEndLoop;  
  778. END IF;  
  779. END LOOP;  
  780. END IF;  
  781. --Begins finding Upfront Charges logic 3  
  782. --End Loop  
  783. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  784. T1.Param1 "PRINCIPAL",  
  785. T1.Param2 "INTEREST",  
  786. T1.Param3 "EMI",  
  787. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  788. select TO_CHAR(pi_principal-l_outflow) into po_upfrontcharges from dual;  
  789. END IF;  
  790. --End EQUAL PRINCIPAL EMI Type  
  791. --STAGGERED EMI Type  
  792. IF (pi_emitype='STAGGERED EMI'THEN  
  793. --Begin Loop  
  794. FOR i IN 1 .. pi_tenure LOOP  
  795. --PRINCIPAL AMOUNT  
  796. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','CASH FLOW'INTO l_principal FROM dual;  
  797. IF i=1 THEN  
  798. --EMI AMOUNT  
  799. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','EMI'INTO l_emi FROM dual ;  
  800. --INTEREST AMOUNT  
  801. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','INTEREST'INTO l_interest FROM dual;  
  802. --POS OUTSTAINDING(--POS OUTSTANDING-PRINCIPAL)  
  803. SELECT Galaxy_Cc_Calculator(pi_principal,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','EVALUATED PRINCIPAL'INTO l_Actprncpl FROM dual;  
  804. ELSE    --INTEREST AMOUNT  
  805. SELECT Galaxy_Cc_Calculator(l_Actprncpl,pi_interest,pi_tenure,pi_repaymentmethod,'STAGGERED EMI','IRR','INTEREST'INTO l_interest FROM dual;  
  806. --EMI AMOUNT  
  807. SELECT ROUND(l_principal + l_interest )INTO l_emi FROM dual;  
  808. --POS OUTSTAINDING(--POS OUTSTANDING-PRINCIPAL)  
  809. SELECT ROUND(l_Actprncpl-l_principal)INTO l_Actprncpl FROM dual;  
  810. IF i=pi_tenure THEN  
  811. l_principal:=l_principal - (ABS(l_Actprncpl));  
  812. l_Actprncpl:=l_Actprncpl+l_principal;  
  813. l_Actprncpl:=0;  
  814. END IF;  
  815. END IF;  
  816. creation_table.EXTEND;  
  817. creation_table(recordcount) := Plms_Object80( i, l_emi,l_interest,l_principal,l_Actprncpl,  
  818. NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,NULL,  
  819. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,NULL,  
  820. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  821. NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  822. NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  823. NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  
  824. NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,NULL,  
  825. NULL,NULL,NULL,NULL ,NULL,NULL,NULL,NULL,NULL,  
  826. NULL,NULL,NULL,NULL);  
  827. recordcount:=recordcount +1;  
  828. --Begins finding Upfront Charges logic 2  
  829. p_date_array(l_count):= TO_DATE(l_date,'dd-Mon-rrrr');  
  830. p_amount_array(l_count):= l_emi;  
  831. l_count:=l_count+1;  
  832. SELECT ADD_MONTHS(TRUNC(TO_DATE(l_date,'dd-Mon-rrrr'),'mon'),1) INTO l_date FROM dual;  
  833. END LOOP;  
  834. --End finding Upfront Charges logic 2  
  835. --Begins finding Upfront Charges logic 3  
  836. l_guess:=0.1;  
  837. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  838. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  839. l_outflow := 0;  
  840. IF (pi_IRR=l_nominal_value) THEN  
  841. --terminate the loop  
  842. po_message:='SUCCESS';  
  843. ELSIF (pi_IRR > l_nominal_value) THEN  
  844. -- increase the outflow  
  845. l_outflow := l_outflow+pi_principal*.025;  
  846. WHILE ROUND(pi_IRR,0)>=ROUND(l_nominal_value,0)  
  847. LOOP  
  848. l_outflow := l_outflow+pi_principal*.025;  
  849. p_amount_array(1):=-l_outflow;  
  850. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  851. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  852. l_counter:=l_counter+1;  
  853. IF l_counter = 100000 THEN  
  854. GOTO gotoEndLoop;  
  855. END IF;  
  856. END LOOP;  
  857. ELSIF (pi_IRR < l_nominal_value) THEN  
  858. -- decrease the outflow  
  859. l_outflow:=0;  
  860. l_outflow := l_outflow+(pi_principal-(pi_principal*.3));  
  861. WHILE ROUND(pi_IRR,0)<=ROUND(l_nominal_value,0)  
  862. LOOP  
  863. l_outflow := l_outflow+(pi_principal*.0005);  
  864. p_amount_array(1):= l_outflow*(-1);  
  865. l_xirr_value:=0;  
  866. SELECT Galaxy_Cc_Xirr(p_date_array, p_amount_array,l_guess) INTO l_xirr_value FROM dual;  
  867. SELECT Galaxy_Cc_Xirr_Nominal(l_xirr_value,l_nominal_months) INTO l_nominal_value FROM dual;  
  868. l_counter:=l_counter+1;  
  869. IF l_counter = 100000 THEN  
  870. GOTO gotoEndLoop;  
  871. END IF;  
  872. END LOOP;  
  873. END IF;  
  874. --Begins finding Upfront Charges logic 3  
  875. --End Loop  
  876. OPEN Po_Cursor FOR SELECT T1.Param0 "S.NO",  
  877. T1.Param1 "EMI",  
  878. T1.Param2 "INTEREST",  
  879. T1.Param3 "PRINCIPAL",  
  880. T1.Param4 "LOAN AMOUNT (POS)"FROM TABLE(creation_table) T1;  
  881. select TO_CHAR(pi_principal-l_outflow) into po_upfrontcharges from dual;  
  882. END IF;  
  883. --End EQUAL PRINCIPAL EMI Type  
  884. END IF;  
  885. --End Calc Type  
  886. --End If Calc Type is UPFRONT  
  887. <<gotoEndLoop>>  
  888. po_message := 'SUCCESS';  
  889. EXCEPTION  
  890. WHEN OTHERS THEN  
  891. po_message := 'Error' || SUBSTR(SQLERRM, 1, 100);  
  892. ROLLBACK;  
  893. Plms_Errorslog('Galaxy_Cc_Get_Fixed_Emi',po_message,pi_userid,NULL,NULL,po_message );  
  894. IF(po_message <>'SUCCESS'THEN  
  895. po_message :='Error in ErrorLog Proc and ' || po_message;  
  896. ROLLBACK;  
  897. RETURN;  
  898. END IF;  
  899. END;  
And call the function in Procedure.Get all the detail in well way.