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); }
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);