wg-verwaltung/backend/src/routes/cockpit.ts

55 lines
1.6 KiB
TypeScript

import { Router, Request, Response } from 'express';
import { PrismaClient } from '@prisma/client';
import { PaymentService } from '../modules/banking/paymentService';
const prisma = new PrismaClient();
const paymentService = new PaymentService(prisma);
/** Router für das Vermieter-Cockpit-Dashboard (aggregierte Übersichtsdaten). */
export const cockpitRouter = Router();
cockpitRouter.get('/cockpit/summary', async (_req: Request, res: Response) => {
const [trafficLights, openTickets, rooms] = await Promise.all([
paymentService.getRentTrafficLights(),
prisma.ticket.findMany({
where: { status: { in: ['OPEN', 'IN_PROGRESS'] } },
orderBy: { createdAt: 'desc' },
select: {
id: true,
title: true,
category: true,
priority: true,
status: true,
createdAt: true,
room: { select: { roomNumber: true } },
},
}),
prisma.room.findMany({
select: { id: true, roomNumber: true, sizeSqm: true, status: true },
orderBy: { roomNumber: 'asc' },
}),
]);
const counts = { GREEN: 0, YELLOW: 0, RED: 0 } as Record<'GREEN' | 'YELLOW' | 'RED', number>;
let totalWarmRentSum = 0;
for (const light of trafficLights) {
counts[light.status]++;
totalWarmRentSum += light.amountDue;
}
res.status(200).json({
generatedAt: new Date().toISOString(),
rooms,
trafficLights,
summary: {
totalRooms: rooms.length,
rentGreen: counts.GREEN,
rentYellow: counts.YELLOW,
rentRed: counts.RED,
totalMonthlyRentTarget: totalWarmRentSum,
openTicketsCount: openTickets.length,
},
openTickets,
});
});