{ "openapi": "3.0.0", "paths": { "/": { "get": { "operationId": "ShiftsOverviewController_getSummary", "parameters": [], "responses": { "200": { "description": "" } }, "tags": [ "ShiftsOverview" ] } }, "/health": { "get": { "operationId": "HealthController_check", "parameters": [], "responses": { "200": { "description": "" } }, "tags": [ "Health" ] } }, "/archives/employees": { "get": { "operationId": "EmployeesArchiveController_findOneArchived", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Archived employee found" } }, "summary": "Fetch employee in archives with its Id", "tags": [ "Employee Archives" ] } }, "/archives/expenses": { "get": { "operationId": "ExpensesArchiveController_findOneArchived", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Archived expense found" } }, "summary": "Fetch expense in archives with its Id", "tags": [ "Expense Archives" ] } }, "/archives/leaveRequests": { "get": { "operationId": "LeaveRequestsArchiveController_findOneArchived", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Archived leaveRequest found" } }, "summary": "Fetch leaveRequest in archives with its Id", "tags": [ "LeaveRequests Archives" ] } }, "/archives/shifts": { "get": { "operationId": "ShiftsArchiveController_findOneArchived", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Archived shift found" } }, "summary": "Fetch shift in archives with its Id", "tags": [ "Shift Archives" ] } }, "/archives/timesheets": { "get": { "operationId": "TimesheetsArchiveController_findOneArchived", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Archived timesheet found" } }, "summary": "Fetch timesheet in archives with its Id", "tags": [ "Timesheet Archives" ] } }, "/employees": { "post": { "operationId": "EmployeesController_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateEmployeeDto" } } } }, "responses": { "201": { "description": "Employee created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmployeeEntity" } } } }, "400": { "description": "Incomplete task or invalid data" } }, "security": [ { "access-token": [] } ], "summary": "Create employee", "tags": [ "Employees" ] }, "get": { "operationId": "EmployeesController_findAll", "parameters": [], "responses": { "200": { "description": "List of employees found", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/EmployeeEntity" } } } } }, "400": { "description": "List of employees not found" } }, "security": [ { "access-token": [] } ], "summary": "Find all employees", "tags": [ "Employees" ] } }, "/employees/{id}": { "get": { "operationId": "EmployeesController_findOne", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Employee found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmployeeEntity" } } } }, "400": { "description": "Employee not found" } }, "security": [ { "access-token": [] } ], "summary": "Find employee", "tags": [ "Employees" ] }, "delete": { "operationId": "EmployeesController_remove", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Identifier of the employee to delete", "schema": { "type": "number" } } ], "responses": { "204": { "description": "Employee deleted" }, "404": { "description": "Employee not found" } }, "security": [ { "access-token": [] } ], "summary": "Delete employee", "tags": [ "Employees" ] }, "patch": { "operationId": "EmployeesController_updateOrArchiveOrRestore", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Identifier of the employee", "schema": { "type": "number" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateEmployeeDto" } } } }, "responses": { "200": { "description": "Employee updated or restored", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmployeeEntity" } } } }, "202": { "description": "Employee archived successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EmployeeEntity" } } } }, "404": { "description": "Employee not found in active or archive" } }, "security": [ { "access-token": [] }, { "access-token": [] } ], "summary": "Update, archive or restore an employee", "tags": [ "Employees" ] } }, "/timesheets": { "post": { "operationId": "TimesheetsController_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateTimesheetDto" } } } }, "responses": { "201": { "description": "Timesheet created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimesheetEntity" } } } }, "400": { "description": "Incomplete task or invalid data" } }, "security": [ { "access-token": [] } ], "summary": "Create timesheet", "tags": [ "Timesheets" ] }, "get": { "operationId": "TimesheetsController_findAll", "parameters": [], "responses": { "201": { "description": "List of timesheet found", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/TimesheetEntity" } } } } }, "400": { "description": "List of timesheets not found" } }, "security": [ { "access-token": [] } ], "summary": "Find all timesheets", "tags": [ "Timesheets" ] } }, "/timesheets/{id}": { "get": { "operationId": "TimesheetsController_findOne", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Timesheet found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimesheetEntity" } } } }, "400": { "description": "Timesheet not found" } }, "security": [ { "access-token": [] } ], "summary": "Find timesheet", "tags": [ "Timesheets" ] }, "patch": { "operationId": "TimesheetsController_update", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateTimesheetDto" } } } }, "responses": { "201": { "description": "Timesheet updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimesheetEntity" } } } }, "400": { "description": "Timesheet not found" } }, "security": [ { "access-token": [] } ], "summary": "Update timesheet", "tags": [ "Timesheets" ] }, "delete": { "operationId": "TimesheetsController_remove", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Timesheet deleted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimesheetEntity" } } } }, "400": { "description": "Timesheet not found" } }, "security": [ { "access-token": [] } ], "summary": "Delete timesheet", "tags": [ "Timesheets" ] } }, "/timesheets/{id}/approval": { "patch": { "operationId": "TimesheetsController_approve", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "" } }, "security": [ { "access-token": [] } ], "tags": [ "Timesheets" ] } }, "/Expenses": { "post": { "operationId": "ExpensesController_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateExpenseDto" } } } }, "responses": { "201": { "description": "Expense created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExpenseEntity" } } } }, "400": { "description": "Incomplete task or invalid data" } }, "security": [ { "access-token": [] } ], "summary": "Create expense", "tags": [ "Expenses" ] }, "get": { "operationId": "ExpensesController_findAll", "parameters": [], "responses": { "201": { "description": "List of expenses found", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ExpenseEntity" } } } } }, "400": { "description": "List of expenses not found" } }, "security": [ { "access-token": [] } ], "summary": "Find all expenses", "tags": [ "Expenses" ] } }, "/Expenses/{id}": { "get": { "operationId": "ExpensesController_findOne", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Expense found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExpenseEntity" } } } }, "400": { "description": "Expense not found" } }, "security": [ { "access-token": [] } ], "summary": "Find expense", "tags": [ "Expenses" ] }, "patch": { "operationId": "ExpensesController_update", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateExpenseDto" } } } }, "responses": { "201": { "description": "Expense updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExpenseEntity" } } } }, "400": { "description": "Expense not found" } }, "security": [ { "access-token": [] } ], "summary": "Expense shift", "tags": [ "Expenses" ] }, "delete": { "operationId": "ExpensesController_remove", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Expense deleted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExpenseEntity" } } } }, "400": { "description": "Expense not found" } }, "security": [ { "access-token": [] } ], "summary": "Delete expense", "tags": [ "Expenses" ] } }, "/Expenses/{id}/approval": { "patch": { "operationId": "ExpensesController_approve", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "" } }, "security": [ { "access-token": [] } ], "tags": [ "Expenses" ] } }, "/shifts": { "post": { "operationId": "ShiftsController_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateShiftDto" } } } }, "responses": { "201": { "description": "Shift created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShiftEntity" } } } }, "400": { "description": "Incomplete task or invalid data" } }, "security": [ { "access-token": [] } ], "summary": "Create shift", "tags": [ "Shifts" ] }, "get": { "operationId": "ShiftsController_findAll", "parameters": [], "responses": { "201": { "description": "List of shifts found", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ShiftEntity" } } } } }, "400": { "description": "List of shifts not found" } }, "security": [ { "access-token": [] } ], "summary": "Find all shifts", "tags": [ "Shifts" ] } }, "/shifts/{id}": { "get": { "operationId": "ShiftsController_findOne", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Shift found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShiftEntity" } } } }, "400": { "description": "Shift not found" } }, "security": [ { "access-token": [] } ], "summary": "Find shift", "tags": [ "Shifts" ] }, "patch": { "operationId": "ShiftsController_update", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateShiftsDto" } } } }, "responses": { "201": { "description": "Shift updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShiftEntity" } } } }, "400": { "description": "Shift not found" } }, "security": [ { "access-token": [] } ], "summary": "Update shift", "tags": [ "Shifts" ] }, "delete": { "operationId": "ShiftsController_remove", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Shift deleted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ShiftEntity" } } } }, "400": { "description": "Shift not found" } }, "security": [ { "access-token": [] } ], "summary": "Delete shift", "tags": [ "Shifts" ] } }, "/shifts/{id}/approval": { "patch": { "operationId": "ShiftsController_approve", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "" } }, "security": [ { "access-token": [] } ], "tags": [ "Shifts" ] } }, "/export.csv": { "get": { "operationId": "ShiftsOverviewController_exportCsv", "parameters": [], "responses": { "200": { "description": "" } }, "tags": [ "ShiftsOverview" ] } }, "/notifications/summary": { "get": { "operationId": "NotificationsController_summary", "parameters": [], "responses": { "200": { "description": "" } }, "tags": [ "Notifications" ] } }, "/notifications/stream": { "get": { "operationId": "NotificationsController_stream", "parameters": [], "responses": { "200": { "description": "" } }, "tags": [ "Notifications" ] } }, "/leave-requests": { "post": { "operationId": "LeaveRequestController_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateLeaveRequestsDto" } } } }, "responses": { "201": { "description": "Leave request created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LeaveRequestEntity" } } } }, "400": { "description": "Incomplete task or invalid data" } }, "security": [ { "access-token": [] } ], "summary": "Create leave request", "tags": [ "Leave Requests" ] }, "get": { "operationId": "LeaveRequestController_findAll", "parameters": [], "responses": { "201": { "description": "List of Leave requests found", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/LeaveRequestEntity" } } } } }, "400": { "description": "List of leave request not found" } }, "security": [ { "access-token": [] } ], "summary": "Find all leave request", "tags": [ "Leave Requests" ] } }, "/leave-requests/{id}": { "get": { "operationId": "LeaveRequestController_findOne", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Leave request found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LeaveRequestEntity" } } } }, "400": { "description": "Leave request not found" } }, "security": [ { "access-token": [] } ], "summary": "Find leave request", "tags": [ "Leave Requests" ] }, "patch": { "operationId": "LeaveRequestController_update", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateLeaveRequestsDto" } } } }, "responses": { "201": { "description": "Leave request updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LeaveRequestEntity" } } } }, "400": { "description": "Leave request not found" } }, "security": [ { "access-token": [] } ], "summary": "Update leave request", "tags": [ "Leave Requests" ] }, "delete": { "operationId": "LeaveRequestController_remove", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Leave request deleted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LeaveRequestEntity" } } } }, "400": { "description": "Leave request not found" } }, "security": [ { "access-token": [] } ], "summary": "Delete leave request", "tags": [ "Leave Requests" ] } }, "/leave-requests/{id}/approval": { "patch": { "operationId": "LeaveRequestController_updateApproval", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "" } }, "security": [ { "access-token": [] } ], "tags": [ "Leave Requests" ] } }, "/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" ] } }, "/bank-codes": { "post": { "operationId": "BankCodesControllers_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateBankCodeDto" } } } }, "responses": { "201": { "description": "Bank code successfully created." }, "400": { "description": "Invalid input data." } }, "summary": "Create a new bank code", "tags": [ "BankCodesControllers" ] }, "get": { "operationId": "BankCodesControllers_findAll", "parameters": [], "responses": { "200": { "description": "List of bank codes." } }, "summary": "Retrieve all bank codes", "tags": [ "BankCodesControllers" ] } }, "/bank-codes/{id}": { "get": { "operationId": "BankCodesControllers_findOne", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "404": { "description": "Bank code not found." } }, "summary": "Retrieve a bank code by its ID", "tags": [ "BankCodesControllers" ] }, "patch": { "operationId": "BankCodesControllers_update", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateBankCodeDto" } } } }, "responses": { "404": { "description": "Bank code not found." } }, "summary": "Update an existing bank code", "tags": [ "BankCodesControllers" ] }, "delete": { "operationId": "BankCodesControllers_remove", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "404": { "description": "Bank code not found." } }, "summary": "Delete a bank code", "tags": [ "BankCodesControllers" ] } }, "/exports/csv": { "get": { "operationId": "CsvExportController_exportCsv", "parameters": [ { "name": "period", "required": true, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "" } }, "tags": [ "CsvExport" ] } }, "/customers": { "post": { "operationId": "CustomersController_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateCustomerDto" } } } }, "responses": { "201": { "description": "Customer created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerEntity" } } } }, "400": { "description": "Invalid task or invalid data" } }, "security": [ { "access-token": [] } ], "summary": "Create customer", "tags": [ "Customers" ] }, "get": { "operationId": "CustomersController_findAll", "parameters": [], "responses": { "201": { "description": "List of customers found", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/CustomerEntity" } } } } }, "400": { "description": "List of customers not found" } }, "security": [ { "access-token": [] } ], "summary": "Find all customers", "tags": [ "Customers" ] } }, "/customers/{id}": { "get": { "operationId": "CustomersController_findOne", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Customer found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerEntity" } } } }, "400": { "description": "Customer not found" } }, "security": [ { "access-token": [] } ], "summary": "Find customer", "tags": [ "Customers" ] }, "patch": { "operationId": "CustomersController_update", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateCustomerDto" } } } }, "responses": { "201": { "description": "Customer updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerEntity" } } } }, "400": { "description": "Customer not found" } }, "security": [ { "access-token": [] } ], "summary": "Update customer", "tags": [ "Customers" ] }, "delete": { "operationId": "CustomersController_remove", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "201": { "description": "Customer deleted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomerEntity" } } } }, "400": { "description": "Customer not found" } }, "security": [ { "access-token": [] } ], "summary": "Delete customer", "tags": [ "Customers" ] } }, "/oauth-sessions": { "post": { "operationId": "OauthSessionsController_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateOauthSessionDto" } } } }, "responses": { "201": { "description": "OAuth session created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthSessionEntity" } } } }, "400": { "description": "Incomplete task or invalid data" } }, "security": [ { "sessions": [] } ], "summary": "Create OAuth session", "tags": [ "OAuth Sessions" ] }, "get": { "operationId": "OauthSessionsController_findAll", "parameters": [], "responses": { "201": { "description": "List of OAuth session found", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/OAuthSessionEntity" } } } } }, "400": { "description": "List of OAuth session not found" } }, "security": [ { "sessions": [] } ], "summary": "Find all OAuth session", "tags": [ "OAuth Sessions" ] } }, "/oauth-sessions/{id}": { "get": { "operationId": "OauthSessionsController_findOne", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "201": { "description": "OAuth session found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthSessionEntity" } } } }, "400": { "description": "OAuth session not found" } }, "security": [ { "sessions": [] } ], "summary": "Find OAuth session", "tags": [ "OAuth Sessions" ] }, "patch": { "operationId": "OauthSessionsController_update", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateOauthSessionDto" } } } }, "responses": { "201": { "description": "OAuth session updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthSessionEntity" } } } }, "400": { "description": "OAuth session not found" } }, "security": [ { "sessions": [] } ], "summary": "Update OAuth session", "tags": [ "OAuth Sessions" ] }, "delete": { "operationId": "OauthSessionsController_remove", "parameters": [ { "name": "id", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "201": { "description": "OAuth session deleted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthSessionEntity" } } } }, "400": { "description": "OAuth session not found" } }, "security": [ { "sessions": [] } ], "summary": "Delete OAuth session", "tags": [ "OAuth Sessions" ] } }, "/pay-periods": { "get": { "operationId": "PayPeriodsController_findAll", "parameters": [], "responses": { "200": { "description": "List of pay period found", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/PayPeriodDto" } } } } } }, "summary": "Find all pay period", "tags": [ "pay-periods" ] } }, "/pay-periods/{year}/{periodNumber}/overview": { "get": { "operationId": "PayPeriodsController_getOverviewByYear", "parameters": [ { "name": "year", "required": true, "in": "path", "schema": { "example": 2024, "type": "number" } }, { "name": "periodNumber", "required": true, "in": "path", "description": "1..26", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Pay period overview found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PayPeriodOverviewDto" } } } }, "404": { "description": "Pay period not found" } }, "summary": "Detailed view of a pay period by year + number", "tags": [ "pay-periods" ] } }, "/pay-periods/{year}/{periodNumber}": { "get": { "operationId": "PayPeriodsController_findOneByYear", "parameters": [ { "name": "year", "required": true, "in": "path", "schema": { "example": 2024, "type": "number" } }, { "name": "periodNumber", "required": true, "in": "path", "description": "1..26", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Pay period found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PayPeriodDto" } } } }, "404": { "description": "Pay period not found" } }, "summary": "Find pay period by year and period number", "tags": [ "pay-periods" ] } }, "/pay-periods/date/{date}": { "get": { "operationId": "PayPeriodsController_findByDate", "parameters": [ { "name": "date", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Pay period found for the selected date", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PayPeriodDto" } } } }, "404": { "description": "Pay period not found for the selected date" } }, "summary": "Resolve a period by a date within it", "tags": [ "pay-periods" ] } }, "/pay-periods/{year}/{periodNumber}/approval": { "patch": { "operationId": "PayPeriodsController_approve", "parameters": [ { "name": "year", "required": true, "in": "path", "schema": { "example": 2024, "type": "number" } }, { "name": "periodNumber", "required": true, "in": "path", "description": "1..26", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Pay period approved" } }, "summary": "Approve all timesheets with activity in the period", "tags": [ "pay-periods" ] } }, "/pay-periods/{year}/{periodNumber}/crew-overview": { "get": { "operationId": "PayPeriodsController_getCrewOverview", "parameters": [ { "name": "year", "required": true, "in": "path", "schema": { "example": 2024, "type": "number" } }, { "name": "periodNumber", "required": true, "in": "path", "description": "1..26", "schema": { "example": 1, "type": "number" } }, { "name": "includeSubtree", "required": false, "in": "query", "description": "Include indirect reports", "schema": { "example": false, "type": "boolean" } } ], "responses": { "200": { "description": "Crew overview", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PayPeriodOverviewDto" } } } }, "404": { "description": "Pay period not found" } }, "summary": "Supervisor crew overview for a given pay period", "tags": [ "pay-periods" ] } } }, "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": { "CreateEmployeeDto": { "type": "object", "properties": { "first_name": { "type": "string", "example": "Frodo", "description": "Employee`s first name" }, "last_name": { "type": "string", "example": "Baggins", "description": "Employee`s last name" }, "email": { "type": "string", "example": "i_cant_do_this_sam@targointernet.com", "description": "Employee`s email" }, "phone_number": { "type": "number", "example": "82538437464", "description": "Employee`s phone number" }, "residence": { "type": "string", "example": "1 Bagshot Row, Hobbiton, The Shire, Middle-earth", "description": "Employee`s residence" }, "external_payroll_id": { "type": "number", "example": "BagginsF7464", "description": "Employee`s payroll id" }, "company_code": { "type": "number", "example": "335567447", "description": "Employee`s company code" }, "first_work_day": { "format": "date-time", "type": "string", "example": "23/09/3018", "description": "Employee`s first working day" }, "last_work_day": { "format": "date-time", "type": "string", "example": "25/03/3019", "description": "Employee`s last working day" } }, "required": [ "first_name", "last_name", "email", "phone_number", "external_payroll_id", "company_code", "first_work_day" ] }, "EmployeeEntity": { "type": "object", "properties": { "id": { "type": "number", "example": 1, "description": "Unique ID of an employee(primary-key, auto-incremented)" }, "user_id": { "type": "string", "example": "0e6e2e1f-b157-4c7c-ae3f-999b3e4f914d", "description": "UUID of the user linked to that employee" }, "external_payroll_id": { "type": "number", "example": 7464, "description": "external ID for the pay system" }, "company_code": { "type": "number", "example": 335567447, "description": "company code" }, "first_work_day": { "format": "date-time", "type": "string", "example": "3018-09-23T00:00:00.000Z", "description": "Employee first day at work" }, "last_work_day": { "format": "date-time", "type": "string", "example": "3019-03-25T00:00:00.000Z", "description": "Employee last day at work" } }, "required": [ "id", "user_id", "external_payroll_id", "company_code", "first_work_day" ] }, "UpdateEmployeeDto": { "type": "object", "properties": { "first_name": { "type": "string", "example": "Frodo", "description": "Employee`s first name" }, "last_name": { "type": "string", "example": "Baggins", "description": "Employee`s last name" }, "email": { "type": "string", "example": "i_cant_do_this_sam@targointernet.com", "description": "Employee`s email" }, "phone_number": { "type": "number", "example": "82538437464", "description": "Employee`s phone number" }, "residence": { "type": "string", "example": "1 Bagshot Row, Hobbiton, The Shire, Middle-earth", "description": "Employee`s residence" }, "external_payroll_id": { "type": "number", "example": "BagginsF7464", "description": "Employee`s payroll id" }, "company_code": { "type": "number", "example": "335567447", "description": "Employee`s company code" }, "first_work_day": { "format": "date-time", "type": "string", "example": "23/09/3018", "description": "New hire date or undefined" }, "last_work_day": { "format": "date-time", "type": "string", "example": "25/03/3019", "description": "Termination date (null to restore)" }, "supervisor_id": { "type": "number", "description": "Supervisor ID" } } }, "CreateTimesheetDto": { "type": "object", "properties": { "employee_id": { "type": "number", "example": "426433", "description": "employee`s ID number of linked timsheet" }, "is_approved": { "type": "boolean", "example": "True or False or Pending or Denied or Cancelled or Escalated", "description": "Timesheet`s approval status" } }, "required": [ "employee_id", "is_approved" ] }, "TimesheetEntity": { "type": "object", "properties": { "id": { "type": "number", "example": 1, "description": "timesheet`s unique ID (auto-generated)" }, "employee_id": { "type": "number", "example": 426433, "description": "employee`s ID number of linked timsheet" }, "is_approved": { "type": "boolean", "example": true, "description": "Timesheet`s approval status" } }, "required": [ "id", "employee_id", "is_approved" ] }, "UpdateTimesheetDto": { "type": "object", "properties": { "employee_id": { "type": "number", "example": "426433", "description": "employee`s ID number of linked timsheet" }, "is_approved": { "type": "boolean", "example": "True or False or Pending or Denied or Cancelled or Escalated", "description": "Timesheet`s approval status" } } }, "CreateExpenseDto": { "type": "object", "properties": {} }, "ExpenseEntity": { "type": "object", "properties": { "id": { "type": "number", "example": 1, "description": "Unique ID of the expense (auto-generated)" }, "timesheet_id": { "type": "number", "example": 101, "description": "ID number for a set timesheet" }, "bank_code_id": { "type": "number", "example": 7, "description": "ID number of an bank code (link with bank-codes)" }, "date": { "format": "date-time", "type": "string", "example": "3018-10-20T00:00:00.000Z", "description": "Date where the expense was made" }, "is_approuved": { "type": "boolean", "example": "DENIED, APPROUVED, PENDING, etc...", "description": "validation status" }, "description": { "type": "string", "example": "Spent for mileage between A and B", "description": "explain`s why the expense was made" }, "supervisor_comment": { "type": "string", "example": "Asked X to go there as an emergency response", "description": "Supervisro`s justification for the spending of an employee" } }, "required": [ "id", "timesheet_id", "bank_code_id", "date", "is_approuved", "description", "supervisor_comment" ] }, "UpdateExpenseDto": { "type": "object", "properties": {} }, "CreateShiftDto": { "type": "object", "properties": {} }, "ShiftEntity": { "type": "object", "properties": { "id": { "type": "number", "example": 1, "description": "Unique ID of the shift (auto-generated)" }, "timesheet_id": { "type": "number", "example": 101, "description": "ID number for a set timesheet" }, "bank_code_id": { "type": "number", "example": 7, "description": "ID number of a shift code (link with bank-codes)" }, "date": { "format": "date-time", "type": "string", "example": "3018-10-20T00:00:00.000Z", "description": "Date where the shift takes place" }, "start_time": { "format": "date-time", "type": "string", "example": "3018-10-20T08:00:00.000Z", "description": "Start time of the said shift" }, "end_time": { "format": "date-time", "type": "string", "example": "3018-10-20T17:00:00.000Z", "description": "End time of the said shift" } }, "required": [ "id", "timesheet_id", "bank_code_id", "date", "start_time", "end_time" ] }, "UpdateShiftsDto": { "type": "object", "properties": {} }, "CreateLeaveRequestsDto": { "type": "object", "properties": { "employee_id": { "type": "number", "example": "4655867", "description": "Employee`s id" }, "leave_type": { "type": "string", "example": "Sick or Vacation or Unpaid or Bereavement or Parental or Legal", "description": "type of leave request for an accounting perception" }, "start_date_time": { "format": "date-time", "type": "string", "example": "22/06/2463", "description": "Leave request`s start date" }, "end_date_time": { "format": "date-time", "type": "string", "example": "25/03/3019", "description": "Leave request`s end date" }, "comment": { "type": "string", "example": "My precious", "description": "Leave request`s comment" }, "approval_status": { "type": "string", "example": "True or False or Pending or Denied or Cancelled or Escalated", "description": "Leave request`s approval status" } }, "required": [ "employee_id", "leave_type", "start_date_time", "end_date_time", "comment", "approval_status" ] }, "LeaveRequestEntity": { "type": "object", "properties": { "id": { "type": "number", "example": 1, "description": "Leave request`s unique id(auto-incremented)" }, "employee_id": { "type": "number", "example": 42, "description": "ID of concerned employee" }, "leave_type": { "type": "string", "example": "SICK", "enum": [ "SICK", "VACATION", "UNPAID", "BEREAVEMENT", "PARENTAL", "LEGAL", "WEDDING" ], "description": "type of leave request for an accounting perception" }, "start_date_time": { "format": "date-time", "type": "string", "example": "22/06/2463", "description": "Leave request`s start date" }, "end_date_time": { "format": "date-time", "type": "string", "example": "25/03/3019", "description": "Leave request`s end date (optionnal)" }, "comment": { "type": "string", "example": "My precious", "description": "Leave request employee`s comment" }, "approval_status": { "type": "string", "example": "PENDING", "enum": [ "PENDING", "APPROVED", "DENIED", "CANCELLED", "ESCALATED" ], "description": "Leave request`s approval status" } }, "required": [ "id", "employee_id", "leave_type", "start_date_time", "comment", "approval_status" ] }, "UpdateLeaveRequestsDto": { "type": "object", "properties": { "employee_id": { "type": "number", "example": "4655867", "description": "Employee`s id" }, "leave_type": { "type": "string", "example": "Sick or Vacation or Unpaid or Bereavement or Parental or Legal", "description": "type of leave request for an accounting perception" }, "start_date_time": { "format": "date-time", "type": "string", "example": "22/06/2463", "description": "Leave request`s start date" }, "end_date_time": { "format": "date-time", "type": "string", "example": "25/03/3019", "description": "Leave request`s end date" }, "comment": { "type": "string", "example": "My precious", "description": "Leave request`s comment" }, "approval_status": { "type": "string", "example": "True or False or Pending or Denied or Cancelled or Escalated", "description": "Leave request`s approval status" } } }, "CreateBankCodeDto": { "type": "object", "properties": {} }, "UpdateBankCodeDto": { "type": "object", "properties": {} }, "CreateCustomerDto": { "type": "object", "properties": { "first_name": { "type": "string", "example": "Gandalf", "description": "Customer`s first name" }, "last_name": { "type": "string", "example": "TheGray", "description": "Customer`s last name" }, "email": { "type": "string", "example": "you_shall_not_pass@middleEarth.com", "description": "Customer`s email" }, "phone_number": { "type": "number", "example": "8436637464", "description": "Customer`s phone number" }, "residence": { "type": "string", "example": "1 Ringbearer`s way, Mount Doom city, ME, T1R 1N6 ", "description": "Customer`s residence" }, "invoice_id": { "type": "number", "example": "4263253", "description": "Customer`s invoice number" } }, "required": [ "first_name", "last_name", "email", "phone_number" ] }, "CustomerEntity": { "type": "object", "properties": { "id": { "type": "number", "example": 1, "description": "Unique ID of a customer(primary-key, auto-incremented)" }, "user_id": { "type": "string", "example": "0e6e2e1f-b157-4c7c-ae3f-999b3e4f914d", "description": "UUID of the user linked to that customer" }, "email": { "type": "string", "example": "you_shall_not_pass@middleEarth.com", "description": "customer`s email (optional)" }, "phone_number": { "type": "number", "example": 8436637464, "description": "customer`s phone number (numbers only)" }, "residence": { "type": "string", "example": "1 Ringbearer’s way, Mount Doom city, ME, T1R 1N6", "description": "customer`s residence address (optional)" }, "invoice_id": { "type": "number", "example": 4263253, "description": "customer`s invoice number (optionnal, unique)" } }, "required": [ "id", "user_id", "phone_number" ] }, "UpdateCustomerDto": { "type": "object", "properties": { "first_name": { "type": "string", "example": "Gandalf", "description": "Customer`s first name" }, "last_name": { "type": "string", "example": "TheGray", "description": "Customer`s last name" }, "email": { "type": "string", "example": "you_shall_not_pass@middleEarth.com", "description": "Customer`s email" }, "phone_number": { "type": "number", "example": "8436637464", "description": "Customer`s phone number" }, "residence": { "type": "string", "example": "1 Ringbearer`s way, Mount Doom city, ME, T1R 1N6 ", "description": "Customer`s residence" }, "invoice_id": { "type": "number", "example": "4263253", "description": "Customer`s invoice number" } } }, "CreateOauthSessionDto": { "type": "object", "properties": { "user_id": { "type": "string", "example": "S7A2U8R7O6N6", "description": "User`s unique identification number" }, "application": { "type": "string", "example": "app.targo.ca", "description": "URL in which the access token is used for" }, "access_token": { "type": "string", "example": "L5O6R4D3/O6F3#T8H4E3&R6I4N6G4S7 ...", "description": "Access token" }, "refresh_token": { "type": "string", "example": "Th3731102h1p07Th3R1n92", "description": "Refresh token" }, "access_token_expiry": { "format": "date-time", "type": "string", "example": "25/12/3018", "description": "Access token`s expiry date" }, "refresh_token_expiry": { "format": "date-time", "type": "string", "example": "26/02/3019", "description": "Refresh token`s expiry date" }, "scopes": { "example": "access tolkiens, email, etc... ", "description": "scopes of infos linked to the access token", "type": "array", "items": { "type": "string" } } }, "required": [ "user_id", "application", "access_token", "refresh_token", "access_token_expiry" ] }, "OAuthSessionEntity": { "type": "object", "properties": { "id": { "type": "string", "example": "cklwi0vb70000z2z20q6f19qk", "description": "Unique ID of an OAuth token (auto-generated)" }, "user_id": { "type": "string", "example": "0e6e2e1f-b157-4c7c-ae3f-999b3e4f914d", "description": "UUID User`s unique identification number" }, "application": { "type": "string", "example": "app.targo.ca", "description": "URL in which the access token is used for" }, "access_token": { "type": "string", "example": "L5O6R4D3/O6F3#T8H4E3&R6I4N6G4S7", "description": "Access token" }, "refresh_token": { "type": "string", "example": "Th3731102h1p07Th3R1n92", "description": "Refresh token" }, "access_token_expiry": { "format": "date-time", "type": "string", "example": "3018-12-25T00:00:00.000Z", "description": "Access token`s expiry date" }, "refresh_token_expiry": { "format": "date-time", "type": "string", "example": "3019-02-26T00:00:00.000Z", "description": "Refresh token`s expiry date (optional)" }, "scopes": { "example": [ "email", "profile", "access_tolkiens" ], "description": "scopes of infos linked to the access token", "type": "array", "items": { "type": "string" } }, "is_revoked": { "type": "boolean", "example": false, "description": "revoke status" }, "created_at": { "format": "date-time", "type": "string", "example": "2025-07-22", "description": "creation date" }, "updated_at": { "format": "date-time", "type": "string", "example": "2025-07-23", "description": "Latest update (optional)" } }, "required": [ "id", "user_id", "application", "access_token", "refresh_token", "access_token_expiry", "is_revoked", "created_at" ] }, "UpdateOauthSessionDto": { "type": "object", "properties": { "user_id": { "type": "string", "example": "S7A2U8R7O6N6", "description": "User`s unique identification number" }, "application": { "type": "string", "example": "app.targo.ca", "description": "URL in which the access token is used for" }, "access_token": { "type": "string", "example": "L5O6R4D3/O6F3#T8H4E3&R6I4N6G4S7 ...", "description": "Access token" }, "refresh_token": { "type": "string", "example": "Th3731102h1p07Th3R1n92", "description": "Refresh token" }, "access_token_expiry": { "format": "date-time", "type": "string", "example": "25/12/3018", "description": "Access token`s expiry date" }, "refresh_token_expiry": { "format": "date-time", "type": "string", "example": "26/02/3019", "description": "Refresh token`s expiry date" }, "scopes": { "example": "access tolkiens, email, etc... ", "description": "scopes of infos linked to the access token", "type": "array", "items": { "type": "string" } } } }, "PayPeriodDto": { "type": "object", "properties": { "period_number": { "type": "number", "example": 1, "description": "numéro cyclique de la période entre 1 et 26" }, "start_date": { "type": "string", "example": "2023-12-17", "format": "date" }, "end_date": { "type": "string", "example": "2023-12-30", "format": "date" }, "year": { "type": "number", "example": 2023 }, "label": { "type": "string", "example": "2023-12-17 → 2023-12-30" } }, "required": [ "period_number", "start_date", "end_date", "year", "label" ] }, "EmployeePeriodOverviewDto": { "type": "object", "properties": { "employee_id": { "type": "number", "example": 42, "description": "Employees.id (clé primaire num.)" }, "employee_name": { "type": "string", "example": "Alex Dupont", "description": "Nom complet de lemployé" }, "regular_hours": { "type": "number", "example": 40, "description": "pay-period`s regular hours" }, "evening_hours": { "type": "number", "example": 0, "description": "pay-period`s evening hours" }, "emergency_hours": { "type": "number", "example": 0, "description": "pay-period`s emergency hours" }, "overtime_hours": { "type": "number", "example": 2, "description": "pay-period`s overtime hours" }, "expenses": { "type": "number", "example": 420.69, "description": "pay-period`s total expenses ($)" }, "mileage": { "type": "number", "example": 40, "description": "pay-period total mileages (km)" }, "is_approved": { "type": "boolean", "example": true, "description": "Tous les timesheets de la période sont approuvés pour cet employé" } }, "required": [ "employee_id", "employee_name", "regular_hours", "evening_hours", "emergency_hours", "overtime_hours", "expenses", "mileage", "is_approved" ] }, "PayPeriodOverviewDto": { "type": "object", "properties": { "period_number": { "type": "number", "example": 1, "description": "Period number (1–26)" }, "year": { "type": "number", "example": 2023, "description": "Calendar year of the period" }, "start_date": { "type": "string", "example": "2023-12-17", "format": "date", "description": "Period start date (YYYY-MM-DD)" }, "end_date": { "type": "string", "example": "2023-12-30", "format": "date", "description": "Period end date (YYYY-MM-DD)" }, "label": { "type": "string", "example": "2023-12-17 → 2023-12-30", "description": "Human-readable label" }, "employees_overview": { "description": "Per-employee overview for the period", "type": "array", "items": { "$ref": "#/components/schemas/EmployeePeriodOverviewDto" } } }, "required": [ "period_number", "year", "start_date", "end_date", "label", "employees_overview" ] } } } }