Merge pull request #719 from bigcapitalhq/track-pdf-documents-views-events

feat: Track events of pdf documents views
This commit is contained in:
Ahmed Bouhuolia
2024-10-19 13:40:18 +02:00
committed by GitHub
10 changed files with 128 additions and 8 deletions

View File

@@ -3,14 +3,21 @@ export const SALE_INVOICE_EDITED = 'Sale invoice edited';
export const SALE_INVOICE_DELETED = 'Sale invoice deleted'; export const SALE_INVOICE_DELETED = 'Sale invoice deleted';
export const SALE_INVOICE_MAIL_DELIVERED = 'Sale invoice mail delivered'; export const SALE_INVOICE_MAIL_DELIVERED = 'Sale invoice mail delivered';
export const SALE_INVOICE_VIEWED = 'Sale invoice viewed'; 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_CREATED = 'Sale estimate created';
export const SALE_ESTIMATE_EDITED = 'Sale estimate edited'; export const SALE_ESTIMATE_EDITED = 'Sale estimate edited';
export const SALE_ESTIMATE_DELETED = 'Sale estimate deleted'; 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_CREATED = 'Payment received created';
export const PAYMENT_RECEIVED_EDITED = 'payment received edited'; export const PAYMENT_RECEIVED_EDITED = 'payment received edited';
export const PAYMENT_RECEIVED_DELETED = 'Payment received deleted'; 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_CREATED = 'Bill created';
export const BILL_EDITED = 'Bill edited'; 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 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 // # Event Groups
export const ACCOUNT_GROUP = 'Account'; export const ACCOUNT_GROUP = 'Account';

View File

