// /opt/erp-system/app/settings/page.tsx 'use client'; import { useState, useEffect } from 'react'; import { Settings, Save, Percent, Euro, Mail, Inbox, Hash } from 'lucide-react'; export default function SettingsPage() { const [data, setData] = useState({ hourlyRate: 0, taxRate: 0, companyName: '', companyInfo: '', smtpHost: '', smtpPort: 587, smtpUser: '', smtpPass: '', smtpFrom: '', hasSmtpPass: false, imapHost: '', imapPort: 993, imapUser: '', imapPass: '', hasImapPass: false, nextQuoteNumber: 1, nextOrderNumber: 1, nextDeliveryNumber: 1, nextInvoiceNumber: 1, nextCreditNoteNumber: 1, defaultQuoteValidityDays: 14 }); const [loading, setLoading] = useState(true); const [msg, setMsg] = useState(''); useEffect(() => { fetch('/api/settings').then(res => res.json()).then(d => { setData({ hourlyRate: d.hourlyRate || 0, taxRate: d.taxRate || 0, companyName: d.companyName || '', companyInfo: d.companyInfo || '', smtpHost: d.smtpHost || '', smtpPort: d.smtpPort || 587, smtpUser: d.smtpUser || '', smtpPass: '', smtpFrom: d.smtpFrom || '', hasSmtpPass: d.hasSmtpPass, imapHost: d.imapHost || '', imapPort: d.imapPort || 993, imapUser: d.imapUser || '', imapPass: '', hasImapPass: d.hasImapPass, nextQuoteNumber: d.nextQuoteNumber || 1, nextOrderNumber: d.nextOrderNumber || 1, nextDeliveryNumber: d.nextDeliveryNumber || 1, nextInvoiceNumber: d.nextInvoiceNumber || 1, nextCreditNoteNumber: d.nextCreditNoteNumber || 1, defaultQuoteValidityDays: d.defaultQuoteValidityDays || 14 }); setLoading(false); }); }, []); const handleSave = async (e: React.FormEvent) => { e.preventDefault(); const res = await fetch('/api/settings', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (res.ok) { setMsg('Einstellungen erfolgreich gespeichert.'); setTimeout(() => setMsg(''), 3000); setData(prev => ({ ...prev, smtpPass: '', hasSmtpPass: prev.smtpPass ? true : prev.hasSmtpPass, imapPass: '', hasImapPass: prev.imapPass ? true : prev.hasImapPass })); } }; if (loading) return
Lade Konfiguration...
; return (

Systemeinstellungen

{msg &&
{msg}
}
{/* Abrechnung */}

Abrechnungsparameter

setData({...data, hourlyRate: parseFloat(e.target.value)})} />
setData({...data, taxRate: parseFloat(e.target.value)})} />
{/* SMTP */}

Ausgehende E-Mails (SMTP)

setData({...data, smtpHost: e.target.value})} />
setData({...data, smtpPort: parseInt(e.target.value)})} />
setData({...data, smtpUser: e.target.value})} />
setData({...data, smtpPass: e.target.value})} />
{/* IMAP */}

Eingehende E-Mails (IMAP)

Diese E-Mail-Adresse wird überwacht, um automatisch Tickets aus eingehenden E-Mails zu erstellen.

setData({...data, imapHost: e.target.value})} />
setData({...data, imapPort: parseInt(e.target.value)})} />
setData({...data, imapUser: e.target.value})} />
setData({...data, imapPass: e.target.value})} />
{/* Nummernkreise */}

Nummernkreise (Warenwirtschaft)

Laufende Nummern für Belege. Format: ANG-{new Date().getFullYear()}-{data.nextQuoteNumber.toString().padStart(4, '0')}

setData({...data, nextQuoteNumber: parseInt(e.target.value) || 1})} />
setData({...data, nextOrderNumber: parseInt(e.target.value) || 1})} />
setData({...data, nextDeliveryNumber: parseInt(e.target.value) || 1})} />
setData({...data, nextInvoiceNumber: parseInt(e.target.value) || 1})} />
setData({...data, nextCreditNoteNumber: parseInt(e.target.value) || 1})} />
setData({...data, defaultQuoteValidityDays: parseInt(e.target.value) || 14})} />
); }