public async Task CalculateAsync_WhenCalled_AssertMonthWasCalledOnEachCreditInfoInCreditInfoCollection()
        {
            ICreditInfoCollection sut = CreateSut();

            DateTime creditInfoOffset = DateTime.Today.AddDays(_random.Next(1, _random.Next(1, 365)) * -1);
            IEnumerable <Mock <ICreditInfo> > creditInfoMockCollection = new List <Mock <ICreditInfo> >
            {
                _fixture.BuildCreditInfoMock(creditInfoOffset, isLastYearOfStatusDate: true),
                _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-1), isLastYearOfStatusDate: true),
                _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-2))
            };

            sut.Add(creditInfoMockCollection.Select(creditInfoMock => creditInfoMock.Object).ToArray());

            await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1));

            foreach (Mock <ICreditInfo> creditInfoMock in creditInfoMockCollection)
            {
                if (creditInfoMock.Object.IsLastYearOfStatusDate)
                {
                    creditInfoMock.Verify(m => m.Month, Times.Once);
                    continue;
                }

                creditInfoMock.Verify(m => m.Month, Times.Never);
            }
        }
Beispiel #2
0
        public void ValuesAtEndOfLastMonthFromStatusDate_WhenCalculateAsyncHasNotBeenCalled_ReturnsCreditInfoValuesWhereCreditIsEqualToZero()
        {
            ICreditInfoCollection sut = CreateSut();

            ICreditInfoValues result = sut.ValuesAtEndOfLastMonthFromStatusDate;

            Assert.That(result.Credit, Is.EqualTo(0M));
        }
        public void ValuesAtStatusDate_WhenCalculateAsyncHasNotBeenCalled_ReturnsCreditInfoValuesWhereBalanceIsEqualToZero()
        {
            ICreditInfoCollection sut = CreateSut();

            ICreditInfoValues result = sut.ValuesAtStatusDate;

            Assert.That(result.Balance, Is.EqualTo(0M));
        }
        public async Task CalculateAsync_WhenCalled_ReturnsCreditInfoCollection()
        {
            ICreditInfoCollection sut = CreateSut();

            ICreditInfoCollection result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1));

            Assert.That(result, Is.SameAs(sut));
        }
        public void ValuesAtStatusDate_WhenCalculateAsyncHasNotBeenCalled_ReturnsNotNull()
        {
            ICreditInfoCollection sut = CreateSut();

            ICreditInfoValues result = sut.ValuesAtStatusDate;

            Assert.That(result, Is.Not.Null);
        }
Beispiel #6
0
        public void ValuesAtStatusDate_WhenCalled_ReturnsSameCreditInfoValuesAsValuesAtStatusDateOnCreditInfoCollection()
        {
            ICreditInfoCollection creditInfoCollection = _fixture.BuildCreditInfoCollectionMock().Object;
            IAccount sut = CreateSut(creditInfoCollection);

            ICreditInfoValues result = sut.ValuesAtStatusDate;

            Assert.That(result, Is.SameAs(creditInfoCollection.ValuesAtStatusDate));
        }
Beispiel #7
0
        public Account(IAccounting accounting, string accountNumber, string accountName, IAccountGroup accountGroup, ICreditInfoCollection creditInfoCollection, IPostingLineCollection postingLineCollection)
            : base(accounting, accountNumber, accountName, postingLineCollection)
        {
            NullGuard.NotNull(accountGroup, nameof(accountGroup))
            .NotNull(creditInfoCollection, nameof(creditInfoCollection));

            AccountGroup         = accountGroup;
            CreditInfoCollection = creditInfoCollection;
        }
