Exemple #1
0
        // Installments are paid in order by Date
        public Installment NextInstallment()
        {
            var next = Installments.Where(i => i.IsPending)
                       .OrderBy(i => i.Date)
                       .FirstOrDefault();

            return(next);
        }
Exemple #2
0
        public decimal OustandingBalance()
        {
            var outstandingBalance =
                Installments
                .Where(i => i.IsPending || i.IsDefaulted)
                .Sum(i => i.Amount);

            return(outstandingBalance);
        }
Exemple #3
0
        // We only accept payments matching the Installment Amount.
        public void MakePayment(decimal amount, Guid installmentId)
        {
            var activeAccount = Installments.Where(x => x.Id == installmentId);

            foreach (var singleInstallment in activeAccount)
            {
                if (!singleInstallment.IsPaid && singleInstallment.Amount == amount)
                {
                    singleInstallment.IsPaid = true;
                    break;
                }
            }
        }
Exemple #4
0
        public decimal OustandingBalance(Guid installmentId)
        {
            var activeAccount = Installments.Where(x => x.Id == installmentId);
            var balance       = 0M;

            foreach (var singleInstallment in activeAccount)
            {
                if (!singleInstallment.IsPaid && !singleInstallment.AccountClosed)
                {
                    balance = balance + singleInstallment.Amount;
                }
            }
            return(balance);
        }
Exemple #5
0
        // Installments are paid in order by Date
        public Installment NextInstallment()
        {
            var activeAccount = Installments.Where(x => x.Id == Id);

            foreach (var singleInstallment in activeAccount)
            {
                if (!singleInstallment.IsPaid)
                {
                    return(singleInstallment);
                }
            }

            return(new Installment());
        }
Exemple #6
0
        // We only accept payments matching the Installment Amount.
        public void MakePayment(decimal amount, Guid installmentId)
        {
            if (!Installments.Any(i => i.Id == installmentId))
            {
                throw new ArgumentException($"No Installment Found for Provided installmentId: {installmentId}", nameof(installmentId));
            }

            var installment = Installments.Where(i => i.Id == installmentId).FirstOrDefault();

            if (installment.Amount != amount)
            {
                throw new ArgumentException($"Payment amount must match installment amount.", nameof(amount));
            }

            //Simulating a third party api call
            var paymentReferenceId = _thirdPartyPaymentService.MakePayment(amount);

            installment.SetStatus(paymentReferenceId);
        }
Exemple #7
0
        // We only accept payments matching the Installment Amount.
        public void MakePayment(decimal amount, Guid installmentId)
        {
            if (!Installments.Any(i => i.Id == installmentId))
            {
                throw new ArgumentException($"No Installment Found for Provided installmentId: {installmentId}", nameof(installmentId));
            }

            var installment = Installments.Where(i => i.Id == installmentId).FirstOrDefault();

            if (installment.Amount != amount)
            {
                throw new ArgumentException($"Payment amount must match installment amount.", nameof(amount));
            }

            //we call payment domain logic here, ie. service call or writing to an event stream
            var paymentReferenceId = Guid.NewGuid(); //in this instance, i'm just setting some guid to be the payment reference id,

            //but an actual implementation could call another service i.e 3rd party payment API
            installment.SetPaid(paymentReferenceId.ToString());
        }
Exemple #8
0
        // Returns: Amount to refund via PaymentProvider
        public decimal ApplyRefund(Refund refund)
        {
            var refundedAmountAgainstPaidInstallments =
                Installments
                .Where(i => i.IsPaid)
                .Sum(i => i.Amount);

            Refunds.Add(refund);

            var refundBalance = refund.Amount;

            foreach (var installment in Installments)
            {
                if (refundBalance >= installment.Amount)
                {
                    MakePayment(installment.Amount, installment.Id);
                }

                refundBalance = refundBalance - installment.Amount;
            }

            return(refundedAmountAgainstPaidInstallments);
        }
Exemple #9
0
        // Returns: Amount to refund via PaymentProvider
        public decimal ApplyRefund(Guid installmentId)
        {
            var activeAccount = Installments.Where(x => x.Id == installmentId);
            var refund        = 0M;

            foreach (var singleInstallment in activeAccount)
            {
                if (singleInstallment.IsPaid && !singleInstallment.AccountClosed)
                {
                    refund = refund + singleInstallment.Amount;
                    singleInstallment.IsPaid = false;
                }
                singleInstallment.AccountClosed = true;
            }

            var closingAccount = activeAccount.FirstOrDefault();
            var refundAccount  = new Refund(refund)
            {
                Id   = closingAccount.Id,
                Date = DateTime.Now
            };

            return(refund);
        }
Exemple #10
0
        // Returns: Amount to refund via PaymentProvider
        public decimal ApplyRefund(Refund refund)
        {
            var refundedAmount = Installments.Where(i => i.IsPaid).Sum(j => j.Amount);

            if (Refunds == null)
            {
                Refunds = new List <Refund>();
            }
            Refunds.Add(refund);

            var refundBalance = refund.Amount;

            foreach (var installment in Installments)
            {
                if (refundBalance >= installment.Amount)
                {
                    MakePayment(installment.Amount, installment.Id);
                }

                refundBalance = refundBalance - installment.Amount;
            }

            return(refundedAmount);
        }
Exemple #11
0
 public IList <Installment> DefaultedInstallments()
 => Installments.Where(i => i.IsDefaulted).ToList();
 public IList <Installment> PendingInstallments()
 {
     return(Installments.Where(i => i.IsPending).ToList());
 }
 public IList <Installment> DefaultedInstallments()
 {
     return(Installments.Where(i => i.IsDefaulted).ToList());
 }
 public IList <Installment> PaidInstallments()
 {
     return(Installments.Where(i => i.IsPaid).ToList());
 }
        public decimal AmountPastDue()
        {
            DateTime currentDate = DateTime.Now;

            return(Installments.Where(i => (i.IsDefaulted || i.IsPending) && currentDate > i.Date).Sum(i => i.Amount));
        }
Exemple #16
0
 public decimal AmountPastDue(DateTime currentDate)
 {
     return(Installments.Where(i => currentDate.CompareTo(i.Date) == 1 && i.IsPending == true)
            .Select(i => i.Amount)
            .Sum());
 }
Exemple #17
0
 public IList <Installment> PaidInstallments()
 => Installments.Where(i => i.IsPaid).ToList();
Exemple #18
0
 public IList <Installment> PendingInstallments()
 => Installments.Where(i => i.IsPending).ToList();
Exemple #19
0
        public decimal OustandingBalance()
        {
            var pendingPaymentsAmount = Installments.Where(i => i.IsPending || i.IsDefaulted).Sum(i => i.Amount);

            return(pendingPaymentsAmount);
        }
Exemple #20
0
 public decimal AmountPastDue(DateTime currentDate)
 {
     return(Installments.Where(i => currentDate.CompareTo(i.DueDate) >= 1 && (i.IsPending || i.IsDefaulted))
            .Select(i => i.Amount)
            .Sum());
 }