- Introduced new `attendances` and `visits` tables to manage employee attendance and customer visits, including relevant fields for check-in and check-out details. - Updated `company_settings` to include a `check_in_radius_meters` column for attendance validation. - Implemented foreign key constraints to ensure data integrity between `attendances`, `visits`, `employees`, `branches`, and other related entities. - Created new services and controllers for handling attendance and visit operations, including check-in, check-out, and bulk actions. - Enhanced DTOs for attendance and visit data transfer, including validation for input data. - Added unit and integration tests to validate the new functionalities and ensure proper handling of attendance and visit records. - Created migration scripts to apply the necessary database schema changes for the new features.
75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import { Controller, Get, Param, ParseUUIDPipe, Query } from '@nestjs/common';
|
|
import {
|
|
ApiBearerAuth,
|
|
ApiForbiddenResponse,
|
|
ApiNotFoundResponse,
|
|
ApiOkResponse,
|
|
ApiOperation,
|
|
ApiTags,
|
|
ApiUnauthorizedResponse,
|
|
} from '@nestjs/swagger';
|
|
import { CurrentUser } from '../../../common/decorators/current-user.decorator';
|
|
import { RequirePrivilege } from '../../../common/decorators/require-privilege.decorator';
|
|
import {
|
|
Pagination,
|
|
type PaginationResponse,
|
|
PaginationMetaDto,
|
|
} from '../../../common/http/response';
|
|
import { BEARER_AUTH_NAME } from '../../../common/swagger/setup-swagger';
|
|
import { FIELD_VISIT_PRIVILEGE_KEY } from '../shared/field-purpose';
|
|
import { ListVisitsQueryDto, VisitDto } from './dto/visit.dto';
|
|
import { VisitsService } from './visits.service';
|
|
|
|
@ApiTags('visits')
|
|
@ApiBearerAuth(BEARER_AUTH_NAME)
|
|
@Controller('visits')
|
|
export class VisitsReadController {
|
|
constructor(private readonly visitsService: VisitsService) {}
|
|
|
|
@Get('current')
|
|
@RequirePrivilege(FIELD_VISIT_PRIVILEGE_KEY, 'view')
|
|
@ApiOperation({ summary: 'Get the open visit for the current user' })
|
|
@ApiOkResponse({ type: VisitDto })
|
|
@ApiUnauthorizedResponse()
|
|
@ApiForbiddenResponse()
|
|
current(@CurrentUser('id') userId: string): Promise<VisitDto | null> {
|
|
return this.visitsService.findCurrent(userId);
|
|
}
|
|
|
|
@Get()
|
|
@Pagination()
|
|
@RequirePrivilege(FIELD_VISIT_PRIVILEGE_KEY, 'view')
|
|
@ApiOperation({ summary: 'List visits' })
|
|
@ApiOkResponse({
|
|
schema: {
|
|
properties: {
|
|
data: {
|
|
type: 'array',
|
|
items: { $ref: '#/components/schemas/VisitDto' },
|
|
},
|
|
meta: { $ref: '#/components/schemas/PaginationMetaDto' },
|
|
},
|
|
},
|
|
})
|
|
@ApiUnauthorizedResponse()
|
|
@ApiForbiddenResponse()
|
|
list(
|
|
@Query() query: ListVisitsQueryDto,
|
|
): Promise<PaginationResponse<VisitDto>> {
|
|
return this.visitsService.list(query);
|
|
}
|
|
|
|
@Get(':id')
|
|
@RequirePrivilege(FIELD_VISIT_PRIVILEGE_KEY, 'view')
|
|
@ApiOperation({ summary: 'Get visit detail' })
|
|
@ApiOkResponse({ type: VisitDto })
|
|
@ApiNotFoundResponse()
|
|
@ApiUnauthorizedResponse()
|
|
@ApiForbiddenResponse()
|
|
findOne(@Param('id', ParseUUIDPipe) id: string): Promise<VisitDto> {
|
|
return this.visitsService.findById(id);
|
|
}
|
|
}
|
|
|
|
void PaginationMetaDto;
|