Beispiel #8
0
        public async Task ApplyCalculationAsync_WhenCalledOnPostingLineWhereAccountValuesAtPostingDateWasNotGivenAndCalculatedAccountDoesNotHaveCreditInfoForPostingDate_ReturnsSamePostingLineWhereCreditOnAccountValuesAtPostingDateEqualToZero()
        {
            IPostingLine sut = CreateSut();

            ICreditInfoCollection creditInfoCollection = _fixture.BuildCreditInfoCollectionMock(hasCreditInfoForFind: false).Object;
            IAccount     calculatedAccount             = _fixture.BuildAccountMock(creditInfoCollection: creditInfoCollection).Object;
            IPostingLine result = await sut.ApplyCalculationAsync(calculatedAccount);

            Assert.That(result.AccountValuesAtPostingDate.Credit, Is.EqualTo(0M));
        }
Beispiel #9
0
        public async Task CalculateAsync_WhenCalled_ReturnsSameAccountWhereCreditInfoCollectionIsEqualToCalculatedCreditInfoCollection()
        {
            ICreditInfoCollection calculatedCreditInfoCollection = _fixture.BuildCreditInfoCollectionMock().Object;
            ICreditInfoCollection creditInfoCollection           = _fixture.BuildCreditInfoCollectionMock(calculatedCreditInfoCollection: calculatedCreditInfoCollection).Object;
            IAccount sut = CreateSut(creditInfoCollection);

            IAccount result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1));

            Assert.That(result.CreditInfoCollection, Is.EqualTo(calculatedCreditInfoCollection));
        }
        internal static void EnsurePopulation(this ICreditInfoCollection creditInfoCollection, IAccount account)
        {
            NullGuard.NotNull(creditInfoCollection, nameof(creditInfoCollection))
            .NotNull(account, nameof(account));

            creditInfoCollection.EnsurePopulation <ICreditInfo, ICreditInfoCollection>(creditInfo =>
            {
                DateTime nextCreditInfoFromDate = creditInfo.ToDate.AddDays(1);
                return(new CreditInfo(account, (short)nextCreditInfoFromDate.Year, (short)nextCreditInfoFromDate.Month, creditInfo.Credit));
            });
        }
        public async Task CalculateAsync_WhenCreditInfoCollectionDoesNotContainCreditInfoForEndOfLastYearFromStatusDate_ReturnsCreditInfoCollectionWhereBalanceInValuesAtEndOfLastYearFromStatusDateIsEqualToZero()
        {
            ICreditInfoCollection sut = CreateSut();

            DateTime creditInfoOffset = DateTime.Today.AddDays(_random.Next(1, _random.Next(1, 365)) * -1);
            IEnumerable <ICreditInfo> creditInfoCollection = new List <ICreditInfo>
            {
                _fixture.BuildCreditInfoMock(creditInfoOffset).Object,
                _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-1)).Object,
                _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-2)).Object
            };

            sut.Add(creditInfoCollection);

            ICreditInfoCollection result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1));

            Assert.That(result.ValuesAtEndOfLastYearFromStatusDate.Balance, Is.EqualTo(0M));
        }
        public async Task CalculateAsync_WhenCreditInfoCollectionContainsCreditInfoForStatusDate_ReturnsCreditInfoCollectionWhereValuesAtStatusDateIsNotNull()
        {
            ICreditInfoCollection sut = CreateSut();

            DateTime    creditInfoOffset                   = DateTime.Today.AddDays(_random.Next(1, _random.Next(1, 365)) * -1);
            ICreditInfo creditInfoForStatusDate            = _fixture.BuildCreditInfoMock(creditInfoOffset, true).Object;
            IEnumerable <ICreditInfo> creditInfoCollection = new List <ICreditInfo>
            {
                creditInfoForStatusDate,
                _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-1)).Object,
                _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-2)).Object
            };

            sut.Add(creditInfoCollection);

            ICreditInfoCollection result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1));

            Assert.That(result.ValuesAtStatusDate, Is.Not.Null);
        }
        public async Task CalculateAsync_WhenCreditInfoCollectionContainsCreditInfoForEndOfLastYearFromStatusDate_ReturnsCreditInfoCollectionWhereCreditInValuesAtEndOfLastYearFromStatusDateIsEqualToCreditInCreditInfoForEndOfLastYearFromStatusDate()
        {
            ICreditInfoCollection sut = CreateSut();

            DateTime    creditInfoOffset = DateTime.Today.AddDays(_random.Next(1, _random.Next(1, 365)) * -1);
            ICreditInfo creditInfoForEndOfLastYearFromStatusDate = _fixture.BuildCreditInfoMock(creditInfoOffset, isLastYearOfStatusDate: true).Object;
            IEnumerable <ICreditInfo> creditInfoCollection       = new List <ICreditInfo>
            {
                creditInfoForEndOfLastYearFromStatusDate,
                _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-1), isLastYearOfStatusDate: true).Object,
                _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-2), isLastYearOfStatusDate: true).Object
            };

            sut.Add(creditInfoCollection);

            ICreditInfoCollection result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1));

            Assert.That(result.ValuesAtEndOfLastYearFromStatusDate.Credit, Is.EqualTo(creditInfoForEndOfLastYearFromStatusDate.Credit));
        }
        public async Task UpdateAccount_WhenCalledWithAccountingNumberAndAccountNumberForExistingAccount_ReturnsPartialViewResultWhereModelIsAccountViewModelWithCreditInfosContainingDataFromCreditInfoCollectionOnAccountFromQueryBus()
        {
            ICreditInfo[]         creditInfos          = _fixture.BuildCreditInfoCollectionMock().Object.ToArray();
            ICreditInfoCollection creditInfoCollection = _fixture.BuildCreditInfoCollectionMock(creditInfoCollection: creditInfos).Object;
            IAccount   account = _fixture.BuildAccountMock(creditInfoCollection: creditInfoCollection).Object;
            Controller sut     = CreateSut(account: account);

            PartialViewResult result = (PartialViewResult)await sut.UpdateAccount(_fixture.Create <int>(), _fixture.Create <string>());

            AccountViewModel accountViewModel = (AccountViewModel)result.Model;

            foreach (IGrouping <short, ICreditInfo> group in creditInfos.GroupBy(creditInfo => creditInfo.Year))
            {
                Assert.That(accountViewModel.CreditInfos.ContainsKey(group.Key), Is.True);

                CreditInfoCollectionViewModel creditInfoCollectionViewModel = accountViewModel.CreditInfos[group.Key];
                Assert.That(creditInfoCollectionViewModel, Is.Not.Null);
                Assert.That(creditInfoCollectionViewModel.All(creditInfoViewModel => group.SingleOrDefault(m => m.Month == creditInfoViewModel.Month) != null), Is.True);
            }
        }
        internal static void Populate(this ICreditInfoCollection creditInfoCollection, IAccount account, ICreditInfo[] creditInfos, DateTime statusDate, DateTime statusDateForCreditInfos)
        {
            NullGuard.NotNull(creditInfoCollection, nameof(creditInfoCollection))
            .NotNull(account, nameof(account))
            .NotNull(creditInfos, nameof(creditInfos));

            DateTime fromDate = new DateTime(statusDate.AddYears(-1).Year, 1, 1);

            if (creditInfos.Length == 0)
            {
                creditInfoCollection.Add(BuildCreditInfo(account, (short)fromDate.Year, (short)fromDate.Month));
                creditInfoCollection.Add(BuildCreditInfo(account, (short)statusDateForCreditInfos.Year, (short)statusDateForCreditInfos.Month));

                creditInfoCollection.EnsurePopulation(account);

                return;
            }

            ICreditInfo creditInfoForFromDate = creditInfos.FindInfoForFromDate(fromDate,
                                                                                (year, month, creditInfoBeforeFromDate) => BuildCreditInfo(account, year, month, creditInfoBeforeFromDate),
                                                                                (year, month) => BuildCreditInfo(account, year, month));

            creditInfoCollection.Add(creditInfoForFromDate);

            creditInfoCollection.Add(creditInfos.Between(creditInfoForFromDate.ToDate.AddDays(1), statusDateForCreditInfos));

            ICreditInfo lastCreditInfo = creditInfoCollection.Last();

            if (lastCreditInfo == null || lastCreditInfo.Year > (short)statusDateForCreditInfos.Year || lastCreditInfo.Year == (short)statusDateForCreditInfos.Year && lastCreditInfo.Month >= (short)statusDateForCreditInfos.Month)
            {
                creditInfoCollection.EnsurePopulation(account);

                return;
            }

            creditInfoCollection.Add(BuildCreditInfo(account, (short)statusDateForCreditInfos.Year, (short)statusDateForCreditInfos.Month, lastCreditInfo));

            creditInfoCollection.EnsurePopulation(account);
        }
