fix: record created by in expense service.

This commit is contained in:
Ahmed Bouhuolia
2020-09-28 23:18:50 +02:00
parent 4732fa1d21
commit d47d36bb0e
3 changed files with 47 additions and 33 deletions

View File

@@ -164,11 +164,11 @@ export default class ExpensesController extends BaseController {
* @param {NextFunction} next * @param {NextFunction} next
*/ */
async deleteExpense(req: Request, res: Response, next: NextFunction) { async deleteExpense(req: Request, res: Response, next: NextFunction) {
const { tenantId } = req; const { tenantId, user } = req;
const { id: expenseId } = req.params; const { id: expenseId } = req.params;
try { try {
await this.expensesService.deleteExpense(tenantId, expenseId) await this.expensesService.deleteExpense(tenantId, expenseId, user);
return res.status(200).send({ id: expenseId }); return res.status(200).send({ id: expenseId });
} catch (error) { } catch (error) {
next(error) next(error)
@@ -182,11 +182,11 @@ export default class ExpensesController extends BaseController {
* @param {NextFunction} next * @param {NextFunction} next
*/ */
async publishExpense(req: Request, res: Response, next: NextFunction) { async publishExpense(req: Request, res: Response, next: NextFunction) {
const { tenantId } = req; const { tenantId, user } = req;
const { id: expenseId } = req.params; const { id: expenseId } = req.params;
try { try {
await this.expensesService.publishExpense(tenantId, expenseId) await this.expensesService.publishExpense(tenantId, expenseId, user)
return res.status(200).send({ }); return res.status(200).send({ });
} catch (error) { } catch (error) {
next(error); next(error);
@@ -200,11 +200,11 @@ export default class ExpensesController extends BaseController {
* @param {NextFunction} next * @param {NextFunction} next
*/ */
async bulkDeleteExpenses(req: Request, res: Response, next: NextFunction) { async bulkDeleteExpenses(req: Request, res: Response, next: NextFunction) {
const { tenantId } = req; const { tenantId, user } = req;
const { ids: expensesIds } = req.params; const { ids: expensesIds } = req.params;
try { try {
await this.expensesService.deleteBulkExpenses(tenantId, expensesIds); await this.expensesService.deleteBulkExpenses(tenantId, expensesIds, user);
return res.status(200).send({ ids: expensesIds }); return res.status(200).send({ ids: expensesIds });
} catch (error) { } catch (error) {
next(error); next(error);
@@ -218,10 +218,11 @@ export default class ExpensesController extends BaseController {
* @param {NextFunction} next * @param {NextFunction} next
*/ */
async bulkPublishExpenses(req: Request, res: Response, next: NextFunction) { async bulkPublishExpenses(req: Request, res: Response, next: NextFunction) {
const { tenantId } = req; const { tenantId, user } = req;
const { ids: expensesIds } = req.query;
try { try {
await this.expensesService.publishBulkExpenses(tenantId,); await this.expensesService.publishBulkExpenses(tenantId, expensesIds, user);
return res.status(200).send({}); return res.status(200).send({});
} catch (error) { } catch (error) {
next(error); next(error);

View File

@@ -1,3 +1,4 @@
import { ISystemUser } from "./User";
export interface IExpense { export interface IExpense {
id: number, id: number,
@@ -43,13 +44,13 @@ export interface IExpenseCategoryDTO {
}; };
export interface IExpensesService { export interface IExpensesService {
newExpense(tenantid: number, expenseDTO: IExpenseDTO): Promise<IExpense>; newExpense(tenantid: number, expenseDTO: IExpenseDTO, authorizedUser: ISystemUser): Promise<IExpense>;
editExpense(tenantid: number, expenseId: number, expenseDTO: IExpenseDTO): void; editExpense(tenantid: number, expenseId: number, expenseDTO: IExpenseDTO, authorizedUser: ISystemUser): void;
publishExpense(tenantId: number, expenseId: number): Promise<void>; publishExpense(tenantId: number, expenseId: number, authorizedUser: ISystemUser): Promise<void>;
deleteExpense(tenantId: number, expenseId: number): Promise<void>; deleteExpense(tenantId: number, expenseId: number, authorizedUser: ISystemUser): Promise<void>;
deleteBulkExpenses(tenantId: number, expensesIds: number[]): Promise<void>; deleteBulkExpenses(tenantId: number, expensesIds: number[], authorizedUser: ISystemUser): Promise<void>;
publishBulkExpenses(tenantId: number, expensesIds: number[]): Promise<void>; publishBulkExpenses(tenantId: number, expensesIds: number[], authorizedUser: ISystemUser): Promise<void>;
} }

View File

@@ -37,7 +37,7 @@ export default class ExpensesService implements IExpensesService {
* @param {number} paymentAccountId * @param {number} paymentAccountId
* @returns {Promise<IAccount>} * @returns {Promise<IAccount>}
*/ */
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 }); this.logger.info('[expenses] trying to get the given payment account.', { tenantId, paymentAccountId });
const { accountRepository } = this.tenancy.repositories(tenantId); const { accountRepository } = this.tenancy.repositories(tenantId);
@@ -58,7 +58,7 @@ export default class ExpensesService implements IExpensesService {
* @throws {ServiceError} * @throws {ServiceError}
* @returns {Promise<IAccount[]>} * @returns {Promise<IAccount[]>}
*/ */
async getExpensesAccountsOrThrowError(tenantId: number, expenseAccountsIds: number[]) { private async getExpensesAccountsOrThrowError(tenantId: number, expenseAccountsIds: number[]) {
this.logger.info('[expenses] trying to get expenses accounts.', { tenantId, expenseAccountsIds }); this.logger.info('[expenses] trying to get expenses accounts.', { tenantId, expenseAccountsIds });
const { Account } = this.tenancy.models(tenantId); const { Account } = this.tenancy.models(tenantId);
@@ -82,7 +82,7 @@ export default class ExpensesService implements IExpensesService {
* @param {IExpenseDTO|ServiceError} expenseDTO * @param {IExpenseDTO|ServiceError} expenseDTO
* @throws {ServiceError} * @throws {ServiceError}
*/ */
validateCategoriesNotEqualZero(expenseDTO: IExpenseDTO) { private validateCategoriesNotEqualZero(expenseDTO: IExpenseDTO) {
this.logger.info('[expenses] validate the expenses categoires not equal zero.', { expenseDTO }); this.logger.info('[expenses] validate the expenses categoires not equal zero.', { expenseDTO });
const totalAmount = sumBy(expenseDTO.categories, 'amount') || 0; const totalAmount = sumBy(expenseDTO.categories, 'amount') || 0;
@@ -97,7 +97,7 @@ export default class ExpensesService implements IExpensesService {
* @param {number} tenantId * @param {number} tenantId
* @param {number[]} expensesAccountsIds * @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 }); this.logger.info('[expenses] trying to validate expenses accounts type.', { tenantId, expensesAccounts });
const { accountTypeRepository } = this.tenancy.repositories(tenantId); const { accountTypeRepository } = this.tenancy.repositories(tenantId);
@@ -121,7 +121,7 @@ export default class ExpensesService implements IExpensesService {
* @param {number} paymentAccountId * @param {number} paymentAccountId
* @throws {ServiceError} * @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 }); this.logger.info('[expenses] trying to validate payment account type.', { tenantId, paymentAccount });
const { accountTypeRepository } = this.tenancy.repositories(tenantId); const { accountTypeRepository } = this.tenancy.repositories(tenantId);
@@ -136,8 +136,7 @@ export default class ExpensesService implements IExpensesService {
} }
} }
private async revertJournalEntries(
async revertJournalEntries(
tenantId: number, tenantId: number,
expenseId: number|number[], expenseId: number|number[],
) { ) {
@@ -159,7 +158,7 @@ export default class ExpensesService implements IExpensesService {
* @param {IExpense} expense * @param {IExpense} expense
* @param {IUser} authorizedUser * @param {IUser} authorizedUser
*/ */
async writeJournalEntries( private async writeJournalEntries(
tenantId: number, tenantId: number,
expense: IExpense, expense: IExpense,
revertOld: boolean, revertOld: boolean,
@@ -208,7 +207,7 @@ export default class ExpensesService implements IExpensesService {
* @param {number} expenseId * @param {number} expenseId
* @returns {IExpense|ServiceError} * @returns {IExpense|ServiceError}
*/ */
async getExpenseOrThrowError(tenantId: number, expenseId: number) { private async getExpenseOrThrowError(tenantId: number, expenseId: number) {
const { expenseRepository } = this.tenancy.repositories(tenantId); const { expenseRepository } = this.tenancy.repositories(tenantId);
this.logger.info('[expense] trying to get the given expense.', { tenantId, expenseId }); 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. * Validates expenses is not already published before.
* @param {IExpense} expense * @param {IExpense} expense
*/ */
validateExpenseIsNotPublished(expense: IExpense) { private validateExpenseIsNotPublished(expense: IExpense) {
if (expense.published) { if (expense.published) {
throw new ServiceError(ERRORS.EXPENSE_ACCOUNT_ALREADY_PUBLISED); throw new ServiceError(ERRORS.EXPENSE_ACCOUNT_ALREADY_PUBLISED);
} }
@@ -238,9 +237,10 @@ export default class ExpensesService implements IExpensesService {
/** /**
* Mapping expense DTO to model. * Mapping expense DTO to model.
* @param {IExpenseDTO} expenseDTO * @param {IExpenseDTO} expenseDTO
* @param {ISystemUser} authorizedUser
* @return {IExpense} * @return {IExpense}
*/ */
expenseDTOToModel(expenseDTO: IExpenseDTO) { private expenseDTOToModel(expenseDTO: IExpenseDTO, user?: ISystemUser) {
const totalAmount = sumBy(expenseDTO.categories, 'amount'); const totalAmount = sumBy(expenseDTO.categories, 'amount');
return { return {
@@ -249,6 +249,9 @@ export default class ExpensesService implements IExpensesService {
...expenseDTO, ...expenseDTO,
totalAmount, totalAmount,
paymentDate: moment(expenseDTO.paymentDate).toMySqlDateTime(), paymentDate: moment(expenseDTO.paymentDate).toMySqlDateTime(),
...(user) ? {
userId: user.id,
} : {},
} }
} }
@@ -275,8 +278,9 @@ export default class ExpensesService implements IExpensesService {
* @param {number} tenantId * @param {number} tenantId
* @param {number} expenseId * @param {number} expenseId
* @param {IExpenseDTO} expenseDTO * @param {IExpenseDTO} expenseDTO
* @param {ISystemUser} authorizedUser
*/ */
async editExpense( public async editExpense(
tenantId: number, tenantId: number,
expenseId: number, expenseId: number,
expenseDTO: IExpenseDTO, expenseDTO: IExpenseDTO,
@@ -329,7 +333,11 @@ export default class ExpensesService implements IExpensesService {
* @param {number} tenantId * @param {number} tenantId
* @param {IExpenseDTO} expenseDTO * @param {IExpenseDTO} expenseDTO
*/ */
async newExpense(tenantId: number, expenseDTO: IExpenseDTO, authorizedUser: ISystemUser): Promise<IExpense> { public async newExpense(
tenantId: number,
expenseDTO: IExpenseDTO,
authorizedUser: ISystemUser,
): Promise<IExpense> {
const { expenseRepository } = this.tenancy.repositories(tenantId); const { expenseRepository } = this.tenancy.repositories(tenantId);
// 1. Validate payment account existance on the storage. // 1. Validate payment account existance on the storage.
@@ -352,7 +360,7 @@ export default class ExpensesService implements IExpensesService {
this.validateCategoriesNotEqualZero(expenseDTO); this.validateCategoriesNotEqualZero(expenseDTO);
// 6. Save the expense to the storage. // 6. Save the expense to the storage.
const expenseObj = this.expenseDTOToModel(expenseDTO); const expenseObj = this.expenseDTOToModel(expenseDTO, authorizedUser);
const expenseModel = await expenseRepository.create(expenseObj); const expenseModel = await expenseRepository.create(expenseObj);
// 7. In case expense published, write journal entries. // 7. In case expense published, write journal entries.
@@ -368,9 +376,10 @@ export default class ExpensesService implements IExpensesService {
* Publish the given expense. * Publish the given expense.
* @param {number} tenantId * @param {number} tenantId
* @param {number} expenseId * @param {number} expenseId
* @param {ISystemUser} authorizedUser
* @return {Promise<void>} * @return {Promise<void>}
*/ */
async publishExpense(tenantId: number, expenseId: number) { public async publishExpense(tenantId: number, expenseId: number, authorizedUser: ISystemUser) {
const { expenseRepository } = this.tenancy.repositories(tenantId); const { expenseRepository } = this.tenancy.repositories(tenantId);
const expense = await this.getExpenseOrThrowError(tenantId, expenseId); const expense = await this.getExpenseOrThrowError(tenantId, expenseId);
@@ -389,8 +398,9 @@ export default class ExpensesService implements IExpensesService {
* Deletes the given expense. * Deletes the given expense.
* @param {number} tenantId * @param {number} tenantId
* @param {number} expenseId * @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 expense = await this.getExpenseOrThrowError(tenantId, expenseId);
const { expenseRepository } = this.tenancy.repositories(tenantId); const { expenseRepository } = this.tenancy.repositories(tenantId);
@@ -407,8 +417,9 @@ export default class ExpensesService implements IExpensesService {
* Deletes the given expenses in bulk. * Deletes the given expenses in bulk.
* @param {number} tenantId * @param {number} tenantId
* @param {number[]} expensesIds * @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 expenses = await this.getExpensesOrThrowError(tenantId, expensesIds);
const { expenseRepository } = this.tenancy.repositories(tenantId); const { expenseRepository } = this.tenancy.repositories(tenantId);
@@ -423,8 +434,9 @@ export default class ExpensesService implements IExpensesService {
* Deletes the given expenses in bulk. * Deletes the given expenses in bulk.
* @param {number} tenantId * @param {number} tenantId
* @param {number[]} expensesIds * @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 expenses = await this.getExpensesOrThrowError(tenantId, expensesIds);
const { expenseRepository } = this.tenancy.repositories(tenantId); const { expenseRepository } = this.tenancy.repositories(tenantId);
@@ -440,7 +452,7 @@ export default class ExpensesService implements IExpensesService {
* @param {IExpensesFilter} expensesFilter * @param {IExpensesFilter} expensesFilter
* @return {IExpense[]} * @return {IExpense[]}
*/ */
async getExpensesList(tenantId: number, expensesFilter: IExpensesFilter) { public async getExpensesList(tenantId: number, expensesFilter: IExpensesFilter) {
const { Expense } = this.tenancy.models(tenantId); const { Expense } = this.tenancy.models(tenantId);
const dynamicFilter = await this.dynamicListService.dynamicList(tenantId, Expense, expensesFilter); const dynamicFilter = await this.dynamicListService.dynamicList(tenantId, Expense, expensesFilter);