n8n-nodes-tiny-erp
Version:
Node personalizado para integração com Tiny ERP no n8n
438 lines • 19.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TinyErp = void 0;
class TinyErp {
constructor() {
this.description = {
displayName: 'Tiny ERP',
name: 'tinyErp',
icon: 'file:iconeFinal.png',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"] + \": \" + $parameter["resource"]}}',
description: 'Consumir API do Tiny ERP',
defaults: {
name: 'Tiny ERP',
},
inputs: ['main'],
outputs: ['main'],
credentials: [
{
name: 'tinyErpApi',
required: true,
},
],
properties: [
{
displayName: 'Recurso',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Produto',
value: 'produto',
},
{
name: 'Pedido',
value: 'pedido',
},
{
name: 'Usuário',
value: 'usuario',
},
],
default: 'produto',
},
{
displayName: 'Operação',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: [
'produto',
],
},
},
options: [
{
name: 'Pesquisar Produtos',
value: 'pesquisa',
description: 'Pesquisar produtos',
action: 'Pesquisar produtos',
},
],
default: 'pesquisa',
},
{
displayName: 'Operação',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: [
'pedido',
],
},
},
options: [
{
name: 'Obter Dados do Pedido',
value: 'getPedido',
description: 'Obter dados de um pedido específico',
action: 'Obter dados de um pedido',
},
],
default: 'getPedido',
},
{
displayName: 'Operação',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: [
'usuario',
],
},
},
options: [
{
name: 'Obter Dados do Usuário',
value: 'getUsuario',
description: 'Obter dados de usuário',
action: 'Obter dados de usuário',
},
],
default: 'getUsuario',
},
{
displayName: 'Termo de Pesquisa',
name: 'pesquisa',
type: 'string',
default: '%',
description: 'Termo para pesquisar produtos (use % para todos)',
displayOptions: {
show: {
resource: [
'produto',
],
operation: [
'pesquisa',
],
},
},
},
{
displayName: 'Obter Todas as Páginas',
name: 'obterTodasPaginas',
type: 'boolean',
default: false,
description: 'Se ativado, buscará automaticamente todas as páginas de resultados',
displayOptions: {
show: {
resource: [
'produto',
],
operation: [
'pesquisa',
],
},
},
},
{
displayName: 'Formato de Saída',
name: 'formatoSaida',
type: 'options',
options: [
{
name: 'JSON (Padrão)',
value: 'json',
description: 'Retorna os dados no formato JSON',
},
{
name: 'CSV',
value: 'csv',
description: 'Retorna os dados no formato CSV',
},
],
default: 'json',
description: 'Escolha o formato para o resultado da consulta',
displayOptions: {
show: {
resource: [
'produto',
],
operation: [
'pesquisa',
],
},
},
},
{
displayName: 'Página',
name: 'pagina',
type: 'number',
default: 1,
description: 'Número da página para paginação',
displayOptions: {
show: {
resource: [
'produto',
],
operation: [
'pesquisa',
],
obterTodasPaginas: [
false,
],
},
},
},
{
displayName: 'Número do Pedido',
name: 'numeroPedido',
type: 'string',
default: '',
required: true,
description: 'Número do pedido a ser consultado',
displayOptions: {
show: {
resource: [
'pedido',
],
operation: [
'getPedido',
],
},
},
},
{
displayName: 'Nome do Usuário',
name: 'nomeUsuario',
type: 'string',
default: '',
description: 'Nome do usuário para filtrar',
displayOptions: {
show: {
resource: [
'usuario',
],
operation: [
'getUsuario',
],
},
},
},
],
};
}
async execute() {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
const returnData = [];
const resource = this.getNodeParameter('resource', 0);
const operation = this.getNodeParameter('operation', 0);
const credentials = await this.getCredentials('tinyErpApi');
const token = credentials.token;
try {
if (resource === 'produto' && operation === 'pesquisa') {
const pesquisa = this.getNodeParameter('pesquisa', 0);
const obterTodasPaginas = this.getNodeParameter('obterTodasPaginas', 0);
const formatoSaida = this.getNodeParameter('formatoSaida', 0);
const apiUrl = 'https://api.tiny.com.br/api2/produtos.pesquisa.php';
const todosProdutos = [];
try {
if (obterTodasPaginas) {
const options = {
method: 'GET',
uri: apiUrl,
qs: {
token,
formato: 'JSON',
pesquisa,
pagina: 1,
},
json: true,
};
const firstResponse = await this.helpers.request(options);
if (firstResponse && firstResponse.retorno && firstResponse.retorno.status === 'OK') {
const numeroPaginas = firstResponse.retorno.numero_paginas || 1;
const produtosPagina1 = firstResponse.retorno.produtos || [];
for (const produto of produtosPagina1) {
if (formatoSaida === 'json') {
returnData.push({
json: produto
});
}
else {
todosProdutos.push(produto.produto);
}
}
for (let pagina = 2; pagina <= numeroPaginas; pagina++) {
options.qs.pagina = pagina;
const pageResponse = await this.helpers.request(options);
if (pageResponse && pageResponse.retorno && pageResponse.retorno.status === 'OK') {
const produtosPagina = pageResponse.retorno.produtos || [];
for (const produto of produtosPagina) {
if (formatoSaida === 'json') {
returnData.push({
json: produto
});
}
else {
todosProdutos.push(produto.produto);
}
}
}
else {
console.error(`Erro ao buscar página ${pagina}`, (_a = pageResponse === null || pageResponse === void 0 ? void 0 : pageResponse.retorno) === null || _a === void 0 ? void 0 : _a.erros);
break;
}
}
if (formatoSaida === 'csv' && todosProdutos.length > 0) {
const csvData = converterParaCSV(todosProdutos);
returnData.push({
json: { success: true },
binary: {
data: {
data: Buffer.from(csvData).toString('base64'),
mimeType: 'text/csv',
fileName: `produtos_tiny_erp_${new Date().toISOString().split('T')[0]}.csv`,
},
},
});
}
}
else {
const errorMessage = ((_d = (_c = (_b = firstResponse === null || firstResponse === void 0 ? void 0 : firstResponse.retorno) === null || _b === void 0 ? void 0 : _b.erros) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.erro) || 'Erro desconhecido na API do Tiny ERP';
throw new Error(`Erro na API do Tiny: ${errorMessage}`);
}
}
else {
const pagina = this.getNodeParameter('pagina', 0);
const options = {
method: 'GET',
uri: apiUrl,
qs: {
token,
formato: 'JSON',
pesquisa,
pagina,
},
json: true,
};
const response = await this.helpers.request(options);
if (response && response.retorno && response.retorno.status === 'OK') {
if (response.retorno.produtos && response.retorno.produtos.length > 0) {
if (formatoSaida === 'json') {
for (const produto of response.retorno.produtos) {
returnData.push({
json: produto
});
}
}
else {
const produtosParaCSV = response.retorno.produtos.map((p) => p.produto);
const csvData = converterParaCSV(produtosParaCSV);
returnData.push({
json: { success: true },
binary: {
data: {
data: Buffer.from(csvData).toString('base64'),
mimeType: 'text/csv',
fileName: `produtos_tiny_erp_${new Date().toISOString().split('T')[0]}.csv`,
},
},
});
}
}
}
else {
const errorMessage = ((_g = (_f = (_e = response === null || response === void 0 ? void 0 : response.retorno) === null || _e === void 0 ? void 0 : _e.erros) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.erro) || 'Erro desconhecido na API do Tiny ERP';
throw new Error(`Erro na API do Tiny: ${errorMessage}`);
}
}
}
catch (requestError) {
throw requestError;
}
}
else if (resource === 'pedido' && operation === 'getPedido') {
const numeroPedido = this.getNodeParameter('numeroPedido', 0);
const apiUrl = 'https://api.tiny.com.br/api2/pedido.obter.php';
const options = {
method: 'GET',
uri: apiUrl,
qs: {
token,
formato: 'JSON',
numero: numeroPedido,
},
json: true,
};
const response = await this.helpers.request(options);
if (response && response.retorno && response.retorno.status === 'OK') {
returnData.push({
json: response.retorno.pedido || { message: 'Pedido não encontrado' },
});
}
else {
const errorMessage = ((_k = (_j = (_h = response === null || response === void 0 ? void 0 : response.retorno) === null || _h === void 0 ? void 0 : _h.erros) === null || _j === void 0 ? void 0 : _j[0]) === null || _k === void 0 ? void 0 : _k.erro) || 'Erro desconhecido na API do Tiny ERP';
throw new Error(`Erro na API do Tiny: ${errorMessage}`);
}
}
else if (resource === 'usuario' && operation === 'getUsuario') {
const nomeUsuario = this.getNodeParameter('nomeUsuario', 0);
returnData.push({
json: {
success: true,
message: 'Obtendo usuário',
filtros: { nome: nomeUsuario }
}
});
}
}
catch (error) {
returnData.push({
json: {
error: error.message,
location: 'Erro no bloco principal do nó',
stack: error.stack
}
});
}
return [returnData];
}
}
exports.TinyErp = TinyErp;
function converterParaCSV(dados) {
if (!dados || dados.length === 0) {
return '';
}
const cabecalhos = new Set();
for (const item of dados) {
for (const chave of Object.keys(item)) {
cabecalhos.add(chave);
}
}
const arrayCabecalhos = Array.from(cabecalhos);
let csv = arrayCabecalhos.join(',') + '\n';
for (const item of dados) {
const linha = arrayCabecalhos.map(cabecalho => {
let valor = item[cabecalho] !== undefined ? item[cabecalho] : '';
valor = String(valor);
valor = valor.replace(/"/g, '""');
if (valor.includes(',') || valor.includes('\n') || valor.includes('"')) {
valor = `"${valor}"`;
}
return valor;
}).join(',');
csv += linha + '\n';
}
return csv;
}
//# sourceMappingURL=TinyErp.node.js.map