feat(billing): add automatic booking for Sportförderbeitrag in compliance with § 16 ÖTO
Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
+1
@@ -63,6 +63,7 @@ enum class BuchungsTyp {
|
||||
NACHNENNGEBUEHR,
|
||||
STARTGEBUEHR,
|
||||
BOXENGEBUEHR,
|
||||
SPORTFOERDERBEITRAG,
|
||||
ZAHLUNG_BAR,
|
||||
ZAHLUNG_KARTE,
|
||||
GUTSCHRIFT,
|
||||
|
||||
+1
@@ -59,6 +59,7 @@ class TeilnehmerKontoService(
|
||||
BuchungsTyp.NENNGEBUEHR,
|
||||
BuchungsTyp.NACHNENNGEBUEHR,
|
||||
BuchungsTyp.STARTGEBUEHR,
|
||||
BuchungsTyp.SPORTFOERDERBEITRAG,
|
||||
BuchungsTyp.BOXENGEBUEHR -> if (betragCent > 0) -betragCent else betragCent
|
||||
|
||||
BuchungsTyp.ZAHLUNG_BAR,
|
||||
|
||||
+9
-1
@@ -4,7 +4,6 @@ package at.mocode.entries.service.usecase
|
||||
|
||||
import at.mocode.billing.domain.model.BuchungsTyp
|
||||
import at.mocode.billing.service.TeilnehmerKontoService
|
||||
import at.mocode.entries.service.notification.MailService
|
||||
import at.mocode.core.domain.model.NennStatusE
|
||||
import at.mocode.entries.api.*
|
||||
import at.mocode.entries.domain.model.Nennung
|
||||
@@ -12,6 +11,7 @@ import at.mocode.entries.domain.model.NennungsTransfer
|
||||
import at.mocode.entries.domain.repository.NennungRepository
|
||||
import at.mocode.entries.domain.repository.NennungsTransferRepository
|
||||
import at.mocode.entries.service.bewerbe.BewerbRepository
|
||||
import at.mocode.entries.service.notification.MailService
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.stereotype.Service
|
||||
import kotlin.uuid.Uuid
|
||||
@@ -109,6 +109,14 @@ class NennungUseCases(
|
||||
zweck = "Nachnenngebühr Bewerb ${bewerb.bezeichnung}"
|
||||
)
|
||||
}
|
||||
|
||||
// Sportförderbeitrag buchen (1€ gemäß § 16 ÖTO)
|
||||
kontoService.buche(
|
||||
kontoId = konto.kontoId,
|
||||
betragCent = -100, // 1,00 EUR
|
||||
typ = BuchungsTyp.SPORTFOERDERBEITRAG,
|
||||
zweck = "Sportförderbeitrag ÖTO (§ 16)"
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
log.error("Fehler bei der automatischen Buchung für Nennung {}: {}", saved.nennungId, e.message, e)
|
||||
// Wir lassen die Nennung bestehen, loggen aber den Fehler.
|
||||
|
||||
+9
-8
@@ -98,15 +98,15 @@ class NennungBillingIntegrationTest {
|
||||
// WHEN: Nennung einreichen
|
||||
nennungUseCases.nennungEinreichen(request)
|
||||
|
||||
// THEN: Konto muss existieren und Saldo muss -25,00 EUR sein (Gebühr)
|
||||
// THEN: Konto muss existieren und Saldo muss -26,00 EUR sein (25,00 Gebühr + 1,00 Sportförderbeitrag)
|
||||
val konto = kontoService.getKonto(turnierId, reiterId)
|
||||
assertNotNull(konto, "Konto sollte automatisch erstellt worden sein")
|
||||
assertEquals(-2500L, konto?.saldoCent)
|
||||
assertEquals(-2600L, konto?.saldoCent)
|
||||
|
||||
val buchungen = kontoService.getBuchungsHistorie(konto!!.kontoId)
|
||||
assertEquals(1, buchungen.size)
|
||||
assertEquals(BuchungsTyp.NENNGELD, buchungen[0].typ)
|
||||
assertEquals(-2500L, buchungen[0].betragCent)
|
||||
assertEquals(2, buchungen.size)
|
||||
assertNotNull(buchungen.find { it.typ == BuchungsTyp.NENNGELD })
|
||||
assertNotNull(buchungen.find { it.typ == BuchungsTyp.SPORTFOERDERBEITRAG })
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -165,13 +165,14 @@ class NennungBillingIntegrationTest {
|
||||
// WHEN: Nennung einreichen
|
||||
nennungUseCases.nennungEinreichen(request)
|
||||
|
||||
// THEN: Saldo muss -45,00 EUR sein (-30 - 15)
|
||||
// THEN: Saldo muss -46,00 EUR sein (-30 - 15 - 1 Sportförderbeitrag)
|
||||
val konto = kontoService.getKonto(turnierId, reiterId)
|
||||
assertEquals(-4500L, konto?.saldoCent)
|
||||
assertEquals(-4600L, konto?.saldoCent)
|
||||
|
||||
val buchungen = kontoService.getBuchungsHistorie(konto!!.kontoId)
|
||||
assertEquals(2, buchungen.size)
|
||||
assertEquals(3, buchungen.size)
|
||||
// Einer muss NACHNENNGEBUEHR sein
|
||||
assertNotNull(buchungen.find { it.typ == BuchungsTyp.NACHNENNGEBUEHR })
|
||||
assertNotNull(buchungen.find { it.typ == BuchungsTyp.SPORTFOERDERBEITRAG })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
# 🧹 Session Journal - 15. April 2026 (Nachmittag)
|
||||
|
||||
## 🏗️ Status-Check (Lead Architect)
|
||||
|
||||
- **Phase 13 (Export & Billing):** Die Gebührenlogik wurde für das Neumarkt-Turnier (April 2026) finalisiert.
|
||||
- **ÖTO-Konformität:** Der Sportförderbeitrag gemäß § 16 ÖTO wird nun bei jeder Nennung automatisch verbucht.
|
||||
|
||||
## 👷 Durchgeführte Arbeiten (Backend)
|
||||
|
||||
1. **Billing (billing-domain & service):**
|
||||
- `BuchungsTyp.SPORTFOERDERBEITRAG` zum Enum hinzugefügt.
|
||||
- `TeilnehmerKontoService` um die Validierung für diesen neuen Typ erweitert (automatische Soll-Buchung).
|
||||
2. **Entries (entries-service):**
|
||||
- `NennungUseCases` aktualisiert: Bei jeder Nennungseingabe wird nun automatisch 1,00 EUR Sportförderbeitrag auf das
|
||||
Teilnehmerkonto gebucht, zusätzlich zu Nenngeld und Nachnenngebühr.
|
||||
3. **ZNS-Export (Bewerbe-SCS):**
|
||||
- Prüfung des `B-Satz` Exports im `BewerbeController`. Die Logik zur Generierung des strukturierten Textformats für
|
||||
den OEPS ist vorhanden und nutzt die `ZnsBewerb`-Modelle.
|
||||
|
||||
## 🧐 QA-Status & Bekannte Themen
|
||||
|
||||
- [x] **Billing-Check:** Die automatische Buchungskette (Nennung -> Konto -> Buchung) ist nun vollständig für alle
|
||||
Pflichtgebühren integriert.
|
||||
- [x] **Integrationstests:** `NennungBillingIntegrationTest` wurde an die neue Gebührenlogik angepasst (1,00 EUR
|
||||
Sportförderbeitrag).
|
||||
- [ ] **Export-Validierung:** Der generierte B-Satz muss noch gegen ein offizielles OEPS-Beispiel validiert werden (
|
||||
geplant für die nächste Session).
|
||||
|
||||
## 🧹 Curator's Note
|
||||
|
||||
- Die ROADMAP Phase 13 wurde in der Vormittags-Session bereits aktualisiert.
|
||||
- Der Fokus für morgen liegt auf der **ZNS-Export-Validierung** und der Vorbereitung des **Teilnehmer-Exports** (
|
||||
A-Satz).
|
||||
|
||||
**Abschluss:** Das Billing-System ist "ÖTO-ready" für Neumarkt. 🐎🏦
|
||||
Reference in New Issue
Block a user