diff --git a/service/data-hub/data-connector/src/app.module.ts b/service/data-hub/data-connector/src/app.module.ts index ac1fe6d..852167f 100644 --- a/service/data-hub/data-connector/src/app.module.ts +++ b/service/data-hub/data-connector/src/app.module.ts @@ -10,6 +10,7 @@ import { TicketSystemModule } from './modules/feat-tickets/ticket-system.module' import { DatabaseModule } from './core/database/database.module'; import { PostgresDialect } from 'kysely'; import { Pool } from 'pg'; +import { FeatReportsModule } from './modules/feat-reports/feat-reports.module'; @Module({ imports: [ @@ -29,6 +30,7 @@ import { Pool } from 'pg'; ScheduleModule.forRoot(), EventEmitterModule.forRoot(), FeatureImporterModule, + FeatReportsModule, TicketSystemModule, ], controllers: [AppController], diff --git a/service/data-hub/data-connector/src/modules/feat-reports/feat-reports.module.ts b/service/data-hub/data-connector/src/modules/feat-reports/feat-reports.module.ts new file mode 100644 index 0000000..4452e5a --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-reports/feat-reports.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { ReportsController } from './reports.controller'; +import { ReportsService } from './reports.service'; +import { PrismaModule } from 'src/core/database/prisma.module'; +import { ReportsRepository } from './reports.repository'; + +@Module({ + imports: [PrismaModule], + providers: [ReportsService, ReportsRepository], + controllers: [ReportsController], +}) +export class FeatReportsModule {} diff --git a/service/data-hub/data-connector/src/modules/feat-reports/reports.controller.ts b/service/data-hub/data-connector/src/modules/feat-reports/reports.controller.ts new file mode 100644 index 0000000..f045a30 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-reports/reports.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { ReportsService } from './reports.service'; + +@Controller('reports') +export class ReportsController { + constructor(private readonly service: ReportsService) {} + + @Get('/tours') + async getToursReport() { + return this.service.report(); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-reports/reports.repository.ts b/service/data-hub/data-connector/src/modules/feat-reports/reports.repository.ts new file mode 100644 index 0000000..795a64f --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-reports/reports.repository.ts @@ -0,0 +1,71 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { Kysely, sql } from 'kysely'; +import { KYSELY_CLIENT_PROVIDER_TOKEN } from 'src/core/database/database.module'; +import { DB } from 'src/core/database/types'; + +@Injectable() +export class ReportsRepository { + constructor( + @Inject(KYSELY_CLIENT_PROVIDER_TOKEN) private readonly db: Kysely, + ) {} + + toursReport() { + return this.db + .selectFrom('Tour') + .select((eb) => [ + 'ordinanceType as Verordnungsart', + sql`EXTRACT(MONTH FROM "startDate")`.as('MonthNumber'), + eb.fn.count('operationId').as('TourCount'), + ]) + .groupBy('MonthNumber') + .groupBy('ordinanceType') + .execute(); + } + + patientsReport() { + return this.db + .selectFrom('Patient') + .select((eb) => eb.fn.countAll().as('PatientCount')) + .execute(); + } + + employeesReport() { + return this.db + .selectFrom('Employee') + .select((eb) => eb.fn.countAll().as('EmployeeCount')) + .execute(); + } + + attendanceRegistrationsReport() { + return this.db + .selectFrom('AttendanceRegistration') + .select((eb) => [ + eb.fn.countAll().as('AttendanceRegistrationCount'), + sql`EXTRACT(MONTH FROM "dateTime")`.as('MonthNumber'), + ]) + .groupBy('MonthNumber') + .execute(); + } + + workTimesReport() { + return this.db + .selectFrom('WorkTime') + .select((eb) => [ + eb.fn.countAll().as('WorkTimeCount'), + sql`EXTRACT(MONTH FROM "startDate")`.as('MonthNumber'), + ]) + .groupBy('MonthNumber') + .execute(); + } + + plannedTimesReport() { + return this.db + .selectFrom('PlannedTime') + .select((eb) => [ + eb.fn.countAll().as('PlannedTimeCount'), + sql`EXTRACT(MONTH FROM "startDate")`.as('MonthNumber'), + ]) + .groupBy('MonthNumber') + .execute(); + } +} diff --git a/service/data-hub/data-connector/src/modules/feat-reports/reports.service.ts b/service/data-hub/data-connector/src/modules/feat-reports/reports.service.ts new file mode 100644 index 0000000..6cfaef0 --- /dev/null +++ b/service/data-hub/data-connector/src/modules/feat-reports/reports.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; +import { ReportsRepository } from './reports.repository'; + +@Injectable() +export class ReportsService { + constructor(private readonly repository: ReportsRepository) {} + + async toursReport() { + return this.repository.toursReport(); + } + + report() { + return Promise.all([ + this.repository.toursReport(), + this.repository.employeesReport(), + this.repository.patientsReport(), + this.repository.attendanceRegistrationsReport(), + this.repository.plannedTimesReport(), + this.repository.workTimesReport(), + ]); + } +}