From 52dbc5a109dda0ca6c8fa38c92e11b0a221d96e7 Mon Sep 17 00:00:00 2001 From: Rodrigo Rodriguez Date: Sun, 16 Feb 2025 10:54:42 -0300 Subject: [PATCH] new(whatsapp.gblib): FB Analytics. --- .../dialogs/QualityDialog.ts | 12 +++ .../services/WhatsappDirectLine.ts | 73 +++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts b/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts index c713dac5..722e0dc9 100644 --- a/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts +++ b/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts @@ -55,6 +55,18 @@ export class QualityDialog extends IGBDialog { public static setup(bot: BotAdapter, min: GBMinInstance) { const service = new CSService(); + min.dialogs.add( + new WaterfallDialog('/report', [ + async step => { + const locale = step.context.activity.locale; + await min.conversationalService.sendText(min, step, await min.whatsAppDirectLine.getLatestCampaignReport()); + return await step.replaceDialog('/ask', { isReturning: true }); + } + ]) + ); + + + min.dialogs.add( new WaterfallDialog('/check', [ async step => { diff --git a/packages/whatsapp.gblib/services/WhatsappDirectLine.ts b/packages/whatsapp.gblib/services/WhatsappDirectLine.ts index 8f20b198..0e1d8d0f 100644 --- a/packages/whatsapp.gblib/services/WhatsappDirectLine.ts +++ b/packages/whatsapp.gblib/services/WhatsappDirectLine.ts @@ -1540,4 +1540,77 @@ private async sendButtonList(to: string, buttons: string[]) { return buf; } + public async getLatestCampaignReport() { + const businessAccountId = this.whatsappBusinessManagerId; + const userAccessToken = this.whatsappServiceKey; + + if (!(businessAccountId && userAccessToken)){ + return 'No report for campaigns.'; + } + + let campaignData; + + try { + // Step 1: Fetch the latest campaign data + const campaignResponse = await fetch( + `https://graph.facebook.com/v20.0/${businessAccountId}/message_campaigns?` + + `fields=id,name,status,message_template_name,language,` + + `scheduled_time,completed_time,audience_size,delivered_count,read_count&` + + `limit=1&order=created_time_desc`, { + headers: { + Authorization: `Bearer ${userAccessToken}` + } + }); + + const data = await campaignResponse.json(); + if (!campaignResponse.ok) { + throw new Error(data.error.message); + } + + if (!data.data || data.data.length === 0) { + throw new Error('No campaigns found'); + } + + campaignData = data.data[0]; + console.log('Latest campaign retrieved:', campaignData.name); + + // Step 2: Calculate key metrics + const metrics = { + name: campaignData.name, + status: campaignData.status, + template: campaignData.message_template_name, + language: campaignData.language, + timing: campaignData.completed_time || campaignData.scheduled_time, + audience: campaignData.audience_size, + delivered: campaignData.delivered_count, + read: campaignData.read_count, + deliveryRate: ((campaignData.delivered_count / campaignData.audience_size) * 100).toFixed(2), + readRate: ((campaignData.read_count / campaignData.delivered_count) * 100).toFixed(2) + }; + + // Step 3: Format and return the report + return ` +Latest Campaign Summary +---------------------- +Name: ${metrics.name} +Status: ${metrics.status} +Template: ${metrics.template} +Language: ${metrics.language} +Time: ${new Date(metrics.timing).toLocaleString()} + +Metrics +------- +Audience Size: ${metrics.audience.toLocaleString()} +Delivered: ${metrics.delivered.toLocaleString()} +Read: ${metrics.read.toLocaleString()} +Delivery Rate: ${metrics.deliveryRate}% +Read Rate: ${metrics.readRate}% + `.trim(); + + } catch (error) { + console.error('Error fetching campaign data:', error.message); + throw error; + } +} + }