Implemented serializer for BankData
This commit is contained in:
parent
7cdb7247c8
commit
3d6c68e743
|
@ -1,5 +1,6 @@
|
||||||
package net.codinux.banking.fints.model
|
package net.codinux.banking.fints.model
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Laenderkennzeichen
|
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Laenderkennzeichen
|
||||||
import net.codinux.banking.fints.messages.datenelemente.implementierte.*
|
import net.codinux.banking.fints.messages.datenelemente.implementierte.*
|
||||||
import net.codinux.banking.fints.messages.datenelemente.implementierte.signatur.Sicherheitsfunktion
|
import net.codinux.banking.fints.messages.datenelemente.implementierte.signatur.Sicherheitsfunktion
|
||||||
|
@ -7,8 +8,9 @@ import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanMe
|
||||||
import net.codinux.banking.fints.messages.segmente.id.ISegmentId
|
import net.codinux.banking.fints.messages.segmente.id.ISegmentId
|
||||||
import net.codinux.banking.fints.response.segments.ChangeTanMediaParameters
|
import net.codinux.banking.fints.response.segments.ChangeTanMediaParameters
|
||||||
import net.codinux.banking.fints.response.segments.JobParameters
|
import net.codinux.banking.fints.response.segments.JobParameters
|
||||||
|
import net.codinux.banking.fints.serialization.BankDataSerializer
|
||||||
|
|
||||||
|
@Serializable(with = BankDataSerializer::class)
|
||||||
open class BankData(
|
open class BankData(
|
||||||
open var bankCode: String,
|
open var bankCode: String,
|
||||||
open var customerId: String,
|
open var customerId: String,
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package net.codinux.banking.fints.serialization
|
||||||
|
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||||
|
import kotlinx.serialization.encoding.Decoder
|
||||||
|
import kotlinx.serialization.encoding.Encoder
|
||||||
|
import net.codinux.banking.fints.model.BankData
|
||||||
|
|
||||||
|
object BankDataSerializer : KSerializer<BankData> {
|
||||||
|
|
||||||
|
private val serializer = SerializedFinTsData.serializer()
|
||||||
|
|
||||||
|
private val mapper = SerializedFinTsDataMapper()
|
||||||
|
|
||||||
|
|
||||||
|
override val descriptor: SerialDescriptor = serializer.descriptor
|
||||||
|
|
||||||
|
override fun serialize(encoder: Encoder, value: BankData) {
|
||||||
|
val surrogate = mapper.map(value)
|
||||||
|
|
||||||
|
encoder.encodeSerializableValue(serializer, surrogate)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder): BankData {
|
||||||
|
val surrogate = decoder.decodeSerializableValue(serializer)
|
||||||
|
|
||||||
|
return mapper.map(surrogate)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package net.codinux.banking.fints.serialization
|
||||||
|
|
||||||
|
import kotlinx.serialization.encodeToString
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
import net.codinux.banking.fints.model.BankData
|
||||||
|
import net.codinux.banking.fints.test.TestDataGenerator
|
||||||
|
import net.codinux.banking.fints.test.assertContains
|
||||||
|
import net.codinux.banking.fints.test.assertSize
|
||||||
|
import net.codinux.banking.fints.test.assertTrue
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertNotNull
|
||||||
|
|
||||||
|
class BankDataSerializerTest {
|
||||||
|
|
||||||
|
private val serializedBankData = TestDataGenerator.serializedBankData
|
||||||
|
|
||||||
|
private val json = Json {
|
||||||
|
prettyPrint = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun serializeToJson() {
|
||||||
|
val bank = TestDataGenerator.generateBankDataForSerialization()
|
||||||
|
|
||||||
|
val result = json.encodeToString(bank)
|
||||||
|
|
||||||
|
assertEquals(serializedBankData, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun deserializeFromJson() {
|
||||||
|
val result = json.decodeFromString<BankData>(serializedBankData)
|
||||||
|
|
||||||
|
assertNotNull(result)
|
||||||
|
|
||||||
|
assertSize(8, result.tanMethodsSupportedByBank)
|
||||||
|
assertSize(4, result.tanMethodsAvailableForUser)
|
||||||
|
assertContains(result.tanMethodsSupportedByBank, result.tanMethodsAvailableForUser) // check that it contains exactly the same object instances
|
||||||
|
assertNotNull(result.selectedTanMethod)
|
||||||
|
assertContains(result.tanMethodsSupportedByBank, result.selectedTanMethod) // check that it contains exactly the same object instance
|
||||||
|
|
||||||
|
assertSize(3, result.tanMedia)
|
||||||
|
assertNotNull(result.selectedTanMedium)
|
||||||
|
assertContains(result.tanMedia, result.selectedTanMedium) // check that it contains exactly the same object instance
|
||||||
|
|
||||||
|
assertSize(14, result.supportedJobs)
|
||||||
|
assertSize(33, result.jobsRequiringTan)
|
||||||
|
|
||||||
|
result.accounts.forEach { account ->
|
||||||
|
assertTrue(account.allowedJobs.isNotEmpty())
|
||||||
|
assertContains(result.supportedJobs, account.allowedJobs) // check that it contains exactly the same object instances
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(serializedBankData, json.encodeToString(result))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,20 +1,6 @@
|
||||||
package net.codinux.banking.fints.serialization
|
package net.codinux.banking.fints.serialization
|
||||||
|
|
||||||
import net.codinux.banking.fints.messages.MessageBuilder
|
import net.codinux.banking.fints.test.TestDataGenerator
|
||||||
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Laenderkennzeichen
|
|
||||||
import net.codinux.banking.fints.messages.datenelemente.implementierte.Dialogsprache
|
|
||||||
import net.codinux.banking.fints.messages.datenelemente.implementierte.HbciVersion
|
|
||||||
import net.codinux.banking.fints.messages.datenelemente.implementierte.KundensystemStatusWerte
|
|
||||||
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanMediumStatus
|
|
||||||
import net.codinux.banking.fints.model.AccountData
|
|
||||||
import net.codinux.banking.fints.model.AccountFeature
|
|
||||||
import net.codinux.banking.fints.model.BankData
|
|
||||||
import net.codinux.banking.fints.model.mapper.ModelMapper
|
|
||||||
import net.codinux.banking.fints.response.InstituteSegmentId
|
|
||||||
import net.codinux.banking.fints.response.ResponseParser
|
|
||||||
import net.codinux.banking.fints.response.segments.AccountType
|
|
||||||
import net.codinux.banking.fints.response.segments.TanInfo
|
|
||||||
import net.codinux.banking.fints.response.segments.TanMediaList
|
|
||||||
import net.codinux.banking.fints.test.assertContains
|
import net.codinux.banking.fints.test.assertContains
|
||||||
import net.codinux.banking.fints.test.assertSize
|
import net.codinux.banking.fints.test.assertSize
|
||||||
import net.codinux.banking.fints.test.assertTrue
|
import net.codinux.banking.fints.test.assertTrue
|
||||||
|
@ -24,36 +10,23 @@ import kotlin.test.assertNotNull
|
||||||
|
|
||||||
class FinTsModelSerializerTest {
|
class FinTsModelSerializerTest {
|
||||||
|
|
||||||
companion object {
|
private val serializedBankData = TestDataGenerator.serializedBankData
|
||||||
private val bankCode = "10010010"
|
|
||||||
private val bic = "ABCDDEBBXXX"
|
|
||||||
private val bankName = "Abzockbank"
|
|
||||||
private val serverAddress = "https://abzockbank.de/fints"
|
|
||||||
private val bpd = 17
|
|
||||||
|
|
||||||
private val customerId = "SuperUser"
|
|
||||||
private val password = "Liebe"
|
|
||||||
private val customerName = "Monika Superfrau"
|
|
||||||
private val upd = 27
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private val underTest = FinTsModelSerializer()
|
private val underTest = FinTsModelSerializer()
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun serializeToJson() {
|
fun serializeToJson() {
|
||||||
val bank = createTestData()
|
val bank = TestDataGenerator.generateBankDataForSerialization()
|
||||||
|
|
||||||
val result = underTest.serializeToJson(bank, true)
|
val result = underTest.serializeToJson(bank, true)
|
||||||
|
|
||||||
assertEquals(serializedFinTsData, result)
|
assertEquals(serializedBankData, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun deserializeFromJson() {
|
fun deserializeFromJson() {
|
||||||
val result = underTest.deserializeFromJson(serializedFinTsData)
|
val result = underTest.deserializeFromJson(serializedBankData)
|
||||||
|
|
||||||
assertNotNull(result)
|
assertNotNull(result)
|
||||||
|
|
||||||
|
@ -75,512 +48,7 @@ class FinTsModelSerializerTest {
|
||||||
assertContains(result.supportedJobs, account.allowedJobs) // check that it contains exactly the same object instances
|
assertContains(result.supportedJobs, account.allowedJobs) // check that it contains exactly the same object instances
|
||||||
}
|
}
|
||||||
|
|
||||||
assertEquals(serializedFinTsData, underTest.serializeToJson(result, true))
|
assertEquals(serializedBankData, underTest.serializeToJson(result, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun createTestData(): BankData {
|
|
||||||
val parser = ResponseParser()
|
|
||||||
val mapper = ModelMapper(MessageBuilder())
|
|
||||||
|
|
||||||
val bankResponse = parser.parse("""
|
|
||||||
HIRMS:5:2:4+3050::BPD nicht mehr aktuell, aktuelle Version enthalten.+3920::Zugelassene Zwei-Schritt-Verfahren für den Benutzer.:910:911:912:913+0020::Der Auftrag wurde ausgeführt.'
|
|
||||||
HISALS:145:5:4+1+1'
|
|
||||||
HISALS:12:8:4+1+1+0+J'
|
|
||||||
HIKAZS:123:5:4+1+1+360:J:N'
|
|
||||||
HICCSS:96:1:4+1+1+0'
|
|
||||||
HIIPZS:22:1:4+1+1+0+;:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.09'
|
|
||||||
DIKKUS:67:2:4+1+1+0+90:N:J'
|
|
||||||
HITABS:153:4:4+1+1+0'
|
|
||||||
HITAUS:154:1:4+1+1+0+N:N:J'
|
|
||||||
HITANS:169:6:4+1+1+1+J:N:0:910:2:HHD1.3.0:::chipTAN manuell:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:911:2:HHD1.3.2OPT:HHDOPT1:1.3.2:chipTAN optisch:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:912:2:HHD1.3.2USB:HHDUSB1:1.3.2:chipTAN-USB:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:913:2:Q1S:Secoder_UC:1.2.0:chipTAN-QR:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:920:2:smsTAN:::smsTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:5:921:2:pushTAN:::pushTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:2:900:2:iTAN:::iTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:0'
|
|
||||||
HITANS:170:7:4+1+1+1+N:N:0:922:2:pushTAN-dec:Decoupled::pushTAN 2.0:::Aufforderung:2048:J:2:N:0:0:N:N:00:2:N:2:180:1:1:J:J:923:2:pushTAN-cas:Decoupled::pushTAN 2.0:::Aufforderung:2048:J:2:N:0:0:N:N:00:2:N:5:180:1:1:J:J'
|
|
||||||
HITAB:5:4:3+1+G:2:1234567890::::::::::SparkassenCard (Debitkarte)::::::::+G:1:1234567891::::::::::SparkassenCard (Debitkarte)::::::::'
|
|
||||||
HITAB:5:4:3+0+A:1:::::::::::Alle Geräte::::::::'
|
|
||||||
HIPINS:78:1:3+1+1+0+5:20:6:VR-NetKey oder Alias::HKTAN:N:HKKAZ:J:HKSAL:N:HKEKA:N:HKPAE:J:HKPSP:N:HKQTG:N:HKCSA:J:HKCSB:N:HKCSL:J:HKCCS:J:HKSPA:N:HKDSE:J:HKBSE:J:HKBME:J:HKCDL:J:HKPPD:J:HKCDN:J:HKDSB:N:HKCUB:N:HKDSW:J:HKAUB:J:HKBBS:N:HKDMB:N:HKDBS:N:HKBMB:N:HKECA:N:HKCMB:N:HKCME:J:HKCML:J:HKWDU:N:HKWPD:N:HKDME:J:HKCCM:J:HKCDB:N:HKCDE:J:HKCSE:J:HKCUM:J:HKKAU:N:HKKIF:N:HKBAZ:N:HKZDF:J:HKCAZ:J:HKDDB:N:HKDDE:J:HKDDL:J:HKDDN:J:HKKAA:N:HKPOF:N:HKIPS:N:HKIPZ:J:HKBML:J:HKBSA:J:HKBSL:J:HKDML:J:HKDSA:J:HKDSL:J:HKZDA:J:HKZDL:N:GKVPU:N:GKVPD:N'
|
|
||||||
HISPAS:42:1:4+20+1+0+N:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02'
|
|
||||||
HISPAS:43:2:4+20+1+0+N:N:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02'
|
|
||||||
HISPAS:44:3:4+20+1+0+N:N:N:N:0:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02'
|
|
||||||
""".trimIndent().replace("\n", "").replace("\r", ""))
|
|
||||||
|
|
||||||
val tanMethods = bankResponse.getSegmentsById<TanInfo>(InstituteSegmentId.TanInfo).flatMap { mapper.mapToTanMethods(it) }
|
|
||||||
val tanMedia = bankResponse.getSegmentsById<TanMediaList>(InstituteSegmentId.TanMediaList).flatMap { it.tanMedia }
|
|
||||||
|
|
||||||
return BankData(
|
|
||||||
bankCode, customerId, password, serverAddress, bic, bankName, Laenderkennzeichen.Germany, bpd,
|
|
||||||
customerId, customerName, upd,
|
|
||||||
|
|
||||||
tanMethods, tanMethods.filter { it.securityFunction.code.startsWith("91") }, tanMethods.first { it.securityFunction.code == "912" },
|
|
||||||
tanMedia, tanMedia.first { it.status == TanMediumStatus.Aktiv },
|
|
||||||
|
|
||||||
listOf(Dialogsprache.German, Dialogsprache.English), Dialogsprache.German, "47", KundensystemStatusWerte.Benoetigt,
|
|
||||||
1, listOf(HbciVersion.FinTs_3_0_0)
|
|
||||||
).apply {
|
|
||||||
this.addAccount(createCheckingAccount(this, listOf("HKSAL", "HKKAZ", "HKCCS", "HKIPZ")))
|
|
||||||
this.addAccount(createCreditCardAccount(this, listOf("DKKKU")))
|
|
||||||
|
|
||||||
mapper.updateBankData(this, bankResponse)
|
|
||||||
|
|
||||||
this.jobsRequiringTan = this.jobsRequiringTan.sorted().toSet() // sort them for comparability in tests
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createCheckingAccount(bank: BankData, allowedJobNames: List<String>) =
|
|
||||||
createAccount(bank, AccountType.Girokonto, "12345678", "Kontokorrent", allowedJobNames, AccountFeature.entries)
|
|
||||||
|
|
||||||
private fun createCreditCardAccount(bank: BankData, allowedJobNames: List<String>) =
|
|
||||||
createAccount(bank, AccountType.Kreditkartenkonto, "4321876521096543", "Visa-Card", allowedJobNames, listOf(AccountFeature.RetrieveAccountTransactions))
|
|
||||||
|
|
||||||
private fun createAccount(bank: BankData, type: AccountType, accountIdentifier: String, productName: String? = null, allowedJobNames: List<String>, features: Collection<AccountFeature> = emptyList(), subAccountAttribute: String? = null) = AccountData(
|
|
||||||
accountIdentifier, subAccountAttribute, Laenderkennzeichen.Germany, bankCode, "DE11$bankCode$accountIdentifier", customerId, type, "EUR", customerName, productName, "T:1000,:EUR", allowedJobNames, bank.supportedJobs.filter { allowedJobNames.contains(it.jobName) }
|
|
||||||
).apply {
|
|
||||||
this.serverTransactionsRetentionDays = 270
|
|
||||||
|
|
||||||
features.forEach { feature ->
|
|
||||||
this.setSupportsFeature(feature, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private val serializedFinTsData = """
|
|
||||||
{
|
|
||||||
"bankCode": "10010010",
|
|
||||||
"customerId": "SuperUser",
|
|
||||||
"pin": "Liebe",
|
|
||||||
"finTs3ServerAddress": "https://abzockbank.de/fints",
|
|
||||||
"bic": "ABCDDEBBXXX",
|
|
||||||
"bankName": "Abzockbank",
|
|
||||||
"countryCode": 280,
|
|
||||||
"bpdVersion": 17,
|
|
||||||
"userId": "SuperUser",
|
|
||||||
"customerName": "Monika Superfrau",
|
|
||||||
"updVersion": 27,
|
|
||||||
"tanMethodsSupportedByBank": [
|
|
||||||
{
|
|
||||||
"displayName": "chipTAN manuell",
|
|
||||||
"securityFunction": "PIN_TAN_910",
|
|
||||||
"type": "ChipTanManuell",
|
|
||||||
"hhdVersion": "HHD_1_3",
|
|
||||||
"maxTanInputLength": 6,
|
|
||||||
"allowedTanFormat": "Numeric"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayName": "chipTAN optisch",
|
|
||||||
"securityFunction": "PIN_TAN_911",
|
|
||||||
"type": "ChipTanFlickercode",
|
|
||||||
"hhdVersion": "HHD_1_3",
|
|
||||||
"maxTanInputLength": 6,
|
|
||||||
"allowedTanFormat": "Numeric"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayName": "chipTAN-USB",
|
|
||||||
"securityFunction": "PIN_TAN_912",
|
|
||||||
"type": "ChipTanUsb",
|
|
||||||
"hhdVersion": "HHD_1_3",
|
|
||||||
"maxTanInputLength": 6,
|
|
||||||
"allowedTanFormat": "Numeric"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayName": "chipTAN-QR",
|
|
||||||
"securityFunction": "PIN_TAN_913",
|
|
||||||
"type": "ChipTanQrCode",
|
|
||||||
"maxTanInputLength": 6,
|
|
||||||
"allowedTanFormat": "Numeric"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayName": "smsTAN",
|
|
||||||
"securityFunction": "PIN_TAN_920",
|
|
||||||
"type": "SmsTan",
|
|
||||||
"maxTanInputLength": 6,
|
|
||||||
"allowedTanFormat": "Numeric",
|
|
||||||
"nameOfTanMediumRequired": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayName": "pushTAN",
|
|
||||||
"securityFunction": "PIN_TAN_921",
|
|
||||||
"type": "AppTan",
|
|
||||||
"maxTanInputLength": 6,
|
|
||||||
"allowedTanFormat": "Numeric",
|
|
||||||
"nameOfTanMediumRequired": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayName": "pushTAN 2.0",
|
|
||||||
"securityFunction": "PIN_TAN_922",
|
|
||||||
"type": "DecoupledTan",
|
|
||||||
"nameOfTanMediumRequired": true,
|
|
||||||
"hktanVersion": 7,
|
|
||||||
"decoupledParameters": {
|
|
||||||
"manualConfirmationAllowed": true,
|
|
||||||
"periodicStateRequestsAllowed": true,
|
|
||||||
"maxNumberOfStateRequests": 180,
|
|
||||||
"initialDelayInSecondsForStateRequest": 1,
|
|
||||||
"delayInSecondsForNextStateRequest": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayName": "pushTAN 2.0",
|
|
||||||
"securityFunction": "PIN_TAN_923",
|
|
||||||
"type": "DecoupledTan",
|
|
||||||
"nameOfTanMediumRequired": true,
|
|
||||||
"hktanVersion": 7,
|
|
||||||
"decoupledParameters": {
|
|
||||||
"manualConfirmationAllowed": true,
|
|
||||||
"periodicStateRequestsAllowed": true,
|
|
||||||
"maxNumberOfStateRequests": 180,
|
|
||||||
"initialDelayInSecondsForStateRequest": 1,
|
|
||||||
"delayInSecondsForNextStateRequest": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"identifierOfTanMethodsAvailableForUser": [
|
|
||||||
"910",
|
|
||||||
"911",
|
|
||||||
"912",
|
|
||||||
"913"
|
|
||||||
],
|
|
||||||
"selectedTanMethodIdentifier": "912",
|
|
||||||
"tanMedia": [
|
|
||||||
{
|
|
||||||
"mediumClass": "TanGenerator",
|
|
||||||
"status": "Verfuegbar",
|
|
||||||
"mediumName": "SparkassenCard (Debitkarte)",
|
|
||||||
"tanGenerator": {
|
|
||||||
"cardNumber": "1234567890",
|
|
||||||
"cardSequenceNumber": null,
|
|
||||||
"cardType": null,
|
|
||||||
"validFrom": null,
|
|
||||||
"validTo": null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"mediumClass": "TanGenerator",
|
|
||||||
"status": "Aktiv",
|
|
||||||
"mediumName": "SparkassenCard (Debitkarte)",
|
|
||||||
"tanGenerator": {
|
|
||||||
"cardNumber": "1234567891",
|
|
||||||
"cardSequenceNumber": null,
|
|
||||||
"cardType": null,
|
|
||||||
"validFrom": null,
|
|
||||||
"validTo": null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"mediumClass": "AlleMedien",
|
|
||||||
"status": "Aktiv",
|
|
||||||
"mediumName": "Alle Geräte"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"selectedTanMediumIdentifier": "TanGenerator SparkassenCard (Debitkarte) Aktiv 1234567891 null",
|
|
||||||
"supportedLanguages": [
|
|
||||||
"German",
|
|
||||||
"English"
|
|
||||||
],
|
|
||||||
"selectedLanguage": "German",
|
|
||||||
"customerSystemId": "47",
|
|
||||||
"customerSystemStatus": "Benoetigt",
|
|
||||||
"countMaxJobsPerMessage": 1,
|
|
||||||
"supportedHbciVersions": [
|
|
||||||
"FinTs_3_0_0"
|
|
||||||
],
|
|
||||||
"supportedJobs": [
|
|
||||||
{
|
|
||||||
"jobName": "HKSAL",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": null,
|
|
||||||
"segmentId": "HISALS",
|
|
||||||
"segmentNumber": 145,
|
|
||||||
"segmentVersion": 5,
|
|
||||||
"segmentString": "HISALS:145:5:4+1+1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"jobName": "HKSAL",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HISALS",
|
|
||||||
"segmentNumber": 12,
|
|
||||||
"segmentVersion": 8,
|
|
||||||
"segmentString": "HISALS:12:8:4+1+1+0+J"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"jobName": "HKCCS",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HICCSS",
|
|
||||||
"segmentNumber": 96,
|
|
||||||
"segmentVersion": 1,
|
|
||||||
"segmentString": "HICCSS:96:1:4+1+1+0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"jobName": "HKIPZ",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HIIPZS",
|
|
||||||
"segmentNumber": 22,
|
|
||||||
"segmentVersion": 1,
|
|
||||||
"segmentString": "HIIPZS:22:1:4+1+1+0+;:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.09"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"jobName": "HKTAB",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HITABS",
|
|
||||||
"segmentNumber": 153,
|
|
||||||
"segmentVersion": 4,
|
|
||||||
"segmentString": "HITABS:153:4:4+1+1+0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"jobName": "HKTAN",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 1,
|
|
||||||
"segmentId": "HITANS",
|
|
||||||
"segmentNumber": 169,
|
|
||||||
"segmentVersion": 6,
|
|
||||||
"segmentString": "HITANS:169:6:4+1+1+1+J:N:0:910:2:HHD1.3.0:::chipTAN manuell:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:911:2:HHD1.3.2OPT:HHDOPT1:1.3.2:chipTAN optisch:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:912:2:HHD1.3.2USB:HHDUSB1:1.3.2:chipTAN-USB:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:913:2:Q1S:Secoder_UC:1.2.0:chipTAN-QR:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:920:2:smsTAN:::smsTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:5:921:2:pushTAN:::pushTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:2:900:2:iTAN:::iTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"jobName": "HKTAN",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 1,
|
|
||||||
"segmentId": "HITANS",
|
|
||||||
"segmentNumber": 170,
|
|
||||||
"segmentVersion": 7,
|
|
||||||
"segmentString": "HITANS:170:7:4+1+1+1+N:N:0:922:2:pushTAN-dec:Decoupled::pushTAN 2.0:::Aufforderung:2048:J:2:N:0:0:N:N:00:2:N:2:180:1:1:J:J:923:2:pushTAN-cas:Decoupled::pushTAN 2.0:::Aufforderung:2048:J:2:N:0:0:N:N:00:2:N:5:180:1:1:J:J"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"jobName": "HKPIN",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HIPINS",
|
|
||||||
"segmentNumber": 78,
|
|
||||||
"segmentVersion": 1,
|
|
||||||
"segmentString": "HIPINS:78:1:3+1+1+0+5:20:6:VR-NetKey oder Alias::HKTAN:N:HKKAZ:J:HKSAL:N:HKEKA:N:HKPAE:J:HKPSP:N:HKQTG:N:HKCSA:J:HKCSB:N:HKCSL:J:HKCCS:J:HKSPA:N:HKDSE:J:HKBSE:J:HKBME:J:HKCDL:J:HKPPD:J:HKCDN:J:HKDSB:N:HKCUB:N:HKDSW:J:HKAUB:J:HKBBS:N:HKDMB:N:HKDBS:N:HKBMB:N:HKECA:N:HKCMB:N:HKCME:J:HKCML:J:HKWDU:N:HKWPD:N:HKDME:J:HKCCM:J:HKCDB:N:HKCDE:J:HKCSE:J:HKCUM:J:HKKAU:N:HKKIF:N:HKBAZ:N:HKZDF:J:HKCAZ:J:HKDDB:N:HKDDE:J:HKDDL:J:HKDDN:J:HKKAA:N:HKPOF:N:HKIPS:N:HKIPZ:J:HKBML:J:HKBSA:J:HKBSL:J:HKDML:J:HKDSA:J:HKDSL:J:HKZDA:J:HKZDL:N:GKVPU:N:GKVPD:N"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"supportedDetailedJobs": [
|
|
||||||
{
|
|
||||||
"type": "RetrieveAccountTransactionsParameters",
|
|
||||||
"jobParameters": {
|
|
||||||
"jobName": "HKKAZ",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": null,
|
|
||||||
"segmentId": "HIKAZS",
|
|
||||||
"segmentNumber": 123,
|
|
||||||
"segmentVersion": 5,
|
|
||||||
"segmentString": "HIKAZS:123:5:4+1+1+360:J:N"
|
|
||||||
},
|
|
||||||
"serverTransactionsRetentionDays": 360,
|
|
||||||
"settingCountEntriesAllowed": true,
|
|
||||||
"settingAllAccountAllowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "RetrieveAccountTransactionsParameters",
|
|
||||||
"jobParameters": {
|
|
||||||
"jobName": "DKKKU",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "DIKKUS",
|
|
||||||
"segmentNumber": 67,
|
|
||||||
"segmentVersion": 2,
|
|
||||||
"segmentString": "DIKKUS:67:2:4+1+1+0+90:N:J"
|
|
||||||
},
|
|
||||||
"serverTransactionsRetentionDays": 90,
|
|
||||||
"settingCountEntriesAllowed": false,
|
|
||||||
"settingAllAccountAllowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "ChangeTanMediaParameters",
|
|
||||||
"jobParameters": {
|
|
||||||
"jobName": "HKTAU",
|
|
||||||
"maxCountJobs": 1,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HITAUS",
|
|
||||||
"segmentNumber": 154,
|
|
||||||
"segmentVersion": 1,
|
|
||||||
"segmentString": "HITAUS:154:1:4+1+1+0+N:N:J"
|
|
||||||
},
|
|
||||||
"enteringTanListNumberRequired": false,
|
|
||||||
"enteringCardSequenceNumberRequired": false,
|
|
||||||
"enteringAtcAndTanRequired": true,
|
|
||||||
"enteringCardTypeAllowed": false,
|
|
||||||
"accountInfoRequired": false,
|
|
||||||
"allowedCardTypes": [
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "SepaAccountInfoParameters",
|
|
||||||
"jobParameters": {
|
|
||||||
"jobName": "HKSPA",
|
|
||||||
"maxCountJobs": 20,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HISPAS",
|
|
||||||
"segmentNumber": 42,
|
|
||||||
"segmentVersion": 1,
|
|
||||||
"segmentString": "HISPAS:42:1:4+20+1+0+N:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02"
|
|
||||||
},
|
|
||||||
"retrieveSingleAccountAllowed": false,
|
|
||||||
"nationalAccountRelationshipAllowed": false,
|
|
||||||
"structuredReferenceAllowed": false,
|
|
||||||
"settingMaxAllowedEntriesAllowed": false,
|
|
||||||
"countReservedReferenceLength": 0,
|
|
||||||
"supportedSepaFormats": [
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.001.003.03",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.008.003.02",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.001.001.03",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "SepaAccountInfoParameters",
|
|
||||||
"jobParameters": {
|
|
||||||
"jobName": "HKSPA",
|
|
||||||
"maxCountJobs": 20,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HISPAS",
|
|
||||||
"segmentNumber": 43,
|
|
||||||
"segmentVersion": 2,
|
|
||||||
"segmentString": "HISPAS:43:2:4+20+1+0+N:N:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02"
|
|
||||||
},
|
|
||||||
"retrieveSingleAccountAllowed": false,
|
|
||||||
"nationalAccountRelationshipAllowed": false,
|
|
||||||
"structuredReferenceAllowed": false,
|
|
||||||
"settingMaxAllowedEntriesAllowed": false,
|
|
||||||
"countReservedReferenceLength": 0,
|
|
||||||
"supportedSepaFormats": [
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.001.003.03",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.008.003.02",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.001.001.03",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "SepaAccountInfoParameters",
|
|
||||||
"jobParameters": {
|
|
||||||
"jobName": "HKSPA",
|
|
||||||
"maxCountJobs": 20,
|
|
||||||
"minimumCountSignatures": 1,
|
|
||||||
"securityClass": 0,
|
|
||||||
"segmentId": "HISPAS",
|
|
||||||
"segmentNumber": 44,
|
|
||||||
"segmentVersion": 3,
|
|
||||||
"segmentString": "HISPAS:44:3:4+20+1+0+N:N:N:N:0:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02"
|
|
||||||
},
|
|
||||||
"retrieveSingleAccountAllowed": false,
|
|
||||||
"nationalAccountRelationshipAllowed": false,
|
|
||||||
"structuredReferenceAllowed": false,
|
|
||||||
"settingMaxAllowedEntriesAllowed": false,
|
|
||||||
"countReservedReferenceLength": 0,
|
|
||||||
"supportedSepaFormats": [
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.001.003.03",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.008.003.02",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.001.001.03",
|
|
||||||
"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"jobsRequiringTan": [
|
|
||||||
"HKAUB",
|
|
||||||
"HKBME",
|
|
||||||
"HKBML",
|
|
||||||
"HKBSA",
|
|
||||||
"HKBSE",
|
|
||||||
"HKBSL",
|
|
||||||
"HKCAZ",
|
|
||||||
"HKCCM",
|
|
||||||
"HKCCS",
|
|
||||||
"HKCDE",
|
|
||||||
"HKCDL",
|
|
||||||
"HKCDN",
|
|
||||||
"HKCME",
|
|
||||||
"HKCML",
|
|
||||||
"HKCSA",
|
|
||||||
"HKCSE",
|
|
||||||
"HKCSL",
|
|
||||||
"HKCUM",
|
|
||||||
"HKDDE",
|
|
||||||
"HKDDL",
|
|
||||||
"HKDDN",
|
|
||||||
"HKDME",
|
|
||||||
"HKDML",
|
|
||||||
"HKDSA",
|
|
||||||
"HKDSE",
|
|
||||||
"HKDSL",
|
|
||||||
"HKDSW",
|
|
||||||
"HKIPZ",
|
|
||||||
"HKKAZ",
|
|
||||||
"HKPAE",
|
|
||||||
"HKPPD",
|
|
||||||
"HKZDA",
|
|
||||||
"HKZDF"
|
|
||||||
],
|
|
||||||
"pinInfo": {
|
|
||||||
"minPinLength": 5,
|
|
||||||
"maxPinLength": 20,
|
|
||||||
"minTanLength": 6,
|
|
||||||
"userIdHint": "VR-NetKey oder Alias",
|
|
||||||
"customerIdHint": null
|
|
||||||
},
|
|
||||||
"accounts": [
|
|
||||||
{
|
|
||||||
"accountIdentifier": "12345678",
|
|
||||||
"subAccountAttribute": null,
|
|
||||||
"bankCountryCode": 280,
|
|
||||||
"bankCode": "10010010",
|
|
||||||
"iban": "DE111001001012345678",
|
|
||||||
"customerId": "SuperUser",
|
|
||||||
"accountType": "Girokonto",
|
|
||||||
"currency": "EUR",
|
|
||||||
"accountHolderName": "Monika Superfrau",
|
|
||||||
"productName": "Kontokorrent",
|
|
||||||
"accountLimit": "T:1000,:EUR",
|
|
||||||
"allowedJobNames": [
|
|
||||||
"HKSAL",
|
|
||||||
"HKKAZ",
|
|
||||||
"HKCCS",
|
|
||||||
"HKIPZ"
|
|
||||||
],
|
|
||||||
"serverTransactionsRetentionDays": 270,
|
|
||||||
"supportedFeatures": [
|
|
||||||
"RetrieveBalance",
|
|
||||||
"RetrieveAccountTransactions",
|
|
||||||
"TransferMoney",
|
|
||||||
"RealTimeTransfer"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"accountIdentifier": "4321876521096543",
|
|
||||||
"subAccountAttribute": null,
|
|
||||||
"bankCountryCode": 280,
|
|
||||||
"bankCode": "10010010",
|
|
||||||
"iban": "DE11100100104321876521096543",
|
|
||||||
"customerId": "SuperUser",
|
|
||||||
"accountType": "Kreditkartenkonto",
|
|
||||||
"currency": "EUR",
|
|
||||||
"accountHolderName": "Monika Superfrau",
|
|
||||||
"productName": "Visa-Card",
|
|
||||||
"accountLimit": "T:1000,:EUR",
|
|
||||||
"allowedJobNames": [
|
|
||||||
"DKKKU"
|
|
||||||
],
|
|
||||||
"serverTransactionsRetentionDays": 270,
|
|
||||||
"supportedFeatures": [
|
|
||||||
"RetrieveAccountTransactions"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"modelVersion": "0.6.0"
|
|
||||||
}
|
|
||||||
""".trimIndent()
|
|
||||||
}
|
}
|
|
@ -0,0 +1,539 @@
|
||||||
|
package net.codinux.banking.fints.test
|
||||||
|
|
||||||
|
import net.codinux.banking.fints.messages.MessageBuilder
|
||||||
|
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Laenderkennzeichen
|
||||||
|
import net.codinux.banking.fints.messages.datenelemente.implementierte.Dialogsprache
|
||||||
|
import net.codinux.banking.fints.messages.datenelemente.implementierte.HbciVersion
|
||||||
|
import net.codinux.banking.fints.messages.datenelemente.implementierte.KundensystemStatusWerte
|
||||||
|
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanMediumStatus
|
||||||
|
import net.codinux.banking.fints.model.AccountData
|
||||||
|
import net.codinux.banking.fints.model.AccountFeature
|
||||||
|
import net.codinux.banking.fints.model.BankData
|
||||||
|
import net.codinux.banking.fints.model.mapper.ModelMapper
|
||||||
|
import net.codinux.banking.fints.response.InstituteSegmentId
|
||||||
|
import net.codinux.banking.fints.response.ResponseParser
|
||||||
|
import net.codinux.banking.fints.response.segments.AccountType
|
||||||
|
import net.codinux.banking.fints.response.segments.TanInfo
|
||||||
|
import net.codinux.banking.fints.response.segments.TanMediaList
|
||||||
|
|
||||||
|
object TestDataGenerator {
|
||||||
|
|
||||||
|
private val bankCode = "10010010"
|
||||||
|
private val bic = "ABCDDEBBXXX"
|
||||||
|
private val bankName = "Abzockbank"
|
||||||
|
private val serverAddress = "https://abzockbank.de/fints"
|
||||||
|
private val bpd = 17
|
||||||
|
|
||||||
|
private val customerId = "SuperUser"
|
||||||
|
private val password = "Liebe"
|
||||||
|
private val customerName = "Monika Superfrau"
|
||||||
|
private val upd = 27
|
||||||
|
|
||||||
|
|
||||||
|
fun generateBankDataForSerialization(): BankData {
|
||||||
|
val parser = ResponseParser()
|
||||||
|
val mapper = ModelMapper(MessageBuilder())
|
||||||
|
|
||||||
|
val bankResponse = parser.parse("""
|
||||||
|
HIRMS:5:2:4+3050::BPD nicht mehr aktuell, aktuelle Version enthalten.+3920::Zugelassene Zwei-Schritt-Verfahren für den Benutzer.:910:911:912:913+0020::Der Auftrag wurde ausgeführt.'
|
||||||
|
HISALS:145:5:4+1+1'
|
||||||
|
HISALS:12:8:4+1+1+0+J'
|
||||||
|
HIKAZS:123:5:4+1+1+360:J:N'
|
||||||
|
HICCSS:96:1:4+1+1+0'
|
||||||
|
HIIPZS:22:1:4+1+1+0+;:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.09'
|
||||||
|
DIKKUS:67:2:4+1+1+0+90:N:J'
|
||||||
|
HITABS:153:4:4+1+1+0'
|
||||||
|
HITAUS:154:1:4+1+1+0+N:N:J'
|
||||||
|
HITANS:169:6:4+1+1+1+J:N:0:910:2:HHD1.3.0:::chipTAN manuell:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:911:2:HHD1.3.2OPT:HHDOPT1:1.3.2:chipTAN optisch:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:912:2:HHD1.3.2USB:HHDUSB1:1.3.2:chipTAN-USB:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:913:2:Q1S:Secoder_UC:1.2.0:chipTAN-QR:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:920:2:smsTAN:::smsTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:5:921:2:pushTAN:::pushTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:2:900:2:iTAN:::iTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:0'
|
||||||
|
HITANS:170:7:4+1+1+1+N:N:0:922:2:pushTAN-dec:Decoupled::pushTAN 2.0:::Aufforderung:2048:J:2:N:0:0:N:N:00:2:N:2:180:1:1:J:J:923:2:pushTAN-cas:Decoupled::pushTAN 2.0:::Aufforderung:2048:J:2:N:0:0:N:N:00:2:N:5:180:1:1:J:J'
|
||||||
|
HITAB:5:4:3+1+G:2:1234567890::::::::::SparkassenCard (Debitkarte)::::::::+G:1:1234567891::::::::::SparkassenCard (Debitkarte)::::::::'
|
||||||
|
HITAB:5:4:3+0+A:1:::::::::::Alle Geräte::::::::'
|
||||||
|
HIPINS:78:1:3+1+1+0+5:20:6:VR-NetKey oder Alias::HKTAN:N:HKKAZ:J:HKSAL:N:HKEKA:N:HKPAE:J:HKPSP:N:HKQTG:N:HKCSA:J:HKCSB:N:HKCSL:J:HKCCS:J:HKSPA:N:HKDSE:J:HKBSE:J:HKBME:J:HKCDL:J:HKPPD:J:HKCDN:J:HKDSB:N:HKCUB:N:HKDSW:J:HKAUB:J:HKBBS:N:HKDMB:N:HKDBS:N:HKBMB:N:HKECA:N:HKCMB:N:HKCME:J:HKCML:J:HKWDU:N:HKWPD:N:HKDME:J:HKCCM:J:HKCDB:N:HKCDE:J:HKCSE:J:HKCUM:J:HKKAU:N:HKKIF:N:HKBAZ:N:HKZDF:J:HKCAZ:J:HKDDB:N:HKDDE:J:HKDDL:J:HKDDN:J:HKKAA:N:HKPOF:N:HKIPS:N:HKIPZ:J:HKBML:J:HKBSA:J:HKBSL:J:HKDML:J:HKDSA:J:HKDSL:J:HKZDA:J:HKZDL:N:GKVPU:N:GKVPD:N'
|
||||||
|
HISPAS:42:1:4+20+1+0+N:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02'
|
||||||
|
HISPAS:43:2:4+20+1+0+N:N:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02'
|
||||||
|
HISPAS:44:3:4+20+1+0+N:N:N:N:0:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02'
|
||||||
|
""".trimIndent().replace("\n", "").replace("\r", ""))
|
||||||
|
|
||||||
|
val tanMethods = bankResponse.getSegmentsById<TanInfo>(InstituteSegmentId.TanInfo).flatMap { mapper.mapToTanMethods(it) }
|
||||||
|
val tanMedia = bankResponse.getSegmentsById<TanMediaList>(InstituteSegmentId.TanMediaList).flatMap { it.tanMedia }
|
||||||
|
|
||||||
|
return BankData(
|
||||||
|
bankCode, customerId, password, serverAddress, bic, bankName, Laenderkennzeichen.Germany, bpd,
|
||||||
|
customerId, customerName, upd,
|
||||||
|
|
||||||
|
tanMethods, tanMethods.filter { it.securityFunction.code.startsWith("91") }, tanMethods.first { it.securityFunction.code == "912" },
|
||||||
|
tanMedia, tanMedia.first { it.status == TanMediumStatus.Aktiv },
|
||||||
|
|
||||||
|
listOf(Dialogsprache.German, Dialogsprache.English), Dialogsprache.German, "47", KundensystemStatusWerte.Benoetigt,
|
||||||
|
1, listOf(HbciVersion.FinTs_3_0_0)
|
||||||
|
).apply {
|
||||||
|
this.addAccount(createCheckingAccount(this, listOf("HKSAL", "HKKAZ", "HKCCS", "HKIPZ")))
|
||||||
|
this.addAccount(createCreditCardAccount(this, listOf("DKKKU")))
|
||||||
|
|
||||||
|
mapper.updateBankData(this, bankResponse)
|
||||||
|
|
||||||
|
this.jobsRequiringTan = this.jobsRequiringTan.sorted().toSet() // sort them for comparability in tests
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createCheckingAccount(bank: BankData, allowedJobNames: List<String>) =
|
||||||
|
createAccount(bank, AccountType.Girokonto, "12345678", "Kontokorrent", allowedJobNames, AccountFeature.entries)
|
||||||
|
|
||||||
|
private fun createCreditCardAccount(bank: BankData, allowedJobNames: List<String>) =
|
||||||
|
createAccount(bank, AccountType.Kreditkartenkonto, "4321876521096543", "Visa-Card", allowedJobNames, listOf(
|
||||||
|
AccountFeature.RetrieveAccountTransactions))
|
||||||
|
|
||||||
|
private fun createAccount(bank: BankData, type: AccountType, accountIdentifier: String, productName: String? = null, allowedJobNames: List<String>, features: Collection<AccountFeature> = emptyList(), subAccountAttribute: String? = null) = AccountData(
|
||||||
|
accountIdentifier, subAccountAttribute, Laenderkennzeichen.Germany, bankCode, "DE11${bankCode}$accountIdentifier", customerId, type, "EUR", customerName, productName, "T:1000,:EUR", allowedJobNames, bank.supportedJobs.filter { allowedJobNames.contains(it.jobName) }
|
||||||
|
).apply {
|
||||||
|
this.serverTransactionsRetentionDays = 270
|
||||||
|
|
||||||
|
features.forEach { feature ->
|
||||||
|
this.setSupportsFeature(feature, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val serializedBankData = """
|
||||||
|
{
|
||||||
|
"bankCode": "10010010",
|
||||||
|
"customerId": "SuperUser",
|
||||||
|
"pin": "Liebe",
|
||||||
|
"finTs3ServerAddress": "https://abzockbank.de/fints",
|
||||||
|
"bic": "ABCDDEBBXXX",
|
||||||
|
"bankName": "Abzockbank",
|
||||||
|
"countryCode": 280,
|
||||||
|
"bpdVersion": 17,
|
||||||
|
"userId": "SuperUser",
|
||||||
|
"customerName": "Monika Superfrau",
|
||||||
|
"updVersion": 27,
|
||||||
|
"tanMethodsSupportedByBank": [
|
||||||
|
{
|
||||||
|
"displayName": "chipTAN manuell",
|
||||||
|
"securityFunction": "PIN_TAN_910",
|
||||||
|
"type": "ChipTanManuell",
|
||||||
|
"hhdVersion": "HHD_1_3",
|
||||||
|
"maxTanInputLength": 6,
|
||||||
|
"allowedTanFormat": "Numeric"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"displayName": "chipTAN optisch",
|
||||||
|
"securityFunction": "PIN_TAN_911",
|
||||||
|
"type": "ChipTanFlickercode",
|
||||||
|
"hhdVersion": "HHD_1_3",
|
||||||
|
"maxTanInputLength": 6,
|
||||||
|
"allowedTanFormat": "Numeric"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"displayName": "chipTAN-USB",
|
||||||
|
"securityFunction": "PIN_TAN_912",
|
||||||
|
"type": "ChipTanUsb",
|
||||||
|
"hhdVersion": "HHD_1_3",
|
||||||
|
"maxTanInputLength": 6,
|
||||||
|
"allowedTanFormat": "Numeric"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"displayName": "chipTAN-QR",
|
||||||
|
"securityFunction": "PIN_TAN_913",
|
||||||
|
"type": "ChipTanQrCode",
|
||||||
|
"maxTanInputLength": 6,
|
||||||
|
"allowedTanFormat": "Numeric"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"displayName": "smsTAN",
|
||||||
|
"securityFunction": "PIN_TAN_920",
|
||||||
|
"type": "SmsTan",
|
||||||
|
"maxTanInputLength": 6,
|
||||||
|
"allowedTanFormat": "Numeric",
|
||||||
|
"nameOfTanMediumRequired": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"displayName": "pushTAN",
|
||||||
|
"securityFunction": "PIN_TAN_921",
|
||||||
|
"type": "AppTan",
|
||||||
|
"maxTanInputLength": 6,
|
||||||
|
"allowedTanFormat": "Numeric",
|
||||||
|
"nameOfTanMediumRequired": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"displayName": "pushTAN 2.0",
|
||||||
|
"securityFunction": "PIN_TAN_922",
|
||||||
|
"type": "DecoupledTan",
|
||||||
|
"nameOfTanMediumRequired": true,
|
||||||
|
"hktanVersion": 7,
|
||||||
|
"decoupledParameters": {
|
||||||
|
"manualConfirmationAllowed": true,
|
||||||
|
"periodicStateRequestsAllowed": true,
|
||||||
|
"maxNumberOfStateRequests": 180,
|
||||||
|
"initialDelayInSecondsForStateRequest": 1,
|
||||||
|
"delayInSecondsForNextStateRequest": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"displayName": "pushTAN 2.0",
|
||||||
|
"securityFunction": "PIN_TAN_923",
|
||||||
|
"type": "DecoupledTan",
|
||||||
|
"nameOfTanMediumRequired": true,
|
||||||
|
"hktanVersion": 7,
|
||||||
|
"decoupledParameters": {
|
||||||
|
"manualConfirmationAllowed": true,
|
||||||
|
"periodicStateRequestsAllowed": true,
|
||||||
|
"maxNumberOfStateRequests": 180,
|
||||||
|
"initialDelayInSecondsForStateRequest": 1,
|
||||||
|
"delayInSecondsForNextStateRequest": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"identifierOfTanMethodsAvailableForUser": [
|
||||||
|
"910",
|
||||||
|
"911",
|
||||||
|
"912",
|
||||||
|
"913"
|
||||||
|
],
|
||||||
|
"selectedTanMethodIdentifier": "912",
|
||||||
|
"tanMedia": [
|
||||||
|
{
|
||||||
|
"mediumClass": "TanGenerator",
|
||||||
|
"status": "Verfuegbar",
|
||||||
|
"mediumName": "SparkassenCard (Debitkarte)",
|
||||||
|
"tanGenerator": {
|
||||||
|
"cardNumber": "1234567890",
|
||||||
|
"cardSequenceNumber": null,
|
||||||
|
"cardType": null,
|
||||||
|
"validFrom": null,
|
||||||
|
"validTo": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mediumClass": "TanGenerator",
|
||||||
|
"status": "Aktiv",
|
||||||
|
"mediumName": "SparkassenCard (Debitkarte)",
|
||||||
|
"tanGenerator": {
|
||||||
|
"cardNumber": "1234567891",
|
||||||
|
"cardSequenceNumber": null,
|
||||||
|
"cardType": null,
|
||||||
|
"validFrom": null,
|
||||||
|
"validTo": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mediumClass": "AlleMedien",
|
||||||
|
"status": "Aktiv",
|
||||||
|
"mediumName": "Alle Geräte"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"selectedTanMediumIdentifier": "TanGenerator SparkassenCard (Debitkarte) Aktiv 1234567891 null",
|
||||||
|
"supportedLanguages": [
|
||||||
|
"German",
|
||||||
|
"English"
|
||||||
|
],
|
||||||
|
"selectedLanguage": "German",
|
||||||
|
"customerSystemId": "47",
|
||||||
|
"customerSystemStatus": "Benoetigt",
|
||||||
|
"countMaxJobsPerMessage": 1,
|
||||||
|
"supportedHbciVersions": [
|
||||||
|
"FinTs_3_0_0"
|
||||||
|
],
|
||||||
|
"supportedJobs": [
|
||||||
|
{
|
||||||
|
"jobName": "HKSAL",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": null,
|
||||||
|
"segmentId": "HISALS",
|
||||||
|
"segmentNumber": 145,
|
||||||
|
"segmentVersion": 5,
|
||||||
|
"segmentString": "HISALS:145:5:4+1+1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"jobName": "HKSAL",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HISALS",
|
||||||
|
"segmentNumber": 12,
|
||||||
|
"segmentVersion": 8,
|
||||||
|
"segmentString": "HISALS:12:8:4+1+1+0+J"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"jobName": "HKCCS",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HICCSS",
|
||||||
|
"segmentNumber": 96,
|
||||||
|
"segmentVersion": 1,
|
||||||
|
"segmentString": "HICCSS:96:1:4+1+1+0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"jobName": "HKIPZ",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HIIPZS",
|
||||||
|
"segmentNumber": 22,
|
||||||
|
"segmentVersion": 1,
|
||||||
|
"segmentString": "HIIPZS:22:1:4+1+1+0+;:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.09"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"jobName": "HKTAB",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HITABS",
|
||||||
|
"segmentNumber": 153,
|
||||||
|
"segmentVersion": 4,
|
||||||
|
"segmentString": "HITABS:153:4:4+1+1+0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"jobName": "HKTAN",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 1,
|
||||||
|
"segmentId": "HITANS",
|
||||||
|
"segmentNumber": 169,
|
||||||
|
"segmentVersion": 6,
|
||||||
|
"segmentString": "HITANS:169:6:4+1+1+1+J:N:0:910:2:HHD1.3.0:::chipTAN manuell:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:911:2:HHD1.3.2OPT:HHDOPT1:1.3.2:chipTAN optisch:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:912:2:HHD1.3.2USB:HHDUSB1:1.3.2:chipTAN-USB:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:913:2:Q1S:Secoder_UC:1.2.0:chipTAN-QR:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:920:2:smsTAN:::smsTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:5:921:2:pushTAN:::pushTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:2:900:2:iTAN:::iTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"jobName": "HKTAN",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 1,
|
||||||
|
"segmentId": "HITANS",
|
||||||
|
"segmentNumber": 170,
|
||||||
|
"segmentVersion": 7,
|
||||||
|
"segmentString": "HITANS:170:7:4+1+1+1+N:N:0:922:2:pushTAN-dec:Decoupled::pushTAN 2.0:::Aufforderung:2048:J:2:N:0:0:N:N:00:2:N:2:180:1:1:J:J:923:2:pushTAN-cas:Decoupled::pushTAN 2.0:::Aufforderung:2048:J:2:N:0:0:N:N:00:2:N:5:180:1:1:J:J"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"jobName": "HKPIN",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HIPINS",
|
||||||
|
"segmentNumber": 78,
|
||||||
|
"segmentVersion": 1,
|
||||||
|
"segmentString": "HIPINS:78:1:3+1+1+0+5:20:6:VR-NetKey oder Alias::HKTAN:N:HKKAZ:J:HKSAL:N:HKEKA:N:HKPAE:J:HKPSP:N:HKQTG:N:HKCSA:J:HKCSB:N:HKCSL:J:HKCCS:J:HKSPA:N:HKDSE:J:HKBSE:J:HKBME:J:HKCDL:J:HKPPD:J:HKCDN:J:HKDSB:N:HKCUB:N:HKDSW:J:HKAUB:J:HKBBS:N:HKDMB:N:HKDBS:N:HKBMB:N:HKECA:N:HKCMB:N:HKCME:J:HKCML:J:HKWDU:N:HKWPD:N:HKDME:J:HKCCM:J:HKCDB:N:HKCDE:J:HKCSE:J:HKCUM:J:HKKAU:N:HKKIF:N:HKBAZ:N:HKZDF:J:HKCAZ:J:HKDDB:N:HKDDE:J:HKDDL:J:HKDDN:J:HKKAA:N:HKPOF:N:HKIPS:N:HKIPZ:J:HKBML:J:HKBSA:J:HKBSL:J:HKDML:J:HKDSA:J:HKDSL:J:HKZDA:J:HKZDL:N:GKVPU:N:GKVPD:N"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supportedDetailedJobs": [
|
||||||
|
{
|
||||||
|
"type": "RetrieveAccountTransactionsParameters",
|
||||||
|
"jobParameters": {
|
||||||
|
"jobName": "HKKAZ",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": null,
|
||||||
|
"segmentId": "HIKAZS",
|
||||||
|
"segmentNumber": 123,
|
||||||
|
"segmentVersion": 5,
|
||||||
|
"segmentString": "HIKAZS:123:5:4+1+1+360:J:N"
|
||||||
|
},
|
||||||
|
"serverTransactionsRetentionDays": 360,
|
||||||
|
"settingCountEntriesAllowed": true,
|
||||||
|
"settingAllAccountAllowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "RetrieveAccountTransactionsParameters",
|
||||||
|
"jobParameters": {
|
||||||
|
"jobName": "DKKKU",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "DIKKUS",
|
||||||
|
"segmentNumber": 67,
|
||||||
|
"segmentVersion": 2,
|
||||||
|
"segmentString": "DIKKUS:67:2:4+1+1+0+90:N:J"
|
||||||
|
},
|
||||||
|
"serverTransactionsRetentionDays": 90,
|
||||||
|
"settingCountEntriesAllowed": false,
|
||||||
|
"settingAllAccountAllowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "ChangeTanMediaParameters",
|
||||||
|
"jobParameters": {
|
||||||
|
"jobName": "HKTAU",
|
||||||
|
"maxCountJobs": 1,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HITAUS",
|
||||||
|
"segmentNumber": 154,
|
||||||
|
"segmentVersion": 1,
|
||||||
|
"segmentString": "HITAUS:154:1:4+1+1+0+N:N:J"
|
||||||
|
},
|
||||||
|
"enteringTanListNumberRequired": false,
|
||||||
|
"enteringCardSequenceNumberRequired": false,
|
||||||
|
"enteringAtcAndTanRequired": true,
|
||||||
|
"enteringCardTypeAllowed": false,
|
||||||
|
"accountInfoRequired": false,
|
||||||
|
"allowedCardTypes": [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SepaAccountInfoParameters",
|
||||||
|
"jobParameters": {
|
||||||
|
"jobName": "HKSPA",
|
||||||
|
"maxCountJobs": 20,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HISPAS",
|
||||||
|
"segmentNumber": 42,
|
||||||
|
"segmentVersion": 1,
|
||||||
|
"segmentString": "HISPAS:42:1:4+20+1+0+N:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02"
|
||||||
|
},
|
||||||
|
"retrieveSingleAccountAllowed": false,
|
||||||
|
"nationalAccountRelationshipAllowed": false,
|
||||||
|
"structuredReferenceAllowed": false,
|
||||||
|
"settingMaxAllowedEntriesAllowed": false,
|
||||||
|
"countReservedReferenceLength": 0,
|
||||||
|
"supportedSepaFormats": [
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.001.003.03",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.008.003.02",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.001.001.03",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SepaAccountInfoParameters",
|
||||||
|
"jobParameters": {
|
||||||
|
"jobName": "HKSPA",
|
||||||
|
"maxCountJobs": 20,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HISPAS",
|
||||||
|
"segmentNumber": 43,
|
||||||
|
"segmentVersion": 2,
|
||||||
|
"segmentString": "HISPAS:43:2:4+20+1+0+N:N:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02"
|
||||||
|
},
|
||||||
|
"retrieveSingleAccountAllowed": false,
|
||||||
|
"nationalAccountRelationshipAllowed": false,
|
||||||
|
"structuredReferenceAllowed": false,
|
||||||
|
"settingMaxAllowedEntriesAllowed": false,
|
||||||
|
"countReservedReferenceLength": 0,
|
||||||
|
"supportedSepaFormats": [
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.001.003.03",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.008.003.02",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.001.001.03",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SepaAccountInfoParameters",
|
||||||
|
"jobParameters": {
|
||||||
|
"jobName": "HKSPA",
|
||||||
|
"maxCountJobs": 20,
|
||||||
|
"minimumCountSignatures": 1,
|
||||||
|
"securityClass": 0,
|
||||||
|
"segmentId": "HISPAS",
|
||||||
|
"segmentNumber": 44,
|
||||||
|
"segmentVersion": 3,
|
||||||
|
"segmentString": "HISPAS:44:3:4+20+1+0+N:N:N:N:0:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02"
|
||||||
|
},
|
||||||
|
"retrieveSingleAccountAllowed": false,
|
||||||
|
"nationalAccountRelationshipAllowed": false,
|
||||||
|
"structuredReferenceAllowed": false,
|
||||||
|
"settingMaxAllowedEntriesAllowed": false,
|
||||||
|
"countReservedReferenceLength": 0,
|
||||||
|
"supportedSepaFormats": [
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.001.003.03",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.008.003.02",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.001.001.03",
|
||||||
|
"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"jobsRequiringTan": [
|
||||||
|
"HKAUB",
|
||||||
|
"HKBME",
|
||||||
|
"HKBML",
|
||||||
|
"HKBSA",
|
||||||
|
"HKBSE",
|
||||||
|
"HKBSL",
|
||||||
|
"HKCAZ",
|
||||||
|
"HKCCM",
|
||||||
|
"HKCCS",
|
||||||
|
"HKCDE",
|
||||||
|
"HKCDL",
|
||||||
|
"HKCDN",
|
||||||
|
"HKCME",
|
||||||
|
"HKCML",
|
||||||
|
"HKCSA",
|
||||||
|
"HKCSE",
|
||||||
|
"HKCSL",
|
||||||
|
"HKCUM",
|
||||||
|
"HKDDE",
|
||||||
|
"HKDDL",
|
||||||
|
"HKDDN",
|
||||||
|
"HKDME",
|
||||||
|
"HKDML",
|
||||||
|
"HKDSA",
|
||||||
|
"HKDSE",
|
||||||
|
"HKDSL",
|
||||||
|
"HKDSW",
|
||||||
|
"HKIPZ",
|
||||||
|
"HKKAZ",
|
||||||
|
"HKPAE",
|
||||||
|
"HKPPD",
|
||||||
|
"HKZDA",
|
||||||
|
"HKZDF"
|
||||||
|
],
|
||||||
|
"pinInfo": {
|
||||||
|
"minPinLength": 5,
|
||||||
|
"maxPinLength": 20,
|
||||||
|
"minTanLength": 6,
|
||||||
|
"userIdHint": "VR-NetKey oder Alias",
|
||||||
|
"customerIdHint": null
|
||||||
|
},
|
||||||
|
"accounts": [
|
||||||
|
{
|
||||||
|
"accountIdentifier": "12345678",
|
||||||
|
"subAccountAttribute": null,
|
||||||
|
"bankCountryCode": 280,
|
||||||
|
"bankCode": "10010010",
|
||||||
|
"iban": "DE111001001012345678",
|
||||||
|
"customerId": "SuperUser",
|
||||||
|
"accountType": "Girokonto",
|
||||||
|
"currency": "EUR",
|
||||||
|
"accountHolderName": "Monika Superfrau",
|
||||||
|
"productName": "Kontokorrent",
|
||||||
|
"accountLimit": "T:1000,:EUR",
|
||||||
|
"allowedJobNames": [
|
||||||
|
"HKSAL",
|
||||||
|
"HKKAZ",
|
||||||
|
"HKCCS",
|
||||||
|
"HKIPZ"
|
||||||
|
],
|
||||||
|
"serverTransactionsRetentionDays": 270,
|
||||||
|
"supportedFeatures": [
|
||||||
|
"RetrieveBalance",
|
||||||
|
"RetrieveAccountTransactions",
|
||||||
|
"TransferMoney",
|
||||||
|
"RealTimeTransfer"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"accountIdentifier": "4321876521096543",
|
||||||
|
"subAccountAttribute": null,
|
||||||
|
"bankCountryCode": 280,
|
||||||
|
"bankCode": "10010010",
|
||||||
|
"iban": "DE11100100104321876521096543",
|
||||||
|
"customerId": "SuperUser",
|
||||||
|
"accountType": "Kreditkartenkonto",
|
||||||
|
"currency": "EUR",
|
||||||
|
"accountHolderName": "Monika Superfrau",
|
||||||
|
"productName": "Visa-Card",
|
||||||
|
"accountLimit": "T:1000,:EUR",
|
||||||
|
"allowedJobNames": [
|
||||||
|
"DKKKU"
|
||||||
|
],
|
||||||
|
"serverTransactionsRetentionDays": 270,
|
||||||
|
"supportedFeatures": [
|
||||||
|
"RetrieveAccountTransactions"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modelVersion": "0.6.0"
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue