Desktop ist wieder auf Horizontal-Scroll zurückgebaut, mobil bleibt die Dropdown-Auswahl. Dabei habe ich die Scroll-Container stabilisiert, damit die AG- und Budgetkarten sauber scrollen statt seitlich zu „wackeln“, in dashboard-shell.tsx und budget-column.tsx.
All checks were successful
CI / Build (push) Successful in 1m17s
CI / Deploy (push) Successful in 1m0s

Die Abo-Logik ist jetzt deutlich sauberer: beim Anlegen gibt es ein Startdatum, der Server leitet daraus Monatsraten für den gewählten Zeitraum ab, Budgets rechnen mit dem periodischen Gesamtbetrag, und Abo-Ausgaben erscheinen als aufklappbare Gruppe statt als aufgeblähte Liste. Das steckt vor allem in page.tsx, recurring-expenses.ts, route.ts, dashboard-types.ts und der Migration migration.sql. Backup/Import und Audit-Restore kennen das neue Feld ebenfalls.
This commit is contained in:
Jan
2026-04-13 13:53:20 +02:00
parent 700e677c45
commit ee8b1a6f7b
13 changed files with 379 additions and 92 deletions

View File

@@ -37,6 +37,7 @@ const CSV_HEADERS = [
"approvalStatus",
"approvalType",
"recurrence",
"recurrenceStartAt",
"proofUrl",
"createdAt",
"paidAt",
@@ -201,6 +202,7 @@ export async function GET() {
approvalStatus: "",
approvalType: "",
recurrence: "",
recurrenceStartAt: "",
proofUrl: "",
createdAt: user.createdAt.toISOString(),
paidAt: "",
@@ -252,6 +254,7 @@ export async function GET() {
approvalStatus: "",
approvalType: "",
recurrence: "",
recurrenceStartAt: "",
proofUrl: "",
createdAt: period.createdAt.toISOString(),
paidAt: "",
@@ -303,6 +306,7 @@ export async function GET() {
approvalStatus: "",
approvalType: "",
recurrence: "",
recurrenceStartAt: "",
proofUrl: "",
createdAt: group.createdAt.toISOString(),
paidAt: "",
@@ -353,6 +357,7 @@ export async function GET() {
approvalStatus: "",
approvalType: "",
recurrence: "",
recurrenceStartAt: "",
proofUrl: "",
createdAt: budget.createdAt.toISOString(),
paidAt: "",
@@ -403,6 +408,7 @@ export async function GET() {
approvalStatus: expense.approvalStatus,
approvalType: "",
recurrence: expense.recurrence,
recurrenceStartAt: expense.recurrenceStartAt?.toISOString() ?? "",
proofUrl: expense.proofUrl ?? "",
createdAt: expense.createdAt.toISOString(),
paidAt: expense.paidAt?.toISOString() ?? "",
@@ -453,6 +459,7 @@ export async function GET() {
approvalStatus: expense.approvalStatus,
approvalType: approval.approvalType,
recurrence: expense.recurrence,
recurrenceStartAt: expense.recurrenceStartAt?.toISOString() ?? "",
proofUrl: "",
createdAt: approval.timestamp.toISOString(),
paidAt: "",
@@ -507,6 +514,7 @@ export async function GET() {
approvalStatus: "",
approvalType: "",
recurrence: "",
recurrenceStartAt: "",
proofUrl: "",
createdAt: auditLog.createdAt.toISOString(),
paidAt: "",