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
+1 -1
View File
@@ -14,7 +14,7 @@ export async function seedDkvModule(
): Promise<void> {
await moduleRegistryService.seedModule({
slug: 'dkv-fleet',
name: 'DKV Flotte',
name: 'DKV-Rechnung',
version: '1.0.0',
category: 'fleet',
description: {
+3
View File
@@ -34,6 +34,7 @@ const CONFIG_SAFE_SELECT = {
isActive: true,
exportRecipient: true,
vehicleFormatString: true,
domain: true,
// encryptedInboxCreds: NEVER included — T-07-12
createdAt: true,
updatedAt: true,
@@ -156,6 +157,7 @@ export class DkvService {
...(dto.isActive !== undefined && { isActive: dto.isActive }),
...(dto.exportRecipient !== undefined && { exportRecipient: dto.exportRecipient }),
...(dto.vehicleFormatString !== undefined && { vehicleFormatString: dto.vehicleFormatString }),
...(dto.domain !== undefined && { domain: dto.domain }),
...(encryptedInboxCreds !== undefined && { encryptedInboxCreds }),
};
@@ -201,6 +203,7 @@ export class DkvService {
encryption: dto.encryption,
folder: dto.folder ?? 'INBOX',
senderFilter: dto.senderFilter,
domain: dto.domain,
};
const provider = dto.protocol === 'exchange' ? this.exchangeProvider : this.imapProvider;
+2
View File
@@ -59,6 +59,8 @@ export interface InboxConfig {
folder: string;
/** Sender filter: only process emails from this address */
senderFilter?: string;
/** Exchange only: Windows domain (e.g. "CONTOSO") */
domain?: string;
}
/**
+4
View File
@@ -100,6 +100,10 @@ export class DkvConfigDto {
/**
* Inbox username (stored encrypted; cleared after save).
*/
@IsOptional()
@IsString()
domain?: string;
@IsOptional()
@IsString()
username?: string;
@@ -222,6 +222,7 @@ export class ExchangeInboxProvider implements InboxProvider {
service.Credentials = new ews.WebCredentials(
config.username ?? '',
config.password ?? '',
config.domain ?? undefined,
);
return service;
}