Adapter utility that bridges data between CobasWin and Voks (plus Agenda export files).
This repository has been modernized from an Eclipse-only Java 6 project to a Maven-based Java 25 project while preserving legacy integration behavior.
- Build migrated to Maven (
pom.xml), including dependency and plugin management. - Compiler target upgraded to Java 25 (
maven.compiler.release=25). - Eclipse metadata removed (
.classpath,.project,.settings). - JDBC startup made configurable to support modern JDKs without
sun.jdbc.odbc.JdbcOdbcDriver. finalize()cleanup removed from database classes (modern Java compatibility).- Unit test suite added with JUnit 5.
- Coverage reporting added with JaCoCo 0.8.14.
CobasWinis a standalone source system. It remains authoritative for the records this adapter reads.Voksis a standalone target system. It remains authoritative for the records this adapter writes.cobaswin2voksis an integration adapter only. It does not replace either system's business logic or UI.- Adapter responsibilities are limited to connectivity, validation, mapping/format conversion, and transfer orchestration.
- Changes in CobasWin or Voks schemas/interfaces may require adapter mapping updates.
ctvdkip.CTVDKIP: adapter entrypoint and mode dispatcher.ctvdkip.business.Voks: adapter orchestration for CobasWin-to-Voks synchronization.ctvdkip.business.CobasWin: adapter split and migration helper logic.ctvdkip.database.cobaswin.CobasWinDB: adapter-side CobasWin JDBC access layer.ctvdkip.database.voks.VoksDB: adapter-side Voks JDBC access layer.ctvdkip.database.voks.AccountingRecordWriter: writes legacy Voks import text files.ctvdkip.database.agenda.AgendaRecordWriter: writes Agenda CSV export files.ctvdkip.util.ApplicationLogger: file logger (Application.log).
The first CLI argument selects adapter execution mode:
CobasWinToVoks: syncs debitors/kreditors from CobasWin into Voks.GenerateAccountingRecordsFromCobasWin: writes Voks accounting import file and marks exported CobasWin records as processed.GenerateAgendaAccountingRecordsFromCobasWin: writes Agenda accounting CSV and marks exported CobasWin records as processed.GenerateAgendaPersonAccountsFromCobasWin: writes Agenda person accounts CSV (debitors + kreditors).
Optional second argument (any value) enables account number migration for modes that support it:
7 -> 6account migration for person account numbers.7 -> 6migration for accounting records in Voks export mode.
Agenda accounting export always applies 4 -> 6 account migration for account fields.
- JDK 25 (LTS)
- Maven 3.9+
Verify toolchain:
java -version
javac -version
mvn -versionRun unit tests:
mvn testRun full verification and generate JaCoCo report:
mvn clean verifyJaCoCo report output:
target/site/jacoco/index.htmltarget/site/jacoco/jacoco.xml
Build jar:
mvn -DskipTests packageRun examples:
java -cp target/cobaswin2voks-1.0.0-SNAPSHOT.jar ctvdkip.CTVDKIP CobasWinToVoks
java -cp target/cobaswin2voks-1.0.0-SNAPSHOT.jar ctvdkip.CTVDKIP GenerateAccountingRecordsFromCobasWin
java -cp target/cobaswin2voks-1.0.0-SNAPSHOT.jar ctvdkip.CTVDKIP GenerateAgendaAccountingRecordsFromCobasWin
java -cp target/cobaswin2voks-1.0.0-SNAPSHOT.jar ctvdkip.CTVDKIP GenerateAgendaPersonAccountsFromCobasWinEnable optional 7->6 migration by adding a second argument:
java -cp target/cobaswin2voks-1.0.0-SNAPSHOT.jar ctvdkip.CTVDKIP CobasWinToVoks migrateThe JDK-internal bridge sun.jdbc.odbc.JdbcOdbcDriver is not available on modern Java versions.
Use an external JDBC-ODBC bridge and configure this application via JVM properties or environment variables.
Configuration resolution order:
- JVM property
- Environment variable
- Built-in default
ctvdkip.cobaswin.jdbc.driverorCTV_COBASWIN_JDBC_DRIVER(default: empty)ctvdkip.cobaswin.jdbc.urlorCTV_COBASWIN_JDBC_URL(default:jdbc:odbc:cobaswin)ctvdkip.cobaswin.jdbc.userorCTV_COBASWIN_JDBC_USER(default:dataflex)ctvdkip.cobaswin.jdbc.passwordorCTV_COBASWIN_JDBC_PASSWORD(default:dataflex)
ctvdkip.voks.jdbc.driverorCTV_VOKS_JDBC_DRIVER(default: empty)ctvdkip.voks.jdbc.urlorCTV_VOKS_JDBC_URL(default:jdbc:odbc:VoksDB)ctvdkip.voks.jdbc.userorCTV_VOKS_JDBC_USER(default: empty)ctvdkip.voks.jdbc.passwordorCTV_VOKS_JDBC_PASSWORD(default: empty)
Example with explicit drivers:
java \
-Dctvdkip.cobaswin.jdbc.driver=com.example.odbc.Driver \
-Dctvdkip.voks.jdbc.driver=com.example.odbc.Driver \
-cp target/cobaswin2voks-1.0.0-SNAPSHOT.jar \
ctvdkip.CTVDKIP GenerateAccountingRecordsFromCobasWinBuchungsstapel_yyyyMMddkkmmss.txt: Voks accounting import format.Agenda_Buchungsstapel_OP_yyyyMMddkkmmss.csv: Agenda accounting export.Agenda_Personenkonten_yyyyMMddkkmmss.csv: Agenda person account export.Application.log: application runtime log.
Unit tests intentionally focus on deterministic business logic and file formatting:
- payment code mapping and CSV rendering
- record split/update decision logic
- account number migration behavior
- accounting data normalization and formatting
- writer output structure and content
Database integration behavior is intentionally excluded from unit tests because it depends on external DSN and bridge runtime.
Release version 25 not supported: you are using a JDK older than 25.No suitable driverorClassNotFoundExceptionfor driver: verify external JDBC-ODBC bridge is installed and configured.- DSN open failures: validate DSN names (
cobaswin,VoksDB) and credentials. - If exports look incomplete, check
Application.logfor severe/warning entries before importing generated files.