From 077627794e63bd8e2d70afc5df0721cc4f566ec3 Mon Sep 17 00:00:00 2001 From: florimondmanca Date: Tue, 7 Jan 2025 16:13:57 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Affiche=20s=C3=A9par=C3=A9ment=20les=20util?= =?UTF-8?q?isateurs=20actuellement=20et=20pr=C3=A9c=C3=A9demment=20salari?= =?UTF-8?q?=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...GetMealTicketsPerMonthQueryHandler.spec.ts | 8 +++--- .../GetMealTicketsPerMonthQueryHandler.ts | 2 +- .../HumanResource/User/Query/GetUsersQuery.ts | 3 ++- .../User/Query/GetUsersQueryHandler.spec.ts | 26 ++++++++++++++----- .../User/Query/GetUsersQueryHandler.ts | 9 +++---- .../User/Repository/IUserRepository.ts | 6 ++++- .../User/Controller/ListUsersController.ts | 14 +++++++--- .../User/Repository/UserRepository.ts | 10 +++++-- .../User/Table/UserTableFactory.ts | 4 +-- src/assets/styles/utilities/text.css | 4 +++ src/templates/pages/users/list.njk | 6 ++++- src/translations/fr-FR.ftl | 6 +++++ 12 files changed, 72 insertions(+), 26 deletions(-) diff --git a/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.spec.ts b/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.spec.ts index dce412769..d0517d810 100644 --- a/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.spec.ts +++ b/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.spec.ts @@ -46,7 +46,9 @@ describe('GetMealTicketsPerMonthQueryHandler', () => { } catch (e) { expect(e).toBeInstanceOf(CooperativeNotFoundException); expect(e.message).toBe('settings.errors.cooperative_not_found'); - verify(userRepository.findUsers(anything(), anything())).never(); + verify( + userRepository.findUsers(anything(), anything(), anything()) + ).never(); verify(mealTicketRemovalRepository.findByMonth(anything())).never(); verify( eventRepository.findAllEventsByMonth(anything(), anything()) @@ -70,7 +72,7 @@ describe('GetMealTicketsPerMonthQueryHandler', () => { when(user2.getFirstName()).thenReturn('Hélène'); when(user2.getLastName()).thenReturn('MARCHOIS'); - when(userRepository.findUsers(false, true)).thenResolve([ + when(userRepository.findUsers(false, true, false)).thenResolve([ instance(user), instance(user2) ]); @@ -119,7 +121,7 @@ describe('GetMealTicketsPerMonthQueryHandler', () => { ) ]); - verify(userRepository.findUsers(false, true)).once(); + verify(userRepository.findUsers(false, true, false)).once(); verify(mealTicketRemovalRepository.findByMonth(date)).once(); verify(eventRepository.findAllEventsByMonth(date, anything())).once(); }); diff --git a/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.ts b/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.ts index 960964297..130830e6b 100644 --- a/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.ts +++ b/src/Application/HumanResource/MealTicket/Query/GetMealTicketsPerMonthQueryHandler.ts @@ -35,7 +35,7 @@ export class GetMealTicketsPerMonthQueryHandler { const { date } = query; const [users, mealTicketRemovals] = await Promise.all([ - this.userRepository.findUsers(false, true), + this.userRepository.findUsers(false, true, false), this.mealTicketRemovalRepository.findByMonth(date) ]); diff --git a/src/Application/HumanResource/User/Query/GetUsersQuery.ts b/src/Application/HumanResource/User/Query/GetUsersQuery.ts index fc3f2a773..5dfe7e32f 100644 --- a/src/Application/HumanResource/User/Query/GetUsersQuery.ts +++ b/src/Application/HumanResource/User/Query/GetUsersQuery.ts @@ -3,6 +3,7 @@ import { IQuery } from 'src/Application/IQuery'; export class GetUsersQuery implements IQuery { constructor( public readonly withAccountant: boolean = false, - public readonly activeOnly: boolean = false + public readonly activeOnly: boolean = false, + public readonly inactiveOnly: boolean = false ) {} } diff --git a/src/Application/HumanResource/User/Query/GetUsersQueryHandler.spec.ts b/src/Application/HumanResource/User/Query/GetUsersQueryHandler.spec.ts index 2630242a2..4ca3a8ff2 100644 --- a/src/Application/HumanResource/User/Query/GetUsersQueryHandler.spec.ts +++ b/src/Application/HumanResource/User/Query/GetUsersQueryHandler.spec.ts @@ -25,7 +25,7 @@ describe('GetUsersQueryHandler', () => { when(user2.getRole()).thenReturn(UserRole.COOPERATOR); when(user2.isAdministrativeEditable()).thenReturn(true); - when(userRepository.findUsers(true, false)).thenResolve([ + when(userRepository.findUsers(true, false, false)).thenResolve([ instance(user1), instance(user2) ]); @@ -53,26 +53,26 @@ describe('GetUsersQueryHandler', () => { expect(await handler.execute(new GetUsersQuery(true, false))).toMatchObject( expectedResult ); - verify(userRepository.findUsers(true, false)).once(); + verify(userRepository.findUsers(true, false, false)).once(); }); it('testGetEmptyUsers', async () => { const userRepository = mock(UserRepository); - when(userRepository.findUsers(false, false)).thenResolve([]); + when(userRepository.findUsers(false, false, false)).thenResolve([]); const handler = new GetUsersQueryHandler(instance(userRepository)); expect( await handler.execute(new GetUsersQuery(false, false)) ).toMatchObject([]); - verify(userRepository.findUsers(false, false)).once(); + verify(userRepository.findUsers(false, false, false)).once(); }); it('testGetActiveUsers', async () => { const userRepository = mock(UserRepository); - when(userRepository.findUsers(true, true)).thenResolve([]); + when(userRepository.findUsers(true, true, false)).thenResolve([]); const handler = new GetUsersQueryHandler(instance(userRepository)); const expectedResult = []; @@ -80,6 +80,20 @@ describe('GetUsersQueryHandler', () => { expect(await handler.execute(new GetUsersQuery(true, true))).toMatchObject( expectedResult ); - verify(userRepository.findUsers(true, true)).once(); + verify(userRepository.findUsers(true, true, false)).once(); + }); + + it('testGetInactiveUsers', async () => { + const userRepository = mock(UserRepository); + + when(userRepository.findUsers(true, false, true)).thenResolve([]); + + const handler = new GetUsersQueryHandler(instance(userRepository)); + const expectedResult = []; + + expect( + await handler.execute(new GetUsersQuery(true, false, true)) + ).toMatchObject(expectedResult); + verify(userRepository.findUsers(true, false, true)).once(); }); }); diff --git a/src/Application/HumanResource/User/Query/GetUsersQueryHandler.ts b/src/Application/HumanResource/User/Query/GetUsersQueryHandler.ts index e01bee050..053a0f11c 100644 --- a/src/Application/HumanResource/User/Query/GetUsersQueryHandler.ts +++ b/src/Application/HumanResource/User/Query/GetUsersQueryHandler.ts @@ -12,14 +12,13 @@ export class GetUsersQueryHandler { ) {} public async execute(query: GetUsersQuery): Promise { - let noLeavingDate = false; - if (query.activeOnly) { - noLeavingDate = true; - } + const noLeavingDate = query.activeOnly; + const withLeavingDate = query.inactiveOnly; const users = await this.userRepository.findUsers( query.withAccountant, - noLeavingDate + noLeavingDate, + withLeavingDate ); const userViews: UserView[] = []; diff --git a/src/Domain/HumanResource/User/Repository/IUserRepository.ts b/src/Domain/HumanResource/User/Repository/IUserRepository.ts index 7a3065012..b5d5d1dbb 100644 --- a/src/Domain/HumanResource/User/Repository/IUserRepository.ts +++ b/src/Domain/HumanResource/User/Repository/IUserRepository.ts @@ -5,6 +5,10 @@ export interface IUserRepository { findOneByEmail(email: string): Promise; findOneById(id: string): Promise; save(user: User): Promise; - findUsers(withAccountant: boolean, noLeaveDate: boolean): Promise; + findUsers( + withAccountant: boolean, + noLeavingDate: boolean, + withLeavingDate: boolean + ): Promise; findUsersWithPayslipInfo(): Promise; } diff --git a/src/Infrastructure/HumanResource/User/Controller/ListUsersController.ts b/src/Infrastructure/HumanResource/User/Controller/ListUsersController.ts index 378bd925a..dd3df06a1 100644 --- a/src/Infrastructure/HumanResource/User/Controller/ListUsersController.ts +++ b/src/Infrastructure/HumanResource/User/Controller/ListUsersController.ts @@ -2,8 +2,8 @@ import { Controller, Inject, UseGuards, Get, Render } from '@nestjs/common'; import { IQueryBus } from 'src/Application/IQueryBus'; import { IsAuthenticatedGuard } from 'src/Infrastructure/HumanResource/User/Security/IsAuthenticatedGuard'; import { WithName } from 'src/Infrastructure/Common/ExtendedRouting/WithName'; -import { GetUsersQuery } from 'src/Application/HumanResource/User/Query/GetUsersQuery'; import { UserTableFactory } from '../Table/UserTableFactory'; +import { GetUsersQuery } from 'src/Application/HumanResource/User/Query/GetUsersQuery'; @Controller('app/people/users') @UseGuards(IsAuthenticatedGuard) @@ -18,10 +18,16 @@ export class ListUsersController { @WithName('people_users_list') @Render('pages/users/list.njk') public async get() { - const users = await this.queryBus.execute(new GetUsersQuery()); + const activeUsers = await this.queryBus.execute( + new GetUsersQuery(false, true, false) + ); + const activeUsersTable = this.tableFactory.create(activeUsers); - const table = this.tableFactory.create(users); + const inactiveUsers = await this.queryBus.execute( + new GetUsersQuery(false, false, true) + ); + const inactiveUsersTable = this.tableFactory.create(inactiveUsers); - return { table }; + return { activeUsersTable, inactiveUsersTable }; } } diff --git a/src/Infrastructure/HumanResource/User/Repository/UserRepository.ts b/src/Infrastructure/HumanResource/User/Repository/UserRepository.ts index c191edb7b..4cd1c5d42 100644 --- a/src/Infrastructure/HumanResource/User/Repository/UserRepository.ts +++ b/src/Infrastructure/HumanResource/User/Repository/UserRepository.ts @@ -57,7 +57,8 @@ export class UserRepository implements IUserRepository { public findUsers( withAccountant: boolean, - noLeavingDate: boolean = false + noLeavingDate: boolean = false, + withLeavingDate: boolean = false ): Promise { const query = this.repository .createQueryBuilder('user') @@ -68,17 +69,22 @@ export class UserRepository implements IUserRepository { 'user.email', 'user.role' ]) + .innerJoin('user.userAdministrative', 'userAdministrative') .orderBy('user.lastName', 'ASC') .addOrderBy('user.firstName', 'ASC'); if (false === withAccountant) { query.andWhere('user.role <> :role', { role: UserRole.ACCOUNTANT }); } + if (noLeavingDate) { - query.innerJoin('user.userAdministrative', 'userAdministrative'); query.andWhere('userAdministrative.leavingDate IS NULL'); } + if (withLeavingDate) { + query.andWhere('userAdministrative.leavingDate IS NOT NULL'); + } + return query.getMany(); } diff --git a/src/Infrastructure/HumanResource/User/Table/UserTableFactory.ts b/src/Infrastructure/HumanResource/User/Table/UserTableFactory.ts index 9329027b4..97855a950 100644 --- a/src/Infrastructure/HumanResource/User/Table/UserTableFactory.ts +++ b/src/Infrastructure/HumanResource/User/Table/UserTableFactory.ts @@ -13,8 +13,8 @@ export class UserTableFactory { public create(users: UserView[]): Table { const columns = [ - 'users-firstName', 'users-lastName', + 'users-firstName', 'users-email', 'users-role', 'common-actions' @@ -23,8 +23,8 @@ export class UserTableFactory { const rows = users.map(user => this.rowFactory .createBuilder() - .value(user.firstName) .value(user.lastName) + .value(user.firstName) .value(user.email) .trans('users-role-value', { role: user.role }) .actions({ diff --git a/src/assets/styles/utilities/text.css b/src/assets/styles/utilities/text.css index 04bde26bc..91384e2a5 100644 --- a/src/assets/styles/utilities/text.css +++ b/src/assets/styles/utilities/text.css @@ -15,3 +15,7 @@ .pc-text--small { font-size: var(--font-size-sm); } + +.pc-text--muted { + color: var(--text-muted); +} diff --git a/src/templates/pages/users/list.njk b/src/templates/pages/users/list.njk index 2c06aceb1..992a2ef55 100644 --- a/src/templates/pages/users/list.njk +++ b/src/templates/pages/users/list.njk @@ -17,6 +17,10 @@ {{ links.add(path('people_users_add'))}} - {% table table %} +

{{ 'users-active-title'|trans }}

+ {% table activeUsersTable %} + +

{{ 'users-inactive-title'|trans }}

+ {% table inactiveUsersTable %} {% endblock main %} diff --git a/src/translations/fr-FR.ftl b/src/translations/fr-FR.ftl index 7c84077f0..49ceb40f5 100644 --- a/src/translations/fr-FR.ftl +++ b/src/translations/fr-FR.ftl @@ -1,3 +1,7 @@ +# NOTE : ces traductions sont écrites avec Fluent +# Voir : https://projectfluent.org/ +# L'intégration à NestJS / Nunjucks est une implémentation custom (voir FluentTranslatorAdapter.ts et fichiers associés) + common-form-save = Enregistrer common-form-update = Mettre à jour common-form-delete = Supprimer @@ -237,6 +241,8 @@ meal-tickets-removal-date = Je ne souhaite pas recevoir de ticket restaurant pou users-title = Coopérateur·ices et salarié·es +users-active-title = Actuellement salarié⋅e +users-inactive-title = Précédemment salarié⋅e users-add-title = Ajouter un·e coopérateur·ice-salarié·e users-edit-title = Mise à jour des informations administratives de {$user} users-firstName = Prénom From 60937328af84f55158c5293206c096a12660ca53 Mon Sep 17 00:00:00 2001 From: Antoine Smagghe Date: Fri, 9 Jan 2026 17:13:19 +0100 Subject: [PATCH 2/2] Change way of checking if user is active or not --- .../GetUserAdministrativeByIdQueryHandler.ts | 1 + .../User/Query/GetUserByIdQueryHandler.ts | 2 +- .../HumanResource/User/Query/GetUsersQuery.ts | 2 -- .../User/Query/GetUsersQueryHandler.spec.ts | 28 ++++++++++--------- .../User/Query/GetUsersQueryHandler.ts | 8 ++---- .../HumanResource/User/View/UserView.ts | 1 + .../User/Repository/IUserRepository.ts | 6 +--- .../HumanResource/User/User.entity.spec.ts | 1 + src/Domain/HumanResource/User/User.entity.ts | 4 +++ .../Controller/ListLeaveRequestsController.ts | 2 -- .../User/Controller/EditProfileController.ts | 2 +- .../User/Controller/ListUsersController.ts | 11 ++------ .../User/Repository/UserRepository.ts | 13 ++------- .../User/Table/UserTableFactory.ts | 22 ++++++++++----- 14 files changed, 47 insertions(+), 56 deletions(-) diff --git a/src/Application/HumanResource/User/Query/GetUserAdministrativeByIdQueryHandler.ts b/src/Application/HumanResource/User/Query/GetUserAdministrativeByIdQueryHandler.ts index 5d1e5b54e..f409ed13f 100644 --- a/src/Application/HumanResource/User/Query/GetUserAdministrativeByIdQueryHandler.ts +++ b/src/Application/HumanResource/User/Query/GetUserAdministrativeByIdQueryHandler.ts @@ -48,6 +48,7 @@ export class GetUserAdministrativeByIdQueryHandler { user.getEmail(), user.getRole(), user.isAdministrativeEditable(), + user.isActive(), userAdministrativeView ); } diff --git a/src/Application/HumanResource/User/Query/GetUserByIdQueryHandler.ts b/src/Application/HumanResource/User/Query/GetUserByIdQueryHandler.ts index 081c46c2d..6a39f259e 100644 --- a/src/Application/HumanResource/User/Query/GetUserByIdQueryHandler.ts +++ b/src/Application/HumanResource/User/Query/GetUserByIdQueryHandler.ts @@ -24,7 +24,7 @@ export class GetUserByIdQueryHandler { user.getLastName(), user.getEmail(), user.getRole(), - user.isAdministrativeEditable() + user.isAdministrativeEditable(), ); } } diff --git a/src/Application/HumanResource/User/Query/GetUsersQuery.ts b/src/Application/HumanResource/User/Query/GetUsersQuery.ts index 5dfe7e32f..df942e6e4 100644 --- a/src/Application/HumanResource/User/Query/GetUsersQuery.ts +++ b/src/Application/HumanResource/User/Query/GetUsersQuery.ts @@ -3,7 +3,5 @@ import { IQuery } from 'src/Application/IQuery'; export class GetUsersQuery implements IQuery { constructor( public readonly withAccountant: boolean = false, - public readonly activeOnly: boolean = false, - public readonly inactiveOnly: boolean = false ) {} } diff --git a/src/Application/HumanResource/User/Query/GetUsersQueryHandler.spec.ts b/src/Application/HumanResource/User/Query/GetUsersQueryHandler.spec.ts index 4ca3a8ff2..52951c1d5 100644 --- a/src/Application/HumanResource/User/Query/GetUsersQueryHandler.spec.ts +++ b/src/Application/HumanResource/User/Query/GetUsersQueryHandler.spec.ts @@ -25,7 +25,7 @@ describe('GetUsersQueryHandler', () => { when(user2.getRole()).thenReturn(UserRole.COOPERATOR); when(user2.isAdministrativeEditable()).thenReturn(true); - when(userRepository.findUsers(true, false, false)).thenResolve([ + when(userRepository.findUsers(true)).thenResolve([ instance(user1), instance(user2) ]); @@ -38,6 +38,7 @@ describe('GetUsersQueryHandler', () => { 'MARCHOIS', 'mathieu@fairness.coop', UserRole.COOPERATOR, + true, true ), new UserView( @@ -46,54 +47,55 @@ describe('GetUsersQueryHandler', () => { 'MARCHOIS', 'helene@fairness.coop', UserRole.COOPERATOR, - true + true, + false ) ]; - expect(await handler.execute(new GetUsersQuery(true, false))).toMatchObject( + expect(await handler.execute(new GetUsersQuery(true))).toMatchObject( expectedResult ); - verify(userRepository.findUsers(true, false, false)).once(); + verify(userRepository.findUsers(true)).once(); }); it('testGetEmptyUsers', async () => { const userRepository = mock(UserRepository); - when(userRepository.findUsers(false, false, false)).thenResolve([]); + when(userRepository.findUsers(false)).thenResolve([]); const handler = new GetUsersQueryHandler(instance(userRepository)); expect( - await handler.execute(new GetUsersQuery(false, false)) + await handler.execute(new GetUsersQuery(false)) ).toMatchObject([]); - verify(userRepository.findUsers(false, false, false)).once(); + verify(userRepository.findUsers(false)).once(); }); it('testGetActiveUsers', async () => { const userRepository = mock(UserRepository); - when(userRepository.findUsers(true, true, false)).thenResolve([]); + when(userRepository.findUsers(true)).thenResolve([]); const handler = new GetUsersQueryHandler(instance(userRepository)); const expectedResult = []; - expect(await handler.execute(new GetUsersQuery(true, true))).toMatchObject( + expect(await handler.execute(new GetUsersQuery(true))).toMatchObject( expectedResult ); - verify(userRepository.findUsers(true, true, false)).once(); + verify(userRepository.findUsers(true)).once(); }); it('testGetInactiveUsers', async () => { const userRepository = mock(UserRepository); - when(userRepository.findUsers(true, false, true)).thenResolve([]); + when(userRepository.findUsers(true)).thenResolve([]); const handler = new GetUsersQueryHandler(instance(userRepository)); const expectedResult = []; expect( - await handler.execute(new GetUsersQuery(true, false, true)) + await handler.execute(new GetUsersQuery(true)) ).toMatchObject(expectedResult); - verify(userRepository.findUsers(true, false, true)).once(); + verify(userRepository.findUsers(true)).once(); }); }); diff --git a/src/Application/HumanResource/User/Query/GetUsersQueryHandler.ts b/src/Application/HumanResource/User/Query/GetUsersQueryHandler.ts index 053a0f11c..49345c8a1 100644 --- a/src/Application/HumanResource/User/Query/GetUsersQueryHandler.ts +++ b/src/Application/HumanResource/User/Query/GetUsersQueryHandler.ts @@ -12,13 +12,8 @@ export class GetUsersQueryHandler { ) {} public async execute(query: GetUsersQuery): Promise { - const noLeavingDate = query.activeOnly; - const withLeavingDate = query.inactiveOnly; - const users = await this.userRepository.findUsers( query.withAccountant, - noLeavingDate, - withLeavingDate ); const userViews: UserView[] = []; @@ -30,7 +25,8 @@ export class GetUsersQueryHandler { user.getLastName(), user.getEmail(), user.getRole(), - user.isAdministrativeEditable() + user.isAdministrativeEditable(), + user.isActive(), ) ); } diff --git a/src/Application/HumanResource/User/View/UserView.ts b/src/Application/HumanResource/User/View/UserView.ts index a2d84ec0b..fb60fe290 100644 --- a/src/Application/HumanResource/User/View/UserView.ts +++ b/src/Application/HumanResource/User/View/UserView.ts @@ -9,6 +9,7 @@ export class UserView { public readonly email: string, public readonly role: UserRole, public readonly isAdministrativeEditable: boolean, + public readonly isActive: boolean = null, public readonly administrativeView: UserAdministrativeView = null ) {} } diff --git a/src/Domain/HumanResource/User/Repository/IUserRepository.ts b/src/Domain/HumanResource/User/Repository/IUserRepository.ts index b5d5d1dbb..0a4d7dc29 100644 --- a/src/Domain/HumanResource/User/Repository/IUserRepository.ts +++ b/src/Domain/HumanResource/User/Repository/IUserRepository.ts @@ -5,10 +5,6 @@ export interface IUserRepository { findOneByEmail(email: string): Promise; findOneById(id: string): Promise; save(user: User): Promise; - findUsers( - withAccountant: boolean, - noLeavingDate: boolean, - withLeavingDate: boolean - ): Promise; + findUsers(withAccountant: boolean): Promise; findUsersWithPayslipInfo(): Promise; } diff --git a/src/Domain/HumanResource/User/User.entity.spec.ts b/src/Domain/HumanResource/User/User.entity.spec.ts index 704adc9fb..96de53e94 100644 --- a/src/Domain/HumanResource/User/User.entity.spec.ts +++ b/src/Domain/HumanResource/User/User.entity.spec.ts @@ -23,6 +23,7 @@ describe('User.entity', () => { expect(user.getPassword()).toBe('hashPassword'); expect(user.getApiToken()).toBe('hashToken'); expect(user.getRole()).toBe(UserRole.COOPERATOR); + expect(user.isActive()).toBe(true); expect(user.getUserAdministrative()).toBe(instance(admin)); expect(user.isAdministrativeEditable()).toBe(true); }); diff --git a/src/Domain/HumanResource/User/User.entity.ts b/src/Domain/HumanResource/User/User.entity.ts index 6b726ce4a..0d5ecd5c2 100644 --- a/src/Domain/HumanResource/User/User.entity.ts +++ b/src/Domain/HumanResource/User/User.entity.ts @@ -99,6 +99,10 @@ export class User { return this.role !== UserRole.ACCOUNTANT; } + public isActive(): boolean { + return this.userAdministrative.getLeavingDate() === null; + } + public getFullName(): string { return `${this.firstName} ${this.lastName}`; } diff --git a/src/Infrastructure/HumanResource/Leave/Controller/ListLeaveRequestsController.ts b/src/Infrastructure/HumanResource/Leave/Controller/ListLeaveRequestsController.ts index 0e5915897..5a1f2cfab 100644 --- a/src/Infrastructure/HumanResource/Leave/Controller/ListLeaveRequestsController.ts +++ b/src/Infrastructure/HumanResource/Leave/Controller/ListLeaveRequestsController.ts @@ -17,8 +17,6 @@ import { LoggedUser } from '../../User/Decorator/LoggedUser'; import { LeaveRequestTableFactory } from '../Table/LeaveRequestTableFactory'; import { LeaveRequestsOverviewTableFactory } from '../Table/LeaveRequestOverviewTableFactory'; import { GetLeaveRequestsOverviewQuery } from 'src/Application/HumanResource/Leave/Query/GetLeaveRequestsOverviewQuery'; -import { UserView } from 'src/Application/HumanResource/User/View/UserView'; -import { GetUsersQuery } from 'src/Application/HumanResource/User/Query/GetUsersQuery'; import { ListLeaveRequestsControllerDTO } from '../DTO/ListLeaveRequestsControllerDTO'; @Controller('app/people/leave_requests') diff --git a/src/Infrastructure/HumanResource/User/Controller/EditProfileController.ts b/src/Infrastructure/HumanResource/User/Controller/EditProfileController.ts index 6ab87ce58..1644be626 100644 --- a/src/Infrastructure/HumanResource/User/Controller/EditProfileController.ts +++ b/src/Infrastructure/HumanResource/User/Controller/EditProfileController.ts @@ -39,7 +39,7 @@ export class EditProfileController { user.getLastName(), user.getEmail(), user.getRole(), - false + false, ); return { user: me }; diff --git a/src/Infrastructure/HumanResource/User/Controller/ListUsersController.ts b/src/Infrastructure/HumanResource/User/Controller/ListUsersController.ts index dd3df06a1..b42fec557 100644 --- a/src/Infrastructure/HumanResource/User/Controller/ListUsersController.ts +++ b/src/Infrastructure/HumanResource/User/Controller/ListUsersController.ts @@ -18,15 +18,10 @@ export class ListUsersController { @WithName('people_users_list') @Render('pages/users/list.njk') public async get() { - const activeUsers = await this.queryBus.execute( - new GetUsersQuery(false, true, false) + const users = await this.queryBus.execute( + new GetUsersQuery(false) ); - const activeUsersTable = this.tableFactory.create(activeUsers); - - const inactiveUsers = await this.queryBus.execute( - new GetUsersQuery(false, false, true) - ); - const inactiveUsersTable = this.tableFactory.create(inactiveUsers); + const [ activeUsersTable, inactiveUsersTable ] = this.tableFactory.create(users); return { activeUsersTable, inactiveUsersTable }; } diff --git a/src/Infrastructure/HumanResource/User/Repository/UserRepository.ts b/src/Infrastructure/HumanResource/User/Repository/UserRepository.ts index 4cd1c5d42..3aa0368c4 100644 --- a/src/Infrastructure/HumanResource/User/Repository/UserRepository.ts +++ b/src/Infrastructure/HumanResource/User/Repository/UserRepository.ts @@ -57,8 +57,6 @@ export class UserRepository implements IUserRepository { public findUsers( withAccountant: boolean, - noLeavingDate: boolean = false, - withLeavingDate: boolean = false ): Promise { const query = this.repository .createQueryBuilder('user') @@ -67,7 +65,8 @@ export class UserRepository implements IUserRepository { 'user.firstName', 'user.lastName', 'user.email', - 'user.role' + 'user.role', + 'userAdministrative' ]) .innerJoin('user.userAdministrative', 'userAdministrative') .orderBy('user.lastName', 'ASC') @@ -77,14 +76,6 @@ export class UserRepository implements IUserRepository { query.andWhere('user.role <> :role', { role: UserRole.ACCOUNTANT }); } - if (noLeavingDate) { - query.andWhere('userAdministrative.leavingDate IS NULL'); - } - - if (withLeavingDate) { - query.andWhere('userAdministrative.leavingDate IS NOT NULL'); - } - return query.getMany(); } diff --git a/src/Infrastructure/HumanResource/User/Table/UserTableFactory.ts b/src/Infrastructure/HumanResource/User/Table/UserTableFactory.ts index 97855a950..0e735fbc8 100644 --- a/src/Infrastructure/HumanResource/User/Table/UserTableFactory.ts +++ b/src/Infrastructure/HumanResource/User/Table/UserTableFactory.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { UserView } from 'src/Application/HumanResource/User/View/UserView'; import { RouteNameResolver } from 'src/Infrastructure/Common/ExtendedRouting/RouteNameResolver'; import { RowFactory } from 'src/Infrastructure/Tables/RowFactory'; -import { Table } from 'src/Infrastructure/Tables'; +import { ICell, Row, Table } from 'src/Infrastructure/Tables'; @Injectable() export class UserTableFactory { @@ -11,7 +11,7 @@ export class UserTableFactory { private readonly rowFactory: RowFactory ) {} - public create(users: UserView[]): Table { + public create(users: UserView[]): Table[] { const columns = [ 'users-lastName', 'users-firstName', @@ -20,8 +20,8 @@ export class UserTableFactory { 'common-actions' ]; - const rows = users.map(user => - this.rowFactory + const rows = users.reduce((carry, user) => { + const row = this.rowFactory .createBuilder() .value(user.lastName) .value(user.firstName) @@ -34,9 +34,17 @@ export class UserTableFactory { }) } }) - .build() - ); + .build(); - return new Table(columns, rows); + if (user.isActive) { + carry[0].push(row); + } else { + carry[1].push(row); + } + + return carry; + }, [[], []] as Array); + + return [new Table(columns, rows[0]), new Table(columns, rows[1])]; } }