diff --git a/src/controllers/employee-checkup-controller.ts b/src/controllers/employee-checkup-controller.ts new file mode 100644 index 0000000..de683d8 --- /dev/null +++ b/src/controllers/employee-checkup-controller.ts @@ -0,0 +1,183 @@ +import { + Body, + Controller, + Delete, + Get, + Path, + Post, + Put, + Request, + Route, + Security, + Tags, +} from "tsoa"; +import { RequestWithUser } from "../interfaces/user"; +import prisma from "../db"; +import HttpStatus from "../interfaces/http-status"; +import HttpError from "../interfaces/http-error"; + +type EmployeeCheckupCreate = { + checkupType: string; + checkupResult: string; + + provinceId?: string | null; + + hospitalName: string; + remark: string; + medicalBenefitScheme: string; + insuranceCompany: string; + coverageStartDate: Date; + coverageExpireDate: Date; +}; + +type EmployeeCheckupEdit = { + checkupType?: string; + checkupResult?: string; + + provinceId?: string | null; + + hospitalName?: string; + remark?: string; + medicalBenefitScheme?: string; + insuranceCompany?: string; + coverageStartDate?: Date; + coverageExpireDate?: Date; +}; + +@Route("api/employee/{employeeId}/checkup") +@Tags("Employee Checkup") +@Security("keycloak") +export class EmployeeCheckupController extends Controller { + @Get() + async list(@Path() employeeId: string) { + return prisma.employeeCheckup.findMany({ + orderBy: { createdAt: "asc" }, + where: { employeeId }, + }); + } + + @Get("{checkupId}") + async getById(@Path() employeeId: string, @Path() checkupId: string) { + const record = await prisma.employeeCheckup.findFirst({ + where: { id: checkupId, employeeId }, + }); + if (!record) { + throw new HttpError( + HttpStatus.NOT_FOUND, + "Employee checkup cannot be found.", + "data_not_found", + ); + } + return record; + } + + @Post() + async create( + @Request() req: RequestWithUser, + @Path() employeeId: string, + @Body() body: EmployeeCheckupCreate, + ) { + if (body.provinceId || employeeId) { + const [province, employee] = await prisma.$transaction([ + prisma.province.findFirst({ where: { id: body.provinceId || undefined } }), + prisma.employee.findFirst({ where: { id: employeeId } }), + ]); + if (body.provinceId && !province) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Province cannot be found.", + "missing_or_invalid_parameter", + ); + if (!employee) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Employee cannot be found.", + "missing_or_invalid_parameter", + ); + } + + const { provinceId, ...rest } = body; + + const record = await prisma.employeeCheckup.create({ + include: { province: true }, + data: { + ...rest, + province: { connect: provinceId ? { id: provinceId } : undefined }, + employee: { connect: { id: employeeId } }, + createdBy: req.user.name, + updateBy: req.user.name, + }, + }); + + this.setStatus(HttpStatus.CREATED); + + return record; + } + + @Put("{checkupId}") + async editById( + @Request() req: RequestWithUser, + @Path() employeeId: string, + @Path() checkupId: string, + @Body() body: EmployeeCheckupEdit, + ) { + if (body.provinceId || employeeId) { + const [province, employee] = await prisma.$transaction([ + prisma.province.findFirst({ where: { id: body.provinceId || undefined } }), + prisma.employee.findFirst({ where: { id: employeeId } }), + ]); + if (body.provinceId && !province) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Province cannot be found.", + "missing_or_invalid_parameter", + ); + if (!employee) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Employee cannot be found.", + "missing_or_invalid_parameter", + ); + } + + const { provinceId, ...rest } = body; + + if (!(await prisma.employeeCheckup.findUnique({ where: { id: checkupId, employeeId } }))) { + throw new HttpError( + HttpStatus.NOT_FOUND, + "Employee checkup cannot be found.", + "data_not_found", + ); + } + + const record = await prisma.employeeCheckup.update({ + include: { province: true }, + where: { id: checkupId, employeeId }, + data: { + ...rest, + province: { connect: provinceId ? { id: provinceId } : undefined }, + createdBy: req.user.name, + updateBy: req.user.name, + }, + }); + + this.setStatus(HttpStatus.CREATED); + + return record; + } + + @Delete("{checkupId}") + async deleteById(@Path() employeeId: string, @Path() checkupId: string) { + const record = await prisma.employeeCheckup.findFirst({ where: { id: checkupId, employeeId } }); + + if (!record) { + throw new HttpError( + HttpStatus.NOT_FOUND, + "Employee checkup cannot be found.", + "data_not_found", + ); + } + + return await prisma.employeeCheckup.delete({ where: { id: checkupId, employeeId } }); + } +} diff --git a/src/controllers/employee-other-info-controller.ts b/src/controllers/employee-other-info-controller.ts new file mode 100644 index 0000000..4445c17 --- /dev/null +++ b/src/controllers/employee-other-info-controller.ts @@ -0,0 +1,127 @@ +import { Prisma, Status } from "@prisma/client"; +import { + Body, + Controller, + Delete, + Get, + Put, + Path, + Post, + Query, + Request, + Route, + Security, + Tags, +} from "tsoa"; + +import prisma from "../db"; +import HttpError from "../interfaces/http-error"; +import HttpStatus from "../interfaces/http-status"; +import { RequestWithUser } from "../interfaces/user"; + +type EmployeeOtherInfoCreate = { + citizenId: string; + fatherFullName: string; + motherFullName: string; + birthPlace: string; +}; + +type EmployeeOtherInfoUpdate = { + citizenId: string; + fatherFullName: string; + motherFullName: string; + birthPlace: string; +}; + +@Route("api/employee/{employeeId}/other-info") +@Tags("Employee Other Info") +@Security("keycloak") +export class EmployeeOtherInfo extends Controller { + @Get() + async list(@Path() employeeId: string) { + return prisma.employeeOtherInfo.findMany({ + orderBy: { createdAt: "asc" }, + where: { employeeId }, + }); + } + + @Get("{otherInfoId}") + async getById(@Path() employeeId: string, @Path() otherInfoId: string) { + const record = await prisma.employeeOtherInfo.findFirst({ + where: { id: otherInfoId, employeeId }, + }); + if (!record) { + throw new HttpError(HttpStatus.NOT_FOUND, "Employee info cannot be found.", "data_not_found"); + } + return record; + } + + @Post() + async create( + @Request() req: RequestWithUser, + @Path() employeeId: string, + @Body() body: EmployeeOtherInfoCreate, + ) { + if (!(await prisma.employee.findUnique({ where: { id: employeeId } }))) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Employee cannot be found.", + "missing_or_invalid_parameter", + ); + + const record = await prisma.employeeOtherInfo.create({ + data: { + ...body, + employee: { connect: { id: employeeId } }, + createdBy: req.user.name, + updateBy: req.user.name, + }, + }); + + this.setStatus(HttpStatus.CREATED); + + return record; + } + + @Put("{otherInfoId}") + async editById( + @Request() req: RequestWithUser, + @Path() employeeId: string, + @Path() otherInfoId: string, + @Body() body: EmployeeOtherInfoUpdate, + ) { + if (!(await prisma.employeeOtherInfo.findUnique({ where: { id: otherInfoId, employeeId } }))) { + throw new HttpError( + HttpStatus.NOT_FOUND, + "Employee other info cannot be found.", + "data_not_found", + ); + } + + const record = await prisma.employeeOtherInfo.update({ + where: { id: otherInfoId, employeeId }, + data: { ...body, createdBy: req.user.name, updateBy: req.user.name }, + }); + + this.setStatus(HttpStatus.CREATED); + + return record; + } + + @Delete("{otherInfoId}") + async deleteById(@Path() employeeId: string, @Path() otherInfoId: string) { + const record = await prisma.employeeOtherInfo.findFirst({ + where: { id: otherInfoId, employeeId }, + }); + + if (!record) { + throw new HttpError( + HttpStatus.NOT_FOUND, + "Employee other info cannot be found.", + "data_not_found", + ); + } + + return await prisma.employeeOtherInfo.delete({ where: { id: otherInfoId, employeeId } }); + } +}