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 => ({ 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); });