import { Controller, Get, Post, Put, Delete, Body, Param, Query, UseGuards, ParseUUIDPipe, } from '@nestjs/common'; import { JwtAuthGuard } from '@modules/auth/guards/jwt-auth.guard'; import { CurrentUser } from '@modules/auth/decorators/current-user.decorator'; import { PeriodsService } from '../services'; import { CreatePeriodDto, UpdatePeriodDto, ClosePeriodDto, MarkPaidDto, PeriodListQueryDto, PeriodResponseDto, PaginatedPeriodsDto, } from '../dto'; interface RequestUser { id: string; tenant_id: string; email: string; role: string; } @Controller('commissions/periods') @UseGuards(JwtAuthGuard) export class PeriodsController { constructor(private readonly periodsService: PeriodsService) {} @Get() async findAll( @CurrentUser() user: RequestUser, @Query() query: PeriodListQueryDto, ): Promise { return this.periodsService.findAll(user.tenant_id, query); } @Get('current') async getCurrentPeriod(@CurrentUser() user: RequestUser): Promise { return this.periodsService.getCurrentPeriod(user.tenant_id); } @Get(':id') async findOne( @CurrentUser() user: RequestUser, @Param('id', ParseUUIDPipe) id: string, ): Promise { return this.periodsService.findOne(user.tenant_id, id); } @Post() async create( @CurrentUser() user: RequestUser, @Body() dto: CreatePeriodDto, ): Promise { return this.periodsService.create(user.tenant_id, user.id, dto); } @Put(':id') async update( @CurrentUser() user: RequestUser, @Param('id', ParseUUIDPipe) id: string, @Body() dto: UpdatePeriodDto, ): Promise { return this.periodsService.update(user.tenant_id, id, dto); } @Post(':id/close') async close( @CurrentUser() user: RequestUser, @Param('id', ParseUUIDPipe) id: string, @Body() dto: ClosePeriodDto, ): Promise { return this.periodsService.close(user.tenant_id, id, user.id, dto); } @Post(':id/mark-paid') async markPaid( @CurrentUser() user: RequestUser, @Param('id', ParseUUIDPipe) id: string, @Body() dto: MarkPaidDto, ): Promise { return this.periodsService.markAsPaid(user.tenant_id, id, user.id, dto); } @Delete(':id') async remove( @CurrentUser() user: RequestUser, @Param('id', ParseUUIDPipe) id: string, ): Promise<{ message: string }> { await this.periodsService.remove(user.tenant_id, id); return { message: 'Commission period deleted successfully' }; } @Post(':id/assign-entries') async assignEntries( @CurrentUser() user: RequestUser, @Param('id', ParseUUIDPipe) id: string, @Body() body: { entryIds: string[] }, ): Promise<{ assigned: number }> { const assigned = await this.periodsService.assignEntriesToPeriod( user.tenant_id, id, body.entryIds, ); return { assigned }; } }