public override async Task <Result> ApplyPaymentToInvoiceAsync(IInvoice invoice, decimal amount, Guid?refId) { Transaction transaction = TransactionFactory.GetPaymentTransaction(invoice.AccountId, amount, refId); var outstandingPurchases = invoice.Purchases.Where(p => p.Balance > 0);// TODO: Check status? var remainingPaymentBalance = amount; decimal paymentAmount = 0; // TODO: Rounding? foreach (var purchase in outstandingPurchases.OrderByDescending(p => p.Created)) { if (remainingPaymentBalance > purchase.Balance) { paymentAmount = purchase.Balance; } else { paymentAmount = remainingPaymentBalance; } remainingPaymentBalance -= paymentAmount; transaction.Entries.Add(new Entry() { AccountId = invoice.AccountId, Amount = paymentAmount }); if (remainingPaymentBalance <= 0) { break; } } if (remainingPaymentBalance > 0) { var creditAccountDepositEntry = await GetCreditAccountDepositEntry(invoice.AccountHolderId, remainingPaymentBalance); transaction.Entries.Add(creditAccountDepositEntry.Value); } var validationResult = IsTransactionValid(transaction).Result; if (validationResult.IsSuccessful) { invoice.ApplyTransaction(transaction); } }
public async override Task <Result> ApplyPaymentToInvoiceAsync(IInvoice invoice, decimal amount, Guid?refId) { Transaction transaction = TransactionFactory.GetNewInvoicePaymentTransaction(amount, refId); var outstandingPurchases = invoice.Purchases.Where(p => p.Balance > 0); var remainingPaymentBalance = amount; var paymentAmount = amount / outstandingPurchases.Count(); // TODO: Rounding? foreach (var purchase in outstandingPurchases) // TODO: Check status? { if (remainingPaymentBalance < paymentAmount) { paymentAmount = remainingPaymentBalance; } transaction.Entries.Add(new Entry() { AccountId = invoice.AccountId, Amount = paymentAmount }); remainingPaymentBalance -= remainingPaymentBalance; if (remainingPaymentBalance <= 0) { break; } } if (remainingPaymentBalance > 0) { var creditAccountDepositEntry = await GetCreditAccountDepositEntry(invoice.AccountHolderId, remainingPaymentBalance); transaction.Entries.Add(creditAccountDepositEntry); } var validationResult = IsTransactionValid(transaction).Result; if (true == validationResult) { invoice.ApplyTransaction(transaction); } }