Added DialogData to keep track of dialog information like next message number

This commit is contained in:
dankl 2019-10-05 16:38:16 +02:00 committed by dankito
parent b4ba9a0bcf
commit 498aa139c6
5 changed files with 35 additions and 13 deletions

View File

@ -1,6 +1,5 @@
package net.dankito.fints.messages
import net.dankito.fints.messages.datenelemente.implementierte.Nachrichtennummer
import net.dankito.fints.messages.datenelemente.implementierte.tan.TanProcess
import net.dankito.fints.messages.nachrichten.Nachricht
import net.dankito.fints.messages.segmente.ISegmentNumberGenerator
@ -9,6 +8,7 @@ import net.dankito.fints.messages.segmente.SegmentNumberGenerator
import net.dankito.fints.messages.segmente.implementierte.*
import net.dankito.fints.model.BankData
import net.dankito.fints.model.CustomerData
import net.dankito.fints.model.DialogData
import net.dankito.fints.model.ProductData
import net.dankito.fints.util.FinTsUtils
@ -43,7 +43,7 @@ open class MessageBuilder(protected val generator: ISegmentNumberGenerator = Seg
val customer = CustomerData.Anonymous
return createMessage(false, false, bank, customer, listOf(
return createMessage(false, false, bank, customer, DialogData.DialogInitDialogData, listOf(
IdentifikationsSegment(generator.resetSegmentNumber(1), bank, customer),
Verarbeitungsvorbereitung(generator.getNextSegmentNumber(), bank, customer, product)
))
@ -51,7 +51,7 @@ open class MessageBuilder(protected val generator: ISegmentNumberGenerator = Seg
open fun createDialogInitMessage(bank: BankData, customer: CustomerData, product: ProductData): String {
return createMessage(true, true, bank, customer, listOf(
return createMessage(true, true, bank, customer, DialogData.DialogInitDialogData, listOf(
IdentifikationsSegment(generator.resetSegmentNumber(2), bank, customer),
Verarbeitungsvorbereitung(generator.getNextSegmentNumber(), bank, customer, product),
ZweiSchrittTanEinreichung(generator.getNextSegmentNumber(), TanProcess.TanProcess4, "HKIDN")
@ -60,7 +60,7 @@ open class MessageBuilder(protected val generator: ISegmentNumberGenerator = Seg
open fun createMessage(signMessage: Boolean, encryptMessage: Boolean, bank: BankData, customer: CustomerData,
payloadSegments: List<Segment>): String {
dialogData: DialogData, payloadSegments: List<Segment>): String {
var payload = payloadSegments
val date = utils.formatDateTodayAsInt()
@ -77,11 +77,10 @@ open class MessageBuilder(protected val generator: ISegmentNumberGenerator = Seg
val formattedPayload = formatPayload(payload)
val messageSize = formattedPayload.length + MessageHeaderLength + MessageClosingLength + AddedSeparatorsLength
val messageNumber = Nachrichtennummer.FirstMessageNumber
val header = Nachrichtenkopf(ISegmentNumberGenerator.FirstSegmentNumber, messageSize, "0", messageNumber)
val header = Nachrichtenkopf(ISegmentNumberGenerator.FirstSegmentNumber, messageSize, dialogData)
val closing = Nachrichtenabschluss(generator.getNextSegmentNumber(), messageNumber)
val closing = Nachrichtenabschluss(generator.getNextSegmentNumber(), dialogData)
return listOf(header.format(), formattedPayload, closing.format())
.joinToString(Nachricht.SegmentSeparator, postfix = Nachricht.SegmentSeparator)

View File

@ -4,4 +4,12 @@ import net.dankito.fints.messages.Existenzstatus
import net.dankito.fints.messages.datenelemente.abgeleiteteformate.Identifikation
/**
* Die Dialog-ID dient der eindeutigen Zuordnung einer Nachricht zu einem FinTS-Dialog.
* Die erste Kundennachricht (Dialoginitialisierung) enthält als Dialog-ID den Wert 0.
* In der ersten Antwortnachricht wird vom Kreditinstitut eine Dialog-ID vorgegeben,
* die für alle nachfolgenden Nachrichten dieses Dialogs einzustellen ist. Es ist
* Aufgabe des Kreditinstituts, dafür zu sorgen, dass diese Dialog-ID
* dialogübergreifend und systemweit eindeutig ist.
*/
open class DialogId(dialogId: String) : Identifikation(dialogId, Existenzstatus.Mandatory)

View File

@ -4,6 +4,7 @@ import net.dankito.fints.messages.Existenzstatus
import net.dankito.fints.messages.datenelemente.implementierte.Nachrichtennummer
import net.dankito.fints.messages.datenelementgruppen.implementierte.Segmentkopf
import net.dankito.fints.messages.segmente.Segment
import net.dankito.fints.model.DialogData
/**
@ -11,8 +12,9 @@ import net.dankito.fints.messages.segmente.Segment
*/
open class Nachrichtenabschluss(
segmentNumber: Int,
messageNumber: Int
dialogData: DialogData
) : Segment(listOf(
Segmentkopf("HNHBS", 1, segmentNumber),
Nachrichtennummer(messageNumber)
Nachrichtennummer(dialogData.messageNumber)
), Existenzstatus.Mandatory)

View File

@ -4,18 +4,18 @@ import net.dankito.fints.messages.Existenzstatus
import net.dankito.fints.messages.datenelemente.implementierte.*
import net.dankito.fints.messages.datenelementgruppen.implementierte.Segmentkopf
import net.dankito.fints.messages.segmente.Segment
import net.dankito.fints.model.DialogData
open class Nachrichtenkopf(
segmentNumber: Int,
messageSize: Int,
dialogId: String,
messageNumber: Int
dialogData: DialogData
) : Segment(listOf(
Segmentkopf("HNHBK", 3, segmentNumber),
Nachrichtengroesse(messageSize),
HbciVersionDatenelement(HbciVersion.FinTs_3_0_0),
DialogId(dialogId),
Nachrichtennummer(messageNumber)
DialogId(dialogData.dialogId),
Nachrichtennummer(dialogData.messageNumber)
), Existenzstatus.Mandatory)

View File

@ -0,0 +1,13 @@
package net.dankito.fints.model
open class DialogData(
var dialogId: String = "0",
var messageNumber: Int = 1
) {
companion object {
val DialogInitDialogData = DialogData("0", 1)
}
}