EN · DE · RU · FR · ES

#794: BuchungssatzImpl.java

projectforge-business/src/main/java/org/projectforge/reporting/impl/BuchungssatzImpl.java Adapter, projectforge-business/src/main/java/org/projectforge/reporting/impl/BuchungssatzImpl.java 143 Zeilen · 90 Code · 27 Kommentare · 26 leer

Adapter-Pattern für BuchungssatzDO

Proxy/Adapter für BuchungssatzDO – die JPA-Entität, die einen Buchhaltungseintrag in org.projectforge.business.fibu.kost repräsentiert. Implementiert das Buchungssatz-Reporting-Interface aus org.projectforge.reporting. Javadoc: „Proxy für BuchungssatzDO“.

Dies ist das klassische Adapter-Pattern: Eine JPA-Entität kann nicht direkt ein Reporting-Interface implementieren (sie leben in separaten Modulen mit unterschiedlichen Abhängigkeitsgraphen), daher delegiert ein Wrapper alle Aufrufe an das DO. Mit 143 Zeilen ist es der größte Impl-Wrapper im Reporting-Paket.

Im Konstruktor akzeptiert es ein BuchungssatzDO, extrahiert verwandte Objekte (Konto, GegenKonto, Kost1, Kost2) und kapselt jedes in seine entsprechende Impl-Klasse: KontoImpl (#795), Kost1Impl, Kost2Impl. Alle Felder werden als final gecacht – einmal während der Konstruktion erstellt und nie neu berechnet.

Warum nicht BuchungssatzDO implements Buchungssatz?

Die JPA-Entität lebt im Modul projectforge-business, während das Reporting-Interface vom Finanzberichtsmodul konsumiert wird. Eine direkte Abhängigkeit würde eine zirkuläre Abhängigkeit erzeugen. Der Adapter löst dies: Das DO weiß nichts über Reporting, und das Reporting erhält Daten durch den Wrapper. Zusätzlich kann der Impl Daten transformieren (z. B. getFormattedMonth() ruft StringHelper.format2DigitNumber() auf), ohne das DO mit reportspezifischer Formatierungslogik zu belasten.

Methodendelegation

Jeder Getter delegiert einfach an das zugrunde liegende BuchungssatzDO:

MethodeRückgabeQuelle
getId()LongDirekte Delegation
getBeleg()BelegnummerDirekte Delegation
getBetrag()BigDecimal BetragDirekte Delegation
getComment()StringDirekte Delegation
getDatum()LocalDateDirekte Delegation
getGegenKonto()KontoGecachter Impl-Proxy
getKonto()KontoGecachter Impl-Proxy
getKost1()Kost1Gecachter Impl-Proxy
getKost2()Kost2Gecachter Impl-Proxy
getMenge()MengenstringDirekte Delegation
getMonth()IntegerDirekte Delegation
getFormattedMonth()2-stelliger StringFormatiert via StringHelper
getSatznr()IntegerDirekte Delegation
getSh()SHType (Soll/Haben)Direkte Delegation
getText()StringDirekte Delegation
getYear()IntegerDirekte Delegation

Typmigrationshistorie

Die ID wurde in Commit 4c04cfd65 von Integer auf Long migriert. Datumsfelder verwenden java.time.LocalDate (migriert von java.util.Date in 78b436d9e).

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quellcode-Dateiköpfe: 2024 -> 2025.
4c04cfd65 MAJOR-CHANGE! Migration von Integer-IDs zu Long-IDs (inkl. Fremdschlüssel usw.)
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
5f7ef41b8 Copyright 2021 -> 2022
ceb63e8a1 Quellcode-Kopfzeile: (C) 2001-2021.
a6a7aece4 Optimiere Importe
78b436d9e Ersetze Instanzen von java.util.date und java.sql.Date durch java.time.LocalDate
7c79f1922 Copyright des Quellcode-Kopfes -> 2020.