diff --git a/docs/swagger/swagger-spec.json b/docs/swagger/swagger-spec.json index 7eb6899..6307520 100644 --- a/docs/swagger/swagger-spec.json +++ b/docs/swagger/swagger-spec.json @@ -384,6 +384,45 @@ ] } }, + "/employees/profile": { + "get": { + "operationId": "EmployeesController_findOneProfile", + "parameters": [ + { + "name": "email", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Employee profile found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmployeeProfileItemDto" + } + } + } + }, + "400": { + "description": "Employee profile not found" + } + }, + "security": [ + { + "access-token": [] + } + ], + "summary": "Find employee profile", + "tags": [ + "Employees" + ] + } + }, "/timesheets": { "post": { "operationId": "TimesheetsController_create", @@ -2307,6 +2346,10 @@ "type": "object", "properties": {} }, + "EmployeeProfileItemDto": { + "type": "object", + "properties": {} + }, "UpdateEmployeeDto": { "type": "object", "properties": { diff --git a/src/modules/employees/controllers/employees.controller.ts b/src/modules/employees/controllers/employees.controller.ts index b527a04..d275e45 100644 --- a/src/modules/employees/controllers/employees.controller.ts +++ b/src/modules/employees/controllers/employees.controller.ts @@ -6,6 +6,7 @@ import { UpdateEmployeeDto } from '../dtos/update-employee.dto'; import { RolesAllowed } from '../../../common/decorators/roles.decorators'; import { ApiBearerAuth, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger'; import { EmployeeListItemDto } from '../dtos/list-employee.dto'; +import { EmployeeProfileItemDto } from '../dtos/profil-employee.dto'; @ApiTags('Employees') @ApiBearerAuth('access-token') @@ -50,6 +51,14 @@ export class EmployeesController { return this.employeesService.findOne(id); } + @Get('profile') + @ApiOperation({summary: 'Find employee profile' }) + @ApiResponse({ status: 200, description: 'Employee profile found', type: EmployeeProfileItemDto }) + @ApiResponse({ status: 400, description: 'Employee profile not found' }) + findOneProfile(@Param('email', ParseIntPipe)email: string): Promise { + return this.employeesService.findOneProfile(email); + } + @Delete(':id') @RolesAllowed(RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR ) @ApiOperation({summary: 'Delete employee' }) diff --git a/src/modules/employees/dtos/list-employee.dto.ts b/src/modules/employees/dtos/list-employee.dto.ts index efbbdd2..39abf03 100644 --- a/src/modules/employees/dtos/list-employee.dto.ts +++ b/src/modules/employees/dtos/list-employee.dto.ts @@ -1,6 +1,7 @@ export class EmployeeListItemDto { first_name: string; last_name: string; + email: string; supervisor_full_name: string | null; company_name: number | null; job_title: string | null; diff --git a/src/modules/employees/dtos/profil-employee.dto.ts b/src/modules/employees/dtos/profil-employee.dto.ts new file mode 100644 index 0000000..533854a --- /dev/null +++ b/src/modules/employees/dtos/profil-employee.dto.ts @@ -0,0 +1,12 @@ +export class EmployeeProfileItemDto { + first_name: string; + last_name: string; + supervisor_full_name: string | null; + company_name: number | null; + job_title: string | null; + email: string | null; + phone_number: number; + first_work_day: string; + last_work_day?: string | null; + residence: string | null; +} \ No newline at end of file diff --git a/src/modules/employees/services/employees.service.ts b/src/modules/employees/services/employees.service.ts index 346294a..9160580 100644 --- a/src/modules/employees/services/employees.service.ts +++ b/src/modules/employees/services/employees.service.ts @@ -5,6 +5,7 @@ import { UpdateEmployeeDto } from '../dtos/update-employee.dto'; import { Employees, EmployeesArchive, Users } from '@prisma/client'; import { EmployeeListItemDto } from '../dtos/list-employee.dto'; import { Roles as RoleEnum } from '@prisma/client'; +import { EmployeeProfileItemDto } from '../dtos/profil-employee.dto'; function toDateOrNull(v?: string | null): Date | null { if (!v) return null; @@ -70,6 +71,7 @@ export class EmployeesService { select: { first_name: true, last_name: true, + email: true, }, }, supervisor: { @@ -88,6 +90,7 @@ export class EmployeesService { }).then(rows => rows.map(r => ({ first_name: r.user.first_name, last_name: r.user.last_name, + email: r.user.email, supervisor_full_name: r.supervisor ? `${r.supervisor.user.first_name} ${r.supervisor.user.last_name}` : null, company_name: r.company_code, job_title: r.job_title, @@ -106,6 +109,51 @@ export class EmployeesService { return emp; } + async findOneProfile(email:string): Promise { + const emp = await this.prisma.employees.findFirst({ + where: { user: { email } }, + select: { + user: { + select: { + first_name: true, + last_name: true, + email: true, + phone_number: true, + residence: true, + }, + }, + supervisor: { + select: { + user: { + select: { + first_name: true, + last_name: true, + }, + }, + }, + }, + job_title: true, + company_code: true, + first_work_day: true, + last_work_day: true, + } + }); + if (!emp) throw new NotFoundException(`Employee with email ${email} not found`); + + return { + first_name: emp.user.first_name, + last_name: emp.user.last_name, + email: emp.user.email, + residence: emp.user.residence, + phone_number: emp.user.phone_number, + supervisor_full_name: emp.supervisor ? `${emp.supervisor.user.first_name}, ${emp.supervisor.user.last_name}` : null, + company_name: emp.company_code, + job_title: emp.job_title, + first_work_day: emp.first_work_day.toISOString().slice(0,10), + last_work_day: emp.last_work_day ? emp.last_work_day.toISOString().slice(0,10) : null, + }; + } + async update( id: number, dto: UpdateEmployeeDto,