documents/src/modules/compliance/compliance.controller.ts
Breno Pires 56368d5517 feat(compliance): prazo de renovacao dinamico pelo tempo observado por orgao
Cada renovacao que sai do orgao vira ciclo observado (protocolo -> emissao);
a mediana por orgao/tipo estica o prazo de inicio de renovacao quando o orgao
esta comprovadamente mais lento que o catalogo. O catalogo e piso legal: os
120 dias da LO nunca encolhem. Campos aditivos effectiveLeadDays/observed no
upcoming e nos alertas; GET /compliance/lead-times; seed deterministico.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 02:44:25 -03:00

63 lines
1.9 KiB
TypeScript

import { JwtAuthGuard } from '@clubpetrodev/authmodule';
import { MappedExceptionFilter } from '@clubpetrodev/nestjs-mapped-exception';
import {
Controller,
Get,
HttpStatus,
Query,
UseFilters,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { ApiBearerAuth, ApiResponse, ApiTags } from '@nestjs/swagger';
import { FiltersInterceptor } from '../../interceptors/filters.interceptor';
import { TenantDto, TenantWithStoreDto } from '../common/dto/tenant.dto';
import { ComplianceService } from './compliance.service';
import {
ComplianceSummaryResponseDto,
UpcomingExpirationDto,
} from './dto/response/compliance.dto';
import { LeadTimesResponseDto } from './dto/response/leadTime.dto';
import { GetUpcomingDto } from './dto/request/getUpcoming.dto';
import { LeadTimeService } from './leadTime.service';
@ApiTags('Conformidade')
@Controller('compliance')
@UseFilters(MappedExceptionFilter)
@UseInterceptors(FiltersInterceptor)
@UseGuards(JwtAuthGuard)
export class ComplianceController {
constructor(
private readonly service: ComplianceService,
private readonly leadTimeService: LeadTimeService,
) {}
@Get('summary')
@ApiBearerAuth()
@ApiResponse({ status: HttpStatus.OK, type: ComplianceSummaryResponseDto })
async getSummary(@Query() filters: TenantWithStoreDto) {
return this.service.getSummary(filters);
}
@Get('upcoming')
@ApiBearerAuth()
@ApiResponse({ status: HttpStatus.OK, type: [UpcomingExpirationDto] })
async getUpcoming(@Query() filters: GetUpcomingDto) {
return this.service.getUpcoming({
programId: filters.programId,
storeId: filters.storeId,
days: filters.days ?? 90,
});
}
@Get('lead-times')
@ApiBearerAuth()
@ApiResponse({ status: HttpStatus.OK, type: LeadTimesResponseDto })
async getLeadTimes(
@Query() filters: TenantDto,
): Promise<LeadTimesResponseDto> {
return { data: await this.leadTimeService.getLeadTimes(filters.programId) };
}
}