From ddd17e74b5b3a2650c44795c5433b5961cc3837c Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Mon, 2 Sep 2024 15:19:01 +0200 Subject: [PATCH 1/2] feat: Cover more tracking events. --- .../server/src/constants/event-tracker.ts | 18 +++++ packages/server/src/interfaces/Contact.ts | 1 + .../Contacts/Customers/CRUD/EditCustomer.ts | 1 + .../events/BankRuleEventsTracker.ts | 68 +++++++++++++++++++ .../events/CustomerEventsTracker.ts | 68 +++++++++++++++++++ .../events/ManualJournalEventsTracker.ts | 68 +++++++++++++++++++ .../events/VendorEventsTracker.ts | 59 ++++++++++++++++ .../services/EventsTracker/events/events.ts | 10 ++- 8 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 packages/server/src/services/EventsTracker/events/BankRuleEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/CustomerEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/ManualJournalEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/VendorEventsTracker.ts diff --git a/packages/server/src/constants/event-tracker.ts b/packages/server/src/constants/event-tracker.ts index 4fcb92aed..3f9868c42 100644 --- a/packages/server/src/constants/event-tracker.ts +++ b/packages/server/src/constants/event-tracker.ts @@ -41,3 +41,21 @@ export const SALE_GROUP = 'Sale'; export const PAYMENT_GROUP = 'Payment'; export const BILL_GROUP = 'Bill'; export const EXPENSE_GROUP = 'Expense'; + +export const MANUAL_JOURNAL_CREATED = 'Manual journal created'; +export const MANUAL_JOURNAL_EDITED = 'Manual journal edited'; +export const MANUAL_JOURNAL_DELETED = 'Manual journal deleted'; +export const MANUAL_JOURNAL_PUBLISHED = 'Manual journal published'; + +export const CUSTOMER_CREATED = 'Customer created'; +export const CUSTOMER_EDITED = 'Customer edited'; +export const CUSTOMER_DELETED = 'Customer deleted'; + +export const VENDOR_CREATED = 'Vendor created'; +export const VENDOR_EDITED = 'Vendor edited'; +export const VENDOR_DELETED = 'Vendor deleted'; + +export const BANK_RULE_CREATED = 'Bank rule created'; +export const BANK_RULE_EDITED = 'Bank rule edited'; +export const BANK_RULE_DELETED = 'Bank rule deleted'; + diff --git a/packages/server/src/interfaces/Contact.ts b/packages/server/src/interfaces/Contact.ts index 17eeb7652..1b3b555ea 100644 --- a/packages/server/src/interfaces/Contact.ts +++ b/packages/server/src/interfaces/Contact.ts @@ -241,6 +241,7 @@ export interface ICustomerEventCreatingPayload { trx: Knex.Transaction; } export interface ICustomerEventEditedPayload { + tenantId: number customerId: number; customer: ICustomer; trx: Knex.Transaction; diff --git a/packages/server/src/services/Contacts/Customers/CRUD/EditCustomer.ts b/packages/server/src/services/Contacts/Customers/CRUD/EditCustomer.ts index 252a6023c..410eec884 100644 --- a/packages/server/src/services/Contacts/Customers/CRUD/EditCustomer.ts +++ b/packages/server/src/services/Contacts/Customers/CRUD/EditCustomer.ts @@ -65,6 +65,7 @@ export class EditCustomer { }); // Triggers `onCustomerEdited` event. await this.eventPublisher.emitAsync(events.customers.onEdited, { + tenantId, customerId, customer, trx, diff --git a/packages/server/src/services/EventsTracker/events/BankRuleEventsTracker.ts b/packages/server/src/services/EventsTracker/events/BankRuleEventsTracker.ts new file mode 100644 index 000000000..5b12e1d91 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/BankRuleEventsTracker.ts @@ -0,0 +1,68 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IBankRuleEventCreatedPayload, + IBankRuleEventEditedPayload, + IBankRuleEventDeletedPayload, +} from '@/services/Banking/Rules/types'; // Updated import path for interfaces +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + BANK_RULE_CREATED, + BANK_RULE_EDITED, + BANK_RULE_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class BankRuleEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.bankRules.onCreated, + this.handleTrackBankRuleCreatedEvent + ); + bus.subscribe( + events.bankRules.onEdited, + this.handleTrackEditedBankRuleEvent + ); + bus.subscribe( + events.bankRules.onDeleted, + this.handleTrackDeletedBankRuleEvent + ); + } + + private handleTrackBankRuleCreatedEvent = ({ + tenantId, + }: IBankRuleEventCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BANK_RULE_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedBankRuleEvent = ({ + tenantId, + }: IBankRuleEventEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BANK_RULE_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedBankRuleEvent = ({ + tenantId, + }: IBankRuleEventDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BANK_RULE_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/CustomerEventsTracker.ts b/packages/server/src/services/EventsTracker/events/CustomerEventsTracker.ts new file mode 100644 index 000000000..5dc902c8f --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/CustomerEventsTracker.ts @@ -0,0 +1,68 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + ICustomerEventCreatedPayload, + ICustomerEventEditedPayload, + ICustomerEventDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + CUSTOMER_CREATED, + CUSTOMER_EDITED, + CUSTOMER_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class CustomerEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.customers.onCreated, + this.handleTrackCustomerCreatedEvent + ); + bus.subscribe( + events.customers.onEdited, + this.handleTrackEditedCustomerEvent + ); + bus.subscribe( + events.customers.onDeleted, + this.handleTrackDeletedCustomerEvent + ); + } + + private handleTrackCustomerCreatedEvent = ({ + tenantId, + }: ICustomerEventCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: CUSTOMER_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedCustomerEvent = ({ + tenantId, + }: ICustomerEventEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: CUSTOMER_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedCustomerEvent = ({ + tenantId, + }: ICustomerEventDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: CUSTOMER_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/ManualJournalEventsTracker.ts b/packages/server/src/services/EventsTracker/events/ManualJournalEventsTracker.ts new file mode 100644 index 000000000..119553b88 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/ManualJournalEventsTracker.ts @@ -0,0 +1,68 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IManualJournalEventCreatedPayload, + IManualJournalEventEditedPayload, + IManualJournalEventDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + MANUAL_JOURNAL_CREATED, + MANUAL_JOURNAL_EDITED, + MANUAL_JOURNAL_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class ManualJournalEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.manualJournals.onCreated, + this.handleTrackManualJournalCreatedEvent + ); + bus.subscribe( + events.manualJournals.onEdited, + this.handleTrackEditedManualJournalEvent + ); + bus.subscribe( + events.manualJournals.onDeleted, + this.handleTrackDeletedManualJournalEvent + ); + } + + private handleTrackManualJournalCreatedEvent = ({ + tenantId, + }: IManualJournalEventCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: MANUAL_JOURNAL_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedManualJournalEvent = ({ + tenantId, + }: IManualJournalEventEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: MANUAL_JOURNAL_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedManualJournalEvent = ({ + tenantId, + }: IManualJournalEventDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: MANUAL_JOURNAL_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/VendorEventsTracker.ts b/packages/server/src/services/EventsTracker/events/VendorEventsTracker.ts new file mode 100644 index 000000000..d5fb2ba2a --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/VendorEventsTracker.ts @@ -0,0 +1,59 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IVendorEventCreatedPayload, + IVendorEventEditedPayload, + IVendorEventDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + VENDOR_CREATED, + VENDOR_EDITED, + VENDOR_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class VendorEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe(events.vendors.onCreated, this.handleTrackVendorCreatedEvent); + bus.subscribe(events.vendors.onEdited, this.handleTrackEditedVendorEvent); + bus.subscribe(events.vendors.onDeleted, this.handleTrackDeletedVendorEvent); + } + + private handleTrackVendorCreatedEvent = ({ + tenantId, + }: IVendorEventCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: VENDOR_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedVendorEvent = ({ + tenantId, + }: IVendorEventEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: VENDOR_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedVendorEvent = ({ + tenantId, + }: IVendorEventDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: VENDOR_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/events.ts b/packages/server/src/services/EventsTracker/events/events.ts index 8f1b9c54f..e52542671 100644 --- a/packages/server/src/services/EventsTracker/events/events.ts +++ b/packages/server/src/services/EventsTracker/events/events.ts @@ -7,6 +7,10 @@ import { ExpenseEventsTracker } from './ExpenseEventsTracker'; import { AccountEventsTracker } from './AccountEventsTracker'; import { AuthenticationEventsTracker } from './AuthenticationEventsTracker'; import { ItemEventsTracker } from './ItemEventsTracker'; +import { CustomerEventsTracker } from './CustomerEventsTracker'; +import { VendorEventsTracker } from './VendorEventsTracker'; +import { ManualJournalEventsTracker } from './ManualJournalEventsTracker'; +import { BankRuleEventsTracker } from './BankRuleEventsTracker'; export const EventsTrackerListeners = [ SaleInvoiceEventsTracker, @@ -17,5 +21,9 @@ export const EventsTrackerListeners = [ AccountEventsTracker, ExpenseEventsTracker, AuthenticationEventsTracker, - ItemEventsTracker + ItemEventsTracker, + CustomerEventsTracker, + VendorEventsTracker, + ManualJournalEventsTracker, + BankRuleEventsTracker, ]; From d54f14a87a6b9d4e63a3177d9973e53563cf486d Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Mon, 2 Sep 2024 17:12:37 +0200 Subject: [PATCH 2/2] feat: Track banking service events --- .../server/src/constants/event-tracker.ts | 6 ++ .../events/BankTransactionEventsTracker.ts | 97 +++++++++++++++++++ .../services/EventsTracker/events/events.ts | 4 +- 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 packages/server/src/services/EventsTracker/events/BankTransactionEventsTracker.ts diff --git a/packages/server/src/constants/event-tracker.ts b/packages/server/src/constants/event-tracker.ts index 4fcb92aed..2954dc7e9 100644 --- a/packages/server/src/constants/event-tracker.ts +++ b/packages/server/src/constants/event-tracker.ts @@ -34,6 +34,12 @@ export const ITEM_EVENT_DELETED = 'Item deleted'; export const AUTH_SIGNED_UP = 'Auth Signed-up'; export const AUTH_RESET_PASSWORD = 'Auth reset password'; +export const BANK_TRANSACTION_MATCHED = 'Bank transaction matching deleted'; +export const BANK_TRANSACTION_EXCLUDED = 'Bank transaction excluded'; +export const BANK_TRANSACTION_CATEGORIZED = 'Bank transaction categorized'; +export const BANK_TRANSACTION_UNCATEGORIZED = 'Bank transaction uncategorized'; +export const BANK_ACCOUNT_DISCONNECTED = 'Bank account disconnected'; + export const ACCOUNT_GROUP = 'Account'; export const ITEM_GROUP = 'Item'; export const AUTH_GROUP = 'Auth'; diff --git a/packages/server/src/services/EventsTracker/events/BankTransactionEventsTracker.ts b/packages/server/src/services/EventsTracker/events/BankTransactionEventsTracker.ts new file mode 100644 index 000000000..f19615eb4 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/BankTransactionEventsTracker.ts @@ -0,0 +1,97 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + BANK_TRANSACTION_MATCHED, + BANK_TRANSACTION_EXCLUDED, + BANK_TRANSACTION_CATEGORIZED, + BANK_TRANSACTION_UNCATEGORIZED, + BANK_ACCOUNT_DISCONNECTED, +} from '@/constants/event-tracker'; +import { IBankTransactionMatchedEventPayload } from '@/services/Banking/Matching/types'; +import { IBankAccountDisconnectedEventPayload } from '@/services/Banking/BankAccounts/types'; +import { + ICashflowTransactionCategorizedPayload, + ICashflowTransactionUncategorizedPayload, +} from '@/interfaces'; +import { IBankTransactionExcludedEventPayload } from '@/services/Banking/Exclude/_types'; + +@Service() +export class BankTransactionEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + public attach(bus) { + bus.subscribe( + events.bankMatch.onMatched, + this.handleTrackBankTransactionMatchedEvent + ); + bus.subscribe( + events.bankTransactions.onExcluded, + this.handleTrackBankTransactionExcludedEvent + ); + bus.subscribe( + events.cashflow.onTransactionCategorized, + this.handleTrackBankTransactionCategorizedEvent + ); + bus.subscribe( + events.cashflow.onTransactionUncategorized, + this.handleTrackBankTransactionUncategorizedEvent + ); + bus.subscribe( + events.bankAccount.onDisconnected, + this.handleTrackBankAccountDisconnectedEvent + ); + } + + private handleTrackBankTransactionMatchedEvent = ({ + tenantId, + }: IBankTransactionMatchedEventPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BANK_TRANSACTION_MATCHED, + properties: {}, + }); + }; + + private handleTrackBankTransactionExcludedEvent = ({ + tenantId, + }: IBankTransactionExcludedEventPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BANK_TRANSACTION_EXCLUDED, + properties: {}, + }); + }; + + private handleTrackBankTransactionCategorizedEvent = ({ + tenantId, + }: ICashflowTransactionCategorizedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BANK_TRANSACTION_CATEGORIZED, + properties: {}, + }); + }; + + private handleTrackBankTransactionUncategorizedEvent = ({ + tenantId, + }: ICashflowTransactionUncategorizedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BANK_TRANSACTION_UNCATEGORIZED, + properties: {}, + }); + }; + + private handleTrackBankAccountDisconnectedEvent = ({ + tenantId, + }: IBankAccountDisconnectedEventPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BANK_ACCOUNT_DISCONNECTED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/events.ts b/packages/server/src/services/EventsTracker/events/events.ts index 8f1b9c54f..1f5215bfd 100644 --- a/packages/server/src/services/EventsTracker/events/events.ts +++ b/packages/server/src/services/EventsTracker/events/events.ts @@ -7,6 +7,7 @@ import { ExpenseEventsTracker } from './ExpenseEventsTracker'; import { AccountEventsTracker } from './AccountEventsTracker'; import { AuthenticationEventsTracker } from './AuthenticationEventsTracker'; import { ItemEventsTracker } from './ItemEventsTracker'; +import { BankTransactionEventsTracker } from './BankTransactionEventsTracker'; export const EventsTrackerListeners = [ SaleInvoiceEventsTracker, @@ -17,5 +18,6 @@ export const EventsTrackerListeners = [ AccountEventsTracker, ExpenseEventsTracker, AuthenticationEventsTracker, - ItemEventsTracker + ItemEventsTracker, + BankTransactionEventsTracker, ];