import { useCallback, useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { FaSpinner, FaRotateRight } from 'react-icons/fa6' import { PageHeader, Card, Badge, Button } from '../components/ui' import { listStorageTasks, markStorageDone } from '../lib/teamApi' import { fmtDate, fmtDateTime } from '../lib/format' import { changeText, failedText, isOverdue, orderedKind, partialText, scopeText, summaryText, taskText } from '../lib/storageFormat' import '../styles/admin-areas.css' // E-Mail-Speicher (Kunden -> E-Mail-Speicher): Zusatzspeicher-Aufgaben in konsoleH wie im frueheren Admin-Panel export default function StorageTasksPage() { const [data, setData] = useState(null) const [error, setError] = useState(null) const [busyId, setBusyId] = useState('') const load = useCallback(() => { setError(null) listStorageTasks() .then(setData) .catch((err) => setError(err.message || 'Speicher-Aufgaben konnten nicht geladen werden.')) }, []) useEffect(() => { load() }, [load]) const done = async (task) => { if (task.partial && !window.confirm('Stripe-Menge von Hand korrigiert?')) return setBusyId(task.id) try { await markStorageDone(task.id) load() } catch (err) { window.alert(`Aufgabe konnte nicht als erledigt gespeichert werden: ${err.message}`) } finally { setBusyId('') } } const summary = data ? summaryText(data) : null return (
{error && (
{error}
)} {!data && !error && } {data && ( <>
{summary.text}
FälligKundeAufgabe in konsoleHBestellt
{data.tasks.length === 0 &&
Keine offenen Speicher-Aufgaben.
} {data.tasks.map((t) => (
{t.kind === 'einrichten' ? <>jetzt einrichten
bestellt {fmtDateTime(t.createdAt)} : <>zum Periodenende
{fmtDate(t.dueAt)}}
{t.customerName} {t.customerCode && <>
Kd.-Nr. {t.customerCode}} {t.email && <>
{t.email}}
{t.productLabel}
{taskText(t)}
{scopeText(t)}
{changeText(t)} {t.partial && <>
{partialText(t)}}
{fmtDateTime(t.createdAt)}
{orderedKind(t)}
))}
{data.failed.length > 0 && ( {data.failed.map((f) => (
{fmtDateTime(f.createdAt)} · {f.customerName} · {failedText(f)}
))}
)}

Jedes Abo bringt 5 GB E-Mail-Speicher mit, jedes Zusatzpaket 5 GB dazu. „Einrichten“: Postfachgrenze in konsoleH jetzt auf den Zielwert setzen. „Zum Periodenende“: erst am genannten Tag auf den Zielwert senken. Die Grenzen gelten für den Gesamtspeicher des Kunden (5 GB + 5 GB je Paket); er verteilt ihn nach seiner Vorgabe auf seine Postfächer (§ 3 Abs. 4). Angezeigt wird die Domain der Kontakt-Adresse, eine eigene Mail-Domain ist im Portal nicht gespeichert. „Vergeben“ zählt, was konsoleH gerade hält: eine Verringerung zählt erst nach „Erledigt“. Danach „Erledigt“ drücken – der Kunde hat seine Bestätigung schon bekommen.

)}
) }