diff --git a/src/Altinn.Dan.Plugin.Banking/Altinn.Dan.Plugin.Banking.csproj b/src/Altinn.Dan.Plugin.Banking/Altinn.Dan.Plugin.Banking.csproj index da3bf6d..0fc90ec 100644 --- a/src/Altinn.Dan.Plugin.Banking/Altinn.Dan.Plugin.Banking.csproj +++ b/src/Altinn.Dan.Plugin.Banking/Altinn.Dan.Plugin.Banking.csproj @@ -7,12 +7,12 @@ false - - - - + + + + - + @@ -20,16 +20,16 @@ - - - + + + - - + + - + diff --git a/src/Altinn.Dan.Plugin.Banking/Metadata.cs b/src/Altinn.Dan.Plugin.Banking/Metadata.cs index 778f83d..9b9eb2a 100644 --- a/src/Altinn.Dan.Plugin.Banking/Metadata.cs +++ b/src/Altinn.Dan.Plugin.Banking/Metadata.cs @@ -75,6 +75,180 @@ public List GetEvidenceCodes() } }, new EvidenceCode() + { + EvidenceCodeName = "Kundeforhold", + EvidenceSource = SOURCE, + BelongsToServiceContexts = new List { "OED" }, + RequiredScopes = "bits:kundeforhold", + Values = new List() + { + new EvidenceValue() + { + EvidenceValueName = "default", + ValueType = EvidenceValueType.JsonSchema, + JsonSchemaDefintion = JsonSchema.FromType().ToJson(Formatting.None) + } + }, + Parameters = new List() + { + new EvidenceParameter() + { + EvidenceParamName = "FraDato", + ParamType = EvidenceParamType.DateTime, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "TilDato", + ParamType = EvidenceParamType.DateTime, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "SkipKAR", + ParamType = EvidenceParamType.Boolean, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "ReferanseId", + ParamType = EvidenceParamType.String, + Required = true + } + }, + + AuthorizationRequirements = new List() + { + new MaskinportenScopeRequirement() + { + RequiredScopes = new List {"altinn:dataaltinnno/oed" } + } + } + }, new EvidenceCode() + { + EvidenceCodeName = "Kontodetaljer", + EvidenceSource = SOURCE, + BelongsToServiceContexts = new List { "OED" }, + RequiredScopes = "bits:kundeforhold", + Values = new List() + { + new EvidenceValue() + { + EvidenceValueName = "default", + ValueType = EvidenceValueType.JsonSchema, + JsonSchemaDefintion = JsonSchema.FromType().ToJson(Formatting.None) + } + }, + Parameters = new List() + { + new EvidenceParameter() + { + EvidenceParamName = "FraDato", + ParamType = EvidenceParamType.DateTime, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "TilDato", + ParamType = EvidenceParamType.DateTime, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "SkipKAR", + ParamType = EvidenceParamType.Boolean, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "ReferanseId", + ParamType = EvidenceParamType.String, + Required = true + }, + new EvidenceParameter() + { + EvidenceParamName = "Organisasjonsnummer", + ParamType = EvidenceParamType.String, + Required = true + }, + new EvidenceParameter() + { + EvidenceParamName = "InkluderTransaksjoner", + ParamType = EvidenceParamType.Boolean, + Required = false + } + }, + AuthorizationRequirements = new List() + { + new MaskinportenScopeRequirement() + { + RequiredScopes = new List(){"altinn:dataaltinnno/kontrollinformasjon"} + } + } + }, + new EvidenceCode() + { + EvidenceCodeName = "Kontotransaksjoner", + EvidenceSource = SOURCE, + BelongsToServiceContexts = new List { "OED" }, + RequiredScopes = "bits:kundeforhold", + Values = new List() + { + new EvidenceValue() + { + EvidenceValueName = "default", + ValueType = EvidenceValueType.JsonSchema, + JsonSchemaDefintion = JsonSchema.FromType().ToJson(Formatting.None) + } + }, + Parameters = new List() + { + new EvidenceParameter() + { + EvidenceParamName = "FraDato", + ParamType = EvidenceParamType.DateTime, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "TilDato", + ParamType = EvidenceParamType.DateTime, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "SkipKAR", + ParamType = EvidenceParamType.Boolean, + Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "ReferanseId", + ParamType = EvidenceParamType.String, + Required = true + }, + new EvidenceParameter() + { + EvidenceParamName = "Organisasjonsnummer", + ParamType = EvidenceParamType.String, + Required = true + }, + new EvidenceParameter() + { + EvidenceParamName = "Kontoreferanse", + ParamType = EvidenceParamType.String, + Required = true + } + }, + AuthorizationRequirements = new List() + { + new MaskinportenScopeRequirement() + { + RequiredScopes = new List(){"altinn:dataaltinnno/kontrollinformasjon"} + } + } + }, + new EvidenceCode() { EvidenceCodeName = "Kontrollinformasjon", EvidenceSource = SOURCE, diff --git a/src/Altinn.Dan.Plugin.Banking/Plugin.cs b/src/Altinn.Dan.Plugin.Banking/Plugin.cs index d8a593d..8dcd00d 100644 --- a/src/Altinn.Dan.Plugin.Banking/Plugin.cs +++ b/src/Altinn.Dan.Plugin.Banking/Plugin.cs @@ -73,6 +73,214 @@ public async Task GetBanktransaksjoner( return await EvidenceSourceResponse.CreateResponse(req, () => GetEvidenceValuesBankTransaksjoner(evidenceHarvesterRequest)); } + [Function("Kundeforhold")] + public async Task GetKundeforhold( + [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req, + FunctionContext context) + { + + var evidenceHarvesterRequest = await req.ReadFromJsonAsync(); + + return await EvidenceSourceResponse.CreateResponse(req, () => GetKundeforhold(evidenceHarvesterRequest)); + } + + [Function("Kontotransaksjoner")] + public async Task GetKontotransaksjoner( +[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req, +FunctionContext context) + { + + var evidenceHarvesterRequest = await req.ReadFromJsonAsync(); + + return await EvidenceSourceResponse.CreateResponse(req, () => GetKontotransaksjoner(evidenceHarvesterRequest)); + } + + private async Task> GetKontotransaksjoner(EvidenceHarvesterRequest evidenceHarvesterRequest) + { + var accountInfoRequestId = Guid.NewGuid(); + var correlationId = Guid.NewGuid(); + + var endpoints = await GetEndpoints(); + + var ssn = evidenceHarvesterRequest.SubjectParty?.NorwegianSocialSecurityNumber; + + try + { + // TODO! Add DateTimeOffset overload for TryGetParameter + var fromDate = evidenceHarvesterRequest.TryGetParameter("FraDato", out DateTime paramFromDate) + ? paramFromDate + : DateTime.Now.AddMonths(-3); + + var toDate = evidenceHarvesterRequest.TryGetParameter("TilDato", out DateTime paramToDate) + ? paramToDate + : DateTime.Now; + + bool skipKAR = evidenceHarvesterRequest.TryGetParameter("SkipKAR", out bool paramSkipKAR) ? paramSkipKAR : false; + + //accountinforequestid must be provided in parameter in order to maintain the correct use across requests from different users of digitalt dødsbo + accountInfoRequestId = evidenceHarvesterRequest.TryGetParameter("ReferanseId", out string accountInfoRequestIdFromParam) ? new Guid(accountInfoRequestIdFromParam) : accountInfoRequestId; + + var accountRef = evidenceHarvesterRequest.TryGetParameter("Kontoreferanse", out string accountRefParam) ? accountRefParam : string.Empty; + + var orgno = evidenceHarvesterRequest.TryGetParameter("Organisasjonsnummer", out string orgnoParam) ? orgnoParam : string.Empty; + + + var filteredEndpoints = endpoints.Where(item => _settings.ImplementedBanks.Contains(item.OrgNo) && item.OrgNo == orgno && item.Version.ToUpper() == "V2").ToList(); + + + var ecb = new EvidenceBuilder(new Metadata(), "Kontotransaksjoner"); + + var transactions = await _bankService.GetTransactionsForAccount(ssn, filteredEndpoints, fromDate, toDate, accountInfoRequestId, accountRef); + ecb.AddEvidenceValue("default", JsonConvert.SerializeObject(transactions), "", false); + + return ecb.GetEvidenceValues(); + } + catch (Exception e) + { + if (e is DanException) throw; + + _logger.LogError( + "BanktransaksjonerKonto failed unexpectedly for {Subject}, error {Error} (accountInfoRequestId: {AccountInfoRequestId}, correlationID: {CorrelationId})", + evidenceHarvesterRequest.SubjectParty.GetAsString(), e.Message, accountInfoRequestId, correlationId); + throw new EvidenceSourceTransientException(Banking.Metadata.ERROR_BANK_REQUEST_ERROR, "Could not retrieve bank transactions"); + + } + } + + private async Task> GetKundeforhold(EvidenceHarvesterRequest evidenceHarvesterRequest) + { + var accountInfoRequestId = Guid.NewGuid(); + var correlationId = Guid.NewGuid(); + + var endpoints = await GetEndpoints(); + + var ssn = evidenceHarvesterRequest.SubjectParty?.NorwegianSocialSecurityNumber; + + try + { + // TODO! Add DateTimeOffset overload for TryGetParameter + var fromDate = evidenceHarvesterRequest.TryGetParameter("FraDato", out DateTime paramFromDate) + ? paramFromDate + : DateTime.Now.AddMonths(-3); + + var toDate = evidenceHarvesterRequest.TryGetParameter("TilDato", out DateTime paramToDate) + ? paramToDate + : DateTime.Now; + + bool skipKAR = evidenceHarvesterRequest.TryGetParameter("SkipKAR", out bool paramSkipKAR) ? paramSkipKAR : false; + + //accountinforequestid must be provided in parameter in order to maintain the correct use across requests from different users of digitalt dødsbo + accountInfoRequestId = evidenceHarvesterRequest.TryGetParameter("ReferanseId", out string accountInfoRequestIdFromParam) ? new Guid(accountInfoRequestIdFromParam) : accountInfoRequestId; + + KARResponse karResponse; + try + { + DateTimeOffset fromDateDto = new DateTimeOffset(fromDate); + DateTimeOffset toDateDto = new DateTimeOffset(toDate); + //Skipping KAR lookups can be set both in requests and config, useful for testing in different environments to see if all banks are responding as expected + karResponse = await _karService.GetBanksForCustomer(ssn, fromDateDto, toDateDto, accountInfoRequestId, correlationId, skipKAR || _settings.SkipKAR); + } + catch (ApiException e) + { + throw new EvidenceSourceTransientException(Banking.Metadata.ERROR_KAR_NOT_AVAILABLE_ERROR, $"Request to KAR failed (HTTP status code: {e.StatusCode}, accountInfoRequestId: {accountInfoRequestId}, correlationID: {correlationId})"); + } + catch (TaskCanceledException) + { + throw new EvidenceSourceTransientException(Banking.Metadata.ERROR_KAR_NOT_AVAILABLE_ERROR, $"Request to KAR timed out (accountInfoRequestId: {accountInfoRequestId}, correlationID: {correlationId})"); + } + + var filteredEndpoints = endpoints.Where(p => karResponse.Banks.Select(e => e.OrganizationID).ToHashSet().Contains(p.OrgNo)).Where(item => _settings.ImplementedBanks.Contains(item.OrgNo)).ToList(); + + //We are only legally allowed to use endpoints with version V2 due to the onlyPrimaryOwner flag + filteredEndpoints.RemoveAll(p => p.Version.ToUpper() == "V1"); + filteredEndpoints.ForEach(p => p.Url = null); + + var ecb = new EvidenceBuilder(new Metadata(), "Kundeforhold"); + + ecb.AddEvidenceValue("default", JsonConvert.SerializeObject(filteredEndpoints), "", false); + + return ecb.GetEvidenceValues(); + } + catch (Exception e) + { + if (e is DanException) throw; + + _logger.LogError( + "Kundeforhold failed unexpectedly for {Subject}, error {Error} (accountInfoRequestId: {AccountInfoRequestId}, correlationID: {CorrelationId})", + evidenceHarvesterRequest.SubjectParty.GetAsString(), e.Message, accountInfoRequestId, correlationId); + throw new EvidenceSourceTransientException(Banking.Metadata.ERROR_BANK_REQUEST_ERROR, "Could not retrieve bank transactions"); + + } + } + + + [Function("Kontodetaljer")] + public async Task GetBankRelasjon( + [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req, + FunctionContext context) + { + + var evidenceHarvesterRequest = await req.ReadFromJsonAsync(); + + return await EvidenceSourceResponse.CreateResponse(req, () => GetKontodetaljer(evidenceHarvesterRequest)); + } + + private async Task> GetKontodetaljer(EvidenceHarvesterRequest evidenceHarvesterRequest) + { + var accountInfoRequestId = Guid.NewGuid(); + var correlationId = Guid.NewGuid(); + + var endpoints = await GetEndpoints(); + + var ssn = evidenceHarvesterRequest.SubjectParty?.NorwegianSocialSecurityNumber; + + try + { + // TODO! Add DateTimeOffset overload for TryGetParameter + var fromDate = evidenceHarvesterRequest.TryGetParameter("FraDato", out DateTime paramFromDate) + ? paramFromDate + : DateTime.Now.AddMonths(-3); + + var toDate = evidenceHarvesterRequest.TryGetParameter("TilDato", out DateTime paramToDate) + ? paramToDate + : DateTime.Now; + + bool skipKAR = evidenceHarvesterRequest.TryGetParameter("SkipKAR", out bool paramSkipKAR) ? paramSkipKAR : false; + + var orgno = evidenceHarvesterRequest.TryGetParameter("Organisasjonsnummer", out string paramOrgNo) ? paramOrgNo : null; + + bool includeTransactions = evidenceHarvesterRequest.TryGetParameter("InkluderTransaksjoner", out bool paramIncludeTransactions) ? paramIncludeTransactions : true; + + //accountinforequestid must be provided in parameter in order to maintain the correct use across requests from different users of digitalt dødsbo + accountInfoRequestId = evidenceHarvesterRequest.TryGetParameter("ReferanseId", out string accountInfoRequestIdFromParam) ? new Guid(accountInfoRequestIdFromParam) : accountInfoRequestId; + + + var filteredEndpoints = endpoints.Where(item => _settings.ImplementedBanks.Contains(item.OrgNo) && item.OrgNo == orgno && item.Version.ToUpper() == "V2").ToList(); + + if (string.IsNullOrEmpty(orgno) || filteredEndpoints.Count() != 1) + { + throw new EvidenceSourceTransientException(Banking.Metadata.ERROR_BANK_REQUEST_ERROR, "Invalid organisation number provided"); + } + + var ecb = new EvidenceBuilder(new Metadata(), "Kontodetaljer"); + + BankResponse bankResult = await _bankService.GetTransactions(ssn, filteredEndpoints, fromDate, toDate, accountInfoRequestId, includeTransactions); + ecb.AddEvidenceValue("default", JsonConvert.SerializeObject(bankResult), "", false); + + return ecb.GetEvidenceValues(); + } + catch (Exception e) + { + if (e is DanException) throw; + + _logger.LogError( + "Kontodetaljer failed unexpectedly for {Subject}, error {Error} (accountInfoRequestId: {AccountInfoRequestId}, correlationID: {CorrelationId})", + evidenceHarvesterRequest.SubjectParty.GetAsString(), e.Message, accountInfoRequestId, correlationId); + throw new EvidenceSourceTransientException(Banking.Metadata.ERROR_BANK_REQUEST_ERROR, "Could not retrieve account details"); + + } + } + [Function("Kontrollinformasjon")] public async Task GetKontrollinformasjon( [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req, diff --git a/src/Altinn.Dan.Plugin.Banking/Services/BankService.cs b/src/Altinn.Dan.Plugin.Banking/Services/BankService.cs index b6300cc..e785a13 100644 --- a/src/Altinn.Dan.Plugin.Banking/Services/BankService.cs +++ b/src/Altinn.Dan.Plugin.Banking/Services/BankService.cs @@ -14,7 +14,6 @@ using System.Runtime.Intrinsics.X86; using System.Threading; using System.Threading.Tasks; -using AccountDto = Altinn.Dan.Plugin.Banking.Models.Account; using AccountDtoV2 = Altinn.Dan.Plugin.Banking.Models.AccountV2; using Bank_v2 = Altinn.Dan.Plugin.Banking.Clients.V2; @@ -40,7 +39,7 @@ public BankService(ILoggerFactory loggerFactory, IMaskinportenService maskinport _settings = applicationSettings.Value; } - public async Task GetTransactions(string ssn, List bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId) + public async Task GetTransactions(string ssn, List bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, bool includeTransactions = true) { Configure(bankList); var correlationId = Guid.NewGuid(); @@ -61,7 +60,7 @@ public async Task GetTransactions(string ssn, List _logger.LogInformation($"Preparing request to bank {bank.Name}, url {bank.Url}, version {bank.Version}, accountinforequestid {accountInfoRequestId}, correlationid {correlationId}, fromdate {fromDate}, todate {toDate}") ); - bankInfo = await InvokeBank(ssn, orgnr, fromDate, toDate, accountInfoRequestId, correlationId); + bankInfo = await InvokeBank(ssn, orgnr, fromDate, toDate, accountInfoRequestId, correlationId, includeTransactions); } catch (Exception e) { @@ -102,7 +101,7 @@ public async Task GetTransactions(string ssn, List InvokeBank(string ssn, string orgnr, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId) + private async Task InvokeBank(string ssn, string orgnr, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId, bool includeTransactions = true) { if (!_bankConfigs.ContainsKey(orgnr)) return new BankInfo { Accounts = new List(), IsImplemented = false }; @@ -122,9 +121,9 @@ private async Task InvokeBank(string ssn, string orgnr, DateTimeOffset var accounts = await bankClient.ListAccountsAsync(accountInfoRequestId, correlationId, "OED", ssn, true, null, null, null, fromDate, toDate); _logger.LogInformation("Found {0} accounts for {1} in bank {2} with accountinforequestid{3} and correlationid {4}", accounts.Accounts1.Count, ssn.Substring(0,6), orgnr, accountInfoRequestId, correlationId); - return await GetAccountDetailsV2(bankClient, accounts, accountInfoRequestId, fromDate, toDate); //application/jose + return await GetAccountDetailsV2(bankClient, accounts, accountInfoRequestId, fromDate, toDate, includeTransactions); //application/jose } - private async Task GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank_v2.Accounts accounts, Guid accountInfoRequestId, DateTimeOffset? fromDate, DateTimeOffset? toDate) + private async Task GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank_v2.Accounts accounts, Guid accountInfoRequestId, DateTimeOffset? fromDate, DateTimeOffset? toDate, bool includeTransactions = true) { @@ -134,19 +133,22 @@ private async Task GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank { Guid correlationIdDetails = Guid.NewGuid(); Guid correlationIdTransactions = Guid.NewGuid(); + Task transactionsTask = null; accountDetailsTasks.Add(Task.Run(async () => { - // Start fetching transactions concurrently - var transactionsTimeout = - new CancellationTokenSource(TimeSpan.FromSeconds(TransactionRequestTimeoutSecs)); - - _logger.LogInformation("Getting transactions: bank {0} account {1} dob {2} accountinforequestid {3} correlationid {4}", - account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner?.Identifier?.Value?.Substring(0,6), accountInfoRequestId, correlationIdTransactions); + if (includeTransactions) + { + // Start fetching transactions concurrently + var transactionsTimeout = + new CancellationTokenSource(TimeSpan.FromSeconds(TransactionRequestTimeoutSecs)); - var transactionsTask = bankClient.ListTransactionsAsync(account.AccountReference, accountInfoRequestId, - correlationIdTransactions, "OED", null, null, null, fromDate, toDate, transactionsTimeout.Token); + _logger.LogInformation("Getting transactions: bank {0} account {1} dob {2} accountinforequestid {3} correlationid {4}", + account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner?.Identifier?.Value?.Substring(0, 6), accountInfoRequestId, correlationIdTransactions); + transactionsTask = bankClient.ListTransactionsAsync(account.AccountReference, accountInfoRequestId, + correlationIdTransactions, "OED", null, null, null, fromDate, toDate, transactionsTimeout.Token); + } _logger.LogInformation("Getting account details: bank {0} account {1} dob {2} accountinforequestid {4} correlationid {5}", account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner?.Identifier?.Value?.Substring(0, 6), accountInfoRequestId, correlationIdDetails); @@ -181,13 +183,15 @@ private async Task GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank b.Type == Altinn.Dan.Plugin.Banking.Clients.V2.BalanceType.BookedBalance && b.CreditDebitIndicator == Altinn.Dan.Plugin.Banking.Clients.V2.CreditOrDebit.Debit) ?.Amount ?? 0; - await transactionsTask; - - _logger.LogInformation("Retrieved transactions: bank {0} account {1} dob {2} transaction count {3} accountinforequestid {4} correlationid {5}", - account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner?.Identifier?.Value?.Substring(0, 6), transactionsTask.Result.Transactions1?.Count, accountInfoRequestId, correlationIdTransactions); + if (includeTransactions) + { + await transactionsTask; + _logger.LogInformation("Retrieved transactions: bank {0} account {1} dob {2} transaction count {3} accountinforequestid {4} correlationid {5}", + account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner?.Identifier?.Value?.Substring(0, 6), transactionsTask.Result.Transactions1?.Count, accountInfoRequestId, correlationIdTransactions); + } - return MapToInternalV2(account.Type, details.Account, transactionsTask.Result.Transactions1, availableCredit - availableDebit, bookedCredit - bookedDebit); + return MapToInternalV2(account.Type, details.Account, transactionsTask?.Result?.Transactions1, availableCredit - availableDebit, bookedCredit - bookedDebit); })); } @@ -308,6 +312,40 @@ private void Configure(List banks) } } } + + public async Task GetTransactionsForAccount(string ssn, List endpoints, DateTime fromDate, DateTime toDate, Guid accountInfoRequestId, string accountReference) + { + Configure(endpoints); + + var correlationId = Guid.NewGuid(); + var transactionsTimeout = + new CancellationTokenSource(TimeSpan.FromSeconds(TransactionRequestTimeoutSecs)); + var endpoint = endpoints.First(); + + _logger.LogInformation("Getting transactions: bank {0} accountrefence {1} dob {2} accountinforequestid {3} correlationid {4}", + endpoint.Name, accountReference, ssn.Substring(0, 6), accountInfoRequestId, correlationId); + + if (!_bankConfigs.ContainsKey(endpoint.OrgNo)) + return new Transactions(); + + BankConfig bankConfig = _bankConfigs[endpoint.OrgNo]; + var token = await _maskinportenService.GetToken(_settings.Jwk, bankConfig.MaskinportenEnv, _settings.ClientId, _settings.BankScope, bankConfig.BankAudience); + + bankConfig.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken); + + var bankClient = new Bank_v2.Bank_v2(bankConfig.Client, _settings) + { + BaseUrl = bankConfig.Client.BaseAddress?.ToString(), + DecryptionCertificate = _settings.OedDecryptCert + }; + + var transactions = await bankClient.ListTransactionsAsync(accountReference, accountInfoRequestId, correlationId, "OED", null, null, null, fromDate, toDate, transactionsTimeout.Token); + + _logger.LogInformation("Retrieved transactions: bank {0} accountrefence {1} dob {2} accountinforequestid {3} correlationid {4}", + endpoint.Name, accountReference, ssn.Substring(0, 6), accountInfoRequestId, correlationId); + + return transactions; + } } internal class BankConfig diff --git a/src/Altinn.Dan.Plugin.Banking/Services/Interfaces/IBankService.cs b/src/Altinn.Dan.Plugin.Banking/Services/Interfaces/IBankService.cs index 9bf23b9..5e7a644 100644 --- a/src/Altinn.Dan.Plugin.Banking/Services/Interfaces/IBankService.cs +++ b/src/Altinn.Dan.Plugin.Banking/Services/Interfaces/IBankService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Altinn.Dan.Plugin.Banking.Clients.V2; using Altinn.Dan.Plugin.Banking.Config; using Altinn.Dan.Plugin.Banking.Models; using Microsoft.Extensions.Logging; @@ -9,5 +10,6 @@ namespace Altinn.Dan.Plugin.Banking.Services.Interfaces; public interface IBankService { - Task GetTransactions(string ssn, List bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId); + Task GetTransactions(string ssn, List bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, bool includeTransactions = true); + Task GetTransactionsForAccount(string ssn, List filteredEndpoints, DateTime fromDate, DateTime toDate, Guid accountInfoRequestId, string accountReference); }