clean(modules): modules file cleaning

This commit is contained in:
Matthieu Haineault 2025-12-04 17:01:28 -05:00
parent 8fdbdafd91
commit a5917cbe9d
7 changed files with 96 additions and 940 deletions

View File

@ -1,814 +0,0 @@
{
"openapi": "3.0.0",
"paths": {
"/auth/v1/login": {
"get": {
"operationId": "AuthController_login",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Auth"
]
}
},
"/auth/callback": {
"get": {
"operationId": "AuthController_loginCallback",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Auth"
]
}
},
"/auth/me": {
"get": {
"operationId": "AuthController_getProfile",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Auth"
]
}
},
"/notifications/summary": {
"get": {
"operationId": "NotificationsController_summary",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Notifications"
]
}
},
"/notifications/stream": {
"get": {
"operationId": "NotificationsController_stream",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Notifications"
]
}
},
"/timesheets/{year}/{period_number}": {
"get": {
"operationId": "TimesheetController_getTimesheetByPayPeriod",
"parameters": [
{
"name": "year",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
},
{
"name": "period_number",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
},
{
"name": "employee_email",
"required": true,
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Timesheet"
]
}
},
"/timesheets/timesheet-approval": {
"patch": {
"operationId": "TimesheetController_approveTimesheet",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Timesheet"
]
}
},
"/shift/create": {
"post": {
"operationId": "ShiftController_createBatch",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"responses": {
"201": {
"description": ""
}
},
"tags": [
"Shift"
]
}
},
"/shift/update": {
"patch": {
"operationId": "ShiftController_updateBatch",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Shift"
]
}
},
"/shift/{shift_id}": {
"delete": {
"operationId": "ShiftController_remove",
"parameters": [
{
"name": "shift_id",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Shift"
]
}
},
"/schedule-presets/find-list": {
"get": {
"operationId": "SchedulePresetsController_findListById",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"SchedulePresets"
]
}
},
"/schedule-presets/create": {
"post": {
"operationId": "SchedulePresetsController_createPreset",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SchedulePresetsDto"
}
}
}
},
"responses": {
"201": {
"description": ""
}
},
"tags": [
"SchedulePresets"
]
}
},
"/schedule-presets/update": {
"patch": {
"operationId": "SchedulePresetsController_updatePreset",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SchedulePresetsDto"
}
}
}
},
"responses": {
"200": {
"description": ""
}
},
"tags": [
"SchedulePresets"
]
}
},
"/schedule-presets/delete/{id}": {
"delete": {
"operationId": "SchedulePresetsController_deletePreset",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"SchedulePresets"
]
}
},
"/expense/create": {
"post": {
"operationId": "ExpenseController_create",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ExpenseDto"
}
}
}
},
"responses": {
"201": {
"description": ""
}
},
"tags": [
"Expense"
]
}
},
"/expense/update": {
"patch": {
"operationId": "ExpenseController_update",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ExpenseDto"
}
}
}
},
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Expense"
]
}
},
"/expense/delete/{expense_id}": {
"delete": {
"operationId": "ExpenseController_remove",
"parameters": [
{
"name": "expense_id",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Expense"
]
}
},
"/pay-periods/current-and-all": {
"get": {
"operationId": "PayPeriodsController_getCurrentAndAll",
"parameters": [
{
"name": "date",
"required": true,
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"PayPeriods"
]
}
},
"/pay-periods/date/{date}": {
"get": {
"operationId": "PayPeriodsController_findByDate",
"parameters": [
{
"name": "date",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"PayPeriods"
]
}
},
"/pay-periods/{year}/{periodNumber}": {
"get": {
"operationId": "PayPeriodsController_findOneByYear",
"parameters": [
{
"name": "year",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
},
{
"name": "periodNumber",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"PayPeriods"
]
}
},
"/pay-periods/crew/pay-period-approval": {
"patch": {
"operationId": "PayPeriodsController_bulkApproval",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BulkCrewApprovalDto"
}
}
}
},
"responses": {
"200": {
"description": ""
}
},
"tags": [
"PayPeriods"
]
}
},
"/pay-periods/crew/{year}/{periodNumber}": {
"get": {
"operationId": "PayPeriodsController_getCrewOverview",
"parameters": [
{
"name": "year",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
},
{
"name": "periodNumber",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"PayPeriods"
]
}
},
"/pay-periods/overview/{year}/{periodNumber}": {
"get": {
"operationId": "PayPeriodsController_getOverviewByYear",
"parameters": [
{
"name": "year",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
},
{
"name": "periodNumber",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"PayPeriods"
]
}
},
"/exports/csv": {
"get": {
"operationId": "CsvExportController_exportCsv",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"CsvExport"
]
}
},
"/employees/personal-profile": {
"get": {
"operationId": "EmployeesController_findOwnProfile",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Employees"
]
}
},
"/employees/profile": {
"get": {
"operationId": "EmployeesController_findProfile",
"parameters": [
{
"name": "employee_email",
"required": true,
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Employees"
]
}
},
"/employees/employee-list": {
"get": {
"operationId": "EmployeesController_findListEmployees",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Employees"
]
}
},
"/employees/create": {
"post": {
"operationId": "EmployeesController_createEmployee",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EmployeeDetailedDto"
}
}
}
},
"responses": {
"201": {
"description": ""
}
},
"tags": [
"Employees"
]
}
},
"/employees/update": {
"patch": {
"operationId": "EmployeesController_updateEmployee",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EmployeeDetailedDto"
}
}
}
},
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Employees"
]
}
},
"/preferences/update": {
"patch": {
"operationId": "PreferencesController_updatePreferences",
"parameters": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PreferencesDto"
}
}
}
},
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Preferences"
]
}
},
"/preferences": {
"get": {
"operationId": "PreferencesController_findPreferences",
"parameters": [],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"Preferences"
]
}
},
"/module_access": {
"get": {
"operationId": "ModuleAccessController_findAccess",
"parameters": [
{
"name": "employee_email",
"required": true,
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": ""
}
},
"tags": [
"ModuleAccess"
]
}
},
"/module_access/update": {
"patch": {
"operationId": "ModuleAccessController_updateAccess",
"parameters": [
{
"name": "employee_email",
"required": true,
"in": "query",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ModuleAccess"
}
}
}
},
"responses": {
"200": {
"description": ""
}
},
"tags": [
"ModuleAccess"
]
}
}
},
"info": {
"title": "Targo_Backend",
"description": "Documentation de l`API REST pour Targo (NestJS + Prisma)",
"version": "1.0",
"contact": {}
},
"tags": [
{
"name": "Users",
"description": ""
},
{
"name": "Employees",
"description": ""
},
{
"name": "Customers",
"description": ""
},
{
"name": "Timesheets",
"description": ""
},
{
"name": "Shifts",
"description": ""
},
{
"name": "Leave Requests",
"description": ""
},
{
"name": "Shift Codes",
"description": ""
},
{
"name": "OAuth Access Tokens",
"description": ""
},
{
"name": "Authorization",
"description": ""
}
],
"servers": [],
"components": {
"securitySchemes": {
"access-token": {
"scheme": "bearer",
"bearerFormat": "JWT",
"type": "http",
"name": "Authorization",
"description": "Invalid JWT token",
"in": "header"
}
},
"schemas": {
"SchedulePresetsDto": {
"type": "object",
"properties": {}
},
"ExpenseDto": {
"type": "object",
"properties": {}
},
"BulkCrewApprovalDto": {
"type": "object",
"properties": {}
},
"EmployeeDetailedDto": {
"type": "object",
"properties": {}
},
"PreferencesDto": {
"type": "object",
"properties": {}
},
"ModuleAccess": {
"type": "object",
"properties": {}
}
}
}
}

