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);
        }
Beispiel #7
0
        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();
            }
        }
Beispiel #8
0
        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();
            }
        }