Files
dyolink/backend/src/modules/today/dto/today-summary-query.dto.ts

72 lines
1.9 KiB
TypeScript

import { ApiPropertyOptional } from '@nestjs/swagger';
import { IsIn, IsISO8601, IsInt, IsOptional, Max, Min } from 'class-validator';
import { Type } from 'class-transformer';
const WEEK_MONTH = ['week', 'month'] as const;
const WEEK_MONTH_YEAR = ['week', 'month', 'year'] as const;
export class TodaySummaryQueryDto {
@ApiPropertyOptional({
description: 'Start of the local day range (ISO 8601). Defaults to UTC midnight today.',
example: '2026-07-10T00:00:00.000Z',
})
@IsOptional()
@IsISO8601()
from?: string;
@ApiPropertyOptional({
description: 'End of the local day range (ISO 8601, exclusive). Defaults to next UTC midnight.',
example: '2026-07-11T00:00:00.000Z',
})
@IsOptional()
@IsISO8601()
to?: string;
@ApiPropertyOptional({
description:
'Client UTC offset in minutes (same sign as Date.getTimezoneOffset negated). Used for hourly buckets.',
example: 210,
})
@IsOptional()
@Type(() => Number)
@IsInt()
@Min(-840)
@Max(840)
utcOffsetMinutes?: number;
@ApiPropertyOptional({ enum: WEEK_MONTH })
@IsOptional()
@IsIn(WEEK_MONTH)
appointmentsWeekPeriod?: 'week' | 'month';
@ApiPropertyOptional({ enum: WEEK_MONTH })
@IsOptional()
@IsIn(WEEK_MONTH)
appointmentsWeekMinePeriod?: 'week' | 'month';
@ApiPropertyOptional({ enum: WEEK_MONTH })
@IsOptional()
@IsIn(WEEK_MONTH)
labTaskActivityPeriod?: 'week' | 'month';
@ApiPropertyOptional({ enum: WEEK_MONTH })
@IsOptional()
@IsIn(WEEK_MONTH)
casesDuePeriod?: 'week' | 'month';
@ApiPropertyOptional({ enum: WEEK_MONTH_YEAR })
@IsOptional()
@IsIn(WEEK_MONTH_YEAR)
treatmentMixPeriod?: 'week' | 'month' | 'year';
@ApiPropertyOptional({ enum: WEEK_MONTH_YEAR })
@IsOptional()
@IsIn(WEEK_MONTH_YEAR)
casePartnersPeriod?: 'week' | 'month' | 'year';
@ApiPropertyOptional({ enum: WEEK_MONTH_YEAR })
@IsOptional()
@IsIn(WEEK_MONTH_YEAR)
efficiencyPeriod?: 'week' | 'month' | 'year';
}