Example #1
0
        public ApiResult <Account> Create(Guid customerId,
                                          CreateAccountOptions options)
        {
            if (options == null)
            {
                return(ApiResult <Account> .CreateFailed(
                           Constants.ApiResultCode.BadRequest, $"Null {nameof(options)}"));
            }

            if (string.IsNullOrWhiteSpace(options.CurrencyCode) ||
                !options.CurrencyCode.Equals(
                    Constants.CurrencyCode.Euro, StringComparison.OrdinalIgnoreCase))
            {
                return(ApiResult <Account> .CreateFailed(
                           Constants.ApiResultCode.BadRequest,
                           $"Invalid or unsupported currency {options.CurrencyCode}"));
            }

            var customerResult = _customers.GetById(customerId);

            if (!customerResult.IsSuccessful())
            {
                return(customerResult.ToResult <Account>());
            }

            var customer = customerResult.Data;

            var account = new Account()
            {
                AccountId    = CreateAccountId(customer.CountryCode),
                Balance      = 0M,
                CurrencyCode = options.CurrencyCode,
                Customer     = customer,
                State        = Constants.AccountState.Active,
                Description  = options.Description
            };

            _dbContext.Add(account);

            try {
                _dbContext.SaveChanges();
            }
            catch (Exception) {
                return(ApiResult <Account> .CreateFailed(
                           Constants.ApiResultCode.InternalServerError, "Could not save account"));
            }

            return(ApiResult <Account> .CreateSuccessful(account));
        }
Example #2
0
        public ApiResult <Card> Create(string accountId, CreateCardOptions options)
        {
            if (options == null)
            {
                return(ApiResult <Card> .CreateFailed(
                           Constants.ApiResultCode.BadRequest, $"Null {nameof(options)}"));
            }

            var accountResult = _accountService.GetById(accountId);

            if (!accountResult.IsSuccessful())
            {
                return(accountResult.ToResult <Card>());
            }

            var account = accountResult.Data;

            var card = new Card()
            {
                CardNumber = options.CardNumber,
                CardType   = options.CardType,
                Active     = true
            };

            card.Accounts.Add(account);

            _dbContext.Add(card);
            try {
                _dbContext.SaveChanges();
            }
            catch (Exception) {
                return(ApiResult <Card> .CreateFailed(
                           Constants.ApiResultCode.InternalServerError, "Could not save account"));
            }
            return(ApiResult <Card> .CreateSuccessful(card));
        }
Example #3
0
        private bool UpdateAccount(string accountId, decimal balance)
        {
            bool res     = false;
            var  account = _dbContext.Set <Account>().AsQueryable().Where(c => c.AccountId == accountId).SingleOrDefault();

            account.Balance = balance;

            try {
                _dbContext.SaveChanges();
            }
            catch (Exception) {
                return(res);
            }
            res = true;
            return(res);
        }
Example #4
0
        public ApiResult <CheckoutCardOptions> CheckOut(CheckoutCardOptions options)
        {
            try {
                if (options == null)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.BadRequest,
                        ErrorText = $"Null {nameof(options)}"
                    });
                }


                if (string.IsNullOrWhiteSpace(options.CardNumber))
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.BadRequest,
                        ErrorText = $"Null or empty {nameof(options.CardNumber)}"
                    });
                }

                var now = DateTime.Today;

                int ExpirationMonth = int.Parse(options.ExpirationMonth);
                int ExpirationYear  = int.Parse(options.ExpirationYear);

                if (ExpirationMonth == 0 || ExpirationMonth > 12)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.BadRequest,
                        ErrorText = $"invalid expiration data"
                    });
                }

                if (options.Amount <= 0)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.BadRequest,
                        ErrorText = $"Invalid {nameof(options.Amount)}"
                    });
                }

                var r = GetByNumber(options.CardNumber);
                if (r.Code != ApiResultCode.Success)
                {
                    return(new ApiResult <CheckoutCardOptions> {
                        Code = r.Code, ErrorText = r.ErrorText
                    });
                }


                var card = r.Data;

                if (card.Expiration.Year != ExpirationYear || card.Expiration.Month != ExpirationMonth)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Transaction denied"
                    });
                }

                if (card.Expiration.Year < now.Year || (card.Expiration.Year == now.Year && card.Expiration.Month < now.Month))
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Card has expired"
                    });
                }

                if (!card.Active)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Card is inactive"
                    });
                }

                if (card.Accounts.Count == 0)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Card has no connected accounts"
                    });
                }



                //assume first active account
                var account = card.Accounts.AsQueryable().Where(a => a.State == AccountState.Active).SingleOrDefault();

                if (account == null)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"no active accounts"
                    });
                }


                if (account.Balance < options.Amount)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Issuficient amount"
                    });
                }

                account.Balance -= options.Amount;
                _dbContext.SaveChanges();

                return(new ApiResult <CheckoutCardOptions> {
                    Code = ApiResultCode.Success, Data = options
                });
            }
            catch (Exception e) {
                return(new ApiResult <CheckoutCardOptions>()
                {
                    Code = ApiResultCode.InternalServerError,
                    ErrorText = $"General Error {e.Message}" //not for production
                });
            }
        }