From ecf930fcadaba01a3aeeb44402bfef8259edd6fd Mon Sep 17 00:00:00 2001 From: dankito Date: Tue, 15 Oct 2024 09:29:52 +0200 Subject: [PATCH] Fixed that quantity is a floating point number --- .../fints/transactions/swift/Mt535Parser.kt | 2 +- .../fints/transactions/swift/model/Holding.kt | 2 +- .../transactions/swift/Mt535ParserTest.kt | 56 +++++++++++++++++-- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/fints4k/src/commonMain/kotlin/net/codinux/banking/fints/transactions/swift/Mt535Parser.kt b/fints4k/src/commonMain/kotlin/net/codinux/banking/fints/transactions/swift/Mt535Parser.kt index 55a43b65..59f5f559 100644 --- a/fints4k/src/commonMain/kotlin/net/codinux/banking/fints/transactions/swift/Mt535Parser.kt +++ b/fints4k/src/commonMain/kotlin/net/codinux/banking/fints/transactions/swift/Mt535Parser.kt @@ -145,7 +145,7 @@ open class Mt535Parser( val (marketValue, pricingTime, totalCostPrice) = parseMarketValue(holdingBlock) val balance = portfolioValue?.first ?: (if (balanceIsQuantity == false) Amount(totalBalance) else null) - val quantity = if (balanceIsQuantity) totalBalance.replace(",", "").toIntOrNull() else null + val quantity = if (balanceIsQuantity) totalBalance.replace(",", ".").toDoubleOrNull() else null Holding(name, isin, wkn, buyingDate, quantity, averageCostPrice, balance, portfolioValue?.second ?: averageCostPriceCurrency, marketValue, pricingTime, totalCostPrice) } catch (e: Throwable) { diff --git a/fints4k/src/commonMain/kotlin/net/codinux/banking/fints/transactions/swift/model/Holding.kt b/fints4k/src/commonMain/kotlin/net/codinux/banking/fints/transactions/swift/model/Holding.kt index 87e7e3d8..dfd75adb 100644 --- a/fints4k/src/commonMain/kotlin/net/codinux/banking/fints/transactions/swift/model/Holding.kt +++ b/fints4k/src/commonMain/kotlin/net/codinux/banking/fints/transactions/swift/model/Holding.kt @@ -11,7 +11,7 @@ data class Holding( val isin: String?, val wkn: String?, val buyingDate: LocalDate?, - val quantity: Int?, + val quantity: Double?, /** * (Durchschnittlicher) Einstandspreis/-kurs einer Einheit des Wertpapiers */ diff --git a/fints4k/src/commonTest/kotlin/net/codinux/banking/fints/transactions/swift/Mt535ParserTest.kt b/fints4k/src/commonTest/kotlin/net/codinux/banking/fints/transactions/swift/Mt535ParserTest.kt index a1bf42d7..e3212aa0 100644 --- a/fints4k/src/commonTest/kotlin/net/codinux/banking/fints/transactions/swift/Mt535ParserTest.kt +++ b/fints4k/src/commonTest/kotlin/net/codinux/banking/fints/transactions/swift/Mt535ParserTest.kt @@ -22,8 +22,19 @@ class Mt535ParserTest { assertSize(2, statement.holdings) - assertHolding(statement.holdings.first(), "MUL AMUN MSCI WLD ETF ACC MUL Amundi MSCI World V", "LU1781541179", null, LocalDate(2024, 6, 3), 1693, "16,828250257", "18531,08") - assertHolding(statement.holdings[1], "NVIDIA CORP. DL-,001 NVIDIA Corp.", "US67066G1040", null, LocalDate(2024, 8, 5), 214, "92,86", "22846,64") + assertHolding(statement.holdings.first(), "MUL AMUN MSCI WLD ETF ACC MUL Amundi MSCI World V", "LU1781541179", null, LocalDate(2024, 6, 3), 1693.0, "16,828250257", "18531,08") + assertHolding(statement.holdings[1], "NVIDIA CORP. DL-,001 NVIDIA Corp.", "US67066G1040", null, LocalDate(2024, 8, 5), 214.0, "92,86", "22846,64") + } + + @Test + fun quantityIsFloatingPointNumber() { + val result = underTest.parseMt535String(QuantityIsFloatingPointNumber) + + val statement = assertStatement(result, "70033100", "0123456789", "21480,38", LocalDate(2024, 10, 15), LocalDate(2024, 10, 15)) + + assertSize(1, statement.holdings) + + assertHolding(statement.holdings.first(), "SAP SE O.N. SAP SE", "DE0007164600", null, LocalDate(2024, 10, 4), 100.446, "199,090257451", "21480,38") } @Test @@ -46,8 +57,8 @@ class Mt535ParserTest { assertSize(3, statement.holdings) - assertHolding(statement.holdings.first(), "/DE/123456 Mustermann AG, Stammaktien", "DE0123456789", null, LocalDate(1999, 8, 15), 100, "68,5", "5270,") - assertHolding(statement.holdings[1], "/DE/123457 Mustermann AG, Vorzugsaktien", "DE0123456790", null, LocalDate(1998, 10, 13), 100, "42,75", "5460,") + assertHolding(statement.holdings.first(), "/DE/123456 Mustermann AG, Stammaktien", "DE0123456789", null, LocalDate(1999, 8, 15), 100.0, "68,5", "5270,") + assertHolding(statement.holdings[1], "/DE/123457 Mustermann AG, Vorzugsaktien", "DE0123456790", null, LocalDate(1998, 10, 13), 100.0, "42,75", "5460,") // TODO: these values are not correct. Implement taking foreign currencies into account to fix this assertHolding(statement.holdings[2], "Australian Domestic Bonds 1993 (2003) Ser. 10", "AU9876543210", null, LocalDate(1999, 3, 15), null, "31", "6294,65") } @@ -71,7 +82,7 @@ class Mt535ParserTest { return statement } - private fun assertHolding(holding: Holding, name: String, isin: String?, wkn: String?, buyingDate: LocalDate?, quantity: Int?, averagePrice: String?, balance: String?, currency: String? = "EUR") { + private fun assertHolding(holding: Holding, name: String, isin: String?, wkn: String?, buyingDate: LocalDate?, quantity: Double?, averagePrice: String?, balance: String?, currency: String? = "EUR") { assertEquals(name, holding.name) assertEquals(isin, holding.isin) @@ -140,6 +151,41 @@ class Mt535ParserTest { - """.trimIndent() + private val QuantityIsFloatingPointNumber = """ + :16R:GENL + :28E:1/ONLY + :20C::SEME//NONREF + :23G:NEWM + :98A::PREP//20241015 + :98A::STAT//20241015 + :22F::STTY//CUST + :97A::SAFE//70033100/0123456789 + :17B::ACTI//Y + :16S:GENL + + :16R:FIN + :35B:ISIN DE0007164600 + SAP SE O.N. + SAP SE + :93B::AGGR//UNIT/100,446 + :16R:SUBBAL + :93C::TAVI//UNIT/AVAI/100,446 + :70C::SUBB//1 SAP SE O.N. + 2 + 3 EDE 213.850000000EUR 2024-10-15T09:03:25.4 + 4 19997.82EUR DE0007164600, 1/SHS + :16S:SUBBAL + :19A::HOLD//EUR21480,38 + :70E::HOLD//1STK++++20241004+ + 2199,090257451+EUR + :16S:FIN + + :16R:ADDINFO + :19A::HOLP//EUR21480,38 + :16S:ADDINFO + -' + """.trimIndent() + /** * See Anlage_3_Datenformate_V3.8, S. 317ff *