Improve product analytics UI
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m48s

This commit is contained in:
Cauê Faleiros
2026-07-01 10:57:33 -03:00
parent a26bc8813e
commit f5e2de9a35
6 changed files with 417 additions and 76 deletions

View File

@@ -526,24 +526,44 @@ test('getProductDetailsAnalytics returns product identity and period chart witho
rows: [{
id: '919483307',
name: 'BASE LISA CAMISETA COR PRETO TAMANHO - G',
price: 11.9
price: 11.9,
stock: 11731
}]
};
}
if (sql.includes('selected_base AS')) {
assert.match(sql, /COALESCE\(\s+CASE/);
assert.match(sql, /GROUP BY produto_id/);
assert.deepEqual(params, ['919483307', '2026-06-01', '2026-06-22']);
return {
rows: [
{
id: '919483307',
name: 'BASE LISA CAMISETA COR PRETO TAMANHO - G',
quantity_sold: 3,
revenue: 35.7,
order_count: 1
}
]
};
}
return {
rows: [
{
data_pedido_date: '2026-06-01',
date_label: '01-06-2026',
quantity_sold: 3,
revenue: 35.7
revenue: 35.7,
order_count: 1
},
{
data_pedido_date: '2026-06-02',
date_label: '02-06-2026',
quantity_sold: 2,
revenue: 23.8
revenue: 23.8,
order_count: 1
}
]
};
@@ -552,7 +572,7 @@ test('getProductDetailsAnalytics returns product identity and period chart witho
try {
const details = await getProductDetailsAnalytics('919483307', { start: '2026-06-01', end: '2026-06-22' });
assert.equal(calls.length, 2);
assert.equal(calls.length, 3);
assert.match(calls[0].sql, /WITH selected_product AS/);
assert.match(calls[0].sql, /WHERE produto_id = \$1/);
assert.deepEqual(calls[0].params, ['919483307']);
@@ -563,14 +583,26 @@ test('getProductDetailsAnalytics returns product identity and period chart witho
assert.deepEqual(details.productInfo, {
id: '919483307',
name: 'BASE LISA CAMISETA COR PRETO TAMANHO - G',
price: 11.9
price: 11.9,
stock: 11731
});
assert.deepEqual(details.chartData, [
{ date: '01-06-2026', value: 3 },
{ date: '02-06-2026', value: 2 }
{ date: '01-06-2026', value: 3, quantitySold: 3, revenue: 35.7, orderCount: 1, averageTicket: 35.7 },
{ date: '02-06-2026', value: 2, quantitySold: 2, revenue: 23.8, orderCount: 1, averageTicket: 23.8 }
]);
assert.equal(details.totalSold, 5);
assert.equal(details.totalRevenue, 59.5);
assert.equal(details.totalOrders, 2);
assert.equal(details.averageTicket, 29.75);
assert.deepEqual(details.variantBreakdown, [
{
id: '919483307',
name: 'BASE LISA CAMISETA COR PRETO TAMANHO - G',
quantitySold: 3,
revenue: 35.7,
orderCount: 1
}
]);
} finally {
pool.query = originalQuery;
}
@@ -585,7 +617,8 @@ test('getProductDetailsAnalytics keeps known products visible with zero period s
rows: [{
id: 'stock-only',
name: 'Produto sem venda no período',
price: 0
price: 0,
stock: 12
}]
};
}
@@ -600,6 +633,7 @@ test('getProductDetailsAnalytics keeps known products visible with zero period s
assert.equal(details.totalSold, 0);
assert.equal(details.totalRevenue, 0);
assert.deepEqual(details.chartData, []);
assert.deepEqual(details.variantBreakdown, []);
} finally {
pool.query = originalQuery;
}
@@ -614,16 +648,21 @@ test('getProductDetailsAnalytics groups single-day chart by hour', async () => {
rows: [{
id: '919483307',
name: 'Produto com venda por hora',
price: 11.9
price: 11.9,
stock: 4
}]
};
}
if (sql.includes('selected_base AS')) {
return { rows: [] };
}
assert.match(sql, /EXTRACT\(HOUR FROM created_at AT TIME ZONE 'America\/Sao_Paulo'\)::int as hour/);
return {
rows: [
{ hour: 9, quantity_sold: 2, revenue: 23.8 },
{ hour: 18, quantity_sold: 3, revenue: 35.7 }
{ hour: 9, quantity_sold: 2, revenue: 23.8, order_count: 1 },
{ hour: 18, quantity_sold: 3, revenue: 35.7, order_count: 1 }
]
};
};
@@ -632,8 +671,8 @@ test('getProductDetailsAnalytics groups single-day chart by hour', async () => {
const details = await getProductDetailsAnalytics('919483307', { start: '2026-06-22', end: '2026-06-22' });
assert.equal(details.chartData.length, 24);
assert.deepEqual(details.chartData[9], { date: '09h', value: 2 });
assert.deepEqual(details.chartData[18], { date: '18h', value: 3 });
assert.deepEqual(details.chartData[9], { date: '09h', value: 2, quantitySold: 2, revenue: 23.8, orderCount: 1, averageTicket: 23.8 });
assert.deepEqual(details.chartData[18], { date: '18h', value: 3, quantitySold: 3, revenue: 35.7, orderCount: 1, averageTicket: 35.7 });
assert.equal(details.totalSold, 5);
assert.equal(details.totalRevenue, 59.5);
} finally {