/// <summary> /// This Method preforms an Amortization Calculation (giving the user the balance, interest paid, and principle paid /// between time p1 and p2. Note that p1 & p2 and be period 1 (start of loan) and period 10 (potential end of loan) or /// P1 & P2 could both be for period five which would provide the balance at P5, as well as principle and interest paid for that period. /// </summary> /// <param name="tObj"></param> /// <param name="aObj"></param> /// <returns></returns> public static AmortObject AmortCompute(TvmObject tObj, AmortObject aObj) { var r = tObj.I / 100; aObj.C_Bal = tObj.Pv; for (int i = 1; i <= aObj.P2; i++) { aObj.I_Paid = aObj.C_Bal * r; aObj.P_Paid = tObj.Pmt + aObj.I_Paid; aObj.C_Bal = aObj.C_Bal + aObj.P_Paid; if (i >= aObj.P1) { aObj.IntPaid = aObj.IntPaid + aObj.I_Paid; aObj.PrnPaid = aObj.PrnPaid + aObj.P_Paid; } } aObj.EndBal = aObj.C_Bal; aObj.IntPaid = aObj.IntPaid * -1; return(aObj); }
public void Amort6() // With + payment and -FV { //Arrange, var tObj = new TvmObject(); tObj.N = 10; tObj.I = 10; tObj.Pv = 250; tObj.Pmt = 10; tObj.Fv = -907.8099; var obj = new AmortObject(); obj.P1 = 1; obj.P2 = 1; //Act, var result = AmortCompute(tObj, obj); //Assert Assert.AreEqual(285.0000, Math.Round(result.EndBal, 4)); Assert.AreEqual(35.0000, Math.Round(result.PrnPaid, 4)); Assert.AreEqual(-25.0000, Math.Round(result.IntPaid, 4)); }
public void Amort4() //With Balloon Payment { //Arrange, var tObj = new TvmObject(); tObj.N = 10; tObj.I = 10; tObj.Pv = 250; tObj.Pmt = -40.0589; tObj.Fv = -10; var obj = new AmortObject(); obj.P1 = 3; obj.P2 = 9; //Act, var result = AmortCompute(tObj, obj); //Assert Assert.AreEqual(45.5080, Math.Round(result.EndBal, 4)); Assert.AreEqual(-172.8683, Math.Round(result.PrnPaid, 4)); Assert.AreEqual(-107.5440, Math.Round(result.IntPaid, 4)); }
public void Amort3() { //Arrange, var tObj = new TvmObject(); tObj.N = 10; tObj.I = 10; tObj.Pv = 250; tObj.Pmt = -40.6863; tObj.Fv = 0; var obj = new AmortObject(); obj.P1 = 3; obj.P2 = 3; //Act, var result = AmortCompute(tObj, obj); //Assert Assert.AreEqual(198.0783, Math.Round(result.EndBal, 4)); //calc returned 198.0784 which is strange. Because a double is used it is likely more accurate than the BA II Plus. Assert.AreEqual(-18.9804, Math.Round(result.PrnPaid, 4)); Assert.AreEqual(-21.7059, Math.Round(result.IntPaid, 4)); }
public void Amort2() { //Arrange, var tObj = new TvmObject(); tObj.N = 10; tObj.I = 10; tObj.Pv = 250; tObj.Pmt = -40.6863; tObj.Fv = 0; var obj = new AmortObject(); obj.P1 = 3; obj.P2 = 5; //Act, var result = AmortCompute(tObj, obj); //Assert Assert.AreEqual(154.2336, Math.Round(result.EndBal, 4)); Assert.AreEqual(-62.8252, Math.Round(result.PrnPaid, 4)); Assert.AreEqual(-59.2337, Math.Round(result.IntPaid, 4)); }
public void Amort() { //Arrange, var tObj = new TvmObject(); tObj.N = 10; tObj.I = 10; tObj.Pv = 250; tObj.Pmt = -40.6863; tObj.Fv = 0; var obj = new AmortObject(); obj.P1 = 1; obj.P2 = 1; //Act, var result = AmortCompute(tObj, obj); //Assert Assert.AreEqual(234.3137, Math.Round(result.EndBal, 4)); Assert.AreEqual(-15.6863, Math.Round(result.PrnPaid, 4)); Assert.AreEqual(-25.0000, Math.Round(result.IntPaid, 4)); }
public void Amort8() // With + payment -PV -FV { //Arrange, var tObj = new TvmObject(); tObj.N = 10; tObj.I = 10; tObj.Pv = -250; tObj.Pmt = 103.4317; tObj.Fv = -1000; var obj = new AmortObject(); obj.P1 = 1; obj.P2 = 1; //Act, var result = AmortCompute(tObj, obj); //Assert Assert.AreEqual(-171.5683, Math.Round(result.EndBal, 4)); Assert.AreEqual(78.4317, Math.Round(result.PrnPaid, 4)); Assert.AreEqual(25.0000, Math.Round(result.IntPaid, 4)); }
public void Amort7() // With - payment -PV +FV { //Arrange, var tObj = new TvmObject(); tObj.N = 10; tObj.I = 10; tObj.Pv = -250; tObj.Pmt = -25; tObj.Fv = 1046.8712; var obj = new AmortObject(); obj.P1 = 1; obj.P2 = 1; //Act, var result = AmortCompute(tObj, obj); //Assert Assert.AreEqual(-300.0000, Math.Round(result.EndBal, 4)); Assert.AreEqual(-50.0000, Math.Round(result.PrnPaid, 4)); Assert.AreEqual(25.0000, Math.Round(result.IntPaid, 4)); }
public OnAmortComputeEventArgs(AmortObject amortObj) : base() { AmortObj = amortObj; }
/// <summary> /// Use has clicked the Amort Compute Click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void mBtnAMORTCompute_Click(object sender, EventArgs e) { TvmObject O = new TvmObject(); AmortObject A = new AmortObject(); bool Valid = true; #region Verify Format if ((double.TryParse(mN.Text, out double t)) == false) { mN.Text = ""; mN.Hint = "Invalid Input"; Valid = false; } if ((double.TryParse(mIY.Text, out double u)) == false) { mIY.Text = ""; mIY.Hint = "Invalid Input"; Valid = false; } if ((double.TryParse(mPV.Text, out double v)) == false) { mPV.Text = ""; mPV.Hint = "Invalid Input"; Valid = false; } if ((double.TryParse(mPMT.Text, out double w)) == false) { mPMT.Text = ""; mPMT.Hint = "Invalid Input"; Valid = false; } if ((double.TryParse(mFV.Text, out double x)) == false) { mFV.Text = ""; mFV.Hint = "Invalid Input"; Valid = false; } if ((Int32.TryParse(mP1.Text, out int y)) == false) { mP1.Text = ""; mP1.Hint = "Invalid Input"; Valid = false; } if ((Int32.TryParse(mP1.Text, out int y1)) == true) { if (!(Int32.Parse(mP1.Text) >= 1)) { mP1.Text = ""; mP1.Hint = "P1 Must Be At Least Equal To 1"; Valid = false; } } if (((Int32.TryParse(mP1.Text, out int y2)) == true) && (Int32.TryParse(mP2.Text, out int y3)) == true) { if (!(Int32.Parse(mP1.Text) <= Int32.Parse(mP2.Text))) { mP1.Text = ""; mP1.Hint = "P1 Must Be Less Than Or Equal To P2"; Valid = false; } } if ((Int32.TryParse(mP2.Text, out int z)) == false) { mP2.Text = ""; mP2.Hint = "Invalid Input"; Valid = false; } if ((((double.TryParse(mP1.Text, out double yz1)) == true) && (double.TryParse(mP2.Text, out double yz2)) == true) && (double.TryParse(mN.Text, out double yz3) == true)) { if (!(double.Parse(mP1.Text) <= double.Parse(mN.Text))) { mP1.Text = ""; mP1.Hint = "P1 Must Be Less Than Or Equal To N"; Valid = false; } if (!(double.Parse(mP2.Text) <= double.Parse(mN.Text))) { mP2.Text = ""; mP2.Hint = "P2 Must Be Less Than Or Equal To N"; Valid = false; } } #endregion if (Valid == true) { O.N = double.Parse(mN.Text); O.I = double.Parse(mIY.Text); O.Pv = double.Parse(mPV.Text); O.Pmt = double.Parse(mPMT.Text); O.Fv = double.Parse(mFV.Text); A.P1 = Convert.ToInt32(mP1.Text); A.P2 = Convert.ToInt32(mP2.Text); A = AmortCompute(O, A); mOnAmortComptComplete.Invoke(this, new OnAmortComputeEventArgs(A)); this.Dismiss(); } }
/// <summary> /// Constructor that requires a AmrotObj Param /// </summary> /// <param name="parameterIn"></param> public Dialog_AMORTOUTPUT(AmortObject parameterIn) { O = parameterIn; }