diff --git a/build.gradle b/build.gradle index 9b90350c..04c0cd88 100644 --- a/build.gradle +++ b/build.gradle @@ -122,8 +122,4 @@ allprojects { group 'net.dankito.banking' version appVersionName -} - -task clean(type: Delete) { - delete rootProject.buildDir } \ No newline at end of file diff --git a/fints4k/build.gradle b/fints4k/build.gradle index e3d5932d..38a11243 100644 --- a/fints4k/build.gradle +++ b/fints4k/build.gradle @@ -22,6 +22,22 @@ kotlin { android() + js() { + + nodejs { + testTask { + enabled = false + } + } + + browser { + testTask { + enabled = false + } + + } + } + sourceSets { commonMain { @@ -37,7 +53,7 @@ kotlin { api "com.soywiz.korlibs.klock:klock:$klockVersion" - api("com.ionspin.kotlin:bignum:$bigNumVersion") + api "com.ionspin.kotlin:bignum:$bigNumVersion" implementation "com.benasher44:uuid:$uuidVersion" } @@ -48,11 +64,6 @@ kotlin { implementation kotlin("test-common") implementation kotlin("test-annotations-common") - - implementation project(":BankingUiCommon") - implementation project(":BankFinder") - implementation project(":fints4kBankingClient") - implementation "ch.tutteli.atrium:atrium-fluent-en_GB:$atriumVersion" } } @@ -81,6 +92,13 @@ kotlin { implementation "org.assertj:assertj-core:$assertJVersion" implementation "org.mockito:mockito-core:$mockitoVersion" + implementation "ch.tutteli.atrium:atrium-fluent-en_GB-jvm:$atriumVersion" + + + implementation project(":BankingUiCommon") + implementation project(":BankFinder") + implementation project(":fints4kBankingClient") + implementation "org.apache.commons:commons-csv:1.8" @@ -98,6 +116,32 @@ kotlin { } } + + jsMain { + dependsOn commonMain + + dependencies { + api kotlin("stdlib-js") + + implementation "io.ktor:ktor-client-js:$ktorVersion" + implementation "io.ktor:ktor-client-encoding-js:$ktorVersion" + implementation "io.ktor:ktor-client-js-kotlinMultiplatform:$ktorVersion" + + + implementation "com.soywiz.korlibs.klock:klock-js:$klockVersion" + + implementation "com.ionspin.kotlin:bignum-js:$bigNumVersion" + } + } + + jsTest { + dependencies { + implementation kotlin("test-js") + + implementation "ch.tutteli.atrium:atrium-fluent-en_GB-js:$atriumVersion" + } + } + } } diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/Datenelement.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/Datenelement.kt index 363574c4..9fca8069 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/Datenelement.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/Datenelement.kt @@ -13,13 +13,11 @@ abstract class Datenelement(existenzstatus: Existenzstatus): DatenelementBase(ex || existenzstatus == Existenzstatus.Optional && isValueSet - @Throws(IllegalArgumentException::class) abstract fun validate() - @Throws(IllegalArgumentException::class) protected fun throwValidationException(message: String) { - throw IllegalArgumentException("Daten von ${javaClass.simpleName} sind ungültig: $message") + throw IllegalArgumentException("Daten von ${this::class.simpleName} sind ungültig: $message") } } \ No newline at end of file diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/AlphanumerischesDatenelement.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/AlphanumerischesDatenelement.kt index 2af2e551..717be392 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/AlphanumerischesDatenelement.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/AlphanumerischesDatenelement.kt @@ -6,7 +6,7 @@ import net.dankito.banking.fints.messages.Existenzstatus /** * Es gilt der FinTS-Basiszeichensatz ohne die Zeichen CR und LF. */ -open class AlphanumerischesDatenelement @JvmOverloads constructor( +open class AlphanumerischesDatenelement( alphanumericValue: String?, existenzstatus: Existenzstatus, val maxLength: Int? = null ) : TextDatenelement(alphanumericValue, existenzstatus) { diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/BinaerDatenelement.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/BinaerDatenelement.kt index 611f6d66..22af4dbe 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/BinaerDatenelement.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/BinaerDatenelement.kt @@ -9,11 +9,12 @@ import net.dankito.banking.fints.messages.Existenzstatus * für binäre Daten keine Gültigkeit besitzt. Ferner gelten die speziellen Syntaxregeln für * binäre Daten (s. Kap. H.1.3). */ -open class BinaerDatenelement @JvmOverloads constructor(data: String?, existenzstatus: Existenzstatus, val maxLength: Int? = null) +open class BinaerDatenelement(data: String?, existenzstatus: Existenzstatus, val maxLength: Int? = null) : TextDatenelement(data, existenzstatus) { - @JvmOverloads constructor(data: ByteArray, existenzstatus: Existenzstatus, maxLength: Int? = null) : - this(String(data), existenzstatus, maxLength) + @OptIn(ExperimentalStdlibApi::class) + constructor(data: ByteArray, existenzstatus: Existenzstatus, maxLength: Int? = null) : + this(data.decodeToString(), existenzstatus, maxLength) // TODO: is this correct? /** diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/NumerischesDatenelement.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/NumerischesDatenelement.kt index dc245d33..12c35eff 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/NumerischesDatenelement.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/NumerischesDatenelement.kt @@ -14,7 +14,12 @@ open class NumerischesDatenelement(val number: Int?, val numberOfDigits: Int, ex super.validate() if (writeToOutput && number != null) { // if number is null and number has to be written to output then validation already fails above - val maxValue = Math.pow(10.0, numberOfDigits.toDouble()) - 1 + // can't believe it, there's no Math.pow() in Kotlin multiplatform + var maxValue = 1 + IntRange(1, numberOfDigits).forEach { + maxValue *= 10 + } + maxValue -= 1 if (number < 0 || number > maxValue) { throwValidationException("Wert '$number' muss im Wertebereich von 0 - $maxValue liegen.") diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/ZiffernDatenelement.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/ZiffernDatenelement.kt index 04f7a19b..2146c0b2 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/ZiffernDatenelement.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelemente/basisformate/ZiffernDatenelement.kt @@ -10,8 +10,15 @@ abstract class ZiffernDatenelement(value: Int?, numberOfDigits: Int, existenzsta : NumerischesDatenelement(value, numberOfDigits, existenzstatus) { + @OptIn(ExperimentalStdlibApi::class) override fun formatValue(value: String): String { - return String.format("%0${numberOfDigits}d", number) + val formatted = StringBuilder("" + number) + + while (formatted.length < numberOfDigits) { + formatted.insert(0, '0') + } + + return formatted.toString() } } \ No newline at end of file diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/Kreditinstitutskennung.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/Kreditinstitutskennung.kt index 8eeae526..9fb02442 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/Kreditinstitutskennung.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/Kreditinstitutskennung.kt @@ -6,7 +6,7 @@ import net.dankito.banking.fints.messages.datenelemente.implementierte.Kreditins import net.dankito.banking.fints.messages.datenelementgruppen.Datenelementgruppe -open class Kreditinstitutskennung @JvmOverloads constructor( +open class Kreditinstitutskennung( val bankCountryCode: Int, val bankCode: String, existenzstatus: Existenzstatus = Existenzstatus.Mandatory diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/Segmentkopf.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/Segmentkopf.kt index f1f139e1..c75ce2dd 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/Segmentkopf.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/Segmentkopf.kt @@ -8,7 +8,7 @@ import net.dankito.banking.fints.messages.datenelementgruppen.Datenelementgruppe import net.dankito.banking.fints.messages.segmente.id.ISegmentId -open class Segmentkopf @JvmOverloads constructor( +open class Segmentkopf( identifier: String, segmentVersion: Int, segmentNumber: Int = 0, diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/signatur/BenutzerdefinierteSignatur.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/signatur/BenutzerdefinierteSignatur.kt index 17b5fb8f..e580d3fa 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/signatur/BenutzerdefinierteSignatur.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/datenelementgruppen/implementierte/signatur/BenutzerdefinierteSignatur.kt @@ -30,7 +30,7 @@ import net.dankito.banking.fints.messages.datenelementgruppen.Datenelementgruppe * des Sicherheitsverfahrens HBCI darf die DEG nicht belegt werden. Ihr Inhalt wird * in diesem Fall ignoriert. */ -open class BenutzerdefinierteSignatur @JvmOverloads constructor(pin: String, tan: String? = null) +open class BenutzerdefinierteSignatur(pin: String, tan: String? = null) : Datenelementgruppe(listOf( PinOrTan(pin, Existenzstatus.Mandatory), PinOrTan(tan, Existenzstatus.Optional) diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/segmente/implementierte/Signaturabschluss.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/segmente/implementierte/Signaturabschluss.kt index b58d2d7d..cc84cd58 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/segmente/implementierte/Signaturabschluss.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/messages/segmente/implementierte/Signaturabschluss.kt @@ -12,7 +12,7 @@ import net.dankito.banking.fints.messages.segmente.id.MessageSegmentId * Der Signaturabschluss stellt die Verbindung mit dem dazugehörigen Signaturkopf * her und enthält als "Validierungsresultat" die elektronische Signatur. */ -open class Signaturabschluss @JvmOverloads constructor( +open class Signaturabschluss( segmentNumber: Int, securityControlReference: String, pin: String, diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/response/Response.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/response/Response.kt index 803f5d0e..62d6a9d9 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/response/Response.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/response/Response.kt @@ -113,7 +113,7 @@ open class Response( override fun toString(): String { - val formattedResponse = receivedResponse?.replace(Separators.SegmentSeparator, System.lineSeparator()) ?: "" + val formattedResponse = receivedResponse?.replace(Separators.SegmentSeparator, "\r\n") ?: "" if (successful) { return formattedResponse diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/util/log/LoggerFactory.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/util/log/LoggerFactory.kt index 3d695f7f..d1f63956 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/util/log/LoggerFactory.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/util/log/LoggerFactory.kt @@ -15,7 +15,7 @@ class LoggerFactory { } fun getLogger(kClass: KClass<*>): Logger { - return getLogger(kClass.qualifiedName ?: kClass.toString()) + return getLogger(kClass.simpleName ?: kClass.toString()) // TODO: use qualifiedName on JVM } } diff --git a/fints4k/src/jsMain/resources/index.html b/fints4k/src/jsMain/resources/index.html new file mode 100644 index 00000000..2a9152e2 --- /dev/null +++ b/fints4k/src/jsMain/resources/index.html @@ -0,0 +1,12 @@ + + + + + fints4k + + + + + + + \ No newline at end of file diff --git a/fints4k/src/jsMain/resources/webpack.config.d/webpack.config.js b/fints4k/src/jsMain/resources/webpack.config.d/webpack.config.js new file mode 100644 index 00000000..b59596e7 --- /dev/null +++ b/fints4k/src/jsMain/resources/webpack.config.d/webpack.config.js @@ -0,0 +1,5 @@ +config.output = config.output || {} +config.output.library = "fints" + +config.devServer = config.devServer || {} +config.devServer.port = 3001 \ No newline at end of file