From 52362a43abb5fce9a405246a6929db2f0330674a Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Wed, 8 Jan 2025 11:59:55 +0200 Subject: [PATCH] refactor: events tracker to nestjs --- packages/server-nest/package.json | 3 +- .../server-nest/src/modules/App/App.module.ts | 6 +- .../EventsTracker/EventTracker.module.ts | 46 ++++ .../EventsTracker/EventTracker.service.ts | 40 +++ .../modules/EventsTracker/event-tracker.ts | 130 ++++++++++ .../events/AccountEventsTracker.ts | 52 ++++ .../events/AuthenticationEventsTracker.ts | 22 ++ .../events/BankRuleEventsTracker.ts | 43 ++++ .../events/BankTransactionEventsTracker.ts | 63 +++++ .../EventsTracker/events/BillEventsTracker.ts | 39 +++ .../events/CustomerEventsTracker.ts | 43 ++++ .../events/ExpenseEventsTracker.ts | 43 ++++ .../EventsTracker/events/ItemEventsTracker.ts | 52 ++++ .../events/ManualJournalEventsTracker.ts | 49 ++++ .../events/PaymentLinkEventsTracker.ts | 18 ++ .../events/PaymentMadeEventsTracker.ts | 43 ++++ .../events/PaymentMethodEventsTracker.ts | 29 +++ .../events/PaymentReceivedEventsTracker.ts | 61 +++++ .../events/PdfTemplateEventsTracker.ts | 47 ++++ .../events/ReportsEventsTracker.ts | 240 ++++++++++++++++++ .../events/SaleEstimateEventsTracker.ts | 70 +++++ .../events/SaleInvoicesEventsTracker.ts | 69 +++++ .../events/StripeIntegrationEventsTracker.ts | 19 ++ .../events/SubscriptionEventsTracker.ts | 48 ++++ .../TransactionsLockingEventsTracker.ts | 57 +++++ .../events/VendorEventsTracker.ts | 43 ++++ .../modules/EventsTracker/postHog.module.ts | 22 ++ .../InventoryAdjustments.module.ts | 5 +- .../CreateQuickInventoryAdjustment.service.ts | 1 - .../PublishInventoryAdjustment.service.ts | 8 +- .../commands/ledger/InventoryAdjustmentGL.ts | 7 +- .../InventoryAdjustments.constants.ts | 6 + pnpm-lock.yaml | 3 + 33 files changed, 1417 insertions(+), 10 deletions(-) create mode 100644 packages/server-nest/src/modules/EventsTracker/EventTracker.module.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/EventTracker.service.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/event-tracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/AccountEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/AuthenticationEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/BankRuleEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/BankTransactionEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/BillEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/CustomerEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/ExpenseEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/ItemEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/ManualJournalEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/PaymentLinkEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/PaymentMadeEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/PaymentMethodEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/PaymentReceivedEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/PdfTemplateEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/ReportsEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/SaleEstimateEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/SaleInvoicesEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/StripeIntegrationEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/SubscriptionEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/TransactionsLockingEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/events/VendorEventsTracker.ts create mode 100644 packages/server-nest/src/modules/EventsTracker/postHog.module.ts create mode 100644 packages/server-nest/src/modules/InventoryAdjutments/constants/InventoryAdjustments.constants.ts diff --git a/packages/server-nest/package.json b/packages/server-nest/package.json index 182763618..b0b528c12 100644 --- a/packages/server-nest/package.json +++ b/packages/server-nest/package.json @@ -76,7 +76,8 @@ "plaid": "^10.3.0", "@supercharge/promise-pool": "^3.2.0", "yup": "^0.28.1", - "uniqid": "^5.2.0" + "uniqid": "^5.2.0", + "posthog-node": "^4.2.0" }, "devDependencies": { "@nestjs/cli": "^10.0.0", diff --git a/packages/server-nest/src/modules/App/App.module.ts b/packages/server-nest/src/modules/App/App.module.ts index 31c9dea24..3c4e03242 100644 --- a/packages/server-nest/src/modules/App/App.module.ts +++ b/packages/server-nest/src/modules/App/App.module.ts @@ -63,6 +63,8 @@ import { BankingTransactionsModule } from '../BankingTransactions/BankingTransac import { TransactionsLockingModule } from '../TransactionsLocking/TransactionsLocking.module'; import { SettingsModule } from '../Settings/Settings.module'; import { InventoryAdjustmentsModule } from '../InventoryAdjutments/InventoryAdjustments.module'; +import { EventTrackerModule } from '../EventsTracker/EventTracker.module'; +import { PostHogModule } from '../EventsTracker/postHog.module'; @Module({ imports: [ @@ -149,7 +151,9 @@ import { InventoryAdjustmentsModule } from '../InventoryAdjutments/InventoryAdju BankingMatchingModule, TransactionsLockingModule, SettingsModule, - InventoryAdjustmentsModule + InventoryAdjustmentsModule, + PostHogModule, + EventTrackerModule, ], controllers: [AppController], providers: [ diff --git a/packages/server-nest/src/modules/EventsTracker/EventTracker.module.ts b/packages/server-nest/src/modules/EventsTracker/EventTracker.module.ts new file mode 100644 index 000000000..a7210ad9c --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/EventTracker.module.ts @@ -0,0 +1,46 @@ +import { Module } from '@nestjs/common'; +import { SaleInvoiceEventsTracker } from './events/SaleInvoicesEventsTracker'; +import { SaleEstimateEventsTracker } from './events/SaleEstimateEventsTracker'; +import { PaymentMadeEventsTracker } from './events/PaymentMadeEventsTracker'; +import { PaymentReceivedEventsTracker } from './events/PaymentReceivedEventsTracker'; +import { BillEventsTracker } from './events/BillEventsTracker'; +import { AccountEventsTracker } from './events/AccountEventsTracker'; +import { ExpenseEventsTracker } from './events/ExpenseEventsTracker'; +import { AuthenticationEventsTracker } from './events/AuthenticationEventsTracker'; +import { ItemEventsTracker } from './events/ItemEventsTracker'; +import { BankTransactionEventsTracker } from './events/BankTransactionEventsTracker'; +import { CustomerEventsTracker } from './events/CustomerEventsTracker'; +import { VendorEventsTracker } from './events/VendorEventsTracker'; +import { ManualJournalEventsTracker } from './events/ManualJournalEventsTracker'; +import { BankRuleEventsTracker } from './events/BankRuleEventsTracker'; +import { PdfTemplateEventsTracker } from './events/PdfTemplateEventsTracker'; +import { PaymentMethodEventsTracker } from './events/PaymentMethodEventsTracker'; +import { PaymentLinkEventsTracker } from './events/PaymentLinkEventsTracker'; +import { StripeIntegrationEventsTracker } from './events/StripeIntegrationEventsTracker'; +import { PostHogModule } from './postHog.module'; + +@Module({ + imports: [PostHogModule], + providers: [ + SaleInvoiceEventsTracker, + SaleEstimateEventsTracker, + PaymentMadeEventsTracker, + PaymentReceivedEventsTracker, + BillEventsTracker, + AccountEventsTracker, + ExpenseEventsTracker, + AuthenticationEventsTracker, + ItemEventsTracker, + BankTransactionEventsTracker, + CustomerEventsTracker, + VendorEventsTracker, + ManualJournalEventsTracker, + BankRuleEventsTracker, + PdfTemplateEventsTracker, + PaymentMethodEventsTracker, + PaymentLinkEventsTracker, + StripeIntegrationEventsTracker, + // ReportsEventsTracker, + ], +}) +export class EventTrackerModule {} diff --git a/packages/server-nest/src/modules/EventsTracker/EventTracker.service.ts b/packages/server-nest/src/modules/EventsTracker/EventTracker.service.ts new file mode 100644 index 000000000..8eaba1654 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/EventTracker.service.ts @@ -0,0 +1,40 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { PostHog } from 'posthog-node'; +import { EventMessage } from 'posthog-node/src/types'; +import { POSTHOG } from './postHog.module'; +import { TenancyContext } from '../Tenancy/TenancyContext.service'; + +@Injectable() +export class EventTrackerService { + constructor( + @Inject(POSTHOG) private readonly posthog: PostHog, + private readonly tenancyContext: TenancyContext, + ) {} + + /** + * Track tenant an event. + * @param event - The event to track. + */ + public async trackEvent(event: Omit) { + // Cannot continue if the Posthog not configured. + if (!this.posthog) return; + + const tenant = await this.tenancyContext.getTenant(); + const authorizedUser = await this.tenancyContext.getSystemUser(); + + if (!tenant || !authorizedUser) { + throw new Error('Tenant or authorized user not found'); + } + const distinctId = `tenant-${tenant.id}-user-${authorizedUser.id}`; + const properties = { + ...event.properties, + tenantId: tenant.id, + userId: authorizedUser.id, + }; + this.posthog.capture({ + ...event, + distinctId, + properties, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/event-tracker.ts b/packages/server-nest/src/modules/EventsTracker/event-tracker.ts new file mode 100644 index 000000000..12a89d6bd --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/event-tracker.ts @@ -0,0 +1,130 @@ +export const SALE_INVOICE_CREATED = 'Sale invoice created'; +export const SALE_INVOICE_EDITED = 'Sale invoice edited'; +export const SALE_INVOICE_DELETED = 'Sale invoice deleted'; +export const SALE_INVOICE_MAIL_DELIVERED = 'Sale invoice mail delivered'; +export const SALE_INVOICE_VIEWED = 'Sale invoice viewed'; +export const SALE_INVOICE_PDF_VIEWED = 'Sale invoice PDF viewed'; +export const SALE_INVOICE_MAIL_SENT = 'Sale invoice mail sent'; +export const SALE_INVOICE_MAIL_REMINDER_SENT = + 'Sale invoice reminder mail sent'; + +export const SALE_ESTIMATE_CREATED = 'Sale estimate created'; +export const SALE_ESTIMATE_EDITED = 'Sale estimate edited'; +export const SALE_ESTIMATE_DELETED = 'Sale estimate deleted'; +export const SALE_ESTIMATE_PDF_VIEWED = 'Sale estimate PDF viewed'; +export const SALE_ESTIMATE_VIEWED = 'Sale estimate viewed'; +export const SALE_ESTIMATE_MAIL_SENT = 'Sale estimate mail sent'; + +export const PAYMENT_RECEIVED_CREATED = 'Payment received created'; +export const PAYMENT_RECEIVED_EDITED = 'payment received edited'; +export const PAYMENT_RECEIVED_DELETED = 'Payment received deleted'; +export const PAYMENT_RECEIVED_PDF_VIEWED = 'Payment received PDF viewed'; +export const PAYMENT_RECEIVED_MAIL_SENT = 'Payment received mail sent'; + +export const SALE_RECEIPT_PDF_VIEWED = 'Sale credit PDF viewed'; +export const SALE_RECEIPT_MAIL_SENT = 'Sale credit mail sent'; + +export const CREDIT_NOTE_PDF_VIEWED = 'Credit note PDF viewed'; +export const CREDIT_NOTE_MAIL_SENT = 'Credit note mail sent'; + +export const BILL_CREATED = 'Bill created'; +export const BILL_EDITED = 'Bill edited'; +export const BILL_DELETED = 'Bill deleted'; + +export const PAYMENT_MADE_CREATED = 'Payment made created'; +export const PAYMENT_MADE_EDITED = 'Payment made edited'; +export const PAYMENT_MADE_DELETED = 'Payment made deleted'; + +export const EXPENSE_CREATED = 'Expense created'; +export const EXPENSE_EDITED = 'Expense edited'; +export const EXPENSE_DELETED = 'Expense deleted'; + +export const ACCOUNT_CREATED = 'Account created'; +export const ACCOUNT_EDITED = 'Account Edited'; +export const ACCOUNT_DELETED = 'Account deleted'; +export const ACCOUNT_VIEWED = 'Account viewed'; + +export const ITEM_EVENT_CREATED = 'Item created'; +export const ITEM_EVENT_EDITED = 'Item edited'; +export const ITEM_EVENT_DELETED = 'Item deleted'; +export const ITEM_EVENT_VIEWED = 'Item viewed'; + +export const AUTH_SIGNED_UP = 'Auth Signed-up'; +export const AUTH_RESET_PASSWORD = 'Auth reset password'; + +export const SUBSCRIPTION_CANCELLED = 'Subscription cancelled'; +export const SUBSCRIPTION_RESUMED = 'Subscription resumed'; +export const SUBSCRIPTION_PLAN_CHANGED = 'Subscription plan changed'; +export const SUBSCRIPTION_PAYMENT_SUCCEED = 'Subscription payment succeed'; +export const SUBSCRIPTION_PAYMENT_FAILED = 'Subscription payment failed'; + +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 TRANSACTIONS_LOCKING_LOCKED = 'Transactions locking locked'; +export const TRANSACTIONS_LOCKING_LOCKING_CANCELLED = + 'Transactions locking cancelled'; +export const TRANSACTIONS_LOCKING_PARTIALLY_UNLOCKED = + 'Transactions locking partially unlocked'; +export const TRANSACTIONS_LOCKING_PARTIALLY_UNLOCK_CANCELLED = + 'Transactions locking partially unlock cancelled'; + +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 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 BANK_RULE_CREATED = 'Bank rule created'; +export const BANK_RULE_EDITED = 'Bank rule edited'; +export const BANK_RULE_DELETED = 'Bank rule deleted'; + +export const PDF_TEMPLATE_CREATED = 'PDF template created'; +export const PDF_TEMPLATE_EDITED = 'PDF template edited'; +export const PDF_TEMPLATE_DELETED = 'PDF template deleted'; +export const PDF_TEMPLATE_ASSIGNED_DEFAULT = 'PDF template assigned as default'; + +export const PAYMENT_METHOD_EDITED = 'Payment method edited'; +export const PAYMENT_METHOD_DELETED = 'Payment method deleted'; + +export const INVOICE_PAYMENT_LINK_GENERATED = 'Invoice payment link generated'; + +export const STRIPE_INTEGRAION_CONNECTED = + 'Stripe integration oauth2 connected'; + +// # Event Groups +export const ACCOUNT_GROUP = 'Account'; +export const ITEM_GROUP = 'Item'; +export const AUTH_GROUP = 'Auth'; +export const SALE_GROUP = 'Sale'; +export const PAYMENT_GROUP = 'Payment'; +export const BILL_GROUP = 'Bill'; +export const EXPENSE_GROUP = 'Expense'; + +// # Reports +export const BALANCE_SHEET_VIEWED = 'Balance sheet viewed'; +export const TRIAL_BALANCE_SHEET_VIEWED = 'Trial balance sheet viewed'; +export const PROFIT_LOSS_SHEET_VIEWED = 'Profit loss sheet viewed'; +export const CASHFLOW_STATEMENT_VIEWED = 'Cashflow statement viewed'; +export const GENERAL_LEDGER_VIEWED = 'General ledger viewed'; +export const JOURNAL_VIEWED = 'Journal viewed'; +export const RECEIVABLE_AGING_VIEWED = 'Receivable aging viewed'; +export const PAYABLE_AGING_VIEWED = 'Payable aging viewed'; +export const CUSTOMER_BALANCE_SUMMARY_VIEWED = + 'Customer balance summary viewed'; +export const VENDOR_BALANCE_SUMMARY_VIEWED = 'Vendor balance summary viewed'; +export const INVENTORY_VALUATION_VIEWED = 'Inventory valuation viewed'; +export const CUSTOMER_TRANSACTIONS_VIEWED = 'Customer transactions viewed'; +export const VENDOR_TRANSACTIONS_VIEWED = 'Vendor transactions viewed'; +export const SALES_BY_ITEM_VIEWED = 'Sales by item viewed'; +export const PURCHASES_BY_ITEM_VIEWED = 'Purchases by item viewed'; diff --git a/packages/server-nest/src/modules/EventsTracker/events/AccountEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/AccountEventsTracker.ts new file mode 100644 index 000000000..eca073c8a --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/AccountEventsTracker.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@nestjs/common'; +import { + IAccountEventCreatedPayload, + IAccountEventEditedPayload, + IAccountEventDeletedPayload, +} from '../../Accounts/Accounts.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { + ACCOUNT_CREATED, + ACCOUNT_EDITED, + ACCOUNT_DELETED, + ACCOUNT_VIEWED, +} from '../event-tracker'; +import { events } from '@/common/events/events'; +import { OnEvent } from '@nestjs/event-emitter'; + +@Injectable() +export class AccountEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.accounts.onCreated) + public handleTrackAccountCreatedEvent({}: IAccountEventCreatedPayload) { + this.posthog.trackEvent({ + event: ACCOUNT_CREATED, + properties: {}, + }); + } + + @OnEvent(events.accounts.onEdited) + public handleTrackEditedAccountEvent({}: IAccountEventEditedPayload) { + this.posthog.trackEvent({ + event: ACCOUNT_EDITED, + properties: {}, + }); + } + + @OnEvent(events.accounts.onDeleted) + public handleTrackDeletedAccountEvent({}: IAccountEventDeletedPayload) { + this.posthog.trackEvent({ + event: ACCOUNT_DELETED, + properties: {}, + }); + } + + @OnEvent(events.accounts.onViewed) + public handleTrackAccountViewedEvent({}) { + this.posthog.trackEvent({ + event: ACCOUNT_VIEWED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/AuthenticationEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/AuthenticationEventsTracker.ts new file mode 100644 index 000000000..cedacdff5 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/AuthenticationEventsTracker.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { EventTrackerService } from '../EventTracker.service'; +import { AUTH_SIGNED_UP } from '../event-tracker'; +import { events } from '@/common/events/events'; + +@Injectable() +export class AuthenticationEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + // @OnEvent(events.auth.onSignedUp) + // public handleTrackSignUpEvent({ user }: IAuthSignedUpEventPayload) { + // this.posthog.trackEvent({ + // event: AUTH_SIGNED_UP, + // properties: { + // firstName: user.firstName, + // lastName: user.lastName, + // email: user.email, + // }, + // }); + // } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/BankRuleEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/BankRuleEventsTracker.ts new file mode 100644 index 000000000..eceebac56 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/BankRuleEventsTracker.ts @@ -0,0 +1,43 @@ +import { + IBankRuleEventCreatedPayload, + IBankRuleEventEditedPayload, + IBankRuleEventDeletedPayload, +} from '../../BankRules/types'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + BANK_RULE_CREATED, + BANK_RULE_EDITED, + BANK_RULE_DELETED, +} from '../event-tracker'; +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; + +@Injectable() +export class BankRuleEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.bankRules.onCreated) + public handleTrackBankRuleCreatedEvent({}: IBankRuleEventCreatedPayload) { + this.posthog.trackEvent({ + event: BANK_RULE_CREATED, + properties: {}, + }); + } + + @OnEvent(events.bankRules.onEdited) + public handleTrackEditedBankRuleEvent({}: IBankRuleEventEditedPayload) { + this.posthog.trackEvent({ + event: BANK_RULE_EDITED, + properties: {}, + }); + } + + @OnEvent(events.bankRules.onDeleted) + public handleTrackDeletedBankRuleEvent({}: IBankRuleEventDeletedPayload) { + this.posthog.trackEvent({ + event: BANK_RULE_DELETED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/BankTransactionEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/BankTransactionEventsTracker.ts new file mode 100644 index 000000000..8b28734ce --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/BankTransactionEventsTracker.ts @@ -0,0 +1,63 @@ +import { + BANK_TRANSACTION_MATCHED, + BANK_TRANSACTION_EXCLUDED, + BANK_TRANSACTION_CATEGORIZED, + BANK_TRANSACTION_UNCATEGORIZED, + BANK_ACCOUNT_DISCONNECTED, +} from '../event-tracker'; +import { Injectable } from '@nestjs/common'; +import { EventTrackerService } from '../EventTracker.service'; +import { OnEvent } from '@nestjs/event-emitter'; +import { events } from '@/common/events/events'; +import { IBankTransactionMatchedEventPayload } from '@/modules/BankingMatching/types'; +import { IBankTransactionExcludedEventPayload } from '@/modules/BankingTransactionsExclude/types/BankTransactionsExclude.types'; +import { + ICashflowTransactionCategorizedPayload, + ICashflowTransactionUncategorizedPayload, +} from '@/modules/BankingTransactions/types/BankingTransactions.types'; +import { IBankAccountDisconnectedEventPayload } from '@/modules/BankingAccounts/types/BankAccounts.types'; + +@Injectable() +export class BankTransactionEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.bankMatch.onMatched) + public handleTrackBankTransactionMatchedEvent({}: IBankTransactionMatchedEventPayload) { + this.posthog.trackEvent({ + event: BANK_TRANSACTION_MATCHED, + properties: {}, + }); + } + + @OnEvent(events.bankTransactions.onExcluded) + public handleTrackBankTransactionExcludedEvent({}: IBankTransactionExcludedEventPayload) { + this.posthog.trackEvent({ + event: BANK_TRANSACTION_EXCLUDED, + properties: {}, + }); + } + + @OnEvent(events.cashflow.onTransactionCategorized) + public handleTrackBankTransactionCategorizedEvent({}: ICashflowTransactionCategorizedPayload) { + this.posthog.trackEvent({ + event: BANK_TRANSACTION_CATEGORIZED, + properties: {}, + }); + } + + @OnEvent(events.cashflow.onTransactionUncategorized) + public handleTrackBankTransactionUncategorizedEvent({}: ICashflowTransactionUncategorizedPayload) { + this.posthog.trackEvent({ + event: BANK_TRANSACTION_UNCATEGORIZED, + properties: {}, + }); + } + + @OnEvent(events.bankAccount.onDisconnected) + public handleTrackBankAccountDisconnectedEvent({}: IBankAccountDisconnectedEventPayload) { + this.posthog.trackEvent({ + event: BANK_ACCOUNT_DISCONNECTED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/BillEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/BillEventsTracker.ts new file mode 100644 index 000000000..70c255aaf --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/BillEventsTracker.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@nestjs/common'; +import { + IBillPaymentEventCreatedPayload, + IBillPaymentEventEditedPayload, + IBillPaymentEventDeletedPayload, +} from '../../BillPayments/types/BillPayments.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { BILL_CREATED, BILL_EDITED, BILL_DELETED } from '../event-tracker'; +import { events } from '@/common/events/events'; +import { OnEvent } from '@nestjs/event-emitter'; + +@Injectable() +export class BillEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.bill.onCreated) + public handleTrackBillCreatedEvent({}: IBillPaymentEventCreatedPayload) { + this.posthog.trackEvent({ + event: BILL_CREATED, + properties: {}, + }); + } + + @OnEvent(events.bill.onEdited) + public handleTrackEditedBillEvent({}: IBillPaymentEventEditedPayload) { + this.posthog.trackEvent({ + event: BILL_EDITED, + properties: {}, + }); + } + + @OnEvent(events.bill.onDeleted) + public handleTrackDeletedBillEvent({}: IBillPaymentEventDeletedPayload) { + this.posthog.trackEvent({ + event: BILL_DELETED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/CustomerEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/CustomerEventsTracker.ts new file mode 100644 index 000000000..1817ffa09 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/CustomerEventsTracker.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + ICustomerEventCreatedPayload, + ICustomerEventEditedPayload, + ICustomerEventDeletedPayload, +} from '../../Customers/types/Customers.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + CUSTOMER_CREATED, + CUSTOMER_EDITED, + CUSTOMER_DELETED, +} from '../event-tracker'; + +@Injectable() +export class CustomerEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.customers.onCreated) + public handleTrackCustomerCreatedEvent({}: ICustomerEventCreatedPayload) { + this.posthog.trackEvent({ + event: CUSTOMER_CREATED, + properties: {}, + }); + } + + @OnEvent(events.customers.onEdited) + public handleTrackEditedCustomerEvent({}: ICustomerEventEditedPayload) { + this.posthog.trackEvent({ + event: CUSTOMER_EDITED, + properties: {}, + }); + } + + @OnEvent(events.customers.onDeleted) + public handleTrackDeletedCustomerEvent({}: ICustomerEventDeletedPayload) { + this.posthog.trackEvent({ + event: CUSTOMER_DELETED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/ExpenseEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/ExpenseEventsTracker.ts new file mode 100644 index 000000000..f29a3b851 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/ExpenseEventsTracker.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + IExpenseCreatedPayload, + IExpenseEventEditPayload, + IExpenseEventDeletePayload, +} from '../../Expenses/Expenses.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + EXPENSE_CREATED, + EXPENSE_EDITED, + EXPENSE_DELETED, +} from '../event-tracker'; + +@Injectable() +export class ExpenseEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.expenses.onCreated) + public handleTrackExpenseCreatedEvent({}: IExpenseCreatedPayload) { + this.posthog.trackEvent({ + event: EXPENSE_CREATED, + properties: {}, + }); + } + + @OnEvent(events.expenses.onEdited) + public handleTrackEditedExpenseEvent({}: IExpenseEventEditPayload) { + this.posthog.trackEvent({ + event: EXPENSE_EDITED, + properties: {}, + }); + } + + @OnEvent(events.expenses.onDeleted) + public handleTrackDeletedExpenseEvent({}: IExpenseEventDeletePayload) { + this.posthog.trackEvent({ + event: EXPENSE_DELETED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/ItemEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/ItemEventsTracker.ts new file mode 100644 index 000000000..8b3816d6e --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/ItemEventsTracker.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + IItemEventCreatedPayload, + IItemEventEditedPayload, + IItemEventDeletedPayload, +} from '@/interfaces/Item'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + ITEM_EVENT_CREATED, + ITEM_EVENT_EDITED, + ITEM_EVENT_DELETED, + ITEM_EVENT_VIEWED, +} from '../event-tracker'; + +@Injectable() +export class ItemEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.item.onCreated) + public handleTrackItemCreatedEvent({}: IItemEventCreatedPayload) { + this.posthog.trackEvent({ + event: ITEM_EVENT_CREATED, + properties: {}, + }); + } + + @OnEvent(events.item.onEdited) + public handleTrackEditedItemEvent({}: IItemEventEditedPayload) { + this.posthog.trackEvent({ + event: ITEM_EVENT_EDITED, + properties: {}, + }); + } + + @OnEvent(events.item.onDeleted) + public handleTrackDeletedItemEvent({}: IItemEventDeletedPayload) { + this.posthog.trackEvent({ + event: ITEM_EVENT_DELETED, + properties: {}, + }); + } + + @OnEvent(events.item.onViewed) + public handleTrackViewedItemEvent({}: IItemEventDeletedPayload) { + this.posthog.trackEvent({ + event: ITEM_EVENT_VIEWED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/ManualJournalEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/ManualJournalEventsTracker.ts new file mode 100644 index 000000000..e7f5af5eb --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/ManualJournalEventsTracker.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + IManualJournalEventCreatedPayload, + IManualJournalEventEditedPayload, + IManualJournalEventDeletedPayload, +} from '../../ManualJournals/types/ManualJournals.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + MANUAL_JOURNAL_CREATED, + MANUAL_JOURNAL_EDITED, + MANUAL_JOURNAL_DELETED, +} from '../event-tracker'; + +@Injectable() +export class ManualJournalEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.manualJournals.onCreated) + public handleTrackManualJournalCreatedEvent( + payload: IManualJournalEventCreatedPayload, + ) { + this.posthog.trackEvent({ + event: MANUAL_JOURNAL_CREATED, + properties: {}, + }); + } + + @OnEvent(events.manualJournals.onEdited) + public handleTrackEditedManualJournalEvent( + payload: IManualJournalEventEditedPayload, + ) { + this.posthog.trackEvent({ + event: MANUAL_JOURNAL_EDITED, + properties: {}, + }); + } + + @OnEvent(events.manualJournals.onDeleted) + public handleTrackDeletedManualJournalEvent( + payload: IManualJournalEventDeletedPayload, + ) { + this.posthog.trackEvent({ + event: MANUAL_JOURNAL_DELETED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/PaymentLinkEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/PaymentLinkEventsTracker.ts new file mode 100644 index 000000000..8681df0ac --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/PaymentLinkEventsTracker.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { INVOICE_PAYMENT_LINK_GENERATED } from '../event-tracker'; + +@Injectable() +export class PaymentLinkEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.saleInvoice.onPublicLinkGenerated) + public handleTrackInvoicePublicLinkGeneratedEvent() { + this.posthog.trackEvent({ + event: INVOICE_PAYMENT_LINK_GENERATED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/PaymentMadeEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/PaymentMadeEventsTracker.ts new file mode 100644 index 000000000..76631af3a --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/PaymentMadeEventsTracker.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + IBillPaymentEventCreatedPayload, + IBillPaymentEditingPayload, + IBillPaymentEventDeletedPayload, +} from '../../BillPayments/types/BillPayments.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + PAYMENT_MADE_CREATED, + PAYMENT_MADE_EDITED, + PAYMENT_MADE_DELETED, +} from '../event-tracker'; + +@Injectable() +export class PaymentMadeEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.billPayment.onCreated) + public handleTrackPaymentMadeCreatedEvent({}: IBillPaymentEventCreatedPayload) { + this.posthog.trackEvent({ + event: PAYMENT_MADE_CREATED, + properties: {}, + }); + } + + @OnEvent(events.billPayment.onEdited) + public handleTrackEditedPaymentMadeEvent({}: IBillPaymentEditingPayload) { + this.posthog.trackEvent({ + event: PAYMENT_MADE_EDITED, + properties: {}, + }); + } + + @OnEvent(events.billPayment.onDeleted) + public handleTrackDeletedPaymentMadeEvent({}: IBillPaymentEventDeletedPayload) { + this.posthog.trackEvent({ + event: PAYMENT_MADE_DELETED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/PaymentMethodEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/PaymentMethodEventsTracker.ts new file mode 100644 index 000000000..0c8a4eca6 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/PaymentMethodEventsTracker.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + PAYMENT_METHOD_EDITED, + PAYMENT_METHOD_DELETED, +} from '../event-tracker'; + +@Injectable() +export class PaymentMethodEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.paymentMethod.onEdited) + public handleTrackPaymentMethodEditedEvent({}) { + this.posthog.trackEvent({ + event: PAYMENT_METHOD_EDITED, + properties: {}, + }); + } + + @OnEvent(events.paymentMethod.onDeleted) + public handleTrackPaymentMethodDeletedEvent({}) { + this.posthog.trackEvent({ + event: PAYMENT_METHOD_DELETED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/PaymentReceivedEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/PaymentReceivedEventsTracker.ts new file mode 100644 index 000000000..405b4eecd --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/PaymentReceivedEventsTracker.ts @@ -0,0 +1,61 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + IPaymentReceivedCreatedPayload, + IPaymentReceivedEditedPayload, + IPaymentReceivedDeletedPayload, +} from '../../PaymentReceived/types/PaymentReceived.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + PAYMENT_RECEIVED_CREATED, + PAYMENT_RECEIVED_EDITED, + PAYMENT_RECEIVED_DELETED, + PAYMENT_RECEIVED_PDF_VIEWED, + PAYMENT_RECEIVED_MAIL_SENT, +} from '../event-tracker'; + +@Injectable() +export class PaymentReceivedEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.paymentReceive.onCreated) + public handleTrackPaymentReceivedCreatedEvent({}: IPaymentReceivedCreatedPayload) { + this.posthog.trackEvent({ + event: PAYMENT_RECEIVED_CREATED, + properties: {}, + }); + } + + @OnEvent(events.paymentReceive.onEdited) + public handleTrackEditedPaymentReceivedEvent({}: IPaymentReceivedEditedPayload) { + this.posthog.trackEvent({ + event: PAYMENT_RECEIVED_EDITED, + properties: {}, + }); + } + + @OnEvent(events.paymentReceive.onDeleted) + public handleTrackDeletedPaymentReceivedEvent({}: IPaymentReceivedDeletedPayload) { + this.posthog.trackEvent({ + event: PAYMENT_RECEIVED_DELETED, + properties: {}, + }); + } + + @OnEvent(events.paymentReceive.onPdfViewed) + public handleTrackPdfViewedPaymentReceivedEvent({}: IPaymentReceivedDeletedPayload) { + this.posthog.trackEvent({ + event: PAYMENT_RECEIVED_PDF_VIEWED, + properties: {}, + }); + } + + @OnEvent(events.paymentReceive.onMailSent) + public handleTrackMailSentPaymentReceivedEvent({}: IPaymentReceivedDeletedPayload) { + this.posthog.trackEvent({ + event: PAYMENT_RECEIVED_MAIL_SENT, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/PdfTemplateEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/PdfTemplateEventsTracker.ts new file mode 100644 index 000000000..03ad91a83 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/PdfTemplateEventsTracker.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + PDF_TEMPLATE_CREATED, + PDF_TEMPLATE_EDITED, + PDF_TEMPLATE_DELETED, + PDF_TEMPLATE_ASSIGNED_DEFAULT, +} from '../event-tracker'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; + +@Injectable() +export class PdfTemplateEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.pdfTemplate.onCreated) + public handleTrackPdfTemplateCreatedEvent({}) { + this.posthog.trackEvent({ + event: PDF_TEMPLATE_CREATED, + properties: {}, + }); + } + + @OnEvent(events.pdfTemplate.onEdited) + public handleTrackEditedPdfTemplateEvent({}) { + this.posthog.trackEvent({ + event: PDF_TEMPLATE_EDITED, + properties: {}, + }); + } + + @OnEvent(events.pdfTemplate.onDeleted) + public handleTrackDeletedPdfTemplateEvent({}) { + this.posthog.trackEvent({ + event: PDF_TEMPLATE_DELETED, + properties: {}, + }); + } + + @OnEvent(events.pdfTemplate.onAssignedDefault) + public handleTrackAssignedAsDefaultPdfTemplateEvent({}) { + this.posthog.trackEvent({ + event: PDF_TEMPLATE_ASSIGNED_DEFAULT, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/ReportsEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/ReportsEventsTracker.ts new file mode 100644 index 000000000..2d4ed06e8 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/ReportsEventsTracker.ts @@ -0,0 +1,240 @@ +// import { Inject, Service } from 'typedi'; +// import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +// import { ReportsEvents } from '@/constants/event-tracker'; +// import { PosthogService } from '../EventTracker.service'; +// import events from '@/subscribers/events'; +// import { +// BALANCE_SHEET_VIEWED, +// TRIAL_BALANCE_SHEET_VIEWED, +// PROFIT_LOSS_SHEET_VIEWED, +// CASHFLOW_STATEMENT_VIEWED, +// GENERAL_LEDGER_VIEWED, +// JOURNAL_VIEWED, +// RECEIVABLE_AGING_VIEWED, +// PAYABLE_AGING_VIEWED, +// CUSTOMER_BALANCE_SUMMARY_VIEWED, +// VENDOR_BALANCE_SUMMARY_VIEWED, +// INVENTORY_VALUATION_VIEWED, +// CUSTOMER_TRANSACTIONS_VIEWED, +// VENDOR_TRANSACTIONS_VIEWED, +// SALES_BY_ITEM_VIEWED, +// PURCHASES_BY_ITEM_VIEWED, +// } from '@/constants/event-tracker'; + +// @Service() +// export class ReportsEventsTracker extends EventSubscriber { +// @Inject() +// private posthog: PosthogService; + +// /** +// * Constructor method. +// */ +// public attach(bus) { +// bus.subscribe( +// events.reports.onBalanceSheetViewed, +// this.handleTrackBalanceSheetViewedEvent +// ); +// bus.subscribe( +// events.reports.onTrialBalanceSheetView, +// this.handleTrackTrialBalanceSheetViewedEvent +// ); +// bus.subscribe( +// events.reports.onProfitLossSheetViewed, +// this.handleTrackProfitLossSheetViewedEvent +// ); +// bus.subscribe( +// events.reports.onCashflowStatementViewed, +// this.handleTrackCashflowStatementViewedEvent +// ); +// bus.subscribe( +// events.reports.onGeneralLedgerViewed, +// this.handleTrackGeneralLedgerViewedEvent +// ); +// bus.subscribe( +// events.reports.onJournalViewed, +// this.handleTrackJournalViewedEvent +// ); +// bus.subscribe( +// events.reports.onReceivableAgingViewed, +// this.handleTrackReceivableAgingViewedEvent +// ); +// bus.subscribe( +// events.reports.onPayableAgingViewed, +// this.handleTrackPayableAgingViewedEvent +// ); +// bus.subscribe( +// events.reports.onCustomerBalanceSummaryViewed, +// this.handleTrackCustomerBalanceSummaryViewedEvent +// ); +// bus.subscribe( +// events.reports.onVendorBalanceSummaryViewed, +// this.handleTrackVendorBalanceSummaryViewedEvent +// ); +// bus.subscribe( +// events.reports.onInventoryValuationViewed, +// this.handleTrackInventoryValuationViewedEvent +// ); +// bus.subscribe( +// events.reports.onCustomerTransactionsViewed, +// this.handleTrackCustomerTransactionsViewedEvent +// ); +// bus.subscribe( +// events.reports.onVendorTransactionsViewed, +// this.handleTrackVendorTransactionsViewedEvent +// ); +// bus.subscribe( +// events.reports.onSalesByItemViewed, +// this.handleTrackSalesByItemViewedEvent +// ); +// bus.subscribe( +// events.reports.onPurchasesByItemViewed, +// this.handleTrackPurchasesByItemViewedEvent +// ); +// } + +// private handleTrackBalanceSheetViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: BALANCE_SHEET_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackTrialBalanceSheetViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: TRIAL_BALANCE_SHEET_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackProfitLossSheetViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: PROFIT_LOSS_SHEET_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackCashflowStatementViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: CASHFLOW_STATEMENT_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackGeneralLedgerViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: GENERAL_LEDGER_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackJournalViewedEvent({ tenantId }: ReportsEvents) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: JOURNAL_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackReceivableAgingViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: RECEIVABLE_AGING_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackPayableAgingViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: PAYABLE_AGING_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackCustomerBalanceSummaryViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: CUSTOMER_BALANCE_SUMMARY_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackVendorBalanceSummaryViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: VENDOR_BALANCE_SUMMARY_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackInventoryValuationViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: INVENTORY_VALUATION_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackCustomerTransactionsViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: CUSTOMER_TRANSACTIONS_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackVendorTransactionsViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: VENDOR_TRANSACTIONS_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackSalesByItemViewedEvent({ tenantId }: ReportsEvents) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: SALES_BY_ITEM_VIEWED, +// properties: {}, +// }); +// } + +// private handleTrackPurchasesByItemViewedEvent( +// { tenantId }: ReportsEvents +// ) { +// this.posthog.trackEvent({ +// distinctId: `tenant-${tenantId}`, +// event: PURCHASES_BY_ITEM_VIEWED, +// properties: {}, +// }); +// } +// } diff --git a/packages/server-nest/src/modules/EventsTracker/events/SaleEstimateEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/SaleEstimateEventsTracker.ts new file mode 100644 index 000000000..bc29d5a2f --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/SaleEstimateEventsTracker.ts @@ -0,0 +1,70 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + ISaleEstimateCreatedPayload, + ISaleEstimateEditedPayload, + ISaleEstimateDeletedPayload, +} from '../../SaleEstimates/types/SaleEstimates.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { + SALE_ESTIMATE_CREATED, + SALE_ESTIMATE_EDITED, + SALE_ESTIMATE_DELETED, + SALE_ESTIMATE_PDF_VIEWED, + SALE_ESTIMATE_VIEWED, + SALE_ESTIMATE_MAIL_SENT, +} from '../event-tracker'; +import { events } from '@/common/events/events'; + +@Injectable() +export class SaleEstimateEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.saleEstimate.onCreated) + public handleTrackEstimateCreatedEvent({}: ISaleEstimateCreatedPayload) { + this.posthog.trackEvent({ + event: SALE_ESTIMATE_CREATED, + properties: {}, + }); + } + + @OnEvent(events.saleEstimate.onEdited) + public handleTrackEditedEstimateEvent({}: ISaleEstimateEditedPayload) { + this.posthog.trackEvent({ + event: SALE_ESTIMATE_EDITED, + properties: {}, + }); + } + + @OnEvent(events.saleEstimate.onDeleted) + public handleTrackDeletedEstimateEvent({}: ISaleEstimateDeletedPayload) { + this.posthog.trackEvent({ + event: SALE_ESTIMATE_DELETED, + properties: {}, + }); + } + + @OnEvent(events.saleEstimate.onPdfViewed) + public handleTrackPdfViewedEstimateEvent({}: ISaleEstimateDeletedPayload) { + this.posthog.trackEvent({ + event: SALE_ESTIMATE_PDF_VIEWED, + properties: {}, + }); + } + + @OnEvent(events.saleEstimate.onViewed) + public handleTrackViewedEstimateEvent({}) { + this.posthog.trackEvent({ + event: SALE_ESTIMATE_VIEWED, + properties: {}, + }); + } + + @OnEvent(events.saleEstimate.onMailSent) + public handleTrackMailSentEstimateEvent({}) { + this.posthog.trackEvent({ + event: SALE_ESTIMATE_MAIL_SENT, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/SaleInvoicesEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/SaleInvoicesEventsTracker.ts new file mode 100644 index 000000000..a5ca698fa --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/SaleInvoicesEventsTracker.ts @@ -0,0 +1,69 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + ISaleInvoiceCreatedPayload, + ISaleInvoiceEditedPayload, +} from '../../SaleInvoices/SaleInvoice.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + SALE_INVOICE_CREATED, + SALE_INVOICE_DELETED, + SALE_INVOICE_EDITED, + SALE_INVOICE_MAIL_SENT, + SALE_INVOICE_PDF_VIEWED, + SALE_INVOICE_VIEWED, +} from '../event-tracker'; + +@Injectable() +export class SaleInvoiceEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.saleInvoice.onCreated) + public handleTrackInvoiceCreatedEvent({}: ISaleInvoiceCreatedPayload) { + this.posthog.trackEvent({ + event: SALE_INVOICE_CREATED, + properties: {}, + }); + } + + @OnEvent(events.saleInvoice.onEdited) + public handleTrackEditedInvoiceEvent({}: ISaleInvoiceEditedPayload) { + this.posthog.trackEvent({ + event: SALE_INVOICE_EDITED, + properties: {}, + }); + } + + @OnEvent(events.saleInvoice.onDeleted) + public handleTrackDeletedInvoiceEvent({}: ISaleInvoiceEditedPayload) { + this.posthog.trackEvent({ + event: SALE_INVOICE_DELETED, + properties: {}, + }); + } + + @OnEvent(events.saleInvoice.onViewed) + public handleTrackViewedInvoiceEvent({}) { + this.posthog.trackEvent({ + event: SALE_INVOICE_VIEWED, + properties: {}, + }); + } + + @OnEvent(events.saleInvoice.onPdfViewed) + public handleTrackPdfViewedInvoiceEvent({}) { + this.posthog.trackEvent({ + event: SALE_INVOICE_PDF_VIEWED, + properties: {}, + }); + } + + @OnEvent(events.saleInvoice.onMailSent) + public handleTrackMailSentInvoiceEvent({}) { + this.posthog.trackEvent({ + event: SALE_INVOICE_MAIL_SENT, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/StripeIntegrationEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/StripeIntegrationEventsTracker.ts new file mode 100644 index 000000000..b33434617 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/StripeIntegrationEventsTracker.ts @@ -0,0 +1,19 @@ +import { events } from '@/common/events/events'; +import { ISaleInvoiceCreatedPayload } from '@/modules/SaleInvoices/SaleInvoice.types'; +import { OnEvent } from '@nestjs/event-emitter'; +import { STRIPE_INTEGRAION_CONNECTED } from '../event-tracker'; +import { EventTrackerService } from '../EventTracker.service'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class StripeIntegrationEventsTracker { + constructor(private readonly posthog: EventTrackerService) {} + + @OnEvent(events.stripeIntegration.onOAuthCodeGranted) + public handleTrackOAuthCodeGrantedTrackEvent({}: ISaleInvoiceCreatedPayload) { + this.posthog.trackEvent({ + event: STRIPE_INTEGRAION_CONNECTED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/SubscriptionEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/SubscriptionEventsTracker.ts new file mode 100644 index 000000000..94a8a4c8f --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/SubscriptionEventsTracker.ts @@ -0,0 +1,48 @@ +import { Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { ITransactionsLockingPartialUnlocked } from '../../TransactionsLocking/types/TransactionsLocking.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { + TRANSACTIONS_LOCKING_LOCKED, + TRANSACTIONS_LOCKING_LOCKING_CANCELLED, + TRANSACTIONS_LOCKING_PARTIALLY_UNLOCK_CANCELLED, + TRANSACTIONS_LOCKING_PARTIALLY_UNLOCKED, +} from '../event-tracker'; +import { events } from '@/common/events/events'; + +@Injectable() +export class TransactionsLockingEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.transactionsLocking.locked) + public handleTransactionsLockingLockedEvent({}: ITransactionsLockingPartialUnlocked) { + this.posthog.trackEvent({ + event: TRANSACTIONS_LOCKING_LOCKED, + properties: {}, + }); + } + + @OnEvent(events.transactionsLocking.lockCanceled) + public handleTransactionsLockingCancelledEvent({}: ITransactionsLockingPartialUnlocked) { + this.posthog.trackEvent({ + event: TRANSACTIONS_LOCKING_LOCKING_CANCELLED, + properties: {}, + }); + } + + @OnEvent(events.transactionsLocking.partialUnlocked) + public handleTransactionsLockingPartiallyUnlockedEvent({}: ITransactionsLockingPartialUnlocked) { + this.posthog.trackEvent({ + event: TRANSACTIONS_LOCKING_PARTIALLY_UNLOCKED, + properties: {}, + }); + } + + @OnEvent(events.transactionsLocking.partialUnlockCanceled) + public handleTransactionsLockingPartiallyUnlockCancelledEvent({}: ITransactionsLockingPartialUnlocked) { + this.posthog.trackEvent({ + event: TRANSACTIONS_LOCKING_PARTIALLY_UNLOCK_CANCELLED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/TransactionsLockingEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/TransactionsLockingEventsTracker.ts new file mode 100644 index 000000000..e5666c378 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/TransactionsLockingEventsTracker.ts @@ -0,0 +1,57 @@ +import { ITransactionsLockingPartialUnlocked } from '@/interfaces'; +import { + SUBSCRIPTION_CANCELLED, + SUBSCRIPTION_PAYMENT_FAILED, + SUBSCRIPTION_PAYMENT_SUCCEED, + SUBSCRIPTION_PLAN_CHANGED, + SUBSCRIPTION_RESUMED, +} from '../event-tracker'; +import { OnEvent } from '@nestjs/event-emitter'; +import { Injectable } from '@nestjs/common'; +import { EventTrackerService } from '../EventTracker.service'; + +import { events } from '@/common/events/events'; +@Injectable() +export class TransactionsLockingEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.subscription.onSubscriptionResumed) + public handleSubscriptionResumedEvent() { + this.posthog.trackEvent({ + event: SUBSCRIPTION_RESUMED, + properties: {}, + }); + } + + @OnEvent(events.subscription.onSubscriptionCancelled) + public handleSubscriptionCancelledEvent() { + this.posthog.trackEvent({ + event: SUBSCRIPTION_CANCELLED, + properties: {}, + }); + } + + @OnEvent(events.subscription.onSubscriptionPlanChanged) + public handleSubscriptionPlanChangedEvent() { + this.posthog.trackEvent({ + event: SUBSCRIPTION_PLAN_CHANGED, + properties: {}, + }); + } + + @OnEvent(events.subscription.onSubscriptionPaymentFailed) + public handleSubscriptionPaymentFailedEvent() { + this.posthog.trackEvent({ + event: SUBSCRIPTION_PAYMENT_FAILED, + properties: {}, + }); + } + + @OnEvent(events.subscription.onSubscriptionPaymentSucceed) + public handleSubscriptionPaymentSucceed() { + this.posthog.trackEvent({ + event: SUBSCRIPTION_PAYMENT_SUCCEED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/events/VendorEventsTracker.ts b/packages/server-nest/src/modules/EventsTracker/events/VendorEventsTracker.ts new file mode 100644 index 000000000..c857c4056 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/events/VendorEventsTracker.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@nestjs/common'; +import { + IVendorEventCreatedPayload, + IVendorEventEditedPayload, + IVendorEventDeletedPayload, +} from '../../Vendors/types/Vendors.types'; +import { EventTrackerService } from '../EventTracker.service'; +import { events } from '@/common/events/events'; +import { + VENDOR_CREATED, + VENDOR_EDITED, + VENDOR_DELETED, +} from '../event-tracker'; +import { OnEvent } from '@nestjs/event-emitter'; + +@Injectable() +export class VendorEventsTracker { + constructor(public readonly posthog: EventTrackerService) {} + + @OnEvent(events.vendors.onCreated) + public handleTrackVendorCreatedEvent({}: IVendorEventCreatedPayload) { + this.posthog.trackEvent({ + event: VENDOR_CREATED, + properties: {}, + }); + } + + @OnEvent(events.vendors.onEdited) + public handleTrackEditedVendorEvent({}: IVendorEventEditedPayload) { + this.posthog.trackEvent({ + event: VENDOR_EDITED, + properties: {}, + }); + } + + @OnEvent(events.vendors.onDeleted) + public handleTrackDeletedVendorEvent({}: IVendorEventDeletedPayload) { + this.posthog.trackEvent({ + event: VENDOR_DELETED, + properties: {}, + }); + } +} diff --git a/packages/server-nest/src/modules/EventsTracker/postHog.module.ts b/packages/server-nest/src/modules/EventsTracker/postHog.module.ts new file mode 100644 index 000000000..35bbfea73 --- /dev/null +++ b/packages/server-nest/src/modules/EventsTracker/postHog.module.ts @@ -0,0 +1,22 @@ +import { Module } from '@nestjs/common'; +import { PostHog } from 'posthog-node'; +import { EventTrackerService } from './EventTracker.service'; +import { ConfigService } from '@nestjs/config'; + +export const POSTHOG = 'PostHog'; + +@Module({ + providers: [ + EventTrackerService, + { + provide: POSTHOG, + useFactory: (configService: ConfigService) => + new PostHog(configService.get('posthog.apiKey'), { + host: configService.get('posthog.host'), + }), + inject: [ConfigService], + }, + ], + exports: [EventTrackerService], +}) +export class PostHogModule {} diff --git a/packages/server-nest/src/modules/InventoryAdjutments/InventoryAdjustments.module.ts b/packages/server-nest/src/modules/InventoryAdjutments/InventoryAdjustments.module.ts index f62a8386e..e4fbd6925 100644 --- a/packages/server-nest/src/modules/InventoryAdjutments/InventoryAdjustments.module.ts +++ b/packages/server-nest/src/modules/InventoryAdjutments/InventoryAdjustments.module.ts @@ -12,13 +12,15 @@ import { InventoryAdjustmentsController } from './InventoryAdjustments.controlle import { BranchesModule } from '../Branches/Branches.module'; import { WarehousesModule } from '../Warehouses/Warehouses.module'; import { InventoryAdjustmentsGLSubscriber } from './subscribers/InventoryAdjustmentGL.subscriber'; +import { InventoryAdjustmentsGLEntries } from './commands/ledger/InventoryAdjustmentsGLEntries'; +import { LedgerModule } from '../Ledger/Ledger.module'; const models = [ RegisterTenancyModel(InventoryAdjustment), RegisterTenancyModel(InventoryAdjustmentEntry), ]; @Module({ - imports: [BranchesModule, WarehousesModule], + imports: [BranchesModule, WarehousesModule, LedgerModule], controllers: [InventoryAdjustmentsController], providers: [ ...models, @@ -29,6 +31,7 @@ const models = [ DeleteInventoryAdjustmentService, InventoryAdjustmentsApplicationService, InventoryAdjustmentsGLSubscriber, + InventoryAdjustmentsGLEntries, ], exports: [...models], }) diff --git a/packages/server-nest/src/modules/InventoryAdjutments/commands/CreateQuickInventoryAdjustment.service.ts b/packages/server-nest/src/modules/InventoryAdjutments/commands/CreateQuickInventoryAdjustment.service.ts index e8b5ee126..56d74c26f 100644 --- a/packages/server-nest/src/modules/InventoryAdjutments/commands/CreateQuickInventoryAdjustment.service.ts +++ b/packages/server-nest/src/modules/InventoryAdjutments/commands/CreateQuickInventoryAdjustment.service.ts @@ -4,7 +4,6 @@ import * as R from 'ramda'; import { omit } from 'lodash'; import { events } from '@/common/events/events'; import { InventoryAdjustment } from '../models/InventoryAdjustment'; -import { InventoryAdjustmentEntry } from '../models/InventoryAdjustmentEntry'; import { IInventoryAdjustmentCreatingPayload, IInventoryAdjustmentEventCreatedPayload, diff --git a/packages/server-nest/src/modules/InventoryAdjutments/commands/PublishInventoryAdjustment.service.ts b/packages/server-nest/src/modules/InventoryAdjutments/commands/PublishInventoryAdjustment.service.ts index 492c2bd2d..4d1586d12 100644 --- a/packages/server-nest/src/modules/InventoryAdjutments/commands/PublishInventoryAdjustment.service.ts +++ b/packages/server-nest/src/modules/InventoryAdjutments/commands/PublishInventoryAdjustment.service.ts @@ -1,14 +1,13 @@ -import { UnitOfWork } from '@/modules/Tenancy/TenancyDB/UnitOfWork.service'; +import { Knex } from 'knex'; import { Inject } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; +import { UnitOfWork } from '@/modules/Tenancy/TenancyDB/UnitOfWork.service'; import { InventoryAdjustment } from '../models/InventoryAdjustment'; -import { InventoryAdjustmentEntry } from '../models/InventoryAdjustmentEntry'; import { IInventoryAdjustmentEventPublishedPayload, IInventoryAdjustmentPublishingPayload, } from '../types/InventoryAdjustments.types'; import { events } from '@/common/events/events'; -import { Knex } from 'knex'; import { ServiceError } from '@/modules/Items/ServiceError'; export class PublishInventoryAdjustmentService { @@ -22,8 +21,7 @@ export class PublishInventoryAdjustmentService { /** * Publish the inventory adjustment transaction. - * @param {number} tenantId - * @param {number} inventoryAdjustmentId + * @param {number} inventoryAdjustmentId - Inventory adjustment ID. */ public async publishInventoryAdjustment( inventoryAdjustmentId: number, diff --git a/packages/server-nest/src/modules/InventoryAdjutments/commands/ledger/InventoryAdjustmentGL.ts b/packages/server-nest/src/modules/InventoryAdjutments/commands/ledger/InventoryAdjustmentGL.ts index 9b5dd3990..3752a13e9 100644 --- a/packages/server-nest/src/modules/InventoryAdjutments/commands/ledger/InventoryAdjustmentGL.ts +++ b/packages/server-nest/src/modules/InventoryAdjutments/commands/ledger/InventoryAdjustmentGL.ts @@ -13,7 +13,12 @@ export class InventoryAdjustmentsGL { this.inventoryAdjustment = inventoryAdjustmentModel; } - setBaseCurrency(baseCurrency: string) { + /** + * Sets the base currency. + * @param {string} baseCurrency - Base currency. + * @returns {InventoryAdjustmentsGL} + */ + public setBaseCurrency(baseCurrency: string) { this.baseCurrency = baseCurrency; return this; } diff --git a/packages/server-nest/src/modules/InventoryAdjutments/constants/InventoryAdjustments.constants.ts b/packages/server-nest/src/modules/InventoryAdjutments/constants/InventoryAdjustments.constants.ts new file mode 100644 index 000000000..a3f59e428 --- /dev/null +++ b/packages/server-nest/src/modules/InventoryAdjutments/constants/InventoryAdjustments.constants.ts @@ -0,0 +1,6 @@ +const ERRORS = { + INVENTORY_ADJUSTMENT_NOT_FOUND: 'INVENTORY_ADJUSTMENT_NOT_FOUND', + ITEM_SHOULD_BE_INVENTORY_TYPE: 'ITEM_SHOULD_BE_INVENTORY_TYPE', + INVENTORY_ADJUSTMENT_ALREADY_PUBLISHED: + 'INVENTORY_ADJUSTMENT_ALREADY_PUBLISHED', +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03dd11e4d..0ea247aac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -622,6 +622,9 @@ importers: plaid: specifier: ^10.3.0 version: 10.9.0 + posthog-node: + specifier: ^4.2.0 + version: 4.2.0 pug: specifier: ^3.0.2 version: 3.0.2