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);
            }
        }
示例#8
0
        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);
        }