die AG-Übersicht bekommt die gleiche Dropdown-Auswahl wie mobil statt Horizontal-Scroll, und ich räume die Umlaut-Geschichte sauber auf, damit wir wieder normales UTF-8 im Code haben statt dieser ASCII-Ausweichmanöver.
This commit is contained in:
@@ -99,7 +99,7 @@ export async function DELETE(_: Request, { params }: Context) {
|
||||
}
|
||||
|
||||
if (!canManageBudgets(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen Budgets loeschen." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen Budgets löschen." }, { status: 403 });
|
||||
}
|
||||
|
||||
const budget = await prisma.budget.findUnique({
|
||||
|
||||
@@ -120,7 +120,7 @@ export async function POST(request: Request, { params }: Context) {
|
||||
entityType: "expense",
|
||||
entityId: expense.id,
|
||||
entityLabel: expense.title,
|
||||
summary: `${parsed.data.approvalType} fuer ${expense.title} wurde gesetzt.`,
|
||||
summary: `${parsed.data.approvalType} für ${expense.title} wurde gesetzt.`,
|
||||
metadata: {
|
||||
approvalType: parsed.data.approvalType,
|
||||
approvalThreshold,
|
||||
|
||||
@@ -35,7 +35,7 @@ export async function DELETE(_: Request, { params }: Context) {
|
||||
|
||||
if (!isAdminDelete && !isOwnPendingExpense) {
|
||||
return NextResponse.json(
|
||||
{ error: "Du darfst nur eigene ungepruefte Ausgaben loeschen." },
|
||||
{ error: "Du darfst nur eigene ungeprüfte Ausgaben löschen." },
|
||||
{ status: 403 }
|
||||
);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ export async function POST(request: Request) {
|
||||
const parsed = expenseSchema.safeParse(body);
|
||||
|
||||
if (!parsed.success) {
|
||||
return NextResponse.json({ error: "Bitte Titel, Betrag und AG korrekt ausfuellen." }, { status: 400 });
|
||||
return NextResponse.json({ error: "Bitte Titel, Betrag und AG korrekt ausfüllen." }, { status: 400 });
|
||||
}
|
||||
|
||||
if (!canCreateExpenseForGroup(viewer.role, viewer.workingGroupId, parsed.data.agId)) {
|
||||
|
||||
@@ -58,14 +58,14 @@ export async function POST(request: Request) {
|
||||
const uploadedFile = formData?.get("file");
|
||||
|
||||
if (!(uploadedFile instanceof File)) {
|
||||
return NextResponse.json({ error: "Bitte eine CSV-Datei auswaehlen." }, { status: 400 });
|
||||
return NextResponse.json({ error: "Bitte eine CSV-Datei auswählen." }, { status: 400 });
|
||||
}
|
||||
|
||||
const content = await uploadedFile.text();
|
||||
const rows = parseCsv(content);
|
||||
|
||||
if (rows.length < 2) {
|
||||
return NextResponse.json({ error: "Die CSV-Datei enthaelt keine Daten." }, { status: 400 });
|
||||
return NextResponse.json({ error: "Die CSV-Datei enthält keine Daten." }, { status: 400 });
|
||||
}
|
||||
|
||||
const headers = rows[0];
|
||||
@@ -81,7 +81,7 @@ export async function POST(request: Request) {
|
||||
|
||||
if (userRows.some((entry) => !entry.passwordHash)) {
|
||||
return NextResponse.json(
|
||||
{ error: "Dieses Backup stammt aus einem alten Format ohne Passwort-Hashes und kann nicht vollstaendig eingespielt werden." },
|
||||
{ error: "Dieses Backup stammt aus einem alten Format ohne Passwort-Hashes und kann nicht vollständig eingespielt werden." },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
@@ -119,7 +119,7 @@ export async function POST(request: Request) {
|
||||
const endsAt = toDate(row.periodEndsAt);
|
||||
|
||||
if (!startsAt || !endsAt) {
|
||||
throw new Error(`Zeitraum ${row.periodName || row.id} enthaelt kein gueltiges Datum.`);
|
||||
throw new Error(`Zeitraum ${row.periodName || row.id} enthält kein gültiges Datum.`);
|
||||
}
|
||||
|
||||
await tx.accountingPeriod.create({
|
||||
@@ -169,7 +169,7 @@ export async function POST(request: Request) {
|
||||
const totalBudget = toNumber(row.totalBudget);
|
||||
|
||||
if (totalBudget === null) {
|
||||
throw new Error(`Budget ${row.budgetName || row.id} enthaelt keinen gueltigen Betrag.`);
|
||||
throw new Error(`Budget ${row.budgetName || row.id} enthält keinen gültigen Betrag.`);
|
||||
}
|
||||
|
||||
await tx.budget.create({
|
||||
@@ -189,7 +189,7 @@ export async function POST(request: Request) {
|
||||
const amount = toNumber(row.amount);
|
||||
|
||||
if (amount === null) {
|
||||
throw new Error(`Ausgabe ${row.title || row.id} enthaelt keinen gueltigen Betrag.`);
|
||||
throw new Error(`Ausgabe ${row.title || row.id} enthält keinen gültigen Betrag.`);
|
||||
}
|
||||
|
||||
await tx.expense.create({
|
||||
@@ -216,7 +216,7 @@ export async function POST(request: Request) {
|
||||
const timestamp = toDate(row.createdAt);
|
||||
|
||||
if (!timestamp) {
|
||||
throw new Error(`Freigabe ${row.id} enthaelt keinen gueltigen Zeitstempel.`);
|
||||
throw new Error(`Freigabe ${row.id} enthält keinen gültigen Zeitstempel.`);
|
||||
}
|
||||
|
||||
await tx.approval.create({
|
||||
|
||||
@@ -20,7 +20,7 @@ export async function DELETE(_: Request, { params }: Context) {
|
||||
}
|
||||
|
||||
if (!canManageBudgets(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen Zeitraeume loeschen." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen Zeiträume löschen." }, { status: 403 });
|
||||
}
|
||||
|
||||
const period = await prisma.accountingPeriod.findUnique({
|
||||
@@ -40,12 +40,12 @@ export async function DELETE(_: Request, { params }: Context) {
|
||||
}
|
||||
|
||||
if (period.isCurrent) {
|
||||
return NextResponse.json({ error: "Der aktuell aktive Zeitraum kann nicht geloescht werden." }, { status: 400 });
|
||||
return NextResponse.json({ error: "Der aktuell aktive Zeitraum kann nicht gelöscht werden." }, { status: 400 });
|
||||
}
|
||||
|
||||
if (period._count.budgets > 0 || period._count.expenses > 0) {
|
||||
return NextResponse.json(
|
||||
{ error: "Dieser Zeitraum enthaelt noch Budgets oder Ausgaben und kann deshalb nicht geloescht werden." },
|
||||
{ error: "Dieser Zeitraum enthält noch Budgets oder Ausgaben und kann deshalb nicht gelöscht werden." },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
@@ -60,7 +60,7 @@ export async function DELETE(_: Request, { params }: Context) {
|
||||
entityType: "period",
|
||||
entityId: period.id,
|
||||
entityLabel: period.name,
|
||||
summary: `Zeitraum ${period.name} wurde geloescht.`,
|
||||
summary: `Zeitraum ${period.name} wurde gelöscht.`,
|
||||
metadata: {
|
||||
rollback: {
|
||||
kind: "period.delete",
|
||||
|
||||
@@ -18,14 +18,14 @@ export async function PATCH(request: Request) {
|
||||
}
|
||||
|
||||
if (!canManageBudgets(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen den aktuellen Zeitraum wechseln." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen den aktuellen Zeitraum wechseln." }, { status: 403 });
|
||||
}
|
||||
|
||||
const body = await request.json().catch(() => null);
|
||||
const parsed = currentPeriodSchema.safeParse(body);
|
||||
|
||||
if (!parsed.success) {
|
||||
return NextResponse.json({ error: "Bitte einen gueltigen Zeitraum auswaehlen." }, { status: 400 });
|
||||
return NextResponse.json({ error: "Bitte einen gültigen Zeitraum auswählen." }, { status: 400 });
|
||||
}
|
||||
|
||||
const period = await prisma.accountingPeriod.findUnique({
|
||||
|
||||
@@ -22,7 +22,7 @@ export async function POST(request: Request) {
|
||||
}
|
||||
|
||||
if (!canManageBudgets(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen Zeitraeume verwalten." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen Zeiträume verwalten." }, { status: 403 });
|
||||
}
|
||||
|
||||
const body = await request.json().catch(() => null);
|
||||
|
||||
@@ -25,7 +25,7 @@ export async function POST(request: Request, { params }: Context) {
|
||||
}
|
||||
|
||||
if (!canManageUsers(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen Passwoerter neu setzen." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen Passwörter neu setzen." }, { status: 403 });
|
||||
}
|
||||
|
||||
const body = await request.json().catch(() => null);
|
||||
|
||||
@@ -124,11 +124,11 @@ export async function DELETE(_: Request, { params }: Context) {
|
||||
}
|
||||
|
||||
if (!canManageUsers(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen Nutzer loeschen." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen Nutzer löschen." }, { status: 403 });
|
||||
}
|
||||
|
||||
if (viewer.id === params.id) {
|
||||
return NextResponse.json({ error: "Du kannst dein eigenes Konto hier nicht loeschen." }, { status: 400 });
|
||||
return NextResponse.json({ error: "Du kannst dein eigenes Konto hier nicht löschen." }, { status: 400 });
|
||||
}
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
@@ -149,7 +149,7 @@ export async function DELETE(_: Request, { params }: Context) {
|
||||
|
||||
if (user._count.approvals > 0 || user._count.createdExpenses > 0) {
|
||||
return NextResponse.json(
|
||||
{ error: "Nutzer mit Freigaben oder Ausgaben koennen nicht geloescht werden." },
|
||||
{ error: "Nutzer mit Freigaben oder Ausgaben können nicht gelöscht werden." },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ export async function PATCH(request: Request, { params }: Context) {
|
||||
}
|
||||
|
||||
if (!canManageBudgets(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen AGs bearbeiten." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen AGs bearbeiten." }, { status: 403 });
|
||||
}
|
||||
|
||||
const body = await request.json().catch(() => null);
|
||||
@@ -95,7 +95,7 @@ export async function DELETE(_: Request, { params }: Context) {
|
||||
}
|
||||
|
||||
if (!canManageBudgets(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen AGs loeschen." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen AGs löschen." }, { status: 403 });
|
||||
}
|
||||
|
||||
const workingGroup = await prisma.workingGroup.findUnique({
|
||||
|
||||
@@ -19,7 +19,7 @@ export async function POST(request: Request) {
|
||||
}
|
||||
|
||||
if (!canManageBudgets(viewer.role)) {
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG duerfen AGs verwalten." }, { status: 403 });
|
||||
return NextResponse.json({ error: "Nur Vorstand oder Finanz-AG dürfen AGs verwalten." }, { status: 403 });
|
||||
}
|
||||
|
||||
const body = await request.json().catch(() => null);
|
||||
|
||||
Reference in New Issue
Block a user