public async Task <IActionResult> Edit(int id, [Bind("Id,Amount,Date,PaymentNo,Destination,FullName,MembershipFeeId")] TransferPayment transferPayment) { if (id != transferPayment.Id) { return(NotFound()); } if (ModelState.IsValid) { try { _context.Update(transferPayment); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!TransferPaymentExists(transferPayment.Id)) { return(NotFound()); } else { throw; } } return(RedirectToAction("Index")); } ViewData["MembershipFeeId"] = new SelectList(_context.MembershipFees, "Id", "Id", transferPayment.MembershipFeeId); return(View(transferPayment)); }
public async Task <IActionResult> Create([Bind("TransferPaymentId,PaymentTypeFrom,PaymentTypeTo,Total,Description")] TransferPayment transferPayment) { if (ModelState.IsValid) { transferPayment.CreatedDate = DateTime.Now; transferPayment.UserId = User.Identity.Name.ToString(); var balanceFrom = await _context.Balances .FirstOrDefaultAsync(m => m.PaymentType == transferPayment.PaymentTypeFrom); balanceFrom.Total = balanceFrom.Total - transferPayment.Total; balanceFrom.UpdateDate = DateTime.Now; balanceFrom.UserId = User.Identity.Name.ToString(); var balanceTo = await _context.Balances .FirstOrDefaultAsync(m => m.PaymentType == transferPayment.PaymentTypeTo); balanceTo.Total = balanceTo.Total + transferPayment.Total; balanceTo.UpdateDate = DateTime.Now; balanceTo.UserId = User.Identity.Name.ToString(); _context.Update(balanceFrom); _context.Update(balanceTo); _context.Add(transferPayment); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } return(View(transferPayment)); }
public async Task <IActionResult> Edit(int id, [Bind("TransferPaymentId,PaymentTypeFrom,PaymentTypeTo,Total,CreatedDate,UserId,Description")] TransferPayment transferPayment) { if (id != transferPayment.TransferPaymentId) { return(NotFound()); } if (ModelState.IsValid) { try { _context.Update(transferPayment); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!TransferPaymentExists(transferPayment.TransferPaymentId)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } InitialCreate((int)transferPayment.PaymentTypeFrom, (int)transferPayment.PaymentTypeTo); return(View(transferPayment)); }
public async Task <IActionResult> CreateForFee([Bind("Amount,Date,PaymentNo,Destination,FullName,MembershipFeeId")] TransferPayment transferPayment) { if (ModelState.IsValid) { var fee = await _context.MembershipFees.AsNoTracking().SingleOrDefaultAsync(f => f.Id == transferPayment.MembershipFeeId); var payments = await _context.Payments.AsNoTracking() .Where(p => p.MembershipFeeForeignKey == fee.Id && p.Status == PaymentStatus.Pending) .OrderBy(p => p.PaymentDeadline) .ToListAsync(); double amount = transferPayment.Amount; if (amount > 0) { for (int i = 0; i < payments.Count; i++) { double depositOrDebt = payments[i].DepositOrDebt.Value < 0 ? payments[i].DepositOrDebt.Value * -1 : -1; if (depositOrDebt != -1) { if (amount >= depositOrDebt) { payments[i].Status = PaymentStatus.Payed; payments[i].CashPaymentForeignKey = transferPayment.Id; payments[i].PayedOn = transferPayment.Date; amount -= depositOrDebt; payments[i].DepositOrDebt = 0; _context.Update(payments[i]); if (amount == 0) { break; } } else { payments[i].DepositOrDebt += amount; _context.Update(payments[i]); break; } } } } fee.LeftOver -= transferPayment.Amount; _context.Update(fee); _context.Add(transferPayment); await _context.SaveChangesAsync(); return(RedirectToAction("Index", "MembershipFees")); } ViewData["MembershipFeeId"] = new SelectList(_context.MembershipFees, "Id", "Id", transferPayment.MembershipFeeId); return(PartialView("_CreateTransferForFee", transferPayment)); }
public async Task <IActionResult> Create([Bind("Id,Amount,Date,PaymentNo,Destination,FullName,MembershipFeeId")] TransferPayment transferPayment) { if (ModelState.IsValid) { _context.Add(transferPayment); await _context.SaveChangesAsync(); return(RedirectToAction("Index")); } ViewData["MembershipFeeId"] = new SelectList(_context.MembershipFees, "Id", "Id", transferPayment.MembershipFeeId); return(View(transferPayment)); }
public async Task ProcessesUnableToFundTransferPayments() { // arrange var keys = new List <string> { "1" }; var requiredPaymentEvent = new CalculatedRequiredLevyAmount { EventId = Guid.NewGuid(), AmountDue = 100, SfaContributionPercentage = 11, OnProgrammeEarningType = OnProgrammeEarningType.Completion, Learner = new Learner(), AccountId = 666, TransferSenderAccountId = 2 }; var balance = 100m; var transferAllowance = 50; var transferPayment = new TransferPayment { AmountDue = 55, Type = FundingSourceType.Transfer }; var unableToFundTransferPayment = new UnableToFundTransferPayment { AmountDue = 44, Type = FundingSourceType.Transfer }; var allPayments = new FundingSourcePayment[] { transferPayment, unableToFundTransferPayment }; generateSortedPaymentKeysMock .Setup(x => x.GeyKeys()) .ReturnsAsync(keys) .Verifiable(); eventCacheMock.Setup(c => c.TryGet("1", CancellationToken.None)) .ReturnsAsync(() => new ConditionalValue <CalculatedRequiredLevyAmount>(true, requiredPaymentEvent)) .Verifiable(); levyAccountRepositoryMock.Setup(r => r.GetLevyAccount(666, CancellationToken.None)) .ReturnsAsync(() => new LevyAccountModel { Balance = balance, TransferAllowance = transferAllowance }) .Verifiable(); levyBalanceServiceMock.Setup(s => s.Initialise(balance, transferAllowance)).Verifiable(); processorMock.Setup(p => p.Process(It.IsAny <RequiredPayment>())).Returns(() => allPayments).Verifiable(); eventCacheMock.Setup(c => c.Clear("1", CancellationToken.None)).Returns(Task.CompletedTask).Verifiable(); refundSortKeysCacheMock.Setup(c => c.Clear(CacheKeys.RefundPaymentsKeyListKey, CancellationToken.None)).Returns(Task.CompletedTask).Verifiable(); transferPaymentSortKeysCacheMock.Setup(c => c.Clear(CacheKeys.SenderTransferKeyListKey, CancellationToken.None)).Returns(Task.CompletedTask).Verifiable(); requiredPaymentSortKeysCacheMock.Setup(c => c.Clear(CacheKeys.RequiredPaymentKeyListKey, CancellationToken.None)).Returns(Task.CompletedTask).Verifiable(); // act var fundingSourcePayments = await service.HandleMonthEnd(666, 1); // assert fundingSourcePayments.Should().HaveCount(2); fundingSourcePayments[0].Should().BeOfType <TransferFundingSourcePaymentEvent>(); fundingSourcePayments[1].Should().BeOfType <ProcessUnableToFundTransferFundingSourcePayment>(); fundingSourcePayments[0].AmountDue.Should().Be(55); fundingSourcePayments[1].AmountDue.Should().Be(44); }
public static void ReCountPayments(int feeId, CashModel cashModel, TransferPayment transferPayment, ApplicationDbContext _context) { var payments = _context.Payments.AsNoTracking() .Where(p => p.MembershipFeeForeignKey == feeId && p.Status != PaymentStatus.Paused) .OrderBy(p => p.PaymentDeadline) .ToList(); foreach (var payment in payments) { payment.Status = PaymentStatus.Pending; payment.DepositOrDebt = -payment.Amount; } if (cashModel != null) { double amount = cashModel.Amount; foreach (PendingPaymentModel payment in payments) { if (amount >= Math.Abs(payment.DepositOrDebt.Value)) { payment.Status = PaymentStatus.Payed; payment.CashPaymentForeignKey = cashModel.Id; payment.PayedOn = cashModel.Date; amount -= Math.Abs(payment.DepositOrDebt.Value); payment.DepositOrDebt = 0; _context.Update(payment); if (amount == 0) { break; } } else { payment.DepositOrDebt += amount; _context.Update(payment); break; } } _context.SaveChanges(); } else if (transferPayment != null) { double amount = transferPayment.Amount; foreach (PendingPaymentModel payment in payments) { if (amount >= Math.Abs(payment.DepositOrDebt.Value)) { payment.Status = PaymentStatus.Payed; payment.TransferPaymentForeignKey = transferPayment.Id; payment.PayedOn = transferPayment.Date; amount -= Math.Abs(payment.DepositOrDebt.Value); payment.DepositOrDebt = 0; _context.Update(payment); if (amount == 0) { break; } } else { payment.DepositOrDebt += amount; _context.Update(payment); break; } } _context.SaveChanges(); } }
private async Task ReCountPayments(int feeId, CashModel cashModel, TransferPayment transferPayment) { //var fee = await _context.MembershipFees.SingleOrDefaultAsync(f => f.Id == feeId); var payments = await _context.Payments.Where(p => p.MembershipFeeForeignKey == feeId && p.Status != PaymentStatus.Paused) .OrderBy(p => p.PaymentDeadline) .ToListAsync(); foreach (var payment in payments) { payment.Status = PaymentStatus.Pending; payment.DepositOrDebt = -payment.Amount; } if (cashModel != null) { double amount = cashModel.Amount; for (int i = 0; i < payments.Count; i++) { if (amount >= Math.Abs(payments[i].DepositOrDebt.Value)) { payments[i].Status = PaymentStatus.Payed; payments[i].CashPaymentForeignKey = cashModel.Id; payments[i].PayedOn = cashModel.Date; amount -= Math.Abs(payments[i].DepositOrDebt.Value); payments[i].DepositOrDebt = 0; _context.Update(payments[i]); if (amount == 0) { break; } } else { payments[i].DepositOrDebt += amount; _context.Update(payments[i]); break; } } await _context.SaveChangesAsync(); } else if (transferPayment != null) { double amount = transferPayment.Amount; for (int i = 0; i < payments.Count; i++) { if (amount >= Math.Abs(payments[i].DepositOrDebt.Value)) { payments[i].Status = PaymentStatus.Payed; payments[i].TransferPaymentForeignKey = transferPayment.Id; payments[i].PayedOn = transferPayment.Date; amount -= Math.Abs(payments[i].DepositOrDebt.Value); payments[i].DepositOrDebt = 0; _context.Update(payments[i]); if (amount == 0) { break; } } else { payments[i].DepositOrDebt += amount; _context.Update(payments[i]); break; } } await _context.SaveChangesAsync(); } }