diff --git a/src/app/api/core/types/webhook.ts b/src/app/api/core/types/webhook.ts index 8cd9b58..03e9169 100644 --- a/src/app/api/core/types/webhook.ts +++ b/src/app/api/core/types/webhook.ts @@ -6,4 +6,5 @@ export enum WebhookEvents { INVOICE_PAID = 'invoice.paid', INVOICE_VOIDED = 'invoice.voided', PAYMENT_SUCCEEDED = 'payment.succeeded', + INVOICE_SENT = 'invoice.sent', } diff --git a/src/app/api/quickbooks/webhook/webhook.service.ts b/src/app/api/quickbooks/webhook/webhook.service.ts index 2924a53..e94768a 100644 --- a/src/app/api/quickbooks/webhook/webhook.service.ts +++ b/src/app/api/quickbooks/webhook/webhook.service.ts @@ -91,6 +91,9 @@ export class WebhookService extends BaseService { case WebhookEvents.PAYMENT_SUCCEEDED: return await this.handlePaymentSucceeded(payload, qbTokenInfo) + case WebhookEvents.INVOICE_SENT: + return await this.handleInvoiceSent(payload, qbTokenInfo) + default: console.error('WebhookService#handleWebhookEvent | Unknown event type') } @@ -376,6 +379,38 @@ export class WebhookService extends BaseService { } } + private async handleInvoiceSent( + payload: unknown, + qbTokenInfo: IntuitAPITokensType, + ) { + console.info('###### INVOICE SENT ######') + const parsedPayload = InvoiceCreatedResponseSchema.safeParse(payload) + if (!parsedPayload.success || !parsedPayload.data) { + console.error( + 'WebhookService#handleInvoiceSent | Could not parse invoice response', + ) + return + } + const parsedInvoiceResource = parsedPayload.data + + try { + validateAccessToken(qbTokenInfo) + const invoiceService = new InvoiceService(this.user) + await invoiceService.webhookInvoiceCreated(parsedInvoiceResource, qbTokenInfo) + } catch (error: unknown) { + await this.pushFailedInvoiceToSyncLog( + EventType.CREATED, + parsedInvoiceResource.data.id, + parsedInvoiceResource.data.number, + parsedInvoiceResource.data.total, + getMessageAndCodeFromError(error), + ) + console.error( + `WebhookService#handleInvoiceSent :: Error | Portal Id: ${this.user.workspaceId} | Invoice: ${parsedInvoiceResource.data.id}`, + ) + } + } + private async handlePaymentSucceeded( payload: unknown, qbTokenInfo: IntuitAPITokensType,