Files
Atlas/app/dashboard/page.tsx
Julia Wehden a2c95c70e7 feat: Equipment-System, Buchungsbearbeitung, Kundenadresse, LexOffice-Fix
- Vintage Modell hinzugefuegt
- Equipment Multi-Select (Neue Buchung + Bearbeitung)
- Kundenadresse in Formularen
- Bearbeiten-Seite fuer Buchungen
- Abbau-Zeiten in Formularen und Uebersicht
- Vertrag PDF nur bei Privatkunden
- LexOffice Kontakt-Erstellung Fix (BUSINESS)
- Zurueck-Pfeil auf Touren-Seite
2026-03-19 16:21:55 +01:00

100 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { prisma } from '@/lib/prisma';
import DashboardContent from '@/components/DashboardContent';
import DashboardSidebar from '@/components/DashboardSidebar';
export default async function DashboardPage() {
const session = await getServerSession(authOptions);
const isTestMode = process.env.TEST_MODE === 'true';
const testEmailRecipient = process.env.TEST_EMAIL_RECIPIENT;
const emailEnabled = process.env.EMAIL_ENABLED !== 'false';
const autoWorkflows = process.env.AUTO_WORKFLOWS === 'true';
const stats = {
totalBookings: await prisma.booking.count(),
reservedBookings: await prisma.booking.count({
where: { status: 'RESERVED' },
}),
confirmedBookings: await prisma.booking.count({
where: { status: 'CONFIRMED' },
}),
completedBookings: await prisma.booking.count({
where: { status: 'COMPLETED' },
}),
totalLocations: await prisma.location.count(),
totalPhotoboxes: await prisma.photobox.count({
where: { active: true },
}),
totalDrivers: await prisma.user.count({
where: { role: 'DRIVER', active: true },
}),
};
const recentBookings = await prisma.booking.findMany({
take: 5,
orderBy: { createdAt: 'desc' },
include: {
location: true,
photobox: true,
},
});
return (
<div className="min-h-screen bg-gradient-to-br from-gray-900 via-gray-800 to-gray-900">
<div className="flex">
<DashboardSidebar user={session?.user} />
<main className="flex-1 p-8">
{/* Development Mode Warning Banner */}
{isTestMode && (
<div className="mb-6 bg-yellow-500/10 border-2 border-yellow-500 rounded-xl p-4 shadow-lg">
<div className="flex items-start gap-3">
<div className="text-3xl">🧪</div>
<div className="flex-1">
<h3 className="text-lg font-bold text-yellow-400 mb-1">
TEST-MODUS AKTIV
</h3>
<p className="text-yellow-200 text-sm mb-2">
Alle E-Mails werden an <strong>{testEmailRecipient || 'Test-E-Mail'}</strong> umgeleitet.
<br />
Echte Kunden erhalten KEINE E-Mails!
</p>
<div className="flex gap-4 text-xs text-yellow-300/80">
<span>📧 E-Mails: {emailEnabled ? '✅ Aktiv' : '❌ Deaktiviert'}</span>
<span>🤖 Auto-Workflows: {autoWorkflows ? '✅ Aktiv' : '❌ Deaktiviert'}</span>
</div>
</div>
</div>
</div>
)}
{!emailEnabled && !isTestMode && (
<div className="mb-6 bg-red-500/10 border-2 border-red-500 rounded-xl p-4 shadow-lg">
<div className="flex items-start gap-3">
<div className="text-3xl"></div>
<div className="flex-1">
<h3 className="text-lg font-bold text-red-400 mb-1">
E-MAIL-VERSAND DEAKTIVIERT
</h3>
<p className="text-red-200 text-sm">
EMAIL_ENABLED=false - Kunden erhalten keine E-Mails!
<br />
Setzen Sie EMAIL_ENABLED="true" in der .env Datei.
</p>
</div>
</div>
</div>
)}
<DashboardContent
user={session?.user}
stats={stats}
recentBookings={recentBookings}
/>
</main>
</div>
</div>
);
}