fix(07): UAT fixes — SMTP test email, DKV routing, Exchange domain field
Tessera CI/CD / Lint & Type Check (push) Waiting to run
Tessera CI/CD / Tests (push) Blocked by required conditions
Tessera CI/CD / Build & Deploy (push) Blocked by required conditions

- SMTP: add test-to field, send real email via sendMail() instead of verify()
- SMTP: fix no_auth warning shown as error for open-relay servers
- DKV: register dkv-fleet in MODULE_REGISTRY (fixes "Modul nicht gefunden")
- DKV: add dynamic [category]/[moduleSlug]/settings + vehicles sub-routes
- DKV: settings/vehicles links use useParams for consistent URLs
- DKV: add gear icon settings link to module main page
- DKV: rename module to "DKV-Rechnung" in seed + translations
- DKV: add optional domain field for Exchange (WebCredentials 3rd arg)
- DKV: hide IMAP-only fields (Port/Verschlüsselung/Ordner) when Exchange selected
- DKV: hide Exchange-only field (Domain) when IMAP selected
- Prisma: add domain column to DkvModuleConfig

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-28 21:58:26 +02:00
parent 4de87a8ea2
commit 01ff137f43
43 changed files with 5765 additions and 90 deletions
@@ -0,0 +1 @@
{"content":"Tauri 2 bundles: Linux AppImage via bundle targets ['appimage']. Windows NSIS (-setup.exe) recommended over MSI -- NSIS supports cross-compilation from Linux, MSI requires Windows. NSIS config: install modes (perMachine/both), languages, compression (LZMA default), custom hooks. Bundle output: target/release/bundle/appimage/ and target/release/bundle/nsis/.","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-25T07:11:49.463Z","ttl":86400000,"kind":"docs"}
@@ -0,0 +1 @@
{"content":"Tauri 2 plugins: @tauri-apps/plugin-store (2.4.3) for persistent KV storage, @tauri-apps/plugin-notification (2.3.3) for OS notifications, @tauri-apps/plugin-autostart (2.5.1) for system startup, @tauri-apps/plugin-window-state (2.4.1) for persisting window size/position. All from official tauri-apps/plugins-workspace. System tray via TrayIconBuilder with tray-icon feature flag. Close-to-tray: on_window_event CloseRequested -> prevent_close + hide. RunEvent::ExitRequested -> prevent_exit to keep alive.","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-25T07:11:49.362Z","ttl":86400000,"kind":"docs"}
@@ -0,0 +1 @@
{"content":"NestJS @nestjs/schedule v6: ScheduleModule.forRoot() in AppModule. Static: @Interval(ms) or @Cron(expression). Dynamic: inject SchedulerRegistry, use CronJob from 'cron', schedulerRegistry.addCronJob(name, job), job.start(). Update interval: stop + delete + recreate. Module uses cron package under the hood. For interval-in-minutes from DB config: compute cron expression or use setInterval pattern. ScheduleModule already in AppModule? Check app.module.ts - YES, @nestjs/schedule@^6.1.3 is in deps.","source":"web","provider":"websearch","confidence":"LOW","fetched_at":"2026-06-26T12:30:31.855Z","ttl":86400000,"kind":"docs"}
@@ -0,0 +1 @@
{"content":"Tauri 2 project in pnpm monorepo: use 'npx tauri init' in apps/desktop. src-tauri goes inside apps/desktop/src-tauri. For URL wrapper: set frontendDist to external URL (e.g. http://server:3000). devUrl for dev server. tauri.conf.json is primary config. CLI: @tauri-apps/cli. Requires Rust toolchain + system deps (libwebkit2gtk-4.1-dev, libgtk-3-dev, etc).","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-25T07:11:49.268Z","ttl":86400000,"kind":"docs"}
@@ -0,0 +1 @@
{"content":"imapflow: Modern IMAP client. Connect: new ImapFlow({ host, port, secure, tls, auth: { user, pass } }). Get mailbox lock: client.getMailboxLock('INBOX'). Search: client.search({ from: sender }, { uid: true }) returns UIDs. FetchAll: client.fetchAll(uids, { envelope: true, bodyStructure: true }, { uid: true }). Download part: client.download(uid, partId, { uid: true }) returns { content: Stream }. Use fetchAll() first, then process - avoids IMAP deadlock. STARTTLS: secure=false + tls={rejectUnauthorized: false} + port 587. TLS: secure=true + port 993. None: secure=false + tls.ignoreTLSErrors=true or disableCompression.","source":"web","provider":"websearch","confidence":"LOW","fetched_at":"2026-06-26T12:30:25.576Z","ttl":86400000,"kind":"docs"}
@@ -0,0 +1 @@
{"content":"For Exchange calendar access: ews-javascript-api v0.15.3 (EWS/SOAP, last updated 2024-05) or @microsoft/microsoft-graph-client v3.0.7 (REST/Graph API, last updated 2023-09). MS Graph is the modern approach for Exchange Online/M365. EWS is needed for on-premises Exchange. Both support OAuth.","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-23T12:25:14.344Z","ttl":86400000,"kind":"web"}
@@ -0,0 +1 @@
{"content":"react-grid-layout v2.2.3 is a TypeScript rewrite with hooks API (useContainerWidth, useGridLayout, useResponsiveLayout). Layout items have i,x,y,w,h,minW,minH,maxW,maxH,static,isDraggable,isResizable. Key callbacks: onLayoutChange, onDragStop, onResizeStop, onBreakpointChange. Responsive via breakpoints/cols config. v2 requires width prop (use useContainerWidth hook). CSS imports needed: react-grid-layout/css/styles.css and react-resizable/css/styles.css.","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-23T12:25:13.959Z","ttl":86400000,"kind":"docs"}
@@ -0,0 +1 @@
{"content":"node-ical v0.26.1 is the leading ICS parser for Node.js with 190K weekly downloads. Provides sync/async parsing from strings, files, and URLs. Handles VEVENT, VTODO, VJOURNAL, recurring events, timezones.","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-23T12:25:14.159Z","ttl":86400000,"kind":"web"}
@@ -0,0 +1 @@
{"content":"@uiw/react-md-editor v4.1.1 is a lightweight Markdown editor with toolbar (bold, italic, lists, links, code), GFM support including task lists/checkboxes, dark mode via data-color-mode attribute, customizable toolbar via commands prop, live preview mode. ~4.6KB gzipped core. 774K weekly downloads.","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-23T12:25:14.058Z","ttl":86400000,"kind":"web"}
@@ -0,0 +1 @@
{"content":"SheetJS xlsx 0.18: XLSX.utils.book_new() creates workbook. XLSX.utils.aoa_to_sheet(rows) from array-of-arrays where rows[0] = headers. XLSX.utils.book_append_sheet(wb, ws, sheetName). XLSX.write(wb, { type:'buffer', bookType:'xlsx' }) returns Buffer. Date cells: pass JS Date objects, xlsx serializes to Excel date serial. Cell formatting: ws[cellAddr].z = 'DD.MM.YYYY' for display format. German date format 'TT.MM.JJJJ' in the data = string, not Date object, so just write as string. Numeric km: write as number, no unit.","source":"web","provider":"websearch","confidence":"LOW","fetched_at":"2026-06-26T12:30:47.031Z","ttl":86400000,"kind":"docs"}
@@ -0,0 +1 @@
{"content":"pdf-parse v2.4.5: const pdfParse = require('pdf-parse'); const data = await pdfParse(buffer); data.text = full text extracted from all pages concatenated. data.numpages = page count. data.info = PDF metadata. The library is Promise-based, takes Buffer as input. DKV PDF pattern: each vehicle block starts with line containing 'VEHICLE: {plate} CARD NO.:'; transaction rows follow with date + station + km + product + qty + unit; ends with 'TOTAL:'. Multi-page: text is full concatenation across all pages.","source":"web","provider":"websearch","confidence":"LOW","fetched_at":"2026-06-26T12:30:47.125Z","ttl":86400000,"kind":"docs"}
@@ -0,0 +1 @@
{"content":"tsdav v2.2.2 is the leading CalDAV/CardDAV client for Node.js/Browser with 88K weekly downloads. TypeScript-native, supports basic auth and OAuth2, works with Google Calendar, iCloud, Nextcloud. Methods: fetchCalendars(), fetchCalendarObjects(). Date range filtering supported.","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-23T12:25:14.252Z","ttl":86400000,"kind":"web"}
@@ -0,0 +1 @@
{"content":"Gitea Actions: 90% GitHub Actions compatible YAML syntax. Workflows in .gitea/workflows/. act_runner as Docker container with Docker socket mount. Registration via token from admin panel. Secrets in repo settings. Key differences: no timeout-minutes, no continue-on-error, no concurrency groups, no hashFiles. Docker build: use docker/build-push-action or plain docker commands. Deploy via SSH action (appleboy/ssh-action) for docker-compose pull+restart.","source":"web","provider":"websearch","confidence":"MEDIUM","fetched_at":"2026-06-25T07:11:49.578Z","ttl":86400000,"kind":"web"}