# PROJ-1: Wiedervorlage (Reminder pro Dokument) ## Zweck Nutzer können ein Dokument mit einem Fälligkeitsdatum ("Wiedervorlage") versehen, z.B. um eine Frist oder Rückmeldung nicht zu verpassen. Bei Fälligkeit wird der Ersteller per E-Mail benachrichtigt. ## Datenmodell Tabelle `reminders` (`internal/storage/reminders.go`): ```sql CREATE TABLE IF NOT EXISTS reminders ( id BIGSERIAL PRIMARY KEY, document_id BIGINT NOT NULL REFERENCES documents(id), tenant_id BIGINT NOT NULL, user_id BIGINT NOT NULL, due_date TIMESTAMPTZ NOT NULL, note TEXT, status TEXT NOT NULL DEFAULT 'open', -- open|done|dismissed notified_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_reminders_tenant_due ON reminders(tenant_id, due_date) WHERE status = 'open'; CREATE INDEX IF NOT EXISTS idx_reminders_document ON reminders(document_id); ``` ## API (`internal/api/reminder_handlers.go`) | Methode | Pfad | Beschreibung | |---------|------------------------------------|--------------------------------------| | POST | `/api/documents/{id}/reminders` | Wiedervorlage für Dokument anlegen | | GET | `/api/reminders?status=` | Eigene Wiedervorlagen auflisten | | PATCH | `/api/reminders/{id}` | Status ändern (open/done/dismissed) | | DELETE | `/api/reminders/{id}` | Wiedervorlage löschen | Alle Routen laufen durch `s.auth(...)` (Session + Tenant-Context). Ownership wird in der Store-Schicht über `id + tenant_id + user_id` erzwungen. Jede Statusänderung wird auditiert — auch fehlgeschlagene Versuche. ## Audit-Events (`internal/audit/audit.go`) - `reminder_create` - `reminder_status_change` - `reminder_delete` - `reminder_notify` (Cron-Benachrichtigung) ## Cron-Benachrichtigung `archivdms reminders notify [-config PATH] [-dry-run]` (`cmd/archivdms/cmd_reminders_notify.go`) liest alle offenen Wiedervorlagen mit `due_date <= now()` und `notified_at IS NULL`, versendet eine E-Mail über `internal/mailer`, und setzt `notified_at`. Läuft stündlich per `deploy/cron.d/archivdms-reminders`. ## Frontend - `src/components/reminders/CreateReminderButton.tsx` — Dialog zum Anlegen (Datum via shadcn `calendar.tsx` + `popover.tsx`, Notiz-Textarea) - `src/components/reminders/ReminderBadge.tsx` — Statusanzeige in der Dokument-Detailansicht (offen/fällig/erledigt) - `src/components/reminders/ReminderList.tsx` — Listendarstellung - `src/app/reminders/page.tsx` — Übersichtsseite offen/erledigt ## Akzeptanzkriterien 1. Ein Nutzer kann für ein Dokument seines Tenants eine Wiedervorlage mit Fälligkeitsdatum und optionaler Notiz anlegen. 2. `/reminders` zeigt eigene offene und erledigte Wiedervorlagen getrennt an. 3. Statusänderung (erledigt/verworfen) ist nur für den Ersteller möglich (Ownership-Check via user_id). 4. Der Cron-Job versendet für jede fällige, noch nicht benachrichtigte Wiedervorlage genau eine E-Mail und markiert sie danach als benachrichtigt. 5. Jede Statusänderung und jeder Benachrichtigungsversuch erscheint im Audit-Log, inklusive Fehlschläge.