// Installments are paid in order by Date public Installment NextInstallment() { var next = Installments.Where(i => i.IsPending) .OrderBy(i => i.Date) .FirstOrDefault(); return(next); }
public decimal OustandingBalance() { var outstandingBalance = Installments .Where(i => i.IsPending || i.IsDefaulted) .Sum(i => i.Amount); return(outstandingBalance); }
// 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; } } }
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); }
// 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()); }
// 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); }
// 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()); }
// 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); }
// 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); }
// 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); }
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)); }
public decimal AmountPastDue(DateTime currentDate) { return(Installments.Where(i => currentDate.CompareTo(i.Date) == 1 && i.IsPending == true) .Select(i => i.Amount) .Sum()); }
public IList <Installment> PaidInstallments() => Installments.Where(i => i.IsPaid).ToList();
public IList <Installment> PendingInstallments() => Installments.Where(i => i.IsPending).ToList();
public decimal OustandingBalance() { var pendingPaymentsAmount = Installments.Where(i => i.IsPending || i.IsDefaulted).Sum(i => i.Amount); return(pendingPaymentsAmount); }
public decimal AmountPastDue(DateTime currentDate) { return(Installments.Where(i => currentDate.CompareTo(i.DueDate) >= 1 && (i.IsPending || i.IsDefaulted)) .Select(i => i.Amount) .Sum()); }