UNPKG

n8n-nodes-tiny-erp

Version:

Node personalizado para integração com Tiny ERP no n8n

438 lines 19.5 kB
"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