diff --git a/server/src/repositories/ExpenseRepository.ts b/server/src/repositories/ExpenseRepository.ts index 4c76e418b..a25c308e0 100644 --- a/server/src/repositories/ExpenseRepository.ts +++ b/server/src/repositories/ExpenseRepository.ts @@ -36,7 +36,7 @@ export default class ExpenseRepository extends TenantRepository { */ async create(expenseInput: IExpense): Promise { const { Expense } = this.models; - const expense = await Expense.query().insert({ ...expenseInput }); + const expense = await Expense.query().insertGraph({ ...expenseInput }); this.flushCache(); return expense; @@ -72,10 +72,10 @@ export default class ExpenseRepository extends TenantRepository { * @param {number} expenseId */ async delete(expenseId: number): Promise { - const { Expense } = this.models; + const { Expense, ExpenseCategory } = this.models; + await ExpenseCategory.query().where('expense_id', expenseId).delete(); await Expense.query().where('id', expenseId).delete(); - await Expense.query().where('expense_id', expenseId).delete(); this.flushCache(); } diff --git a/server/src/services/Accounting/JournalCommands.ts b/server/src/services/Accounting/JournalCommands.ts index 9be420066..322180adb 100644 --- a/server/src/services/Accounting/JournalCommands.ts +++ b/server/src/services/Accounting/JournalCommands.ts @@ -138,16 +138,18 @@ export default class JournalCommands{ const paymentJournalEntry = new JournalEntry({ credit: expense.totalAmount, account: expense.paymentAccountId, + index: 1, ...mixinEntry, }); this.journal.credit(paymentJournalEntry); - expense.categories.forEach((category: IExpenseCategory) => { + expense.categories.forEach((category: IExpenseCategory, index) => { const expenseJournalEntry = new JournalEntry({ account: category.expenseAccountId, debit: category.amount, note: category.description, ...mixinEntry, + index: index + 2, }); this.journal.debit(expenseJournalEntry); }); diff --git a/server/src/services/Expenses/ExpensesService.ts b/server/src/services/Expenses/ExpensesService.ts index 6cf0fc9cf..f4ef12ab5 100644 --- a/server/src/services/Expenses/ExpensesService.ts +++ b/server/src/services/Expenses/ExpensesService.ts @@ -143,16 +143,15 @@ export default class ExpensesService implements IExpensesService { } } - private async revertJournalEntries( + public async revertJournalEntries( tenantId: number, expenseId: number|number[], ) { const journal = new JournalPoster(tenantId); const journalCommands = new JournalCommands(journal); - - if (revertOld) { - await journalCommands.revertJournalEntries(expenseId, 'Expense'); - } + + await journalCommands.revertJournalEntries(expenseId, 'Expense'); + return Promise.all([ journal.saveBalance(), journal.deleteEntries(), diff --git a/server/src/services/Sales/JournalPosterService.ts b/server/src/services/Sales/JournalPosterService.ts index 000bb17a4..d0e4d95b8 100644 --- a/server/src/services/Sales/JournalPosterService.ts +++ b/server/src/services/Sales/JournalPosterService.ts @@ -14,7 +14,7 @@ export default class JournalPosterService { * @param {string} referenceType - The transaction reference type. * @return {Promise} */ - async deleteJournalTransactions( + async revertJournalTransactions( tenantId: number, referenceId: number, referenceType: string diff --git a/server/src/subscribers/expenses.ts b/server/src/subscribers/expenses.ts index cd54f291d..3425509bf 100644 --- a/server/src/subscribers/expenses.ts +++ b/server/src/subscribers/expenses.ts @@ -3,61 +3,84 @@ import { EventSubscriber, On } from 'event-dispatch'; import events from 'subscribers/events'; import ExpensesService from 'services/Expenses/ExpensesService'; import TenancyService from 'services/Tenancy/TenancyService'; -import { - EventDispatcher, - EventDispatcherInterface, -} from 'decorators/eventDispatcher'; +import ExpenseRepository from 'repositories/ExpenseRepository'; -@Service() +@EventSubscriber() export default class ExpensesSubscriber { - - constructor( - @Inject() - tenancy: TenancyService, + tenancy: TenancyService; + expensesService: ExpensesService; - @EventDispatcher() - eventDispatcher: EventDispatcherInterface, - ) { - console.log(this, 'XXXX'); - // this.eventDispatcher.on(events.expenses.onCreated, this.onExpenseCreated); + constructor() { + this.tenancy = Container.get(TenancyService); + this.expensesService = Container.get(ExpensesService); } - public onExpenseCreated({ expenseId, tenantId }) { - console.log(this) + /** + * On expense created. + */ + @On(events.expenses.onCreated) + public async onExpenseCreated({ expenseId, tenantId }) { + const { expenseRepository } = this.tenancy.repositories(tenantId); + const expense = await expenseRepository.getById(expenseId); - // // 7. In case expense published, write journal entries. - // if (expenseObj.publishedAt) { - // await this.writeJournalEntries(tenantId, expenseModel, false); - // } - + // In case expense published, write journal entries. + if (expense.publishedAt) { + await this.expensesService.writeJournalEntries(tenantId, expense, false); + } + } + + /** + * On expense edited. + */ + @On(events.expenses.onEdited) + public async onExpenseEdited({ expenseId, tenantId }) { + const { expenseRepository } = this.tenancy.repositories(tenantId); + const expense = await expenseRepository.getById(expenseId); + + // In case expense published, write journal entries. + if (expense.publishedAt) { + await this.expensesService.writeJournalEntries(tenantId, expense, true); + } } - // @On(events.expenses.onEdited) - public onExpenseEdited({ expenseId, tenantId }) { - // - In case expense published, write journal entries. - // if (expenseObj.publishedAt) { - // await this.writeJournalEntries(tenantId, expenseModel, true, authorizedUser); - // } + /** + * + * @param param0 + */ + @On(events.expenses.onDeleted) + public async onExpenseDeleted({ expenseId, tenantId }) { + await this.expensesService.revertJournalEntries(tenantId, expenseId); } - // @On(events.expenses.onDeleted) - public onExpenseDeleted({ expenseId, tenantId }) { - // if (expense.published) { - // await this.revertJournalEntries(tenantId, expenseId); - // } + /** + * + * @param param0 + */ + @On(events.expenses.onPublished) + public async onExpensePublished({ expenseId, tenantId }) { + const { expenseRepository } = this.tenancy.repositories(tenantId); + const expense = await expenseRepository.getById(expenseId); + + // In case expense published, write journal entries. + if (expense.publishedAt) { + await this.expensesService.writeJournalEntries(tenantId, expense, false); + } } - // @On(events.expenses.onPublished) - public onExpensePublished({ expenseId, tenantId }) { - - } - - // @On(events.expenses.onBulkDeleted) + /** + * + * @param param0 + */ + @On(events.expenses.onBulkDeleted) public onExpenseBulkDeleted({ expensesIds, tenantId }) { } - // @On(events.expenses.onBulkPublished) + /** + * + * @param param0 + */ + @On(events.expenses.onBulkPublished) public onExpenseBulkPublished({ expensesIds, tenantId }) { }