From 5b2be2ac19817cbdf3aa0e737175c650e9807ea9 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Wed, 16 Aug 2023 23:05:39 +0200 Subject: [PATCH 1/2] fix(server): shouldn't write GL entries when save transaction as draft. --- packages/server/src/interfaces/Bill.ts | 23 +++++++++++++++---- .../server/src/interfaces/PaymentReceive.ts | 3 +-- packages/server/src/interfaces/SaleInvoice.ts | 1 + .../Bills/BillGLEntriesSubscriber.ts | 10 ++++++++ .../src/services/Purchases/Bills/EditBill.ts | 2 +- .../src/services/Purchases/Bills/OpenBill.ts | 22 +++++++++++++++++- .../Sales/Invoices/DeliverSaleInvoice.ts | 7 ++++-- .../Sales/Receipts/CloseSaleReceipt.ts | 10 ++++---- .../Bills/WriteInventoryTransactions.ts | 8 +++++++ .../subscribers/Bills/WriteJournalEntries.ts | 8 +++++++ .../PaymentReceive/WriteGLEntries.ts | 2 ++ .../WriteInventoryTransactions.ts | 10 +++++++- .../SaleInvoices/WriteJournalEntries.ts | 13 ++++++++++- .../SaleReceipt/WriteInventoryTransactions.ts | 6 +++++ .../SaleReceipt/WriteJournalEntries.ts | 12 ++++++++++ packages/server/src/subscribers/events.ts | 3 +++ 16 files changed, 122 insertions(+), 18 deletions(-) diff --git a/packages/server/src/interfaces/Bill.ts b/packages/server/src/interfaces/Bill.ts index fcf89dbda..fa94c3e41 100644 --- a/packages/server/src/interfaces/Bill.ts +++ b/packages/server/src/interfaces/Bill.ts @@ -1,7 +1,7 @@ import { Knex } from 'knex'; import { IDynamicListFilterDTO } from './DynamicFilter'; import { IItemEntry, IItemEntryDTO } from './ItemEntry'; -import { IBillLandedCost } from './LandedCost'; +import { IBillLandedCost } from './LandedCost'; export interface IBillDTO { vendorId: number; billNumber: string; @@ -99,17 +99,17 @@ export interface IBillCreatedPayload { trx: Knex.Transaction; } -export interface IBillCreatingPayload{ +export interface IBillCreatingPayload { tenantId: number; billDTO: IBillDTO; - trx: Knex.Transaction; + trx: Knex.Transaction; } export interface IBillEditingPayload { tenantId: number; oldBill: IBill; billDTO: IBillEditDTO; - trx: Knex.Transaction; + trx: Knex.Transaction; } export interface IBillEditedPayload { tenantId: number; @@ -129,7 +129,7 @@ export interface IBIllEventDeletedPayload { export interface IBillEventDeletingPayload { tenantId: number; oldBill: IBill; - trx: Knex.Transaction; + trx: Knex.Transaction; } export enum BillAction { Create = 'Create', @@ -138,3 +138,16 @@ export enum BillAction { View = 'View', NotifyBySms = 'NotifyBySms', } + +export interface IBillOpeningPayload { + trx: Knex.Transaction; + tenantId: number; + oldBill: IBill; +} + +export interface IBillOpenedPayload { + trx: Knex.Transaction; + bill: IBill; + oldBill: IBill; + tenantId: number; +} diff --git a/packages/server/src/interfaces/PaymentReceive.ts b/packages/server/src/interfaces/PaymentReceive.ts index 658113fb3..6f8d8552a 100644 --- a/packages/server/src/interfaces/PaymentReceive.ts +++ b/packages/server/src/interfaces/PaymentReceive.ts @@ -1,6 +1,5 @@ -import { ISystemUser } from '@/interfaces'; import { Knex } from 'knex'; -import { pick } from 'lodash'; +import { ISystemUser } from '@/interfaces'; import { ILedgerEntry } from './Ledger'; import { ISaleInvoice } from './SaleInvoice'; diff --git a/packages/server/src/interfaces/SaleInvoice.ts b/packages/server/src/interfaces/SaleInvoice.ts index 5dc91b062..4351f90f4 100644 --- a/packages/server/src/interfaces/SaleInvoice.ts +++ b/packages/server/src/interfaces/SaleInvoice.ts @@ -156,6 +156,7 @@ export interface ISaleInvoiceEventDeliveredPayload { tenantId: number; saleInvoiceId: number; saleInvoice: ISaleInvoice; + trx: Knex.Transaction; } export interface ISaleInvoiceDeliveringPayload { diff --git a/packages/server/src/services/Purchases/Bills/BillGLEntriesSubscriber.ts b/packages/server/src/services/Purchases/Bills/BillGLEntriesSubscriber.ts index c38e65cb7..ea7ed5ab4 100644 --- a/packages/server/src/services/Purchases/Bills/BillGLEntriesSubscriber.ts +++ b/packages/server/src/services/Purchases/Bills/BillGLEntriesSubscriber.ts @@ -20,6 +20,10 @@ export class BillGLEntriesSubscriber { events.bill.onCreated, this.handlerWriteJournalEntriesOnCreate ); + bus.subscribe( + events.bill.onOpened, + this.handlerWriteJournalEntriesOnCreate + ); bus.subscribe( events.bill.onEdited, this.handleOverwriteJournalEntriesOnEdit @@ -34,8 +38,11 @@ export class BillGLEntriesSubscriber { private handlerWriteJournalEntriesOnCreate = async ({ tenantId, billId, + bill, trx, }: IBillCreatedPayload) => { + if (!bill.openedAt) return null; + await this.billGLEntries.writeBillGLEntries(tenantId, billId, trx); }; @@ -46,8 +53,11 @@ export class BillGLEntriesSubscriber { private handleOverwriteJournalEntriesOnEdit = async ({ tenantId, billId, + bill, trx, }: IBillEditedPayload) => { + if (!bill.openedAt) return null; + await this.billGLEntries.rewriteBillGLEntries(tenantId, billId, trx); }; diff --git a/packages/server/src/services/Purchases/Bills/EditBill.ts b/packages/server/src/services/Purchases/Bills/EditBill.ts index a7259c730..26121c120 100644 --- a/packages/server/src/services/Purchases/Bills/EditBill.ts +++ b/packages/server/src/services/Purchases/Bills/EditBill.ts @@ -132,7 +132,7 @@ export class EditBill { } as IBillEditingPayload); // Update the bill transaction. - const bill = await Bill.query(trx).upsertGraph({ + const bill = await Bill.query(trx).upsertGraphAndFetch({ id: billId, ...billObj, }); diff --git a/packages/server/src/services/Purchases/Bills/OpenBill.ts b/packages/server/src/services/Purchases/Bills/OpenBill.ts index a2c2039b3..bcd1e397e 100644 --- a/packages/server/src/services/Purchases/Bills/OpenBill.ts +++ b/packages/server/src/services/Purchases/Bills/OpenBill.ts @@ -5,6 +5,9 @@ import { ERRORS } from './constants'; import HasTenancyService from '@/services/Tenancy/TenancyService'; import UnitOfWork from '@/services/UnitOfWork'; import { BillsValidators } from './BillsValidators'; +import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; +import events from '@/subscribers/events'; +import { IBillOpenedPayload, IBillOpeningPayload } from '@/interfaces'; @Service() export class OpenBill { @@ -17,6 +20,9 @@ export class OpenBill { @Inject() private validators: BillsValidators; + @Inject() + private eventPublisher: EventPublisher; + /** * Mark the bill as open. * @param {number} tenantId @@ -37,10 +43,24 @@ export class OpenBill { throw new ServiceError(ERRORS.BILL_ALREADY_OPEN); } return this.uow.withTransaction(tenantId, async (trx) => { + // Triggers `onBillCreating` event. + await this.eventPublisher.emitAsync(events.bill.onOpening, { + trx, + tenantId, + oldBill, + } as IBillOpeningPayload); + // Record the bill opened at on the storage. - await Bill.query(trx).findById(billId).patch({ + const bill = await Bill.query(trx).patchAndFetchById(billId, { openedAt: moment().toMySqlDateTime(), }); + // Triggers `onBillCreating` event. + await this.eventPublisher.emitAsync(events.bill.onOpened, { + trx, + bill, + oldBill, + tenantId, + } as IBillOpenedPayload); }); } } diff --git a/packages/server/src/services/Sales/Invoices/DeliverSaleInvoice.ts b/packages/server/src/services/Sales/Invoices/DeliverSaleInvoice.ts index 77511af84..30ba635a6 100644 --- a/packages/server/src/services/Sales/Invoices/DeliverSaleInvoice.ts +++ b/packages/server/src/services/Sales/Invoices/DeliverSaleInvoice.ts @@ -63,14 +63,17 @@ export class DeliverSaleInvoice { // Record the delivered at on the storage. const saleInvoice = await SaleInvoice.query(trx) - .where({ id: saleInvoiceId }) - .update({ deliveredAt: moment().toMySqlDateTime() }); + .patchAndFetchById(saleInvoiceId, { + deliveredAt: moment().toMySqlDateTime(), + }) + .withGraphFetched('entries'); // Triggers `onSaleInvoiceDelivered` event. await this.eventPublisher.emitAsync(events.saleInvoice.onDelivered, { tenantId, saleInvoiceId, saleInvoice, + trx, } as ISaleInvoiceEventDeliveredPayload); }); } diff --git a/packages/server/src/services/Sales/Receipts/CloseSaleReceipt.ts b/packages/server/src/services/Sales/Receipts/CloseSaleReceipt.ts index 0566d4733..b678884e3 100644 --- a/packages/server/src/services/Sales/Receipts/CloseSaleReceipt.ts +++ b/packages/server/src/services/Sales/Receipts/CloseSaleReceipt.ts @@ -58,12 +58,12 @@ export class CloseSaleReceipt { } as ISaleReceiptEventClosingPayload); // Mark the sale receipt as closed on the storage. - const saleReceipt = await SaleReceipt.query(trx) - .findById(saleReceiptId) - .patch({ + const saleReceipt = await SaleReceipt.query(trx).patchAndFetchById( + saleReceiptId, + { closedAt: moment().toMySqlDateTime(), - }); - + } + ); // Triggers `onSaleReceiptClosed` event. await this.eventPublisher.emitAsync(events.saleReceipt.onClosed, { saleReceiptId, diff --git a/packages/server/src/subscribers/Bills/WriteInventoryTransactions.ts b/packages/server/src/subscribers/Bills/WriteInventoryTransactions.ts index ee04c98a1..04f6039d6 100644 --- a/packages/server/src/subscribers/Bills/WriteInventoryTransactions.ts +++ b/packages/server/src/subscribers/Bills/WriteInventoryTransactions.ts @@ -36,8 +36,12 @@ export default class BillWriteInventoryTransactionsSubscriber { private handleWritingInventoryTransactions = async ({ tenantId, billId, + bill, trx, }: IBillCreatedPayload) => { + // Can't continue if the bill is not opened yet. + if (!bill.openedAt) return null; + await this.billsInventory.recordInventoryTransactions( tenantId, billId, @@ -52,8 +56,12 @@ export default class BillWriteInventoryTransactionsSubscriber { private handleOverwritingInventoryTransactions = async ({ tenantId, billId, + bill, trx, }: IBillEditedPayload) => { + // Can't continue if the bill is not opened yet. + if (!bill.openedAt) return null; + await this.billsInventory.recordInventoryTransactions( tenantId, billId, diff --git a/packages/server/src/subscribers/Bills/WriteJournalEntries.ts b/packages/server/src/subscribers/Bills/WriteJournalEntries.ts index bb9589f54..23f68c6ad 100644 --- a/packages/server/src/subscribers/Bills/WriteJournalEntries.ts +++ b/packages/server/src/subscribers/Bills/WriteJournalEntries.ts @@ -38,8 +38,12 @@ export default class BillWriteGLEntriesSubscriber { private handlerWriteJournalEntriesOnCreate = async ({ tenantId, billId, + bill, trx, }: IBillCreatedPayload) => { + // Can't continue if the bill is not opened yet. + if (!bill.openedAt) return null; + await this.billsService.recordJournalTransactions( tenantId, billId, @@ -55,8 +59,12 @@ export default class BillWriteGLEntriesSubscriber { private handleOverwriteJournalEntriesOnEdit = async ({ tenantId, billId, + bill, trx, }: IBillEditedPayload) => { + // Can't continue if the bill is not opened yet. + if (!bill.openedAt) return null; + await this.billsService.recordJournalTransactions( tenantId, billId, diff --git a/packages/server/src/subscribers/PaymentReceive/WriteGLEntries.ts b/packages/server/src/subscribers/PaymentReceive/WriteGLEntries.ts index bffe4260f..d9ae3b643 100644 --- a/packages/server/src/subscribers/PaymentReceive/WriteGLEntries.ts +++ b/packages/server/src/subscribers/PaymentReceive/WriteGLEntries.ts @@ -36,8 +36,10 @@ export default class PaymentReceivesWriteGLEntriesSubscriber { private handleWriteJournalEntriesOnceCreated = async ({ tenantId, paymentReceiveId, + paymentReceive, trx, }: IPaymentReceiveCreatedPayload) => { + if (paymentReceive) await this.paymentReceiveGLEntries.writePaymentGLEntries( tenantId, paymentReceiveId, diff --git a/packages/server/src/subscribers/SaleInvoices/WriteInventoryTransactions.ts b/packages/server/src/subscribers/SaleInvoices/WriteInventoryTransactions.ts index b4f620b20..ec3d920a5 100644 --- a/packages/server/src/subscribers/SaleInvoices/WriteInventoryTransactions.ts +++ b/packages/server/src/subscribers/SaleInvoices/WriteInventoryTransactions.ts @@ -4,6 +4,7 @@ import { ISaleInvoiceCreatedPayload, ISaleInvoiceDeletedPayload, ISaleInvoiceEditedPayload, + ISaleInvoiceEventDeliveredPayload, } from '@/interfaces'; import { InvoiceInventoryTransactions } from '@/services/Sales/Invoices/InvoiceInventoryTransactions'; @@ -20,6 +21,10 @@ export default class WriteInventoryTransactions { events.saleInvoice.onCreated, this.handleWritingInventoryTransactions ); + bus.subscribe( + events.saleInvoice.onDelivered, + this.handleWritingInventoryTransactions + ); bus.subscribe( events.saleInvoice.onEdited, this.handleRewritingInventoryTransactions @@ -38,7 +43,10 @@ export default class WriteInventoryTransactions { tenantId, saleInvoice, trx, - }: ISaleInvoiceCreatedPayload) => { + }: ISaleInvoiceCreatedPayload | ISaleInvoiceEventDeliveredPayload) => { + // Can't continue if the sale invoice is not delivered yet. + if (!saleInvoice.deliveredAt) return null; + await this.saleInvoiceInventory.recordInventoryTranscactions( tenantId, saleInvoice, diff --git a/packages/server/src/subscribers/SaleInvoices/WriteJournalEntries.ts b/packages/server/src/subscribers/SaleInvoices/WriteJournalEntries.ts index fc5d9411b..15ba5562b 100644 --- a/packages/server/src/subscribers/SaleInvoices/WriteJournalEntries.ts +++ b/packages/server/src/subscribers/SaleInvoices/WriteJournalEntries.ts @@ -15,11 +15,15 @@ export default class SaleInvoiceWriteGLEntriesSubscriber { /** * Constructor method. */ - attach(bus) { + public attach(bus) { bus.subscribe( events.saleInvoice.onCreated, this.handleWriteJournalEntriesOnInvoiceCreated ); + bus.subscribe( + events.saleInvoice.onDelivered, + this.handleWriteJournalEntriesOnInvoiceCreated + ); bus.subscribe( events.saleInvoice.onEdited, this.handleRewriteJournalEntriesOnceInvoiceEdit @@ -36,8 +40,12 @@ export default class SaleInvoiceWriteGLEntriesSubscriber { private handleWriteJournalEntriesOnInvoiceCreated = async ({ tenantId, saleInvoiceId, + saleInvoice, trx, }: ISaleInvoiceCreatedPayload) => { + // Can't continue if the sale invoice is not delivered yet. + if (!saleInvoice.deliveredAt) return null; + await this.saleInvoiceGLEntries.writeInvoiceGLEntries( tenantId, saleInvoiceId, @@ -53,6 +61,9 @@ export default class SaleInvoiceWriteGLEntriesSubscriber { saleInvoice, trx, }: ISaleInvoiceEditedPayload) => { + // Can't continue if the sale invoice is not delivered yet. + if (!saleInvoice.deliveredAt) return null; + await this.saleInvoiceGLEntries.rewritesInvoiceGLEntries( tenantId, saleInvoice.id, diff --git a/packages/server/src/subscribers/SaleReceipt/WriteInventoryTransactions.ts b/packages/server/src/subscribers/SaleReceipt/WriteInventoryTransactions.ts index 57da23747..bf4fd007a 100644 --- a/packages/server/src/subscribers/SaleReceipt/WriteInventoryTransactions.ts +++ b/packages/server/src/subscribers/SaleReceipt/WriteInventoryTransactions.ts @@ -40,6 +40,9 @@ export default class SaleReceiptInventoryTransactionsSubscriber { saleReceipt, trx, }: ISaleReceiptCreatedPayload) => { + // Can't continue if the sale receipt is not closed yet. + if (!saleReceipt.closedAt) return null; + await this.saleReceiptInventory.recordInventoryTransactions( tenantId, saleReceipt, @@ -57,6 +60,9 @@ export default class SaleReceiptInventoryTransactionsSubscriber { saleReceipt, trx, }: ISaleReceiptEditedPayload) => { + // Can't continue if the sale receipt is not closed yet. + if (!saleReceipt.closedAt) return null; + await this.saleReceiptInventory.recordInventoryTransactions( tenantId, saleReceipt, diff --git a/packages/server/src/subscribers/SaleReceipt/WriteJournalEntries.ts b/packages/server/src/subscribers/SaleReceipt/WriteJournalEntries.ts index 8a14bfcad..32c9c363b 100644 --- a/packages/server/src/subscribers/SaleReceipt/WriteJournalEntries.ts +++ b/packages/server/src/subscribers/SaleReceipt/WriteJournalEntries.ts @@ -21,6 +21,10 @@ export default class SaleReceiptWriteGLEntriesSubscriber { events.saleReceipt.onCreated, this.handleWriteReceiptIncomeJournalEntrieOnCreate ); + bus.subscribe( + events.saleReceipt.onClosed, + this.handleWriteReceiptIncomeJournalEntrieOnCreate + ); bus.subscribe( events.saleReceipt.onEdited, this.handleWriteReceiptIncomeJournalEntrieOnEdited @@ -38,8 +42,12 @@ export default class SaleReceiptWriteGLEntriesSubscriber { public handleWriteReceiptIncomeJournalEntrieOnCreate = async ({ tenantId, saleReceiptId, + saleReceipt, trx, }: ISaleReceiptCreatedPayload) => { + // Can't continue if the sale receipt is not closed yet. + if (!saleReceipt.closedAt) return null; + // Writes the sale receipt income journal entries. await this.saleReceiptGLEntries.writeIncomeGLEntries( tenantId, @@ -71,8 +79,12 @@ export default class SaleReceiptWriteGLEntriesSubscriber { private handleWriteReceiptIncomeJournalEntrieOnEdited = async ({ tenantId, saleReceiptId, + saleReceipt, trx, }: ISaleReceiptEditedPayload) => { + // Can't continue if the sale receipt is not closed yet. + if (!saleReceipt.closedAt) return null; + // Writes the sale receipt income journal entries. await this.saleReceiptGLEntries.rewriteReceiptGLEntries( tenantId, diff --git a/packages/server/src/subscribers/events.ts b/packages/server/src/subscribers/events.ts index 19416b65d..f43366107 100644 --- a/packages/server/src/subscribers/events.ts +++ b/packages/server/src/subscribers/events.ts @@ -220,6 +220,9 @@ export default { onPublishing: 'onBillPublishing', onPublished: 'onBillPublished', + + onOpening: 'onBillOpening', + onOpened: 'onBillOpened', }, /** From 0fcee0eaa7c9da556147df62ef7cfe3256ad55ca Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Thu, 17 Aug 2023 21:49:07 +0200 Subject: [PATCH 2/2] fix(server): wirte GL entries only when publish transaction --- .../services/CreditNotes/CreateCreditNote.ts | 8 ++++---- .../CreditNoteApplySyncInvoicesSubscriber.ts | 8 ++------ ...editNoteInventoryTransactionsSubscriber.ts | 19 +++++++++---------- .../Expenses/ExpenseGLEntriesSubscriber.ts | 2 +- .../ManualJournalGLEntriesSubscriber.ts | 18 +++++++++++------- .../Bills/BillGLEntriesSubscriber.ts | 6 +++--- .../src/services/Purchases/Bills/OpenBill.ts | 11 +++++++---- ...orCreditInventoryTransactionsSusbcriber.ts | 12 +++++++++++- .../Bills/WriteInventoryTransactions.ts | 13 ++++++++++--- .../subscribers/Bills/WriteJournalEntries.ts | 2 +- .../PaymentReceiveSyncInvoices.ts | 1 - .../PaymentReceive/WriteGLEntries.ts | 2 -- .../SaleInvoices/WriteJournalEntries.ts | 6 ++++++ 13 files changed, 65 insertions(+), 43 deletions(-) diff --git a/packages/server/src/services/CreditNotes/CreateCreditNote.ts b/packages/server/src/services/CreditNotes/CreateCreditNote.ts index 2c4c0d58f..641d1034e 100644 --- a/packages/server/src/services/CreditNotes/CreateCreditNote.ts +++ b/packages/server/src/services/CreditNotes/CreateCreditNote.ts @@ -16,16 +16,16 @@ import BaseCreditNotes from './CreditNotes'; @Service() export default class CreateCreditNote extends BaseCreditNotes { @Inject() - uow: UnitOfWork; + private uow: UnitOfWork; @Inject() - itemsEntriesService: ItemsEntriesService; + private itemsEntriesService: ItemsEntriesService; @Inject() - tenancy: HasTenancyService; + private tenancy: HasTenancyService; @Inject() - eventPublisher: EventPublisher; + private eventPublisher: EventPublisher; /** * Creates a new credit note. diff --git a/packages/server/src/services/CreditNotes/CreditNoteApplySyncInvoicesSubscriber.ts b/packages/server/src/services/CreditNotes/CreditNoteApplySyncInvoicesSubscriber.ts index 3a4e7f59b..f22a6c03e 100644 --- a/packages/server/src/services/CreditNotes/CreditNoteApplySyncInvoicesSubscriber.ts +++ b/packages/server/src/services/CreditNotes/CreditNoteApplySyncInvoicesSubscriber.ts @@ -1,5 +1,4 @@ import { Service, Inject } from 'typedi'; -import HasTenancyService from '@/services/Tenancy/TenancyService'; import events from '@/subscribers/events'; import { IApplyCreditToInvoicesCreatedPayload, @@ -10,15 +9,12 @@ import CreditNoteApplySyncInvoicesCreditedAmount from './CreditNoteApplySyncInvo @Service() export default class CreditNoteApplySyncInvoicesCreditedAmountSubscriber { @Inject() - tenancy: HasTenancyService; - - @Inject() - syncInvoicesWithCreditNote: CreditNoteApplySyncInvoicesCreditedAmount; + private syncInvoicesWithCreditNote: CreditNoteApplySyncInvoicesCreditedAmount; /** * Attaches events with handlers. */ - attach(bus) { + public attach(bus) { bus.subscribe( events.creditNote.onApplyToInvoicesCreated, this.incrementAppliedInvoicesOnceCreditCreated diff --git a/packages/server/src/services/CreditNotes/CreditNoteInventoryTransactionsSubscriber.ts b/packages/server/src/services/CreditNotes/CreditNoteInventoryTransactionsSubscriber.ts index 7b23d079d..54b702bea 100644 --- a/packages/server/src/services/CreditNotes/CreditNoteInventoryTransactionsSubscriber.ts +++ b/packages/server/src/services/CreditNotes/CreditNoteInventoryTransactionsSubscriber.ts @@ -15,7 +15,7 @@ export default class CreditNoteInventoryTransactionsSubscriber { /** * Attaches events with publisher. */ - attach(bus) { + public attach(bus) { bus.subscribe( events.creditNote.onCreated, this.writeInventoryTranscationsOnceCreated @@ -37,6 +37,7 @@ export default class CreditNoteInventoryTransactionsSubscriber { /** * Writes inventory transactions once credit note created. * @param {ICreditNoteCreatedPayload} payload - + * @returns {Promise} */ public writeInventoryTranscationsOnceCreated = async ({ tenantId, @@ -44,9 +45,8 @@ export default class CreditNoteInventoryTransactionsSubscriber { trx, }: ICreditNoteCreatedPayload) => { // Can't continue if the credit note is open yet. - if (!creditNote.isOpen) { - return; - } + if (!creditNote.isOpen) return; + await this.inventoryTransactions.createInventoryTransactions( tenantId, creditNote, @@ -57,6 +57,7 @@ export default class CreditNoteInventoryTransactionsSubscriber { /** * Rewrites inventory transactions once credit note edited. * @param {ICreditNoteEditedPayload} payload - + * @returns {Promise} */ public rewriteInventoryTransactionsOnceEdited = async ({ tenantId, @@ -65,9 +66,8 @@ export default class CreditNoteInventoryTransactionsSubscriber { trx, }: ICreditNoteEditedPayload) => { // Can't continue if the credit note is open yet. - if (!creditNote.isOpen) { - return; - } + if (!creditNote.isOpen) return; + await this.inventoryTransactions.editInventoryTransactions( tenantId, creditNoteId, @@ -87,9 +87,8 @@ export default class CreditNoteInventoryTransactionsSubscriber { trx, }: ICreditNoteDeletedPayload) => { // Can't continue if the credit note is open yet. - if (!oldCreditNote.isOpen) { - return; - } + if (!oldCreditNote.isOpen) return; + await this.inventoryTransactions.deleteInventoryTransactions( tenantId, creditNoteId, diff --git a/packages/server/src/services/Expenses/ExpenseGLEntriesSubscriber.ts b/packages/server/src/services/Expenses/ExpenseGLEntriesSubscriber.ts index 56d37a7db..1a177876e 100644 --- a/packages/server/src/services/Expenses/ExpenseGLEntriesSubscriber.ts +++ b/packages/server/src/services/Expenses/ExpenseGLEntriesSubscriber.ts @@ -21,7 +21,7 @@ export class ExpensesWriteGLSubscriber { * Attaches events with handlers. * @param bus */ - attach(bus) { + public attach(bus) { bus.subscribe( events.expenses.onCreated, this.handleWriteGLEntriesOnceCreated diff --git a/packages/server/src/services/ManualJournals/ManualJournalGLEntriesSubscriber.ts b/packages/server/src/services/ManualJournals/ManualJournalGLEntriesSubscriber.ts index c5efa8f12..21f921d22 100644 --- a/packages/server/src/services/ManualJournals/ManualJournalGLEntriesSubscriber.ts +++ b/packages/server/src/services/ManualJournals/ManualJournalGLEntriesSubscriber.ts @@ -48,6 +48,7 @@ export class ManualJournalWriteGLSubscriber { /** * Handle manual journal created event. * @param {IManualJournalEventCreatedPayload} payload - + * @returns {Promise} */ private handleWriteJournalEntriesOnCreated = async ({ tenantId, @@ -55,18 +56,19 @@ export class ManualJournalWriteGLSubscriber { trx, }: IManualJournalEventCreatedPayload) => { // Ingore writing manual journal journal entries in case was not published. - if (manualJournal.publishedAt) { - await this.manualJournalGLEntries.createManualJournalGLEntries( - tenantId, - manualJournal.id, - trx - ); - } + if (!manualJournal.publishedAt) return; + + await this.manualJournalGLEntries.createManualJournalGLEntries( + tenantId, + manualJournal.id, + trx + ); }; /** * Handles the manual journal next number increment once the journal be created. * @param {IManualJournalEventCreatedPayload} payload - + * @return {Promise} */ private handleJournalNumberIncrement = async ({ tenantId, @@ -77,6 +79,7 @@ export class ManualJournalWriteGLSubscriber { /** * Handle manual journal edited event. * @param {IManualJournalEventEditedPayload} + * @return {Promise} */ private handleRewriteJournalEntriesOnEdited = async ({ tenantId, @@ -96,6 +99,7 @@ export class ManualJournalWriteGLSubscriber { /** * Handles writing journal entries once the manula journal publish. * @param {IManualJournalEventPublishedPayload} payload - + * @return {Promise} */ private handleWriteJournalEntriesOnPublished = async ({ tenantId, diff --git a/packages/server/src/services/Purchases/Bills/BillGLEntriesSubscriber.ts b/packages/server/src/services/Purchases/Bills/BillGLEntriesSubscriber.ts index ea7ed5ab4..9b31cf463 100644 --- a/packages/server/src/services/Purchases/Bills/BillGLEntriesSubscriber.ts +++ b/packages/server/src/services/Purchases/Bills/BillGLEntriesSubscriber.ts @@ -4,6 +4,7 @@ import { IBillCreatedPayload, IBillEditedPayload, IBIllEventDeletedPayload, + IBillOpenedPayload, } from '@/interfaces'; import { BillGLEntries } from './BillGLEntries'; @@ -37,13 +38,12 @@ export class BillGLEntriesSubscriber { */ private handlerWriteJournalEntriesOnCreate = async ({ tenantId, - billId, bill, trx, - }: IBillCreatedPayload) => { + }: IBillCreatedPayload | IBillOpenedPayload) => { if (!bill.openedAt) return null; - await this.billGLEntries.writeBillGLEntries(tenantId, billId, trx); + await this.billGLEntries.writeBillGLEntries(tenantId, bill.id, trx); }; /** diff --git a/packages/server/src/services/Purchases/Bills/OpenBill.ts b/packages/server/src/services/Purchases/Bills/OpenBill.ts index bcd1e397e..25a0da22e 100644 --- a/packages/server/src/services/Purchases/Bills/OpenBill.ts +++ b/packages/server/src/services/Purchases/Bills/OpenBill.ts @@ -50,10 +50,13 @@ export class OpenBill { oldBill, } as IBillOpeningPayload); - // Record the bill opened at on the storage. - const bill = await Bill.query(trx).patchAndFetchById(billId, { - openedAt: moment().toMySqlDateTime(), - }); + // Save the bill opened at on the storage. + const bill = await Bill.query(trx) + .patchAndFetchById(billId, { + openedAt: moment().toMySqlDateTime(), + }) + .withGraphFetched('entries'); + // Triggers `onBillCreating` event. await this.eventPublisher.emitAsync(events.bill.onOpened, { trx, diff --git a/packages/server/src/services/Purchases/VendorCredits/VendorCreditInventoryTransactionsSusbcriber.ts b/packages/server/src/services/Purchases/VendorCredits/VendorCreditInventoryTransactionsSusbcriber.ts index c9b24a4f7..bae3adc23 100644 --- a/packages/server/src/services/Purchases/VendorCredits/VendorCreditInventoryTransactionsSusbcriber.ts +++ b/packages/server/src/services/Purchases/VendorCredits/VendorCreditInventoryTransactionsSusbcriber.ts @@ -10,7 +10,7 @@ import VendorCreditInventoryTransactions from './VendorCreditInventoryTransactio @Service() export default class VendorCreditInventoryTransactionsSubscriber { @Inject() - inventoryTransactions: VendorCreditInventoryTransactions; + private inventoryTransactions: VendorCreditInventoryTransactions; /** * Attaches events with handlers. @@ -21,6 +21,10 @@ export default class VendorCreditInventoryTransactionsSubscriber { events.vendorCredit.onCreated, this.writeInventoryTransactionsOnceCreated ); + bus.subscribe( + events.vendorCredit.onOpened, + this.writeInventoryTransactionsOnceCreated + ); bus.subscribe( events.vendorCredit.onEdited, this.rewriteInventroyTransactionsOnceEdited @@ -40,6 +44,9 @@ export default class VendorCreditInventoryTransactionsSubscriber { vendorCredit, trx, }: IVendorCreditCreatedPayload) => { + // Can't continue if vendor credit is not opened. + if (!vendorCredit.openedAt) return null; + await this.inventoryTransactions.createInventoryTransactions( tenantId, vendorCredit, @@ -57,6 +64,9 @@ export default class VendorCreditInventoryTransactionsSubscriber { vendorCredit, trx, }: IVendorCreditEditedPayload) => { + // Can't continue if vendor credit is not opened. + if (!vendorCredit.openedAt) return null; + await this.inventoryTransactions.editInventoryTransactions( tenantId, vendorCreditId, diff --git a/packages/server/src/subscribers/Bills/WriteInventoryTransactions.ts b/packages/server/src/subscribers/Bills/WriteInventoryTransactions.ts index 04f6039d6..6af4e8551 100644 --- a/packages/server/src/subscribers/Bills/WriteInventoryTransactions.ts +++ b/packages/server/src/subscribers/Bills/WriteInventoryTransactions.ts @@ -4,6 +4,7 @@ import { IBillCreatedPayload, IBillEditedPayload, IBIllEventDeletedPayload, + IBillOpenedPayload, } from '@/interfaces'; import { BillInventoryTransactions } from '@/services/Purchases/Bills/BillInventoryTransactions'; @@ -20,6 +21,10 @@ export default class BillWriteInventoryTransactionsSubscriber { events.bill.onCreated, this.handleWritingInventoryTransactions ); + bus.subscribe( + events.bill.onOpened, + this.handleWritingInventoryTransactions + ); bus.subscribe( events.bill.onEdited, this.handleOverwritingInventoryTransactions @@ -32,19 +37,19 @@ export default class BillWriteInventoryTransactionsSubscriber { /** * Handles writing the inventory transactions once bill created. + * @param {IBillCreatedPayload | IBillOpenedPayload} payload - */ private handleWritingInventoryTransactions = async ({ tenantId, - billId, bill, trx, - }: IBillCreatedPayload) => { + }: IBillCreatedPayload | IBillOpenedPayload) => { // Can't continue if the bill is not opened yet. if (!bill.openedAt) return null; await this.billsInventory.recordInventoryTransactions( tenantId, - billId, + bill.id, false, trx ); @@ -52,6 +57,7 @@ export default class BillWriteInventoryTransactionsSubscriber { /** * Handles the overwriting the inventory transactions once bill edited. + * @param {IBillEditedPayload} payload - */ private handleOverwritingInventoryTransactions = async ({ tenantId, @@ -72,6 +78,7 @@ export default class BillWriteInventoryTransactionsSubscriber { /** * Handles the reverting the inventory transactions once the bill deleted. + * @param {IBIllEventDeletedPayload} payload - */ private handleRevertInventoryTransactions = async ({ tenantId, diff --git a/packages/server/src/subscribers/Bills/WriteJournalEntries.ts b/packages/server/src/subscribers/Bills/WriteJournalEntries.ts index 23f68c6ad..f30694753 100644 --- a/packages/server/src/subscribers/Bills/WriteJournalEntries.ts +++ b/packages/server/src/subscribers/Bills/WriteJournalEntries.ts @@ -19,7 +19,7 @@ export default class BillWriteGLEntriesSubscriber { /** * Attachs events with handles. */ - attach(bus) { + public attach(bus) { bus.subscribe( events.bill.onCreated, this.handlerWriteJournalEntriesOnCreate diff --git a/packages/server/src/subscribers/PaymentReceive/PaymentReceiveSyncInvoices.ts b/packages/server/src/subscribers/PaymentReceive/PaymentReceiveSyncInvoices.ts index 26ac16e14..d257de18c 100644 --- a/packages/server/src/subscribers/PaymentReceive/PaymentReceiveSyncInvoices.ts +++ b/packages/server/src/subscribers/PaymentReceive/PaymentReceiveSyncInvoices.ts @@ -37,7 +37,6 @@ export default class PaymentReceiveSyncInvoicesSubscriber { */ private handleInvoiceIncrementPaymentOnceCreated = async ({ tenantId, - paymentReceiveId, paymentReceive, trx, }: IPaymentReceiveCreatedPayload) => { diff --git a/packages/server/src/subscribers/PaymentReceive/WriteGLEntries.ts b/packages/server/src/subscribers/PaymentReceive/WriteGLEntries.ts index d9ae3b643..bffe4260f 100644 --- a/packages/server/src/subscribers/PaymentReceive/WriteGLEntries.ts +++ b/packages/server/src/subscribers/PaymentReceive/WriteGLEntries.ts @@ -36,10 +36,8 @@ export default class PaymentReceivesWriteGLEntriesSubscriber { private handleWriteJournalEntriesOnceCreated = async ({ tenantId, paymentReceiveId, - paymentReceive, trx, }: IPaymentReceiveCreatedPayload) => { - if (paymentReceive) await this.paymentReceiveGLEntries.writePaymentGLEntries( tenantId, paymentReceiveId, diff --git a/packages/server/src/subscribers/SaleInvoices/WriteJournalEntries.ts b/packages/server/src/subscribers/SaleInvoices/WriteJournalEntries.ts index 15ba5562b..4b1eab698 100644 --- a/packages/server/src/subscribers/SaleInvoices/WriteJournalEntries.ts +++ b/packages/server/src/subscribers/SaleInvoices/WriteJournalEntries.ts @@ -36,6 +36,8 @@ export default class SaleInvoiceWriteGLEntriesSubscriber { /** * Records journal entries of the non-inventory invoice. + * @param {ISaleInvoiceCreatedPayload} payload - + * @returns {Promise} */ private handleWriteJournalEntriesOnInvoiceCreated = async ({ tenantId, @@ -55,6 +57,8 @@ export default class SaleInvoiceWriteGLEntriesSubscriber { /** * Records journal entries of the non-inventory invoice. + * @param {ISaleInvoiceEditedPayload} payload - + * @returns {Promise} */ private handleRewriteJournalEntriesOnceInvoiceEdit = async ({ tenantId, @@ -73,6 +77,8 @@ export default class SaleInvoiceWriteGLEntriesSubscriber { /** * Handle reverting journal entries once sale invoice delete. + * @param {ISaleInvoiceDeletePayload} payload - + * @returns {Promise} */ private handleRevertingInvoiceJournalEntriesOnDelete = async ({ tenantId,