'use client' import { useState, useMemo } from 'react' import Link from 'next/link' import { useVendorCompliance, ContractDocument, DocumentType, ContractStatus, ContractReviewStatus, DOCUMENT_TYPE_META, formatDate, } from '@/lib/sdk/vendor-compliance' export default function ContractsPage() { const { contracts, vendors, deleteContract, startContractReview, isLoading } = useVendorCompliance() const [searchTerm, setSearchTerm] = useState('') const [typeFilter, setTypeFilter] = useState('ALL') const [statusFilter, setStatusFilter] = useState('ALL') const [reviewFilter, setReviewFilter] = useState('ALL') const filteredContracts = useMemo(() => { let result = [...contracts] // Search filter if (searchTerm) { const term = searchTerm.toLowerCase() result = result.filter((c) => { const vendor = vendors.find((v) => v.id === c.vendorId) return ( c.originalName.toLowerCase().includes(term) || vendor?.name.toLowerCase().includes(term) ) }) } // Type filter if (typeFilter !== 'ALL') { result = result.filter((c) => c.documentType === typeFilter) } // Status filter if (statusFilter !== 'ALL') { result = result.filter((c) => c.status === statusFilter) } // Review filter if (reviewFilter !== 'ALL') { result = result.filter((c) => c.reviewStatus === reviewFilter) } // Sort by date (newest first) result.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()) return result }, [contracts, vendors, searchTerm, typeFilter, statusFilter, reviewFilter]) const handleDelete = async (id: string) => { if (confirm('Möchten Sie diesen Vertrag wirklich löschen?')) { await deleteContract(id) } } const handleStartReview = async (id: string) => { await startContractReview(id) } const getVendorName = (vendorId: string) => { return vendors.find((v) => v.id === vendorId)?.name || 'Unbekannt' } if (isLoading) { return (
) } return (
{/* Header */}

Verträge

AVV, SCC und andere Verträge mit LLM-gestützter Prüfung

Vertrag hochladen
{/* Filters */}
setSearchTerm(e.target.value)} />
{/* Contracts Table */}
{filteredContracts.map((contract) => ( ))}
Dokument Vendor Typ Status Compliance Laufzeit Aktionen
{contract.originalName}
v{contract.version} • {(contract.fileSize / 1024).toFixed(1)} KB
{getVendorName(contract.vendorId)} {DOCUMENT_TYPE_META[contract.documentType]?.de || contract.documentType} {contract.effectiveDate ? ( <> {formatDate(contract.effectiveDate)} {contract.expirationDate && ( <> - {formatDate(contract.expirationDate)} )} ) : ( '-' )}
Anzeigen {contract.reviewStatus === 'PENDING' && ( )} {contract.reviewStatus === 'COMPLETED' && ( Ergebnis )}
{filteredContracts.length === 0 && (

Keine Verträge gefunden

Laden Sie einen Vertrag hoch, um zu beginnen.

Vertrag hochladen
)}
{/* Summary */}
{filteredContracts.length} von {contracts.length} Verträgen
) } function ContractStatusBadge({ status }: { status: ContractStatus }) { const config = { DRAFT: { label: 'Entwurf', color: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-200' }, SIGNED: { label: 'Unterschrieben', color: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200' }, ACTIVE: { label: 'Aktiv', color: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' }, EXPIRED: { label: 'Abgelaufen', color: 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200' }, TERMINATED: { label: 'Beendet', color: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200' }, } return ( {config[status].label} ) } function ReviewStatusBadge({ reviewStatus, complianceScore, }: { reviewStatus: ContractReviewStatus complianceScore?: number }) { if (reviewStatus === 'COMPLETED' && complianceScore !== undefined) { const scoreColor = complianceScore >= 80 ? 'text-green-600 dark:text-green-400' : complianceScore >= 60 ? 'text-yellow-600 dark:text-yellow-400' : 'text-red-600 dark:text-red-400' return (
= 80 ? 'bg-green-500' : complianceScore >= 60 ? 'bg-yellow-500' : 'bg-red-500' }`} style={{ width: `${complianceScore}%` }} />
{complianceScore}%
) } const config = { PENDING: { label: 'Ausstehend', color: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-200' }, IN_PROGRESS: { label: 'In Prüfung', color: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200' }, COMPLETED: { label: 'Geprüft', color: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' }, FAILED: { label: 'Fehlgeschlagen', color: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200' }, } return ( {config[reviewStatus].label} ) }