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