From 1956e62697ccd420ed0a5a78914dc27f2979f6a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Mon, 15 Jun 2026 12:36:04 -0300 Subject: [PATCH] Show RFM as customer snapshot --- backend/services/analyticsService.js | 28 +++++++++++++-------------- backend/test/analyticsService.test.js | 3 +++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/backend/services/analyticsService.js b/backend/services/analyticsService.js index 8b25cba..470cf5f 100644 --- a/backend/services/analyticsService.js +++ b/backend/services/analyticsService.js @@ -292,7 +292,13 @@ const getRfmAnalytics = async (range = {}) => { `, historyParams) ]); - const historyClients = buildRfmClients(historyResult.rows.map(row => ({ + const periodByPhone = new Map(periodResult.rows.map(row => [row.phone, { + monetary: toNumber(row.monetary), + frequency: toNumber(row.frequency), + quantityPurchased: toNumber(row.quantity_purchased) + }])); + + const clients = buildRfmClients(historyResult.rows.map(row => ({ name: row.name, phone: row.phone, monetary: toNumber(row.monetary), @@ -300,22 +306,16 @@ const getRfmAnalytics = async (range = {}) => { quantityPurchased: toNumber(row.quantity_purchased), lastPurchaseDate: row.last_purchase_date, recencyDays: toNumber(row.recency_days) - }))); - const rfmByPhone = new Map(historyClients.map(client => [client.phone, client])); - - const clients = periodResult.rows.map(row => { - const rfmClient = rfmByPhone.get(row.phone); + }))).map(client => { + const periodClient = periodByPhone.get(client.phone); return { - ...rfmClient, - name: row.name, - phone: row.phone, - monetary: toNumber(row.monetary), - frequency: toNumber(row.frequency), - quantityPurchased: toNumber(row.quantity_purchased), - lastPurchaseDate: row.last_purchase_date + ...client, + monetary: periodClient?.monetary || 0, + frequency: periodClient?.frequency || 0, + quantityPurchased: periodClient?.quantityPurchased || 0 }; - }).filter(client => client.segmentKey).sort((a, b) => { + }).sort((a, b) => { if (b.recencyScore !== a.recencyScore) return b.recencyScore - a.recencyScore; if (b.valueScore !== a.valueScore) return b.valueScore - a.valueScore; return b.monetary - a.monetary; diff --git a/backend/test/analyticsService.test.js b/backend/test/analyticsService.test.js index 77cba25..af3695a 100644 --- a/backend/test/analyticsService.test.js +++ b/backend/test/analyticsService.test.js @@ -256,6 +256,9 @@ test('getRfmAnalytics calculates recency against selected range end date', async assert.equal(yesterday.clients[0].recencyDays, 0); assert.equal(yesterday.clients[0].frequency, 1); assert.equal(yesterday.clients[0].monetary, 100); + assert.equal(yesterday.clients.length, 3); + assert.ok(yesterday.clients.some(client => client.recencyScore === 1)); + assert.ok(yesterday.clients.some(client => client.phone === '2' && client.monetary === 0 && client.frequency === 0)); } finally { pool.query = originalQuery; }