Fix client detail customer identity
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m17s

This commit is contained in:
Cauê Faleiros
2026-06-18 16:31:22 -03:00
parent 1af624aa77
commit c35f8f8a51
8 changed files with 173 additions and 36 deletions

View File

@@ -0,0 +1,119 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import type { DateRange, OrderData } from '../types.ts';
import { buildClientDetailsMetrics } from './clients.ts';
const allPeriod: DateRange = {
start: new Date(2000, 0, 1),
end: new Date(2026, 5, 18, 23, 59, 59, 999)
};
const order = (overrides: Partial<OrderData>): OrderData => ({
Nome_Cliente: 'Cliente',
Data_Pedido: '01-06-2026',
Valor_Pedido: 0,
ID_Produto: '1',
Descricao_Produto: 'Produto',
Quantidade: 1,
Valor_Unitario: 10,
ID_Pedido: 'pedido',
Fone_Cliente: '',
...overrides
});
test('client details do not merge different phone keys that share the same name', () => {
const orders = [
order({
Nome_Cliente: 'Leonardo Barbosa',
Fone_Cliente: '111',
ID_Pedido: 'pedido-1',
Quantidade: 2,
Valor_Unitario: 10
}),
order({
Nome_Cliente: 'Leonardo Barbosa',
Fone_Cliente: '222',
ID_Pedido: 'pedido-2',
Quantidade: 5,
Valor_Unitario: 10
})
];
const metrics = buildClientDetailsMetrics(orders, '111', allPeriod);
assert.equal(metrics.periodOrderCount, 1);
assert.equal(metrics.periodItems, 2);
assert.equal(metrics.periodSpent, 20);
assert.equal(metrics.clientPhone, '111');
});
test('legacy name detail URLs reject ambiguous names instead of merging customers', () => {
const orders = [
order({
Nome_Cliente: 'Leonardo Barbosa',
Fone_Cliente: '111',
ID_Pedido: 'pedido-1'
}),
order({
Nome_Cliente: 'Leonardo Barbosa',
Fone_Cliente: '222',
ID_Pedido: 'pedido-2'
})
];
const metrics = buildClientDetailsMetrics(orders, 'Leonardo Barbosa', allPeriod);
assert.equal(metrics.hasClient, false);
assert.equal(metrics.periodOrderCount, 0);
assert.equal(metrics.periodItems, 0);
});
test('client details merge name variations that share the same phone key', () => {
const orders = [
order({
Nome_Cliente: 'Jose de Matos Dreher',
Fone_Cliente: '333',
ID_Pedido: 'pedido-1',
Valor_Unitario: 10
}),
order({
Nome_Cliente: 'José Matos',
Fone_Cliente: '333',
ID_Pedido: 'pedido-2',
Valor_Unitario: 20
})
];
const metrics = buildClientDetailsMetrics(orders, '333', allPeriod);
assert.equal(metrics.periodOrderCount, 2);
assert.equal(metrics.periodItems, 2);
assert.equal(metrics.periodSpent, 30);
});
test('client detail order totals use the same line-item revenue as summary metrics', () => {
const orders = [
order({
Nome_Cliente: 'Cliente Sem Fone',
ID_Pedido: 'pedido-1',
ID_Produto: 'produto-1',
Valor_Pedido: 100,
Quantidade: 2,
Valor_Unitario: 10
}),
order({
Nome_Cliente: 'Cliente Sem Fone',
ID_Pedido: 'pedido-1',
ID_Produto: 'produto-2',
Valor_Pedido: 100,
Quantidade: 1,
Valor_Unitario: 5
})
];
const metrics = buildClientDetailsMetrics(orders, 'name:Cliente Sem Fone', allPeriod);
assert.equal(metrics.periodSpent, 25);
assert.equal(metrics.groupedOrders[0].orderTotal, 25);
});