fix: Befunde aus Sicherheits- und Korrektheitsreview der Bienenpatenschaft
Docker Image bauen und veroeffentlichen / typecheck (push) Successful in 2m57s
Docker Image bauen und veroeffentlichen / lint (push) Successful in 3m7s
Docker Image bauen und veroeffentlichen / build-and-push (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / test (push) Canceled after 1m22s
Docker Image bauen und veroeffentlichen / typecheck (push) Successful in 2m57s
Docker Image bauen und veroeffentlichen / lint (push) Successful in 3m7s
Docker Image bauen und veroeffentlichen / build-and-push (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / test (push) Canceled after 1m22s
- Oeffentliche Kuendigung: exakte Identifikation, Limits je Vertrag und Adresse, Bestaetigung nur an die Kontoadresse mit Ruecknahme-Link (HMAC) - Vorschau: Body-Grenze beim Lesen, Parallelitaets- und Minutenlimit, Cache - Rabatte gelten nicht fuer Patenschaftspositionen - Abo aktiv erst nach bestaetigter Zahlung, offene Abschluesse zaehlen zum Kontingent und werden nach 24 h aufgeraeumt, Sitzung 58 Minuten - Konto-Loeschung nur ohne laufendes Abo, Urkunden-Dateien werden entfernt - Abo-Lieferungen mit Zahlungszeile (DHL-Marke moeglich) - Shop zeigt freien Bestand nach Abo-Reservierung - Storno/volle Erstattung widerruft die Patenschaft (Status WIDERRUFEN) - Umsatzsteuer der Patenschaft per VAT_RATE_PERCENT_PATENSCHAFT (19 %) - Digitale Bestellungen archivieren sich, Kalendertage in Europe/Berlin, Monatsenden begrenzt, Datenauskunft um Patenschaften ergaenzt Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
f227aeb8f9
commit
515fca1c16
97 files changed
+2979
-254
No files matched your search
@@ -0,0 +1,34 @@
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
/**
|
||||
* Widerruft die Patenschaften einer stornierten oder voll erstatteten
|
||||
* Einmal-Bestellung (Ausloeser: die Stornorechnung, lib/cancellation-
|
||||
* invoice.ts). Wer sein Geld zurueck hat, behaelt keine Urkunde, keine
|
||||
* Downloads und kein Recht zur Uebertragung.
|
||||
*
|
||||
* Nur ueber die Hauptposition (MAIN) — Monatsbestellungen eines Abos haben
|
||||
* keine und bleiben unberuehrt. Idempotent: bereits widerrufene werden
|
||||
* uebersprungen. Eine Wiederaufnahme der Bestellung im Admin stellt NICHT
|
||||
* automatisch wieder her (die Bestellseite zeigt dazu einen Hinweis).
|
||||
*
|
||||
* @returns IDs der jetzt widerrufenen Patenschaften
|
||||
*/
|
||||
export async function revokeOrderSponsorships(orderId: string, now: Date = new Date()): Promise<string[]> {
|
||||
const sponsorships = await prisma.sponsorship.findMany({
|
||||
where: { orderItem: { orderId, sponsorshipRole: "MAIN" }, status: { not: "WIDERRUFEN" } },
|
||||
select: { id: true },
|
||||
});
|
||||
const ids = sponsorships.map((sponsorship) => sponsorship.id);
|
||||
if (ids.length === 0) return [];
|
||||
|
||||
await prisma.$transaction(async (tx) => {
|
||||
// nextAttemptAt leeren: die Ausstellung (issue.ts) soll eine widerrufene
|
||||
// Patenschaft nicht mehr anfassen.
|
||||
await tx.sponsorship.updateMany({ where: { id: { in: ids } }, data: { status: "WIDERRUFEN", nextAttemptAt: null } });
|
||||
await tx.sponsorshipTransfer.updateMany({
|
||||
where: { sponsorshipId: { in: ids }, claimedAt: null, revokedAt: null },
|
||||
data: { revokedAt: now },
|
||||
});
|
||||
});
|
||||
return ids;
|
||||
}
|
||||
Reference in new issue
Block a user