Beispiel #16
0
 private IAccount CreateSut(ICreditInfoCollection creditInfoCollection = null)
 {
     return(new Domain.Accounting.Account(_fixture.BuildAccountingMock().Object, _fixture.Create <string>(), _fixture.Create <string>(), _fixture.BuildAccountGroupMock().Object, creditInfoCollection ?? _fixture.BuildCreditInfoCollectionMock().Object, _fixture.BuildPostingLineCollectionMock().Object));
 }
        internal async Task CreateOrUpdateAsync(ICreditInfoCollection creditInfoCollection, AccountModel accountModel)
        {
            NullGuard.NotNull(creditInfoCollection, nameof(creditInfoCollection))
            .NotNull(accountModel, nameof(accountModel));

            ICreditInfo creditInfo = creditInfoCollection.First();

            while (creditInfo != null)
            {
                CreditInfoModel currentCreditInfoModel  = accountModel.CreditInfos.SingleOrDefault(creditInfoModel => creditInfoModel.YearMonth.Year == creditInfo.Year && creditInfoModel.YearMonth.Month == creditInfo.Month);
                CreditInfoModel previousCreditInfoModel = accountModel.CreditInfos.Where(creditInfoModel => creditInfoModel.YearMonth.Year < creditInfo.Year || creditInfoModel.YearMonth.Year == creditInfo.Year && creditInfoModel.YearMonth.Month < creditInfo.Month)
                                                          .OrderByDescending(creditInfoModel => creditInfoModel.YearMonth.Year)
                                                          .ThenByDescending(creditInfoModel => creditInfoModel.YearMonth.Month)
                                                          .FirstOrDefault();

                if (currentCreditInfoModel != null)
                {
                    if (previousCreditInfoModel != null && creditInfo.Credit == previousCreditInfoModel.Credit)
                    {
                        accountModel.CreditInfos.Remove(await OnDeleteAsync(currentCreditInfoModel));

                        creditInfo = creditInfoCollection.Next(creditInfo);
                        continue;
                    }

                    if (creditInfo.Credit == currentCreditInfoModel.Credit)
                    {
                        creditInfo = creditInfoCollection.Next(creditInfo);
                        continue;
                    }

                    await OnUpdateAsync(creditInfo, currentCreditInfoModel);

                    creditInfo = creditInfoCollection.Next(creditInfo);
                    continue;
                }

                if (previousCreditInfoModel != null)
                {
                    if (creditInfo.Credit == previousCreditInfoModel.Credit)
                    {
                        creditInfo = creditInfoCollection.Next(creditInfo);
                        continue;
                    }

                    await CreateAsync(creditInfo, accountModel);

                    creditInfo = creditInfoCollection.Next(creditInfo);
                    continue;
                }

                if (creditInfo.Credit == 0M)
                {
                    creditInfo = creditInfoCollection.Next(creditInfo);
                    continue;
                }

                await CreateAsync(creditInfo, accountModel);

                creditInfo = creditInfoCollection.Next(creditInfo);
            }
        }