public void RepeatedDatesWithAmountTest_Manual() { List <RepeatedDatesWithAmount> results = null; var startdate = DateTime.Today; RepeatDatesWithAmountCalculationInput vm = new RepeatDatesWithAmountCalculationInput { StartDate = startdate.Date, EndDate = startdate.AddYears(10), RepeatType = RepeatFrequency.Manual, TotalAmount = 10000, Desp = "Test_Manual" }; results = CommonUtility.WorkoutRepeatedDatesWithAmount(vm); // Total count Assert.True(results.Count == 1); // Date Assert.Equal(vm.EndDate, results[0].TranDate); // Amount Assert.Equal(10000, results[0].TranAmount); // Desp Assert.NotEqual(String.Empty, results[0].Desp); }
public void RepeatedDatesWithAmountTest_Week2() { List <RepeatedDatesWithAmount> results = null; var startdate = new DateTime(2019, 1, 5); var enddate = new DateTime(2020, 1, 31); RepeatDatesWithAmountCalculationInput vm = new RepeatDatesWithAmountCalculationInput { StartDate = startdate.Date, EndDate = enddate.Date, RepeatType = RepeatFrequency.Week, TotalAmount = 10000, Desp = "Test_Week" }; results = CommonUtility.WorkoutRepeatedDatesWithAmount(vm); // Total count Assert.True(results.Count == 55); Int32 i = 0; foreach (var rst in results) { // Date Assert.Equal(vm.StartDate.AddDays(i), rst.TranDate); i += 7; // Desp Assert.NotEqual(String.Empty, rst.Desp); } }
public void RepeatedDatesWithAmountTest_Year() { List <RepeatedDatesWithAmount> results = null; var startdate = DateTime.Today; RepeatDatesWithAmountCalculationInput vm = new RepeatDatesWithAmountCalculationInput { StartDate = startdate.Date, EndDate = startdate.AddYears(10), RepeatType = RepeatFrequency.Year, TotalAmount = 10000, Desp = "Test_Year" }; results = CommonUtility.WorkoutRepeatedDatesWithAmount(vm); // Total count Assert.True(results.Count == 10); Int32 i = 0; foreach (var rst in results) { // Date Assert.Equal(vm.StartDate.AddYears(i++), rst.TranDate); // Amount Assert.Equal(1000, rst.TranAmount); // Desp Assert.NotEqual(String.Empty, rst.Desp); } }
public void RepeatedDatesWithAmount_test(RepeatDatesWithAmountCalculationInput datInput) { var results = CommonUtility.WorkoutRepeatedDatesWithAmount(datInput); switch (datInput.RepeatType) { case RepeatFrequency.Month: Assert.Equal(12, results.Count); for (int i = 0; i < 12; i++) { Assert.Equal(datInput.StartDate.Year, results[i].TranDate.Year); Assert.Equal(i + 1, results[i].TranDate.Month); Assert.Equal(1, results[i].TranDate.Day); Assert.Equal(i + 1, results[i].TranDate.Month); Assert.Equal(100, results[i].TranAmount); } break; case RepeatFrequency.Week: Assert.Equal(4, results.Count); for (int i = 0; i < 4; i++) { Assert.Equal(300, results[i].TranAmount); } break; default: break; } }
public IActionResult GetRepeatedDatesWithAmount([FromBody] RepeatDatesWithAmountCalculationInput input) { if (!ModelState.IsValid) { HIHAPIUtility.HandleModalStateError(ModelState); } return(Ok(CommonUtility.WorkoutRepeatedDatesWithAmount(input))); }
public void RepeatedDatesWithAmountTest_InputCheck() { // Scenario 0. No input List <RepeatedDatesWithAmount> results = null; // Act Action act = () => CommonUtility.WorkoutRepeatedDatesWithAmount(null); // Assert var exception = Assert.Throws <Exception>(act); Assert.Null(results); Assert.Equal("Input the data!", exception.Message); // Scenario 1. Invalid data range RepeatDatesWithAmountCalculationInput vm = new RepeatDatesWithAmountCalculationInput { StartDate = DateTime.Now.AddDays(2), EndDate = DateTime.Now }; // Act act = () => CommonUtility.WorkoutRepeatedDatesWithAmount(vm); // Assert exception = Assert.Throws <Exception>(act); Assert.Null(results); Assert.Equal("Invalid data range", exception.Message); // Scenario 2. Invalid total amount vm = new RepeatDatesWithAmountCalculationInput { StartDate = DateTime.Now, EndDate = DateTime.Now.AddMonths(1), TotalAmount = 0 }; // Act act = () => CommonUtility.WorkoutRepeatedDatesWithAmount(vm); // Assert exception = Assert.Throws <Exception>(act); Assert.Null(results); Assert.Equal("Invalid total amount", exception.Message); // Scenario 3. Invalid desp vm = new RepeatDatesWithAmountCalculationInput { StartDate = DateTime.Now, EndDate = DateTime.Now.AddMonths(1), TotalAmount = 1000, Desp = String.Empty }; // Act act = () => CommonUtility.WorkoutRepeatedDatesWithAmount(vm); // Assert exception = Assert.Throws <Exception>(act); Assert.Null(results); Assert.Equal("Invalid desp", exception.Message); }
public void RepeatedDatesWithAmountTest_Month2() { List <RepeatedDatesWithAmount> results = null; var startdate = DateTime.Today; RepeatDatesWithAmountCalculationInput vm = new RepeatDatesWithAmountCalculationInput { StartDate = new Date(2020, 1, 1), EndDate = new Date(2021, 1, 1), RepeatType = RepeatFrequency.Month, TotalAmount = 2219.00M, Desp = "Test_Month" }; results = CommonUtility.WorkoutRepeatedDatesWithAmount(vm); // Total count Assert.True(results.Count == 12); Int32 i = 0; foreach (var rst in results) { // Date Assert.Equal(vm.StartDate.AddMonths(i++), rst.TranDate); // Amount if (i == 1) { Assert.Equal(0, Decimal.Compare(184.88M, rst.TranAmount)); } else { Assert.Equal(0, Decimal.Compare(184.92M, rst.TranAmount)); } // Desp Assert.NotEqual(String.Empty, rst.Desp); } }
public static List <RepeatedDatesWithAmount> WorkoutRepeatedDatesWithAmount(RepeatDatesWithAmountCalculationInput datInput) { List <RepeatedDatesWithAmount> listResults = new List <RepeatedDatesWithAmount>(); // Input checks if (datInput == null) { throw new Exception("Input the data!"); } var dtEnd = new DateTime(datInput.EndDate.Year, datInput.EndDate.Month, datInput.EndDate.Day); var dtStart = new DateTime(datInput.StartDate.Year, datInput.StartDate.Month, datInput.StartDate.Day); if (dtEnd < dtStart) { throw new Exception("Invalid data range"); } if (datInput.TotalAmount <= 0) { throw new Exception("Invalid total amount"); } if (String.IsNullOrEmpty(datInput.Desp)) { throw new Exception("Invalid desp"); } switch (datInput.RepeatType) { case RepeatFrequency.Day: { var tspans = dtEnd - dtStart; var tdays = (Int32)tspans.Days; var tamt = Math.Round(datInput.TotalAmount / tdays, 2); for (int i = 0; i < tdays; i++) { listResults.Add(new RepeatedDatesWithAmount { TranDate = datInput.StartDate.AddDays(i), TranAmount = tamt, Desp = datInput.Desp + " | " + (i + 1).ToString() + " / " + tdays.ToString() }); } } break; case RepeatFrequency.Fortnight: { var tspans = dtEnd - dtStart; var tdays = (Int32)tspans.Days; var tfortnights = tdays / 14; var tamt = Math.Round(datInput.TotalAmount / tfortnights, 2); for (int i = 0; i < tfortnights; i++) { listResults.Add(new RepeatedDatesWithAmount { TranDate = datInput.StartDate.AddDays(i * 14), TranAmount = tamt, Desp = datInput.Desp + " | " + (i + 1).ToString() + " / " + tfortnights.ToString() }); } } break; case RepeatFrequency.HalfYear: { var tspans = dtEnd - dtStart; var nmonths = (datInput.EndDate.Year - datInput.StartDate.Year) * 12 + (datInput.EndDate.Month - datInput.StartDate.Month); var nhalfyear = nmonths / 6; var tamt = Math.Round(datInput.TotalAmount / nhalfyear, 2); for (int i = 0; i < nhalfyear; i++) { listResults.Add(new RepeatedDatesWithAmount { TranDate = datInput.StartDate.AddMonths(i * 6), TranAmount = tamt, Desp = datInput.Desp + " | " + (i + 1).ToString() + " / " + nhalfyear.ToString() }); } } break; case RepeatFrequency.Month: { var nmonths = (datInput.EndDate.Year - datInput.StartDate.Year) * 12 + (datInput.EndDate.Month - datInput.StartDate.Month); var tamt = Math.Round(datInput.TotalAmount / nmonths, 2); for (int i = 0; i < nmonths; i++) { listResults.Add(new RepeatedDatesWithAmount { TranDate = datInput.StartDate.AddMonths(i), TranAmount = tamt, Desp = datInput.Desp + " | " + (i + 1).ToString() + " / " + nmonths.ToString() }); } } break; case RepeatFrequency.Quarter: { var nmonths = (datInput.EndDate.Year - datInput.StartDate.Year) * 12 + (datInput.EndDate.Month - datInput.StartDate.Month); var nquarters = nmonths / 3; var tamt = Math.Round(datInput.TotalAmount / nquarters, 2); for (int i = 0; i < nquarters; i++) { listResults.Add(new RepeatedDatesWithAmount { TranDate = datInput.StartDate.AddMonths(i * 3), TranAmount = tamt, Desp = datInput.Desp + " | " + (i + 1).ToString() + " / " + nquarters.ToString() }); } } break; case RepeatFrequency.Week: { var tspans = dtEnd - dtStart; var tdays = (Int32)tspans.Days; var tweeks = tdays / 7; var tamt = Math.Round(datInput.TotalAmount / tweeks, 2); for (int i = 0; i < tweeks; i++) { listResults.Add(new RepeatedDatesWithAmount { TranDate = datInput.StartDate.AddDays(i * 7), TranAmount = tamt, Desp = datInput.Desp + " | " + (i + 1).ToString() + " / " + tweeks.ToString() }); } } break; case RepeatFrequency.Year: { var nyears = datInput.EndDate.Year - datInput.StartDate.Year; var tamt = Math.Round(datInput.TotalAmount / nyears, 2); for (int i = 0; i < nyears; i++) { listResults.Add(new RepeatedDatesWithAmount { TranDate = datInput.StartDate.AddYears(i), TranAmount = tamt, Desp = datInput.Desp + " | " + (i + 1).ToString() + " / " + nyears.ToString() }); } } break; case RepeatFrequency.Manual: { // It shall return only entry out listResults.Add(new RepeatedDatesWithAmount { TranDate = datInput.EndDate, TranAmount = datInput.TotalAmount, Desp = datInput.Desp + " | 1 / 1" }); } break; } // Before return, ensure the tranamount is correct decimal realamt = 0; if (listResults.Count > 0) { listResults.ForEach(rst => { realamt += rst.TranAmount; }); if (realamt != datInput.TotalAmount) { listResults[0].TranAmount -= (realamt - datInput.TotalAmount); } } return(listResults); }