public override async Task <ICollection <MembershipModel> > Handle(Request request, CancellationToken cancellationToken) { var list = _databaseQueries.GetMembershipsAndPayments(request.Payment.MemberId) .Where(x => x.Difference > 0).OrderBy(x => x.Year).ThenBy(x => x.Month).ThenBy(x => x.Amount); var amount = request.Payment.Amount; foreach (var item in list) { if (amount <= 0) { break; } var amountToPay = amount > item.Difference ? item.Difference : amount; await DbContext.Payments.AddAsync(new Payment() { MembershipId = item.Id, Amount = amountToPay, Date = request.Payment.DateTime, CreatorId = request.Creator }, cancellationToken); amount -= amountToPay; } await DbContext.SaveChangesAsync(cancellationToken); return(await _mediator.Send(new GetMembershipsQuery.Request(request.Payment.MemberId), cancellationToken)); }
public override Task <List <MembershipsAndPayments> > Handle(Request request, CancellationToken cancellationToken) { var memberships = _queries.GetMembershipsAndPayments(null).ToList(); return(Task.FromResult(memberships)); }
public async void AddPayment() { var payment = new PaymentModel { MemberId = 1, Amount = 3000, DateTime = DateTime.Now }; _mockQueries.GetMembershipsAndPayments(1) .Returns(new List <MembershipsAndPayments>() { new MembershipsAndPayments() { Id = 1, Year = 2018, Month = 12, Amount = 2800, Difference = 2800, }, new MembershipsAndPayments() { Id = 2, Year = 2019, Month = 1, Amount = 2800, Difference = 2800 }, new MembershipsAndPayments() { Id = 3, Year = 2019, Month = 1, Amount = 200, Difference = 200 } }); using (var dbFactory = new DbContextFactory()) { using (var ctx = dbFactory.GetContext()) { ctx.Members.Add(new Member() { Id = 1, FirstName = "Jovana", LastName = "Bajsanski", Gender = Gender.Female, DateOfBirth = new DateTime(2010, 11, 25) }); ctx.Memberships.Add(new Membership() { Id = 1, Year = 2018, Month = 12, Amount = 2800, Date = DateTime.Now, MemberId = 1 }); ctx.Memberships.Add(new Membership() { Id = 2, Year = 2019, Month = 1, Amount = 2800, Date = DateTime.Now, MemberId = 1 }); ctx.Memberships.Add(new Membership() { Id = 3, Year = 2019, Month = 1, Amount = 200, Date = DateTime.Now, MemberId = 1 }); ctx.SaveChanges(); } // Act using (var ctx = dbFactory.GetContext()) { var mediator = Substitute.For <IMediator>(); var command = new AddPaymentCommand.Handler(ctx, _mockQueries, mediator); await command.Handle(new AddPaymentCommand.Request() { Payment = payment }, CancellationToken.None); } // Assert using (var ctx = dbFactory.GetContext()) { var memberships = ctx.Memberships.Include(x => x.Payments).ToDictionary(x => x.Id); Assert.Equal(1, memberships[1].Payments.Count); Assert.Equal(2800, memberships[1].Payments.Single().Amount); Assert.Equal(0, memberships[2].Payments.Count); Assert.Equal(1, memberships[3].Payments.Count); Assert.Equal(200, memberships[3].Payments.Single().Amount); } } }