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 { 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; }