Offene Vorschauen sichtbar machen und doppelt aufnehmen verhindern

Der Abgleich bucht bewusst nichts, sondern legt eine Vorschau zur Bestaetigung
an. Nur fuehrte von dort kein Weg weiter: die Import-Seite zeigte allein den
Datei-Upload, und die Rueckmeldung sagte lediglich "abgeglichen". Die
gefundenen Pakete lagen damit unsichtbar herum und der Knopf wirkte, als tue
er nichts.

Die Import-Seite listet jetzt alle Importe, die noch auf Bestaetigung warten,
und oeffnet sie in derselben Vorschau wie einen frischen Upload. Die Meldung
nach dem Abgleich nennt die Zahl der Funde und den naechsten Schritt.

Ausserdem beruecksichtigt der Abgleich jetzt offene Vorschauen: bisher pruefte
er nur gegen bereits gebuchte Pakete. Ein zweiter Lauf legte dieselben Zeilen
deshalb ein weiteres Mal an, und beim Buchen kollidierten beide Importe an der
eindeutigen Bestell-ID - der zweite schlug komplett fehl.
This commit is contained in:
2026-09-18 17:12:06 +02:00
parent 724f68644b
commit 6b49b34eef
6 changed files with 222 additions and 13 deletions
+19
View File
@@ -27,6 +27,8 @@ export interface ScrapeSummary {
failedPlayers: { steamId: string; reason: string }[];
newRows: number;
duplicates: number;
/// Lag schon in einer offenen Vorschau und wurde deshalb nicht erneut aufgenommen.
awaitingConfirmation: number;
unclear: number;
usageCounters: number;
}
@@ -50,6 +52,7 @@ export async function scrapePlayers(
failedPlayers: [],
newRows: 0,
duplicates: 0,
awaitingConfirmation: 0,
unclear: 0,
usageCounters: 0,
};
@@ -57,6 +60,15 @@ export async function scrapePlayers(
const rows: Prisma.ImportRowCreateManyImportInput[] = [];
let lineNo = 0;
// Pakete, die bereits in einer noch nicht bestätigten Vorschau liegen. Ohne
// diese Prüfung landet dasselbe Paket bei jedem Abgleich in einem weiteren
// Import, und beim Buchen kollidieren sie miteinander.
const pending = await prisma.importRow.findMany({
where: { externalId: { not: null }, import: { status: ImportStatus.PENDING } },
select: { externalId: true },
});
const alreadyPending = new Set(pending.map((row) => row.externalId as string));
for (const target of targets) {
let profile: ScrapedProfile;
try {
@@ -112,6 +124,12 @@ export async function scrapePlayers(
continue;
}
if (alreadyPending.has(externalId)) {
summary.awaitingConfirmation += 1;
continue;
}
alreadyPending.add(externalId);
lineNo += 1;
rows.push({
lineNo,
@@ -162,6 +180,7 @@ export async function scrapePlayers(
scannedPlayers: summary.scannedPlayers,
newRows: summary.newRows,
duplicates: summary.duplicates,
awaitingConfirmation: summary.awaitingConfirmation,
unclear: summary.unclear,
failed: summary.failedPlayers.length,
},