From 5b0e0ce86911c792f2967ad8974ed85f5f16d10a Mon Sep 17 00:00:00 2001 From: Matthieu Haineault Date: Wed, 3 Dec 2025 14:23:59 -0500 Subject: [PATCH 1/5] fix(preferences): ran a migration command so is_dark_mode = null is accepted in DB --- .../migration.sql | 5 +++++ prisma/schema.prisma | 12 ++++++------ .../preferences/dtos/preferences.dto.ts | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 prisma/migrations/20251203192130_added_the_option_of_null_to_is_dark_mode/migration.sql diff --git a/prisma/migrations/20251203192130_added_the_option_of_null_to_is_dark_mode/migration.sql b/prisma/migrations/20251203192130_added_the_option_of_null_to_is_dark_mode/migration.sql new file mode 100644 index 0000000..6bc061e --- /dev/null +++ b/prisma/migrations/20251203192130_added_the_option_of_null_to_is_dark_mode/migration.sql @@ -0,0 +1,5 @@ +-- CreateEnum +CREATE TYPE "modules" AS ENUM ('timesheets', 'timesheets_approval', 'employee_list', 'employee_management', 'personal_profile', 'dashboard'); + +-- AlterTable +ALTER TABLE "preferences" ALTER COLUMN "is_dark_mode" DROP NOT NULL; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5dc2348..39d9148 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -53,7 +53,7 @@ model Employees { supervisor Employees? @relation("EmployeeSupervisor", fields: [supervisor_id], references: [id]) supervisor_id Int? - external_payroll_id Int @default(autoincrement()) + external_payroll_id Int @default(autoincrement()) company_code Int first_work_day DateTime @db.Date last_work_day DateTime? @db.Date @@ -347,12 +347,12 @@ model Preferences { user Users @relation("UserPreferences", fields: [user_id], references: [id]) user_id String @unique @db.Uuid - notifications Boolean @default(true) + notifications Boolean @default(true) is_dark_mode Boolean? @default(false) - display_language String @default("fr-FR") //'fr-FR' | 'en-CA'; - is_lefty_mode Boolean @default(false) - is_employee_list_grid Boolean @default(true) - is_timesheet_approval_grid Boolean @default(true) + display_language String @default("fr-FR") //'fr-FR' | 'en-CA'; + is_lefty_mode Boolean @default(false) + is_employee_list_grid Boolean @default(true) + is_timesheet_approval_grid Boolean @default(true) @@map("preferences") } diff --git a/src/identity-and-account/preferences/dtos/preferences.dto.ts b/src/identity-and-account/preferences/dtos/preferences.dto.ts index 81a8dd6..e470dad 100644 --- a/src/identity-and-account/preferences/dtos/preferences.dto.ts +++ b/src/identity-and-account/preferences/dtos/preferences.dto.ts @@ -8,7 +8,7 @@ export enum DisplayLanguage { export class PreferencesDto { @IsInt() id: number; @IsBoolean() notifications: boolean; - @IsOptional() @IsBoolean() is_dark_mode?: boolean; + @IsOptional() @IsBoolean() is_dark_mode?: boolean | null; @IsEnum(DisplayLanguage) display_language: string; @IsBoolean() is_lefty_mode: boolean; @IsBoolean() is_employee_list_grid: boolean; From f19f981b43bdc83366092b1e7a0bfd762069093e Mon Sep 17 00:00:00 2001 From: Matthieu Haineault Date: Wed, 3 Dec 2025 15:25:25 -0500 Subject: [PATCH 2/5] fix(employees): changed email target to use dtos. --- .../employees/controllers/employees.controller.ts | 8 ++++---- .../employees/services/employees-update.service.ts | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/identity-and-account/employees/controllers/employees.controller.ts b/src/identity-and-account/employees/controllers/employees.controller.ts index dc88bac..d7cfe9e 100644 --- a/src/identity-and-account/employees/controllers/employees.controller.ts +++ b/src/identity-and-account/employees/controllers/employees.controller.ts @@ -1,11 +1,11 @@ import { Controller, Get, Query, Body, Post, Patch } from "@nestjs/common"; +import { Modules as ModulesEnum } from ".prisma/client"; +import { ModuleAccessAllowed } from "src/common/decorators/modules-guard.decorators"; import { Access } from "src/common/decorators/module-access.decorators"; import { Result } from "src/common/errors/result-error.factory"; import { EmployeeDetailedDto } from "src/identity-and-account/employees/dtos/employee-detailed.dto"; import { EmployeeDto } from "src/identity-and-account/employees/dtos/employee.dto"; import { EmployeesGetService } from "src/identity-and-account/employees/services/employees-get.service"; -import { ModuleAccessAllowed } from "src/common/decorators/modules-guard.decorators"; -import { Modules as ModulesEnum } from ".prisma/client"; import { EmployeesCreateService } from "src/identity-and-account/employees/services/employees-create.service"; import { EmployeesUpdateService } from "src/identity-and-account/employees/services/employees-update.service"; @@ -44,7 +44,7 @@ export class EmployeesController { @Patch('update') @ModuleAccessAllowed(ModulesEnum.employee_management) - async updateEmployee(@Access('email') email:string, dto:EmployeeDetailedDto, employee_email?: string){ - return await this.updateService.updateEmployee(email, dto, employee_email); + async updateEmployee(@Access('email') email: string, dto: EmployeeDetailedDto) { + return await this.updateService.updateEmployee(email, dto); } } diff --git a/src/identity-and-account/employees/services/employees-update.service.ts b/src/identity-and-account/employees/services/employees-update.service.ts index aca67e7..032c81f 100644 --- a/src/identity-and-account/employees/services/employees-update.service.ts +++ b/src/identity-and-account/employees/services/employees-update.service.ts @@ -13,8 +13,8 @@ export class EmployeesUpdateService { private readonly emailResolver: EmailToIdResolver, ) { } - async updateEmployee(email: string, dto: EmployeeDetailedDto, employee_email?: string): Promise> { - const account_email = employee_email ?? email; + async updateEmployee(email: string, dto: EmployeeDetailedDto): Promise> { + const account_email = dto.email ?? email; const user_id = await this.emailResolver.resolveUserIdWithEmail(account_email); if (!user_id.success) return { success: false, error: 'EMPLOYEE_NOT_FOUND' } From f8a70deed2ac66850e556ab032498427eb684169 Mon Sep 17 00:00:00 2001 From: Matthieu Haineault Date: Wed, 3 Dec 2025 15:43:03 -0500 Subject: [PATCH 3/5] fix(employees): fix update employees --- .../services/employees-update.service.ts | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/identity-and-account/employees/services/employees-update.service.ts b/src/identity-and-account/employees/services/employees-update.service.ts index 032c81f..2bb57be 100644 --- a/src/identity-and-account/employees/services/employees-update.service.ts +++ b/src/identity-and-account/employees/services/employees-update.service.ts @@ -31,16 +31,26 @@ export class EmployeesUpdateService { email: dto.email, phone_number: dto.phone_number, residence: dto.residence, - user_module_access: { - update: { - dashboard: normalized_access.dashboard, - employee_list: normalized_access.employee_list, - employee_management: normalized_access.employee_management, - personal_profile: normalized_access.personal_profile, - timesheets: normalized_access.timesheets, - timesheets_approval: normalized_access.timesheets_approval, - }, - }, + }, + }); + await tx.userModuleAccess.upsert({ + where: { user_id: user_id.data }, + update: { + dashboard: normalized_access.dashboard, + employee_list: normalized_access.employee_list, + employee_management: normalized_access.employee_management, + personal_profile: normalized_access.personal_profile, + timesheets: normalized_access.timesheets, + timesheets_approval: normalized_access.timesheets_approval, + }, + create: { + user_id: user_id.data, + dashboard: normalized_access.dashboard, + employee_list: normalized_access.employee_list, + employee_management: normalized_access.employee_management, + personal_profile: normalized_access.personal_profile, + timesheets: normalized_access.timesheets, + timesheets_approval: normalized_access.timesheets_approval, }, }); return tx.employees.update({ From b44577c595fe900eb43ec2610cd74d37559f89d0 Mon Sep 17 00:00:00 2001 From: Matthieu Haineault Date: Wed, 3 Dec 2025 15:57:30 -0500 Subject: [PATCH 4/5] fix(employees): fix create employees --- .../employees/dtos/employee-detailed.dto.ts | 2 +- .../employees/services/employees-create.service.ts | 2 +- .../employees/services/employees-update.service.ts | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/identity-and-account/employees/dtos/employee-detailed.dto.ts b/src/identity-and-account/employees/dtos/employee-detailed.dto.ts index 54cec6c..3624ad5 100644 --- a/src/identity-and-account/employees/dtos/employee-detailed.dto.ts +++ b/src/identity-and-account/employees/dtos/employee-detailed.dto.ts @@ -4,7 +4,7 @@ import { Type } from 'class-transformer'; export class EmployeeDetailedDto { @IsString() @IsNotEmpty() first_name: string; @IsString() @IsNotEmpty() last_name: string; - @IsString() employee_full_name: string; + @IsString() @IsOptional() employee_full_name: string; @IsString() @IsOptional() supervisor_full_name: string; @IsOptional() @IsBoolean() is_supervisor: boolean; @IsString() company_name: string; diff --git a/src/identity-and-account/employees/services/employees-create.service.ts b/src/identity-and-account/employees/services/employees-create.service.ts index 16d2d0d..5e38a13 100644 --- a/src/identity-and-account/employees/services/employees-create.service.ts +++ b/src/identity-and-account/employees/services/employees-create.service.ts @@ -14,6 +14,7 @@ export class EmployeesCreateService { const normalized_access = toBooleanFromString(dto.user_module_access); const supervisor_id = await this.toIdFromFullName(dto.supervisor_full_name); const company_code = toCompanyCodeFromString(dto.company_name) + await this.prisma.$transaction(async (tx) => { const user: Users = await tx.users.create({ data: { @@ -40,7 +41,6 @@ export class EmployeesCreateService { company_code: company_code, job_title: dto.job_title, first_work_day: dto.first_work_day, - last_work_day: dto.last_work_day, is_supervisor: dto.is_supervisor, supervisor_id: supervisor_id, }, diff --git a/src/identity-and-account/employees/services/employees-update.service.ts b/src/identity-and-account/employees/services/employees-update.service.ts index 2bb57be..1e0f280 100644 --- a/src/identity-and-account/employees/services/employees-update.service.ts +++ b/src/identity-and-account/employees/services/employees-update.service.ts @@ -2,6 +2,7 @@ import { Injectable } from "@nestjs/common"; import { Result } from "src/common/errors/result-error.factory"; import { EmailToIdResolver } from "src/common/mappers/email-id.mapper"; import { toBooleanFromString } from "src/common/mappers/module-access.mapper"; +import { toDateFromString } from "src/common/utils/date-utils"; import { EmployeeDetailedDto } from "src/identity-and-account/employees/dtos/employee-detailed.dto"; import { toCompanyCodeFromString } from "src/identity-and-account/employees/utils/employee.utils"; import { PrismaService } from "src/prisma/prisma.service"; @@ -58,7 +59,7 @@ export class EmployeesUpdateService { data: { company_code: company_code, job_title: dto.job_title, - first_work_day: dto.first_work_day, + first_work_day: toDateFromString(dto.first_work_day), last_work_day: dto.last_work_day, is_supervisor: dto.is_supervisor, supervisor_id: supervisor_id, From b40e0ad16e91b262347e8b6a232c460a18fdd422 Mon Sep 17 00:00:00 2001 From: Matthieu Haineault Date: Wed, 3 Dec 2025 16:06:53 -0500 Subject: [PATCH 5/5] fix(employees): fix create employees --- .../migration.sql | 3 +++ prisma/schema.prisma | 2 +- .../employees/services/employees-create.service.ts | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 prisma/migrations/20251203210621_removed_autoincrements_from_external_payroll_id/migration.sql diff --git a/prisma/migrations/20251203210621_removed_autoincrements_from_external_payroll_id/migration.sql b/prisma/migrations/20251203210621_removed_autoincrements_from_external_payroll_id/migration.sql new file mode 100644 index 0000000..9f0050d --- /dev/null +++ b/prisma/migrations/20251203210621_removed_autoincrements_from_external_payroll_id/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "employees" ALTER COLUMN "external_payroll_id" DROP DEFAULT; +DROP SEQUENCE "employees_external_payroll_id_seq"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 39d9148..a016790 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -53,7 +53,7 @@ model Employees { supervisor Employees? @relation("EmployeeSupervisor", fields: [supervisor_id], references: [id]) supervisor_id Int? - external_payroll_id Int @default(autoincrement()) + external_payroll_id Int company_code Int first_work_day DateTime @db.Date last_work_day DateTime? @db.Date diff --git a/src/identity-and-account/employees/services/employees-create.service.ts b/src/identity-and-account/employees/services/employees-create.service.ts index 5e38a13..ac388c7 100644 --- a/src/identity-and-account/employees/services/employees-create.service.ts +++ b/src/identity-and-account/employees/services/employees-create.service.ts @@ -14,7 +14,7 @@ export class EmployeesCreateService { const normalized_access = toBooleanFromString(dto.user_module_access); const supervisor_id = await this.toIdFromFullName(dto.supervisor_full_name); const company_code = toCompanyCodeFromString(dto.company_name) - + await this.prisma.$transaction(async (tx) => { const user: Users = await tx.users.create({ data: { @@ -38,6 +38,7 @@ export class EmployeesCreateService { return tx.employees.create({ data: { user_id: user.id, + external_payroll_id: dto.external_payroll_id, company_code: company_code, job_title: dto.job_title, first_work_day: dto.first_work_day,