View File

@ -1,24 +0,0 @@
import { Type } from "class-transformer";
import { Allow, IsNotEmpty, IsNumber, IsString } from "class-validator";
export class BankCodeDto {
@Allow()
id: number;
@IsString()
@IsNotEmpty()
type: string;
@IsString()
@IsNotEmpty()
categorie: string;
@Type(()=> Number)
@IsNumber()
@IsNotEmpty()
modifier: number;
@IsString()
@IsNotEmpty()
bank_code: string;
}

View File

@ -1,40 +1,34 @@
import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post } from "@nestjs/common"; import { Body, Controller, Get, Param, ParseIntPipe, Patch, Post } from "@nestjs/common";
import { ModuleAccessAllowed } from "src/common/decorators/modules-guard.decorators"; import { ModuleAccessAllowed } from "src/common/decorators/modules-guard.decorators";
import { Modules as ModulesEnum } from ".prisma/client"; import { Result } from "src/common/errors/result-error.factory";
import { BankCodeDto } from "src/time-and-attendance/bank-codes/bank-code.dto"; import { Modules as ModulesEnum, Prisma } from ".prisma/client";
import { BankCodesService } from "src/time-and-attendance/bank-codes/bank-codes.service"; import { BankCodesService } from "src/time-and-attendance/bank-codes/bank-codes.service";
@Controller('bank-codes') @Controller('bank-codes')
@ModuleAccessAllowed(ModulesEnum.employee_management) @ModuleAccessAllowed(ModulesEnum.employee_management)
export class BankCodesControllers { export class BankCodesControllers {
constructor(private readonly bankCodesService: BankCodesService) {} constructor(private readonly bankCodesService: BankCodesService) { }
//_____________________________________________________________________________________________ //_____________________________________________________________________________________________
// Deprecated or unused methods // Deprecated or unused methods
//_____________________________________________________________________________________________ //_____________________________________________________________________________________________
@Post() @Post()
create(@Body() dto: BankCodeDto) { @ModuleAccessAllowed(ModulesEnum.employee_management)
create(@Body() dto: Prisma.BankCodesCreateInput
): Promise<Result<boolean, string>> {
return this.bankCodesService.create(dto); return this.bankCodesService.create(dto);
} }
@Get() @Get()
@ModuleAccessAllowed(ModulesEnum.employee_management)
findAll() { findAll() {
return this.bankCodesService.findAll(); return this.bankCodesService.findAll();
} }
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number){
return this.bankCodesService.findOne(id);
}
@Patch(':id') @Patch(':id')
update(@Param('id', ParseIntPipe) id: number, @Body() dto: BankCodeDto) { @ModuleAccessAllowed(ModulesEnum.employee_management)
update(@Param('id', ParseIntPipe) id: number, @Body() dto: Prisma.BankCodesUpdateInput
): Promise<Result<boolean, string>> {
return this.bankCodesService.update(id, dto) return this.bankCodesService.update(id, dto)
} }
@Delete(':id')
remove(@Param('id', ParseIntPipe) id: number) {
return this.bankCodesService.remove(id);
}
} }

