feat: Archiv-Tab fuer Bestellungen, Retouren und Produkte im Admin
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 3m24s
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 3m24s
Abgeschlossene Eintraege wandern automatisch in einen Tab "Archiv", damit die aktiven Listen nur zeigen, was noch zu tun ist: - Bestellungen: versendet/abgeholt/storniert, keine offene Retoure, seit einem Monat nicht bearbeitet - Retouren: angenommen/abgelehnt/erstattet, seit einem Monat nicht bearbeitet - Produkte: seit einem Monat Bestand 0 (nur Admin-Sicht, Shop unveraendert) Die Automatik laeuft beim Oeffnen der jeweiligen Liste (hoechstens alle 5 Minuten) und holt Eintraege zurueck, sobald sie wieder offen sind. Zusaetzlich "Archivieren"/"Wiederherstellen" per Hand; von Hand archivierte Eintraege fasst die Automatik nicht an. Alle Verschiebungen landen im Audit-Log. Neue Felder archivedAt/archivedManually samt Index an orders, return_requests und products (Migration 20260925010000_archive_fields). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
01eaca39dc
commit
fb9c2353c6
14 files changed
+772
-54
No files matched your search
@@ -0,0 +1,31 @@
|
||||
-- Archiv fuer Bestellungen, Retouren und Produkte (siehe lib/archive.ts).
|
||||
--
|
||||
-- archivedAt gesetzt = Eintrag erscheint im Admin-Tab "Archiv" statt in der
|
||||
-- aktiven Liste. Die Automatik archiviert abgeschlossene Eintraege nach einem
|
||||
-- Monat ohne Bearbeitung (Produkte: Bestand 0) und holt sie zurueck, sobald
|
||||
-- sie wieder offen sind. archivedManually markiert Eintraege, die jemand
|
||||
-- von Hand archiviert hat — die fasst die Automatik nicht an.
|
||||
--
|
||||
-- Nullable bzw. mit Default: bestehende Zeilen gelten als aktiv; der erste
|
||||
-- Aufruf der jeweiligen Admin-Liste archiviert faellige Altbestaende.
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "orders" ADD COLUMN "archivedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "archivedManually" BOOLEAN NOT NULL DEFAULT false;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "return_requests" ADD COLUMN "archivedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "archivedManually" BOOLEAN NOT NULL DEFAULT false;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "products" ADD COLUMN "archivedAt" TIMESTAMP(3),
|
||||
ADD COLUMN "archivedManually" BOOLEAN NOT NULL DEFAULT false;
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "orders_archivedAt_idx" ON "orders"("archivedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "return_requests_archivedAt_idx" ON "return_requests"("archivedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "products_archivedAt_idx" ON "products"("archivedAt");
|
||||
@@ -255,6 +255,13 @@ model Product {
|
||||
/// Liste von Bild-URLs als JSON-Array, siehe tasteTags-Kommentar oben.
|
||||
images Json @default("[]")
|
||||
isActive Boolean @default(true)
|
||||
/// Archiv (siehe lib/archive.ts): gesetzt = im Admin-Tab "Archiv" statt in
|
||||
/// der aktiven Liste. Wird beim Oeffnen der Admin-Liste automatisch nach
|
||||
/// den Regeln dort gesetzt und wieder geloescht; archivedManually
|
||||
/// kennzeichnet einen Klick auf "Archivieren", den die Automatik nicht
|
||||
/// rueckgaengig machen darf.
|
||||
archivedAt DateTime?
|
||||
archivedManually Boolean @default(false)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@ -266,6 +273,7 @@ model Product {
|
||||
wishlistItems WishlistItem[]
|
||||
stockNotifications StockNotification[]
|
||||
|
||||
@@index([archivedAt])
|
||||
@@map("products")
|
||||
}
|
||||
|
||||
@@ -412,6 +420,14 @@ model Order {
|
||||
/// Verpacken von Hand beigelegt (siehe Admin-Bestelldetail).
|
||||
giftMessage String?
|
||||
|
||||
/// Archiv (siehe lib/archive.ts): gesetzt = im Admin-Tab "Archiv" statt in
|
||||
/// der aktiven Liste. Wird beim Oeffnen der Admin-Liste automatisch nach
|
||||
/// den Regeln dort gesetzt und wieder geloescht; archivedManually
|
||||
/// kennzeichnet einen Klick auf "Archivieren", den die Automatik nicht
|
||||
/// rueckgaengig machen darf.
|
||||
archivedAt DateTime?
|
||||
archivedManually Boolean @default(false)
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@ -434,6 +450,8 @@ model Order {
|
||||
@@index([createdAt])
|
||||
/// Nutzungszaehlung eines Rabattcodes beim Checkout (Order.count nach discountCodeId).
|
||||
@@index([discountCodeId])
|
||||
/// Tab-Filter Aktiv/Archiv im Admin-Bereich.
|
||||
@@index([archivedAt])
|
||||
@@map("orders")
|
||||
}
|
||||
|
||||
@@ -451,11 +469,19 @@ model ReturnRequest {
|
||||
orderId String @unique
|
||||
reason String
|
||||
status ReturnStatus @default(ANGEFRAGT)
|
||||
/// Archiv (siehe lib/archive.ts): gesetzt = im Admin-Tab "Archiv" statt in
|
||||
/// der aktiven Liste. Wird beim Oeffnen der Admin-Liste automatisch nach
|
||||
/// den Regeln dort gesetzt und wieder geloescht; archivedManually
|
||||
/// kennzeichnet einen Klick auf "Archivieren", den die Automatik nicht
|
||||
/// rueckgaengig machen darf.
|
||||
archivedAt DateTime?
|
||||
archivedManually Boolean @default(false)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([archivedAt])
|
||||
@@map("return_requests")
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user