From bb299aa595d7ba2771664d87fba7c0be502d3b40 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Sat, 19 Oct 2024 13:38:28 +0200 Subject: [PATCH] feat: Track events of pdf documents views --- packages/server/src/constants/event-tracker.ts | 10 +++++++++- .../services/CreditNotes/GetCreditNotePdf.ts | 12 ++++++++++++ .../events/PaymentReceivedEventsTracker.ts | 15 +++++++++++++++ .../events/SaleEstimateEventsTracker.ts | 15 +++++++++++++++ .../events/SaleInvoicesEventsTracker.ts | 13 +++++++++++++ .../Sales/Estimates/SaleEstimatesPdf.ts | 12 ++++++++++++ .../services/Sales/Invoices/SaleInvoicePdf.ts | 11 +++++++++++ .../PaymentReceived/GetPaymentReceivedPdf.ts | 18 +++++++++++++++--- .../Sales/Receipts/SaleReceiptsPdfService.ts | 12 ++++++++++++ packages/server/src/subscribers/events.ts | 18 ++++++++++++++---- 10 files changed, 128 insertions(+), 8 deletions(-) diff --git a/packages/server/src/constants/event-tracker.ts b/packages/server/src/constants/event-tracker.ts index 88e10c7ef..26e038e4e 100644 --- a/packages/server/src/constants/event-tracker.ts +++ b/packages/server/src/constants/event-tracker.ts @@ -3,14 +3,21 @@ 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_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 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 SALE_RECEIPT_PDF_VIEWED = 'Sale credit PDF viewed'; + +export const CREDIT_NOTE_PDF_VIEWED = 'Credit note PDF viewed'; export const BILL_CREATED = 'Bill created'; export const BILL_EDITED = 'Bill edited'; @@ -82,7 +89,8 @@ 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'; +export const STRIPE_INTEGRAION_CONNECTED = + 'Stripe integration oauth2 connected'; // # Event Groups export const ACCOUNT_GROUP = 'Account'; diff --git a/packages/server/src/services/CreditNotes/GetCreditNotePdf.ts b/packages/server/src/services/CreditNotes/GetCreditNotePdf.ts index c4f22c92b..d4a77c902 100644 --- a/packages/server/src/services/CreditNotes/GetCreditNotePdf.ts +++ b/packages/server/src/services/CreditNotes/GetCreditNotePdf.ts @@ -6,6 +6,8 @@ import { CreditNoteBrandingTemplate } from './CreditNoteBrandingTemplate'; import { CreditNotePdfTemplateAttributes } from '@/interfaces'; import HasTenancyService from '../Tenancy/TenancyService'; import { transformCreditNoteToPdfTemplate } from './utils'; +import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; +import events from '@/subscribers/events'; @Service() export default class GetCreditNotePdf { @@ -24,6 +26,9 @@ export default class GetCreditNotePdf { @Inject() private creditNoteBrandingTemplate: CreditNoteBrandingTemplate; + @Inject() + private eventPublisher: EventPublisher; + /** * Retrieves sale invoice pdf content. * @param {number} tenantId - Tenant id. @@ -49,6 +54,13 @@ export default class GetCreditNotePdf { tenantId, htmlContent ); + const eventPayload = { tenantId, creditNoteId }; + + // Triggers the `onCreditNotePdfViewed` event. + await this.eventPublisher.emitAsync( + events.creditNote.onPdfViewed, + eventPayload + ); return [document, filename]; } diff --git a/packages/server/src/services/EventsTracker/events/PaymentReceivedEventsTracker.ts b/packages/server/src/services/EventsTracker/events/PaymentReceivedEventsTracker.ts index 0a3a87f37..eb6d5dc39 100644 --- a/packages/server/src/services/EventsTracker/events/PaymentReceivedEventsTracker.ts +++ b/packages/server/src/services/EventsTracker/events/PaymentReceivedEventsTracker.ts @@ -11,6 +11,7 @@ import { PAYMENT_RECEIVED_CREATED, PAYMENT_RECEIVED_EDITED, PAYMENT_RECEIVED_DELETED, + PAYMENT_RECEIVED_PDF_VIEWED, } from '@/constants/event-tracker'; @Service() @@ -34,6 +35,10 @@ export class PaymentReceivedEventsTracker extends EventSubscriber { events.paymentReceive.onDeleted, this.handleTrackDeletedPaymentReceivedEvent ); + bus.subscribe( + events.paymentReceive.onPdfViewed, + this.handleTrackPdfViewedPaymentReceivedEvent + ); } private handleTrackPaymentReceivedCreatedEvent = ({ @@ -65,4 +70,14 @@ export class PaymentReceivedEventsTracker extends EventSubscriber { properties: {}, }); }; + + private handleTrackPdfViewedPaymentReceivedEvent = ({ + tenantId, + }: IPaymentReceivedDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: PAYMENT_RECEIVED_PDF_VIEWED, + properties: {}, + }); + }; } diff --git a/packages/server/src/services/EventsTracker/events/SaleEstimateEventsTracker.ts b/packages/server/src/services/EventsTracker/events/SaleEstimateEventsTracker.ts index 469e20c3c..643562248 100644 --- a/packages/server/src/services/EventsTracker/events/SaleEstimateEventsTracker.ts +++ b/packages/server/src/services/EventsTracker/events/SaleEstimateEventsTracker.ts @@ -11,6 +11,7 @@ import { SALE_ESTIMATE_CREATED, SALE_ESTIMATE_EDITED, SALE_ESTIMATE_DELETED, + SALE_ESTIMATE_PDF_VIEWED, } from '@/constants/event-tracker'; @Service() @@ -34,6 +35,10 @@ export class SaleEstimateEventsTracker extends EventSubscriber { events.saleEstimate.onDeleted, this.handleTrackDeletedEstimateEvent ); + bus.subscribe( + events.saleEstimate.onPdfViewed, + this.handleTrackPdfViewedEstimateEvent + ); } private handleTrackEstimateCreatedEvent = ({ @@ -65,4 +70,14 @@ export class SaleEstimateEventsTracker extends EventSubscriber { properties: {}, }); }; + + private handleTrackPdfViewedEstimateEvent = ({ + tenantId, + }: ISaleEstimateDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: SALE_ESTIMATE_PDF_VIEWED, + properties: {}, + }); + }; } diff --git a/packages/server/src/services/EventsTracker/events/SaleInvoicesEventsTracker.ts b/packages/server/src/services/EventsTracker/events/SaleInvoicesEventsTracker.ts index 4a2f638b0..9f3b820d1 100644 --- a/packages/server/src/services/EventsTracker/events/SaleInvoicesEventsTracker.ts +++ b/packages/server/src/services/EventsTracker/events/SaleInvoicesEventsTracker.ts @@ -10,6 +10,7 @@ import { SALE_INVOICE_CREATED, SALE_INVOICE_DELETED, SALE_INVOICE_EDITED, + SALE_INVOICE_PDF_VIEWED, SALE_INVOICE_VIEWED, } from '@/constants/event-tracker'; @@ -38,6 +39,10 @@ export class SaleInvoiceEventsTracker extends EventSubscriber { events.saleInvoice.onViewed, this.handleTrackViewedInvoiceEvent ); + bus.subscribe( + events.saleInvoice.onPdfViewed, + this.handleTrackPdfViewedInvoiceEvent + ); } private handleTrackInvoiceCreatedEvent = ({ @@ -77,4 +82,12 @@ export class SaleInvoiceEventsTracker extends EventSubscriber { properties: {}, }); }; + + private handleTrackPdfViewedInvoiceEvent = ({ tenantId }) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: SALE_INVOICE_PDF_VIEWED, + properties: {}, + }); + }; } diff --git a/packages/server/src/services/Sales/Estimates/SaleEstimatesPdf.ts b/packages/server/src/services/Sales/Estimates/SaleEstimatesPdf.ts index f1a91162d..f0750b43c 100644 --- a/packages/server/src/services/Sales/Estimates/SaleEstimatesPdf.ts +++ b/packages/server/src/services/Sales/Estimates/SaleEstimatesPdf.ts @@ -6,6 +6,8 @@ import HasTenancyService from '@/services/Tenancy/TenancyService'; import { SaleEstimatePdfTemplate } from '../Invoices/SaleEstimatePdfTemplate'; import { transformEstimateToPdfTemplate } from './utils'; import { EstimatePdfBrandingAttributes } from './constants'; +import events from '@/subscribers/events'; +import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; @Service() export class SaleEstimatesPdf { @@ -24,6 +26,9 @@ export class SaleEstimatesPdf { @Inject() private estimatePdfTemplate: SaleEstimatePdfTemplate; + @Inject() + private eventPublisher: EventPublisher; + /** * Retrieve sale invoice pdf content. * @param {number} tenantId - @@ -50,6 +55,13 @@ export class SaleEstimatesPdf { tenantId, htmlContent ); + const eventPayload = { tenantId, saleEstimateId }; + + // Triggers the `onSaleEstimatePdfViewed` event. + await this.eventPublisher.emitAsync( + events.saleEstimate.onPdfViewed, + eventPayload + ); return [content, filename]; } diff --git a/packages/server/src/services/Sales/Invoices/SaleInvoicePdf.ts b/packages/server/src/services/Sales/Invoices/SaleInvoicePdf.ts index 54e8738ef..b7c4e8e14 100644 --- a/packages/server/src/services/Sales/Invoices/SaleInvoicePdf.ts +++ b/packages/server/src/services/Sales/Invoices/SaleInvoicePdf.ts @@ -6,6 +6,8 @@ import HasTenancyService from '@/services/Tenancy/TenancyService'; import { transformInvoiceToPdfTemplate } from './utils'; import { InvoicePdfTemplateAttributes } from '@/interfaces'; import { SaleInvoicePdfTemplate } from './SaleInvoicePdfTemplate'; +import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; +import events from '@/subscribers/events'; @Service() export class SaleInvoicePdf { @@ -24,6 +26,9 @@ export class SaleInvoicePdf { @Inject() private invoiceBrandingTemplateService: SaleInvoicePdfTemplate; + @Inject() + private eventPublisher: EventPublisher; + /** * Retrieve sale invoice pdf content. * @param {number} tenantId - Tenant Id. @@ -50,7 +55,13 @@ export class SaleInvoicePdf { tenantId, htmlContent ); + const eventPayload = { tenantId, saleInvoiceId: invoiceId }; + // Triggers the `onSaleInvoicePdfViewed` event. + await this.eventPublisher.emitAsync( + events.saleInvoice.onPdfViewed, + eventPayload + ); return [buffer, filename]; } diff --git a/packages/server/src/services/Sales/PaymentReceived/GetPaymentReceivedPdf.ts b/packages/server/src/services/Sales/PaymentReceived/GetPaymentReceivedPdf.ts index 5ee761f2f..ed88b7ebf 100644 --- a/packages/server/src/services/Sales/PaymentReceived/GetPaymentReceivedPdf.ts +++ b/packages/server/src/services/Sales/PaymentReceived/GetPaymentReceivedPdf.ts @@ -6,6 +6,8 @@ import HasTenancyService from '@/services/Tenancy/TenancyService'; import { PaymentReceivedBrandingTemplate } from './PaymentReceivedBrandingTemplate'; import { transformPaymentReceivedToPdfTemplate } from './utils'; import { PaymentReceivedPdfTemplateAttributes } from '@/interfaces'; +import events from '@/subscribers/events'; +import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; @Service() export default class GetPaymentReceivedPdf { @@ -24,6 +26,9 @@ export default class GetPaymentReceivedPdf { @Inject() private paymentBrandingTemplateService: PaymentReceivedBrandingTemplate; + @Inject() + private eventPublisher: EventPublisher; + /** * Retrieve sale invoice pdf content. * @param {number} tenantId - @@ -32,11 +37,11 @@ export default class GetPaymentReceivedPdf { */ async getPaymentReceivePdf( tenantId: number, - paymentReceiveId: number + paymentReceivedId: number ): Promise<[Buffer, string]> { const brandingAttributes = await this.getPaymentBrandingAttributes( tenantId, - paymentReceiveId + paymentReceivedId ); const htmlContent = await this.templateInjectable.render( tenantId, @@ -45,13 +50,20 @@ export default class GetPaymentReceivedPdf { ); const filename = await this.getPaymentReceivedFilename( tenantId, - paymentReceiveId + paymentReceivedId ); // Converts the given html content to pdf document. const content = await this.chromiumlyTenancy.convertHtmlContent( tenantId, htmlContent ); + const eventPayload = { tenantId, paymentReceivedId }; + + // Triggers the `onCreditNotePdfViewed` event. + await this.eventPublisher.emitAsync( + events.paymentReceive.onPdfViewed, + eventPayload + ); return [content, filename]; } diff --git a/packages/server/src/services/Sales/Receipts/SaleReceiptsPdfService.ts b/packages/server/src/services/Sales/Receipts/SaleReceiptsPdfService.ts index dface4166..3ea9f7566 100644 --- a/packages/server/src/services/Sales/Receipts/SaleReceiptsPdfService.ts +++ b/packages/server/src/services/Sales/Receipts/SaleReceiptsPdfService.ts @@ -6,6 +6,8 @@ import HasTenancyService from '@/services/Tenancy/TenancyService'; import { SaleReceiptBrandingTemplate } from './SaleReceiptBrandingTemplate'; import { transformReceiptToBrandingTemplateAttributes } from './utils'; import { ISaleReceiptBrandingTemplateAttributes } from '@/interfaces'; +import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; +import events from '@/subscribers/events'; @Service() export class SaleReceiptsPdf { @@ -24,6 +26,9 @@ export class SaleReceiptsPdf { @Inject() private saleReceiptBrandingTemplate: SaleReceiptBrandingTemplate; + @Inject() + private eventPublisher: EventPublisher; + /** * Retrieves sale invoice pdf content. * @param {number} tenantId - @@ -48,6 +53,13 @@ export class SaleReceiptsPdf { tenantId, htmlContent ); + const eventPayload = { tenantId, saleReceiptId }; + + // Triggers the `onSaleReceiptPdfViewed` event. + await this.eventPublisher.emitAsync( + events.saleReceipt.onPdfViewed, + eventPayload + ); return [content, filename]; } diff --git a/packages/server/src/subscribers/events.ts b/packages/server/src/subscribers/events.ts index b5f5e740c..7d7eb95d7 100644 --- a/packages/server/src/subscribers/events.ts +++ b/packages/server/src/subscribers/events.ts @@ -133,6 +133,8 @@ export default { onViewed: 'onSaleInvoiceItemViewed', onListViewed: 'onSaleInvoiceListViewed', + onPdfViewed: 'onSaleInvoicePdfViewed', + onCreate: 'onSaleInvoiceCreate', onCreating: 'onSaleInvoiceCreating', onCreated: 'onSaleInvoiceCreated', @@ -178,6 +180,8 @@ export default { * Sales estimates service. */ saleEstimate: { + onPdfViewed: 'onSaleEstimatePdfViewed', + onCreating: 'onSaleEstimateCreating', onCreated: 'onSaleEstimateCreated', @@ -215,6 +219,8 @@ export default { * Sales receipts service. */ saleReceipt: { + onPdfViewed: 'onSaleReceiptPdfViewed', + onCreating: 'onSaleReceiptsCreating', onCreated: 'onSaleReceiptsCreated', @@ -242,6 +248,8 @@ export default { * Payment receipts service. */ paymentReceive: { + onPdfViewed: 'onPaymentReceivedPdfViewed', + onCreated: 'onPaymentReceiveCreated', onCreating: 'onPaymentReceiveCreating', @@ -345,7 +353,7 @@ export default { */ item: { onViewed: 'onItemViewed', - + onCreated: 'onItemCreated', onCreating: 'onItemCreating', @@ -464,6 +472,8 @@ export default { * Credit note service. */ creditNote: { + onPdfViewed: 'onCreditNotePdfViewed', + onCreate: 'onCreditNoteCreate', onCreating: 'onCreditNoteCreating', onCreated: 'onCreditNoteCreated', @@ -722,7 +732,7 @@ export default { // Payment methods integrations paymentIntegrationLink: { onPaymentIntegrationLink: 'onPaymentIntegrationLink', - onPaymentIntegrationDeleteLink: 'onPaymentIntegrationDeleteLink' + onPaymentIntegrationDeleteLink: 'onPaymentIntegrationDeleteLink', }, // Stripe Payment Integration @@ -739,6 +749,6 @@ export default { // Stripe Payment Webhooks stripeWebhooks: { onCheckoutSessionCompleted: 'onStripeCheckoutSessionCompleted', - onAccountUpdated: 'onStripeAccountUpdated' - } + onAccountUpdated: 'onStripeAccountUpdated', + }, };