Compare commits

...

24 Commits

Author SHA1 Message Date
dankito c564750832 Added targetiosX64 2024-08-26 02:20:09 +02:00
dankito d16289d824 Fixed BIC comments 2024-08-24 18:29:46 +02:00
dankito a2ac04f424 Added clarification about Dialogsprache 2024-08-24 18:25:56 +02:00
dankito 8247584a61 Added clarification about KundensystemStatus 2024-08-24 18:25:30 +02:00
dankito 34e40aeee1 Replaced deprecated methods 2024-08-24 17:33:00 +02:00
dankito 5d7ea48a46 Removed variant with callback 2024-08-24 17:17:47 +02:00
dankito d055b61ed9 Fixed typo from package name migration 2024-08-24 17:13:44 +02:00
dankito 87c59e63ee Added more documentation from FinTS spec 2024-08-24 17:13:22 +02:00
dankito 40b916a49f Made methods overridable; made + 3 clearer 2024-08-24 17:12:44 +02:00
dankito eabe2c4930 Made message trace ordered 2024-08-24 17:11:42 +02:00
dankito 0f151a8f4f Extracted jobsRequiringTan 2024-08-23 23:27:58 +02:00
dankito 33a86607df Changed order to make it clearer 2024-08-23 22:08:33 +02:00
dankito f154e60e1e Removed unused enum 2024-08-23 15:16:12 +02:00
dankito 7e5a455c24 Changed base package from net.dankito to net.codinux (except for client model) 2024-08-23 14:50:57 +02:00
dankito d8b0c89be7 Added parsed received segments to MessageLog 2024-08-23 14:06:14 +02:00
dankito 3d385b5bdf Added alternative names 2024-08-23 13:08:00 +02:00
dankito 4f3924f2cd Deciding upfront if message ever has to be pretty printed. Avoids pretty printing it multiple times 2024-08-23 13:06:48 +02:00
dankito c0796cfc38 Added option to disable collection messageLog 2024-08-23 13:02:10 +02:00
dankito 9857a0565d Fixed logging message 2024-08-23 12:57:37 +02:00
dankito a3dbe8f142 By default not adding message trace to message anymore; added messageIncludingMessageTrace for that 2024-08-23 12:53:45 +02:00
dankito 88f6d53ccb Temporarily disabling iOS DateFormatter as it conflicts with nativeMain's DateFormatter. TODO: Fix this 2024-08-23 12:47:14 +02:00
dankito 850beb8421 Added messageLogAdded() to FinTsClientCallback to get instantly notified of sent, received and error messages 2024-08-23 12:42:52 +02:00
dankito da50b72898 Added Toolchain resolver 2024-08-23 12:11:22 +02:00
dankito 237802b18d Moved createBankWithAllFeatures() and createRandomMessage() to FinTsTestBase 2024-08-22 18:40:40 +02:00
373 changed files with 1797 additions and 1689 deletions

View File

@ -7,9 +7,9 @@ import kotlinx.coroutines.withContext
import kotlinx.datetime.LocalDate
import net.dankito.banking.client.model.parameter.GetAccountDataParameter
import net.dankito.banking.client.model.response.GetAccountDataResponse
import net.dankito.banking.fints.FinTsClient
import net.dankito.banking.fints.callback.SimpleFinTsClientCallback
import net.dankito.banking.fints.model.TanChallenge
import net.codinux.banking.fints.FinTsClient
import net.codinux.banking.fints.callback.SimpleFinTsClientCallback
import net.codinux.banking.fints.model.TanChallenge
import net.dankito.utils.multiplatform.extensions.millisSinceEpochAtSystemDefaultTimeZone
import org.slf4j.LoggerFactory
import java.math.BigDecimal

View File

@ -5,7 +5,7 @@ import net.codinux.banking.fints4k.android.Presenter
import net.codinux.banking.fints4k.android.R
import net.codinux.banking.fints4k.android.adapter.viewholder.AccountTransactionsViewHolder
import net.dankito.banking.client.model.AccountTransaction
import net.dankito.banking.fints.util.toBigDecimal
import net.codinux.banking.fints.util.toBigDecimal
import net.dankito.utils.android.extensions.setTextColorToColorResource
import net.dankito.utils.android.ui.adapter.ListRecyclerAdapter
import org.slf4j.LoggerFactory

View File

@ -15,9 +15,9 @@ import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentActivity
import net.codinux.banking.fints4k.android.Presenter
import net.codinux.banking.fints4k.android.R
import net.dankito.banking.fints.model.FlickerCodeTanChallenge
import net.dankito.banking.fints.model.ImageTanChallenge
import net.dankito.banking.fints.model.TanChallenge
import net.codinux.banking.fints.model.FlickerCodeTanChallenge
import net.codinux.banking.fints.model.ImageTanChallenge
import net.codinux.banking.fints.model.TanChallenge
import net.dankito.utils.android.extensions.getSpannedFromHtml
import net.dankito.utils.android.extensions.show

View File

@ -13,12 +13,12 @@ import net.dankito.banking.client.model.CustomerAccount
import net.dankito.banking.client.model.parameter.GetAccountDataParameter
import net.dankito.banking.client.model.parameter.RetrieveTransactions
import net.dankito.banking.client.model.parameter.TransferMoneyParameter
import net.dankito.banking.fints.FinTsClient
import net.dankito.banking.fints.callback.SimpleFinTsClientCallback
import net.dankito.banking.fints.extensions.toStringWithMinDigits
import net.dankito.banking.fints.getAccountData
import net.dankito.banking.fints.model.TanChallenge
import net.dankito.banking.fints.transferMoney
import net.codinux.banking.fints.FinTsClient
import net.codinux.banking.fints.callback.SimpleFinTsClientCallback
import net.codinux.banking.fints.extensions.toStringWithMinDigits
import net.codinux.banking.fints.getAccountData
import net.codinux.banking.fints.model.TanChallenge
import net.codinux.banking.fints.transferMoney
import util.CsvWriter
import util.OutputFormat

View File

