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