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