Fixed that mapped TAN media und procedures got discarded and replaced by new instances and therefore inserted another time into database resulting in duplicates

This commit is contained in:
dankito 2020-09-16 15:03:03 +02:00
parent de20ae4a98
commit f62f30dd8e
1 changed files with 20 additions and 2 deletions

View File

@ -8,6 +8,7 @@ import net.dankito.banking.ui.model.responses.BankingClientResponse
import net.dankito.banking.ui.model.responses.GetTransactionsResponse import net.dankito.banking.ui.model.responses.GetTransactionsResponse
import net.dankito.banking.ui.model.tan.* import net.dankito.banking.ui.model.tan.*
import net.dankito.banking.fints.messages.datenelemente.implementierte.signatur.Sicherheitsfunktion import net.dankito.banking.fints.messages.datenelemente.implementierte.signatur.Sicherheitsfunktion
import net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanMediumKlasse
import net.dankito.banking.fints.model.AccountData import net.dankito.banking.fints.model.AccountData
import net.dankito.banking.fints.model.AccountFeature import net.dankito.banking.fints.model.AccountFeature
import net.dankito.banking.fints.model.BankData import net.dankito.banking.fints.model.BankData
@ -244,7 +245,9 @@ open class fints4kModelMapper(protected val modelCreator: IModelCreator) {
open fun updateTanMediaAndProcedures(account: TypedCustomer, bank: BankData) { open fun updateTanMediaAndProcedures(account: TypedCustomer, bank: BankData) {
account.supportedTanProcedures = mapTanProcedures(bank.tanProceduresAvailableForUser) account.supportedTanProcedures = bank.tanProceduresAvailableForUser.map { tanProcedure ->
findMappedTanProcedure(account, tanProcedure) ?: mapTanProcedure(tanProcedure)
}
if (bank.isTanProcedureSelected) { if (bank.isTanProcedureSelected) {
account.selectedTanProcedure = findMappedTanProcedure(account, bank.selectedTanProcedure) account.selectedTanProcedure = findMappedTanProcedure(account, bank.selectedTanProcedure)
@ -253,7 +256,9 @@ open class fints4kModelMapper(protected val modelCreator: IModelCreator) {
account.selectedTanProcedure = null account.selectedTanProcedure = null
} }
account.tanMedia = mapTanMedia(bank.tanMedia) account.tanMedia = bank.tanMedia.map { tanMedium ->
findMappedTanMedium(account, tanMedium) ?: mapTanMedium(tanMedium)
}
} }
@ -305,6 +310,19 @@ open class fints4kModelMapper(protected val modelCreator: IModelCreator) {
return bank.tanProceduresAvailableForUser.firstOrNull { it.securityFunction.code == tanProcedure.bankInternalProcedureCode } return bank.tanProceduresAvailableForUser.firstOrNull { it.securityFunction.code == tanProcedure.bankInternalProcedureCode }
} }
protected open fun findMappedTanMedium(customer: TypedCustomer, tanMedium: net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanMedium): TanMedium? {
return customer.tanMedia.firstOrNull { doesMatchTanMedium(tanMedium, it) }
}
protected open fun doesMatchTanMedium(fintsTanMedium: net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanMedium, tanMedium: TanMedium): Boolean {
return when (fintsTanMedium.mediumClass) {
TanMediumKlasse.TanGenerator -> tanMedium is TanGeneratorTanMedium && tanMedium.cardNumber == (fintsTanMedium as? net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanGeneratorTanMedium)?.cardNumber
TanMediumKlasse.MobiltelefonMitMobileTan -> tanMedium is MobilePhoneTanMedium && (tanMedium.phoneNumber == (fintsTanMedium as? net.dankito.banking.fints.messages.datenelemente.implementierte.tan.MobilePhoneTanMedium)?.phoneNumber ||
tanMedium.phoneNumber == (fintsTanMedium as? net.dankito.banking.fints.messages.datenelemente.implementierte.tan.MobilePhoneTanMedium)?.concealedPhoneNumber)
else -> tanMedium.displayName == fintsTanMedium.mediumClass.name
}
}
open fun mapTanMedia(tanMediums: List<net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanMedium>): List<TanMedium> { open fun mapTanMedia(tanMediums: List<net.dankito.banking.fints.messages.datenelemente.implementierte.tan.TanMedium>): List<TanMedium> {
return tanMediums.map { mapTanMedium(it) } return tanMediums.map { mapTanMedium(it) }