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