Initial project structure: directories, empty files, requirements.txt, and logo
This commit is contained in:
685
old-database/PENSION.SC
Executable file
685
old-database/PENSION.SC
Executable file
@@ -0,0 +1,685 @@
|
||||
MESSAGE "Writing pension procedures to library..."
|
||||
|
||||
|
||||
PROC Ask_For_Output()
|
||||
PRIVATE File_Id
|
||||
Subset_Table = "P_Output"
|
||||
ECHO OFF
|
||||
FORMKEY
|
||||
MOVETO "Output"
|
||||
MOVETO FIELD "File_No"
|
||||
File_Id = [Pensions->File_No] + [Pensions->Version]
|
||||
LOCATE File_Id
|
||||
if RetVal then ; output record located
|
||||
COPYTOARRAY Temp_Array
|
||||
CREATE Subset_Table LIKE "Output"
|
||||
VIEW Subset_Table
|
||||
COEDITKEY
|
||||
COPYFROMARRAY Temp_Array
|
||||
DO_IT!
|
||||
FORMKEY
|
||||
Select_Forms()
|
||||
DELETE Subset_Table
|
||||
else MESSAGE("Please compute and save results of this entry first!")
|
||||
endif
|
||||
MOVETO "Pensions"
|
||||
FORMKEY
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Ask_For_Output
|
||||
|
||||
|
||||
PROC Discount(DR, IR, Max_COLA, Pmts, Monthly)
|
||||
PRIVATE COLA, PV_Pmt, Months_Delayed
|
||||
DR = DR * 0.01/12
|
||||
; if (IR = 0) then
|
||||
; Payout = Round(Pmts * Monthly,0)
|
||||
; Fund_Bal = Round(PV(Monthly, DR, Pmts),0)
|
||||
; else
|
||||
|
||||
; F = "TEMP.TXT"
|
||||
; FILEWRITE F FROM "This is a printout of the annuity stream."+"\n"+"\n"
|
||||
Months_Delayed = 12; number of monthly payments until COLA kicks in
|
||||
Payout = 0
|
||||
Fund_Bal = 0
|
||||
DR = 1/(1+DR)
|
||||
FOR N FROM 1 to Pmts
|
||||
if (IR > 0.0) then
|
||||
if (N > Months_Delayed) AND (MOD(N,12) = 1) then
|
||||
if (IR < 1.0) then
|
||||
COLA = Round(Monthly*IR,2)
|
||||
else COLA = IR
|
||||
endif
|
||||
if (Max_COLA > 0.0) AND (COLA > Max_COLA) then
|
||||
COLA = Max_COLA
|
||||
endif
|
||||
Monthly = Monthly + COLA
|
||||
endif; (if N > Months_Delayed AND Divisible by 12)
|
||||
endif; (if Increase Rate > 0.0)
|
||||
|
||||
Payout = Payout + Monthly
|
||||
PV_Pmt = Round(Monthly * Round(POW(DR,N),5),2)
|
||||
Fund_Bal = Fund_Bal + PV_Pmt
|
||||
|
||||
; PRINT FILE F FORMAT("W5", N), FORMAT("W15.2,EC", Monthly), FORMAT("W15.2,EC", Payout), FORMAT("W15.2,EC", PV_Pmt), FORMAT("W15.2,EC", Fund_Bal),"\n"
|
||||
|
||||
ENDFOR; FOR N FROM 1 to Pmts
|
||||
Payout = Round(Payout,0)
|
||||
Fund_Bal = Round(Fund_Bal,0)
|
||||
; endif; if (IR > 0)
|
||||
Last_Pmt = Monthly
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Discount
|
||||
|
||||
|
||||
PROC Life_Stats( Age_1, Age_2, Race_Sex_Code )
|
||||
PRIVATE
|
||||
I, N,
|
||||
Alive_Now, Alive_Then
|
||||
FORMKEY; get out of pension table form view
|
||||
MOVETO Life_Table
|
||||
MOVETO FIELD "Age"
|
||||
LOCATE INT(Age_1) ; integer, current age
|
||||
MOVETO FIELD "NA_" + Race_Sex_Code
|
||||
; F = "TEMP.TXT"
|
||||
FOR I FROM 1 to ARRAYSIZE(Num_Alive) ; copy number alive to array
|
||||
Num_Alive[I] = []
|
||||
; PRINT FILE F FORMAT( "W9.2", I )
|
||||
; PRINT FILE F FORMAT( "W9.2", Num_Alive[I] ), "\n"
|
||||
DOWN
|
||||
ENDFOR
|
||||
I = ARRAYSIZE(Num_Alive)
|
||||
Alive_Now = Round(Num_Alive[1]-(Num_Alive[1]-Num_Alive[2])*(Age_1-INT(Age_1)),0)
|
||||
Alive_Then = Round(Num_Alive[I-1]-(Num_Alive[I-1]-Num_Alive[I])*(Age_2-INT(Age_2)),0)
|
||||
Num_Alive[1] = Alive_Now
|
||||
Num_Alive[I] = Alive_Then
|
||||
; PRINT FILE F FORMAT( "W9.2", Num_Alive[1] ), "\n"
|
||||
; PRINT FILE F FORMAT( "W9.2", Num_Alive[I] ), "\n"
|
||||
Mortality = Round((Alive_Then/Alive_Now), 4)
|
||||
if (Mortality > 1.0) then
|
||||
Mortality = 1.0
|
||||
endif
|
||||
LEFT
|
||||
UP
|
||||
N = []
|
||||
UP
|
||||
I = []
|
||||
LE = Round(I-(I-N)*(Age_2-INT(Age_2)),2)
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Life_Stats
|
||||
|
||||
|
||||
PROC Is_Vested(Full, Per_Vested, V_Date)
|
||||
; check for expected value of future vesting
|
||||
PRIVATE
|
||||
I, Prob, Expected
|
||||
Expected = Round(Full*Per_Vested*0.01, 2)
|
||||
if (Per_Vested < 100.0) then
|
||||
MOVETO "Separate"
|
||||
if (NIMAGERECORDS() > 0) then
|
||||
Prob = 1 - [Separation_Rate] * 0.01
|
||||
if (Prob < 1.0) then
|
||||
MOVETO "Schedule"
|
||||
FOR I FROM 1 TO NIMAGERECORDS()
|
||||
MOVETO RECORD I
|
||||
if ([Vests_On]<> BLANKDATE()) And ([Vests_At] > 0.0) then
|
||||
Expected = Expected + Round(Full*[Vests_At]*0.01*POW(Prob, ([Vests_On]-[Pensions->Valu])/365 ), 2)
|
||||
endif
|
||||
ENDFOR
|
||||
endif
|
||||
endif
|
||||
MOVETO "Pensions" ; move to next table
|
||||
endif
|
||||
RETURN Expected
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Is_Vested
|
||||
|
||||
|
||||
PROC Death_Benefit(Is_Age, Pay_Age, Last_Pmt)
|
||||
; check for death benefit -- Lump1, Lump2
|
||||
PRIVATE
|
||||
N, I,
|
||||
DB_1, DB_2,
|
||||
B1, B2,
|
||||
Partial,
|
||||
Probability,
|
||||
B_Age,
|
||||
B_Starts
|
||||
MOVETO "Death"
|
||||
DB_1 = 0.0
|
||||
DB_2 = 0.0
|
||||
if (NIMAGERECORDS() > 0) then
|
||||
if ([Lump1] > 0.0) Or ([Lump2] > 0.0) then
|
||||
B1 = [Lump1]
|
||||
B2 = [Lump2]
|
||||
N = ARRAYSIZE(Num_Alive)
|
||||
FOR I FROM 1 to N - 1
|
||||
Probability = 1 - Round(Num_Alive[I+1]/Num_Alive[I], 5)
|
||||
if (I = 1) then
|
||||
Partial = Is_Age - INT(Is_Age)
|
||||
else if (I = N - 1) then
|
||||
Partial = Pay_Age - INT(Pay_Age)
|
||||
else Partial = 1
|
||||
endif
|
||||
endif
|
||||
B1 = Round(B1*(1+[Growth1]*.01*Partial)/(1+[Disc1]*.01*Partial), 0)
|
||||
B2 = Round(B2*(1+[Growth2]*.01*Partial)/(1+[Disc2]*.01*Partial), 0)
|
||||
DB_1 = DB_1 + Round((B1+B2)*Probability,0)
|
||||
ENDFOR
|
||||
endif ; pre-payment lump sum distribution
|
||||
endif ; a record exists
|
||||
R["PV_Pre_DB"] = DB_1
|
||||
R["PV_Annuity"] = R["PV_AMT"] + DB_1
|
||||
if (R["PV_Annuity"] >= R["WV_AT"]) then
|
||||
R["PV_Plan"] = R["PV_Annuity"]
|
||||
else R["PV_Plan"] = R["WV_AT"]
|
||||
endif
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Death_Benefit
|
||||
|
||||
|
||||
PROC Marriage_Factor()
|
||||
; check for marriage factor --- first dates, then years, finally %
|
||||
PRIVATE
|
||||
M, S, M_Per
|
||||
MOVETO "Marriage"
|
||||
M = 0.0
|
||||
S = 0.0
|
||||
M_Per = 100.0
|
||||
if (NIMAGERECORDS() > 0) then
|
||||
; calculate years married based on dates, or accept entry
|
||||
if ([Married_From] <> BLANKDATE()) And ([Married_To] <> BLANKDATE()) then
|
||||
M = Round(([Married_To]-[Married_From])/365,2)
|
||||
[Married_Years] = M
|
||||
else if ([Married_Years] > 0.0) then
|
||||
M = [Married_Years]
|
||||
endif
|
||||
endif
|
||||
; calculate years of service based on dates, or accept entry
|
||||
if ([Service_From] <> BLANKDATE()) And ([Service_To] <> BLANKDATE()) then
|
||||
S = Round(([Service_To]-[Service_From])/365,2)
|
||||
[Service_Years] = S
|
||||
else if ([Service_Years] > 0.0) then
|
||||
S = [Service_Years]
|
||||
endif
|
||||
endif
|
||||
; calculate marriage factor, or accept entry
|
||||
if (M > 0.0) And (S >= M) then
|
||||
M_Per = Round(M/S, 4) * 100
|
||||
[Marital_%] = M_Per
|
||||
else if ([Marital_%] > 0.0) then
|
||||
M_Per = [Marital_%]
|
||||
endif
|
||||
endif
|
||||
endif; if an image is present
|
||||
R["Years_Married"] = M
|
||||
R["Years_Service"] = S
|
||||
R["Marr_Per"] = M_Per
|
||||
R["Marr_Amt"] = Round(M_Per * 0.01 * R["PV_Plan"], 0)
|
||||
MOVETO "Pensions"
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Marriage_Factor
|
||||
|
||||
|
||||
PROC Save_Results()
|
||||
PRIVATE File_Id, I, J
|
||||
MESSAGE "Saving results of calculation..."
|
||||
FORMKEY; put results table into table view
|
||||
CTRLHOME
|
||||
DYNARRAY Transfer[]
|
||||
J = NFIELDS("Results")
|
||||
FOR I FROM 1 TO J
|
||||
TAB
|
||||
Transfer[FIELD()] = FIELDSTR()
|
||||
ENDFOR
|
||||
DEL
|
||||
MOVETO "Output"
|
||||
MOVETO FIELD "File_No"
|
||||
File_Id = [Pensions->File_No] + [Pensions->Version]
|
||||
LOCATE File_Id
|
||||
if (RetVal = False) then
|
||||
END
|
||||
DOWN ; open up a blank row
|
||||
endif
|
||||
[File_No] = File_Id
|
||||
FOREACH Element IN Transfer
|
||||
MOVETO FIELD Element
|
||||
[] = Transfer[Element]
|
||||
ENDFOREACH
|
||||
if (R["Mortality"] < 1.0) then
|
||||
[Mortality] = "0" + [Mortality]
|
||||
endif
|
||||
[Title] = [Pensions->Title]
|
||||
[First] = [Pensions->First]
|
||||
[Last] = [Pensions->Last]
|
||||
if ( SUBSTR([Last], LEN([Last]), 1) = "s") then
|
||||
[Last's] = [Last] + "'"
|
||||
else [Last's] = [Last] + "'s"
|
||||
endif
|
||||
[Plan_Name] = [Pensions->Plan_Name]
|
||||
[Birth] = FORMAT("d1", [Pensions->Birth])
|
||||
if (SEARCH(" ", [Birth]) = 1) then
|
||||
[Birth] = "0" + SUBSTR([Birth], 2, 7)
|
||||
endif
|
||||
[Race] = [Pensions->Race]
|
||||
[Sex] = [Pensions->Sex]
|
||||
[Info] = FORMAT("d2", [Pensions->Info])
|
||||
I = SEARCH(" ", [Info])
|
||||
if (I > 1) then
|
||||
[Info] = SUBSTR([Info], 1, I) + SUBSTR([Info], I+2, 15)
|
||||
endif
|
||||
[Valu] = FORMAT("d2", [Pensions->Valu])
|
||||
I = SEARCH(" ", [Valu])
|
||||
if (I > 1) then
|
||||
[Valu] = SUBSTR([Valu], 1, I) + SUBSTR([Valu], I+2, 15)
|
||||
endif
|
||||
[Vested_Per] = FORMAT("w7.2", [Pensions->Vested_Per])
|
||||
if ([Pensions->Vested_Per] < 100.0) then
|
||||
[Vest_Amt_Text] = "Monthly Benefit Reduced For Probability of Vesting"
|
||||
endif
|
||||
if ([Pensions->COLA] > 0.0) then
|
||||
[Cola_Text] = "Expected Annual Increase In Benefits"
|
||||
if ([Pensions->COLA] > 1.0) then
|
||||
[COLA] = FORMAT("W7.2, E$", [Pensions->COLA])
|
||||
else [COLA] = FORMAT("W5.2", [Pensions->COLA]*100) + "%"
|
||||
endif
|
||||
endif
|
||||
[Initial_Amt_Text] = "Accrued Monthly Benefit"
|
||||
if ([Pensions->Pre_DR] = 0) then
|
||||
[Initial_Amt_Text] = "Present Value of Monthly Annuity"
|
||||
[PV_Plan_Text] = "Money Purchase Annuity Benefit"
|
||||
else if ([Pensions->Pre_DR] < [Pensions->Post_DR]) then
|
||||
[PV_Plan_Text] = "Money Purchase Annuity Benefit"
|
||||
else [PV_Plan_Text] = "Formula Method Annuity Benefit "
|
||||
endif
|
||||
endif
|
||||
if (R["PV_Annuity"] < R["WV_AT"]) then
|
||||
[PV_Plan_Text] = "Separation Benefit"
|
||||
endif
|
||||
if ([Pensions->Tax_Rate] > 0.0) then
|
||||
[V_Title] = "after-tax present value"
|
||||
[Tax_Rate_Text] = "Estimated Tax Liability"
|
||||
[PV_AT_Text] = "After-tax Present Value of Annuity"
|
||||
else [V_Title] = ""
|
||||
[Tax_Rate_Text] = ""
|
||||
[PV_AT_Text] = ""
|
||||
endif
|
||||
|
||||
if ([Pensions->Withdrawal] > 0.0) then
|
||||
[With_Text] = "Lump Sum Payment Option in Lieu of Annuity"
|
||||
if ([Pensions->Tax_Rate] > 0) then
|
||||
[With_AT_Text] = " After-tax Value of Lump Sum Payment Option"
|
||||
endif
|
||||
else [With_Text] = "No lump sum payment option available"
|
||||
[With_AT_Text] = ""
|
||||
endif
|
||||
|
||||
if (R["PV_Pre_DB"] > 0.0) then
|
||||
[PV_Ann_Text] = "Total Present Value, Including Death Benefit"
|
||||
[Pre_DB_Text] = "Present Value of Pre-retirement Death Benefit"
|
||||
else [Pre_DB_Text] = ""
|
||||
endif
|
||||
if (R["Marr_Per"] < 100.0) then
|
||||
[Years_Married] = FORMAT("W7.2", R["Years_Married"])
|
||||
[Years_Service] = FORMAT("W7.2", R["Years_Service"])
|
||||
[Married_Text] = "Years of Service While Married"
|
||||
[Service_Text] = "Total Years of Plan Service"
|
||||
[Marr_Per_Text] = "Percent of Benefit Accrued While Married"
|
||||
[Marr_Amt_Text] = "Marital Component"
|
||||
else [Married_Text] = ""
|
||||
[Service_Text] = ""
|
||||
[Marr_Per_Text] = ""
|
||||
[Marr_Amt_Text] = ""
|
||||
endif
|
||||
MESSAGE ""
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Save_Results
|
||||
|
||||
|
||||
PROC Life_Exp_Compute()
|
||||
PRIVATE
|
||||
LE,
|
||||
Mortality,
|
||||
Payout,
|
||||
Fund_Bal,
|
||||
Last_Pmt
|
||||
ECHO OFF
|
||||
if (SYSMODE() <> "CoEdit") then
|
||||
COEDITKEY
|
||||
endif
|
||||
MOVETO "Pensions"
|
||||
POSTRECORD NOPOST LEAVELOCKED
|
||||
if NOT RetVal then
|
||||
MESSAGE "Duplicate file/version entry - please change!"
|
||||
MOVETO FIELD "Version"
|
||||
RETURN
|
||||
endif
|
||||
MESSAGE "Computing present value..."
|
||||
R["Age"] = Round(([Valu]-[Birth])/365.25, 2)
|
||||
if ([Start_Age] > R["Age"]) then
|
||||
R["Start_Age"] = [Start_Age]
|
||||
else R["Start_Age"] = R["Age"]
|
||||
[Start_Age] = R["Age"]
|
||||
POSTRECORD NOPOST
|
||||
endif
|
||||
R["Accrued"] = [Accrued]
|
||||
R["COLA"] = [COLA]
|
||||
R["Pre_DR"] = [Pre_DR]
|
||||
R["Post_DR"] = [Post_DR]
|
||||
R["Tax_Rate"] = [Tax_Rate]
|
||||
R["Years_From"] = R["Start_Age"] - R["Age"]
|
||||
ARRAY Num_Alive[INT(R["Start_Age"])-INT(R["Age"])+2]
|
||||
; get life expectancy and mortality factor
|
||||
Life_Stats(R["Age"], R["Start_Age"], SUBSTR([Race],1,1)+SUBSTR([Sex],1,1))
|
||||
MOVETO "Pensions"
|
||||
FORMKEY; return to form view
|
||||
R["Life_Exp"] = LE
|
||||
R["Payments"] = INT(LE*12)
|
||||
R["Mortality"] = Mortality
|
||||
R["EV_Monthly"] = Is_Vested([Accrued], [Vested_Per], [Valu])
|
||||
Discount([Post_DR], [COLA], [Max_COLA], R["Payments"], R["EV_Monthly"])
|
||||
R["Pay_Out"] = Payout
|
||||
R["Fund_Value"] = Fund_Bal
|
||||
R["PV"] = Round(Fund_Bal * POW((1+[Pre_DR]*0.01/12), -R["Years_From"]*12), 0)
|
||||
R["PV_AM"] = Round(R["PV"] * Mortality, 0 )
|
||||
R["PV_AMT"] = Round(R["PV_AM"] * (1-[Tax_Rate]*0.01), 0)
|
||||
R["Withdrawal"] = [Withdrawal]
|
||||
R["WV_AT"] = Round(R["Withdrawal"] * (1-[Tax_Rate]*0.01), 0)
|
||||
Death_Benefit( R["Age"], R["Start_Age"], Last_Pmt )
|
||||
Marriage_Factor()
|
||||
POSTRECORD NOPOST
|
||||
FORMKEY
|
||||
MOVETO "Results"
|
||||
COPYFROMARRAY R
|
||||
PICKFORM 1
|
||||
MESSAGE ""
|
||||
PROMPT " Press ESC when finished viewing."
|
||||
BEEP
|
||||
WAIT FIELD
|
||||
UNTIL "ESC"
|
||||
PROMPT ""
|
||||
if Response_Is_Yes("SAVE RESULTS", "Save Results of PV Calculation?") then
|
||||
Save_Results()
|
||||
else DEL
|
||||
endif
|
||||
MOVETO "Pensions"
|
||||
FORMKEY ; redisplay pension form
|
||||
PROMPT Prompt_String
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Life_Exp_Compute
|
||||
|
||||
|
||||
PROC Actuarial_Compute()
|
||||
PRIVATE
|
||||
Increase, Race_Sex_Code, Monthly, COLA, Max_COLA, Pre_Dr, Post_DR, TEP, PV_TEP, PV_TEP_NOW
|
||||
TEP = 0
|
||||
PV_TEP = 0
|
||||
PV_TEP_NOW = 0
|
||||
ECHO OFF
|
||||
if (SYSMODE() <> "CoEdit") then
|
||||
COEDITKEY
|
||||
endif
|
||||
MOVETO "Pensions"
|
||||
POSTRECORD NOPOST LEAVELOCKED
|
||||
if NOT RetVal then
|
||||
MESSAGE "Duplicate file/version entry - please change!"
|
||||
MOVETO FIELD "Version"
|
||||
RETURN
|
||||
endif
|
||||
MESSAGE "Computing present value..."
|
||||
R["Age"] = Round(([Valu]-[Birth])/365.25, 2)
|
||||
if ([Start_Age] > R["Age"]) then
|
||||
R["Start_Age"] = [Start_Age]
|
||||
else R["Start_Age"] = R["Age"]
|
||||
[Start_Age] = R["Age"]
|
||||
POSTRECORD NOPOST
|
||||
endif
|
||||
Current_Age = INT(R["Age"] * 12)
|
||||
Start_Age = INT(R["Start_Age"] * 12)
|
||||
First_Payment_Age = Start_Age + 1 ; first payment is made one month after retirement
|
||||
Array_Size = 1200 - Start_Age
|
||||
Array Pmt_Age[Array_Size]
|
||||
ARRAY Num_Alive[Array_Size]
|
||||
ARRAY Prob_Surv[Array_Size]
|
||||
ARRAY Payment[Array_Size]
|
||||
ARRAY EV_Payment[Array_Size]
|
||||
ARRAY Disc_Factor[Array_Size]
|
||||
ARRAY EPV_Payment[Array_Size]
|
||||
R["Accrued"] = [Accrued]
|
||||
R["EV_Monthly"] = Is_Vested([Accrued], [Vested_Per], [Valu])
|
||||
R["COLA"] = [COLA]
|
||||
R["Pre_DR"] = [Pre_DR]
|
||||
R["Post_DR"] = [Post_DR]
|
||||
R["Tax_Rate"] = [Tax_Rate]
|
||||
R["Years_From"] = R["Start_Age"] - R["Age"]
|
||||
R["Tax_Rate"] = [Tax_Rate]
|
||||
R["Withdrawal"] = [Withdrawal]
|
||||
R["WV_AT"] = Round(R["Withdrawal"] * (1-[Tax_Rate]*0.01), 0)
|
||||
Race_Sex_Code = SUBSTR([Race],1,1) + SUBSTR([Sex],1,1)
|
||||
|
||||
Monthly = R["EV_Monthly"]
|
||||
COLA = [COLA]
|
||||
Max_COLA = [Max_COLA]
|
||||
Increase = COLA
|
||||
Pre_DR = [Pre_DR]
|
||||
Pre_DR = 1/(1+Pre_DR*0.01/12)
|
||||
Post_DR = [Post_DR]
|
||||
Post_DR = 1/(1+Post_DR*0.01/12)
|
||||
|
||||
|
||||
; (******************* New portion of code ***************)
|
||||
|
||||
FORMKEY; get out of pension table form view
|
||||
MOVETO Mort_Table
|
||||
MOVETO FIELD "Month"
|
||||
LOCATE Current_Age
|
||||
MOVETO FIELD "NA_" + Race_Sex_Code
|
||||
Num_Alive_Now = []
|
||||
MOVETO FIELD "Month"
|
||||
LOCATE First_Payment_Age
|
||||
MOVETO FIELD "NA_" + Race_Sex_Code
|
||||
FOR I FROM 1 to Array_Size ; copy number alive to array
|
||||
Num_Alive[I] = []
|
||||
Pmt_Age[I] = Start_Age + I
|
||||
Prob_Surv[I] = Round((Num_Alive[I] / Num_Alive_Now), 6)
|
||||
if (Increase > 0.0) then
|
||||
if (I > 12) AND (MOD(I,12) = 1) then
|
||||
if (Increase < 1.0) then
|
||||
COLA = Round(Monthly * Increase,2)
|
||||
else COLA = Increase
|
||||
endif
|
||||
if (Max_COLA > 0.0) AND (COLA > Max_COLA) then
|
||||
COLA = Max_COLA
|
||||
endif
|
||||
Monthly = Monthly + COLA
|
||||
endif; (if I > 12 AND Remainder = 1)
|
||||
endif; (if Increase > 0.0)
|
||||
Payment[I] = Monthly
|
||||
EV_Payment[I] = Round((Monthly * Prob_Surv[I]), 2)
|
||||
TEP = TEP + EV_Payment[I]
|
||||
Disc_Factor[I] = Round(POW(Post_DR,I),6)
|
||||
EPV_Payment[I] = Round((EV_Payment[I] * Disc_Factor[I]), 2)
|
||||
PV_TEP = PV_TEP + EPV_Payment[I]
|
||||
if (I < Array_Size) then
|
||||
DOWN
|
||||
endif
|
||||
ENDFOR
|
||||
|
||||
TEP = Round(TEP,0)
|
||||
PV_TEP = Round(PV_TEP,0)
|
||||
PV_TEP_NOW = Round(PV_TEP * Round(POW(Pre_DR,(Start_Age-Current_Age)),6),0)
|
||||
|
||||
Print_To_File = "N"
|
||||
if (Print_To_File = "Y") then
|
||||
F = "TEMP.TXT"
|
||||
FILEWRITE F FROM "This is a printout of the annuity stream. \n \n"
|
||||
PRINT FILE F "Current Age: ", FORMAT("W9", Current_Age), "\n"
|
||||
PRINT FILE F "Age at First Payment: ", FORMAT("W9", First_Payment_Age), "\n"
|
||||
PRINT FILE F "Number Alive at Present: ", FORMAT( "W9", Num_Alive_Now), "\n", "\n", "\n", "\n"
|
||||
PRINT FILE F "Pmt # Age #Alive Prob. Surv. Payment Exp. Value Disc. Fact. PVEP", "\n", "\n"
|
||||
FOR I FROM 1 to Array_Size
|
||||
PRINT FILE F FORMAT( "W6", I )
|
||||
PRINT FILE F FORMAT( "W6", Pmt_Age[I] )
|
||||
PRINT FILE F FORMAT( "W9", Num_Alive[I] )
|
||||
PRINT FILE F FORMAT( "W10.6", Prob_Surv[I] )
|
||||
PRINT FILE F FORMAT( "W12.2", Payment[I] )
|
||||
PRINT FILE F FORMAT( "W12.2", EV_Payment[I] )
|
||||
PRINT FILE F FORMAT( "W14.6", Disc_Factor[I] )
|
||||
PRINT FILE F FORMAT( "W14.2", EPV_Payment[I] ), "\n"
|
||||
ENDFOR
|
||||
PRINT FILE F "\n"
|
||||
PRINT FILE F "Totals: ", FORMAT( "W10", TEP), FORMAT( "W28", PV_TEP), "\n", "\n"
|
||||
PRINT FILE F "Total Expected Payout: ", FORMAT( "W10", TEP), "\n", "\n"
|
||||
PRINT FILE F "Total Present Value of Expected Payments @ Commencement: ", FORMAT( "W10", PV_TEP), "\n", "\n"
|
||||
PRINT FILE F "Total Present Value of Expected Payments Now: ", FORMAT( "W10", PV_TEP_Now), "\n", "\n"
|
||||
endif; Print_To_File = "Y"
|
||||
|
||||
MOVETO "Pensions"
|
||||
FORMKEY; return to form view
|
||||
R["Life_Exp"] = 0.0
|
||||
R["Payments"] = 0.0
|
||||
R["Mortality"] = 0.0
|
||||
R["PV_AM"] = 0.0
|
||||
|
||||
R["Pay_Out"] = TEP
|
||||
R["Fund_Value"] = PV_TEP
|
||||
R["PV"] = PV_TEP_NOW
|
||||
R["PV_AMT"] = Round(R["PV"] * (1-[Tax_Rate]*0.01), 0)
|
||||
|
||||
; skip death benefit calculation for now, set DB values to zero
|
||||
; Death_Benefit( R["Age"], R["Start_Age"], Monthly )
|
||||
|
||||
R["PV_Pre_DB"] = 0.0
|
||||
R["PV_Annuity"] = R["PV_AMT"] + R["PV_Pre_DB"]
|
||||
if (R["PV_Annuity"] >= R["WV_AT"]) then
|
||||
R["PV_Plan"] = R["PV_Annuity"]
|
||||
else R["PV_Plan"] = R["WV_AT"]
|
||||
endif
|
||||
|
||||
; (******************* balance of original compute procedure ***************)
|
||||
|
||||
Marriage_Factor()
|
||||
POSTRECORD NOPOST
|
||||
FORMKEY
|
||||
MOVETO "Results"
|
||||
COPYFROMARRAY R
|
||||
PICKFORM 1
|
||||
MESSAGE ""
|
||||
PROMPT " Press ESC when finished viewing."
|
||||
BEEP
|
||||
WAIT FIELD
|
||||
UNTIL "ESC"
|
||||
PROMPT ""
|
||||
if Response_Is_Yes("SAVE RESULTS", "Save Results of PV Calculation?") then
|
||||
Save_Results()
|
||||
else DEL
|
||||
endif
|
||||
MOVETO "Pensions"
|
||||
FORMKEY; redisplay pension form
|
||||
PROMPT Prompt_String
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Actuarial_Compute
|
||||
|
||||
|
||||
PROC Pension_Wait_Proc(TriggerType, EventInfo, CycleNumber)
|
||||
PRIVATE Key_Code, Menu_Pick
|
||||
if (EventInfo["TYPE"] = "KEY") then
|
||||
Key_Code = EventInfo["KEYCODE"]
|
||||
SWITCH
|
||||
; ALT A - Compute Using Actuarial Method
|
||||
CASE (Key_Code = -30) : if ISFIELDVIEW() then
|
||||
DO_IT!
|
||||
endif
|
||||
MOVETO "Pensions"
|
||||
Actuarial_Compute() ; pv of a pension
|
||||
Main_Table_Menu()
|
||||
RETURN 1
|
||||
|
||||
; ALT L - Compute using Life Exepctancy Method
|
||||
CASE (Key_Code = -38) : if ISFIELDVIEW() then
|
||||
DO_IT!
|
||||
endif
|
||||
MOVETO "Pensions"
|
||||
Life_Exp_Compute() ; pv of a pension
|
||||
Main_Table_Menu()
|
||||
RETURN 1
|
||||
; F9 - COEDIT
|
||||
CASE (Key_Code = -67) : RETURN Main_Table_Edit()
|
||||
; F2 - DO_IT!
|
||||
CASE (Key_Code = -60) : if ISEMPTY(Main_Table) then
|
||||
RETURN Main_Table_Clear()
|
||||
else RETURN Main_Table_End_Edit()
|
||||
endif
|
||||
; F8 - CLEAR
|
||||
CASE (Key_Code = -66) : RETURN Main_Table_Clear()
|
||||
; DELETE
|
||||
CASE (Key_Code = -83) : if (SYSMODE() = "CoEdit") then
|
||||
RETURN Display_Delete_Box()
|
||||
else RETURN 1
|
||||
endif
|
||||
; + or - to change date by day
|
||||
CASE (Key_Code = 43) OR
|
||||
(Key_Code = 45) : RETURN Change_Date(Key_Code)
|
||||
OTHERWISE : SOUND 400 100 RETURN 1
|
||||
ENDSWITCH
|
||||
endif
|
||||
if (EventInfo["MESSAGE"] = "MENUSELECT") then
|
||||
Menu_Pick = EventInfo["MENUTAG"]
|
||||
SWITCH
|
||||
CASE (Menu_Pick = "Edit\Mode") : RETURN Main_Table_Edit()
|
||||
CASE (Menu_Pick = "Main\Mode") : if ISEMPTY(Main_Table) then
|
||||
RETURN Main_Table_Clear()
|
||||
else RETURN Main_Table_End_Edit()
|
||||
endif
|
||||
CASE (Menu_Pick = "Ask") : Ask_For_Output()
|
||||
RETURN 1
|
||||
CASE (Menu_Pick = "Close\Yes") : RETURN Main_Table_Clear()
|
||||
CASE (Menu_Pick = "Close\No") : RETURN 1
|
||||
OTHERWISE : SOUND 400 100 RETURN 1
|
||||
ENDSWITCH
|
||||
endif
|
||||
SOUND 400 100 RETURN 1 ; safety valve
|
||||
ENDPROC
|
||||
WRITELIB Off_Lib Pension_Wait_Proc
|
||||
|
||||
|
||||
PROC Pension_Table_Wait()
|
||||
; Life Expectancy Method uses LifeTabl
|
||||
Life_Table = "LifeTabl"
|
||||
; Actuarial Method uses NumberAl Mortailty Table
|
||||
Mort_Table = "NumberAl"
|
||||
R_Table = "Results"
|
||||
Prompt_String = " Alt-L for Life Expectancy Method; Alt-A for Actuarial Method"
|
||||
Main_Table_View("Pensions", 1, 0); place pension table on workspace in form view
|
||||
ECHO OFF
|
||||
END; move to last record in pension table
|
||||
FORMKEY; move from form view to table view
|
||||
VIEW Life_Table
|
||||
VIEW Mort_Table
|
||||
VIEW "Output"
|
||||
VIEW R_Table
|
||||
COEDITKEY
|
||||
COPYTOARRAY R
|
||||
DO_IT!
|
||||
MOVETO "Pensions"
|
||||
FORMKEY
|
||||
Main_Table_Edit()
|
||||
PROMPT Prompt_String
|
||||
ECHO NORMAL
|
||||
WAIT WORKSPACE
|
||||
PROC "Pension_Wait_Proc"
|
||||
MESSAGE "MENUSELECT"
|
||||
; TRIGGER "ARRIVEFIELD"
|
||||
KEY -60, -66, -67, -83, -38, -30, 43, 45
|
||||
; DO_IT Clear Edit Delete Alt-L Alt-A + -
|
||||
; F2 F8 F9 DEL LECompute ActCompute
|
||||
ENDWAIT
|
||||
ECHO OFF
|
||||
EMPTY "Output"; empty output table every time script is exited
|
||||
CLEARALL
|
||||
PROMPT ""
|
||||
MESSAGE ""
|
||||
ENDPROC;
|
||||
WRITELIB Off_Lib Pension_Table_Wait
|
||||
|
||||
|
||||
RELEASE PROCS ALL
|
||||
Reference in New Issue
Block a user