Beispiel #1
0
        public TransferResult Transfer(DailyPolicy policy, Account source, Account destination, double amount, string reason, DateTime now)
        {
            if (string.IsNullOrWhiteSpace(reason))
            {
                return(TransferResult.InvalidReasonProvided());
            }

            var reservation = policy.Reserve(amount, now);

            if (reservation == null)
            {
                return(TransferResult.DailyQuotaReached(policy.DailyLimit));
            }

            var withdrawResult = source.Withdraw(amount);

            if (withdrawResult == WithdrawStatus.InsufficientFunds)
            {
                reservation.Cancel();

                return(TransferResult.InsufficientFunds(source.Amount));
            }
            else if (withdrawResult == WithdrawStatus.AccountDoesNotAllowWithdrawals)
            {
                reservation.Cancel();

                return(TransferResult.AccountCannotWithdraw());
            }

            if (!destination.Deposit(amount))
            {
                reservation.Cancel();
                source.Deposit(amount);
            }

            return(TransferResult.Success());
        }
Beispiel #2
0
        public WithdrawResult Withdraw(DailyPolicy policy, Account account, double amount, DateTime now)
        {
            var reservation = policy.Reserve(amount, now);

            if (reservation == null)
            {
                return(WithdrawResult.DailyQuotaReached(policy.DailyLimit));
            }

            var withdrawResult = account.Withdraw(amount);

            if (withdrawResult == WithdrawStatus.InsufficientFunds)
            {
                reservation.Cancel();

                return(WithdrawResult.InsufficientFunds(account.Amount));
            }
            else if (withdrawResult == WithdrawStatus.AccountDoesNotAllowWithdrawals)
            {
                return(WithdrawResult.AccountCannotWithdraw());
            }

            return(WithdrawResult.Success());
        }
Beispiel #3
0
 public void Cancel()
 {
     DailyPolicy.CancelReservation(this);
 }
Beispiel #4
0
 public Reservation(DailyPolicy dailyPolicy, double amount, DateTime date)
 {
     DailyPolicy = dailyPolicy;
     Timestamp   = date;
     Amount      = amount;
 }