complete new audit system

This commit is contained in:
2026-03-21 18:23:54 +01:00
parent 4f359df161
commit 219e1930f7
159 changed files with 2841 additions and 736 deletions
@@ -15,6 +15,7 @@ import Select from '../../components/ui/Select';
import FileUpload from '../../components/ui/FileUpload';
import { Edit, Plus, Trash2, MapPin, CreditCard, FileText, Gauge, Eye, EyeOff, Download, Globe, UserPlus, X, Search, Mail, Copy, Check, ChevronDown, ChevronRight, Info, Shield, ShieldCheck, ShieldX, ShieldAlert, Lock, ArrowLeft } from 'lucide-react';
import CopyButton, { CopyableBlock } from '../../components/ui/CopyButton';
import { formatDate } from '../../utils/dateFormat';
import type { Address, BankCard, IdentityDocument, Meter, Customer, CustomerRepresentative, CustomerSummary, CustomerConsent, ConsentType, ConsentStatus, RepresentativeAuthorization } from '../../types';
export default function CustomerDetail({ portalCustomerId }: { portalCustomerId?: number } = {}) {
@@ -887,7 +888,7 @@ function BankCardsTab({
)}
{card.expiryDate && (
<p className="text-sm text-gray-500">
Gültig bis: {new Date(card.expiryDate).toLocaleDateString('de-DE')}
Gültig bis: {formatDate(card.expiryDate)}
</p>
)}
@@ -1378,8 +1379,8 @@ function MetersTab({
{(isExpanded ? sortedReadings : sortedReadings.slice(0, 3)).map((reading) => (
<div key={reading.id} className="flex justify-between items-center text-sm group">
<span className="text-gray-500 flex items-center gap-1">
{new Date(reading.readingDate).toLocaleDateString('de-DE')}
<CopyButton value={new Date(reading.readingDate).toLocaleDateString('de-DE')} />
{formatDate(reading.readingDate)}
<CopyButton value={formatDate(reading.readingDate)} />
</span>
<div className="flex items-center gap-2">
<span className="font-mono flex items-center gap-1">
@@ -1664,9 +1665,9 @@ function ContractsTab({
)}
{contract.startDate && (
<p className={`text-sm text-gray-500 ${isPredecessor ? 'ml-6' : ''}`}>
Beginn: {new Date(contract.startDate).toLocaleDateString('de-DE')}
Beginn: {formatDate(contract.startDate)}
{contract.endDate &&
` | Ende: ${new Date(contract.endDate).toLocaleDateString('de-DE')}`}
` | Ende: ${formatDate(contract.endDate)}`}
</p>
)}
</div>
@@ -3630,8 +3631,8 @@ const CONSENT_TYPE_LABELS: Record<ConsentType, { label: string; description: str
description: 'Grundlegende Verarbeitung personenbezogener Daten zur Vertragserfüllung',
},
MARKETING_EMAIL: {
label: 'E-Mail-Marketing',
description: 'Zusendung von Werbung und Angeboten per E-Mail',
label: 'Elektronisches Marketing',
description: 'Zusendung von Werbung und Angeboten über elektronische Kommunikationswege (E-Mail, Messenger etc.)',
},
MARKETING_PHONE: {
label: 'Telefonmarketing',
@@ -64,17 +64,17 @@ export default function CustomerForm() {
// Only include the fields that can be updated - exclude relations and read-only fields
const submitData: any = {
type: data.type,
salutation: data.salutation || undefined,
salutation: data.salutation || '',
firstName: data.firstName,
lastName: data.lastName,
companyName: data.companyName || undefined,
email: data.email || undefined,
phone: data.phone || undefined,
mobile: data.mobile || undefined,
taxNumber: data.taxNumber || undefined,
commercialRegisterNumber: data.commercialRegisterNumber || undefined,
notes: data.notes || undefined,
birthPlace: data.birthPlace || undefined,
companyName: data.companyName || '',
email: data.email || '',
phone: data.phone || '',
mobile: data.mobile || '',
taxNumber: data.taxNumber || '',
commercialRegisterNumber: data.commercialRegisterNumber || '',
notes: data.notes || '',
birthPlace: data.birthPlace || '',
};
// Handle birthDate - convert non-empty string to ISO string, or null to clear