All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m17s
120 lines
3.0 KiB
TypeScript
120 lines
3.0 KiB
TypeScript
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);
|
|
});
|