From d47d36bb0e3c91e67ecae581afd370c98581beae Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Mon, 28 Sep 2020 23:18:50 +0200 Subject: [PATCH] fix: record created by in expense service. --- server/src/api/controllers/Expenses.ts | 17 ++++--- server/src/interfaces/Expenses.ts | 13 ++--- .../src/services/Expenses/ExpensesService.ts | 50 ++++++++++++------- 3 files changed, 47 insertions(+), 33 deletions(-) diff --git a/server/src/api/controllers/Expenses.ts b/server/src/api/controllers/Expenses.ts index 5d2ca1b3e..668dbba45 100644 --- a/server/src/api/controllers/Expenses.ts +++ b/server/src/api/controllers/Expenses.ts @@ -164,11 +164,11 @@ export default class ExpensesController extends BaseController { * @param {NextFunction} next */ async deleteExpense(req: Request, res: Response, next: NextFunction) { - const { tenantId } = req; + const { tenantId, user } = req; const { id: expenseId } = req.params; try { - await this.expensesService.deleteExpense(tenantId, expenseId) + await this.expensesService.deleteExpense(tenantId, expenseId, user); return res.status(200).send({ id: expenseId }); } catch (error) { next(error) @@ -182,11 +182,11 @@ export default class ExpensesController extends BaseController { * @param {NextFunction} next */ async publishExpense(req: Request, res: Response, next: NextFunction) { - const { tenantId } = req; + const { tenantId, user } = req; const { id: expenseId } = req.params; try { - await this.expensesService.publishExpense(tenantId, expenseId) + await this.expensesService.publishExpense(tenantId, expenseId, user) return res.status(200).send({ }); } catch (error) { next(error); @@ -200,11 +200,11 @@ export default class ExpensesController extends BaseController { * @param {NextFunction} next */ async bulkDeleteExpenses(req: Request, res: Response, next: NextFunction) { - const { tenantId } = req; + const { tenantId, user } = req; const { ids: expensesIds } = req.params; try { - await this.expensesService.deleteBulkExpenses(tenantId, expensesIds); + await this.expensesService.deleteBulkExpenses(tenantId, expensesIds, user); return res.status(200).send({ ids: expensesIds }); } catch (error) { next(error); @@ -218,10 +218,11 @@ export default class ExpensesController extends BaseController { * @param {NextFunction} next */ async bulkPublishExpenses(req: Request, res: Response, next: NextFunction) { - const { tenantId } = req; + const { tenantId, user } = req; + const { ids: expensesIds } = req.query; try { - await this.expensesService.publishBulkExpenses(tenantId,); + await this.expensesService.publishBulkExpenses(tenantId, expensesIds, user); return res.status(200).send({}); } catch (error) { next(error); diff --git a/server/src/interfaces/Expenses.ts b/server/src/interfaces/Expenses.ts index b32109d46..ee944d837 100644 --- a/server/src/interfaces/Expenses.ts +++ b/server/src/interfaces/Expenses.ts @@ -1,3 +1,4 @@ +import { ISystemUser } from "./User"; export interface IExpense { id: number, @@ -43,13 +44,13 @@ export interface IExpenseCategoryDTO { }; export interface IExpensesService { - newExpense(tenantid: number, expenseDTO: IExpenseDTO): Promise; - editExpense(tenantid: number, expenseId: number, expenseDTO: IExpenseDTO): void; + newExpense(tenantid: number, expenseDTO: IExpenseDTO, authorizedUser: ISystemUser): Promise; + editExpense(tenantid: number, expenseId: number, expenseDTO: IExpenseDTO, authorizedUser: ISystemUser): void; - publishExpense(tenantId: number, expenseId: number): Promise; + publishExpense(tenantId: number, expenseId: number, authorizedUser: ISystemUser): Promise; - deleteExpense(tenantId: number, expenseId: number): Promise; - deleteBulkExpenses(tenantId: number, expensesIds: number[]): Promise; + deleteExpense(tenantId: number, expenseId: number, authorizedUser: ISystemUser): Promise; + deleteBulkExpenses(tenantId: number, expensesIds: number[], authorizedUser: ISystemUser): Promise; - publishBulkExpenses(tenantId: number, expensesIds: number[]): Promise; + publishBulkExpenses(tenantId: number, expensesIds: number[], authorizedUser: ISystemUser): Promise; } \ No newline at end of file diff --git a/server/src/services/Expenses/ExpensesService.ts b/server/src/services/Expenses/ExpensesService.ts index 5b8b08527..8c9de055b 100644 --- a/server/src/services/Expenses/ExpensesService.ts +++ b/server/src/services/Expenses/ExpensesService.ts @@ -37,7 +37,7 @@ export default class ExpensesService implements IExpensesService { * @param {number} paymentAccountId * @returns {Promise} */ - async getPaymentAccountOrThrowError(tenantId: number, paymentAccountId: number) { + private async getPaymentAccountOrThrowError(tenantId: number, paymentAccountId: number) { this.logger.info('[expenses] trying to get the given payment account.', { tenantId, paymentAccountId }); const { accountRepository } = this.tenancy.repositories(tenantId); @@ -58,7 +58,7 @@ export default class ExpensesService implements IExpensesService { * @throws {ServiceError} * @returns {Promise} */ - async getExpensesAccountsOrThrowError(tenantId: number, expenseAccountsIds: number[]) { + private async getExpensesAccountsOrThrowError(tenantId: number, expenseAccountsIds: number[]) { this.logger.info('[expenses] trying to get expenses accounts.', { tenantId, expenseAccountsIds }); const { Account } = this.tenancy.models(tenantId); @@ -82,7 +82,7 @@ export default class ExpensesService implements IExpensesService { * @param {IExpenseDTO|ServiceError} expenseDTO * @throws {ServiceError} */ - validateCategoriesNotEqualZero(expenseDTO: IExpenseDTO) { + private validateCategoriesNotEqualZero(expenseDTO: IExpenseDTO) { this.logger.info('[expenses] validate the expenses categoires not equal zero.', { expenseDTO }); const totalAmount = sumBy(expenseDTO.categories, 'amount') || 0; @@ -97,7 +97,7 @@ export default class ExpensesService implements IExpensesService { * @param {number} tenantId * @param {number[]} expensesAccountsIds */ - async validateExpensesAccountsType(tenantId: number, expensesAccounts: number[]) { + private async validateExpensesAccountsType(tenantId: number, expensesAccounts: number[]) { this.logger.info('[expenses] trying to validate expenses accounts type.', { tenantId, expensesAccounts }); const { accountTypeRepository } = this.tenancy.repositories(tenantId); @@ -121,7 +121,7 @@ export default class ExpensesService implements IExpensesService { * @param {number} paymentAccountId * @throws {ServiceError} */ - async validatePaymentAccountType(tenantId: number, paymentAccount: number[]) { + private async validatePaymentAccountType(tenantId: number, paymentAccount: number[]) { this.logger.info('[expenses] trying to validate payment account type.', { tenantId, paymentAccount }); const { accountTypeRepository } = this.tenancy.repositories(tenantId); @@ -136,8 +136,7 @@ export default class ExpensesService implements IExpensesService { } } - - async revertJournalEntries( + private async revertJournalEntries( tenantId: number, expenseId: number|number[], ) { @@ -159,7 +158,7 @@ export default class ExpensesService implements IExpensesService { * @param {IExpense} expense * @param {IUser} authorizedUser */ - async writeJournalEntries( + private async writeJournalEntries( tenantId: number, expense: IExpense, revertOld: boolean, @@ -208,7 +207,7 @@ export default class ExpensesService implements IExpensesService { * @param {number} expenseId * @returns {IExpense|ServiceError} */ - async getExpenseOrThrowError(tenantId: number, expenseId: number) { + private async getExpenseOrThrowError(tenantId: number, expenseId: number) { const { expenseRepository } = this.tenancy.repositories(tenantId); this.logger.info('[expense] trying to get the given expense.', { tenantId, expenseId }); @@ -229,7 +228,7 @@ export default class ExpensesService implements IExpensesService { * Validates expenses is not already published before. * @param {IExpense} expense */ - validateExpenseIsNotPublished(expense: IExpense) { + private validateExpenseIsNotPublished(expense: IExpense) { if (expense.published) { throw new ServiceError(ERRORS.EXPENSE_ACCOUNT_ALREADY_PUBLISED); } @@ -238,9 +237,10 @@ export default class ExpensesService implements IExpensesService { /** * Mapping expense DTO to model. * @param {IExpenseDTO} expenseDTO + * @param {ISystemUser} authorizedUser * @return {IExpense} */ - expenseDTOToModel(expenseDTO: IExpenseDTO) { + private expenseDTOToModel(expenseDTO: IExpenseDTO, user?: ISystemUser) { const totalAmount = sumBy(expenseDTO.categories, 'amount'); return { @@ -249,6 +249,9 @@ export default class ExpensesService implements IExpensesService { ...expenseDTO, totalAmount, paymentDate: moment(expenseDTO.paymentDate).toMySqlDateTime(), + ...(user) ? { + userId: user.id, + } : {}, } } @@ -275,8 +278,9 @@ export default class ExpensesService implements IExpensesService { * @param {number} tenantId * @param {number} expenseId * @param {IExpenseDTO} expenseDTO + * @param {ISystemUser} authorizedUser */ - async editExpense( + public async editExpense( tenantId: number, expenseId: number, expenseDTO: IExpenseDTO, @@ -329,7 +333,11 @@ export default class ExpensesService implements IExpensesService { * @param {number} tenantId * @param {IExpenseDTO} expenseDTO */ - async newExpense(tenantId: number, expenseDTO: IExpenseDTO, authorizedUser: ISystemUser): Promise { + public async newExpense( + tenantId: number, + expenseDTO: IExpenseDTO, + authorizedUser: ISystemUser, + ): Promise { const { expenseRepository } = this.tenancy.repositories(tenantId); // 1. Validate payment account existance on the storage. @@ -352,7 +360,7 @@ export default class ExpensesService implements IExpensesService { this.validateCategoriesNotEqualZero(expenseDTO); // 6. Save the expense to the storage. - const expenseObj = this.expenseDTOToModel(expenseDTO); + const expenseObj = this.expenseDTOToModel(expenseDTO, authorizedUser); const expenseModel = await expenseRepository.create(expenseObj); // 7. In case expense published, write journal entries. @@ -368,9 +376,10 @@ export default class ExpensesService implements IExpensesService { * Publish the given expense. * @param {number} tenantId * @param {number} expenseId + * @param {ISystemUser} authorizedUser * @return {Promise} */ - async publishExpense(tenantId: number, expenseId: number) { + public async publishExpense(tenantId: number, expenseId: number, authorizedUser: ISystemUser) { const { expenseRepository } = this.tenancy.repositories(tenantId); const expense = await this.getExpenseOrThrowError(tenantId, expenseId); @@ -389,8 +398,9 @@ export default class ExpensesService implements IExpensesService { * Deletes the given expense. * @param {number} tenantId * @param {number} expenseId + * @param {ISystemUser} authorizedUser */ - async deleteExpense(tenantId: number, expenseId: number) { + public async deleteExpense(tenantId: number, expenseId: number, authorizedUser: ISystemUser) { const expense = await this.getExpenseOrThrowError(tenantId, expenseId); const { expenseRepository } = this.tenancy.repositories(tenantId); @@ -407,8 +417,9 @@ export default class ExpensesService implements IExpensesService { * Deletes the given expenses in bulk. * @param {number} tenantId * @param {number[]} expensesIds + * @param {ISystemUser} authorizedUser */ - async deleteBulkExpenses(tenantId: number, expensesIds: number[]) { + public async deleteBulkExpenses(tenantId: number, expensesIds: number[], authorizedUser: ISystemUser) { const expenses = await this.getExpensesOrThrowError(tenantId, expensesIds); const { expenseRepository } = this.tenancy.repositories(tenantId); @@ -423,8 +434,9 @@ export default class ExpensesService implements IExpensesService { * Deletes the given expenses in bulk. * @param {number} tenantId * @param {number[]} expensesIds + * @param {ISystemUser} authorizedUser */ - async publishBulkExpenses(tenantId: number, expensesIds: number[]) { + public async publishBulkExpenses(tenantId: number, expensesIds: number[], authorizedUser: ISystemUser) { const expenses = await this.getExpensesOrThrowError(tenantId, expensesIds); const { expenseRepository } = this.tenancy.repositories(tenantId); @@ -440,7 +452,7 @@ export default class ExpensesService implements IExpensesService { * @param {IExpensesFilter} expensesFilter * @return {IExpense[]} */ - async getExpensesList(tenantId: number, expensesFilter: IExpensesFilter) { + public async getExpensesList(tenantId: number, expensesFilter: IExpensesFilter) { const { Expense } = this.tenancy.models(tenantId); const dynamicFilter = await this.dynamicListService.dynamicList(tenantId, Expense, expensesFilter);