import { Inject, Service } from 'typedi'; import events from '@/subscribers/events'; import { IBillCreatedPayload, IBillEditedPayload, IBIllEventDeletedPayload, IBillOpenedPayload, } from '@/interfaces'; import { BillGLEntries } from './BillGLEntries'; @Service() export class BillGLEntriesSubscriber { @Inject() private billGLEntries: BillGLEntries; /** * Attaches events with handles. */ public attach(bus) { bus.subscribe( events.bill.onCreated, this.handlerWriteJournalEntriesOnCreate ); bus.subscribe( events.bill.onOpened, this.handlerWriteJournalEntriesOnCreate ); bus.subscribe( events.bill.onEdited, this.handleOverwriteJournalEntriesOnEdit ); bus.subscribe(events.bill.onDeleted, this.handlerDeleteJournalEntries); } /** * Handles writing journal entries once bill created. * @param {IBillCreatedPayload} payload - */ private handlerWriteJournalEntriesOnCreate = async ({ tenantId, bill, trx, }: IBillCreatedPayload | IBillOpenedPayload) => { if (!bill.openedAt) return null; await this.billGLEntries.writeBillGLEntries(tenantId, bill.id, trx); }; /** * Handles the overwriting journal entries once bill edited. * @param {IBillEditedPayload} payload - */ private handleOverwriteJournalEntriesOnEdit = async ({ tenantId, billId, bill, trx, }: IBillEditedPayload) => { if (!bill.openedAt) return null; await this.billGLEntries.rewriteBillGLEntries(tenantId, billId, trx); }; /** * Handles revert journal entries on bill deleted. * @param {IBIllEventDeletedPayload} payload - */ private handlerDeleteJournalEntries = async ({ tenantId, billId, trx, }: IBIllEventDeletedPayload) => { await this.billGLEntries.revertBillGLEntries(tenantId, billId, trx); }; }