@@ -6,6 +6,8 @@ import { CreditNoteBrandingTemplate } from './CreditNoteBrandingTemplate';
import { CreditNotePdfTemplateAttributes } from '@/interfaces'; import { CreditNotePdfTemplateAttributes } from '@/interfaces';
import HasTenancyService from '../Tenancy/TenancyService'; import HasTenancyService from '../Tenancy/TenancyService';
import { transformCreditNoteToPdfTemplate } from './utils'; import { transformCreditNoteToPdfTemplate } from './utils';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
import events from '@/subscribers/events';
@Service() @Service()
export default class GetCreditNotePdf { export default class GetCreditNotePdf {
@@ -24,6 +26,9 @@ export default class GetCreditNotePdf {
@Inject() @Inject()
private creditNoteBrandingTemplate: CreditNoteBrandingTemplate; private creditNoteBrandingTemplate: CreditNoteBrandingTemplate;
@Inject()
private eventPublisher: EventPublisher;
/** /**
* Retrieves sale invoice pdf content. * Retrieves sale invoice pdf content.
* @param {number} tenantId - Tenant id. * @param {number} tenantId - Tenant id.
@@ -49,6 +54,13 @@ export default class GetCreditNotePdf {
tenantId, tenantId,
htmlContent htmlContent
); );
const eventPayload = { tenantId, creditNoteId };
// Triggers the `onCreditNotePdfViewed` event.
await this.eventPublisher.emitAsync(
events.creditNote.onPdfViewed,
eventPayload
);
return [document, filename]; return [document, filename];
} }

View File

@@ -11,6 +11,7 @@ import {
PAYMENT_RECEIVED_CREATED, PAYMENT_RECEIVED_CREATED,
PAYMENT_RECEIVED_EDITED, PAYMENT_RECEIVED_EDITED,
PAYMENT_RECEIVED_DELETED, PAYMENT_RECEIVED_DELETED,
PAYMENT_RECEIVED_PDF_VIEWED,
} from '@/constants/event-tracker'; } from '@/constants/event-tracker';
@Service() @Service()
@@ -34,6 +35,10 @@ export class PaymentReceivedEventsTracker extends EventSubscriber {
events.paymentReceive.onDeleted, events.paymentReceive.onDeleted,
this.handleTrackDeletedPaymentReceivedEvent this.handleTrackDeletedPaymentReceivedEvent
); );
bus.subscribe(
events.paymentReceive.onPdfViewed,
this.handleTrackPdfViewedPaymentReceivedEvent
);
} }
private handleTrackPaymentReceivedCreatedEvent = ({ private handleTrackPaymentReceivedCreatedEvent = ({
@@ -65,4 +70,14 @@ export class PaymentReceivedEventsTracker extends EventSubscriber {
properties: {}, properties: {},
}); });
}; };
private handleTrackPdfViewedPaymentReceivedEvent = ({
tenantId,
}: IPaymentReceivedDeletedPayload) => {
this.posthog.trackEvent({
distinctId: `tenant-${tenantId}`,
event: PAYMENT_RECEIVED_PDF_VIEWED,
properties: {},
});
};
} }

View File

@@ -11,6 +11,7 @@ import {
SALE_ESTIMATE_CREATED, SALE_ESTIMATE_CREATED,
SALE_ESTIMATE_EDITED, SALE_ESTIMATE_EDITED,
SALE_ESTIMATE_DELETED, SALE_ESTIMATE_DELETED,
SALE_ESTIMATE_PDF_VIEWED,
} from '@/constants/event-tracker'; } from '@/constants/event-tracker';
@Service() @Service()
@@ -34,6 +35,10 @@ export class SaleEstimateEventsTracker extends EventSubscriber {
events.saleEstimate.onDeleted, events.saleEstimate.onDeleted,
this.handleTrackDeletedEstimateEvent this.handleTrackDeletedEstimateEvent
); );
bus.subscribe(
events.saleEstimate.onPdfViewed,
this.handleTrackPdfViewedEstimateEvent
);
} }
private handleTrackEstimateCreatedEvent = ({ private handleTrackEstimateCreatedEvent = ({
@@ -65,4 +70,14 @@ export class SaleEstimateEventsTracker extends EventSubscriber {
properties: {}, properties: {},
}); });
}; };
private handleTrackPdfViewedEstimateEvent = ({
tenantId,
}: ISaleEstimateDeletedPayload) => {
this.posthog.trackEvent({
distinctId: `tenant-${tenantId}`,
event: SALE_ESTIMATE_PDF_VIEWED,
properties: {},
});
};
} }

View File

@@ -10,6 +10,7 @@ import {
SALE_INVOICE_CREATED, SALE_INVOICE_CREATED,
SALE_INVOICE_DELETED, SALE_INVOICE_DELETED,
SALE_INVOICE_EDITED, SALE_INVOICE_EDITED,
SALE_INVOICE_PDF_VIEWED,
SALE_INVOICE_VIEWED, SALE_INVOICE_VIEWED,
} from '@/constants/event-tracker'; } from '@/constants/event-tracker';
@@ -38,6 +39,10 @@ export class SaleInvoiceEventsTracker extends EventSubscriber {
events.saleInvoice.onViewed, events.saleInvoice.onViewed,
this.handleTrackViewedInvoiceEvent this.handleTrackViewedInvoiceEvent
); );
bus.subscribe(
events.saleInvoice.onPdfViewed,
this.handleTrackPdfViewedInvoiceEvent
);
} }
private handleTrackInvoiceCreatedEvent = ({ private handleTrackInvoiceCreatedEvent = ({
@@ -77,4 +82,12 @@ export class SaleInvoiceEventsTracker extends EventSubscriber {
properties: {}, properties: {},
}); });
}; };
private handleTrackPdfViewedInvoiceEvent = ({ tenantId }) => {
this.posthog.trackEvent({
distinctId: `tenant-${tenantId}`,
event: SALE_INVOICE_PDF_VIEWED,
properties: {},
});
};
} }

View File

@@ -6,6 +6,8 @@ import HasTenancyService from '@/services/Tenancy/TenancyService';
import { SaleEstimatePdfTemplate } from '../Invoices/SaleEstimatePdfTemplate'; import { SaleEstimatePdfTemplate } from '../Invoices/SaleEstimatePdfTemplate';
import { transformEstimateToPdfTemplate } from './utils'; import { transformEstimateToPdfTemplate } from './utils';
import { EstimatePdfBrandingAttributes } from './constants'; import { EstimatePdfBrandingAttributes } from './constants';
import events from '@/subscribers/events';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
@Service() @Service()
export class SaleEstimatesPdf { export class SaleEstimatesPdf {
@@ -24,6 +26,9 @@ export class SaleEstimatesPdf {
@Inject() @Inject()
private estimatePdfTemplate: SaleEstimatePdfTemplate; private estimatePdfTemplate: SaleEstimatePdfTemplate;
@Inject()
private eventPublisher: EventPublisher;
/** /**
* Retrieve sale invoice pdf content. * Retrieve sale invoice pdf content.
* @param {number} tenantId - * @param {number} tenantId -
@@ -50,6 +55,13 @@ export class SaleEstimatesPdf {
tenantId, tenantId,
htmlContent htmlContent
); );
const eventPayload = { tenantId, saleEstimateId };
// Triggers the `onSaleEstimatePdfViewed` event.
await this.eventPublisher.emitAsync(
events.saleEstimate.onPdfViewed,
eventPayload
);
return [content, filename]; return [content, filename];
} }

View File

@@ -6,6 +6,8 @@ import HasTenancyService from '@/services/Tenancy/TenancyService';
import { transformInvoiceToPdfTemplate } from './utils'; import { transformInvoiceToPdfTemplate } from './utils';
import { InvoicePdfTemplateAttributes } from '@/interfaces'; import { InvoicePdfTemplateAttributes } from '@/interfaces';
import { SaleInvoicePdfTemplate } from './SaleInvoicePdfTemplate'; import { SaleInvoicePdfTemplate } from './SaleInvoicePdfTemplate';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
import events from '@/subscribers/events';
@Service() @Service()
export class SaleInvoicePdf { export class SaleInvoicePdf {
@@ -24,6 +26,9 @@ export class SaleInvoicePdf {
@Inject() @Inject()
private invoiceBrandingTemplateService: SaleInvoicePdfTemplate; private invoiceBrandingTemplateService: SaleInvoicePdfTemplate;
@Inject()
private eventPublisher: EventPublisher;
/** /**
* Retrieve sale invoice pdf content. * Retrieve sale invoice pdf content.
* @param {number} tenantId - Tenant Id. * @param {number} tenantId - Tenant Id.
@@ -50,7 +55,13 @@ export class SaleInvoicePdf {
tenantId, tenantId,
htmlContent htmlContent
); );
const eventPayload = { tenantId, saleInvoiceId: invoiceId };
// Triggers the `onSaleInvoicePdfViewed` event.
await this.eventPublisher.emitAsync(
events.saleInvoice.onPdfViewed,
eventPayload
);
return [buffer, filename]; return [buffer, filename];
} }

View File

@@ -6,6 +6,8 @@ import HasTenancyService from '@/services/Tenancy/TenancyService';
import { PaymentReceivedBrandingTemplate } from './PaymentReceivedBrandingTemplate'; import { PaymentReceivedBrandingTemplate } from './PaymentReceivedBrandingTemplate';
import { transformPaymentReceivedToPdfTemplate } from './utils'; import { transformPaymentReceivedToPdfTemplate } from './utils';
import { PaymentReceivedPdfTemplateAttributes } from '@/interfaces'; import { PaymentReceivedPdfTemplateAttributes } from '@/interfaces';
import events from '@/subscribers/events';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
@Service() @Service()
export default class GetPaymentReceivedPdf { export default class GetPaymentReceivedPdf {
@@ -24,6 +26,9 @@ export default class GetPaymentReceivedPdf {
@Inject() @Inject()
private paymentBrandingTemplateService: PaymentReceivedBrandingTemplate; private paymentBrandingTemplateService: PaymentReceivedBrandingTemplate;
@Inject()
private eventPublisher: EventPublisher;
/** /**
* Retrieve sale invoice pdf content. * Retrieve sale invoice pdf content.
* @param {number} tenantId - * @param {number} tenantId -
@@ -32,11 +37,11 @@ export default class GetPaymentReceivedPdf {
*/ */
async getPaymentReceivePdf( async getPaymentReceivePdf(
tenantId: number, tenantId: number,
paymentReceiveId: number paymentReceivedId: number
): Promise<[Buffer, string]> { ): Promise<[Buffer, string]> {
const brandingAttributes = await this.getPaymentBrandingAttributes( const brandingAttributes = await this.getPaymentBrandingAttributes(
tenantId, tenantId,
paymentReceiveId paymentReceivedId
); );
const htmlContent = await this.templateInjectable.render( const htmlContent = await this.templateInjectable.render(
tenantId, tenantId,
@@ -45,13 +50,20 @@ export default class GetPaymentReceivedPdf {
); );
const filename = await this.getPaymentReceivedFilename( const filename = await this.getPaymentReceivedFilename(
tenantId, tenantId,
paymentReceiveId paymentReceivedId
); );
// Converts the given html content to pdf document. // Converts the given html content to pdf document.
const content = await this.chromiumlyTenancy.convertHtmlContent( const content = await this.chromiumlyTenancy.convertHtmlContent(
tenantId, tenantId,
htmlContent htmlContent
); );
const eventPayload = { tenantId, paymentReceivedId };
// Triggers the `onCreditNotePdfViewed` event.
await this.eventPublisher.emitAsync(
events.paymentReceive.onPdfViewed,
eventPayload
);
return [content, filename]; return [content, filename];
} }

View File

@@ -6,6 +6,8 @@ import HasTenancyService from '@/services/Tenancy/TenancyService';
import { SaleReceiptBrandingTemplate } from './SaleReceiptBrandingTemplate'; import { SaleReceiptBrandingTemplate } from './SaleReceiptBrandingTemplate';
import { transformReceiptToBrandingTemplateAttributes } from './utils'; import { transformReceiptToBrandingTemplateAttributes } from './utils';
import { ISaleReceiptBrandingTemplateAttributes } from '@/interfaces'; import { ISaleReceiptBrandingTemplateAttributes } from '@/interfaces';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
import events from '@/subscribers/events';
@Service() @Service()
export class SaleReceiptsPdf { export class SaleReceiptsPdf {
@@ -24,6 +26,9 @@ export class SaleReceiptsPdf {
@Inject() @Inject()
private saleReceiptBrandingTemplate: SaleReceiptBrandingTemplate; private saleReceiptBrandingTemplate: SaleReceiptBrandingTemplate;
@Inject()
private eventPublisher: EventPublisher;
/** /**
* Retrieves sale invoice pdf content. * Retrieves sale invoice pdf content.
* @param {number} tenantId - * @param {number} tenantId -
@@ -48,6 +53,13 @@ export class SaleReceiptsPdf {
tenantId, tenantId,
htmlContent htmlContent
); );
const eventPayload = { tenantId, saleReceiptId };
// Triggers the `onSaleReceiptPdfViewed` event.
await this.eventPublisher.emitAsync(
events.saleReceipt.onPdfViewed,
eventPayload
);
return [content, filename]; return [content, filename];
} }

View File

@@ -133,6 +133,8 @@ export default {
onViewed: 'onSaleInvoiceItemViewed', onViewed: 'onSaleInvoiceItemViewed',
onListViewed: 'onSaleInvoiceListViewed', onListViewed: 'onSaleInvoiceListViewed',
onPdfViewed: 'onSaleInvoicePdfViewed',
onCreate: 'onSaleInvoiceCreate', onCreate: 'onSaleInvoiceCreate',
onCreating: 'onSaleInvoiceCreating', onCreating: 'onSaleInvoiceCreating',
onCreated: 'onSaleInvoiceCreated', onCreated: 'onSaleInvoiceCreated',
@@ -178,6 +180,8 @@ export default {
* Sales estimates service. * Sales estimates service.
*/ */
saleEstimate: { saleEstimate: {
onPdfViewed: 'onSaleEstimatePdfViewed',
onCreating: 'onSaleEstimateCreating', onCreating: 'onSaleEstimateCreating',
onCreated: 'onSaleEstimateCreated', onCreated: 'onSaleEstimateCreated',
@@ -215,6 +219,8 @@ export default {
* Sales receipts service. * Sales receipts service.
*/ */
saleReceipt: { saleReceipt: {
onPdfViewed: 'onSaleReceiptPdfViewed',
onCreating: 'onSaleReceiptsCreating', onCreating: 'onSaleReceiptsCreating',
onCreated: 'onSaleReceiptsCreated', onCreated: 'onSaleReceiptsCreated',
@@ -242,6 +248,8 @@ export default {
* Payment receipts service. * Payment receipts service.
*/ */
paymentReceive: { paymentReceive: {
onPdfViewed: 'onPaymentReceivedPdfViewed',
onCreated: 'onPaymentReceiveCreated', onCreated: 'onPaymentReceiveCreated',
onCreating: 'onPaymentReceiveCreating', onCreating: 'onPaymentReceiveCreating',
@@ -464,6 +472,8 @@ export default {
* Credit note service. * Credit note service.
*/ */
creditNote: { creditNote: {
onPdfViewed: 'onCreditNotePdfViewed',
onCreate: 'onCreditNoteCreate', onCreate: 'onCreditNoteCreate',
onCreating: 'onCreditNoteCreating', onCreating: 'onCreditNoteCreating',
onCreated: 'onCreditNoteCreated', onCreated: 'onCreditNoteCreated',
@@ -722,7 +732,7 @@ export default {
// Payment methods integrations // Payment methods integrations
paymentIntegrationLink: { paymentIntegrationLink: {
onPaymentIntegrationLink: 'onPaymentIntegrationLink', onPaymentIntegrationLink: 'onPaymentIntegrationLink',
onPaymentIntegrationDeleteLink: 'onPaymentIntegrationDeleteLink' onPaymentIntegrationDeleteLink: 'onPaymentIntegrationDeleteLink',
}, },
// Stripe Payment Integration // Stripe Payment Integration
@@ -739,6 +749,6 @@ export default {
// Stripe Payment Webhooks // Stripe Payment Webhooks
stripeWebhooks: { stripeWebhooks: {
onCheckoutSessionCompleted: 'onStripeCheckoutSessionCompleted', onCheckoutSessionCompleted: 'onStripeCheckoutSessionCompleted',
onAccountUpdated: 'onStripeAccountUpdated' onAccountUpdated: 'onStripeAccountUpdated',
} },
}; };