79 lines
3.8 KiB
TypeScript
79 lines
3.8 KiB
TypeScript
import { BadRequestException, Body, Controller, Delete, Get, Param, ParseBoolPipe, ParseIntPipe, Patch, Post, Query, UseGuards, UsePipes, ValidationPipe } from '@nestjs/common';
|
|
import { TimesheetsQueryService } from '../services/timesheets-query.service';
|
|
import { CreateTimesheetDto } from '../dtos/create-timesheet.dto';
|
|
import { Timesheets } from '@prisma/client';
|
|
import { UpdateTimesheetDto } from '../dtos/update-timesheet.dto';
|
|
import { RolesAllowed } from "src/common/decorators/roles.decorators";
|
|
import { Roles as RoleEnum } from '.prisma/client';
|
|
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
|
|
import { TimesheetsCommandService } from '../services/timesheets-command.service';
|
|
import { SearchTimesheetDto } from '../dtos/search-timesheet.dto';
|
|
import { TimesheetPeriodDto } from '../dtos/timesheet-period.dto';
|
|
|
|
@ApiTags('Timesheets')
|
|
@ApiBearerAuth('access-token')
|
|
// @UseGuards()
|
|
@Controller('timesheets')
|
|
export class TimesheetsController {
|
|
constructor(
|
|
private readonly timesheetsQuery: TimesheetsQueryService,
|
|
private readonly timesheetsCommand: TimesheetsCommandService,
|
|
) {}
|
|
|
|
@Post()
|
|
//@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR)
|
|
@ApiOperation({ summary: 'Create timesheet' })
|
|
@ApiResponse({ status: 201, description: 'Timesheet created', type: CreateTimesheetDto })
|
|
@ApiResponse({ status: 400, description: 'Incomplete task or invalid data' })
|
|
create(@Body() dto: CreateTimesheetDto): Promise<Timesheets> {
|
|
return this.timesheetsQuery.create(dto);
|
|
}
|
|
|
|
@Get()
|
|
//@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR)
|
|
async getPeriodByQuery(
|
|
@Query('year', ParseIntPipe ) year: number,
|
|
@Query('period_no', ParseIntPipe ) period_no: number,
|
|
@Query('email') email?: string
|
|
): Promise<TimesheetPeriodDto> {
|
|
if(!email || !email.trim()) throw new BadRequestException('Query param "email" is mandatory for this route.');
|
|
return this.timesheetsQuery.findAll(year, period_no, email.trim());
|
|
}
|
|
|
|
@Get(':id')
|
|
//@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR)
|
|
@ApiOperation({ summary: 'Find timesheet' })
|
|
@ApiResponse({ status: 201, description: 'Timesheet found', type: CreateTimesheetDto })
|
|
@ApiResponse({ status: 400, description: 'Timesheet not found' })
|
|
findOne(@Param('id', ParseIntPipe) id: number): Promise<Timesheets> {
|
|
return this.timesheetsQuery.findOne(id);
|
|
}
|
|
|
|
@Patch(':id')
|
|
//@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR)
|
|
@ApiOperation({ summary: 'Update timesheet' })
|
|
@ApiResponse({ status: 201, description: 'Timesheet updated', type: CreateTimesheetDto })
|
|
@ApiResponse({ status: 400, description: 'Timesheet not found' })
|
|
update(
|
|
@Param('id', ParseIntPipe) id:number,
|
|
@Body() dto: UpdateTimesheetDto,
|
|
): Promise<Timesheets> {
|
|
return this.timesheetsQuery.update(id, dto);
|
|
}
|
|
|
|
@Delete(':id')
|
|
// @RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR)
|
|
@ApiOperation({ summary: 'Delete timesheet' })
|
|
@ApiResponse({ status: 201, description: 'Timesheet deleted', type: CreateTimesheetDto })
|
|
@ApiResponse({ status: 400, description: 'Timesheet not found' })
|
|
remove(@Param('id', ParseIntPipe) id: number): Promise<Timesheets> {
|
|
return this.timesheetsQuery.remove(id);
|
|
}
|
|
|
|
@Patch(':id/approval')
|
|
//@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR)
|
|
async approve(@Param('id', ParseIntPipe) id: number, @Body('is_approved', ParseBoolPipe) isApproved: boolean) {
|
|
return this.timesheetsCommand.updateApproval(id, isApproved);
|
|
}
|
|
}
|