public IEnumerable <ApplicationEvent> Process(BankOperationProcessorCommand command)
        {
            Argument.NotNull(command, "command");
            var operation = command.BankOperation;

            if (operation.Status == ProcessStatus.Failed)
            {
                Logger.Warn("Operation #{0} has been already failed.", operation.Id);
                return(Enumerable.Empty <ApplicationEvent>());
            }
            if (operation.Status == ProcessStatus.Completed)
            {
                Logger.Warn("Operation #{0} has been already completed.", operation.Id);
                return(Enumerable.Empty <ApplicationEvent>());
            }
            var postponeDate = PostponeDateOrNull(operation);

            if (postponeDate != null)
            {
                var operationModel = command.BankOperation.ToModel <BankOperation, BankOperationModel>();
                var @event         = new OperationProgressEvent(command.OperationId, operationModel);
                return(new List <ApplicationEvent>
                {
                    new PostponedEvent(@event, postponeDate.Value)
                });
            }
            return(ProcessPending(command));
        }
Example #2
0
        protected override IEnumerable <ApplicationEvent> ProcessPending(BankOperationProcessorCommand command)
        {
            var transfer       = (Transfer)command.BankOperation;
            var appOperationId = command.OperationId;

            if (transfer.Withdrawal != null &&
                transfer.Withdrawal.Status == ProcessStatus.Pending &&
                transfer.Deposit == null)
            {
                return(WhenWithdrawalPending(appOperationId, transfer));
            }
            if (transfer.Withdrawal != null &&
                transfer.Deposit == null &&
                transfer.Withdrawal.Status == ProcessStatus.Failed)
            {
                return(WhenWithdrawalFailed(appOperationId, transfer));
            }
            if (transfer.Withdrawal != null &&
                transfer.Deposit == null &&
                transfer.Withdrawal.Status == ProcessStatus.Completed)
            {
                return(WhenWithdrawalCompleted(appOperationId, transfer));
            }
            if (transfer.Deposit != null &&
                transfer.Deposit.Status == ProcessStatus.Failed)
            {
                return(WhenDepositFailed(appOperationId, transfer));
            }
            if (transfer.Deposit != null &&
                transfer.Deposit.Status == ProcessStatus.Completed)
            {
                return(WhenDepositCompleted(appOperationId, transfer));
            }
            return(WhenStateIsInvalid(appOperationId, transfer));
        }
 protected abstract IEnumerable <ApplicationEvent> ProcessPending(BankOperationProcessorCommand command);