Weboberflaeche mit Spielerkonto, Import und Verwaltung
Die Spieler-Detailseite beantwortet die Kernfrage direkt: drei grosse Zaehler, rot sobald ein Topf im Minus ist, darunter ob ein neuer CC oder ein Redesign gerade moeglich ist. Inaktive CCs zeigen ihren Grund und bieten genau die passende Aktion an - gratis reaktivieren oder bezahlt. Beim Redesign steht der Kulanz-Topf an erster Stelle, damit er zuerst aufgebraucht wird. Der Import fuehrt ueber Spaltenzuordnung und Vorschau; gebucht wird erst nach Bestaetigung.
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
import type { CreditKind, CreditSource, InactiveReason, ImportPlan } from './types';
|
||||
|
||||
export const KIND_LABEL: Record<CreditKind, string> = {
|
||||
CC: 'CC-Guthaben',
|
||||
REDESIGN_PAID: 'Redesign (bezahlt)',
|
||||
REDESIGN_KULANZ: 'Redesign (Kulanz)',
|
||||
};
|
||||
|
||||
export const SOURCE_LABEL: Record<CreditSource, string> = {
|
||||
CC_PACKAGE: 'CC-Paket',
|
||||
REDESIGN_PACKAGE: 'Redesign-Paket',
|
||||
KULANZ: 'Kulanz',
|
||||
ADJUSTMENT: 'Korrektur',
|
||||
CONSUME: 'Verbrauch',
|
||||
REVERSAL: 'Storno',
|
||||
};
|
||||
|
||||
export const REASON_LABEL: Record<InactiveReason, string> = {
|
||||
PLAYER_INACTIVITY: 'Spieler-Inaktivitaet',
|
||||
REWORKED: 'Redesignt',
|
||||
OTHER: 'Sonstiger Grund',
|
||||
};
|
||||
|
||||
export const PLAN_LABEL: Record<ImportPlan, string> = {
|
||||
BOOK: 'Wird gebucht',
|
||||
CREATE_PLAYER_AND_BOOK: 'Spieler anlegen + buchen',
|
||||
SKIP_DUPLICATE: 'Uebersprungen: schon gebucht',
|
||||
SKIP_IGNORED: 'Uebersprungen: ignoriertes Produkt',
|
||||
SKIP_UNMAPPED: 'Uebersprungen: kein Mapping',
|
||||
SKIP_NO_PLAYER: 'Uebersprungen: Spieler unbekannt',
|
||||
};
|
||||
|
||||
const dateFormat = new Intl.DateTimeFormat('de-DE', {
|
||||
day: '2-digit',
|
||||
month: '2-digit',
|
||||
year: 'numeric',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
});
|
||||
|
||||
export function formatDate(value: string | null | undefined): string {
|
||||
if (!value) return '—';
|
||||
const parsed = new Date(value);
|
||||
return Number.isNaN(parsed.getTime()) ? '—' : dateFormat.format(parsed);
|
||||
}
|
||||
|
||||
export function formatAmount(amount: number): string {
|
||||
return amount > 0 ? `+${amount}` : String(amount);
|
||||
}
|
||||
Reference in New Issue
Block a user