Add Tiny ERP order metadata ingestion
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
const assert = require('node:assert/strict');
|
||||
const test = require('node:test');
|
||||
|
||||
const { normalizeOrderDate, normalizeOrderPayload } = require('../mappers/orderMapper');
|
||||
const { formatOrderRow, normalizeOrderDate, normalizeOrderPayload } = require('../mappers/orderMapper');
|
||||
|
||||
test('normalizeOrderDate accepts Brazilian display dates', () => {
|
||||
assert.equal(normalizeOrderDate('28/05/2026'), '2026-05-28');
|
||||
@@ -35,3 +35,83 @@ test('normalizeOrderPayload includes normalized date without changing display da
|
||||
assert.equal(payload[1], '28/05/2026');
|
||||
assert.equal(payload[2], '2026-05-28');
|
||||
});
|
||||
|
||||
test('normalizeOrderPayload maps Tiny ERP metadata aliases', () => {
|
||||
const payload = normalizeOrderPayload({
|
||||
Nome_Cliente: 'Cliente Teste',
|
||||
Data_Pedido: '28/05/2026',
|
||||
Valor_Pedido: '120.50',
|
||||
ID_Produto: 'SKU-1',
|
||||
Descricao_Produto: 'Produto',
|
||||
Quantidade: '2',
|
||||
Valor_Unitario: '60.25',
|
||||
ID_Pedido: 'ORDER-1',
|
||||
Nome_Fantasia: 'Cliente Fantasia',
|
||||
ID_Vendedor: 123,
|
||||
Nome_Vendedor: 'Maria',
|
||||
Nome_Ecommerce: 'Mercado Livre',
|
||||
Canal_Venda: 'Online',
|
||||
Numero_Ecommerce: 'EC-987'
|
||||
});
|
||||
|
||||
assert.equal(payload[10], 'Cliente Fantasia');
|
||||
assert.equal(payload[11], '123');
|
||||
assert.equal(payload[12], 'Maria');
|
||||
assert.equal(payload[13], 'Mercado Livre');
|
||||
assert.equal(payload[14], 'Online');
|
||||
assert.equal(payload[15], 'EC-987');
|
||||
});
|
||||
|
||||
test('normalizeOrderPayload maps lower-case metadata names', () => {
|
||||
const payload = normalizeOrderPayload({
|
||||
Nome_Cliente: 'Cliente Teste',
|
||||
Data_Pedido: '28/05/2026',
|
||||
Valor_Pedido: '120.50',
|
||||
ID_Produto: 'SKU-1',
|
||||
Descricao_Produto: 'Produto',
|
||||
Quantidade: '2',
|
||||
Valor_Unitario: '60.25',
|
||||
ID_Pedido: 'ORDER-1',
|
||||
cliente_nome_fantasia: 'Fantasia Lower',
|
||||
id_vendedor: 'VEN-7',
|
||||
nome_vendedor: 'Joao',
|
||||
marketplace: 'Shopee',
|
||||
canal_venda: 'Marketplace',
|
||||
numero_ecommerce: '100200'
|
||||
});
|
||||
|
||||
assert.equal(payload[10], 'Fantasia Lower');
|
||||
assert.equal(payload[11], 'VEN-7');
|
||||
assert.equal(payload[12], 'Joao');
|
||||
assert.equal(payload[13], 'Shopee');
|
||||
assert.equal(payload[14], 'Marketplace');
|
||||
assert.equal(payload[15], '100200');
|
||||
});
|
||||
|
||||
test('formatOrderRow returns Tiny ERP metadata fields', () => {
|
||||
const row = formatOrderRow({
|
||||
cliente_nome: 'Cliente Teste',
|
||||
data_pedido: '28/05/2026',
|
||||
valor_pedido: '120.50',
|
||||
produto_id: 'SKU-1',
|
||||
produto_descricao: 'Produto',
|
||||
quantidade: 2,
|
||||
valor_unitario: '60.25',
|
||||
created_at: '2026-05-28T12:00:00.000Z',
|
||||
pedido_id: 'ORDER-1',
|
||||
cliente_fone: '(16) 99999-9999',
|
||||
cliente_nome_fantasia: 'Cliente Fantasia',
|
||||
id_vendedor: '123',
|
||||
nome_vendedor: 'Maria',
|
||||
marketplace: 'Mercado Livre',
|
||||
canal_venda: 'Online',
|
||||
numero_ecommerce: 'EC-987'
|
||||
});
|
||||
|
||||
assert.equal(row.cliente_nome_fantasia, 'Cliente Fantasia');
|
||||
assert.equal(row.id_vendedor, '123');
|
||||
assert.equal(row.nome_vendedor, 'Maria');
|
||||
assert.equal(row.marketplace, 'Mercado Livre');
|
||||
assert.equal(row.canal_venda, 'Online');
|
||||
assert.equal(row.numero_ecommerce, 'EC-987');
|
||||
});
|
||||
|
||||
83
backend/test/ordersService.test.js
Normal file
83
backend/test/ordersService.test.js
Normal file
@@ -0,0 +1,83 @@
|
||||
const assert = require('node:assert/strict');
|
||||
const test = require('node:test');
|
||||
|
||||
test('upsertOrders persists Tiny ERP metadata columns', async () => {
|
||||
const queries = [];
|
||||
const client = {
|
||||
query: async (sql, params) => {
|
||||
queries.push({ sql, params });
|
||||
return { rows: [] };
|
||||
},
|
||||
release: () => {
|
||||
queries.push({ sql: 'RELEASE' });
|
||||
}
|
||||
};
|
||||
const dbPath = require.resolve('../db');
|
||||
const servicePath = require.resolve('../services/ordersService');
|
||||
const originalDbCache = require.cache[dbPath];
|
||||
const originalServiceCache = require.cache[servicePath];
|
||||
|
||||
delete require.cache[servicePath];
|
||||
require.cache[dbPath] = {
|
||||
id: dbPath,
|
||||
filename: dbPath,
|
||||
loaded: true,
|
||||
exports: {
|
||||
pool: {
|
||||
connect: async () => client
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
const { upsertOrders } = require('../services/ordersService');
|
||||
|
||||
await upsertOrders([{
|
||||
Nome_Cliente: 'Cliente Teste',
|
||||
Data_Pedido: '28/05/2026',
|
||||
Valor_Pedido: '120.50',
|
||||
ID_Produto: 'SKU-1',
|
||||
Descricao_Produto: 'Produto',
|
||||
Quantidade: '2',
|
||||
Valor_Unitario: '60.25',
|
||||
ID_Pedido: 'ORDER-1',
|
||||
Fone_Cliente: '(16) 99999-9999',
|
||||
cliente_nome_fantasia: 'Cliente Fantasia',
|
||||
id_vendedor: 'VEN-1',
|
||||
nome_vendedor: 'Maria',
|
||||
marketplace: 'Mercado Livre',
|
||||
canal_venda: 'Online',
|
||||
numero_ecommerce: 'EC-987'
|
||||
}]);
|
||||
} finally {
|
||||
delete require.cache[servicePath];
|
||||
if (originalServiceCache) {
|
||||
require.cache[servicePath] = originalServiceCache;
|
||||
}
|
||||
if (originalDbCache) {
|
||||
require.cache[dbPath] = originalDbCache;
|
||||
} else {
|
||||
delete require.cache[dbPath];
|
||||
}
|
||||
}
|
||||
|
||||
const insert = queries.find(query => query.sql.includes('INSERT INTO orders'));
|
||||
|
||||
assert.ok(insert);
|
||||
assert.match(insert.sql, /cliente_nome_fantasia/);
|
||||
assert.match(insert.sql, /id_vendedor/);
|
||||
assert.match(insert.sql, /nome_vendedor/);
|
||||
assert.match(insert.sql, /marketplace/);
|
||||
assert.match(insert.sql, /canal_venda/);
|
||||
assert.match(insert.sql, /numero_ecommerce/);
|
||||
assert.match(insert.sql, /cliente_nome_fantasia = EXCLUDED\.cliente_nome_fantasia/);
|
||||
assert.equal(insert.params.length, 16);
|
||||
assert.deepEqual(insert.params.slice(10), [
|
||||
'Cliente Fantasia',
|
||||
'VEN-1',
|
||||
'Maria',
|
||||
'Mercado Livre',
|
||||
'Online',
|
||||
'EC-987'
|
||||
]);
|
||||
});
|
||||
Reference in New Issue
Block a user