Dies ist eine vollständige Java-Portierung des ISHA7800 COBOL-Systems zur GuV-Berichterstellung (Gewinn- und Verlustrechnung).
Das System konvertiert Finanzdaten und generiert entweder monats- oder mitarbeiterbasierte Berichte.
| Aspekt | COBOL | Java |
|---|---|---|
| Sprache | Enterprise COBOL für z/OS | Java 11+ |
| Plattform | Mainframe (z/OS) | Beliebig (JVM) |
| Compilation | Enterprise COBOL | Maven |
| Tests | ISUD7890 Custom Framework | JUnit 4 |
| Ausführung | Batch-Job | Kommandozeile / Docker |
guv-reporting-java/
├── pom.xml # Maven Konfiguration
├── Dockerfile # Docker Build
├── docker-compose.yml # Docker Compose für lokale Tests
├── README.md # Diese Datei
│
├── src/main/java/com/example/
│ ├── GuVReportApplication.java # Main Entry Point (ISHA7800)
│ ├── model/ # Datenstrukturen (ISS*)
│ │ ├── SteuerDaten.java # ISS7805
│ │ ├── GuVData.java # ISS7810
│ │ ├── ExportMonat.java # ISS7820
│ │ └── ExportMitarbeiter.java # ISS7821
│ └── processor/ # Geschäftslogik (ISUD*)
│ ├── SteuerParser.java # ISUD7805
│ ├── GuVImporter.java # ISUD7810
│ ├── MonthlyCalculator.java # ISUD7820
│ ├── EmployeeCalculator.java # ISUD7821
│ ├── MonthlyExporter.java # ISUD7830
│ └── EmployeeExporter.java # ISUD7831
│
├── src/test/java/com/example/processor/
│ ├── SteuerParserTest.java
│ ├── MonthlyCalculatorTest.java
│ └── EmployeeCalculatorTest.java
│
├── src/main/resources/
│ ├── example-EXPRTART.txt # Beispiel Steuerungsdatei
│ └── example-ROHDATEN.txt # Beispiel Rohdaten
│
└── data/ # (wird vom Dockerfile erzeugt)
- Java 11+
- Maven 3.6+
- Docker (optional, für containerisierte Ausführung)
# Repository klonen / in Verzeichnis gehen
cd guv-reporting-java
# Bauen
mvn clean package
# Mit Beispiel-Daten ausführen
java -jar target/guv-reporting.jar src/main/resources/example-EXPRTART.txt src/main/resources/example-ROHDATEN.txt
# Mit Debug-Output
java -jar target/guv-reporting.jar src/main/resources/example-EXPRTART.txt src/main/resources/example-ROHDATEN.txt --debug# Image bauen
docker build -t guv-reporting .
# Container starten (interaktiv)
docker run -it guv-reporting src/main/resources/example-EXPRTART.txt src/main/resources/example-ROHDATEN.txt
# Mit Docker Compose
docker-compose up# Alle Tests
mvn test
# Spezifischer Test
mvn test -Dtest=SteuerParserTest
mvn test -Dtest=MonthlyCalculatorTest
mvn test -Dtest=EmployeeCalculatorTestjava -jar guv-reporting.jar EXPRTART ROHDATEN [--debug]Parameter:
EXPRTART: Pfad zur SteuerungsdateiROHDATEN: Pfad zur Rohdaten-Datei--debug: (Optional) Ausführliches Logging
Enthält eine Zeile mit:
MONATLICH- für monatlichen BerichtMITARBEITER- für Mitarbeiterbericht
MONATLICH
Format (COBOL-Original, kann zu CSV vereinfacht werden):
JAHRMMMITAFORTRAG...
2023011000100234567
2023022002101234567
CSV-Alternative (einfacher zu generieren):
Monat,Mitarbeiter,Ertrag
01,M01,1234.56
02,M02,2345.67
| COBOL (ISS*) | Java | Zweck |
|---|---|---|
| ISS7805 | SteuerDaten |
Steuerungsdaten |
| ISS7810 | GuVData |
Import-Tabelle |
| ISS7820 | ExportMonat |
Monats-Export |
| ISS7821 | ExportMitarbeiter |
Mitarbeiter-Export |
| COBOL (ISUD*) | Java | Zweck |
|---|---|---|
| ISUD7805 | SteuerParser |
Kontrolle parsen |
| ISUD7810 | GuVImporter |
Daten importieren |
| ISUD7820 | MonthlyCalculator |
Nach Monat aggregieren |
| ISUD7821 | EmployeeCalculator |
Nach Mitarbeiter aggregieren |
| ISUD7830 | MonthlyExporter |
Monatsbericht ausgeben |
| ISUD7831 | EmployeeExporter |
Mitarbeiterbericht ausgeben |
| COBOL | Java |
|---|---|
| ISHA7800 | GuVReportApplication |
┌─────────────┐
│ EXPRTART │
└──────┬──────┘
│ SteuerParser
▼
┌──────────────────┐
│ SteuerDaten │
│ (monatlich/emp) │
└──────┬───────────┘
│
┌──────────────┐
│ ROHDATEN │
└──────┬───────┘
│ GuVImporter
▼
┌──────────────────┐
│ GuVData │
│ (9999 entries) │
└──────┬───────────┘
│
├─ MonthlyCalculator → ExportMonat → MonthlyExporter
│
└─ EmployeeCalculator → ExportMitarbeiter → EmployeeExporter
| Klasse | Komplexität | Notes |
|---|---|---|
SteuerParser |
O(1) | - |
GuVImporter |
O(n) | n = Zeilen in ROHDATEN |
MonthlyCalculator |
O(n) | n = Einträge |
EmployeeCalculator |
O(n*m) | n = Einträge, m = Mitarbeiter (Bottleneck!) |
Exporter |
O(n) | - |
- Normal: Linear Search → O(n*m)
- Optimiert: Stream API mit Grouping → O(n log n)
// Verwendet optimierte Variante:
ExportMitarbeiter employee = employeeCalculator.calculateOptimized(guvData);- JUnit 4: Unit Testing
- Apache Commons CSV: CSV-Parsing (optional)
- SLF4J: Logging
- BigDecimal: Für Geldbeträge (keine Float/Double!)
- Integer: Für Monatswerte (1-12)
- String: Für Mitarbeitername/Steuerung
try {
GuVReportApplication app = new GuVReportApplication();
app.run("EXPRTART", "ROHDATEN");
} catch (IOException e) {
System.err.println("ERROR: File I/O - " + e.getMessage());
} catch (IllegalArgumentException e) {
System.err.println("ERROR: Invalid data - " + e.getMessage());
}SteuerParser: 7 Tests
✓ Parse MONATLICH
✓ Parse MITARBEITER
✓ Ungültige Eingabe (Exception)
✓ Gleichheit
MonthlyCalculator: 10 Tests
✓ Einzelner Eintrag
✓ Mehrere Einträge gleicher Monat
✓ Mehrere Monate
✓ Gesamtsumme
✓ Ungültiger Monat (Exception)
✓ Leere Daten
✓ Alle Monate
✓ Dezimalgenauigkeit
EmployeeCalculator: 14 Tests
✓ Einzelner Mitarbeiter
✓ Mehrere Einträge
✓ Mehrere Mitarbeiter
✓ Komplexes Szenario
✓ Maximum (99 Mitarbeiter)
✓ Überschreitung (Exception)
✓ Case-Insensitiv
✓ Trimmen
✓ Dezimalgenauigkeit
✓ Optimiert vs. Normal
# Alle Tests
mvn test
# Mit verbose Output
mvn test -X
# Spezifische Test-Klasse
mvn test -Dtest=MonthlyCalculatorTest#testSingleEntry
# Einzelner Test
mvn test -Dtest=EmployeeCalculatorTest#testComplexScenarioMulti-stage Build für optimale Größe:
- Builder Stage: Maven Build
- Runtime Stage: Nur JRE (Alpine)
Resultierende Image-Größe: ~300 MB
Vereinfachte lokale Ausführung mit Volumes:
docker-compose upVolumes:
./data→/app/data(Eingabe)./output→/app/output(Ausgabe, optional)
- Neues Model (z.B.
ExportDepartment.java) - Neuen Calculator (z.B.
DepartmentCalculator.java) - Neuen Exporter (z.B.
DepartmentExporter.java) - In
GuVReportApplicationintegrieren
- ISUD7821 Optimization: Verwende
calculateOptimized()für große Datenmengen - Memory: Streaming für große ROHDATEN-Dateien
- Parallelisierung: Potential für parallelisierte Berechnung
✅ Besseres:
- OOP-Struktur
- Echte Exception-Handling
- Moderne Testing (JUnit)
- IDE-Support
- Performance (JVM JIT)
- COBOL nutzt 1-basierte Array-Indizes
- COBOL: Monatsindex 1-12, Java: 0-11 (konvertiert)
- COBOL: Fixed-Size Arrays, Java: Dynamic Lists
COBOL (ISUD7820):
PERFORM F1-SUM-MONAT VARYING ZW-I
FROM 1 BY 1 UNTIL ZW-I > GUV-ANZAHL
F1-SUM-MONAT:
MOVE GUV-MONAT(ZW-I) TO ZW-MONAT
ADD GUV-ERTRAG(ZW-I) TO EXPORT-MONAT-ERTRAG(ZW-MONAT)Java:
for (GuVData.GuVZeile zeile : guvData.getZeilen()) {
int monat = zeile.monat;
if (monat < 1 || monat > 12) {
throw new IllegalArgumentException("Invalid month");
}
result.addMonatErtrag(monat, zeile.ertrag);
}Lösung: Vollständigen Pfad angeben
java -jar target/guv-reporting.jar ./EXPRTART ./ROHDATENLösung: ROHDATEN-Format überprüfen
- Monat muss 01-12 sein
- Dezimaltrennzeichen überprüfen
Lösung: EmployeeCalculator mit Optimierung nutzen
ExportMitarbeiter result = calculator.calculateOptimized(guvData);Siehe Original-COBOL-Projekt
- Siehe
../isha7800/für Original-COBOL-Code - Siehe
../isha7800/docs/für detaillierte Dokumentation - ARCHITEKTUR.md: System-Design
- MODULE.md: Detaillierte Modul-Beschreibungen
- ENTWICKLER-LEITFADEN.md: Code-Standards
Bei Fragen zur Java-Portierung oder zum Original-System:
Siehe ../isha7800/README.md
Java-Version erstellt: 2025 Basierend auf: ISHA7800 COBOL (Bohlmann/Botzet)