public async Task Execute(IAccountRepository accountRepository) { var checksum = NumberAccountHelper.GetChecksum(_transferModel.AccountFrom); var number = NumberAccountHelper.GetNumberAccount(_transferModel.AccountFrom); var accountFrom = await accountRepository.GetAccountByNumberAndCheckSumAsync(checksum, number); accountFrom.Balance -= _transferModel.GetAmount; /* * przed wysłaniem transferu do innego banku zapisanie stanu konta * (operaja może się nie udać, wówczas transfer do innego banku nie zostanie zrealizowany) * w przypadku wystąpienia problemów w innym banku operacja zostanie wycofana przez transakcję */ await Save(accountRepository, accountFrom); if (NumberAccountHelper.IsAccountInMyBank(_transferModel.AccountTo)) { var transferReceiver = new TransferReceiveOperationCommand(_transferModel); await transferReceiver.Execute(accountRepository); } else { await SendTransferToAnotherBank(); } }
public async Task Execute(IAccountRepository accountRepository) { var checksum = NumberAccountHelper.GetChecksum(_transferModel.AccountTo); var number = NumberAccountHelper.GetNumberAccount(_transferModel.AccountTo); var accountTo = await accountRepository.GetAccountByNumberAndCheckSumAsync(checksum, number); accountTo.Balance += _transferModel.GetAmount; await Save(accountRepository, accountTo); }
public async Task Execute(IAccountRepository accountRepository) { var checksum = NumberAccountHelper.GetChecksum(_accountTo); var number = NumberAccountHelper.GetNumberAccount(_accountTo); var account = await accountRepository.GetAccountByNumberAndCheckSumAsync(checksum, number); var value = (decimal)_amount / 100; account.Balance += value; await Save(accountRepository, account); }
private async Task Save(IAccountRepository accountRepository, RepozytoriumDB.DTO.Account account) { var operation = new TransferReceiveOperation(); operation.Title = _transferModel.Title; operation.Amount = _transferModel.GetAmount; operation.Balance = account.Balance; operation.Account = account; operation.Source = NumberAccountHelper.ClearNumber(_transferModel.AccountFrom); operation.Date = DateTime.Now; accountRepository.OperationRepository.Add(operation); await accountRepository.SaveAsync(); }
public async Task <string> AddAccount(int clientId) { var account = new RepozytoriumDB.DTO.Account(); var idNextAccount = await GetNextIdAccount(); account.Number = idNextAccount; account.Checksum = NumberAccountHelper.CalculateChecksum(idNextAccount); account.Client = await _accountRepository.ClientRepository.GetByIdAsync(clientId); _accountRepository.Add(account); await _accountRepository.SaveAsync(); return(NumberAccountHelper.GetFullNumberAccount(account.Checksum, account.Number)); }
/// <summary> /// Wysyłanie transferu do innego banku /// </summary> /// <returns></returns> private async Task SendTransferToAnotherBank() { var idBank = NumberAccountHelper.ExtractIdBank(_transferModel.AccountTo); var ip = BankIdMappingHelper.GetIP(idBank); var url = $"http://{ip}/transfer"; var username = ConfigurationManager.AppSettings["User"]; var password = ConfigurationManager.AppSettings["Password"]; using (var client = new HttpClient()) { var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"))); client.DefaultRequestHeaders.Authorization = authValue; var content = new StringContent(JsonConvert.SerializeObject(_transferModel), Encoding.UTF8, "application/json"); var response = await client.PostAsync(url, content); if (response.StatusCode == HttpStatusCode.BadRequest || response.StatusCode == HttpStatusCode.NotFound) { var valueResponse = await response.Content.ReadAsStringAsync(); var errorDetailWeb = JsonConvert.DeserializeObject <ErrorDetailWeb>(valueResponse); throw new FaultException($"The bank receiver responded : {errorDetailWeb.Error}"); } if (response.StatusCode == HttpStatusCode.Unauthorized) { var valueResponse = await response.Content.ReadAsStringAsync(); var errorDetailWeb = JsonConvert.DeserializeObject <ErrorDetailWeb>(valueResponse); throw new Exception($"Error authorization in receiver bank. details: {errorDetailWeb.Error}"); } if (response.StatusCode != HttpStatusCode.Created) { var valueResponse = await response.Content.ReadAsStringAsync(); var errorDetailWeb = JsonConvert.DeserializeObject <ErrorDetailWeb>(valueResponse); throw new Exception( $"Error in receiver bank. details: {errorDetailWeb.Error} code: {response.StatusCode}"); } } }
public async Task <IEnumerable <AccountModel> > GetAccounts(string token) { var accountsDb = await _accountRepository.GetAccountsByTokenAsync(token); var accounts = new List <AccountModel>(); foreach (var account in accountsDb) { var accountModel = new AccountModel(); accountModel.Number = NumberAccountHelper.GetFullNumberAccount(account.Checksum, account.Number); accountModel.Balance = (double)account.Balance; accounts.Add(accountModel); } if (accounts == null || !accounts.Any()) { throw new FaultException("User hasn't any accounts."); } return(accounts); }
public async Task <HistoryOfAccountModel> GetHistoryOfAccount(string token, string account, int currentPage, int sizePage) { var checksum = NumberAccountHelper.GetChecksum(account); var number = NumberAccountHelper.GetNumberAccount(account); var operationsDb = await _accountRepository.OperationRepository.GetOperationsOfAccountAsync(checksum, number, currentPage, sizePage); var enumerable = operationsDb as IList <BaseOperation> ?? operationsDb.ToList(); if (operationsDb == null || !enumerable.Any()) { throw new FaultException("Account hasn't any operations."); } var operations = new List <OperationModel>(); foreach (var operation in enumerable) { var operationModel = new OperationModel(); operationModel.Balance = (double)operation.Balance; operationModel.Amount = (double)operation.Amount; operationModel.Date = operation.Date; if (operation is TransferReceiveOperation) { operationModel.Name = (operation as TransferReceiveOperation).Title; operationModel.Details = $"Source account: {NumberAccountHelper.FormatNumber((operation as TransferReceiveOperation).Source)}"; } if (operation is TransferSendOperation) { operationModel.Name = (operation as TransferSendOperation).Title; operationModel.Details = $"Destination account: {NumberAccountHelper.FormatNumber((operation as TransferSendOperation).Destination)}"; } if (operation is PayOutOperation) { operationModel.Details = (operation as PayOutOperation).Name; } if (operation is PayInOperation) { operationModel.Details = (operation as PayInOperation).Name; } if (operation is BankChargeOperation) { operationModel.Details = (operation as BankChargeOperation).Name; } operations.Add(operationModel); } var result = new HistoryOfAccountModel(); result.Operations = operations; result.CurrentPage = currentPage; result.CountOfAllPages = await _accountRepository.OperationRepository.GetCountOfAllPagesAsync(checksum, number, sizePage); return(result); }