@ -1,7 +1,7 @@
package commands
import NativeApp
import net.dankito.banking.fints.model.TanMethodType
import net.codinux.banking.fints.model.TanMethodType
data class CommonConfig(

View File

@ -5,10 +5,10 @@ import com.github.ajalt.clikt.core.requireObject
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.options.option
import net.dankito.banking.client.model.parameter.TransferMoneyParameter
import net.dankito.banking.fints.model.AccountData
import net.dankito.banking.fints.model.Amount
import net.dankito.banking.fints.model.Currency
import net.dankito.banking.fints.model.Money
import net.codinux.banking.fints.model.AccountData
import net.codinux.banking.fints.model.Amount
import net.codinux.banking.fints.model.Currency
import net.codinux.banking.fints.model.Money
class TransferMoneyCommand : CliktCommand("Transfers money from your account to a recipient", name = "transfer", printHelpOnEmptyArgs = true) {

View File

@ -12,8 +12,8 @@ import kotlinx.datetime.LocalDate
import kotlinx.datetime.minus
import net.dankito.banking.client.model.parameter.GetAccountDataParameter
import net.dankito.banking.client.model.parameter.RetrieveTransactions
import net.dankito.banking.fints.model.TanMethodType
import net.dankito.banking.fints.extensions.todayAtEuropeBerlin
import net.codinux.banking.fints.model.TanMethodType
import net.codinux.banking.fints.extensions.todayAtEuropeBerlin
import util.OutputFormat

View File

@ -1,11 +1,11 @@
package net.dankito.banking.fints
package net.codinux.banking.fints
import kotlinx.coroutines.runBlocking
import net.dankito.banking.client.model.parameter.GetAccountDataParameter
import net.dankito.banking.client.model.parameter.TransferMoneyParameter
import net.dankito.banking.client.model.response.GetAccountDataResponse
import net.dankito.banking.client.model.response.TransferMoneyResponse
import net.dankito.banking.fints.model.Money
import net.codinux.banking.fints.model.Money
fun FinTsClient.getAccountData(bankCode: String, loginName: String, password: String): GetAccountDataResponse {

View File

@ -1,7 +1,7 @@
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.dankito.banking.client.model.AccountTransaction
import net.dankito.banking.fints.model.TanChallenge
import net.codinux.banking.fints.model.TanChallenge
import react.*
import react.dom.*
import styled.styledDiv

View File

@ -2,8 +2,8 @@ import io.ktor.util.encodeBase64
import kotlinx.html.InputType
import kotlinx.html.js.onChangeFunction
import kotlinx.html.style
import net.dankito.banking.fints.model.ImageTanChallenge
import net.dankito.banking.fints.model.TanChallenge
import net.codinux.banking.fints.model.ImageTanChallenge
import net.codinux.banking.fints.model.TanChallenge
import org.w3c.dom.HTMLInputElement
import react.Props
import react.RBuilder

View File

@ -6,11 +6,11 @@ import net.dankito.banking.client.model.parameter.GetAccountDataParameter
import net.dankito.banking.client.model.parameter.TransferMoneyParameter
import net.dankito.banking.client.model.response.GetAccountDataResponse
import net.dankito.banking.client.model.response.TransferMoneyResponse
import net.dankito.banking.fints.FinTsClient
import net.dankito.banking.fints.callback.SimpleFinTsClientCallback
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.webclient.KtorWebClient
import net.dankito.banking.fints.webclient.ProxyingWebClient
import net.codinux.banking.fints.FinTsClient
import net.codinux.banking.fints.callback.SimpleFinTsClientCallback
import net.codinux.banking.fints.model.*
import net.codinux.banking.fints.webclient.KtorWebClient
import net.codinux.banking.fints.webclient.ProxyingWebClient
import net.dankito.utils.multiplatform.log.LoggerFactory
open class Presenter {

View File

@ -34,7 +34,7 @@ kotlin {
browser {
testTask {
useKarma {
// useChromeHeadless()
useChromeHeadless()
useFirefoxHeadless()
}
}
@ -43,10 +43,13 @@ kotlin {
nodejs()
}
// wasmJs() // ktor is not available for wasmJs yet
linuxX64()
mingwX64()
iosX64()
iosArm64()
iosSimulatorArm64()
macosX64()

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints
package net.codinux.banking.fints
import net.dankito.banking.client.model.parameter.FinTsClientParameter
import net.dankito.banking.client.model.parameter.GetAccountDataParameter
@ -6,15 +6,15 @@ import net.dankito.banking.client.model.parameter.TransferMoneyParameter
import net.dankito.banking.client.model.response.ErrorCode
import net.dankito.banking.client.model.response.GetAccountDataResponse
import net.dankito.banking.client.model.response.TransferMoneyResponse
import net.dankito.banking.fints.callback.FinTsClientCallback
import net.dankito.banking.fints.config.FinTsClientConfiguration
import net.dankito.banking.fints.mapper.FinTsModelMapper
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.response.client.FinTsClientResponse
import net.dankito.banking.fints.response.client.GetAccountInfoResponse
import net.dankito.banking.fints.response.client.GetAccountTransactionsResponse
import net.dankito.banking.fints.response.segments.AccountType
import net.dankito.banking.fints.util.BicFinder
import net.codinux.banking.fints.callback.FinTsClientCallback
import net.codinux.banking.fints.config.FinTsClientConfiguration
import net.codinux.banking.fints.mapper.FinTsModelMapper
import net.codinux.banking.fints.model.*
import net.codinux.banking.fints.response.client.FinTsClientResponse
import net.codinux.banking.fints.response.client.GetAccountInfoResponse
import net.codinux.banking.fints.response.client.GetAccountTransactionsResponse
import net.codinux.banking.fints.response.segments.AccountType
import net.codinux.banking.fints.util.BicFinder
open class FinTsClient(
@ -175,13 +175,13 @@ open class FinTsClient(
val newUserInfoResponse = config.jobExecutor.retrieveBasicDataLikeUsersTanMethods(context, param.preferredTanMethods, param.preferredTanMedium)
/* Second dialog, executed in retrieveBasicDataLikeUsersTanMethods() if required: some banks require that in order to initialize a dialog with
strong customer authorization TAN media is required */
if (newUserInfoResponse.successful == false) { // bank parameter (FinTS server address, ...) already seem to be wrong
return GetAccountInfoResponse(context, newUserInfoResponse)
}
/* Second dialog, executed in retrieveBasicDataLikeUsersTanMethods() if required: some banks require that in order to initialize a dialog with
strong customer authorization TAN media is required */
val getAccountsResponse = config.jobExecutor.getAccounts(context)
return GetAccountInfoResponse(context, getAccountsResponse)

View File

@ -1,17 +1,16 @@
package net.dankito.banking.fints
package net.codinux.banking.fints
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.datetime.*
import net.dankito.banking.fints.callback.FinTsClientCallback
import net.dankito.banking.fints.config.FinTsClientConfiguration
import net.dankito.banking.fints.extensions.minusDays
import net.dankito.banking.fints.extensions.todayAtEuropeBerlin
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.*
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.response.BankResponse
import net.dankito.banking.fints.response.client.*
import net.dankito.banking.fints.webclient.IWebClient
import net.codinux.banking.fints.callback.FinTsClientCallback
import net.codinux.banking.fints.config.FinTsClientConfiguration
import net.codinux.banking.fints.extensions.minusDays
import net.codinux.banking.fints.extensions.todayAtEuropeBerlin
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.*
import net.codinux.banking.fints.model.*
import net.codinux.banking.fints.response.BankResponse
import net.codinux.banking.fints.response.client.*
/**
@ -26,19 +25,6 @@ open class FinTsClientDeprecated(
constructor(callback: FinTsClientCallback) : this(FinTsClientConfiguration(), callback)
/**
* Retrieves information about bank (e.g. supported HBCI versions, FinTS server address,
* supported jobs, ...).
*
* On success [bank] parameter is updated afterwards.
*/
open fun getAnonymousBankInfoAsync(bank: BankData, callback: (FinTsClientResponse) -> Unit) {
GlobalScope.launch {
callback(getAnonymousBankInfo(bank))
}
}
/**
* Retrieves information about bank (e.g. supported HBCI versions, FinTS server address,
* supported jobs, ...).

View File

@ -1,11 +1,11 @@
package net.dankito.banking.fints
package net.codinux.banking.fints
import net.dankito.banking.fints.callback.FinTsClientCallback
import net.dankito.banking.fints.config.FinTsClientConfiguration
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.response.client.AddAccountResponse
import net.dankito.banking.fints.response.client.FinTsClientResponse
import net.dankito.banking.fints.response.client.GetAccountTransactionsResponse
import net.codinux.banking.fints.callback.FinTsClientCallback
import net.codinux.banking.fints.config.FinTsClientConfiguration
import net.codinux.banking.fints.model.*
import net.codinux.banking.fints.response.client.AddAccountResponse
import net.codinux.banking.fints.response.client.FinTsClientResponse
import net.codinux.banking.fints.response.client.GetAccountTransactionsResponse
open class FinTsClientForCustomer(

View File

@ -1,26 +1,26 @@
package net.dankito.banking.fints
package net.codinux.banking.fints
import kotlinx.coroutines.delay
import kotlinx.datetime.LocalDate
import net.codinux.log.logger
import net.dankito.banking.fints.messages.MessageBuilder
import net.dankito.banking.fints.messages.MessageBuilderResult
import net.dankito.banking.fints.messages.datenelemente.implementierte.signatur.VersionDesSicherheitsverfahrens
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.*
import net.dankito.banking.fints.messages.segmente.id.CustomerSegmentId
import net.dankito.banking.fints.messages.segmente.id.ISegmentId
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.model.mapper.ModelMapper
import net.dankito.banking.fints.response.BankResponse
import net.dankito.banking.fints.response.InstituteSegmentId
import net.dankito.banking.fints.response.client.*
import net.dankito.banking.fints.response.segments.*
import net.dankito.banking.fints.tan.FlickerCodeDecoder
import net.dankito.banking.fints.tan.TanImageDecoder
import net.dankito.banking.fints.util.TanMethodSelector
import net.dankito.banking.fints.extensions.minusDays
import net.dankito.banking.fints.extensions.todayAtEuropeBerlin
import net.dankito.banking.fints.extensions.todayAtSystemDefaultTimeZone
import net.codinux.banking.fints.messages.MessageBuilder
import net.codinux.banking.fints.messages.MessageBuilderResult
import net.codinux.banking.fints.messages.datenelemente.implementierte.signatur.VersionDesSicherheitsverfahrens
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.*
import net.codinux.banking.fints.messages.segmente.id.CustomerSegmentId
import net.codinux.banking.fints.messages.segmente.id.ISegmentId
import net.codinux.banking.fints.model.*
import net.codinux.banking.fints.model.mapper.ModelMapper
import net.codinux.banking.fints.response.BankResponse
import net.codinux.banking.fints.response.InstituteSegmentId
import net.codinux.banking.fints.response.client.*
import net.codinux.banking.fints.response.segments.*
import net.codinux.banking.fints.tan.FlickerCodeDecoder
import net.codinux.banking.fints.tan.TanImageDecoder
import net.codinux.banking.fints.util.TanMethodSelector
import net.codinux.banking.fints.extensions.minusDays
import net.codinux.banking.fints.extensions.todayAtEuropeBerlin
import net.codinux.banking.fints.extensions.todayAtSystemDefaultTimeZone
/**

View File

@ -1,17 +1,18 @@
package net.dankito.banking.fints
package net.codinux.banking.fints
import net.codinux.log.logger
import net.dankito.banking.fints.messages.MessageBuilder
import net.dankito.banking.fints.messages.MessageBuilderResult
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.response.BankResponse
import net.dankito.banking.fints.response.segments.TanResponse
import net.dankito.banking.fints.util.IBase64Service
import net.dankito.banking.fints.util.PureKotlinBase64Service
import net.dankito.banking.fints.webclient.IWebClient
import net.dankito.banking.fints.webclient.KtorWebClient
import net.dankito.banking.fints.webclient.WebClientResponse
import net.dankito.banking.fints.extensions.getAllExceptionMessagesJoined
import net.codinux.banking.fints.messages.MessageBuilder
import net.codinux.banking.fints.messages.MessageBuilderResult
import net.codinux.banking.fints.model.*
import net.codinux.banking.fints.response.BankResponse
import net.codinux.banking.fints.response.segments.TanResponse
import net.codinux.banking.fints.util.IBase64Service
import net.codinux.banking.fints.util.PureKotlinBase64Service
import net.codinux.banking.fints.webclient.IWebClient
import net.codinux.banking.fints.webclient.KtorWebClient
import net.codinux.banking.fints.webclient.WebClientResponse
import net.codinux.banking.fints.extensions.getAllExceptionMessagesJoined
import net.codinux.banking.fints.response.segments.ReceivedSegment
open class RequestExecutor(
@ -104,9 +105,11 @@ open class RequestExecutor(
try {
val decodedResponse = decodeBase64Response(responseBody)
addMessageLog(context, MessageLogEntryType.Received, decodedResponse)
val parsedResponse = context.responseParser.parse(decodedResponse)
return context.responseParser.parse(decodedResponse)
addMessageLog(context, MessageLogEntryType.Received, decodedResponse, parsedResponse.receivedSegments)
return parsedResponse
} catch (e: Exception) {
logError(context, "Could not decode responseBody:\r\n'$responseBody'", e)
@ -164,8 +167,8 @@ open class RequestExecutor(
}
protected open fun addMessageLog(context: JobContext, type: MessageLogEntryType, message: String) {
context.addMessageLog(type, message)
protected open fun addMessageLog(context: JobContext, type: MessageLogEntryType, message: String, parsedSegments: List<ReceivedSegment> = emptyList()) {
context.addMessageLog(type, message, parsedSegments)
}
protected open fun logError(context: JobContext, message: String, e: Exception?) {

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.callback
package net.codinux.banking.fints.callback
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium
import net.dankito.banking.fints.model.*
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium
import net.codinux.banking.fints.model.*
interface FinTsClientCallback {
@ -27,4 +27,11 @@ interface FinTsClientCallback {
*/
suspend fun enterTanGeneratorAtc(bank: BankData, tanMedium: TanGeneratorTanMedium): EnterTanGeneratorAtcResult
/**
* Gets fired when a FinTS message get sent to bank server, a FinTS message is received from bank server or an error occurred.
*
* Be aware, in order that this message gets fired [net.codinux.banking.fints.config.FinTsClientOptions.fireCallbackOnMessageLogs] has to be set to true.
*/
fun messageLogAdded(messageLogEntry: MessageLogEntry)
}

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.callback
package net.codinux.banking.fints.callback
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium
import net.dankito.banking.fints.model.*
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium
import net.codinux.banking.fints.model.*
open class NoOpFinTsClientCallback : FinTsClientCallback {
@ -18,4 +18,8 @@ open class NoOpFinTsClientCallback : FinTsClientCallback {
return EnterTanGeneratorAtcResult.userDidNotEnterAtc()
}
override fun messageLogAdded(messageLogEntry: MessageLogEntry) {
}
}

View File

@ -1,18 +1,19 @@
package net.dankito.banking.fints.callback
package net.codinux.banking.fints.callback
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium
import net.dankito.banking.fints.model.*
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium
import net.codinux.banking.fints.model.*
open class SimpleFinTsClientCallback(
protected open val enterTan: ((tanChallenge: TanChallenge) -> Unit)? = null,
protected open val askUserForTanMethod: ((supportedTanMethods: List<TanMethod>, suggestedTanMethod: TanMethod?) -> TanMethod?)? = null,
protected open val messageLogAdded: ((MessageLogEntry) -> Unit)? = null,
protected open val enterTanGeneratorAtc: ((bank: BankData, tanMedium: TanGeneratorTanMedium) -> EnterTanGeneratorAtcResult)? = null,
protected open val askUserForTanMethod: ((supportedTanMethods: List<TanMethod>, suggestedTanMethod: TanMethod?) -> TanMethod?)? = null
protected open val enterTan: ((tanChallenge: TanChallenge) -> Unit)? = null
) : FinTsClientCallback {
constructor() : this(null) // Swift does not support default parameter values -> create constructor overloads
constructor() : this(null as ((tanChallenge: TanChallenge) -> Unit)?) // Swift does not support default parameter values -> create constructor overloads
constructor(enterTan: ((tanChallenge: TanChallenge) -> Unit)?) : this(enterTan, null)
constructor(enterTan: ((tanChallenge: TanChallenge) -> Unit)?) : this(null, null, null, enterTan)
override suspend fun askUserForTanMethod(supportedTanMethods: List<TanMethod>, suggestedTanMethod: TanMethod?): TanMethod? {
@ -28,4 +29,8 @@ open class SimpleFinTsClientCallback(
return enterTanGeneratorAtc?.invoke(bank, tanMedium) ?: EnterTanGeneratorAtcResult.userDidNotEnterAtc()
}
override fun messageLogAdded(messageLogEntry: MessageLogEntry) {
messageLogAdded?.invoke(messageLogEntry)
}
}

View File

@ -1,15 +1,15 @@
package net.dankito.banking.fints.config
package net.codinux.banking.fints.config
import net.dankito.banking.fints.FinTsJobExecutor
import net.dankito.banking.fints.RequestExecutor
import net.dankito.banking.fints.messages.MessageBuilder
import net.dankito.banking.fints.model.mapper.ModelMapper
import net.dankito.banking.fints.util.FinTsServerAddressFinder
import net.dankito.banking.fints.util.IBase64Service
import net.dankito.banking.fints.util.PureKotlinBase64Service
import net.dankito.banking.fints.util.TanMethodSelector
import net.dankito.banking.fints.webclient.IWebClient
import net.dankito.banking.fints.webclient.KtorWebClient
import net.codinux.banking.fints.FinTsJobExecutor
import net.codinux.banking.fints.RequestExecutor
import net.codinux.banking.fints.messages.MessageBuilder
import net.codinux.banking.fints.model.mapper.ModelMapper
import net.codinux.banking.fints.util.FinTsServerAddressFinder
import net.codinux.banking.fints.util.IBase64Service
import net.codinux.banking.fints.util.PureKotlinBase64Service
import net.codinux.banking.fints.util.TanMethodSelector
import net.codinux.banking.fints.webclient.IWebClient
import net.codinux.banking.fints.webclient.KtorWebClient
class FinTsClientConfiguration(
var options: FinTsClientOptions = FinTsClientOptions(),

View File

@ -0,0 +1,35 @@
package net.codinux.banking.fints.config
import net.codinux.banking.fints.model.ProductData
data class FinTsClientOptions(
/**
* If FinTS messages sent to and received from bank servers and errors should be collected. They are then accessible
* via [net.codinux.banking.fints.response.client.FinTsClientResponse.messageLog].
*
* Set to false by default.
*/
val collectMessageLog: Boolean = false,
/**
* If set to true then [net.codinux.banking.fints.callback.FinTsClientCallback.messageLogAdded] get fired when a
* FinTS message get sent to bank server, a FinTS message is received from bank server or an error occurred.
*
* Defaults to false.
*/
val fireCallbackOnMessageLogs: Boolean = false,
/**
* If sensitive data like user name, password, login name should be removed from FinTS messages before being logged.
*
* Defaults to true.
*/
val removeSensitiveDataFromMessageLog: Boolean = true,
val version: String = "1.0.0", // TODO: get version dynamically
val productName: String = "15E53C26816138699C7B6A3E8"
) {
val product: ProductData by lazy { ProductData(productName, version) }
}

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.extensions
package net.codinux.banking.fints.extensions
import kotlinx.datetime.*
import kotlin.js.JsName

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.extensions
package net.codinux.banking.fints.extensions
import kotlinx.datetime.*

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.extensions
package net.codinux.banking.fints.extensions
fun Int.toStringWithMinDigits(minimumCountDigits: Int, fillerString: Char = '0'): String {

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.extensions
package net.codinux.banking.fints.extensions
import kotlinx.datetime.Clock
import kotlin.random.Random

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.extensions
package net.codinux.banking.fints.extensions
/**

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.extensions
package net.codinux.banking.fints.extensions
fun Throwable.getAllExceptionMessagesJoined(maxDepth: Int = 5): String {

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.extensions
package net.codinux.banking.fints.extensions
import kotlinx.datetime.TimeZone

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.log
package net.codinux.banking.fints.log
import kotlin.reflect.KClass

View File

@ -0,0 +1,17 @@
package net.codinux.banking.fints.log
import net.codinux.banking.fints.model.AccountData
import net.codinux.banking.fints.model.BankData
import net.codinux.banking.fints.model.MessageType
import net.codinux.banking.fints.model.JobContextType
class MessageContext(
val jobType: JobContextType,
val dialogType: MessageType,
val jobNumber: Int,
val dialogNumber: Int,
val messageNumber: Int,
val bank: BankData,
val account: AccountData?
)

View File

@ -1,19 +1,22 @@
package net.dankito.banking.fints.log
package net.codinux.banking.fints.log
import net.codinux.log.LoggerFactory
import net.codinux.log.logger
import net.dankito.banking.fints.config.FinTsClientOptions
import net.dankito.banking.fints.model.BankData
import net.dankito.banking.fints.model.MessageLogEntry
import net.dankito.banking.fints.model.MessageLogEntryType
import net.dankito.banking.fints.extensions.getInnerException
import net.dankito.banking.fints.extensions.nthIndexOf
import net.dankito.banking.fints.extensions.toStringWithMinDigits
import net.dankito.banking.fints.util.FinTsUtils
import net.codinux.banking.fints.callback.FinTsClientCallback
import net.codinux.banking.fints.config.FinTsClientOptions
import net.codinux.banking.fints.model.BankData
import net.codinux.banking.fints.model.MessageLogEntry
import net.codinux.banking.fints.model.MessageLogEntryType
import net.codinux.banking.fints.extensions.getInnerException
import net.codinux.banking.fints.extensions.nthIndexOf
import net.codinux.banking.fints.extensions.toStringWithMinDigits
import net.codinux.banking.fints.response.segments.ReceivedSegment
import net.codinux.banking.fints.util.FinTsUtils
import kotlin.reflect.KClass
open class MessageLogCollector(
private val callback: FinTsClientCallback,
private val options: FinTsClientOptions = FinTsClientOptions(),
private val finTsUtils: FinTsUtils = FinTsUtils()
) {
@ -35,13 +38,13 @@ open class MessageLogCollector(
// in either case remove sensitive data after response is parsed as otherwise some information like account holder name and accounts may is not set yet on BankData
open val messageLog: List<MessageLogEntry>
// safe CPU cycles by only formatting and removing sensitive data if messageLog is really requested
get() = _messageLog.map { MessageLogEntry(it.type, it.context, it.messageTrace, createMessageForLog(it), it.error, it.time) }
get() = _messageLog.map { MessageLogEntry(it.type, it.context, it.messageTrace, createMessageForLog(it), it.error, it.parsedSegments, it.time) }
private fun createMessageForLog(logEntry: MessageLogEntry): String {
val message = if (logEntry.type == MessageLogEntryType.Error) {
logEntry.messageTrace + logEntry.message + (if (logEntry.error != null) NewLine + getStackTrace(logEntry.error!!) else "")
logEntry.message + (if (logEntry.error != null) NewLine + getStackTrace(logEntry.error!!) else "")
} else {
logEntry.messageTrace + "\n" + prettyPrintFinTsMessage(logEntry.message)
logEntry.message
}
return if (options.removeSensitiveDataFromMessageLog) {
@ -52,25 +55,41 @@ open class MessageLogCollector(
}
open fun addMessageLog(type: MessageLogEntryType, message: String, context: MessageContext) {
open fun addMessageLog(type: MessageLogEntryType, message: String, context: MessageContext, parsedSegments: List<ReceivedSegment> = emptyList()) {
val messageTrace = createMessageTraceString(type, context)
addMessageLogEntry(type, context, messageTrace, message)
val prettyPrintMessage = if (options.collectMessageLog || options.fireCallbackOnMessageLogs || log.isDebugEnabled) { // only use CPU cycles if message will ever be used / displayed
prettyPrintFinTsMessage(message)
} else {
message
}
log.debug { "$messageTrace\n${prettyPrintFinTsMessage(message)}" }
log.debug { "$messageTrace\n$prettyPrintMessage" }
addMessageLogEntry(type, context, messageTrace, prettyPrintMessage, null, parsedSegments)
}
open fun logError(loggingClass: KClass<*>, message: String, context: MessageContext, e: Exception? = null) {
val type = MessageLogEntryType.Error
val messageTrace = createMessageTraceString(type, context)
LoggerFactory.getLogger(loggingClass).error(e) { messageTrace + messageTrace }
LoggerFactory.getLogger(loggingClass).error(e) { messageTrace + message }
addMessageLogEntry(type, context, messageTrace, message, e)
}
protected open fun addMessageLogEntry(type: MessageLogEntryType, context: MessageContext, messageTrace: String, message: String, error: Throwable? = null) {
_messageLog.add(MessageLogEntry(type, context, messageTrace, message, error))
protected open fun addMessageLogEntry(type: MessageLogEntryType, context: MessageContext, messageTrace: String, message: String, error: Throwable? = null, parsedSegments: List<ReceivedSegment> = emptyList()) {
if (options.collectMessageLog || options.fireCallbackOnMessageLogs) {
val newEntry = MessageLogEntry(type, context, messageTrace, message, error, parsedSegments)
if (options.collectMessageLog) {
_messageLog.add(newEntry)
}
if (options.fireCallbackOnMessageLogs) {
callback.messageLogAdded(newEntry)
}
}
}
@ -88,9 +107,9 @@ open class MessageLogCollector(
protected open fun getMessageTypeString(type: MessageLogEntryType): String {
return when (type) {
MessageLogEntryType.Sent -> "Sending message"
MessageLogEntryType.Received -> "Received message"
MessageLogEntryType.Error -> "Error"
MessageLogEntryType.Sent -> "01 Sending message"
MessageLogEntryType.Received -> "02 Received message"
MessageLogEntryType.Error -> "03 Error"
}
}

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.mapper
package net.codinux.banking.fints.mapper
import kotlinx.datetime.LocalDate

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.mapper
package net.codinux.banking.fints.mapper
import kotlinx.datetime.LocalDate
import net.dankito.banking.client.model.*
@ -7,14 +7,14 @@ import net.dankito.banking.client.model.parameter.FinTsClientParameter
import net.dankito.banking.client.model.parameter.GetAccountDataParameter
import net.dankito.banking.client.model.parameter.RetrieveTransactions
import net.dankito.banking.client.model.response.ErrorCode
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Laenderkennzeichen
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.response.client.FinTsClientResponse
import net.dankito.banking.fints.response.client.GetAccountTransactionsResponse
import net.dankito.banking.fints.response.segments.AccountType
import net.dankito.banking.fints.util.BicFinder
import net.dankito.banking.fints.extensions.minusDays
import net.dankito.banking.fints.extensions.todayAtEuropeBerlin
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Laenderkennzeichen
import net.codinux.banking.fints.model.*
import net.codinux.banking.fints.response.client.FinTsClientResponse
import net.codinux.banking.fints.response.client.GetAccountTransactionsResponse
import net.codinux.banking.fints.response.segments.AccountType
import net.codinux.banking.fints.util.BicFinder
import net.codinux.banking.fints.extensions.minusDays
import net.codinux.banking.fints.extensions.todayAtEuropeBerlin
open class FinTsModelMapper {
@ -90,7 +90,7 @@ open class FinTsModelMapper {
return data.bookedTransactions.map { map(it) }
}
open fun map(transaction: net.dankito.banking.fints.model.AccountTransaction): AccountTransaction {
open fun map(transaction: net.codinux.banking.fints.model.AccountTransaction): AccountTransaction {
return AccountTransaction(transaction.amount, transaction.unparsedReference, transaction.bookingDate,
transaction.otherPartyName, transaction.otherPartyBankCode, transaction.otherPartyAccountId, transaction.bookingText, transaction.valueDate,
transaction.statementNumber, transaction.sequenceNumber, transaction.openingBalance, transaction.closingBalance,

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.messages
package net.codinux.banking.fints.messages
enum class Existenzstatus {

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.messages
package net.codinux.banking.fints.messages
import io.ktor.utils.io.charsets.Charsets

View File

@ -1,26 +1,26 @@
package net.dankito.banking.fints.messages
package net.codinux.banking.fints.messages
import net.dankito.banking.fints.extensions.randomWithSeed
import net.dankito.banking.fints.messages.datenelemente.implementierte.Aufsetzpunkt
import net.dankito.banking.fints.messages.datenelemente.implementierte.KundensystemID
import net.dankito.banking.fints.messages.datenelemente.implementierte.Synchronisierungsmodus
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanMedienArtVersion
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanMediumKlasse
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanProcess
import net.dankito.banking.fints.messages.segmente.Segment
import net.dankito.banking.fints.messages.segmente.Synchronisierung
import net.dankito.banking.fints.messages.segmente.id.CustomerSegmentId
import net.dankito.banking.fints.messages.segmente.id.ISegmentId
import net.dankito.banking.fints.messages.segmente.implementierte.*
import net.dankito.banking.fints.messages.segmente.implementierte.sepa.SepaBankTransferBase
import net.dankito.banking.fints.messages.segmente.implementierte.tan.TanGeneratorListeAnzeigen
import net.dankito.banking.fints.messages.segmente.implementierte.tan.TanGeneratorTanMediumAnOderUmmelden
import net.dankito.banking.fints.messages.segmente.implementierte.umsaetze.*
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.response.InstituteSegmentId
import net.dankito.banking.fints.response.segments.*
import net.dankito.banking.fints.util.FinTsUtils
import net.codinux.banking.fints.extensions.randomWithSeed
import net.codinux.banking.fints.messages.datenelemente.implementierte.Aufsetzpunkt
import net.codinux.banking.fints.messages.datenelemente.implementierte.KundensystemID
import net.codinux.banking.fints.messages.datenelemente.implementierte.Synchronisierungsmodus
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanMedienArtVersion
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanMediumKlasse
import net.codinux.banking.fints.messages.datenelemente.implementierte.tan.TanProcess
import net.codinux.banking.fints.messages.segmente.Segment
import net.codinux.banking.fints.messages.segmente.Synchronisierung
import net.codinux.banking.fints.messages.segmente.id.CustomerSegmentId
import net.codinux.banking.fints.messages.segmente.id.ISegmentId
import net.codinux.banking.fints.messages.segmente.implementierte.*
import net.codinux.banking.fints.messages.segmente.implementierte.sepa.SepaBankTransferBase
import net.codinux.banking.fints.messages.segmente.implementierte.tan.TanGeneratorListeAnzeigen
import net.codinux.banking.fints.messages.segmente.implementierte.tan.TanGeneratorTanMediumAnOderUmmelden
import net.codinux.banking.fints.messages.segmente.implementierte.umsaetze.*
import net.codinux.banking.fints.model.*
import net.codinux.banking.fints.response.InstituteSegmentId
import net.codinux.banking.fints.response.segments.*
import net.codinux.banking.fints.util.FinTsUtils
import kotlin.math.absoluteValue
@ -133,7 +133,7 @@ open class MessageBuilder(protected val utils: FinTsUtils = FinTsUtils()) {
}
if (context.bank.customerSystemId == KundensystemID.Anonymous) {
segments.add(Synchronisierung(segments.size + 3, Synchronisierungsmodus.NeueKundensystemIdZurueckmelden))
segments.add(Synchronisierung(SignedMessagePayloadFirstSegmentNumber + segments.size, Synchronisierungsmodus.NeueKundensystemIdZurueckmelden))
}
return createSignedMessageBuilderResult(context, MessageType.DialogInit, segments)
@ -394,7 +394,7 @@ open class MessageBuilder(protected val utils: FinTsUtils = FinTsUtils()) {
return createSignedMessage(context, null, payloadSegments)
}
open fun createSignedMessage(context: JobContext, tan: String? = null, payloadSegments: List<Segment>): String {
protected open fun createSignedMessage(context: JobContext, tan: String? = null, payloadSegments: List<Segment>): String {
val date = utils.formatDateTodayAsInt()
val time = utils.formatTimeNowAsInt()
@ -406,7 +406,7 @@ open class MessageBuilder(protected val utils: FinTsUtils = FinTsUtils()) {
return createMessage(context, encryptedPayload, payloadSegments.size)
}
open fun createMessage(context: JobContext, payloadSegments: List<Segment>, countWrappedSegments: Int = 0): String {
protected open fun createMessage(context: JobContext, payloadSegments: List<Segment>, countWrappedSegments: Int = 0): String {
val dialog = context.dialog
dialog.increaseMessageNumber()
@ -536,8 +536,7 @@ open class MessageBuilder(protected val utils: FinTsUtils = FinTsUtils()) {
}
protected open fun isTanRequiredForJob(context: JobContext, segmentId: CustomerSegmentId): Boolean {
return context.bank.pinInfo?.jobTanConfiguration?.first { it.segmentId == segmentId.id }?.tanRequired
?: false // TODO: actually in this case it's not allowed to execute job via PIN/TAN at all
return context.bank.doesJobRequireTan(segmentId)
}
protected open fun getSepaUrnFor(segmentId: CustomerSegmentId, bank: BankData, sepaDataFormat: String): String? {

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages
package net.codinux.banking.fints.messages
import net.dankito.banking.fints.messages.segmente.Segment
import net.dankito.banking.fints.messages.segmente.implementierte.ZweiSchrittTanEinreichung
import net.codinux.banking.fints.messages.segmente.Segment
import net.codinux.banking.fints.messages.segmente.implementierte.ZweiSchrittTanEinreichung
open class MessageBuilderResult(

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages
package net.codinux.banking.fints.messages
import net.dankito.banking.fints.util.MessageUtils
import net.codinux.banking.fints.util.MessageUtils
abstract class Nachrichtenteil(protected val messageUtils: MessageUtils = MessageUtils()) {

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.messages
package net.codinux.banking.fints.messages
class Separators {

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente
package net.codinux.banking.fints.messages.datenelemente
import net.dankito.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.Existenzstatus
abstract class Datenelement(existenzstatus: Existenzstatus): DatenelementBase(existenzstatus) {

View File

@ -0,0 +1,7 @@
package net.codinux.banking.fints.messages.datenelemente
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.Nachrichtenteil
abstract class DatenelementBase(val existenzstatus: Existenzstatus) : Nachrichtenteil()

View File

@ -1,8 +1,8 @@
package net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate
package net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.dankito.banking.fints.messages.datenelemente.implementierte.ICodeEnum
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.codinux.banking.fints.messages.datenelemente.implementierte.ICodeEnum
/**

View File

@ -1,10 +1,10 @@
package net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate
package net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate
import kotlinx.datetime.LocalDate
import net.codinux.log.logger
import net.dankito.banking.fints.extensions.toStringWithMinDigits
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.extensions.toStringWithMinDigits
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate
package net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate
package net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate
package net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.ZiffernDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.ZiffernDatenelement
/**

View File

@ -1,10 +1,10 @@
package net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate
package net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate
import kotlinx.datetime.LocalTime
import net.codinux.log.logger
import net.dankito.banking.fints.extensions.toStringWithMinDigits
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.ZiffernDatenelement
import net.codinux.banking.fints.extensions.toStringWithMinDigits
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.ZiffernDatenelement
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.basisformate
package net.codinux.banking.fints.messages.datenelemente.basisformate
import net.dankito.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.Existenzstatus
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.basisformate
package net.codinux.banking.fints.messages.datenelemente.basisformate
import net.dankito.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.Existenzstatus
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.basisformate
package net.codinux.banking.fints.messages.datenelemente.basisformate
import net.dankito.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.Existenzstatus
/**

View File

@ -1,11 +1,11 @@
package net.dankito.banking.fints.messages.datenelemente.basisformate
package net.codinux.banking.fints.messages.datenelemente.basisformate
import io.ktor.utils.io.charsets.encode
import io.ktor.utils.io.charsets.name
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.HbciCharset
import net.dankito.banking.fints.messages.Separators
import net.dankito.banking.fints.messages.datenelemente.Datenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.HbciCharset
import net.codinux.banking.fints.messages.Separators
import net.codinux.banking.fints.messages.datenelemente.Datenelement
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.basisformate
package net.codinux.banking.fints.messages.datenelemente.basisformate
import net.dankito.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.Existenzstatus
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
/**

View File

@ -0,0 +1,6 @@
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.codinux.banking.fints.messages.Existenzstatus
open class BezugssegmentInKreditinstitutsnachricht(segmentNumber: Int) : Bezugssegment(segmentNumber, Existenzstatus.Optional)

View File

@ -0,0 +1,6 @@
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.codinux.banking.fints.messages.Existenzstatus
open class BezugssegmentInKundennachricht(segmentNumber: Int) : Bezugssegment(segmentNumber, Existenzstatus.NotAllowed)

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
/**

View File

@ -0,0 +1,21 @@
package net.codinux.banking.fints.messages.datenelemente.implementierte
enum class Dialogsprache(override val code: String) : ICodeEnum {
/**
* Der Kunde darf lediglich ein Sprachkennzeichen einstellen, das im Rahmen
* der BPD vom Kreditinstitut an das Kundensystem übermittelt wurde.
* Wenn noch keine BPD vorliegen, sollte das Kundenprodukt mit Hilfe eines
* anonymen Dialogs die aktuelle BPD des Instituts ermitteln und die Standardsprache des Instituts einstellen, die in den Bankparameterdaten mitgeteilt
* wird. Falls die BPD nicht abgerufen werden kann, ist der Wert 0 einzustellen. Das Kreditinstitut antwortet in diesem Fall in seiner Standardsprache.
*/
Default("0"),
German("1"),
English("2"),
French("3")
}

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Code
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.TextDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.TextDatenelement
/**

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
enum class HbciVersion(val versionNumber: Int, override val code: String) : ICodeEnum {

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
/**

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
inline fun <reified T : Enum<T>> allCodes(): List<String> {

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Code
/**

View File

@ -0,0 +1,21 @@
package net.codinux.banking.fints.messages.datenelemente.implementierte
/**
* Information darüber, ob die Kundensystem-ID erforderlich ist.
*/
enum class KundensystemStatusWerte(override val code: String) : ICodeEnum {
/**
* Kundensystem-ID wird nicht benötigt (HBCI DDV-Verfahren und
* chipkartenbasierte Verfahren ab Sicherheitsprofil-Version 3)
* und PinTan bis über HKSYN eine Kundensystem-ID vom Bankserver abgerufen wurde.
*/
NichtBenoetigt("0"),
/**
* Kundensystem-ID wird benötigt (sonstige HBCI RAH- /
* RDH- und PIN/TAN-Verfahren)
*/
Benoetigt("1")
}

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.ZiffernDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.ZiffernDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
/**

View File

@ -0,0 +1,7 @@
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.TextDatenelement
open class NotAllowedDatenelement : TextDatenelement("", Existenzstatus.NotAllowed)

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
/**

View File

@ -1,4 +1,4 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
enum class Synchronisierungsmodus(override val code: String) : ICodeEnum {

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Code
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte
package net.codinux.banking.fints.messages.datenelemente.implementierte
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.account
package net.codinux.banking.fints.messages.datenelemente.implementierte.account
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.JaNein
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.JaNein
/**

View File

@ -0,0 +1,7 @@
package net.codinux.banking.fints.messages.datenelemente.implementierte.account
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
open class BIC(bic: String, existenzstatus: Existenzstatus) : AlphanumerischesDatenelement(bic, existenzstatus, 11)

View File

@ -0,0 +1,7 @@
package net.codinux.banking.fints.messages.datenelemente.implementierte.account
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement
open class IBAN(iban: String, existenzstatus: Existenzstatus) : AlphanumerischesDatenelement(iban, existenzstatus, 34)

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.account
package net.codinux.banking.fints.messages.datenelemente.implementierte.account
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
/**

View File

@ -1,8 +1,8 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.account
package net.codinux.banking.fints.messages.datenelemente.implementierte.account
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.dankito.banking.fints.model.GetAccountTransactionsParameter
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.NumerischesDatenelement
import net.codinux.banking.fints.model.GetAccountTransactionsParameter
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.account
package net.codinux.banking.fints.messages.datenelemente.implementierte.account
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Identifikation
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.datenelemente.implementierte.ICodeEnum
import net.codinux.banking.fints.messages.datenelemente.implementierte.ICodeEnum
enum class BezeichnerFuerAlgorithmusparameterIV(override val code: String) : ICodeEnum {

View File

@ -1,8 +1,8 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.dankito.banking.fints.messages.datenelemente.implementierte.allCodes
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.codinux.banking.fints.messages.datenelemente.implementierte.allCodes
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.datenelemente.implementierte.ICodeEnum
import net.codinux.banking.fints.messages.datenelemente.implementierte.ICodeEnum
enum class BezeichnerFuerAlgorithmusparameterSchluessel(override val code: String) : ICodeEnum {

View File

@ -1,8 +1,8 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.dankito.banking.fints.messages.datenelemente.implementierte.allCodes
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.codinux.banking.fints.messages.datenelemente.implementierte.allCodes
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.datenelemente.implementierte.ICodeEnum
import net.codinux.banking.fints.messages.datenelemente.implementierte.ICodeEnum
enum class Komprimierungsfunktion(val abbreviation: String, override val code: String) : ICodeEnum {

View File

@ -1,8 +1,8 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.dankito.banking.fints.messages.datenelemente.implementierte.allCodes
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.codinux.banking.fints.messages.datenelemente.implementierte.allCodes
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.BinaerDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.BinaerDatenelement
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.datenelemente.implementierte.ICodeEnum
import net.codinux.banking.fints.messages.datenelemente.implementierte.ICodeEnum
enum class Verschluesselungsalgorithmus(override val code: String) : ICodeEnum {

View File

@ -1,8 +1,8 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.dankito.banking.fints.messages.datenelemente.implementierte.allCodes
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.codinux.banking.fints.messages.datenelemente.implementierte.allCodes
/**

View File

@ -1,6 +1,6 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.datenelemente.implementierte.ICodeEnum
import net.codinux.banking.fints.messages.datenelemente.implementierte.ICodeEnum
enum class VerwendungDesVerschluesselungsalgorithmus(override val code: String) : ICodeEnum {

View File

@ -1,8 +1,8 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.dankito.banking.fints.messages.datenelemente.implementierte.allCodes
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.abgeleiteteformate.Code
import net.codinux.banking.fints.messages.datenelemente.implementierte.allCodes
/**

View File

@ -1,7 +1,7 @@
package net.dankito.banking.fints.messages.datenelemente.implementierte.encryption
package net.codinux.banking.fints.messages.datenelemente.implementierte.encryption
import net.dankito.banking.fints.messages.Existenzstatus
import net.dankito.banking.fints.messages.datenelemente.basisformate.BinaerDatenelement
import net.codinux.banking.fints.messages.Existenzstatus
import net.codinux.banking.fints.messages.datenelemente.basisformate.BinaerDatenelement
/**

Some files were not shown because too many files have changed in this diff Show More