public static AccountAccessConsentAggregate Create(string clientId, ICollection <string> permissions, DateTime?expirationDateTime, DateTime?transactionFromDateTime, DateTime?transactionToDateTime, string risk)
        {
            var result = new AccountAccessConsentAggregate();
            var evt    = new AccountAccessConsentAddedEvent(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 0, clientId, permissions, expirationDateTime, transactionFromDateTime, transactionToDateTime, risk);

            result.Handle(evt);
            result.DomainEvents.Add(evt);
            return(result);
        }
        private void Handle(AccountAccessConsentAddedEvent evt)
        {
            if (evt.TransactionFromDateTime != null && evt.TransactionToDateTime != null && evt.TransactionFromDateTime.Value > evt.TransactionToDateTime.Value)
            {
                throw new BusinessRuleValidationException(Global.TransactionStartDateSuperiorToEndDate);
            }

            var unknownPermissions = new List <string>();
            var permissions        = new List <AccountAccessConsentPermission>();

            if (evt.Permissions.Any())
            {
                foreach (var permission in evt.Permissions)
                {
                    try
                    {
                        permissions.Add(Enumeration.FromDisplayName <AccountAccessConsentPermission>(permission));
                    }
                    catch (InvalidOperationException)
                    {
                        unknownPermissions.Add(permission);
                    }
                }
            }

            if (unknownPermissions.Any())
            {
                throw new BusinessRuleValidationException(string.Format(Global.PermissionsAreUnknown, string.Join(",", unknownPermissions)));
            }

            AggregateId             = evt.AggregateId;
            ClientId                = evt.ClientId;
            Status                  = AccountAccessConsentStatus.AwaitingAuthorisation;
            Permissions             = permissions;
            ExpirationDateTime      = evt.ExpirationDateTime;
            TransactionFromDateTime = evt.TransactionFromDateTime;
            TransactionToDateTime   = evt.TransactionToDateTime;
            Risk = evt.Risk;
        }