View File

@ -1,11 +1,11 @@
// import { Module } from "@nestjs/common"; import { Module } from "@nestjs/common";
// import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
// import { BankCodesControllers } from "./controllers/bank-codes.controller"; import { BankCodesControllers } from "src/time-and-attendance/bank-codes/bank-codes.controller";
// import { BankCodesService } from "./services/bank-codes.service"; import { BankCodesService } from "src/time-and-attendance/bank-codes/bank-codes.service";
// @Module({ @Module({
// controllers: [BankCodesControllers], controllers: [BankCodesControllers],
// providers: [BankCodesService, PrismaService], providers: [BankCodesService, PrismaService],
// }) })
// export class BankCodesModule {} export class BankCodesModule {}

View File

@ -1,50 +1,47 @@
import { Injectable, NotFoundException } from "@nestjs/common"; import { Injectable } from "@nestjs/common";
import { Prisma } from "@prisma/client";
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { BankCodes } from "@prisma/client"; import { Result } from "src/common/errors/result-error.factory";
import { BankCodeDto } from "src/time-and-attendance/bank-codes/bank-code.dto";
@Injectable() @Injectable()
export class BankCodesService { export class BankCodesService {
constructor(private readonly prisma: PrismaService) {} constructor(private readonly prisma: PrismaService) { }
async create(dto: BankCodeDto): Promise<BankCodes>{ async create(dto: Prisma.BankCodesCreateInput): Promise<Result<boolean, string>> {
return this.prisma.bankCodes.create({ try {
data: { await this.prisma.bankCodes.create({
type: dto.type, data: {
categorie: dto.categorie, type: dto.type,
modifier: dto.modifier, categorie: dto.categorie,
bank_code: dto.bank_code, modifier: dto.modifier,
}, bank_code: dto.bank_code,
}); },
});
} catch (error) {
return { success: false, error: 'INVALID_BANK_CODE' + error };
}
return { success: true, data: true };
} }
findAll() { findAll() {
return this.prisma.bankCodes.findMany(); return this.prisma.bankCodes.findMany();
} }
async findOne(id: number) { async update(id: number, dto: Prisma.BankCodesUpdateInput): Promise<Result<boolean, string>> {
const bankCode = await this.prisma.bankCodes.findUnique({ where: {id} }); try {
await this.prisma.bankCodes.update({
if(!bankCode) throw new NotFoundException(`Bank Code #${id} not found`); where: { id },
data: {
return bankCode; type: dto.type,
categorie: dto.categorie,
modifier: dto.modifier,
bank_code: dto.bank_code,
},
});
return { success: true, data: true };
} catch (error) {
return { success: false, error: 'INVALID_BANK_CODE' + error };
}
} }
async update(id:number, dto: BankCodeDto) {
return await this.prisma.bankCodes.update({
where: { id },
data: {
type: dto.type,
categorie: dto.categorie,
modifier: dto.modifier as any,
bank_code: dto.bank_code,
},
});
}
async remove(id: number) {
await this.findOne(id);
return this.prisma.bankCodes.delete({ where: {id} });
}
} }

