Added financial report

This commit is contained in:
Roba Boru
2026-08-12 11:24:12 +03:00
parent e2e1685b62
commit bdcdb4f047
12 changed files with 1170 additions and 232 deletions

View File

@@ -8,7 +8,7 @@ import {
ApiProduces,
} from "@nestjs/swagger";
import { ReportsService } from "./reports.service";
import { BlockedSeatsRevenueLossQueryDto, GenerateReportDto } from "./reports.dto";
import { BlockedSeatsRevenueLossQueryDto, FinanceSummaryQueryDto, GenerateReportDto } from "./reports.dto";
import { PassengerStaff } from "../../common/passenger-guards";
import { PASSENGER_PERMS } from "../../seed/passenger-permissions.registry";
@@ -83,6 +83,35 @@ export class ReportsController {
return this.service.getPaymentDiscrepancyBySchedule(scheduleId, { search, seatClass, sort });
}
// ── Finance Summary ──────────────────────────────────────────────────────
@Get("finance")
@ApiOperation({
summary: "Finance summary — revenue by period, origin/destination segment, and payment method",
description:
"Revenue collected in the window (PaymentIntent.paidAt), grouped by day/week/month, origin → " +
"destination station pair, and payment method. Filter by originStationId and/or destinationStationId " +
"independently to query any station-pair segment (A→B, A→D, B→C), not just a whole predefined route. " +
"Returns per-bucket rows plus roll-ups by period, segment, and method for charting.",
})
getFinanceSummary(@Query() query: FinanceSummaryQueryDto) {
return this.service.getFinanceSummary(query);
}
@Get("finance/export")
@ApiOperation({ summary: "Finance summary as CSV — one row per period + route + payment method" })
@ApiProduces("text/csv")
@ApiOkResponse({ description: "CSV export", schema: { type: "string" } })
async exportFinanceSummary(@Query() query: FinanceSummaryQueryDto, @Res() res: Response): Promise<void> {
const csv = await this.service.exportFinanceSummaryCsv(query);
res.setHeader("Content-Type", "text/csv; charset=utf-8");
res.setHeader(
"Content-Disposition",
`attachment; filename="finance-summary-${new Date().toISOString().split("T")[0]}.csv"`,
);
res.send(csv);
}
// ── Blocked Seat Revenue Loss ──────────────────────────────────────────────
@Get("blocked-seats-revenue-loss")