Date: 2026-07-23
- The Configurator's Hilfe button now opens a full user guide and administrator guide (German and English, with a language switcher) directly from the app — generated from Markdown into a static HTML site, screenshots included, no internet connection required.
- Config JSON written by the Configurator is now pretty-printed (indented), making saved
.config files readable when opened directly in a text editor.
- Added an optional
AllowedPattern override on KeyField so tables whose real key values don't fit the built-in per-type whitelist (digits-only, GUID, alphanumeric) can still use QuickSync's trigger-file validation safely.
- The Configurator has been completely rewritten from WinForms/DevExpress to WPF, with full feature parity (config load/save with legacy-filename fallback, unsaved-changes tracking and prompts, all grid/field editors) and a cleaner, more consistent layout (toolbar, master-detail object-type list, improved detail form).
- The MSI installer has been overhauled: upgraded to WiX 4.0.5, targets .NET 4.8, fixes several packaging warnings (icon reference, registry bitness, a stray dialog control), adds a proper .NET 4.8 prerequisite check, and now ships the documentation/screenshots so the in-app Help works on installed machines, not just dev setups.
- Exchange sync no longer re-exports and re-uploads every contact on every run — the delta-detection hash was based on an unstable per-process value instead of the actual field contents.
- Datev Rechnungswesen sync no longer produces oversized, inconsistent shadow-value files — its shadow hash is now computed the same way as every other data source.
- Fixed a timer race condition where a full sync pass could start while a still-running QuickSync pass was touching the same files and counters.
- Fixed an unbounded internal delegate leak in the SSL certificate handling shared by Exchange and Datev connections, which added overhead to every TLS handshake over the life of a running service.
- Fixed several resource leaks: database command/reader objects in ODBC queries, and the HTTP client/response in the docuvita upload path, were never released.
- Fixed a bug where Datev tables configured for the "Addresses" data type always came back empty despite reporting a non-zero record count.
- Fixed a crash on the docuvita upload error path that hid the actual error message instead of logging it.
- Fixed two places where
ObjectType/KeyField handling could throw on an older or partially-filled configuration file instead of falling back gracefully.
- Fixed the "Dokumentation erstellen" feature: it was showing the wrong field under "Datenquelle" and could leak connection credentials (username/password) into the generated documentation file.
- Fixed currency values being silently corrupted (e.g. "19.99" becoming "1999") when the service runs under a non-US Windows locale, such as German.
- Fixed the txt-export mode rewriting its entire output file on every single record instead of once per sync pass.
- Fixed a few smaller issues: a lost error stack trace, a query-parsing edge case when
SELECT wasn't at the very start of a statement, and several typos in log messages.
- Removed the last vendored/checked-in third-party DLL dependencies (
#external folder) — licensing, RestSharp, Newtonsoft.Json, and ServiceStack now come from NuGet or the standard sister-project build location.
- Replaced realistic-looking example credentials in
datev.example.config with clearly generic placeholders.
- Documented a Docker-based local test setup for the ODBC data source (including guidance for testing from a Windows-on-ARM VM, e.g. Parallels on Apple Silicon), so the
Odbc import type can be exercised without a real customer database.
- Unit test coverage expanded from 9 to 76 tests, now covering DatevReWe/Exchange connection-string parsing, SQL extraction and hashing, Datev field-mapping syntax, shadow-value persistence, KeyField validation, the documentation generator, and the Configurator's view models.
- Removed dead code, including an abandoned SQL-LocalDB-based shadow-value store that contained a hardcoded plaintext password.
- General cleanup: encapsulated mutable static fields, fixed misnamed files/typos, grouped related source files and solution projects into folders, and migrated remaining vendored dependencies to NuGet.
- Added the CalVer versioning setup (
SharedAssemblyVersion.cs, build.counter, Release.ps1, Directory.Build.targets) and Claude Code project tooling this release process itself depends on; Release.ps1 now also pushes the release commit and publishes a GitHub Release automatically.
- Removed the legacy pre-CalVer
Release Notes.txt, superseded by this docs/release-notes/ folder.