View File

@ -1,31 +1,8 @@
import { PrismaService } from "src/prisma/prisma.service"; import { PrismaService } from "src/prisma/prisma.service";
import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common";
import { Filters, CsvRow } from "src/time-and-attendance/exports/export-csv-options.dto";
export interface CsvRow {
company_code: number;
external_payroll_id: number;
full_name: string;
bank_code: string;
quantity_hours?: number;
amount?: number;
week_number: number;
pay_date: string;
holiday_date?: string;
}
type Filters = {
types: {
shifts: boolean;
expenses: boolean;
holiday: boolean;
vacation: boolean;
};
companies: {
targo: boolean;
solucom: boolean;
};
approved: boolean;
};
@Injectable() @Injectable()
export class CsvExportService { export class CsvExportService {
@ -35,7 +12,7 @@ export class CsvExportService {
year: number, year: number,
period_no: number, period_no: number,
filters: Filters, filters: Filters,
approved: boolean = true // approved: boolean = true
): Promise<CsvRow[]> { ): Promise<CsvRow[]> {
//fetch period //fetch period
const period = await this.prisma.payPeriods.findFirst({ const period = await this.prisma.payPeriods.findFirst({

View File

@ -2,46 +2,72 @@ import { Transform } from "class-transformer";
import { IsBoolean, IsInt, IsOptional, Max, Min } from "class-validator"; import { IsBoolean, IsInt, IsOptional, Max, Min } from "class-validator";
const toBoolean = (v: any) => { const toBoolean = (v: any) => {
if(typeof v === 'boolean') return v; if (typeof v === 'boolean') return v;
if(typeof v === 'string') return ['true', '1', 'on','yes'].includes(v.toLowerCase()); if (typeof v === 'string') return ['true', '1', 'on', 'yes'].includes(v.toLowerCase());
return false; return false;
} }
export class ExportCsvOptionsDto { export class ExportCsvOptionsDto {
@Transform(({ value }) => parseInt(value,10)) @Transform(({ value }) => parseInt(value, 10))
@IsInt() @Min(2023) @IsInt() @Min(2023)
year! : number; year!: number;
@Transform(({ value }) => parseInt(value,10)) @Transform(({ value }) => parseInt(value, 10))
@IsInt() @Min(1) @Max(26) @IsInt() @Min(1) @Max(26)
period_no!: number; period_no!: number;
@IsOptional() @IsBoolean() @IsOptional() @IsBoolean()
@Transform(({ value }) => toBoolean(value)) @Transform(({ value }) => toBoolean(value))
approved? : boolean = true; approved?: boolean = true;
@IsOptional() @IsBoolean() @IsOptional() @IsBoolean()
@Transform(({ value }) => toBoolean(value)) @Transform(({ value }) => toBoolean(value))
shifts? : boolean = true; shifts?: boolean = true;
@IsOptional() @IsBoolean() @IsOptional() @IsBoolean()
@Transform(({ value }) => toBoolean(value)) @Transform(({ value }) => toBoolean(value))
expenses? : boolean = true; expenses?: boolean = true;
@IsOptional() @IsBoolean() @IsOptional() @IsBoolean()
@Transform(({ value }) => toBoolean(value)) @Transform(({ value }) => toBoolean(value))
holiday? : boolean = true; holiday?: boolean = true;
@IsOptional() @IsBoolean() @IsOptional() @IsBoolean()
@Transform(({ value }) => toBoolean(value)) @Transform(({ value }) => toBoolean(value))
vacation? : boolean = true; vacation?: boolean = true;
@IsOptional() @IsBoolean() @IsOptional() @IsBoolean()
@Transform(({ value }) => toBoolean(value)) @Transform(({ value }) => toBoolean(value))
targo? : boolean = true; targo?: boolean = true;
@IsOptional() @IsBoolean() @IsOptional() @IsBoolean()
@Transform(({ value }) => toBoolean(value)) @Transform(({ value }) => toBoolean(value))
solucom? : boolean = true; solucom?: boolean = true;
} }
export interface CsvRow {
company_code: number;
external_payroll_id: number;
full_name: string;
bank_code: string;
quantity_hours?: number;
amount?: number;
week_number: number;
pay_date: string;
holiday_date?: string;
}
export type Filters = {
types: {
shifts: boolean;
expenses: boolean;
holiday: boolean;
vacation: boolean;
};
companies: {
targo: boolean;
solucom: boolean;
};
approved: boolean;
};