using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using LCU.Library.Internal.ApiSecurity.Enums; using LCU.Library.Internal.ApiSecurity.Models; using LCU.Library.Internal.CoreApiWrapperLib.Configuration; using LCU.Library.Internal.CoreApiWrapperLib.CoreApiUtilities; using LCU.Library.Internal.CoreApiWrapperLib.CoreDbUtilities; using LCU.Library.Internal.CoreApiWrapperLib.Exceptions; using LCU.Library.Internal.CoreApiWrapperLib.Utilities; using LCU.Library.Internal.CoreApiWrapperModel.Constants; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.Accounts; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.Collaterals; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.CoreRequests; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.CoreResponses; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.CoreSoapRequests; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.CoreSoapResponses; using LCU.Library.Internal.LcuHttpClient.HttpRequest; using AccountMaintenanceRequest = LCU.Library.Internal.CoreApiWrapperModel.CoreModels.CoreRequests.AccountMaintenanceRequest; namespace LCU.Library.Internal.CoreApiWrapperLib.DataAccess { public class AccountDao : BaseCoreDao, IAccountDao { private readonly ICoreDbExecution _coreDbExecution; private readonly CoreConfiguration _coreConfiguration; private readonly CoreApiConfiguration _coreApiConfiguration; private readonly CoreSoapApiConfiguration _coreSoapApiConfiguration; private readonly ApiSecurityConfiguration _apiSecurityConfiguration; private readonly IPostRequest _postRequest; private readonly IPutRequest _putRequest; private const string SoapClientKeyValue = "CoreSoapApiWrapper"; private const string GetAccountAdminBranchUpdateQuery = "AccountBranch/GetAccountAdminBranchUpdateQuery"; private const string GetVipSavingsToFundQuery = "Account/GetVipSavingsToFundQuery"; private const string GetAccountOwnersByAccountNumber = "Account/GetAccountOwnersByAccountNumber"; private const string GetAccountOwnersByOrganizationName = "Account/GetAccountOwnersByOrganizationName"; private const string GetAccountOwnersByPersonName = "Account/GetAccountOwnersByPersonName"; private const string GetAccountsToUpdateGroupAnalysisQuery = "Account/GetAccountsToUpdateGroupAnalysis"; private const string GetAccountsByMajorMinorBranchAndStatusQuery = "Account/GetAccountsByMajorMinorBranchCodeAndStatus"; private const string GetAccountsByRecentTransactionsQuery = "Account/GetAccountsByRecentTransactions"; private const string DnaTimeFormat = "yyyy-MM-dd HH:mm:ss"; public AccountDao(ICoreRequest coreRequest, CoreConfiguration coreConfiguration, ApiSecurityConfiguration apiSecurityConfiguration, ICoreDbExecution coreDbExecution, IPostRequest postRequest, IPutRequest putRequest) : base(coreRequest) { _coreConfiguration = coreConfiguration; _apiSecurityConfiguration = apiSecurityConfiguration; _coreApiConfiguration = _coreConfiguration.CoreApiConfiguration; _coreSoapApiConfiguration = _coreConfiguration.CoreSoapApiConfiguration; _coreDbExecution = coreDbExecution; _postRequest = postRequest; _putRequest = putRequest; } /// /// Calls Core API to search based the memberagreenbr in the MemberAgreeNbrRequest model. /// Default Included: Graph /// /// /// /// IEnumerable public async Task> FindByMemberAgreeNbr(CoreRequestParameters coreRequestParameters, MemberAgreeNbrRequest request) { var endpointParameters = HttpUtilities.BuildDictionaryOfNonNullValues(coreRequestParameters); var jsonBody = HttpUtilities.BuildJsonOfNonNullProperties(request); var result = await _coreRequest.PostRequestObject>>( _coreApiConfiguration.CoreEndPointConfiguration.AccountsQueryMemberAgreement, endpointParameters, jsonBody); return result?.MessageBody; } /// /// Calls Core API to search based the AcctNbr in the AcctNbrRequest model. /// Default Included: Standard, Graph /// /// /// /// Account public async Task FindByAcctNbr(CoreRequestParameters coreRequestParameters, AcctNbrRequest request) { var endpointParameters = HttpUtilities.BuildDictionaryOfNonNullValues(coreRequestParameters); var jsonBody = HttpUtilities.BuildJsonOfNonNullProperties(request); var result = await _coreRequest.PostRequestObject>( _coreApiConfiguration.CoreEndPointConfiguration.AccountsQueryAccountDetail, endpointParameters, jsonBody); return result?.MessageBody; } /// /// Calls Core API to search based the filled out AccountId. /// Default Included: Graph /// /// /// /// IEnumerable public async Task> FindCollateralById(CoreRequestParameters coreRequestParameters, string accountId) { var endpointParameters = HttpUtilities.BuildDictionaryOfNonNullValues(coreRequestParameters); var endpoint = HttpUtilities.ReplaceRootParameter(_coreApiConfiguration.CoreEndPointConfiguration.AccountsCollateral, RequestRootParameters.AccountId, accountId); var result = await _coreRequest.GetRequestObject>>(endpoint, endpointParameters); return result?.MessageBody; } /// /// Calls Core Soap API and provides an AccountMaintenanceRequest to update an account. /// /// public async Task PutAccountMaintenanceRequest(IEnumerable accountMaintenanceRequests) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PutAccountMaintenanceRequest); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); var accounts = accountMaintenanceRequests.Select(account => new MaintenanceAccount { AccountNumber = account.AccountNumber, DeliveryMethodCode = account.DeliveryMethod, IsAccountMaintenance = true }).ToArray(); var accountMaintenanceSoapRequest = new CoreApiWrapperModel.CoreModels.CoreSoapRequests.AccountMaintenanceRequest { Accounts = accounts }; var response = await _putRequest.Async (endpoint, accountMaintenanceSoapRequest, headers, 0); if (!response.IsSuccessStatusCode) { throw new AccountMaintenanceRequestException($"Request to update accounts with AccountMaintenanceRequest: {accountMaintenanceSoapRequest} failed with the following bad status code: {response.StatusCode}"); } } public async Task> FindAdminBranchCodeChangeAccountNumbers() { var query = QueryUtilities.GetQuery(GetAccountAdminBranchUpdateQuery); return await _coreDbExecution.ExecuteQuery(query); } public async Task> FindVipSavingsToFund() { var query = QueryUtilities.GetQuery(GetVipSavingsToFundQuery); return await _coreDbExecution.ExecuteQuery(query); } public async Task> FindAccountsToUpdateAccountAnalysis() { var query = QueryUtilities.GetQuery(GetAccountsToUpdateGroupAnalysisQuery); return await _coreDbExecution.ExecuteQuery(query); } public async Task UpdateAccountAnalysis(AccountAnalysisGroupMaintenanceRequest accountAnalysisGroupMaintenanceRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PutAccountAnalysisGroupMaintenanceRequest); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _putRequest.Async(endpoint, accountAnalysisGroupMaintenanceRequest, headers, 0); } public async Task UpdateAccountBranch(AccountBranchUpdateRequest accountBranchUpdateRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PutAccountBranchUpdateRequest); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _putRequest.Async(endpoint, accountBranchUpdateRequest, headers, 0); } public async Task UpdateAccountLoanToValue(AccountLtvUpdateRequest accountLtvUpdateRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PutAccountLtvUpdateRequest); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _putRequest.Async(endpoint, accountLtvUpdateRequest, headers, 0); } public async Task UpdateAccountNickName(AccountNickNameUpdateRequest accountNickNameUpdateRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PutAccountNickNameUpdateRequest); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _putRequest.Async(endpoint, accountNickNameUpdateRequest, headers, 0); } public async Task UpdateAccountContractDate(AccountContractDateUpdateRequest accountContractDateUpdateRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PutAccountContractDateUpdateRequest); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _putRequest.Async(endpoint, accountContractDateUpdateRequest, headers, 0); } public async Task> GetActivityAccountDetailsByAccountNumbers(List accountNumbers) { var query = QueryUtilities.GetQuery("ActivityAccountDetailsByAccountNbr"); var accountActivityParams = new { accountNumbers = accountNumbers.ToArray() }; var results = await _coreDbExecution.ExecuteQuery(query, accountActivityParams); return results.ToList(); } public async Task> FindOwnersByAccountNumber(long accountNumber, DateTime creationDate) { var query = QueryUtilities.GetQuery(GetAccountOwnersByAccountNumber); var accountNumberParams = new { accountNumber = accountNumber.ToString(), createdDate = creationDate.Date.ToString(DnaTimeFormat) }; return await _coreDbExecution.ExecuteQuery(query, accountNumberParams); } public async Task> FindPrimaryOwnersByOrganizationName(string organizationName) { var query = QueryUtilities.GetQuery(GetAccountOwnersByOrganizationName); var organizationNameParams = new { organizationName = organizationName }; return await _coreDbExecution.ExecuteQuery(query, organizationNameParams); } public async Task> FindPrimaryOwnersByPersonName(string personName) { var query = QueryUtilities.GetQuery(GetAccountOwnersByPersonName); var personNameParams = new { personName = personName }; return await _coreDbExecution.ExecuteQuery(query, personNameParams); } /// /// Calls Core Soap API post to create a new person account. /// /// public async Task AddPersonAccount(CreatePersonAccountRequest createPersonAccountRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PostPersonAccount); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _postRequest.Async(endpoint, createPersonAccountRequest, headers, 0); } /// /// Calls Core Soap API post to create a new organization account. /// /// public async Task AddOrganizationAccount(CreateOrganizationAccountRequest createOrganizationAccountRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PostOrganizationAccount); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _postRequest.Async(endpoint, createOrganizationAccountRequest, headers, 0); } /// /// Calls Core Soap API and provides an OrganizationMaintenanceRequest to update an account. /// /// public async Task PutOrganizationMaintenanceRequest(OrganizationMaintenanceRequest organizationMaintenanceRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PutOrganizationMaintenanceRequest); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _putRequest.Async(endpoint, organizationMaintenanceRequest, headers, 0); } /// /// Calls Core Soap API and provides an AccountCreditReportTypeUpdateRequest to update an account. /// /// public async Task UpdateAccountCreditReportType(AccountCreditReportTypeUpdateRequest accountCreditReportTypeUpdateRequest) { var endpoint = HttpUtilities.BuildHttpsUri(_coreSoapApiConfiguration.CoreSoapApiWrapperHost, _coreSoapApiConfiguration.CoreSoapEndpointConfiguration.PutAccountCreditReportTypeUpdateRequest); var headers = LcuHttpClient.Utilities.HttpUtilities.GetApiKeyHeaders(SoapClientKeyValue, _apiSecurityConfiguration.ExtractApiKey(SoapClientKeyValue, ApiKeySetName.InternalKeySet)); return await _putRequest.Async(endpoint, accountCreditReportTypeUpdateRequest, headers, 0); } public async Task> GetAccountsByMajorMinorBranchAndStatus(AccountsByMajorMinorBranchAndStatusRequest request) { var query = QueryUtilities.GetQuery(GetAccountsByMajorMinorBranchAndStatusQuery); var queryParams = new { majorAccountTypes = request.MajorTypes.ToArray(), minorAccountTypes = request.MinorTypes.ToArray(), accountStatusCodes = request.AccountStatuses.ToArray(), branchOrgCodes = request.BranchCodes.ToArray() }; return await _coreDbExecution.ExecuteQuery(query, queryParams); } public async Task> GetAccountsByRecentTransactions(AccountsByRecentTransactionsRequest request) { var query = QueryUtilities.GetQuery(GetAccountsByRecentTransactionsQuery); var queryParams = new { startDate = request.StartDate, endDate = request.EndDate }; return await _coreDbExecution.ExecuteQuery(query, queryParams); } } }